Bluesky app fork with some witchin' additions 馃挮
at main 186 lines 6.0 kB view raw
1import {describe, expect, it} from '@jest/globals' 2 3import { 4 isPossiblyAUrl, 5 isTrustedUrl, 6 linkRequiresWarning, 7 splitApexDomain, 8} from '../../../src/lib/strings/url-helpers' 9 10describe('linkRequiresWarning', () => { 11 type Case = [string, string, boolean] 12 13 const cases: Case[] = [ 14 ['http://example.com', 'http://example.com', false], 15 ['http://example.com', 'example.com', false], 16 ['http://example.com', 'example.com/page', false], 17 ['http://example.com', '', true], 18 ['http://example.com', 'other.com', true], 19 ['http://example.com', 'http://other.com', true], 20 ['http://example.com', 'some label', true], 21 ['http://example.com', 'example.com more', true], 22 ['http://example.com', 'http://example.co', true], 23 ['http://example.co', 'http://example.com', true], 24 ['http://example.com', 'example.co', true], 25 ['http://example.co', 'example.com', true], 26 ['http://site.pages.dev', 'http://site.page', true], 27 ['http://site.page', 'http://site.pages.dev', true], 28 ['http://site.pages.dev', 'site.page', true], 29 ['http://site.page', 'site.pages.dev', true], 30 ['http://site.pages.dev', 'http://site.pages', true], 31 ['http://site.pages', 'http://site.pages.dev', true], 32 ['http://site.pages.dev', 'site.pages', true], 33 ['http://site.pages', 'site.pages.dev', true], 34 ['http://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 'my post', false], 35 ['https://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 'my post', false], 36 ['http://bsky.app/', 'bluesky', false], 37 ['https://bsky.app/', 'bluesky', false], 38 [ 39 'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 40 'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 41 false, 42 ], 43 [ 44 'https://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 45 'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 46 false, 47 ], 48 [ 49 'http://bsky.app/', 50 'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 51 false, 52 ], 53 [ 54 'https://bsky.app/', 55 'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 56 false, 57 ], 58 [ 59 'http://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 60 'https://google.com', 61 true, 62 ], 63 [ 64 'https://bsky.app/profile/bob.test/post/3kbeuduu7m22v', 65 'https://google.com', 66 true, 67 ], 68 ['http://bsky.app/', 'https://google.com', true], 69 ['https://bsky.app/', 'https://google.com', true], 70 71 // case insensitive 72 ['https://Example.com', 'example.com', false], 73 ['https://example.com', 'Example.com', false], 74 75 // bad uri inputs, default to true 76 ['', '', true], 77 ['example.com', 'example.com', true], 78 ['/profile', 'Username', false], 79 ['#', 'Show More', false], 80 ['https://docs.bsky.app', 'https://docs.bsky.app', false], 81 ['https://bsky.app/compose/intent?text=test', 'Compose a post', false], 82 ] 83 84 it.each(cases)( 85 'given input uri %p and text %p, returns %p', 86 (uri, text, expected) => { 87 const output = linkRequiresWarning(uri, text) 88 expect(output).toEqual(expected) 89 }, 90 ) 91}) 92 93describe('isPossiblyAUrl', () => { 94 type Case = [string, boolean] 95 const cases: Case[] = [ 96 ['', false], 97 ['text', false], 98 ['some text', false], 99 ['some text', false], 100 ['some domain.com', false], 101 ['domain.com', true], 102 [' domain.com', true], 103 ['domain.com ', true], 104 [' domain.com ', true], 105 ['http://domain.com', true], 106 [' http://domain.com', true], 107 ['http://domain.com ', true], 108 [' http://domain.com ', true], 109 ['https://domain.com', true], 110 [' https://domain.com', true], 111 ['https://domain.com ', true], 112 [' https://domain.com ', true], 113 ['http://domain.com/foo', true], 114 ['http://domain.com stuff', true], 115 ] 116 117 it.each(cases)('given input uri %p, returns %p', (str, expected) => { 118 const output = isPossiblyAUrl(str) 119 expect(output).toEqual(expected) 120 }) 121}) 122 123describe('splitApexDomain', () => { 124 type Case = [string, string, string] 125 const cases: Case[] = [ 126 ['', '', ''], 127 ['example.com', '', 'example.com'], 128 ['foo.example.com', 'foo.', 'example.com'], 129 ['foo.bar.example.com', 'foo.bar.', 'example.com'], 130 ['example.co.uk', '', 'example.co.uk'], 131 ['foo.example.co.uk', 'foo.', 'example.co.uk'], 132 ['example.nonsense', '', 'example.nonsense'], 133 ['foo.example.nonsense', '', 'foo.example.nonsense'], 134 ['foo.bar.example.nonsense', '', 'foo.bar.example.nonsense'], 135 ['example.com.example.com', 'example.com.', 'example.com'], 136 ] 137 138 it.each(cases)( 139 'given input uri %p, returns %p,%p', 140 (str, expected1, expected2) => { 141 const output = splitApexDomain(str) 142 expect(output[0]).toEqual(expected1) 143 expect(output[1]).toEqual(expected2) 144 }, 145 ) 146}) 147 148describe('isTrustedUrl', () => { 149 const cases = [ 150 ['#', true], 151 ['#profile', true], 152 ['/', true], 153 ['/profile', true], 154 ['/profile/', true], 155 ['/profile/bob.test', true], 156 ['https://bsky.app', true], 157 ['https://bsky.app/', true], 158 ['https://bsky.app/profile/bob.test', true], 159 ['https://www.bsky.app', true], 160 ['https://www.bsky.app/', true], 161 ['https://docs.bsky.app', true], 162 ['https://witchsky.app', true], 163 ['https://witchsky.app/', true], 164 ['https://witchsky.app/profile/bob.test', true], 165 ['https://www.witchsky.app', true], 166 ['https://docs.witchsky.app', true], 167 ['https://bsky.social', true], 168 ['https://bsky.social/blog', true], 169 ['https://blueskyweb.xyz', true], 170 ['https://blueskyweb.zendesk.com', true], 171 ['http://bsky.app', true], 172 ['http://bsky.app/', true], 173 ['http://bsky.social', true], 174 ['http://blueskyweb.xyz', true], 175 ['http://blueskyweb.zendesk.com', true], 176 ['https://google.com', false], 177 ['https://docs.google.com', false], 178 ['https://google.com/#', false], 179 ['https://blueskywebxzendesk.com', false], 180 ] 181 182 it.each(cases)('given input uri %p, returns %p', (str, expected) => { 183 const output = isTrustedUrl(str) 184 expect(output).toEqual(expected) 185 }) 186})