Verified Commit dd0ebb71 authored by Chocobozzz's avatar Chocobozzz
Browse files

Introduce notifications command

parent 9293139f
......@@ -69,7 +69,7 @@ describe('Test contact form API validators', function () {
})
it('Should accept a contact form with the correct parameters', async function () {
await command.send({ ...defaultBody })
await command.send(defaultBody)
})
after(async function () {
......
......@@ -278,7 +278,7 @@ describe('Test video comments API validator', function () {
let commentToDelete: number
{
const created = await server.commentsCommand.createThread({ videoId: video.uuid, text: 'hello' })
const created = await server.commentsCommand.createThread({ videoId: video.uuid, token: userAccessToken, text: 'hello' })
commentToDelete = created.id
}
......
......@@ -7,27 +7,22 @@ import {
createUser,
doubleFollow,
flushAndRunMultipleServers,
getUserNotifications,
markAsReadAllNotifications,
ServerInfo,
setAccessTokensToServers,
uploadVideo,
userLogin,
waitJobs
} from '@shared/extra-utils'
import { UserNotification, UserNotificationType } from '@shared/models'
import { UserNotificationType } from '@shared/models'
const expect = chai.expect
async function checkNotifications (url: string, token: string, expected: UserNotificationType[]) {
const res = await getUserNotifications(url, token, 0, 10, true)
const notifications: UserNotification[] = res.body.data
expect(notifications).to.have.lengthOf(expected.length)
async function checkNotifications (server: ServerInfo, token: string, expected: UserNotificationType[]) {
const { data } = await server.notificationsCommand.list({ token, start: 0, count: 10, unread: true })
expect(data).to.have.lengthOf(expected.length)
for (const type of expected) {
expect(notifications.find(n => n.type === type)).to.exist
expect(data.find(n => n.type === type)).to.exist
}
}
......@@ -47,8 +42,8 @@ describe('Test blocklist', function () {
await waitJobs(servers)
await markAsReadAllNotifications(servers[0].url, userToken1)
await markAsReadAllNotifications(servers[0].url, userToken2)
await servers[0].notificationsCommand.markAsReadAll({ token: userToken1 })
await servers[0].notificationsCommand.markAsReadAll({ token: userToken2 })
{
const res = await uploadVideo(servers[0].url, userToken1, { name: 'video' })
......@@ -122,7 +117,7 @@ describe('Test blocklist', function () {
it('Should have appropriate notifications', async function () {
const notifs = [ UserNotificationType.NEW_COMMENT_ON_MY_VIDEO, UserNotificationType.NEW_FOLLOW ]
await checkNotifications(servers[0].url, userToken1, notifs)
await checkNotifications(servers[0], userToken1, notifs)
})
it('Should block an account', async function () {
......@@ -133,13 +128,13 @@ describe('Test blocklist', function () {
})
it('Should not have notifications from this account', async function () {
await checkNotifications(servers[0].url, userToken1, [])
await checkNotifications(servers[0], userToken1, [])
})
it('Should have notifications of this account on user 2', async function () {
const notifs = [ UserNotificationType.COMMENT_MENTION, UserNotificationType.NEW_FOLLOW ]
await checkNotifications(servers[0].url, userToken2, notifs)
await checkNotifications(servers[0], userToken2, notifs)
await servers[0].blocklistCommand.removeFromMyBlocklist({ token: userToken1, account: 'user3@' + servers[1].host })
})
......@@ -155,7 +150,7 @@ describe('Test blocklist', function () {
it('Should have appropriate notifications', async function () {
const notifs = [ UserNotificationType.NEW_COMMENT_ON_MY_VIDEO, UserNotificationType.NEW_FOLLOW ]
await checkNotifications(servers[0].url, userToken1, notifs)
await checkNotifications(servers[0], userToken1, notifs)
})
it('Should block an account', async function () {
......@@ -166,13 +161,13 @@ describe('Test blocklist', function () {
})
it('Should not have notifications from this account', async function () {
await checkNotifications(servers[0].url, userToken1, [])
await checkNotifications(servers[0], userToken1, [])
})
it('Should have notifications of this account on user 2', async function () {
const notifs = [ UserNotificationType.COMMENT_MENTION, UserNotificationType.NEW_FOLLOW ]
await checkNotifications(servers[0].url, userToken2, notifs)
await checkNotifications(servers[0], userToken2, notifs)
await servers[0].blocklistCommand.removeFromMyBlocklist({ token: userToken1, server: servers[1].host })
})
......@@ -189,12 +184,12 @@ describe('Test blocklist', function () {
it('Should have appropriate notifications', async function () {
{
const notifs = [ UserNotificationType.NEW_COMMENT_ON_MY_VIDEO, UserNotificationType.NEW_FOLLOW ]
await checkNotifications(servers[0].url, userToken1, notifs)
await checkNotifications(servers[0], userToken1, notifs)
}
{
const notifs = [ UserNotificationType.COMMENT_MENTION, UserNotificationType.NEW_FOLLOW ]
await checkNotifications(servers[0].url, userToken2, notifs)
await checkNotifications(servers[0], userToken2, notifs)
}
})
......@@ -206,8 +201,8 @@ describe('Test blocklist', function () {
})
it('Should not have notifications from this account', async function () {
await checkNotifications(servers[0].url, userToken1, [])
await checkNotifications(servers[0].url, userToken2, [])
await checkNotifications(servers[0], userToken1, [])
await checkNotifications(servers[0], userToken2, [])
await servers[0].blocklistCommand.removeFromServerBlocklist({ account: 'user3@' + servers[1].host })
})
......@@ -224,12 +219,12 @@ describe('Test blocklist', function () {
it('Should have appropriate notifications', async function () {
{
const notifs = [ UserNotificationType.NEW_COMMENT_ON_MY_VIDEO, UserNotificationType.NEW_FOLLOW ]
await checkNotifications(servers[0].url, userToken1, notifs)
await checkNotifications(servers[0], userToken1, notifs)
}
{
const notifs = [ UserNotificationType.COMMENT_MENTION, UserNotificationType.NEW_FOLLOW ]
await checkNotifications(servers[0].url, userToken2, notifs)
await checkNotifications(servers[0], userToken2, notifs)
}
})
......@@ -241,8 +236,8 @@ describe('Test blocklist', function () {
})
it('Should not have notifications from this account', async function () {
await checkNotifications(servers[0].url, userToken1, [])
await checkNotifications(servers[0].url, userToken2, [])
await checkNotifications(servers[0], userToken1, [])
await checkNotifications(servers[0], userToken2, [])
})
})
......
......@@ -9,7 +9,6 @@ import {
createUser,
doubleFollow,
flushAndRunMultipleServers,
getUserNotifications,
getVideosList,
getVideosListWithToken,
ServerInfo,
......@@ -18,7 +17,7 @@ import {
userLogin,
waitJobs
} from '@shared/extra-utils'
import { UserNotification, UserNotificationType, Video } from '@shared/models'
import { UserNotificationType, Video } from '@shared/models'
const expect = chai.expect
......@@ -59,9 +58,8 @@ async function checkCommentNotification (
await waitJobs([ mainServer, comment.server ])
const res = await getUserNotifications(mainServer.url, mainServer.accessToken, 0, 30)
const commentNotifications = (res.body.data as UserNotification[])
.filter(n => n.comment && n.comment.video.uuid === comment.videoUUID && n.createdAt >= createdAt)
const { data } = await mainServer.notificationsCommand.list({ start: 0, count: 30 })
const commentNotifications = data.filter(n => n.comment && n.comment.video.uuid === comment.videoUUID && n.createdAt >= createdAt)
if (check === 'presence') expect(commentNotifications).to.have.lengthOf(1)
else expect(commentNotifications).to.have.lengthOf(0)
......@@ -710,12 +708,10 @@ describe('Test blocklist', function () {
await waitJobs(servers)
const res = await getUserNotifications(servers[0].url, servers[0].accessToken, 0, 30)
const commentNotifications = (res.body.data as UserNotification[])
.filter(n => {
return n.type === UserNotificationType.NEW_INSTANCE_FOLLOWER &&
n.createdAt >= now.toISOString()
})
const { data } = await servers[0].notificationsCommand.list({ start: 0, count: 30 })
const commentNotifications = data.filter(n => {
return n.type === UserNotificationType.NEW_INSTANCE_FOLLOWER && n.createdAt >= now.toISOString()
})
expect(commentNotifications).to.have.lengthOf(0)
}
......@@ -773,12 +769,10 @@ describe('Test blocklist', function () {
await waitJobs(servers)
const res = await getUserNotifications(servers[0].url, servers[0].accessToken, 0, 30)
const commentNotifications = (res.body.data as UserNotification[])
.filter(n => {
return n.type === UserNotificationType.NEW_INSTANCE_FOLLOWER &&
n.createdAt >= now.toISOString()
})
const { data } = await servers[0].notificationsCommand.list({ start: 0, count: 30 })
const commentNotifications = data.filter(n => {
return n.type === UserNotificationType.NEW_INSTANCE_FOLLOWER && n.createdAt >= now.toISOString()
})
expect(commentNotifications).to.have.lengthOf(1)
}
......
......@@ -8,14 +8,10 @@ import {
cleanupTests,
getAllNotificationsSettings,
getMyUserInformation,
getUserNotifications,
immutableAssign,
markAsReadAllNotifications,
markAsReadNotifications,
MockSmtpServer,
prepareNotificationsTest,
ServerInfo,
updateMyNotificationSettings,
uploadRandomVideo,
waitJobs
} from '@shared/extra-utils'
......@@ -26,7 +22,7 @@ const expect = chai.expect
describe('Test notifications API', function () {
let server: ServerInfo
let userNotifications: UserNotification[] = []
let userAccessToken: string
let userToken: string
let emails: object[] = []
before(async function () {
......@@ -34,11 +30,11 @@ describe('Test notifications API', function () {
const res = await prepareNotificationsTest(1)
emails = res.emails
userAccessToken = res.userAccessToken
userToken = res.userAccessToken
userNotifications = res.userNotifications
server = res.servers[0]
await server.subscriptionsCommand.add({ token: userAccessToken, targetUri: 'root_channel@localhost:' + server.port })
await server.subscriptionsCommand.add({ token: userToken, targetUri: 'root_channel@localhost:' + server.port })
for (let i = 0; i < 10; i++) {
await uploadRandomVideo(server, false)
......@@ -50,49 +46,46 @@ describe('Test notifications API', function () {
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)
const { data } = await server.notificationsCommand.list({ token: userToken, start: 2, count: 3 })
const ids = data.map(n => n.id)
await markAsReadNotifications(server.url, userAccessToken, ids)
await server.notificationsCommand.markAsRead({ token: userToken, 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
const { data } = await server.notificationsCommand.list({ token: userToken, start: 0, count: 10 })
expect(data[0].read).to.be.false
expect(data[1].read).to.be.false
expect(data[2].read).to.be.true
expect(data[3].read).to.be.true
expect(data[4].read).to.be.true
expect(data[5].read).to.be.false
})
it('Should only list read notifications', async function () {
const res = await getUserNotifications(server.url, userAccessToken, 0, 10, false)
const { data } = await server.notificationsCommand.list({ token: userToken, start: 0, count: 10, unread: false })
const notifications = res.body.data as UserNotification[]
for (const notification of notifications) {
for (const notification of data) {
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 { data } = await server.notificationsCommand.list({ token: userToken, start: 0, count: 10, unread: true })
const notifications = res.body.data as UserNotification[]
for (const notification of notifications) {
for (const notification of data) {
expect(notification.read).to.be.false
}
})
it('Should mark as read all notifications', async function () {
await markAsReadAllNotifications(server.url, userAccessToken)
await server.notificationsCommand.markAsReadAll({ token: userToken })
const res = await getUserNotifications(server.url, userAccessToken, 0, 10, true)
const body = await server.notificationsCommand.list({ token: userToken, start: 0, count: 10, unread: true })
expect(res.body.total).to.equal(0)
expect(res.body.data).to.have.lengthOf(0)
expect(body.total).to.equal(0)
expect(body.data).to.have.lengthOf(0)
})
})
......@@ -104,19 +97,20 @@ describe('Test notifications API', function () {
server: server,
emails,
socketNotifications: userNotifications,
token: userAccessToken
token: userToken
}
})
it('Should not have notifications', async function () {
this.timeout(20000)
await updateMyNotificationSettings(server.url, userAccessToken, immutableAssign(getAllNotificationsSettings(), {
newVideoFromSubscription: UserNotificationSettingValue.NONE
}))
await server.notificationsCommand.updateMySettings({
token: userToken,
settings: { ...getAllNotificationsSettings(), newVideoFromSubscription: UserNotificationSettingValue.NONE }
})
{
const res = await getMyUserInformation(server.url, userAccessToken)
const res = await getMyUserInformation(server.url, userToken)
const info = res.body as User
expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.NONE)
}
......@@ -130,12 +124,13 @@ describe('Test notifications API', function () {
it('Should only have web notifications', async function () {
this.timeout(20000)
await updateMyNotificationSettings(server.url, userAccessToken, immutableAssign(getAllNotificationsSettings(), {
newVideoFromSubscription: UserNotificationSettingValue.WEB
}))
await server.notificationsCommand.updateMySettings({
token: userToken,
settings: { ...getAllNotificationsSettings(), newVideoFromSubscription: UserNotificationSettingValue.WEB }
})
{
const res = await getMyUserInformation(server.url, userAccessToken)
const res = await getMyUserInformation(server.url, userToken)
const info = res.body as User
expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.WEB)
}
......@@ -156,12 +151,13 @@ describe('Test notifications API', function () {
it('Should only have mail notifications', async function () {
this.timeout(20000)
await updateMyNotificationSettings(server.url, userAccessToken, immutableAssign(getAllNotificationsSettings(), {
newVideoFromSubscription: UserNotificationSettingValue.EMAIL
}))
await server.notificationsCommand.updateMySettings({
token: userToken,
settings: { ...getAllNotificationsSettings(), newVideoFromSubscription: UserNotificationSettingValue.EMAIL }
})
{
const res = await getMyUserInformation(server.url, userAccessToken)
const res = await getMyUserInformation(server.url, userToken)
const info = res.body as User
expect(info.notificationSettings.newVideoFromSubscription).to.equal(UserNotificationSettingValue.EMAIL)
}
......@@ -182,12 +178,16 @@ describe('Test notifications API', function () {
it('Should have email and web notifications', async function () {
this.timeout(20000)
await updateMyNotificationSettings(server.url, userAccessToken, immutableAssign(getAllNotificationsSettings(), {
newVideoFromSubscription: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
}))
await server.notificationsCommand.updateMySettings({
token: userToken,
settings: {
...getAllNotificationsSettings(),
newVideoFromSubscription: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
}
})
{
const res = await getMyUserInformation(server.url, userAccessToken)
const res = await getMyUserInformation(server.url, userToken)
const info = res.body as User
expect(info.notificationSettings.newVideoFromSubscription).to.equal(
UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
......
......@@ -10,7 +10,6 @@ import {
checkNewVideoFromSubscription,
checkVideoIsPublished,
cleanupTests,
getLastNotification,
ImportsCommand,
MockSmtpServer,
prepareNotificationsTest,
......@@ -64,7 +63,7 @@ describe('Test user notifications', function () {
await uploadRandomVideoOnServers(servers, 1)
const notification = await getLastNotification(servers[0].url, userAccessToken)
const notification = await servers[0].notificationsCommand.getLastest({ token: userAccessToken })
expect(notification).to.be.undefined
expect(emails).to.have.lengthOf(0)
......@@ -245,7 +244,7 @@ describe('Test user notifications', function () {
await uploadRandomVideoOnServers(servers, 2, { waitTranscoding: false })
await waitJobs(servers)
const notification = await getLastNotification(servers[0].url, userAccessToken)
const notification = await servers[0].notificationsCommand.getLastest({ token: userAccessToken })
if (notification) {
expect(notification.type).to.not.equal(UserNotificationType.MY_VIDEO_PUBLISHED)
}
......
......@@ -146,13 +146,12 @@ describe('Test plugins', function () {
}
{
const body = await command.list({
const { data } = await command.list({
count: 2,
start: 0,
sort: 'name'
})
const data = body
expect(data[0].name).to.equal('background-red')
expect(data[1].name).to.equal('hello-world')
}
......
......@@ -109,6 +109,7 @@ describe('Test HLS videos', function () {
let videoAudioUUID = ''
function runTestSuite (hlsOnly: boolean) {
it('Should upload a video and transcode it to HLS', async function () {
this.timeout(120000)
......
......@@ -18,13 +18,13 @@ import {
uploadVideo,
userLogin
} from '@shared/extra-utils'
import { BooleanBothQuery, CustomConfig, User, VideosOverview } from '@shared/models'
import { BooleanBothQuery, CustomConfig, ResultList, User, Video, VideosOverview } from '@shared/models'
const expect = chai.expect
function createOverviewRes (overview: VideosOverview) {
const videos = overview.categories[0].videos
return { body: { data: videos, total: videos.length } }
return { data: videos, total: videos.length }
}
describe('Test video NSFW policy', function () {
......@@ -32,49 +32,47 @@ describe('Test video NSFW policy', function () {
let userAccessToken: string
let customConfig: CustomConfig
function getVideosFunctions (token?: string, query: { nsfw?: BooleanBothQuery } = {}) {
return getMyUserInformation(server.url, server.accessToken)
.then(res => {
const user: User = res.body
const videoChannelName = user.videoChannels[0].name
const accountName = user.account.name + '@' + user.account.host
const hasQuery = Object.keys(query).length !== 0
let promises: Promise<any>[]
if (token) {
promises = [
getVideosListWithToken(server.url, token, query),
server.searchCommand.advancedVideoSearch({ token, search: { search: 'n', ...query } }),
getAccountVideos(server.url, token, accountName, 0, 5, undefined, query),
getVideoChannelVideos(server.url, token, videoChannelName, 0, 5, undefined, query)
]
// Overviews do not support video filters
if (!hasQuery) {
const p = server.overviewsCommand.getVideos({ page: 1, token })
.then(res => createOverviewRes(res))
promises.push(p)
}
return Promise.all(promises)
}
promises = [
getVideosList(server.url),
server.searchCommand.searchVideos({ search: 'n' }),
getAccountVideos(server.url, undefined, accountName, 0, 5),
getVideoChannelVideos(server.url, undefined, videoChannelName, 0, 5)
]
// Overviews do not support video filters
if (!hasQuery) {
const p = server.overviewsCommand.getVideos({ page: 1 })
.then(res => createOverviewRes(res))
promises.push(p)
}
return Promise.all(promises)
})
async function getVideosFunctions (token?: string, query: { nsfw?: BooleanBothQuery } = {}) {
const res = await getMyUserInformation(server.url, server.accessToken)
const user: User = res.body
const videoChannelName = user.videoChannels[0].name
const accountName = user.account.name + '@' + user.account.host
const hasQuery = Object.keys(query).length !== 0
let promises: Promise<ResultList<Video>>[]
if (token) {
promises = [
getVideosListWithToken(server.url, token, query).then(res => res.body),
server.searchCommand.advancedVideoSearch({ token, search: { search: 'n', ...query } }),
getAccountVideos(server.url, token, accountName, 0, 5, undefined, query).then(res => res.body),
getVideoChannelVideos(server.url, token, videoChannelName, 0, 5, undefined, query).then(res => res.body)
]
// Overviews do not support video filters
if (!hasQuery) {
const p = server.overviewsCommand.getVideos({ page: 1, token })
.then(res => createOverviewRes(res))
promises.push(p)
}
return Promise.all(promises)
}
promises = [
getVideosList(server.url).then(res => res.body),
server.searchCommand.searchVideos({ search: 'n' }),
getAccountVideos(server.url, undefined, accountName, 0, 5).then(res => res.body),
getVideoChannelVideos(server.url, undefined, videoChannelName, 0, 5).then(res => res.body)
]
// Overviews do not support video filters
if (!hasQuery) {
const p = server.overviewsCommand.getVideos({ page: 1 })
.then(res => createOverviewRes(res))
promises.push(p)
}
return Promise.all(promises)
}