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