X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftests%2Fapi%2Fsearch%2Fsearch-videos.ts;h=bd1e4d266eabd6a109442a7eb01bbb056c3a4050;hb=fbd67e7f386504e50f2504cb6386700a58906f16;hp=50da837da8c974325c4186d67479bdca8050b799;hpb=88108880bbdba473cfe36ecbebc1c3c4f972e102;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tests/api/search/search-videos.ts b/server/tests/api/search/search-videos.ts index 50da837da..bd1e4d266 100644 --- a/server/tests/api/search/search-videos.ts +++ b/server/tests/api/search/search-videos.ts @@ -1,34 +1,43 @@ -/* tslint:disable:no-unused-expression */ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ -import * as chai from 'chai' import 'mocha' +import * as chai from 'chai' import { - advancedVideosSearch, - flushTests, - killallServers, - runServer, - searchVideo, - ServerInfo, + cleanupTests, + createSingleServer, + doubleFollow, + PeerTubeServer, + SearchCommand, setAccessTokensToServers, - uploadVideo, - wait, - immutableAssign -} from '../../../../shared/utils' + setDefaultVideoChannel, + stopFfmpeg, + wait +} from '@shared/extra-utils' +import { VideoPrivacy } from '@shared/models' const expect = chai.expect -describe('Test a videos search', function () { - let server: ServerInfo = null +describe('Test videos search', function () { + let server: PeerTubeServer + let remoteServer: PeerTubeServer let startDate: string + let videoUUID: string + let videoShortUUID: string - before(async function () { - this.timeout(30000) + let command: SearchCommand - await flushTests() + before(async function () { + this.timeout(120000) - server = await runServer(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 ]) { const attributes1 = { @@ -39,32 +48,50 @@ describe('Test a videos search', function () { 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' }) - 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 }) } { @@ -75,9 +102,9 @@ describe('Test a videos search', function () { licence: 2, language: 'en' } - await uploadVideo(server.url, server.accessToken, attributes) + await server.videos.upload({ attributes: attributes }) - await uploadVideo(server.url, server.accessToken, immutableAssign(attributes, { name: attributes.name + ' duplicate' })) + await server.videos.upload({ attributes: { ...attributes, name: attributes.name + ' duplicate' } }) } { @@ -88,7 +115,7 @@ describe('Test a videos search', function () { licence: 3, language: 'pl' } - await uploadVideo(server.url, server.accessToken, attributes) + await server.videos.upload({ attributes: attributes }) } { @@ -97,11 +124,11 @@ describe('Test a videos search', function () { 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' ] } }) } { @@ -109,24 +136,33 @@ describe('Test a videos search', function () { 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 @@ -135,15 +171,15 @@ describe('Test a videos search', function () { }) 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 @@ -152,14 +188,14 @@ describe('Test a videos search', function () { }) 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') @@ -167,14 +203,14 @@ describe('Test a videos search', function () { }) 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: 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') @@ -184,29 +220,41 @@ describe('Test a videos search', function () { const query = { search: '9999', categoryOneOf: [ 1 ], - tagsOneOf: [ 'aaaa', 'ffff' ] + tagsOneOf: [ 'aAaa', 'ffff' ] } - 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 }) + expect(body.total).to.equal(2) + } + + { + 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 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 }) + expect(body.total).to.equal(2) + } - 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: [ 'blAbla' ] } }) + expect(body.total).to.equal(0) + } + + { + const body = await command.advancedVideoSearch({ search: { ...query, tagsAllOf: [ 'bbbb', 'CCCC' ] } }) + expect(body.total).to.equal(1) + } }) it('Should search by category', async function () { @@ -214,12 +262,17 @@ describe('Test a videos search', 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 () { @@ -227,13 +280,18 @@ describe('Test a videos search', 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 () { @@ -241,13 +299,26 @@ describe('Test a videos search', 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 () { @@ -256,10 +327,10 @@ describe('Test a videos search', 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') @@ -275,10 +346,10 @@ describe('Test a videos search', function () { 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') @@ -295,10 +366,10 @@ describe('Test a videos search', function () { 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') @@ -317,10 +388,10 @@ describe('Test a videos search', function () { 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') }) @@ -336,19 +407,161 @@ describe('Test a videos search', function () { 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') }) - after(async function () { - killallServers([ server ]) + 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 ] + } + + { + const query = { ...baseQuery, originallyPublishedStartDate: '2019-02-11T09:58:08.286Z' } + const body = await command.advancedVideoSearch({ search: query }) + + expect(body.total).to.equal(1) + expect(body.data[0].name).to.equal('1111 2222 3333 - 7') + } + + { + const query = { ...baseQuery, originallyPublishedEndDate: '2019-03-11T09:58:08.286Z' } + const body = await command.advancedVideoSearch({ search: query }) + + expect(body.total).to.equal(1) + expect(body.data[0].name).to.equal('1111 2222 3333 - 7') + } + + { + const query = { ...baseQuery, originallyPublishedEndDate: '2019-01-11T09:58:08.286Z' } + const body = await command.advancedVideoSearch({ search: query }) + + expect(body.total).to.equal(0) + } + + { + const query = { ...baseQuery, originallyPublishedStartDate: '2019-03-11T09:58:08.286Z' } + const body = await command.advancedVideoSearch({ search: query }) + + expect(body.total).to.equal(0) + } + + { + const query = { + ...baseQuery, + originallyPublishedStartDate: '2019-01-11T09:58:08.286Z', + originallyPublishedEndDate: '2019-01-10T09:58:08.286Z' + } + const body = await command.advancedVideoSearch({ search: query }) + + expect(body.total).to.equal(0) + } + + { + const query = { + ...baseQuery, + originallyPublishedStartDate: '2019-01-11T09:58:08.286Z', + originallyPublishedEndDate: '2019-04-11T09:58:08.286Z' + } + const body = await command.advancedVideoSearch({ search: query }) - // Keep the logs if the test failed - if (this['ok']) { - await flushTests() + 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') + + await stopFfmpeg(ffmpegCommand) + } + }) + + after(async function () { + await cleanupTests([ server ]) + }) })