PeerTube/server/tests/api/search/search-videos.ts

569 lines
16 KiB
TypeScript
Raw Normal View History

2020-01-31 09:56:52 -06:00
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
2018-07-20 07:35:18 -05:00
2022-08-17 08:44:32 -05:00
import { expect } from 'chai'
import { wait } from '@shared/core-utils'
import { VideoPrivacy } from '@shared/models'
2018-07-20 07:35:18 -05:00
import {
cleanupTests,
2021-07-16 02:47:51 -05:00
createSingleServer,
doubleFollow,
2021-07-16 02:47:51 -05:00
PeerTubeServer,
2021-07-16 07:27:30 -05:00
SearchCommand,
2018-07-20 07:35:18 -05:00
setAccessTokensToServers,
setDefaultAccountAvatar,
setDefaultChannelAvatar,
setDefaultVideoChannel,
stopFfmpeg
} from '@shared/server-commands'
2018-07-20 07:35:18 -05:00
2019-04-25 02:46:02 -05:00
describe('Test videos search', function () {
let server: PeerTubeServer
let remoteServer: PeerTubeServer
2018-07-20 07:35:18 -05:00
let startDate: string
2019-12-09 08:32:53 -06:00
let videoUUID: string
let videoShortUUID: string
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
let command: SearchCommand
2018-07-20 07:35:18 -05:00
before(async function () {
2023-05-17 09:42:57 -05:00
this.timeout(360000)
2018-07-20 07:35:18 -05:00
const servers = await Promise.all([
createSingleServer(1),
createSingleServer(2)
])
server = servers[0]
remoteServer = servers[1]
2018-07-20 07:35:18 -05:00
await setAccessTokensToServers([ server, remoteServer ])
await setDefaultVideoChannel([ server, remoteServer ])
await setDefaultChannelAvatar(server)
await setDefaultAccountAvatar(servers)
2018-07-20 07:35:18 -05:00
{
const attributes1 = {
name: '1111 2222 3333',
fixture: '60fps_720p_small.mp4', // 2 seconds
category: 1,
licence: 1,
nsfw: false,
language: 'fr'
}
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes1 })
2018-07-20 07:35:18 -05:00
2021-07-13 02:43:59 -05:00
const attributes2 = { ...attributes1, name: attributes1.name + ' - 2', fixture: 'video_short.mp4' }
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes2 })
2018-07-20 07:35:18 -05:00
{
2021-07-13 02:43:59 -05:00
const attributes3 = { ...attributes1, name: attributes1.name + ' - 3', language: undefined }
const { id, uuid, shortUUID } = await server.videos.upload({ attributes: attributes3 })
2021-07-15 03:02:54 -05:00
videoUUID = uuid
videoShortUUID = shortUUID
2021-07-21 06:58:35 -05:00
await server.captions.add({
language: 'en',
2021-07-15 03:02:54 -05:00
videoId: id,
fixture: 'subtitle-good2.vtt',
mimeType: 'application/octet-stream'
})
2021-07-21 06:58:35 -05:00
await server.captions.add({
language: 'aa',
2021-07-15 03:02:54 -05:00
videoId: id,
fixture: 'subtitle-good2.vtt',
mimeType: 'application/octet-stream'
})
}
2018-07-20 07:35:18 -05:00
2021-07-13 02:43:59 -05:00
const attributes4 = { ...attributes1, name: attributes1.name + ' - 4', language: 'pl', nsfw: true }
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes4 })
2018-07-20 07:35:18 -05:00
await wait(1000)
startDate = new Date().toISOString()
2021-07-13 02:43:59 -05:00
const attributes5 = { ...attributes1, name: attributes1.name + ' - 5', licence: 2, language: undefined }
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes5 })
2018-07-20 07:35:18 -05:00
2021-07-13 02:43:59 -05:00
const attributes6 = { ...attributes1, name: attributes1.name + ' - 6', tags: [ 't1', 't2' ] }
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes6 })
2018-07-20 07:35:18 -05:00
2021-07-13 02:43:59 -05:00
const attributes7 = { ...attributes1, name: attributes1.name + ' - 7', originallyPublishedAt: '2019-02-12T09:58:08.286Z' }
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes7 })
2018-07-20 07:35:18 -05:00
2021-07-13 02:43:59 -05:00
const attributes8 = { ...attributes1, name: attributes1.name + ' - 8', licence: 4 }
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes8 })
2018-07-20 07:35:18 -05:00
}
{
const attributes = {
name: '3333 4444 5555',
fixture: 'video_short.mp4',
category: 2,
licence: 2,
language: 'en'
}
2022-07-13 04:58:01 -05:00
await server.videos.upload({ attributes })
2018-07-20 07:35:18 -05:00
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: { ...attributes, name: attributes.name + ' duplicate' } })
2018-07-20 07:35:18 -05:00
}
{
const attributes = {
name: '6666 7777 8888',
fixture: 'video_short.mp4',
category: 3,
licence: 3,
language: 'pl'
}
2022-07-13 04:58:01 -05:00
await server.videos.upload({ attributes })
2018-07-20 07:35:18 -05:00
}
{
const attributes1 = {
name: '9999',
tags: [ 'aaaa', 'bbbb', 'cccc' ],
category: 1
}
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes1 })
await server.videos.upload({ attributes: { ...attributes1, category: 2 } })
2018-07-20 07:35:18 -05:00
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: { ...attributes1, tags: [ 'cccc', 'dddd' ] } })
await server.videos.upload({ attributes: { ...attributes1, tags: [ 'eeee', 'ffff' ] } })
2018-07-20 07:35:18 -05:00
}
{
const attributes1 = {
name: 'aaaa 2',
category: 1
}
2021-07-16 02:04:35 -05:00
await server.videos.upload({ attributes: attributes1 })
await server.videos.upload({ attributes: { ...attributes1, category: 2 } })
}
2021-07-06 08:22:51 -05:00
{
await remoteServer.videos.upload({ attributes: { name: 'remote video 1' } })
await remoteServer.videos.upload({ attributes: { name: 'remote video 2' } })
}
await doubleFollow(server, remoteServer)
2021-07-16 02:04:35 -05:00
command = server.search
2018-07-20 07:35:18 -05:00
})
it('Should make a simple search and not have results', async function () {
2021-07-06 08:22:51 -05:00
const body = await command.searchVideos({ search: 'abc' })
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(0)
expect(body.data).to.have.lengthOf(0)
2018-07-20 07:35:18 -05:00
})
it('Should make a simple search and have results', async function () {
2021-07-06 08:22:51 -05:00
const body = await command.searchVideos({ search: '4444 5555 duplicate' })
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(2)
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
const videos = body.data
2018-07-20 07:35:18 -05:00
expect(videos).to.have.lengthOf(2)
// bestmatch
expect(videos[0].name).to.equal('3333 4444 5555 duplicate')
expect(videos[1].name).to.equal('3333 4444 5555')
})
it('Should make a search on tags too, and have results', async function () {
2021-07-06 08:22:51 -05:00
const search = {
search: 'aaaa',
categoryOneOf: [ 1 ]
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(2)
2021-07-06 08:22:51 -05:00
const videos = body.data
expect(videos).to.have.lengthOf(2)
// bestmatch
expect(videos[0].name).to.equal('aaaa 2')
expect(videos[1].name).to.equal('9999')
})
it('Should filter on tags without a search', async function () {
2021-07-06 08:22:51 -05:00
const search = {
tagsAllOf: [ 'bbbb' ]
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(2)
2021-07-06 08:22:51 -05:00
const videos = body.data
expect(videos).to.have.lengthOf(2)
expect(videos[0].name).to.equal('9999')
expect(videos[1].name).to.equal('9999')
})
it('Should filter on category without a search', async function () {
2021-07-06 08:22:51 -05:00
const search = {
categoryOneOf: [ 3 ]
}
2022-07-13 04:58:01 -05:00
const body = await command.advancedVideoSearch({ search })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(1)
2021-07-06 08:22:51 -05:00
const videos = body.data
expect(videos).to.have.lengthOf(1)
expect(videos[0].name).to.equal('6666 7777 8888')
})
2018-07-20 07:35:18 -05:00
it('Should search by tags (one of)', async function () {
const query = {
search: '9999',
categoryOneOf: [ 1 ],
2019-08-29 09:47:32 -05:00
tagsOneOf: [ 'aAaa', 'ffff' ]
2018-07-20 07:35:18 -05:00
}
2021-07-06 08:22:51 -05:00
{
const body = await command.advancedVideoSearch({ search: query })
expect(body.total).to.equal(2)
}
{
const body = await command.advancedVideoSearch({ search: { ...query, tagsOneOf: [ 'blabla' ] } })
expect(body.total).to.equal(0)
}
2018-07-20 07:35:18 -05:00
})
it('Should search by tags (all of)', async function () {
const query = {
search: '9999',
categoryOneOf: [ 1 ],
2019-08-29 09:47:32 -05:00
tagsAllOf: [ 'CCcc' ]
2018-07-20 07:35:18 -05:00
}
2021-07-06 08:22:51 -05:00
{
const body = await command.advancedVideoSearch({ search: query })
expect(body.total).to.equal(2)
}
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
{
const body = await command.advancedVideoSearch({ search: { ...query, tagsAllOf: [ 'blAbla' ] } })
expect(body.total).to.equal(0)
}
{
const body = await command.advancedVideoSearch({ search: { ...query, tagsAllOf: [ 'bbbb', 'CCCC' ] } })
expect(body.total).to.equal(1)
}
2018-07-20 07:35:18 -05:00
})
it('Should search by category', async function () {
const query = {
search: '6666',
categoryOneOf: [ 3 ]
}
2021-07-06 08:22:51 -05:00
{
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)
}
2018-07-20 07:35:18 -05:00
})
it('Should search by licence', async function () {
const query = {
search: '4444 5555',
licenceOneOf: [ 2 ]
}
2021-07-06 08:22:51 -05:00
{
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)
}
2018-07-20 07:35:18 -05:00
})
it('Should search by languages', async function () {
const query = {
search: '1111 2222 3333',
languageOneOf: [ 'pl', 'en' ]
}
{
2021-07-06 08:22:51 -05:00
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')
}
{
2021-07-06 08:22:51 -05:00
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')
}
{
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: { ...query, languageOneOf: [ 'eo' ] } })
expect(body.total).to.equal(0)
}
2018-07-20 07:35:18 -05:00
})
it('Should search by start date', async function () {
const query = {
search: '1111 2222 3333',
startDate
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
expect(body.total).to.equal(4)
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
const videos = body.data
2018-07-20 07:35:18 -05:00
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')
expect(videos[3].name).to.equal('1111 2222 3333 - 8')
})
it('Should make an advanced search', async function () {
const query = {
search: '1111 2222 3333',
languageOneOf: [ 'pl', 'fr' ],
durationMax: 4,
2018-07-20 11:31:49 -05:00
nsfw: 'false' as 'false',
2018-07-20 07:35:18 -05:00
licenceOneOf: [ 1, 4 ]
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
expect(body.total).to.equal(4)
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
const videos = body.data
2018-07-20 07:35:18 -05:00
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')
expect(videos[3].name).to.equal('1111 2222 3333 - 8')
})
it('Should make an advanced search and sort results', async function () {
const query = {
search: '1111 2222 3333',
languageOneOf: [ 'pl', 'fr' ],
durationMax: 4,
2018-07-20 11:31:49 -05:00
nsfw: 'false' as 'false',
2018-07-20 07:35:18 -05:00
licenceOneOf: [ 1, 4 ],
sort: '-name'
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
expect(body.total).to.equal(4)
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
const videos = body.data
2018-07-20 07:35:18 -05:00
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')
expect(videos[3].name).to.equal('1111 2222 3333')
})
it('Should make an advanced search and only show the first result', async function () {
const query = {
search: '1111 2222 3333',
languageOneOf: [ 'pl', 'fr' ],
durationMax: 4,
2018-07-20 11:31:49 -05:00
nsfw: 'false' as 'false',
2018-07-20 07:35:18 -05:00
licenceOneOf: [ 1, 4 ],
sort: '-name',
start: 0,
count: 1
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
expect(body.total).to.equal(4)
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
const videos = body.data
2018-07-20 07:35:18 -05:00
expect(videos[0].name).to.equal('1111 2222 3333 - 8')
})
it('Should make an advanced search and only show the last result', async function () {
const query = {
search: '1111 2222 3333',
languageOneOf: [ 'pl', 'fr' ],
durationMax: 4,
2018-07-20 11:31:49 -05:00
nsfw: 'false' as 'false',
2018-07-20 07:35:18 -05:00
licenceOneOf: [ 1, 4 ],
sort: '-name',
start: 3,
count: 1
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
expect(body.total).to.equal(4)
2018-07-20 07:35:18 -05:00
2021-07-06 08:22:51 -05:00
const videos = body.data
2018-07-20 07:35:18 -05:00
expect(videos[0].name).to.equal('1111 2222 3333')
})
it('Should search on originally published date', async function () {
const baseQuery = {
search: '1111 2222 3333',
languageOneOf: [ 'pl', 'fr' ],
durationMax: 4,
nsfw: 'false' as 'false',
licenceOneOf: [ 1, 4 ]
}
{
2021-07-13 02:43:59 -05:00
const query = { ...baseQuery, originallyPublishedStartDate: '2019-02-11T09:58:08.286Z' }
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(1)
expect(body.data[0].name).to.equal('1111 2222 3333 - 7')
}
{
2021-07-13 02:43:59 -05:00
const query = { ...baseQuery, originallyPublishedEndDate: '2019-03-11T09:58:08.286Z' }
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(1)
expect(body.data[0].name).to.equal('1111 2222 3333 - 7')
}
{
2021-07-13 02:43:59 -05:00
const query = { ...baseQuery, originallyPublishedEndDate: '2019-01-11T09:58:08.286Z' }
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(0)
}
{
2021-07-13 02:43:59 -05:00
const query = { ...baseQuery, originallyPublishedStartDate: '2019-03-11T09:58:08.286Z' }
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(0)
}
{
2021-07-13 02:43:59 -05:00
const query = {
...baseQuery,
originallyPublishedStartDate: '2019-01-11T09:58:08.286Z',
originallyPublishedEndDate: '2019-01-10T09:58:08.286Z'
2021-07-13 02:43:59 -05:00
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(0)
}
{
2021-07-13 02:43:59 -05:00
const query = {
...baseQuery,
originallyPublishedStartDate: '2019-01-11T09:58:08.286Z',
originallyPublishedEndDate: '2019-04-11T09:58:08.286Z'
2021-07-13 02:43:59 -05:00
}
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: query })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(1)
expect(body.data[0].name).to.equal('1111 2222 3333 - 7')
}
})
2019-12-09 08:32:53 -06:00
it('Should search by UUID', async function () {
const search = videoUUID
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: { search } })
2019-12-09 08:32:53 -06:00
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(1)
expect(body.data[0].name).to.equal('1111 2222 3333 - 3')
2019-12-09 08:32:53 -06:00
})
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)
{
2021-07-07 04:51:09 -05:00
const newConfig = {
search: {
searchIndex: { enabled: false }
},
live: { enabled: true }
}
2021-07-16 02:04:35 -05:00
await server.config.updateCustomSubConfig({ newConfig })
}
{
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: { isLive: true } })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(0)
expect(body.data).to.have.lengthOf(0)
}
{
2021-07-16 02:04:35 -05:00
const liveCommand = server.live
2021-07-08 03:18:40 -05:00
2021-07-16 02:04:35 -05:00
const liveAttributes = { name: 'live', privacy: VideoPrivacy.PUBLIC, channelId: server.store.channel.id }
2021-07-08 03:25:50 -05:00
const live = await liveCommand.create({ fields: liveAttributes })
2021-07-08 03:18:40 -05:00
const ffmpegCommand = await liveCommand.sendRTMPStreamInVideo({ videoId: live.id })
2021-07-08 03:25:50 -05:00
await liveCommand.waitUntilPublished({ videoId: live.id })
2021-07-06 08:22:51 -05:00
const body = await command.advancedVideoSearch({ search: { isLive: true } })
2021-07-06 08:22:51 -05:00
expect(body.total).to.equal(1)
expect(body.data[0].name).to.equal('live')
2021-07-06 08:22:51 -05:00
await stopFfmpeg(ffmpegCommand)
}
})
2019-04-24 08:10:37 -05:00
after(async function () {
await cleanupTests([ server ])
2018-07-20 07:35:18 -05:00
})
})