/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ import 'mocha' import * as chai from 'chai' import { CheckerBaseParams, checkNewVideoFromSubscription, cleanupTests, getAllNotificationsSettings, getMyUserInformation, getUserNotifications, immutableAssign, markAsReadAllNotifications, markAsReadNotifications, MockSmtpServer, prepareNotificationsTest, ServerInfo, updateMyNotificationSettings, uploadRandomVideo, waitJobs } from '@shared/extra-utils' import { User, UserNotification, UserNotificationSettingValue } from '@shared/models' const expect = chai.expect describe('Test notifications API', function () { let server: ServerInfo let userNotifications: UserNotification[] = [] let userAccessToken: string let emails: object[] = [] before(async function () { this.timeout(120000) const res = await prepareNotificationsTest(1) emails = res.emails userAccessToken = res.userAccessToken userNotifications = res.userNotifications server = res.servers[0] await server.subscriptionsCommand.add({ token: userAccessToken, targetUri: 'root_channel@localhost:' + server.port }) for (let i = 0; i < 10; i++) { await uploadRandomVideo(server, false) } await waitJobs([ server ]) }) describe('Mark as read', function () { it('Should mark as read some notifications', async function () { const res = await getUserNotifications(server.url, userAccessToken, 2, 3) const ids = res.body.data.map(n => n.id) await markAsReadNotifications(server.url, userAccessToken, ids) }) it('Should have the notifications marked as read', async function () { const res = await getUserNotifications(server.url, userAccessToken, 0, 10) const notifications = res.body.data as UserNotification[] expect(notifications[0].read).to.be.false expect(notifications[1].read).to.be.false expect(notifications[2].read).to.be.true expect(notifications[3].read).to.be.true expect(notifications[4].read).to.be.true expect(notifications[5].read).to.be.false }) it('Should only list read notifications', async function () { const res = await getUserNotifications(server.url, userAccessToken, 0, 10, false) const notifications = res.body.data as UserNotification[] for (const notification of notifications) { expect(notification.read).to.be.true } }) it('Should only list unread notifications', async function () { const res = await getUserNotifications(server.url, userAccessToken, 0, 10, true) const notifications = res.body.data as UserNotification[] for (const notification of notifications) { expect(notification.read).to.be.false } }) it('Should mark as read all notifications', async function () { await markAsReadAllNotifications(server.url, userAccessToken) const res = await getUserNotifications(server.url, userAccessToken, 0, 10, true) expect(res.body.total).to.equal(0) expect(res.body.data).to.have.lengthOf(0) }) }) describe('Notification settings', function () { let baseParams: CheckerBaseParams before(() => { baseParams = { server: server, emails, socketNotifications: userNotifications, token: userAccessToken } }) it('Should not have notifications', async function () { this.timeout(20000) await updateMyNotificationSettings(server.url, userAccessToken, immutableAssign(getAllNotificationsSettings(), { newVideoFromSubscription: UserNotificationSettingValue.NONE })) { const res = await getMyUserInformation(server.url, userAccessToken) const info = res.body as User expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.NONE) } const { name, uuid } = await uploadRandomVideo(server) const check = { web: true, mail: true } await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'absence') }) it('Should only have web notifications', async function () { this.timeout(20000) await updateMyNotificationSettings(server.url, userAccessToken, immutableAssign(getAllNotificationsSettings(), { newVideoFromSubscription: UserNotificationSettingValue.WEB })) { const res = await getMyUserInformation(server.url, userAccessToken) const info = res.body as User expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.WEB) } const { name, uuid } = await uploadRandomVideo(server) { const check = { mail: true, web: false } await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'absence') } { const check = { mail: false, web: true } await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'presence') } }) it('Should only have mail notifications', async function () { this.timeout(20000) await updateMyNotificationSettings(server.url, userAccessToken, immutableAssign(getAllNotificationsSettings(), { newVideoFromSubscription: UserNotificationSettingValue.EMAIL })) { const res = await getMyUserInformation(server.url, userAccessToken) const info = res.body as User expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.EMAIL) } const { name, uuid } = await uploadRandomVideo(server) { const check = { mail: false, web: true } await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'absence') } { const check = { mail: true, web: false } await checkNewVideoFromSubscription(immutableAssign(baseParams, { check }), name, uuid, 'presence') } }) it('Should have email and web notifications', async function () { this.timeout(20000) await updateMyNotificationSettings(server.url, userAccessToken, immutableAssign(getAllNotificationsSettings(), { newVideoFromSubscription: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL })) { const res = await getMyUserInformation(server.url, userAccessToken) const info = res.body as User expect(info.notificationSettings.newVideoFromSubscription).to.equal( UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL ) } const { name, uuid } = await uploadRandomVideo(server) await checkNewVideoFromSubscription(baseParams, name, uuid, 'presence') }) }) after(async function () { MockSmtpServer.Instance.kill() await cleanupTests([ server ]) }) })