import 'mocha' ; import { io } from 'socket.io-client' ; import { checkBadCountPagination , checkBadSortPagination , checkBadStartPagination } from '@server/tests/shared' ; import { wait } from '@shared/core-utils' ; import { HttpStatusCode , UserNotificationSetting , UserNotificationSettingValue } from '@shared/models' ; import { cleanupTests , createSingleServer , makeGetRequest , makePostBodyRequest , makePutBodyRequest , PeerTubeServer , setAccessTokensToServers } from '@shared/server-commands' ; describe ( 'Test user notifications API validators' , function ( ) { let server ; before ( async function ( ) { this . timeout ( 30000 ) ; server = await createSingleServer ( 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 an incorrect unread parameter' , async function ( ) { await makeGetRequest ( { url : server . url , path , query : { unread : 'toto' } , token : server . accessToken , expectedStatus : HttpStatusCode . OK_200 } ) ; } ) ; it ( 'Should fail with a non authenticated user' , async function ( ) { await makeGetRequest ( { url : server . url , path , expectedStatus : HttpStatusCode . UNAUTHORIZED_401 } ) ; } ) ; it ( 'Should succeed with the correct parameters' , async function ( ) { await makeGetRequest ( { url : server . url , path , token : server . accessToken , expectedStatus : HttpStatusCode . OK_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 , expectedStatus : HttpStatusCode . BAD_REQUEST_400 } ) ; await makePostBodyRequest ( { url : server . url , path , fields : { ids : [ ] } , token : server . accessToken , expectedStatus : HttpStatusCode . BAD_REQUEST_400 } ) ; await makePostBodyRequest ( { url : server . url , path , fields : { ids : 5 } , token : server . accessToken , expectedStatus : HttpStatusCode . BAD_REQUEST_400 } ) ; } ) ; it ( 'Should fail with a non authenticated user' , async function ( ) { await makePostBodyRequest ( { url : server . url , path , fields : { ids : [ 5 ] } , expectedStatus : HttpStatusCode . UNAUTHORIZED_401 } ) ; } ) ; it ( 'Should succeed with the correct parameters' , async function ( ) { await makePostBodyRequest ( { url : server . url , path , fields : { ids : [ 5 ] } , token : server . accessToken , expectedStatus : HttpStatusCode . NO_CONTENT_204 } ) ; } ) ; } ) ; describe ( 'When marking as read my notifications' , function ( ) { const path = '/api/v1/users/me/notifications/read-all' ; it ( 'Should fail with a non authenticated user' , async function ( ) { await makePostBodyRequest ( { url : server . url , path , expectedStatus : HttpStatusCode . UNAUTHORIZED_401 } ) ; } ) ; it ( 'Should succeed with the correct parameters' , async function ( ) { await makePostBodyRequest ( { url : server . url , path , token : server . accessToken , expectedStatus : HttpStatusCode . NO_CONTENT_204 } ) ; } ) ; } ) ; describe ( 'When updating my notification settings' , function ( ) { const path = '/api/v1/users/me/notification-settings' ; const correctFields = { newVideoFromSubscription : UserNotificationSettingValue . WEB , newCommentOnMyVideo : UserNotificationSettingValue . WEB , abuseAsModerator : UserNotificationSettingValue . WEB , videoAutoBlacklistAsModerator : UserNotificationSettingValue . WEB , blacklistOnMyVideo : UserNotificationSettingValue . WEB , myVideoImportFinished : UserNotificationSettingValue . WEB , myVideoPublished : UserNotificationSettingValue . WEB , commentMention : UserNotificationSettingValue . WEB , newFollow : UserNotificationSettingValue . WEB , newUserRegistration : UserNotificationSettingValue . WEB , newInstanceFollower : UserNotificationSettingValue . WEB , autoInstanceFollowing : UserNotificationSettingValue . WEB , abuseNewMessage : UserNotificationSettingValue . WEB , abuseStateChange : UserNotificationSettingValue . WEB , newPeerTubeVersion : UserNotificationSettingValue . WEB , newPluginVersion : UserNotificationSettingValue . WEB } ; it ( 'Should fail with missing fields' , async function ( ) { await makePutBodyRequest ( { url : server . url , path , token : server . accessToken , fields : { newVideoFromSubscription : UserNotificationSettingValue . WEB } , expectedStatus : HttpStatusCode . BAD_REQUEST_400 } ) ; } ) ; it ( 'Should fail with incorrect field values' , async function ( ) { { const fields = { ... correctFields , newCommentOnMyVideo : 15 } ; await makePutBodyRequest ( { url : server . url , path , token : server . accessToken , fields , expectedStatus : HttpStatusCode . BAD_REQUEST_400 } ) ; } { const fields = { ... correctFields , newCommentOnMyVideo : 'toto' } ; await makePutBodyRequest ( { url : server . url , path , fields , token : server . accessToken , expectedStatus : HttpStatusCode . BAD_REQUEST_400 } ) ; } } ) ; it ( 'Should fail with a non authenticated user' , async function ( ) { await makePutBodyRequest ( { url : server . url , path , fields : correctFields , expectedStatus : HttpStatusCode . UNAUTHORIZED_401 } ) ; } ) ; it ( 'Should succeed with the correct parameters' , async function ( ) { await makePutBodyRequest ( { url : server . url , path , token : server . accessToken , fields : correctFields , expectedStatus : HttpStatusCode . NO_CONTENT_204 } ) ; } ) ; } ) ; describe ( 'When connecting to my notification socket' , function ( ) { it ( 'Should fail with no token' , function ( next ) { const socket = io ( `http://localhost:${ server . port }/user-notifications` , { reconnection : false } ) ; socket . once ( 'connect_error' , function ( ) { 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:${ server . port }/user-notifications` , { query : { accessToken : 'bad_access_token' } , reconnection : false } ) ; socket . once ( 'connect_error' , function ( ) { 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:${ server . port }/user-notifications` , { query : { accessToken : server . accessToken } , reconnection : false } ) ; function errorListener ( err ) { next ( new Error ( 'Error in connection: ' + err ) ) ; } socket . on ( 'connect_error' , errorListener ) ; socket . once ( 'connect' , async ( ) => { socket . disconnect ( ) ; await wait ( 500 ) ; next ( ) ; } ) ; } ) ; } ) ; after ( async function ( ) { await cleanupTests ( [ server ] ) ; } ) ; } ) ;