forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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})