1import path from 'path';
2
3import linkRewrite from './remark-link-rewrite';
4
5// helper functions to construct remark nodes
6const makeFile = filePath => ({
7  cwd: '/absolue/path/to/docs',
8  history: [path.join('/absolue/path/to/docs/pages', filePath)],
9});
10const rewrite = (file, url) => {
11  const link = { type: 'link', url };
12  const tree = { type: 'root', children: [link] };
13  linkRewrite()(tree, file);
14  return link.url;
15};
16
17describe('only rewrites internal links', () => {
18  const file = makeFile('index.md');
19
20  it('skips https://external.link', () => {
21    expect(rewrite(file, 'https://external.link')).toBe('https://external.link');
22  });
23
24  it('skips http://external.link?some=query', () => {
25    expect(rewrite(file, 'http://external.link?some=query')).toBe(
26      'http://external.link?some=query'
27    );
28  });
29});
30
31describe('maintains header reference', () => {
32  it('resolves hash for index', () => {
33    const file = makeFile('index.md');
34    expect(rewrite(file, './#a-header')).toBe('/#a-header');
35  });
36
37  it('resolves hash for nested page sibling', () => {
38    const file = makeFile('push-notifications/overview.md');
39    expect(rewrite(file, './using-fcm.md#a-header')).toBe(
40      '/push-notifications/using-fcm/#a-header'
41    );
42  });
43
44  it('resolves hash from nested to index', () => {
45    const file = makeFile('push-notifications/overview.md');
46    expect(rewrite(file, '../index.md#a-header')).toBe('/#a-header');
47  });
48});
49
50describe('from pages/index.md', () => {
51  const file = makeFile('index.md');
52
53  it('resolves guides to /guides', () => {
54    expect(rewrite(file, 'guides')).toBe('/guides');
55  });
56
57  it('resolves guides.md to /guides/', () => {
58    expect(rewrite(file, 'guides.md')).toBe('/guides/');
59  });
60
61  it('resolves ./guides.md to /guides/', () => {
62    expect(rewrite(file, './guides.md')).toBe('/guides/');
63  });
64
65  it('resolves ./nested/reference.md to /nested/reference/', () => {
66    expect(rewrite(file, './nested/reference.md')).toBe('/nested/reference/');
67  });
68});
69
70describe('from pages/push-notifications/overview.md', () => {
71  const file = makeFile('push-notifications/overview.md');
72
73  it('resolves using-fcm to /push-notifications/using-fcm', () => {
74    expect(rewrite(file, 'using-fcm')).toBe('/push-notifications/using-fcm');
75  });
76
77  it('resolves using-fcm.md to /push-notifications/using-fcm/', () => {
78    expect(rewrite(file, 'using-fcm.md')).toBe('/push-notifications/using-fcm/');
79  });
80
81  it('resolves ./using-fcm.md to /push-notifications/using-fcm/', () => {
82    expect(rewrite(file, './using-fcm.md')).toBe('/push-notifications/using-fcm/');
83  });
84
85  it('resolves ../guides.md to /guides/', () => {
86    expect(rewrite(file, '../guides.md')).toBe('/guides/');
87  });
88
89  it('resolves ./ to /push-notifications', () => {
90    expect(rewrite(file, './')).toBe('/push-notifications');
91  });
92
93  it('resolves ../ to /', () => {
94    expect(rewrite(file, '../')).toBe('/');
95  });
96
97  it('resolves ../index.md to /', () => {
98    expect(rewrite(file, '../index.md')).toBe('/');
99  });
100});
101
102describe('from pages/versions/latest/sdk/app-auth.md', () => {
103  const file = makeFile('versions/latest/sdk/app-auth.md');
104
105  it('resolves app-loading.md to /versions/latest/sdk/app-loading/', () => {
106    expect(rewrite(file, 'app-loading.md')).toBe('/versions/latest/sdk/app-loading/');
107  });
108
109  it('resolves ./app-loading.md to /versions/latest/sdk/app-loading/', () => {
110    expect(rewrite(file, './app-loading.md')).toBe('/versions/latest/sdk/app-loading/');
111  });
112
113  it('resolves ../config/app.md#android to /versions/latest/config/app/#android', () => {
114    expect(rewrite(file, '../config/app.md#android')).toBe('/versions/latest/config/app/#android');
115  });
116
117  it('resolves ../../../workflow/debugging.md to /workflow/debugging/', () => {
118    expect(rewrite(file, '../../../workflow/debugging.md')).toBe('/workflow/debugging/');
119  });
120});
121
122describe('from pages/workflow/debugging.md', () => {
123  const file = makeFile('workflow/debugging.md');
124
125  it('resolves hash only to same file', () => {
126    expect(rewrite(file, '#some-header')).toBe('/workflow/debugging/#some-header');
127  });
128
129  it('resolves hash with ./ to same file', () => {
130    expect(rewrite(file, './#some-header')).toBe('/workflow/debugging/#some-header');
131  });
132});
133