diff options
author | Chocobozzz <me@florianbigard.com> | 2023-07-31 14:34:36 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2023-08-11 15:02:33 +0200 |
commit | 3a4992633ee62d5edfbb484d9c6bcb3cf158489d (patch) | |
tree | e4510b39bdac9c318fdb4b47018d08f15368b8f0 /server/tests/api/check-params/video-captions.ts | |
parent | 04d1da5621d25d59bd5fa1543b725c497bf5d9a8 (diff) | |
download | PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.gz PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.tar.zst PeerTube-3a4992633ee62d5edfbb484d9c6bcb3cf158489d.zip |
Migrate server to ESM
Sorry for the very big commit that may lead to git log issues and merge
conflicts, but it's a major step forward:
* Server can be faster at startup because imports() are async and we can
easily lazy import big modules
* Angular doesn't seem to support ES import (with .js extension), so we
had to correctly organize peertube into a monorepo:
* Use yarn workspace feature
* Use typescript reference projects for dependencies
* Shared projects have been moved into "packages", each one is now a
node module (with a dedicated package.json/tsconfig.json)
* server/tools have been moved into apps/ and is now a dedicated app
bundled and published on NPM so users don't have to build peertube
cli tools manually
* server/tests have been moved into packages/ so we don't compile
them every time we want to run the server
* Use isolatedModule option:
* Had to move from const enum to const
(https://www.typescriptlang.org/docs/handbook/enums.html#objects-vs-enums)
* Had to explictely specify "type" imports when used in decorators
* Prefer tsx (that uses esbuild under the hood) instead of ts-node to
load typescript files (tests with mocha or scripts):
* To reduce test complexity as esbuild doesn't support decorator
metadata, we only test server files that do not import server
models
* We still build tests files into js files for a faster CI
* Remove unmaintained peertube CLI import script
* Removed some barrels to speed up execution (less imports)
Diffstat (limited to 'server/tests/api/check-params/video-captions.ts')
-rw-r--r-- | server/tests/api/check-params/video-captions.ts | 307 |
1 files changed, 0 insertions, 307 deletions
diff --git a/server/tests/api/check-params/video-captions.ts b/server/tests/api/check-params/video-captions.ts deleted file mode 100644 index 532dab1c4..000000000 --- a/server/tests/api/check-params/video-captions.ts +++ /dev/null | |||
@@ -1,307 +0,0 @@ | |||
1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ | ||
2 | |||
3 | import { buildAbsoluteFixturePath } from '@shared/core-utils' | ||
4 | import { HttpStatusCode, VideoCreateResult, VideoPrivacy } from '@shared/models' | ||
5 | import { | ||
6 | cleanupTests, | ||
7 | createSingleServer, | ||
8 | makeDeleteRequest, | ||
9 | makeGetRequest, | ||
10 | makeUploadRequest, | ||
11 | PeerTubeServer, | ||
12 | setAccessTokensToServers | ||
13 | } from '@shared/server-commands' | ||
14 | |||
15 | describe('Test video captions API validator', function () { | ||
16 | const path = '/api/v1/videos/' | ||
17 | |||
18 | let server: PeerTubeServer | ||
19 | let userAccessToken: string | ||
20 | let video: VideoCreateResult | ||
21 | let privateVideo: VideoCreateResult | ||
22 | |||
23 | // --------------------------------------------------------------- | ||
24 | |||
25 | before(async function () { | ||
26 | this.timeout(120000) | ||
27 | |||
28 | server = await createSingleServer(1) | ||
29 | |||
30 | await setAccessTokensToServers([ server ]) | ||
31 | |||
32 | video = await server.videos.upload() | ||
33 | privateVideo = await server.videos.upload({ attributes: { privacy: VideoPrivacy.PRIVATE } }) | ||
34 | |||
35 | { | ||
36 | const user = { | ||
37 | username: 'user1', | ||
38 | password: 'my super password' | ||
39 | } | ||
40 | await server.users.create({ username: user.username, password: user.password }) | ||
41 | userAccessToken = await server.login.getAccessToken(user) | ||
42 | } | ||
43 | }) | ||
44 | |||
45 | describe('When adding video caption', function () { | ||
46 | const fields = { } | ||
47 | const attaches = { | ||
48 | captionfile: buildAbsoluteFixturePath('subtitle-good1.vtt') | ||
49 | } | ||
50 | |||
51 | it('Should fail without a valid uuid', async function () { | ||
52 | await makeUploadRequest({ | ||
53 | method: 'PUT', | ||
54 | url: server.url, | ||
55 | path: path + '4da6fde3-88f7-4d16-b119-108df563d0b06/captions/fr', | ||
56 | token: server.accessToken, | ||
57 | fields, | ||
58 | attaches | ||
59 | }) | ||
60 | }) | ||
61 | |||
62 | it('Should fail with an unknown id', async function () { | ||
63 | await makeUploadRequest({ | ||
64 | method: 'PUT', | ||
65 | url: server.url, | ||
66 | path: path + '4da6fde3-88f7-4d16-b119-108df5630b06/captions/fr', | ||
67 | token: server.accessToken, | ||
68 | fields, | ||
69 | attaches, | ||
70 | expectedStatus: 404 | ||
71 | }) | ||
72 | }) | ||
73 | |||
74 | it('Should fail with a missing language in path', async function () { | ||
75 | const captionPath = path + video.uuid + '/captions' | ||
76 | await makeUploadRequest({ | ||
77 | method: 'PUT', | ||
78 | url: server.url, | ||
79 | path: captionPath, | ||
80 | token: server.accessToken, | ||
81 | fields, | ||
82 | attaches | ||
83 | }) | ||
84 | }) | ||
85 | |||
86 | it('Should fail with an unknown language', async function () { | ||
87 | const captionPath = path + video.uuid + '/captions/15' | ||
88 | await makeUploadRequest({ | ||
89 | method: 'PUT', | ||
90 | url: server.url, | ||
91 | path: captionPath, | ||
92 | token: server.accessToken, | ||
93 | fields, | ||
94 | attaches | ||
95 | }) | ||
96 | }) | ||
97 | |||
98 | it('Should fail without access token', async function () { | ||
99 | const captionPath = path + video.uuid + '/captions/fr' | ||
100 | await makeUploadRequest({ | ||
101 | method: 'PUT', | ||
102 | url: server.url, | ||
103 | path: captionPath, | ||
104 | fields, | ||
105 | attaches, | ||
106 | expectedStatus: HttpStatusCode.UNAUTHORIZED_401 | ||
107 | }) | ||
108 | }) | ||
109 | |||
110 | it('Should fail with a bad access token', async function () { | ||
111 | const captionPath = path + video.uuid + '/captions/fr' | ||
112 | await makeUploadRequest({ | ||
113 | method: 'PUT', | ||
114 | url: server.url, | ||
115 | path: captionPath, | ||
116 | token: 'blabla', | ||
117 | fields, | ||
118 | attaches, | ||
119 | expectedStatus: HttpStatusCode.UNAUTHORIZED_401 | ||
120 | }) | ||
121 | }) | ||
122 | |||
123 | // We accept any file now | ||
124 | // it('Should fail with an invalid captionfile extension', async function () { | ||
125 | // const attaches = { | ||
126 | // 'captionfile': buildAbsoluteFixturePath('subtitle-bad.txt') | ||
127 | // } | ||
128 | // | ||
129 | // const captionPath = path + video.uuid + '/captions/fr' | ||
130 | // await makeUploadRequest({ | ||
131 | // method: 'PUT', | ||
132 | // url: server.url, | ||
133 | // path: captionPath, | ||
134 | // token: server.accessToken, | ||
135 | // fields, | ||
136 | // attaches, | ||
137 | // expectedStatus: HttpStatusCode.BAD_REQUEST_400 | ||
138 | // }) | ||
139 | // }) | ||
140 | |||
141 | // We don't check the extension yet | ||
142 | // it('Should fail with an invalid captionfile extension and octet-stream mime type', async function () { | ||
143 | // await createVideoCaption({ | ||
144 | // url: server.url, | ||
145 | // accessToken: server.accessToken, | ||
146 | // language: 'zh', | ||
147 | // videoId: video.uuid, | ||
148 | // fixture: 'subtitle-bad.txt', | ||
149 | // mimeType: 'application/octet-stream', | ||
150 | // expectedStatus: HttpStatusCode.BAD_REQUEST_400 | ||
151 | // }) | ||
152 | // }) | ||
153 | |||
154 | it('Should succeed with a valid captionfile extension and octet-stream mime type', async function () { | ||
155 | await server.captions.add({ | ||
156 | language: 'zh', | ||
157 | videoId: video.uuid, | ||
158 | fixture: 'subtitle-good.srt', | ||
159 | mimeType: 'application/octet-stream' | ||
160 | }) | ||
161 | }) | ||
162 | |||
163 | // We don't check the file validity yet | ||
164 | // it('Should fail with an invalid captionfile srt', async function () { | ||
165 | // const attaches = { | ||
166 | // 'captionfile': buildAbsoluteFixturePath('subtitle-bad.srt') | ||
167 | // } | ||
168 | // | ||
169 | // const captionPath = path + video.uuid + '/captions/fr' | ||
170 | // await makeUploadRequest({ | ||
171 | // method: 'PUT', | ||
172 | // url: server.url, | ||
173 | // path: captionPath, | ||
174 | // token: server.accessToken, | ||
175 | // fields, | ||
176 | // attaches, | ||
177 | // expectedStatus: HttpStatusCode.INTERNAL_SERVER_ERROR_500 | ||
178 | // }) | ||
179 | // }) | ||
180 | |||
181 | it('Should success with the correct parameters', async function () { | ||
182 | const captionPath = path + video.uuid + '/captions/fr' | ||
183 | await makeUploadRequest({ | ||
184 | method: 'PUT', | ||
185 | url: server.url, | ||
186 | path: captionPath, | ||
187 | token: server.accessToken, | ||
188 | fields, | ||
189 | attaches, | ||
190 | expectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
191 | }) | ||
192 | }) | ||
193 | }) | ||
194 | |||
195 | describe('When listing video captions', function () { | ||
196 | it('Should fail without a valid uuid', async function () { | ||
197 | await makeGetRequest({ url: server.url, path: path + '4da6fde3-88f7-4d16-b119-108df563d0b06/captions' }) | ||
198 | }) | ||
199 | |||
200 | it('Should fail with an unknown id', async function () { | ||
201 | await makeGetRequest({ | ||
202 | url: server.url, | ||
203 | path: path + '4da6fde3-88f7-4d16-b119-108df5630b06/captions', | ||
204 | expectedStatus: HttpStatusCode.NOT_FOUND_404 | ||
205 | }) | ||
206 | }) | ||
207 | |||
208 | it('Should fail with a private video without token', async function () { | ||
209 | await makeGetRequest({ | ||
210 | url: server.url, | ||
211 | path: path + privateVideo.shortUUID + '/captions', | ||
212 | expectedStatus: HttpStatusCode.UNAUTHORIZED_401 | ||
213 | }) | ||
214 | }) | ||
215 | |||
216 | it('Should fail with another user token', async function () { | ||
217 | await makeGetRequest({ | ||
218 | url: server.url, | ||
219 | token: userAccessToken, | ||
220 | path: path + privateVideo.shortUUID + '/captions', | ||
221 | expectedStatus: HttpStatusCode.FORBIDDEN_403 | ||
222 | }) | ||
223 | }) | ||
224 | |||
225 | it('Should success with the correct parameters', async function () { | ||
226 | await makeGetRequest({ url: server.url, path: path + video.shortUUID + '/captions', expectedStatus: HttpStatusCode.OK_200 }) | ||
227 | |||
228 | await makeGetRequest({ | ||
229 | url: server.url, | ||
230 | path: path + privateVideo.shortUUID + '/captions', | ||
231 | token: server.accessToken, | ||
232 | expectedStatus: HttpStatusCode.OK_200 | ||
233 | }) | ||
234 | }) | ||
235 | }) | ||
236 | |||
237 | describe('When deleting video caption', function () { | ||
238 | it('Should fail without a valid uuid', async function () { | ||
239 | await makeDeleteRequest({ | ||
240 | url: server.url, | ||
241 | path: path + '4da6fde3-88f7-4d16-b119-108df563d0b06/captions/fr', | ||
242 | token: server.accessToken | ||
243 | }) | ||
244 | }) | ||
245 | |||
246 | it('Should fail with an unknown id', async function () { | ||
247 | await makeDeleteRequest({ | ||
248 | url: server.url, | ||
249 | path: path + '4da6fde3-88f7-4d16-b119-108df5630b06/captions/fr', | ||
250 | token: server.accessToken, | ||
251 | expectedStatus: HttpStatusCode.NOT_FOUND_404 | ||
252 | }) | ||
253 | }) | ||
254 | |||
255 | it('Should fail with an invalid language', async function () { | ||
256 | await makeDeleteRequest({ | ||
257 | url: server.url, | ||
258 | path: path + '4da6fde3-88f7-4d16-b119-108df5630b06/captions/16', | ||
259 | token: server.accessToken | ||
260 | }) | ||
261 | }) | ||
262 | |||
263 | it('Should fail with a missing language', async function () { | ||
264 | const captionPath = path + video.shortUUID + '/captions' | ||
265 | await makeDeleteRequest({ url: server.url, path: captionPath, token: server.accessToken }) | ||
266 | }) | ||
267 | |||
268 | it('Should fail with an unknown language', async function () { | ||
269 | const captionPath = path + video.shortUUID + '/captions/15' | ||
270 | await makeDeleteRequest({ url: server.url, path: captionPath, token: server.accessToken }) | ||
271 | }) | ||
272 | |||
273 | it('Should fail without access token', async function () { | ||
274 | const captionPath = path + video.shortUUID + '/captions/fr' | ||
275 | await makeDeleteRequest({ url: server.url, path: captionPath, expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) | ||
276 | }) | ||
277 | |||
278 | it('Should fail with a bad access token', async function () { | ||
279 | const captionPath = path + video.shortUUID + '/captions/fr' | ||
280 | await makeDeleteRequest({ url: server.url, path: captionPath, token: 'coucou', expectedStatus: HttpStatusCode.UNAUTHORIZED_401 }) | ||
281 | }) | ||
282 | |||
283 | it('Should fail with another user', async function () { | ||
284 | const captionPath = path + video.shortUUID + '/captions/fr' | ||
285 | await makeDeleteRequest({ | ||
286 | url: server.url, | ||
287 | path: captionPath, | ||
288 | token: userAccessToken, | ||
289 | expectedStatus: HttpStatusCode.FORBIDDEN_403 | ||
290 | }) | ||
291 | }) | ||
292 | |||
293 | it('Should success with the correct parameters', async function () { | ||
294 | const captionPath = path + video.shortUUID + '/captions/fr' | ||
295 | await makeDeleteRequest({ | ||
296 | url: server.url, | ||
297 | path: captionPath, | ||
298 | token: server.accessToken, | ||
299 | expectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
300 | }) | ||
301 | }) | ||
302 | }) | ||
303 | |||
304 | after(async function () { | ||
305 | await cleanupTests([ server ]) | ||
306 | }) | ||
307 | }) | ||