forked from github/docs
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathget-redirect.js
151 lines (137 loc) · 5.34 KB
/
get-redirect.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import getRedirect from '../../lib/get-redirect.js'
import { latest } from '../../lib/enterprise-server-releases.js'
describe('getRedirect basics', () => {
it('should sometimes not correct the version prefix', () => {
// This essentially tests legacy entries that come from the
// `developer.json` file. Normally, we would have first
// rewritten `/enterprise/3.0` to `/enterprise-server@3.0`
// and then, from there, worried about the remaining `/foo/bar`
// part.
// But some redirects from `developer.json` as old and static.
const uri = '/enterprise/3.0/foo/bar'
const ctx = {
pages: {},
redirects: {
'/enterprise/3.0/foo/bar': '/something/else',
},
}
expect(getRedirect(uri, ctx)).toBe('/en/something/else')
})
it('should return undefined if nothing could be found', () => {
const ctx = {
pages: {},
redirects: {},
}
expect(getRedirect('/foo/pizza', ctx)).toBeUndefined()
})
it('should just inject language on version "home pages"', () => {
const ctx = {
pages: {},
redirects: {},
}
expect(getRedirect('/github-ae@latest', ctx)).toBe('/en/github-ae@latest')
expect(getRedirect('/enterprise-cloud@latest', ctx)).toBe('/en/enterprise-cloud@latest')
expect(getRedirect('/enterprise-server@3.3', ctx)).toBe('/en/enterprise-server@3.3')
expect(getRedirect('/enterprise-server@latest', ctx)).toBe(`/en/enterprise-server@${latest}`)
expect(getRedirect('/enterprise-server', ctx)).toBe(`/en/enterprise-server@${latest}`)
})
it('should always "remove" the free-pro-team prefix', () => {
const ctx = {
pages: {},
redirects: {
'/foo': '/bar',
},
}
expect(getRedirect('/free-pro-team@latest', ctx)).toBe('/en')
// Language is fine, but the version needs to be "removed"
expect(getRedirect('/en/free-pro-team@latest', ctx)).toBe('/en')
expect(getRedirect('/free-pro-team@latest/pizza', ctx)).toBe('/en/pizza')
expect(getRedirect('/free-pro-team@latest/foo', ctx)).toBe('/en/bar')
expect(getRedirect('/free-pro-team@latest/github', ctx)).toBe('/en/github')
})
it('should handle some odd exceptions', () => {
const ctx = {
pages: {},
redirects: {},
}
expect(getRedirect('/desktop/guides/foo/bar', ctx)).toBe('/en/desktop/foo/bar')
expect(getRedirect('/admin/guides/foo/bar', ctx)).toBe(
`/en/enterprise-server@${latest}/admin/foo/bar`
)
expect(getRedirect('/admin/something/else', ctx)).toBe(
`/en/enterprise-server@${latest}/admin/something/else`
)
expect(getRedirect('/insights/stuff', ctx)).toBe(
`/en/enterprise-server@${latest}/insights/stuff`
)
})
it('should figure out redirect based on presence of pages in certain cases', () => {
const ctx = {
pages: {
'/en/enterprise-server@3.2/foo/bar': null,
'/en/enterprise-server@3.2/admin/github-management': null,
},
redirects: {},
}
// Replacing `/user` with `` worked because there exits a page of such name.
expect(getRedirect('/enterprise-server@3.2/user/foo/bar', ctx)).toBe(
'/en/enterprise-server@3.2/foo/bar'
)
expect(getRedirect('/enterprise-server@3.2/admin/guides/user-management', ctx)).toBe(
'/en/enterprise-server@3.2/admin/github-management'
)
})
it('should always correct the old enterprise prefix', () => {
const ctx = {
pages: {},
redirects: {
'/enterprise-server@3.3/foo': '/enterprise-server@3.3/bar',
},
}
expect(getRedirect('/enterprise', ctx)).toBe(`/en/enterprise-server@${latest}`)
expect(getRedirect('/enterprise/3.3', ctx)).toBe('/en/enterprise-server@3.3')
expect(getRedirect('/enterprise/3.3/something', ctx)).toBe(
'/en/enterprise-server@3.3/something'
)
// but also respect redirects if there are some
expect(getRedirect('/enterprise/3.3/foo', ctx)).toBe('/en/enterprise-server@3.3/bar')
// Unique snowflake pattern
expect(getRedirect('/enterprise/github/admin/foo', ctx)).toBe(
`/en/enterprise-server@${latest}/github/admin/foo`
)
})
it('should not do anything on some prefixes', () => {
const ctx = {
pages: {},
redirects: {},
}
// Nothing's needed here because it's not /admin/guides and
// it already has the enterprise-server prefix.
expect(getRedirect(`/en/enterprise-server@${latest}/admin/something/else`, ctx)).toBeUndefined()
expect(getRedirect(`/en/enterprise-cloud@latest/user/foo`, ctx)).toBeUndefined()
})
it('should only inject language sometimes', () => {
const ctx = {
pages: {},
redirects: {
'/foo': '/bar',
},
}
// Nothing's needed here because it's not /admin/guides and
// it already has the enterprise-server prefix.
expect(getRedirect('/foo', ctx)).toBe('/en/bar')
expect(getRedirect('/en/foo', ctx)).toBe('/en/bar')
expect(getRedirect('/ja/foo', ctx)).toBe('/ja/bar')
})
it('should redirect both the prefix and the path needs to change', () => {
const ctx = {
pages: {},
redirects: {
[`/enterprise-server@${latest}/foo`]: `/enterprise-server@${latest}/bar`,
},
}
// Nothing's needed here because it's not /admin/guides and
// it already has the enterprise-server prefix.
expect(getRedirect('/enterprise-server/foo', ctx)).toBe(`/en/enterprise-server@${latest}/bar`)
})
})