From d41f4a6dc69d098e9dc9173b7e1a586695ef7b97 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 24 Feb 2023 14:48:15 +0100 Subject: Improve image test comparison --- package.json | 3 +++ server/tests/api/users/users.ts | 6 ++--- server/tests/api/videos/video-imports.ts | 28 +++++++++++--------- server/tests/fixtures/thumbnail-playlist.jpg | Bin 4981 -> 5040 bytes server/tests/fixtures/thumbnail.jpg | Bin 4221 -> 5568 bytes .../fixtures/video_import_thumbnail_yt_dlp.jpg | Bin 10163 -> 10676 bytes server/tests/fixtures/video_short.mp4.jpg | Bin 4981 -> 5028 bytes server/tests/fixtures/video_short.ogv.jpg | Bin 4981 -> 5023 bytes server/tests/fixtures/video_short.webm.jpg | Bin 4981 -> 5028 bytes .../tests/fixtures/video_short1-preview.webm.jpg | Bin 31388 -> 31351 bytes server/tests/fixtures/video_short1.webm.jpg | Bin 6309 -> 6222 bytes server/tests/fixtures/video_short2.webm.jpg | Bin 5506 -> 5568 bytes server/tests/fixtures/video_short3.webm.jpg | Bin 4981 -> 5674 bytes server/tests/helpers/image.ts | 2 +- server/tests/shared/checks.ts | 29 ++++++++++++++++++++- shared/server-commands/videos/imports-command.ts | 4 ++- yarn.lock | 12 +++++++++ 17 files changed, 66 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 5d1d2e747..b9031389f 100644 --- a/package.json +++ b/package.json @@ -219,7 +219,10 @@ "eslint-plugin-node": "^11.0.0", "eslint-plugin-promise": "^6.0.0", "fast-xml-parser": "^4.0.0-beta.8", + "jpeg-js": "^0.4.4", "mocha": "^10.0.0", + "pixelmatch": "^5.3.0", + "pngjs": "^7.0.0", "proxy": "^1.0.2", "resolve-tspaths": "^0.8.8", "socket.io-client": "^4.5.4", diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts index f1e170971..1c00f9a93 100644 --- a/server/tests/api/users/users.ts +++ b/server/tests/api/users/users.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ import { expect } from 'chai' -import { testImage } from '@server/tests/shared' +import { testImageSize } from '@server/tests/shared' import { AbuseState, HttpStatusCode, UserAdminFlag, UserRole, VideoPlaylistType } from '@shared/models' import { cleanupTests, createSingleServer, PeerTubeServer, setAccessTokensToServers } from '@shared/server-commands' @@ -274,7 +274,7 @@ describe('Test users', function () { const user = await server.users.getMyInfo({ token: userToken }) for (const avatar of user.account.avatars) { - await testImage(server.url, `avatar-resized-${avatar.width}x${avatar.width}`, avatar.path, '.gif') + await testImageSize(server.url, `avatar-resized-${avatar.width}x${avatar.width}`, avatar.path, '.gif') } }) @@ -286,7 +286,7 @@ describe('Test users', function () { const user = await server.users.getMyInfo({ token: userToken }) for (const avatar of user.account.avatars) { - await testImage(server.url, `avatar-resized-${avatar.width}x${avatar.width}`, avatar.path, extension) + await testImageSize(server.url, `avatar-resized-${avatar.width}x${avatar.width}`, avatar.path, extension) } } }) diff --git a/server/tests/api/videos/video-imports.ts b/server/tests/api/videos/video-imports.ts index 5636de45f..80215f038 100644 --- a/server/tests/api/videos/video-imports.ts +++ b/server/tests/api/videos/video-imports.ts @@ -68,6 +68,8 @@ async function checkVideoServer2 (server: PeerTubeServer, id: number | string) { expect(video.description).to.equal('my super description') expect(video.tags).to.deep.equal([ 'supertag1', 'supertag2' ]) + await testImage(server.url, 'thumbnail', video.thumbnailPath) + expect(video.files).to.have.lengthOf(1) const bodyCaptions = await server.captions.list({ videoId: id }) @@ -254,18 +256,20 @@ describe('Test video imports', function () { it('Should import a video on server 2 with some fields', async function () { this.timeout(60_000) - const attributes = { - targetUrl: FIXTURE_URLS.youtube, - channelId: servers[1].store.channel.id, - privacy: VideoPrivacy.PUBLIC, - category: 10, - licence: 7, - language: 'en', - name: 'my super name', - description: 'my super description', - tags: [ 'supertag1', 'supertag2' ] - } - const { video } = await servers[1].imports.importVideo({ attributes }) + const { video } = await servers[1].imports.importVideo({ + attributes: { + targetUrl: FIXTURE_URLS.youtube, + channelId: servers[1].store.channel.id, + privacy: VideoPrivacy.PUBLIC, + category: 10, + licence: 7, + language: 'en', + name: 'my super name', + description: 'my super description', + tags: [ 'supertag1', 'supertag2' ], + thumbnailfile: 'thumbnail.jpg' + } + }) expect(video.name).to.equal('my super name') }) diff --git a/server/tests/fixtures/thumbnail-playlist.jpg b/server/tests/fixtures/thumbnail-playlist.jpg index 62cd77435..12de5817b 100644 Binary files a/server/tests/fixtures/thumbnail-playlist.jpg and b/server/tests/fixtures/thumbnail-playlist.jpg differ diff --git a/server/tests/fixtures/thumbnail.jpg b/server/tests/fixtures/thumbnail.jpg index b331aba3b..1e2897fb8 100644 Binary files a/server/tests/fixtures/thumbnail.jpg and b/server/tests/fixtures/thumbnail.jpg differ diff --git a/server/tests/fixtures/video_import_thumbnail_yt_dlp.jpg b/server/tests/fixtures/video_import_thumbnail_yt_dlp.jpg index f672a785a..a10e07207 100644 Binary files a/server/tests/fixtures/video_import_thumbnail_yt_dlp.jpg and b/server/tests/fixtures/video_import_thumbnail_yt_dlp.jpg differ diff --git a/server/tests/fixtures/video_short.mp4.jpg b/server/tests/fixtures/video_short.mp4.jpg index 62cd77435..7ac29122c 100644 Binary files a/server/tests/fixtures/video_short.mp4.jpg and b/server/tests/fixtures/video_short.mp4.jpg differ diff --git a/server/tests/fixtures/video_short.ogv.jpg b/server/tests/fixtures/video_short.ogv.jpg index 62cd77435..5bc63969b 100644 Binary files a/server/tests/fixtures/video_short.ogv.jpg and b/server/tests/fixtures/video_short.ogv.jpg differ diff --git a/server/tests/fixtures/video_short.webm.jpg b/server/tests/fixtures/video_short.webm.jpg index 62cd77435..7ac29122c 100644 Binary files a/server/tests/fixtures/video_short.webm.jpg and b/server/tests/fixtures/video_short.webm.jpg differ diff --git a/server/tests/fixtures/video_short1-preview.webm.jpg b/server/tests/fixtures/video_short1-preview.webm.jpg index 1f8bb38be..d65af1f21 100644 Binary files a/server/tests/fixtures/video_short1-preview.webm.jpg and b/server/tests/fixtures/video_short1-preview.webm.jpg differ diff --git a/server/tests/fixtures/video_short1.webm.jpg b/server/tests/fixtures/video_short1.webm.jpg index 615cb2a5d..0ab7c58ad 100644 Binary files a/server/tests/fixtures/video_short1.webm.jpg and b/server/tests/fixtures/video_short1.webm.jpg differ diff --git a/server/tests/fixtures/video_short2.webm.jpg b/server/tests/fixtures/video_short2.webm.jpg index aa3126381..1e2897fb8 100644 Binary files a/server/tests/fixtures/video_short2.webm.jpg and b/server/tests/fixtures/video_short2.webm.jpg differ diff --git a/server/tests/fixtures/video_short3.webm.jpg b/server/tests/fixtures/video_short3.webm.jpg index 62cd77435..b572f676e 100644 Binary files a/server/tests/fixtures/video_short3.webm.jpg and b/server/tests/fixtures/video_short3.webm.jpg differ diff --git a/server/tests/helpers/image.ts b/server/tests/helpers/image.ts index 19a99cba9..530c9bacd 100644 --- a/server/tests/helpers/image.ts +++ b/server/tests/helpers/image.ts @@ -32,7 +32,7 @@ describe('Image helpers', function () { const imageDestJPG = join(imageDestDir, 'test.jpg') const imageDestPNG = join(imageDestDir, 'test.png') - const thumbnailSize = { width: 223, height: 122 } + const thumbnailSize = { width: 280, height: 157 } it('Should skip processing if the source image is okay', async function () { const input = buildAbsoluteFixturePath('thumbnail.jpg') diff --git a/server/tests/shared/checks.ts b/server/tests/shared/checks.ts index 523d37420..c0098b293 100644 --- a/server/tests/shared/checks.ts +++ b/server/tests/shared/checks.ts @@ -2,7 +2,10 @@ import { expect } from 'chai' import { pathExists, readFile } from 'fs-extra' +import JPEG from 'jpeg-js' import { join } from 'path' +import pixelmatch from 'pixelmatch' +import { PNG } from 'pngjs' import { root } from '@shared/core-utils' import { HttpStatusCode } from '@shared/models' import { makeGetRequest, PeerTubeServer } from '@shared/server-commands' @@ -41,7 +44,7 @@ async function expectLogContain (server: PeerTubeServer, str: string) { expect(content.toString()).to.contain(str) } -async function testImage (url: string, imageName: string, imageHTTPPath: string, extension = '.jpg') { +async function testImageSize (url: string, imageName: string, imageHTTPPath: string, extension = '.jpg') { const res = await makeGetRequest({ url, path: imageHTTPPath, @@ -58,6 +61,29 @@ async function testImage (url: string, imageName: string, imageHTTPPath: string, expect(body.length).to.be.below(maxLength, 'the generated image is way larger than the recorded fixture') } +async function testImage (url: string, imageName: string, imageHTTPPath: string, extension = '.jpg') { + const res = await makeGetRequest({ + url, + path: imageHTTPPath, + expectedStatus: HttpStatusCode.OK_200 + }) + + const body = res.body + const data = await readFile(join(root(), 'server', 'tests', 'fixtures', imageName + extension)) + + const img1 = imageHTTPPath.endsWith('.png') + ? PNG.sync.read(body) + : JPEG.decode(body) + + const img2 = extension === '.png' + ? PNG.sync.read(data) + : JPEG.decode(data) + + const result = pixelmatch(img1.data, img2.data, null, img1.width, img1.height, { threshold: 0.1 }) + + expect(result).to.equal(0, `${imageHTTPPath} image is not the same as ${imageName}${extension}`) +} + async function testFileExistsOrNot (server: PeerTubeServer, directory: string, filePath: string, exist: boolean) { const base = server.servers.buildDirectory(directory) @@ -104,6 +130,7 @@ function checkBadSortPagination (url: string, path: string, token?: string, quer export { dateIsValid, + testImageSize, testImage, expectLogDoesNotContain, testFileExistsOrNot, diff --git a/shared/server-commands/videos/imports-command.ts b/shared/server-commands/videos/imports-command.ts index 07d810ec1..e307a79be 100644 --- a/shared/server-commands/videos/imports-command.ts +++ b/shared/server-commands/videos/imports-command.ts @@ -7,13 +7,15 @@ import { AbstractCommand, OverrideCommandOptions } from '../shared' export class ImportsCommand extends AbstractCommand { importVideo (options: OverrideCommandOptions & { - attributes: VideoImportCreate & { torrentfile?: string } + attributes: (VideoImportCreate | { torrentfile?: string, previewfile?: string, thumbnailfile?: string }) }) { const { attributes } = options const path = '/api/v1/videos/imports' let attaches: any = {} if (attributes.torrentfile) attaches = { torrentfile: attributes.torrentfile } + if (attributes.thumbnailfile) attaches = { thumbnailfile: attributes.thumbnailfile } + if (attributes.previewfile) attaches = { previewfile: attributes.previewfile } return unwrapBody(this.postUploadRequest({ ...options, diff --git a/yarn.lock b/yarn.lock index 76c71a1e1..d5503ce3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7592,6 +7592,13 @@ pixelmatch@^4.0.2: dependencies: pngjs "^3.0.0" +pixelmatch@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.3.0.tgz#5e5321a7abedfb7962d60dbf345deda87cb9560a" + integrity sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q== + dependencies: + pngjs "^6.0.0" + please-upgrade-node@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" @@ -7609,6 +7616,11 @@ pngjs@^6.0.0: resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== +pngjs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-7.0.0.tgz#a8b7446020ebbc6ac739db6c5415a65d17090e26" + integrity sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow== + postcss@^8.1.10, postcss@^8.3.11: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" -- cgit v1.2.3