From cef534ed53e4518fe0acf581bfe880788d42fc36 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 26 Dec 2018 10:36:24 +0100 Subject: Add user notification base code --- server/tests/api/check-params/index.ts | 1 + .../tests/api/check-params/user-notifications.ts | 249 +++++++++++++++++++++ 2 files changed, 250 insertions(+) create mode 100644 server/tests/api/check-params/user-notifications.ts (limited to 'server/tests/api/check-params') diff --git a/server/tests/api/check-params/index.ts b/server/tests/api/check-params/index.ts index 877ceb0a7..7a181d1d6 100644 --- a/server/tests/api/check-params/index.ts +++ b/server/tests/api/check-params/index.ts @@ -7,6 +7,7 @@ import './jobs' import './redundancy' import './search' import './services' +import './user-notifications' import './user-subscriptions' import './users' import './video-abuses' diff --git a/server/tests/api/check-params/user-notifications.ts b/server/tests/api/check-params/user-notifications.ts new file mode 100644 index 000000000..3ae36ddb3 --- /dev/null +++ b/server/tests/api/check-params/user-notifications.ts @@ -0,0 +1,249 @@ +/* tslint:disable:no-unused-expression */ + +import 'mocha' +import * as io from 'socket.io-client' + +import { + flushTests, + immutableAssign, + killallServers, + makeGetRequest, + makePostBodyRequest, + makePutBodyRequest, + runServer, + ServerInfo, + setAccessTokensToServers, + wait +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' +import { UserNotificationSetting, UserNotificationSettingValue } from '../../../../shared/models/users' + +describe('Test user notifications API validators', function () { + let server: ServerInfo + + // --------------------------------------------------------------- + + before(async function () { + this.timeout(30000) + + await flushTests() + + server = await runServer(1) + + await setAccessTokensToServers([ server ]) + }) + + describe('When listing my notifications', function () { + const path = '/api/v1/users/me/notifications' + + it('Should fail with a bad start pagination', async function () { + await checkBadStartPagination(server.url, path, server.accessToken) + }) + + it('Should fail with a bad count pagination', async function () { + await checkBadCountPagination(server.url, path, server.accessToken) + }) + + it('Should fail with an incorrect sort', async function () { + await checkBadSortPagination(server.url, path, server.accessToken) + }) + + it('Should fail with a non authenticated user', async function () { + await makeGetRequest({ + url: server.url, + path, + statusCodeExpected: 401 + }) + }) + + it('Should succeed with the correct parameters', async function () { + await makeGetRequest({ + url: server.url, + path, + token: server.accessToken, + statusCodeExpected: 200 + }) + }) + }) + + describe('When marking as read my notifications', function () { + const path = '/api/v1/users/me/notifications/read' + + it('Should fail with wrong ids parameters', async function () { + await makePostBodyRequest({ + url: server.url, + path, + fields: { + ids: [ 'hello' ] + }, + token: server.accessToken, + statusCodeExpected: 400 + }) + + await makePostBodyRequest({ + url: server.url, + path, + fields: { + ids: 5 + }, + token: server.accessToken, + statusCodeExpected: 400 + }) + }) + + it('Should fail with a non authenticated user', async function () { + await makePostBodyRequest({ + url: server.url, + path, + fields: { + ids: [ 5 ] + }, + statusCodeExpected: 401 + }) + }) + + it('Should succeed with the correct parameters', async function () { + await makePostBodyRequest({ + url: server.url, + path, + fields: { + ids: [ 5 ] + }, + token: server.accessToken, + statusCodeExpected: 204 + }) + }) + }) + + describe('When updating my notification settings', function () { + const path = '/api/v1/users/me/notification-settings' + const correctFields: UserNotificationSetting = { + newVideoFromSubscription: UserNotificationSettingValue.WEB_NOTIFICATION, + newCommentOnMyVideo: UserNotificationSettingValue.WEB_NOTIFICATION, + videoAbuseAsModerator: UserNotificationSettingValue.WEB_NOTIFICATION, + blacklistOnMyVideo: UserNotificationSettingValue.WEB_NOTIFICATION + } + + it('Should fail with missing fields', async function () { + await makePutBodyRequest({ + url: server.url, + path, + token: server.accessToken, + fields: { newVideoFromSubscription: UserNotificationSettingValue.WEB_NOTIFICATION }, + statusCodeExpected: 400 + }) + }) + + it('Should fail with incorrect field values', async function () { + { + const fields = immutableAssign(correctFields, { newCommentOnMyVideo: 15 }) + + await makePutBodyRequest({ + url: server.url, + path, + token: server.accessToken, + fields, + statusCodeExpected: 400 + }) + } + + { + const fields = immutableAssign(correctFields, { newCommentOnMyVideo: 'toto' }) + + await makePutBodyRequest({ + url: server.url, + path, + fields, + token: server.accessToken, + statusCodeExpected: 400 + }) + } + }) + + it('Should fail with a non authenticated user', async function () { + await makePutBodyRequest({ + url: server.url, + path, + fields: correctFields, + statusCodeExpected: 401 + }) + }) + + it('Should succeed with the correct parameters', async function () { + await makePutBodyRequest({ + url: server.url, + path, + token: server.accessToken, + fields: correctFields, + statusCodeExpected: 204 + }) + }) + }) + + describe('When connecting to my notification socket', function () { + it('Should fail with no token', function (next) { + const socket = io('http://localhost:9001/user-notifications', { reconnection: false }) + + socket.on('error', () => { + socket.removeListener('error', this) + socket.disconnect() + next() + }) + + socket.on('connect', () => { + socket.disconnect() + next(new Error('Connected with a missing token.')) + }) + }) + + it('Should fail with an invalid token', function (next) { + const socket = io('http://localhost:9001/user-notifications', { + query: { accessToken: 'bad_access_token' }, + reconnection: false + }) + + socket.on('error', () => { + socket.removeListener('error', this) + socket.disconnect() + next() + }) + + socket.on('connect', () => { + socket.disconnect() + next(new Error('Connected with an invalid token.')) + }) + }) + + it('Should success with the correct token', function (next) { + const socket = io('http://localhost:9001/user-notifications', { + query: { accessToken: server.accessToken }, + reconnection: false + }) + + const errorListener = socket.on('error', err => { + next(new Error('Error in connection: ' + err)) + }) + + socket.on('connect', async () => { + socket.removeListener('error', errorListener) + socket.disconnect() + + await wait(500) + next() + }) + }) + }) + + after(async function () { + killallServers([ server ]) + + // Keep the logs if the test failed + if (this['ok']) { + await flushTests() + } + }) +}) -- cgit v1.2.3