-/* tslint:disable:no-unused-expression */
+/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
-import * as chai from 'chai'
-import 'mocha'
+import { expect } from 'chai'
+import { wait } from '@shared/core-utils'
+import { VideoPrivacy } from '@shared/models'
import {
- advancedVideosSearch,
cleanupTests,
- flushAndRunServer,
- immutableAssign,
- searchVideo,
- ServerInfo,
+ createSingleServer,
+ doubleFollow,
+ PeerTubeServer,
+ SearchCommand,
setAccessTokensToServers,
- uploadVideo,
- wait
-} from '../../../../shared/extra-utils'
-
-const expect = chai.expect
+ setDefaultAccountAvatar,
+ setDefaultChannelAvatar,
+ setDefaultVideoChannel,
+ stopFfmpeg
+} from '@shared/server-commands'
describe('Test videos search', function () {
- let server: ServerInfo = null
+ let server: PeerTubeServer
+ let remoteServer: PeerTubeServer
let startDate: string
+ let videoUUID: string
+ let videoShortUUID: string
+
+ let command: SearchCommand
before(async function () {
- this.timeout(30000)
+ this.timeout(240000)
- server = await flushAndRunServer(1)
+ const servers = await Promise.all([
+ createSingleServer(1),
+ createSingleServer(2)
+ ])
+ server = servers[0]
+ remoteServer = servers[1]
- await setAccessTokensToServers([ server ])
+ await setAccessTokensToServers([ server, remoteServer ])
+ await setDefaultVideoChannel([ server, remoteServer ])
+ await setDefaultChannelAvatar(server)
+ await setDefaultAccountAvatar(servers)
{
const attributes1 = {
nsfw: false,
language: 'fr'
}
- await uploadVideo(server.url, server.accessToken, attributes1)
-
- const attributes2 = immutableAssign(attributes1, { name: attributes1.name + ' - 2', fixture: 'video_short.mp4' })
- await uploadVideo(server.url, server.accessToken, attributes2)
-
- const attributes3 = immutableAssign(attributes1, { name: attributes1.name + ' - 3', language: 'en' })
- await uploadVideo(server.url, server.accessToken, attributes3)
+ await server.videos.upload({ attributes: attributes1 })
+
+ const attributes2 = { ...attributes1, name: attributes1.name + ' - 2', fixture: 'video_short.mp4' }
+ await server.videos.upload({ attributes: attributes2 })
+
+ {
+ const attributes3 = { ...attributes1, name: attributes1.name + ' - 3', language: undefined }
+ const { id, uuid, shortUUID } = await server.videos.upload({ attributes: attributes3 })
+ videoUUID = uuid
+ videoShortUUID = shortUUID
+
+ await server.captions.add({
+ language: 'en',
+ videoId: id,
+ fixture: 'subtitle-good2.vtt',
+ mimeType: 'application/octet-stream'
+ })
+
+ await server.captions.add({
+ language: 'aa',
+ videoId: id,
+ fixture: 'subtitle-good2.vtt',
+ mimeType: 'application/octet-stream'
+ })
+ }
- const attributes4 = immutableAssign(attributes1, { name: attributes1.name + ' - 4', language: 'pl', nsfw: true })
- await uploadVideo(server.url, server.accessToken, attributes4)
+ const attributes4 = { ...attributes1, name: attributes1.name + ' - 4', language: 'pl', nsfw: true }
+ await server.videos.upload({ attributes: attributes4 })
await wait(1000)
startDate = new Date().toISOString()
- const attributes5 = immutableAssign(attributes1, { name: attributes1.name + ' - 5', licence: 2 })
- await uploadVideo(server.url, server.accessToken, attributes5)
+ const attributes5 = { ...attributes1, name: attributes1.name + ' - 5', licence: 2, language: undefined }
+ await server.videos.upload({ attributes: attributes5 })
- const attributes6 = immutableAssign(attributes1, { name: attributes1.name + ' - 6', tags: [ 't1', 't2 '] })
- await uploadVideo(server.url, server.accessToken, attributes6)
+ const attributes6 = { ...attributes1, name: attributes1.name + ' - 6', tags: [ 't1', 't2' ] }
+ await server.videos.upload({ attributes: attributes6 })
- const attributes7 = immutableAssign(attributes1, {
- name: attributes1.name + ' - 7',
- originallyPublishedAt: '2019-02-12T09:58:08.286Z'
- })
- await uploadVideo(server.url, server.accessToken, attributes7)
+ const attributes7 = { ...attributes1, name: attributes1.name + ' - 7', originallyPublishedAt: '2019-02-12T09:58:08.286Z' }
+ await server.videos.upload({ attributes: attributes7 })
- const attributes8 = immutableAssign(attributes1, { name: attributes1.name + ' - 8', licence: 4 })
- await uploadVideo(server.url, server.accessToken, attributes8)
+ const attributes8 = { ...attributes1, name: attributes1.name + ' - 8', licence: 4 }
+ await server.videos.upload({ attributes: attributes8 })
}
{
licence: 2,
language: 'en'
}
- await uploadVideo(server.url, server.accessToken, attributes)
+ await server.videos.upload({ attributes })
- await uploadVideo(server.url, server.accessToken, immutableAssign(attributes, { name: attributes.name + ' duplicate' }))
+ await server.videos.upload({ attributes: { ...attributes, name: attributes.name + ' duplicate' } })
}
{
licence: 3,
language: 'pl'
}
- await uploadVideo(server.url, server.accessToken, attributes)
+ await server.videos.upload({ attributes })
}
{
tags: [ 'aaaa', 'bbbb', 'cccc' ],
category: 1
}
- await uploadVideo(server.url, server.accessToken, attributes1)
- await uploadVideo(server.url, server.accessToken, immutableAssign(attributes1, { category: 2 }))
+ await server.videos.upload({ attributes: attributes1 })
+ await server.videos.upload({ attributes: { ...attributes1, category: 2 } })
- await uploadVideo(server.url, server.accessToken, immutableAssign(attributes1, { tags: [ 'cccc', 'dddd' ] }))
- await uploadVideo(server.url, server.accessToken, immutableAssign(attributes1, { tags: [ 'eeee', 'ffff' ] }))
+ await server.videos.upload({ attributes: { ...attributes1, tags: [ 'cccc', 'dddd' ] } })
+ await server.videos.upload({ attributes: { ...attributes1, tags: [ 'eeee', 'ffff' ] } })
}
{
name: 'aaaa 2',
category: 1
}
- await uploadVideo(server.url, server.accessToken, attributes1)
- await uploadVideo(server.url, server.accessToken, immutableAssign(attributes1, { category: 2 }))
+ await server.videos.upload({ attributes: attributes1 })
+ await server.videos.upload({ attributes: { ...attributes1, category: 2 } })
}
+
+ {
+ await remoteServer.videos.upload({ attributes: { name: 'remote video 1' } })
+ await remoteServer.videos.upload({ attributes: { name: 'remote video 2' } })
+ }
+
+ await doubleFollow(server, remoteServer)
+
+ command = server.search
})
it('Should make a simple search and not have results', async function () {
- const res = await searchVideo(server.url, 'abc')
+ const body = await command.searchVideos({ search: 'abc' })
- 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)
})
it('Should make a simple search and have results', async function () {
- const res = await searchVideo(server.url, '4444 5555 duplicate')
+ const body = await command.searchVideos({ search: '4444 5555 duplicate' })
- expect(res.body.total).to.equal(2)
+ expect(body.total).to.equal(2)
- const videos = res.body.data
+ const videos = body.data
expect(videos).to.have.lengthOf(2)
// bestmatch
})
it('Should make a search on tags too, and have results', async function () {
- const query = {
+ const search = {
search: 'aaaa',
categoryOneOf: [ 1 ]
}
- const res = await advancedVideosSearch(server.url, query)
+ const body = await command.advancedVideoSearch({ search })
- expect(res.body.total).to.equal(2)
+ expect(body.total).to.equal(2)
- const videos = res.body.data
+ const videos = body.data
expect(videos).to.have.lengthOf(2)
// bestmatch
})
it('Should filter on tags without a search', async function () {
- const query = {
+ const search = {
tagsAllOf: [ 'bbbb' ]
}
- const res = await advancedVideosSearch(server.url, query)
+ const body = await command.advancedVideoSearch({ search })
- expect(res.body.total).to.equal(2)
+ expect(body.total).to.equal(2)
- const videos = res.body.data
+ const videos = body.data
expect(videos).to.have.lengthOf(2)
expect(videos[0].name).to.equal('9999')
})
it('Should filter on category without a search', async function () {
- const query = {
+ const search = {
categoryOneOf: [ 3 ]
}
- const res = await advancedVideosSearch(server.url, query)
+ const body = await command.advancedVideoSearch({ search })
- expect(res.body.total).to.equal(1)
+ expect(body.total).to.equal(1)
- const videos = res.body.data
+ const videos = body.data
expect(videos).to.have.lengthOf(1)
expect(videos[0].name).to.equal('6666 7777 8888')
const query = {
search: '9999',
categoryOneOf: [ 1 ],
- tagsOneOf: [ 'aaaa', 'ffff' ]
+ tagsOneOf: [ 'aAaa', 'ffff' ]
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(2)
}
- const res1 = await advancedVideosSearch(server.url, query)
- expect(res1.body.total).to.equal(2)
- const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsOneOf: [ 'blabla' ] }))
- expect(res2.body.total).to.equal(0)
+ {
+ const body = await command.advancedVideoSearch({ search: { ...query, tagsOneOf: [ 'blabla' ] } })
+ expect(body.total).to.equal(0)
+ }
})
it('Should search by tags (all of)', async function () {
const query = {
search: '9999',
categoryOneOf: [ 1 ],
- tagsAllOf: [ 'cccc' ]
+ tagsAllOf: [ 'CCcc' ]
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(2)
}
- const res1 = await advancedVideosSearch(server.url, query)
- expect(res1.body.total).to.equal(2)
- const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'blabla' ] }))
- expect(res2.body.total).to.equal(0)
+ {
+ const body = await command.advancedVideoSearch({ search: { ...query, tagsAllOf: [ 'blAbla' ] } })
+ expect(body.total).to.equal(0)
+ }
- const res3 = await advancedVideosSearch(server.url, immutableAssign(query, { tagsAllOf: [ 'bbbb', 'cccc' ] }))
- expect(res3.body.total).to.equal(1)
+ {
+ const body = await command.advancedVideoSearch({ search: { ...query, tagsAllOf: [ 'bbbb', 'CCCC' ] } })
+ expect(body.total).to.equal(1)
+ }
})
it('Should search by category', async function () {
search: '6666',
categoryOneOf: [ 3 ]
}
- const res1 = await advancedVideosSearch(server.url, query)
- expect(res1.body.total).to.equal(1)
- expect(res1.body.data[0].name).to.equal('6666 7777 8888')
- const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { categoryOneOf: [ 2 ] }))
- expect(res2.body.total).to.equal(0)
+ {
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(1)
+ expect(body.data[0].name).to.equal('6666 7777 8888')
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: { ...query, categoryOneOf: [ 2 ] } })
+ expect(body.total).to.equal(0)
+ }
})
it('Should search by licence', async function () {
search: '4444 5555',
licenceOneOf: [ 2 ]
}
- const res1 = await advancedVideosSearch(server.url, query)
- expect(res1.body.total).to.equal(2)
- expect(res1.body.data[0].name).to.equal('3333 4444 5555')
- expect(res1.body.data[1].name).to.equal('3333 4444 5555 duplicate')
- const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { licenceOneOf: [ 3 ] }))
- expect(res2.body.total).to.equal(0)
+ {
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(2)
+ expect(body.data[0].name).to.equal('3333 4444 5555')
+ expect(body.data[1].name).to.equal('3333 4444 5555 duplicate')
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: { ...query, licenceOneOf: [ 3 ] } })
+ expect(body.total).to.equal(0)
+ }
})
it('Should search by languages', async function () {
search: '1111 2222 3333',
languageOneOf: [ 'pl', 'en' ]
}
- const res1 = await advancedVideosSearch(server.url, query)
- expect(res1.body.total).to.equal(2)
- expect(res1.body.data[0].name).to.equal('1111 2222 3333 - 3')
- expect(res1.body.data[1].name).to.equal('1111 2222 3333 - 4')
- const res2 = await advancedVideosSearch(server.url, immutableAssign(query, { languageOneOf: [ 'eo' ] }))
- expect(res2.body.total).to.equal(0)
+ {
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(2)
+ expect(body.data[0].name).to.equal('1111 2222 3333 - 3')
+ expect(body.data[1].name).to.equal('1111 2222 3333 - 4')
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: { ...query, languageOneOf: [ 'pl', 'en', '_unknown' ] } })
+ expect(body.total).to.equal(3)
+ expect(body.data[0].name).to.equal('1111 2222 3333 - 3')
+ expect(body.data[1].name).to.equal('1111 2222 3333 - 4')
+ expect(body.data[2].name).to.equal('1111 2222 3333 - 5')
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: { ...query, languageOneOf: [ 'eo' ] } })
+ expect(body.total).to.equal(0)
+ }
})
it('Should search by start date', async function () {
startDate
}
- const res = await advancedVideosSearch(server.url, query)
- expect(res.body.total).to.equal(4)
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(4)
- const videos = res.body.data
+ const videos = body.data
expect(videos[0].name).to.equal('1111 2222 3333 - 5')
expect(videos[1].name).to.equal('1111 2222 3333 - 6')
expect(videos[2].name).to.equal('1111 2222 3333 - 7')
licenceOneOf: [ 1, 4 ]
}
- const res = await advancedVideosSearch(server.url, query)
- expect(res.body.total).to.equal(4)
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(4)
- const videos = res.body.data
+ const videos = body.data
expect(videos[0].name).to.equal('1111 2222 3333')
expect(videos[1].name).to.equal('1111 2222 3333 - 6')
expect(videos[2].name).to.equal('1111 2222 3333 - 7')
sort: '-name'
}
- const res = await advancedVideosSearch(server.url, query)
- expect(res.body.total).to.equal(4)
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(4)
- const videos = res.body.data
+ const videos = body.data
expect(videos[0].name).to.equal('1111 2222 3333 - 8')
expect(videos[1].name).to.equal('1111 2222 3333 - 7')
expect(videos[2].name).to.equal('1111 2222 3333 - 6')
count: 1
}
- const res = await advancedVideosSearch(server.url, query)
- expect(res.body.total).to.equal(4)
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(4)
- const videos = res.body.data
+ const videos = body.data
expect(videos[0].name).to.equal('1111 2222 3333 - 8')
})
count: 1
}
- const res = await advancedVideosSearch(server.url, query)
- expect(res.body.total).to.equal(4)
+ const body = await command.advancedVideoSearch({ search: query })
+ expect(body.total).to.equal(4)
- const videos = res.body.data
+ const videos = body.data
expect(videos[0].name).to.equal('1111 2222 3333')
})
}
{
- const query = immutableAssign(baseQuery, { originallyPublishedStartDate: '2019-02-11T09:58:08.286Z' })
- const res = await advancedVideosSearch(server.url, query)
+ const query = { ...baseQuery, originallyPublishedStartDate: '2019-02-11T09:58:08.286Z' }
+ const body = await command.advancedVideoSearch({ search: query })
- expect(res.body.total).to.equal(1)
- expect(res.body.data[0].name).to.equal('1111 2222 3333 - 7')
+ expect(body.total).to.equal(1)
+ expect(body.data[0].name).to.equal('1111 2222 3333 - 7')
}
{
- const query = immutableAssign(baseQuery, { originallyPublishedEndDate: '2019-03-11T09:58:08.286Z' })
- const res = await advancedVideosSearch(server.url, query)
+ const query = { ...baseQuery, originallyPublishedEndDate: '2019-03-11T09:58:08.286Z' }
+ const body = await command.advancedVideoSearch({ search: query })
- expect(res.body.total).to.equal(1)
- expect(res.body.data[0].name).to.equal('1111 2222 3333 - 7')
+ expect(body.total).to.equal(1)
+ expect(body.data[0].name).to.equal('1111 2222 3333 - 7')
}
{
- const query = immutableAssign(baseQuery, { originallyPublishedEndDate: '2019-01-11T09:58:08.286Z' })
- const res = await advancedVideosSearch(server.url, query)
+ const query = { ...baseQuery, originallyPublishedEndDate: '2019-01-11T09:58:08.286Z' }
+ const body = await command.advancedVideoSearch({ search: query })
- expect(res.body.total).to.equal(0)
+ expect(body.total).to.equal(0)
}
{
- const query = immutableAssign(baseQuery, { originallyPublishedStartDate: '2019-03-11T09:58:08.286Z' })
- const res = await advancedVideosSearch(server.url, query)
+ const query = { ...baseQuery, originallyPublishedStartDate: '2019-03-11T09:58:08.286Z' }
+ const body = await command.advancedVideoSearch({ search: query })
- expect(res.body.total).to.equal(0)
+ expect(body.total).to.equal(0)
}
{
- const query = immutableAssign(baseQuery, {
+ const query = {
+ ...baseQuery,
originallyPublishedStartDate: '2019-01-11T09:58:08.286Z',
originallyPublishedEndDate: '2019-01-10T09:58:08.286Z'
- })
- const res = await advancedVideosSearch(server.url, query)
+ }
+ const body = await command.advancedVideoSearch({ search: query })
- expect(res.body.total).to.equal(0)
+ expect(body.total).to.equal(0)
}
{
- const query = immutableAssign(baseQuery, {
+ const query = {
+ ...baseQuery,
originallyPublishedStartDate: '2019-01-11T09:58:08.286Z',
originallyPublishedEndDate: '2019-04-11T09:58:08.286Z'
- })
- const res = await advancedVideosSearch(server.url, query)
+ }
+ const body = await command.advancedVideoSearch({ search: query })
+
+ expect(body.total).to.equal(1)
+ expect(body.data[0].name).to.equal('1111 2222 3333 - 7')
+ }
+ })
+
+ it('Should search by UUID', async function () {
+ const search = videoUUID
+ const body = await command.advancedVideoSearch({ search: { search } })
+
+ expect(body.total).to.equal(1)
+ expect(body.data[0].name).to.equal('1111 2222 3333 - 3')
+ })
+
+ it('Should filter by UUIDs', async function () {
+ for (const uuid of [ videoUUID, videoShortUUID ]) {
+ const body = await command.advancedVideoSearch({ search: { uuids: [ uuid ] } })
+
+ expect(body.total).to.equal(1)
+ expect(body.data[0].name).to.equal('1111 2222 3333 - 3')
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: { uuids: [ 'dfd70b83-639f-4980-94af-304a56ab4b35' ] } })
+
+ expect(body.total).to.equal(0)
+ expect(body.data).to.have.lengthOf(0)
+ }
+ })
+
+ it('Should search by host', async function () {
+ {
+ const body = await command.advancedVideoSearch({ search: { search: '6666 7777 8888', host: server.host } })
+ expect(body.total).to.equal(1)
+ expect(body.data[0].name).to.equal('6666 7777 8888')
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: { search: '1111', host: 'example.com' } })
+ expect(body.total).to.equal(0)
+ expect(body.data).to.have.lengthOf(0)
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: { search: 'remote', host: remoteServer.host } })
+ expect(body.total).to.equal(2)
+ expect(body.data).to.have.lengthOf(2)
+ expect(body.data[0].name).to.equal('remote video 1')
+ expect(body.data[1].name).to.equal('remote video 2')
+ }
+ })
+
+ it('Should search by live', async function () {
+ this.timeout(60000)
+
+ {
+ const newConfig = {
+ search: {
+ searchIndex: { enabled: false }
+ },
+ live: { enabled: true }
+ }
+ await server.config.updateCustomSubConfig({ newConfig })
+ }
+
+ {
+ const body = await command.advancedVideoSearch({ search: { isLive: true } })
+
+ expect(body.total).to.equal(0)
+ expect(body.data).to.have.lengthOf(0)
+ }
+
+ {
+ const liveCommand = server.live
+
+ const liveAttributes = { name: 'live', privacy: VideoPrivacy.PUBLIC, channelId: server.store.channel.id }
+ const live = await liveCommand.create({ fields: liveAttributes })
+
+ const ffmpegCommand = await liveCommand.sendRTMPStreamInVideo({ videoId: live.id })
+ await liveCommand.waitUntilPublished({ videoId: live.id })
+
+ const body = await command.advancedVideoSearch({ search: { isLive: true } })
+
+ expect(body.total).to.equal(1)
+ expect(body.data[0].name).to.equal('live')
- expect(res.body.total).to.equal(1)
- expect(res.body.data[0].name).to.equal('1111 2222 3333 - 7')
+ await stopFfmpeg(ffmpegCommand)
}
})