Begin tests for user quota
authorChocobozzz <florian.bigard@gmail.com>
Tue, 5 Sep 2017 20:09:16 +0000 (22:09 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Tue, 5 Sep 2017 20:09:16 +0000 (22:09 +0200)
client/tslint.json
config/test-1.yaml
server/middlewares/validators/videos.ts
server/models/user/user.ts
server/models/video/author.ts
server/tests/api/users.ts
server/tests/utils/users.ts

index b1e211ee9cb6d030453c7f96ac9af6ffff4a75da..6438519a69bcee7db8d876169a2dec2185ee17f4 100644 (file)
@@ -28,7 +28,7 @@
     "component-class-suffix": true,
     "directive-class-suffix": true,
     "templates-use-public": true,
-    "no-access-missing-member": true,
+    "no-access-missing-member": false,
     "invoke-injectable": true
   }
 }
index d08a3bee6a741d37d5841a28016daad5fd14cbbf..f1514e9cc227f9bc01c8ab829dfa5106a31b8e75 100644 (file)
@@ -21,5 +21,8 @@ storage:
 admin:
   email: 'admin1@example.com'
 
+user:
+  video_quota: 1024 * 1024 * 5
+
 signup:
   limit: 4
index 576814fcb21c297b7c04404cbceeac401db3653e..ba8c2d834f3e21ddbe329265834a394967219310 100644 (file)
@@ -49,8 +49,8 @@ function videosAddValidator (req: express.Request, res: express.Response, next:
         next()
       })
       .catch(err => {
-        logger.error('Error in getting duration from file.', err)
-        res.status(400).send('Cannot retrieve metadata of the file.')
+        logger.error('Error in video add validator', err)
+        res.sendStatus(500)
       })
   })
 }
