aboutsummaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/helpers/core-utils.ts11
-rw-r--r--server/helpers/custom-validators/misc.ts2
-rw-r--r--server/helpers/custom-validators/pods.ts1
-rw-r--r--server/helpers/custom-validators/remote/videos.ts1
-rw-r--r--server/helpers/custom-validators/users.ts1
-rw-r--r--server/helpers/custom-validators/videos.ts1
-rw-r--r--server/initializers/database.ts39
-rw-r--r--server/models/oauth/oauth-token-interface.ts2
-rw-r--r--server/models/request/request-interface.ts2
-rw-r--r--server/models/request/request-video-event-interface.ts4
-rw-r--r--server/models/request/request-video-qadu-interface.ts4
-rw-r--r--server/models/video/author-interface.ts2
-rw-r--r--server/models/video/video-abuse-interface.ts2
-rw-r--r--server/models/video/video.ts2
-rw-r--r--server/tests/cli/index.ts2
-rw-r--r--server/tests/cli/reset-password.ts45
-rw-r--r--server/tests/cli/update-host.ts71
-rw-r--r--server/tests/index.ts1
-rw-r--r--server/tests/utils/cli.ts24
-rw-r--r--server/tests/utils/index.ts1
-rw-r--r--server/tests/utils/servers.ts9
-rw-r--r--server/tests/utils/videos.ts17
22 files changed, 212 insertions, 32 deletions
diff --git a/server/helpers/core-utils.ts b/server/helpers/core-utils.ts
index f8dd45533..2ec7e6515 100644
--- a/server/helpers/core-utils.ts
+++ b/server/helpers/core-utils.ts
@@ -25,8 +25,15 @@ function isTestInstance () {
25} 25}
26 26
27function root () { 27function root () {
28 // We are in /dist/helpers/utils.js 28 // We are in /helpers/utils.js
29 return join(__dirname, '..', '..', '..') 29 const paths = [ __dirname, '..', '..' ]
30
31 // We are under /dist directory
32 if (process.mainModule.filename.endsWith('.ts') === false) {
33 paths.push('..')
34 }
35
36 return join.apply(null, paths)
30} 37}
31 38
32function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> { 39function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> {
diff --git a/server/helpers/custom-validators/misc.ts b/server/helpers/custom-validators/misc.ts
index f6bb02c8e..8d215a416 100644
--- a/server/helpers/custom-validators/misc.ts
+++ b/server/helpers/custom-validators/misc.ts
@@ -1,3 +1,5 @@
1import 'express-validator'
2
1function exists (value: any) { 3function exists (value: any) {
2 return value !== undefined && value !== null 4 return value !== undefined && value !== null
3} 5}
diff --git a/server/helpers/custom-validators/pods.ts b/server/helpers/custom-validators/pods.ts
index f2ca520c0..844bfdf78 100644
--- a/server/helpers/custom-validators/pods.ts
+++ b/server/helpers/custom-validators/pods.ts
@@ -1,4 +1,5 @@
1import * as validator from 'validator' 1import * as validator from 'validator'
2import 'express-validator'
2 3
3import { isArray, exists } from './misc' 4import { isArray, exists } from './misc'
4import { isTestInstance } from '../core-utils' 5import { isTestInstance } from '../core-utils'
diff --git a/server/helpers/custom-validators/remote/videos.ts b/server/helpers/custom-validators/remote/videos.ts
index 49f76e909..e5c76f3ca 100644
--- a/server/helpers/custom-validators/remote/videos.ts
+++ b/server/helpers/custom-validators/remote/videos.ts
@@ -1,3 +1,4 @@
1import 'express-validator'
1import { has, values } from 'lodash' 2import { has, values } from 'lodash'
2 3
3import { 4import {
diff --git a/server/helpers/custom-validators/users.ts b/server/helpers/custom-validators/users.ts
index 00061f9df..805437efa 100644
--- a/server/helpers/custom-validators/users.ts
+++ b/server/helpers/custom-validators/users.ts
@@ -1,5 +1,6 @@
1import { values } from 'lodash' 1import { values } from 'lodash'
2import * as validator from 'validator' 2import * as validator from 'validator'
3import 'express-validator'
3 4
4import { exists } from './misc' 5import { exists } from './misc'
5import { CONSTRAINTS_FIELDS, USER_ROLES } from '../../initializers' 6import { CONSTRAINTS_FIELDS, USER_ROLES } from '../../initializers'
diff --git a/server/helpers/custom-validators/videos.ts b/server/helpers/custom-validators/videos.ts
index 8b3a26644..1d27e47fc 100644
--- a/server/helpers/custom-validators/videos.ts
+++ b/server/helpers/custom-validators/videos.ts
@@ -1,5 +1,6 @@
1import { values } from 'lodash' 1import { values } from 'lodash'
2import * as validator from 'validator' 2import * as validator from 'validator'
3import 'express-validator'
3import 'multer' 4import 'multer'
4 5
5import { 6import {
diff --git a/server/initializers/database.ts b/server/initializers/database.ts
index d04c8db1b..d59fd3655 100644
--- a/server/initializers/database.ts
+++ b/server/initializers/database.ts
@@ -8,26 +8,25 @@ import { CONFIG } from './constants'
8// Do not use barrel, we need to load database first 8// Do not use barrel, we need to load database first
9import { logger } from '../helpers/logger' 9import { logger } from '../helpers/logger'
10import { isTestInstance, readdirPromise } from '../helpers/core-utils' 10import { isTestInstance, readdirPromise } from '../helpers/core-utils'
11import { 11
12 ApplicationModel, 12import { VideoModel } from './../models/video/video-interface'
13 AuthorModel, 13import { VideoTagModel } from './../models/video/video-tag-interface'
14 JobModel, 14import { BlacklistedVideoModel } from './../models/video/video-blacklist-interface'
15 OAuthClientModel, 15import { VideoFileModel } from './../models/video/video-file-interface'
16 OAuthTokenModel, 16import { VideoAbuseModel } from './../models/video/video-abuse-interface'
17 PodModel, 17import { UserModel } from './../models/user/user-interface'
18 RequestModel, 18import { UserVideoRateModel } from './../models/user/user-video-rate-interface'
19 RequestToPodModel, 19import { TagModel } from './../models/video/tag-interface'
20 RequestVideoEventModel, 20import { RequestModel } from './../models/request/request-interface'
21 RequestVideoQaduModel, 21import { RequestVideoQaduModel } from './../models/request/request-video-qadu-interface'
22 TagModel, 22import { RequestVideoEventModel } from './../models/request/request-video-event-interface'
23 UserModel, 23import { RequestToPodModel } from './../models/request/request-to-pod-interface'
24 UserVideoRateModel, 24import { PodModel } from './../models/pod/pod-interface'
25 VideoAbuseModel, 25import { OAuthTokenModel } from './../models/oauth/oauth-token-interface'
26 BlacklistedVideoModel, 26import { OAuthClientModel } from './../models/oauth/oauth-client-interface'
27 VideoFileModel, 27import { JobModel } from './../models/job/job-interface'
28 VideoTagModel, 28import { AuthorModel } from './../models/video/author-interface'
29 VideoModel 29import { ApplicationModel } from './../models/application/application-interface'
30} from '../models'
31 30
32const dbname = CONFIG.DATABASE.DBNAME 31const dbname = CONFIG.DATABASE.DBNAME
33const username = CONFIG.DATABASE.USERNAME 32const username = CONFIG.DATABASE.USERNAME
diff --git a/server/models/oauth/oauth-token-interface.ts b/server/models/oauth/oauth-token-interface.ts
index 97af3c815..0c947bde8 100644
--- a/server/models/oauth/oauth-token-interface.ts
+++ b/server/models/oauth/oauth-token-interface.ts
@@ -1,7 +1,7 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import * as Promise from 'bluebird' 2import * as Promise from 'bluebird'
3 3
4import { UserModel } from '../user' 4import { UserModel } from '../user/user-interface'
5 5
6export type OAuthTokenInfo = { 6export type OAuthTokenInfo = {
7 refreshToken: string 7 refreshToken: string
diff --git a/server/models/request/request-interface.ts b/server/models/request/request-interface.ts
index 7b0ee4df9..dae35651b 100644
--- a/server/models/request/request-interface.ts
+++ b/server/models/request/request-interface.ts
@@ -2,7 +2,7 @@ import * as Sequelize from 'sequelize'
2import * as Promise from 'bluebird' 2import * as Promise from 'bluebird'
3 3
4import { AbstractRequestClass } from './abstract-request-interface' 4import { AbstractRequestClass } from './abstract-request-interface'
5import { PodInstance, PodAttributes } from '../pod' 5import { PodInstance, PodAttributes } from '../pod/pod-interface'
6import { RequestEndpoint } from '../../../shared/models/request-scheduler.model' 6import { RequestEndpoint } from '../../../shared/models/request-scheduler.model'
7 7
8export type RequestsGrouped = { 8export type RequestsGrouped = {
diff --git a/server/models/request/request-video-event-interface.ts b/server/models/request/request-video-event-interface.ts
index a5032e1b1..26cabe3ba 100644
--- a/server/models/request/request-video-event-interface.ts
+++ b/server/models/request/request-video-event-interface.ts
@@ -2,8 +2,8 @@ import * as Sequelize from 'sequelize'
2import * as Promise from 'bluebird' 2import * as Promise from 'bluebird'
3 3
4import { AbstractRequestClass, AbstractRequestToPodClass } from './abstract-request-interface' 4import { AbstractRequestClass, AbstractRequestToPodClass } from './abstract-request-interface'
5import { VideoInstance } from '../video' 5import { VideoInstance } from '../video/video-interface'
6import { PodInstance } from '../pod' 6import { PodInstance } from '../pod/pod-interface'
7 7
8import { RequestVideoEventType } from '../../../shared/models/request-scheduler.model' 8import { RequestVideoEventType } from '../../../shared/models/request-scheduler.model'
9 9
diff --git a/server/models/request/request-video-qadu-interface.ts b/server/models/request/request-video-qadu-interface.ts
index 9a172a4d4..b7b7b1ecc 100644
--- a/server/models/request/request-video-qadu-interface.ts
+++ b/server/models/request/request-video-qadu-interface.ts
@@ -2,8 +2,8 @@ import * as Sequelize from 'sequelize'
2import * as Promise from 'bluebird' 2import * as Promise from 'bluebird'
3 3
4import { AbstractRequestClass, AbstractRequestToPodClass } from './abstract-request-interface' 4import { AbstractRequestClass, AbstractRequestToPodClass } from './abstract-request-interface'
5import { VideoInstance } from '../video' 5import { VideoInstance } from '../video/video-interface'
6import { PodInstance } from '../pod' 6import { PodInstance } from '../pod/pod-interface'
7 7
8import { RequestVideoQaduType } from '../../../shared/models/request-scheduler.model' 8import { RequestVideoQaduType } from '../../../shared/models/request-scheduler.model'
9 9
diff --git a/server/models/video/author-interface.ts b/server/models/video/author-interface.ts
index dbcb85b17..52a00a1d3 100644
--- a/server/models/video/author-interface.ts
+++ b/server/models/video/author-interface.ts
@@ -1,7 +1,7 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import * as Promise from 'bluebird' 2import * as Promise from 'bluebird'
3 3
4import { PodInstance } from '../pod' 4import { PodInstance } from '../pod/pod-interface'
5 5
6export namespace AuthorMethods { 6export namespace AuthorMethods {
7 export type FindOrCreateAuthor = ( 7 export type FindOrCreateAuthor = (
diff --git a/server/models/video/video-abuse-interface.ts b/server/models/video/video-abuse-interface.ts
index abc82f7ac..978268926 100644
--- a/server/models/video/video-abuse-interface.ts
+++ b/server/models/video/video-abuse-interface.ts
@@ -1,7 +1,7 @@
1import * as Sequelize from 'sequelize' 1import * as Sequelize from 'sequelize'
2import * as Promise from 'bluebird' 2import * as Promise from 'bluebird'
3 3
4import { PodInstance } from '../pod' 4import { PodInstance } from '../pod/pod-interface'
5import { ResultList } from '../../../shared' 5import { ResultList } from '../../../shared'
6 6
7// Don't use barrel, import just what we need 7// Don't use barrel, import just what we need
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index 8c69fe189..1134525f0 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -378,6 +378,8 @@ createTorrentAndSetInfoHash = function (this: VideoInstance, videoFile: VideoFil
378 return createTorrentPromise(this.getVideoFilePath(videoFile), options) 378 return createTorrentPromise(this.getVideoFilePath(videoFile), options)
379 .then(torrent => { 379 .then(torrent => {
380 const filePath = join(CONFIG.STORAGE.TORRENTS_DIR, this.getTorrentFileName(videoFile)) 380 const filePath = join(CONFIG.STORAGE.TORRENTS_DIR, this.getTorrentFileName(videoFile))
381 logger.info('Creating torrent %s.', filePath)
382
381 return writeFilePromise(filePath, torrent).then(() => torrent) 383 return writeFilePromise(filePath, torrent).then(() => torrent)
382 }) 384 })
383 .then(torrent => { 385 .then(torrent => {
diff --git a/server/tests/cli/index.ts b/server/tests/cli/index.ts
new file mode 100644
index 000000000..e5a19ff10
--- /dev/null
+++ b/server/tests/cli/index.ts
@@ -0,0 +1,2 @@
1// Order of the tests we want to execute
2import './reset-password'
diff --git a/server/tests/cli/reset-password.ts b/server/tests/cli/reset-password.ts
new file mode 100644
index 000000000..bbf0b3d11
--- /dev/null
+++ b/server/tests/cli/reset-password.ts
@@ -0,0 +1,45 @@
1import 'mocha'
2
3import {
4 createUser,
5 execCLI,
6 flushTests,
7 getEnvCli,
8 killallServers,
9 login,
10 runServer,
11 ServerInfo,
12 setAccessTokensToServers
13} from '../utils'
14
15describe('Test reset password scripts', function () {
16 let server: ServerInfo
17
18 before(async function () {
19 this.timeout(30000)
20
21 await flushTests()
22 server = await runServer(1)
23 await setAccessTokensToServers([ server ])
24
25 await createUser(server.url, server.accessToken, 'user_1', 'super password')
26 })
27
28 it('Should change the user password from CLI', async function () {
29 this.timeout(20000)
30
31 const env = getEnvCli(server)
32 await execCLI(`echo coucou | ${env} npm run reset-password -- -u user_1`)
33
34 await login(server.url, server.client, { username: 'user_1', password: 'coucou' }, 200)
35 })
36
37 after(async function () {
38 killallServers([ server ])
39
40 // Keep the logs if the test failed
41 if (this['ok']) {
42 await flushTests()
43 }
44 })
45})
diff --git a/server/tests/cli/update-host.ts b/server/tests/cli/update-host.ts
new file mode 100644
index 000000000..af9703b32
--- /dev/null
+++ b/server/tests/cli/update-host.ts
@@ -0,0 +1,71 @@
1import 'mocha'
2import * as chai from 'chai'
3const expect = chai.expect
4
5import {
6 execCLI,
7 flushTests,
8 getEnvCli,
9 getVideosList,
10 killallServers,
11 parseTorrentVideo,
12 runServer,
13 ServerInfo,
14 setAccessTokensToServers,
15 uploadVideo
16} from '../utils'
17
18describe('Test update host scripts', function () {
19 let server: ServerInfo
20
21 before(async function () {
22 this.timeout(30000)
23
24 await flushTests()
25
26 const overrideConfig = {
27 webserver: {
28 port: 9256
29 }
30 }
31 server = await runServer(1, overrideConfig)
32 await setAccessTokensToServers([ server ])
33
34 // Upload two videos for our needs
35 const videoAttributes = {}
36 await uploadVideo(server.url, server.accessToken, videoAttributes)
37 await uploadVideo(server.url, server.accessToken, videoAttributes)
38 })
39
40 it('Should update torrent hosts', async function () {
41 this.timeout(20000)
42
43 killallServers([ server ])
44 server = await runServer(1)
45
46 const env = getEnvCli(server)
47 await execCLI(`${env} npm run update-host`)
48
49 const res = await getVideosList(server.url)
50 const videos = res.body.data
51
52 expect(videos[0].files[0].magnetUri).to.contain('localhost%3A9001%2Ftracker%2Fsocket')
53 expect(videos[0].files[0].magnetUri).to.contain('localhost%3A9001%2Fstatic%2Fwebseed%2F')
54
55 expect(videos[1].files[0].magnetUri).to.contain('localhost%3A9001%2Ftracker%2Fsocket')
56 expect(videos[1].files[0].magnetUri).to.contain('localhost%3A9001%2Fstatic%2Fwebseed%2F')
57
58 const torrent = await parseTorrentVideo(server, videos[0].uuid)
59 expect(torrent.announce[0]).to.equal('ws://localhost:9001/tracker/socket')
60 expect(torrent.urlList[0]).to.contain('http://localhost:9001/static/webseed')
61 })
62
63 after(async function () {
64 killallServers([ server ])
65
66 // Keep the logs if the test failed
67 if (this['ok']) {
68 await flushTests()
69 }
70 })
71})
diff --git a/server/tests/index.ts b/server/tests/index.ts
index 26f0816b7..a7dd0d824 100644
--- a/server/tests/index.ts
+++ b/server/tests/index.ts
@@ -1,3 +1,4 @@
1// Order of the tests we want to execute 1// Order of the tests we want to execute
2import './client' 2import './client'
3import './api/' 3import './api/'
4import './cli/'
diff --git a/server/tests/utils/cli.ts b/server/tests/utils/cli.ts
new file mode 100644
index 000000000..5f07a832e
--- /dev/null
+++ b/server/tests/utils/cli.ts
@@ -0,0 +1,24 @@
1import { exec } from 'child_process'
2
3import { ServerInfo } from './servers'
4
5function getEnvCli (server?: ServerInfo) {
6 return `NODE_ENV=test NODE_APP_INSTANCE=${server.serverNumber}`
7}
8
9async function execCLI (command: string) {
10 return new Promise((res, rej) => {
11 exec(command, (err, stdout, stderr) => {
12 if (err) return rej(err)
13
14 return res(stdout)
15 })
16 })
17}
18
19// ---------------------------------------------------------------------------
20
21export {
22 execCLI,
23 getEnvCli
24}
diff --git a/server/tests/utils/index.ts b/server/tests/utils/index.ts
index 9077b0568..0fa28f2af 100644
--- a/server/tests/utils/index.ts
+++ b/server/tests/utils/index.ts
@@ -1,3 +1,4 @@
1export * from './cli'
1export * from './clients' 2export * from './clients'
2export * from './config' 3export * from './config'
3export * from './login' 4export * from './login'
diff --git a/server/tests/utils/servers.ts b/server/tests/utils/servers.ts
index 272a8935e..88027f74e 100644
--- a/server/tests/utils/servers.ts
+++ b/server/tests/utils/servers.ts
@@ -5,6 +5,7 @@ interface ServerInfo {
5 app: ChildProcess, 5 app: ChildProcess,
6 url: string 6 url: string
7 host: string 7 host: string
8 serverNumber: number
8 9
9 client: { 10 client: {
10 id: string, 11 id: string,
@@ -65,9 +66,10 @@ function flushTests () {
65 }) 66 })
66} 67}
67 68
68function runServer (serverNumber: number) { 69function runServer (serverNumber: number, configOverride?: Object) {
69 const server: ServerInfo = { 70 const server: ServerInfo = {
70 app: null, 71 app: null,
72 serverNumber: serverNumber,
71 url: `http://localhost:${9000 + serverNumber}`, 73 url: `http://localhost:${9000 + serverNumber}`,
72 host: `localhost:${9000 + serverNumber}`, 74 host: `localhost:${9000 + serverNumber}`,
73 client: { 75 client: {
@@ -98,6 +100,11 @@ function runServer (serverNumber: number) {
98 const env = Object.create(process.env) 100 const env = Object.create(process.env)
99 env['NODE_ENV'] = 'test' 101 env['NODE_ENV'] = 'test'
100 env['NODE_APP_INSTANCE'] = serverNumber.toString() 102 env['NODE_APP_INSTANCE'] = serverNumber.toString()
103
104 if (configOverride !== undefined) {
105 env['NODE_CONFIG'] = JSON.stringify(configOverride)
106 }
107
101 const options = { 108 const options = {
102 silent: true, 109 silent: true,
103 env: env, 110 env: env,
diff --git a/server/tests/utils/videos.ts b/server/tests/utils/videos.ts
index 42b7dd05a..509a2430a 100644
--- a/server/tests/utils/videos.ts
+++ b/server/tests/utils/videos.ts
@@ -1,8 +1,11 @@
1import { readFile } from 'fs'
1import * as request from 'supertest' 2import * as request from 'supertest'
2import { join, isAbsolute } from 'path' 3import { join, isAbsolute } from 'path'
4import * as parseTorrent from 'parse-torrent'
3 5
4import { makeGetRequest } from './requests' 6import { makeGetRequest } from './requests'
5import { readFilePromise } from './miscs' 7import { readFilePromise } from './miscs'
8import { ServerInfo } from './servers'
6 9
7type VideoAttributes = { 10type VideoAttributes = {
8 name?: string 11 name?: string
@@ -232,6 +235,17 @@ function rateVideo (url: string, accessToken: string, id: number, rating: string
232 .expect(specialStatus) 235 .expect(specialStatus)
233} 236}
234 237
238function parseTorrentVideo (server: ServerInfo, videoUUID: string) {
239 return new Promise<any>((res, rej) => {
240 const torrentPath = join(__dirname, '..', '..', '..', 'test' + server.serverNumber, 'torrents', videoUUID + '.torrent')
241 readFile(torrentPath, (err, data) => {
242 if (err) return rej(err)
243
244 return res(parseTorrent(data))
245 })
246 })
247}
248
235// --------------------------------------------------------------------------- 249// ---------------------------------------------------------------------------
236 250
237export { 251export {
@@ -250,5 +264,6 @@ export {
250 testVideoImage, 264 testVideoImage,
251 uploadVideo, 265 uploadVideo,
252 updateVideo, 266 updateVideo,
253 rateVideo 267 rateVideo,
268 parseTorrentVideo
254} 269}