aboutsummaryrefslogblamecommitdiffhomepage
path: root/server/tests/api/notifications/comments-notifications.ts
blob: 62569f810806140c12aaddf36d9b1ee84ae7c9f6 (plain) (tree)
1
2
3
4
5
6
7
8
9



                                                                                              



                           
               

                           
             


                            
                                                 




                                                     
                       


                                                




                                                                                                                            




                                                 
                                   











                                                             
                        



                                                                                                         
                         



                                                                                                         

                                                                                                       
 
                             



                                                                                                  
                         
 
                                                                                            

                                           

                                                                                                                         
 
                             



                                                                                                
                         
 
                                                                                               
 
                                                                                            

                                           

                                                                                                       
 
                             

                                                                                       
                                                                                                    


                                                                                                      
                         
 
                                                                                            

                                           

                                                                                                       
 
                             



                                                                                                       
                         
 
                                                                                            



                                           
                                                                                       


                             

                                                                                      
 
                                  



                                                                                                    
                         
 
                                                                                            

                                           
                                                                                                                
 
                                                                                                                                  
 
                             



                                                                                                     
                         
 
                                                                                            



                                           


                                                                                                          



                             

                                                                                      
 

                                                                                          





                                                                                       

                                                                        
                         
 
                                                                                           

                                           
                                                                                         

                             

                                                   
                                                          
      









                                                 
                        

       

                                                                                  




                                                                                                             
                                                                                            

                                           
                                                                                                                       
 
                             








                                                                                                         
                                                                                                                                         
 
                             





                                                                                                     
                                                                                               



                                                                                                         
                                                                                                                       
 
                             

                                                                                                     
                                                                                                    








                                                                                                                      
                                                                                                                      










                                                                                                         
                                                                                                                              
 
                             

                                                                                                    
                                                                                                                                            
 
                             











                                                                                                         
                                                                                                                   


                             



                                                                                      


                                                                                                                    
                                                                                                             


                             
                                                                                                           





                                                                                                              






                                                                                                         
                                                                                                                        
 
                                                                                                                         





                                                          







                                  
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */

import 'mocha'
import * as chai from 'chai'
import {
  checkCommentMention,
  CheckerBaseParams,
  checkNewCommentOnMyVideo,
  cleanupTests,
  MockSmtpServer,
  prepareNotificationsTest,
  ServerInfo,
  uploadVideo,
  waitJobs
} from '@shared/extra-utils'
import { UserNotification } from '@shared/models'

const expect = chai.expect

