123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- /* tslint:disable:no-unused-expression */
- import { makeGetRequest, makePostBodyRequest, makePutBodyRequest } from '../requests/requests'
- import { UserNotification, UserNotificationSetting, UserNotificationType } from '../../models/users'
- import { ServerInfo } from '..'
- import { expect } from 'chai'
- import { inspect } from 'util'
- function updateMyNotificationSettings (url: string, token: string, settings: UserNotificationSetting, statusCodeExpected = 204) {
- const path = '/api/v1/users/me/notification-settings'
- return makePutBodyRequest({
- url,
- path,
- token,
- fields: settings,
- statusCodeExpected
- })
- }
- async function getUserNotifications (
- url: string,
- token: string,
- start: number,
- count: number,
- unread?: boolean,
- sort = '-createdAt',
- statusCodeExpected = 200
- ) {
- const path = '/api/v1/users/me/notifications'
- return makeGetRequest({
- url,
- path,
- token,
- query: {
- start,
- count,
- sort,
- unread
- },
- statusCodeExpected
- })
- }
- function markAsReadNotifications (url: string, token: string, ids: number[], statusCodeExpected = 204) {
- const path = '/api/v1/users/me/notifications/read'
- return makePostBodyRequest({
- url,
- path,
- token,
- fields: { ids },
- statusCodeExpected
- })
- }
- function markAsReadAllNotifications (url: string, token: string, statusCodeExpected = 204) {
- const path = '/api/v1/users/me/notifications/read-all'
- return makePostBodyRequest({
- url,
- path,
- token,
- statusCodeExpected
- })
- }
- async function getLastNotification (serverUrl: string, accessToken: string) {
- const res = await getUserNotifications(serverUrl, accessToken, 0, 1, undefined, '-createdAt')
- if (res.body.total === 0) return undefined
- return res.body.data[0] as UserNotification
- }
- type CheckerBaseParams = {
- server: ServerInfo
- emails: object[]
- socketNotifications: UserNotification[]
- token: string,
- check?: { web: boolean, mail: boolean }
- }
- type CheckerType = 'presence' | 'absence'
- async function checkNotification (
- base: CheckerBaseParams,
- notificationChecker: (notification: UserNotification, type: CheckerType) => void,
- emailNotificationFinder: (email: object) => boolean,
- checkType: CheckerType
- ) {
- const check = base.check || { web: true, mail: true }
- if (check.web) {
- const notification = await getLastNotification(base.server.url, base.token)
- if (notification || checkType !== 'absence') {
- notificationChecker(notification, checkType)
- }
- const socketNotification = base.socketNotifications.find(n => {
- try {
- notificationChecker(n, 'presence')
- return true
- } catch {
- return false
- }
- })
- if (checkType === 'presence') {
- const obj = inspect(base.socketNotifications, { depth: 5 })
- expect(socketNotification, 'The socket notification is absent. ' + obj).to.not.be.undefined
- } else {
- const obj = inspect(socketNotification, { depth: 5 })
- expect(socketNotification, 'The socket notification is present. ' + obj).to.be.undefined
- }
- }
- if (check.mail) {
- // Last email
- const email = base.emails
- .slice()
- .reverse()
- .find(e => emailNotificationFinder(e))
- if (checkType === 'presence') {
- expect(email, 'The email is absent. ' + inspect(base.emails)).to.not.be.undefined
- } else {
- expect(email, 'The email is present. ' + inspect(email)).to.be.undefined
- }
- }
- }
- function checkVideo (video: any, videoName?: string, videoUUID?: string) {
- expect(video.name).to.be.a('string')
- expect(video.name).to.not.be.empty
- if (videoName) expect(video.name).to.equal(videoName)
- expect(video.uuid).to.be.a('string')
- expect(video.uuid).to.not.be.empty
- if (videoUUID) expect(video.uuid).to.equal(videoUUID)
- expect(video.id).to.be.a('number')
- }
- function checkActor (actor: any) {
- expect(actor.displayName).to.be.a('string')
- expect(actor.displayName).to.not.be.empty
- expect(actor.host).to.not.be.undefined
- }
- function checkComment (comment: any, commentId: number, threadId: number) {
- expect(comment.id).to.equal(commentId)
- expect(comment.threadId).to.equal(threadId)
- }
- async function checkNewVideoFromSubscription (base: CheckerBaseParams, videoName: string, videoUUID: string, type: CheckerType) {
- const notificationType = UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- checkVideo(notification.video, videoName, videoUUID)
- checkActor(notification.video.channel)
- } else {
- expect(notification).to.satisfy((n: UserNotification) => {
- return n === undefined || n.type !== UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION || n.video.name !== videoName
- })
- }
- }
- function emailFinder (email: object) {
- const text = email[ 'text' ]
- return text.indexOf(videoUUID) !== -1 && text.indexOf('Your subscription') !== -1
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- async function checkVideoIsPublished (base: CheckerBaseParams, videoName: string, videoUUID: string, type: CheckerType) {
- const notificationType = UserNotificationType.MY_VIDEO_PUBLISHED
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- checkVideo(notification.video, videoName, videoUUID)
- checkActor(notification.video.channel)
- } else {
- expect(notification.video).to.satisfy(v => v === undefined || v.name !== videoName)
- }
- }
- function emailFinder (email: object) {
- const text: string = email[ 'text' ]
- return text.includes(videoUUID) && text.includes('Your video')
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- async function checkMyVideoImportIsFinished (
- base: CheckerBaseParams,
- videoName: string,
- videoUUID: string,
- url: string,
- success: boolean,
- type: CheckerType
- ) {
- const notificationType = success ? UserNotificationType.MY_VIDEO_IMPORT_SUCCESS : UserNotificationType.MY_VIDEO_IMPORT_ERROR
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- expect(notification.videoImport.targetUrl).to.equal(url)
- if (success) checkVideo(notification.videoImport.video, videoName, videoUUID)
- } else {
- expect(notification.videoImport).to.satisfy(i => i === undefined || i.targetUrl !== url)
- }
- }
- function emailFinder (email: object) {
- const text: string = email[ 'text' ]
- const toFind = success ? ' finished' : ' error'
- return text.includes(url) && text.includes(toFind)
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- async function checkUserRegistered (base: CheckerBaseParams, username: string, type: CheckerType) {
- const notificationType = UserNotificationType.NEW_USER_REGISTRATION
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- checkActor(notification.account)
- expect(notification.account.name).to.equal(username)
- } else {
- expect(notification).to.satisfy(n => n.type !== notificationType || n.account.name !== username)
- }
- }
- function emailFinder (email: object) {
- const text: string = email[ 'text' ]
- return text.includes(' registered ') && text.includes(username)
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- async function checkNewActorFollow (
- base: CheckerBaseParams,
- followType: 'channel' | 'account',
- followerName: string,
- followerDisplayName: string,
- followingDisplayName: string,
- type: CheckerType
- ) {
- const notificationType = UserNotificationType.NEW_FOLLOW
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- checkActor(notification.actorFollow.follower)
- expect(notification.actorFollow.follower.displayName).to.equal(followerDisplayName)
- expect(notification.actorFollow.follower.name).to.equal(followerName)
- expect(notification.actorFollow.follower.host).to.not.be.undefined
- expect(notification.actorFollow.following.displayName).to.equal(followingDisplayName)
- expect(notification.actorFollow.following.type).to.equal(followType)
- } else {
- expect(notification).to.satisfy(n => {
- return n.type !== notificationType ||
- (n.actorFollow.follower.name !== followerName && n.actorFollow.following !== followingDisplayName)
- })
- }
- }
- function emailFinder (email: object) {
- const text: string = email[ 'text' ]
- return text.includes('Your ' + followType) && text.includes(followingDisplayName) && text.includes(followerDisplayName)
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- async function checkNewInstanceFollower (base: CheckerBaseParams, followerHost: string, type: CheckerType) {
- const notificationType = UserNotificationType.NEW_INSTANCE_FOLLOWER
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- checkActor(notification.actorFollow.follower)
- expect(notification.actorFollow.follower.name).to.equal('peertube')
- expect(notification.actorFollow.follower.host).to.equal(followerHost)
- expect(notification.actorFollow.following.name).to.equal('peertube')
- } else {
- expect(notification).to.satisfy(n => {
- return n.type !== notificationType || n.actorFollow.follower.host !== followerHost
- })
- }
- }
- function emailFinder (email: object) {
- const text: string = email[ 'text' ]
- return text.includes('instance has a new follower') && text.includes(followerHost)
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- async function checkCommentMention (
- base: CheckerBaseParams,
- uuid: string,
- commentId: number,
- threadId: number,
- byAccountDisplayName: string,
- type: CheckerType
- ) {
- const notificationType = UserNotificationType.COMMENT_MENTION
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- checkComment(notification.comment, commentId, threadId)
- checkActor(notification.comment.account)
- expect(notification.comment.account.displayName).to.equal(byAccountDisplayName)
- checkVideo(notification.comment.video, undefined, uuid)
- } else {
- expect(notification).to.satisfy(n => n.type !== notificationType || n.comment.id !== commentId)
- }
- }
- function emailFinder (email: object) {
- const text: string = email[ 'text' ]
- return text.includes(' mentioned ') && text.includes(uuid) && text.includes(byAccountDisplayName)
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- let lastEmailCount = 0
- async function checkNewCommentOnMyVideo (base: CheckerBaseParams, uuid: string, commentId: number, threadId: number, type: CheckerType) {
- const notificationType = UserNotificationType.NEW_COMMENT_ON_MY_VIDEO
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- checkComment(notification.comment, commentId, threadId)
- checkActor(notification.comment.account)
- checkVideo(notification.comment.video, undefined, uuid)
- } else {
- expect(notification).to.satisfy((n: UserNotification) => {
- return n === undefined || n.comment === undefined || n.comment.id !== commentId
- })
- }
- }
- const commentUrl = `http://localhost:${base.server.port}/videos/watch/${uuid};threadId=${threadId}`
- function emailFinder (email: object) {
- return email[ 'text' ].indexOf(commentUrl) !== -1
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- if (type === 'presence') {
- // We cannot detect email duplicates, so check we received another email
- expect(base.emails).to.have.length.above(lastEmailCount)
- lastEmailCount = base.emails.length
- }
- }
- async function checkNewVideoAbuseForModerators (base: CheckerBaseParams, videoUUID: string, videoName: string, type: CheckerType) {
- const notificationType = UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- expect(notification.videoAbuse.id).to.be.a('number')
- checkVideo(notification.videoAbuse.video, videoName, videoUUID)
- } else {
- expect(notification).to.satisfy((n: UserNotification) => {
- return n === undefined || n.videoAbuse === undefined || n.videoAbuse.video.uuid !== videoUUID
- })
- }
- }
- function emailFinder (email: object) {
- const text = email[ 'text' ]
- return text.indexOf(videoUUID) !== -1 && text.indexOf('abuse') !== -1
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- async function checkVideoAutoBlacklistForModerators (base: CheckerBaseParams, videoUUID: string, videoName: string, type: CheckerType) {
- const notificationType = UserNotificationType.VIDEO_AUTO_BLACKLIST_FOR_MODERATORS
- function notificationChecker (notification: UserNotification, type: CheckerType) {
- if (type === 'presence') {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- expect(notification.video.id).to.be.a('number')
- checkVideo(notification.video, videoName, videoUUID)
- } else {
- expect(notification).to.satisfy((n: UserNotification) => {
- return n === undefined || n.video === undefined || n.video.uuid !== videoUUID
- })
- }
- }
- function emailFinder (email: object) {
- const text = email[ 'text' ]
- return text.indexOf(videoUUID) !== -1 && email[ 'text' ].indexOf('video-auto-blacklist/list') !== -1
- }
- await checkNotification(base, notificationChecker, emailFinder, type)
- }
- async function checkNewBlacklistOnMyVideo (
- base: CheckerBaseParams,
- videoUUID: string,
- videoName: string,
- blacklistType: 'blacklist' | 'unblacklist'
- ) {
- const notificationType = blacklistType === 'blacklist'
- ? UserNotificationType.BLACKLIST_ON_MY_VIDEO
- : UserNotificationType.UNBLACKLIST_ON_MY_VIDEO
- function notificationChecker (notification: UserNotification) {
- expect(notification).to.not.be.undefined
- expect(notification.type).to.equal(notificationType)
- const video = blacklistType === 'blacklist' ? notification.videoBlacklist.video : notification.video
- checkVideo(video, videoName, videoUUID)
- }
- function emailFinder (email: object) {
- const text = email[ 'text' ]
- return text.indexOf(videoUUID) !== -1 && text.indexOf(' ' + blacklistType) !== -1
- }
- await checkNotification(base, notificationChecker, emailFinder, 'presence')
- }
- // ---------------------------------------------------------------------------
- export {
- CheckerBaseParams,
- CheckerType,
- checkNotification,
- markAsReadAllNotifications,
- checkMyVideoImportIsFinished,
- checkUserRegistered,
- checkVideoIsPublished,
- checkNewVideoFromSubscription,
- checkNewActorFollow,
- checkNewCommentOnMyVideo,
- checkNewBlacklistOnMyVideo,
- checkCommentMention,
- updateMyNotificationSettings,
- checkNewVideoAbuseForModerators,
- checkVideoAutoBlacklistForModerators,
- getUserNotifications,
- markAsReadNotifications,
- getLastNotification,
- checkNewInstanceFollower
- }
|