index 12a7547f5d3cf953b1dc37c69e01e26ee0ebb74b..9bf13ad243e5098cef1fd806332344bd3d64567e 100644 (file)
@@ -244,7 +244,7 @@ loadByUsernameOrEmail = function (username: string, email: string) {
 function getOriginalVideoFileTotalFromUser (user: UserInstance) {
   const query = {
     attributes: [
-      Sequelize.fn('COUNT', Sequelize.col('VideoFile.size'), 'totalVideoBytes')
+      Sequelize.fn('COUNT', Sequelize.col('User.Author.Video.VideoFile.size'), 'totalVideoBytes')
     ],
     where: {
       id: user.id
@@ -252,12 +252,15 @@ function getOriginalVideoFileTotalFromUser (user: UserInstance) {
     include: [
       {
         model: User['sequelize'].models.Author,
+        required: true,
         include: [
           {
             model: User['sequelize'].models.Video,
+            required: true,
             include: [
               {
-                model: User['sequelize'].models.VideoFile
+                model: User['sequelize'].models.VideoFile,
+                required: true
               }
             ]
           }
index c30cc306df0f7d3db8aae722f1e1b375adf21c05..fd0f44f6b2e74a80699dd4fde49deffcd18524cf 100644 (file)
@@ -71,6 +71,14 @@ function associate (models) {
     },
     onDelete: 'cascade'
   })
+
+  Author.hasMany(models.Video, {
+    foreignKey: {
+      name: 'authorId',
+      allowNull: false
+    },
+    onDelete: 'cascade'
+  })
 }
 
 findOrCreateAuthor = function (name: string, podId: number, userId: number, transaction: Sequelize.Transaction) {
index fd3b511233aafb96e82f960afcc1d39e27d5e9f3..104d783bb369b298b13f3d5a492893369bfac9f7 100644 (file)
@@ -19,14 +19,16 @@ import {
   makePutBodyRequest,
   createUser,
   loginAndGetAccessToken,
-  getUserInformation,
+  getMyUserInformation,
   getUsersList,
   getUsersListPaginationAndSort,
   updateUser,
+  updateMyUser,
   registerUser,
   removeUser
 } from '../utils'
 import { killallServers } from '../utils/servers'
+import { getUserInformation } from '../utils/users'
 
 describe('Test users', function () {
   let server: ServerInfo
@@ -166,7 +168,7 @@ describe('Test users', function () {
   it('Should be able to upload a video again')
 
   it('Should be able to create a new user', async function () {
-    await createUser(server.url, accessToken, 'user_1', 'super password')
+    await createUser(server.url, accessToken, 'user_1', 'super password', 2 * 1024 * 1024)
   })
 
   it('Should be able to login with this user', async function () {
@@ -179,12 +181,13 @@ describe('Test users', function () {
   })
 
   it('Should be able to get the user information', async function () {
-    const res = await getUserInformation(server.url, accessTokenUser)
+    const res = await getMyUserInformation(server.url, accessTokenUser)
     const user = res.body
 
     expect(user.username).to.equal('user_1')
     expect(user.email).to.equal('user_1@example.com')
     expect(user.displayNSFW).to.be.false
+    expect(user.videoQuota).to.equal(2 * 1024 * 1024)
     expect(user.id).to.be.a('number')
   })
 
@@ -282,22 +285,49 @@ describe('Test users', function () {
     expect(users[1].displayNSFW).to.be.false
   })
 
-  it('Should update the user password', async function () {
-    await updateUser(server.url, userId, accessTokenUser, 'new password', null)
+  it('Should update my password', async function () {
+    await updateMyUser(server.url, accessTokenUser, 'new password')
     server.user.password = 'new password'
 
     await login(server.url, server.client, server.user, 200)
   })
 
   it('Should be able to change the NSFW display attribute', async function () {
-    await updateUser(server.url, userId, accessTokenUser, null, true)
+    await updateMyUser(server.url, accessTokenUser, undefined, true)
 
-    const res = await getUserInformation(server.url, accessTokenUser)
+    const res = await getMyUserInformation(server.url, accessTokenUser)
     const user = res.body
 
     expect(user.username).to.equal('user_1')
     expect(user.email).to.equal('user_1@example.com')
     expect(user.displayNSFW).to.be.ok
+    expect(user.videoQuota).to.equal(2 * 1024 * 1024)
+    expect(user.id).to.be.a('number')
+  })
+
+  it('Should be able to change the email display attribute', async function () {
+    await updateMyUser(server.url, accessTokenUser, undefined, undefined, 'updated@example.com')
+
+    const res = await getMyUserInformation(server.url, accessTokenUser)
+    const user = res.body
+
+    expect(user.username).to.equal('user_1')
+    expect(user.email).to.equal('updated@example.com')
+    expect(user.displayNSFW).to.be.ok
+    expect(user.videoQuota).to.equal(2 * 1024 * 1024)
+    expect(user.id).to.be.a('number')
+  })
+
+  it('Should be able to update another user', async function () {
+    await updateUser(server.url, userId, server.accessToken, 'updated2@example.com', 42 )
+
+    const res = await getUserInformation(server.url, server.accessToken, userId)
+    const user = res.body
+
+    expect(user.username).to.equal('user_1')
+    expect(user.email).to.equal('updated2@example.com')
+    expect(user.displayNSFW).to.be.ok
+    expect(user.videoQuota).to.equal(42)
     expect(user.id).to.be.a('number')
   })
 
@@ -329,7 +359,14 @@ describe('Test users', function () {
       password: 'my super password'
     }
 
-    await loginAndGetAccessToken(server)
+    accessToken = await loginAndGetAccessToken(server)
+  })
+
+  it('Should have the correct video quota', async function () {
+    const res = await getMyUserInformation(server.url, accessToken)
+    const user = res.body
+
+    expect(user.videoQuota).to.equal(5 * 1024 * 1024)
   })
 
   after(async function () {
index 6e4b5f2f563e902f514bc721d0f36029f260734e..1c3f6826ee398a7204b87cf90e689fbcdb9ea329 100644 (file)
@@ -1,11 +1,12 @@
 import * as request from 'supertest'
 
-function createUser (url: string, accessToken: string, username: string, password: string, specialStatus = 204) {
+function createUser (url: string, accessToken: string, username: string, password: string, videoQuota = 1000000, specialStatus = 204) {
   const path = '/api/v1/users'
   const body = {
     username,
     password,
-    email: username + '@example.com'
+    email: username + '@example.com',
+    videoQuota
   }
 
   return request(url)
@@ -31,7 +32,7 @@ function registerUser (url: string, username: string, password: string, specialS
           .expect(specialStatus)
 }
 
-function getUserInformation (url: string, accessToken: string) {
+function getMyUserInformation (url: string, accessToken: string) {
   const path = '/api/v1/users/me'
 
   return request(url)
@@ -42,6 +43,17 @@ function getUserInformation (url: string, accessToken: string) {
           .expect('Content-Type', /json/)
 }
 
+function getUserInformation (url: string, accessToken: string, userId: number) {
+  const path = '/api/v1/users/' + userId
+
+  return request(url)
+    .get(path)
+    .set('Accept', 'application/json')
+    .set('Authorization', 'Bearer ' + accessToken)
+    .expect(200)
+    .expect('Content-Type', /json/)
+}
+
 function getUserVideoRating (url: string, accessToken: string, videoId: number) {
   const path = '/api/v1/users/me/videos/' + videoId + '/rating'
 
@@ -86,12 +98,28 @@ function removeUser (url: string, userId: number, accessToken: string, expectedS
           .expect(expectedStatus)
 }
 
-function updateUser (url: string, userId: number, accessToken: string, newPassword: string, displayNSFW: boolean) {
-  const path = '/api/v1/users/' + userId
+function updateMyUser (url: string, accessToken: string, newPassword: string, displayNSFW?: boolean, email?: string) {
+  const path = '/api/v1/users/me'
 
   const toSend = {}
   if (newPassword !== undefined && newPassword !== null) toSend['password'] = newPassword
   if (displayNSFW !== undefined && displayNSFW !== null) toSend['displayNSFW'] = displayNSFW
+  if (email !== undefined && email !== null) toSend['email'] = email
+
+  return request(url)
+    .put(path)
+    .set('Accept', 'application/json')
+    .set('Authorization', 'Bearer ' + accessToken)
+    .send(toSend)
+    .expect(204)
+}
+
+function updateUser (url: string, userId: number, accessToken: string, email: string, videoQuota: number) {
+  const path = '/api/v1/users/' + userId
+
+  const toSend = {}
+  if (email !== undefined && email !== null) toSend['password'] = email
+  if (videoQuota !== undefined && videoQuota !== null) toSend['videoQuota'] = videoQuota
 
   return request(url)
           .put(path)
@@ -106,10 +134,12 @@ function updateUser (url: string, userId: number, accessToken: string, newPasswo
 export {
   createUser,
   registerUser,
-  getUserInformation,
+  getMyUserInformation,
   getUserVideoRating,
   getUsersList,
   getUsersListPaginationAndSort,
   removeUser,
-  updateUser
+  updateUser,
+  updateMyUser,
+  getUserInformation
 }