describe('Test comments notifications', function () {
  let servers: ServerInfo[] = []
  let userToken: string
  let userNotifications: UserNotification[] = []
  let emails: object[] = []

  const commentText = '**hello** <a href="https://joinpeertube.org">world</a>, <h1>what do you think about peertube?</h1>'
  const expectedHtml = '<strong style="-ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;">hello</strong> ' +
  '<a href="https://joinpeertube.org" target="_blank" rel="noopener noreferrer" style="-ms-text-size-adjust: 100%; ' +
  '-webkit-text-size-adjust: 100%; text-decoration: none; color: #f2690d;">world</a>, </p>what do you think about peertube?'

  before(async function () {
    this.timeout(120000)

    const res = await prepareNotificationsTest(2)
    emails = res.emails
    userToken = res.userAccessToken
    servers = res.servers
    userNotifications = res.userNotifications
  })

  describe('Comment on my video notifications', function () {
    let baseParams: CheckerBaseParams

    before(() => {
      baseParams = {
        server: servers[0],
        emails,
        socketNotifications: userNotifications,
        token: userToken
      }
    })

    it('Should not send a new comment notification after a comment on another video', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const created = await servers[0].commentsCommand.createThread({ videoId: uuid, text: 'comment' })
      const commentId = created.id

      await waitJobs(servers)
      await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'absence')
    })

    it('Should not send a new comment notification if I comment my own video', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, userToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const created = await servers[0].commentsCommand.createThread({ token: userToken, videoId: uuid, text: 'comment' })
      const commentId = created.id

      await waitJobs(servers)
      await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'absence')
    })

    it('Should not send a new comment notification if the account is muted', async function () {
      this.timeout(20000)

      await servers[0].blocklistCommand.addToMyBlocklist({ token: userToken, account: 'root' })

      const resVideo = await uploadVideo(servers[0].url, userToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const created = await servers[0].commentsCommand.createThread({ videoId: uuid, text: 'comment' })
      const commentId = created.id

      await waitJobs(servers)
      await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'absence')

      await servers[0].blocklistCommand.removeFromMyBlocklist({ token: userToken, account: 'root' })
    })

    it('Should send a new comment notification after a local comment on my video', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, userToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const created = await servers[0].commentsCommand.createThread({ videoId: uuid, text: 'comment' })
      const commentId = created.id

      await waitJobs(servers)
      await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'presence')
    })

    it('Should send a new comment notification after a remote comment on my video', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, userToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      await waitJobs(servers)

      await servers[1].commentsCommand.createThread({ videoId: uuid, text: 'comment' })

      await waitJobs(servers)

      const { data } = await servers[0].commentsCommand.listThreads({ videoId: uuid })
      expect(data).to.have.lengthOf(1)

      const commentId = data[0].id
      await checkNewCommentOnMyVideo(baseParams, uuid, commentId, commentId, 'presence')
    })

    it('Should send a new comment notification after a local reply on my video', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, userToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const { id: threadId } = await servers[0].commentsCommand.createThread({ videoId: uuid, text: 'comment' })

      const { id: commentId } = await servers[0].commentsCommand.addReply({ videoId: uuid, toCommentId: threadId, text: 'reply' })

      await waitJobs(servers)
      await checkNewCommentOnMyVideo(baseParams, uuid, commentId, threadId, 'presence')
    })

    it('Should send a new comment notification after a remote reply on my video', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, userToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid
      await waitJobs(servers)

      {
        const created = await servers[1].commentsCommand.createThread({ videoId: uuid, text: 'comment' })
        const threadId = created.id
        await servers[1].commentsCommand.addReply({ videoId: uuid, toCommentId: threadId, text: 'reply' })
      }

      await waitJobs(servers)

      const { data } = await servers[0].commentsCommand.listThreads({ videoId: uuid })
      expect(data).to.have.lengthOf(1)

      const threadId = data[0].id
      const tree = await servers[0].commentsCommand.getThread({ videoId: uuid, threadId })

      expect(tree.children).to.have.lengthOf(1)
      const commentId = tree.children[0].comment.id

      await checkNewCommentOnMyVideo(baseParams, uuid, commentId, threadId, 'presence')
    })

    it('Should convert markdown in comment to html', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, userToken, { name: 'cool video' })
      const uuid = resVideo.body.video.uuid

      await servers[0].commentsCommand.createThread({ videoId: uuid, text: commentText })

      await waitJobs(servers)

      const latestEmail = emails[emails.length - 1]
      expect(latestEmail['html']).to.contain(expectedHtml)
    })
  })

  describe('Mention notifications', function () {
    let baseParams: CheckerBaseParams

    before(async () => {
      baseParams = {
        server: servers[0],
        emails,
        socketNotifications: userNotifications,
        token: userToken
      }

      await servers[0].usersCommand.updateMe({ displayName: 'super root name' })
      await servers[1].usersCommand.updateMe({ displayName: 'super root 2 name' })
    })

    it('Should not send a new mention comment notification if I mention the video owner', async function () {
      this.timeout(10000)

      const resVideo = await uploadVideo(servers[0].url, userToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const { id: commentId } = await servers[0].commentsCommand.createThread({ videoId: uuid, text: '@user_1 hello' })

      await waitJobs(servers)
      await checkCommentMention(baseParams, uuid, commentId, commentId, 'super root name', 'absence')
    })

    it('Should not send a new mention comment notification if I mention myself', async function () {
      this.timeout(10000)

      const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const { id: commentId } = await servers[0].commentsCommand.createThread({ token: userToken, videoId: uuid, text: '@user_1 hello' })

      await waitJobs(servers)
      await checkCommentMention(baseParams, uuid, commentId, commentId, 'super root name', 'absence')
    })

    it('Should not send a new mention notification if the account is muted', async function () {
      this.timeout(10000)

      await servers[0].blocklistCommand.addToMyBlocklist({ token: userToken, account: 'root' })

      const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const { id: commentId } = await servers[0].commentsCommand.createThread({ videoId: uuid, text: '@user_1 hello' })

      await waitJobs(servers)
      await checkCommentMention(baseParams, uuid, commentId, commentId, 'super root name', 'absence')

      await servers[0].blocklistCommand.removeFromMyBlocklist({ token: userToken, account: 'root' })
    })

    it('Should not send a new mention notification if the remote account mention a local account', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      await waitJobs(servers)
      const { id: threadId } = await servers[1].commentsCommand.createThread({ videoId: uuid, text: '@user_1 hello' })

      await waitJobs(servers)
      await checkCommentMention(baseParams, uuid, threadId, threadId, 'super root 2 name', 'absence')
    })

    it('Should send a new mention notification after local comments', async function () {
      this.timeout(10000)

      const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const { id: threadId } = await servers[0].commentsCommand.createThread({ videoId: uuid, text: '@user_1 hellotext:  1' })

      await waitJobs(servers)
      await checkCommentMention(baseParams, uuid, threadId, threadId, 'super root name', 'presence')

      const { id: commentId } = await servers[0].commentsCommand.addReply({ videoId: uuid, toCommentId: threadId, text: 'hello 2 @user_1' })

      await waitJobs(servers)
      await checkCommentMention(baseParams, uuid, commentId, threadId, 'super root name', 'presence')
    })

    it('Should send a new mention notification after remote comments', async function () {
      this.timeout(20000)

      const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      await waitJobs(servers)

      const text1 = `hello @user_1@localhost:${servers[0].port} 1`
      const { id: server2ThreadId } = await servers[1].commentsCommand.createThread({ videoId: uuid, text: text1 })

      await waitJobs(servers)

      const { data } = await servers[0].commentsCommand.listThreads({ videoId: uuid })
      expect(data).to.have.lengthOf(1)

      const server1ThreadId = data[0].id
      await checkCommentMention(baseParams, uuid, server1ThreadId, server1ThreadId, 'super root 2 name', 'presence')

      const text2 = `@user_1@localhost:${servers[0].port} hello 2 @root@localhost:${servers[0].port}`
      await servers[1].commentsCommand.addReply({ videoId: uuid, toCommentId: server2ThreadId, text: text2 })

      await waitJobs(servers)

      const tree = await servers[0].commentsCommand.getThread({ videoId: uuid, threadId: server1ThreadId })

      expect(tree.children).to.have.lengthOf(1)
      const commentId = tree.children[0].comment.id

      await checkCommentMention(baseParams, uuid, commentId, server1ThreadId, 'super root 2 name', 'presence')
    })

    it('Should convert markdown in comment to html', async function () {
      this.timeout(10000)

      const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
      const uuid = resVideo.body.video.uuid

      const { id: threadId } = await servers[0].commentsCommand.createThread({ videoId: uuid, text: '@user_1 hello 1' })

      await servers[0].commentsCommand.addReply({ videoId: uuid, toCommentId: threadId, text: '@user_1 ' + commentText })

      await waitJobs(servers)

      const latestEmail = emails[emails.length - 1]
      expect(latestEmail['html']).to.contain(expectedHtml)
    })
  })

  after(async function () {
    MockSmtpServer.Instance.kill()

    await cleanupTests(servers)
  })
})