]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Improve image test comparison
authorChocobozzz <me@florianbigard.com>
Fri, 24 Feb 2023 13:48:15 +0000 (14:48 +0100)
committerChocobozzz <me@florianbigard.com>
Fri, 24 Feb 2023 14:10:13 +0000 (15:10 +0100)
17 files changed:
package.json
server/tests/api/users/users.ts
server/tests/api/videos/video-imports.ts
server/tests/fixtures/thumbnail-playlist.jpg
server/tests/fixtures/thumbnail.jpg
server/tests/fixtures/video_import_thumbnail_yt_dlp.jpg
server/tests/fixtures/video_short.mp4.jpg
server/tests/fixtures/video_short.ogv.jpg
server/tests/fixtures/video_short.webm.jpg
server/tests/fixtures/video_short1-preview.webm.jpg
server/tests/fixtures/video_short1.webm.jpg
server/tests/fixtures/video_short2.webm.jpg
server/tests/fixtures/video_short3.webm.jpg
server/tests/helpers/image.ts
server/tests/shared/checks.ts
shared/server-commands/videos/imports-command.ts
yarn.lock

index 5d1d2e747c9835db0edb726880ee66f405696af5..b9031389ff52658bd36c34eb740a0b7c425e4ea5 100644 (file)
     "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",
index f1e170971ef0a5e4adb5fdcb875b0d5606cd8769..1c00f9a930fd51d5e3689e1f364c31b8609b23e7 100644 (file)
@@ -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)
         }
       }
     })
index 5636de45f7144c55be37deeaf6c6fc62c1686344..80215f03869a981280e51f11df03092773d85d80 100644 (file)
@@ -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')
       })
 
index 62cd77435a2f1a90ac37bc6d09ed710e9036ee5c..12de5817b90f3dc1f34f7a1e5f6ef9a6bdebc5fc 100644 (file)
Binary files a/server/tests/fixtures/thumbnail-playlist.jpg and b/server/tests/fixtures/thumbnail-playlist.jpg differ
index b331aba3b875653115bb53be293c1f80c26e6fa0..1e2897fb8c44a9c9b66c40c8319018de403740eb 100644 (file)
Binary files a/server/tests/fixtures/thumbnail.jpg and b/server/tests/fixtures/thumbnail.jpg differ
index f672a785a5e5e8f56c9879993140cadfc428b969..a10e072076670fa10d87adc2001d8f5e1a371bdd 100644 (file)
Binary files a/server/tests/fixtures/video_import_thumbnail_yt_dlp.jpg and b/server/tests/fixtures/video_import_thumbnail_yt_dlp.jpg differ
index 62cd77435a2f1a90ac37bc6d09ed710e9036ee5c..7ac29122c526b3d24997b347af412a1f759666b5 100644 (file)
Binary files a/server/tests/fixtures/video_short.mp4.jpg and b/server/tests/fixtures/video_short.mp4.jpg differ
index 62cd77435a2f1a90ac37bc6d09ed710e9036ee5c..5bc63969b8783e5a5b1bfa2565d095c14d75bd7d 100644 (file)
Binary files a/server/tests/fixtures/video_short.ogv.jpg and b/server/tests/fixtures/video_short.ogv.jpg differ
index 62cd77435a2f1a90ac37bc6d09ed710e9036ee5c..7ac29122c526b3d24997b347af412a1f759666b5 100644 (file)
Binary files a/server/tests/fixtures/video_short.webm.jpg and b/server/tests/fixtures/video_short.webm.jpg differ
index 1f8bb38be59fde0f99e77ec6f04466d7e2a03689..d65af1f21814e9cf85491b8dfac97bc9b3480eca 100644 (file)
Binary files a/server/tests/fixtures/video_short1-preview.webm.jpg and b/server/tests/fixtures/video_short1-preview.webm.jpg differ
index 615cb2a5db53395018c29ad782d4e62d9bc5685d..0ab7c58ad80ad28a74eed63935939141e080aaf0 100644 (file)
Binary files a/server/tests/fixtures/video_short1.webm.jpg and b/server/tests/fixtures/video_short1.webm.jpg differ
index aa31263817cecb44461b69e2b9f0b73e70a711a6..1e2897fb8c44a9c9b66c40c8319018de403740eb 100644 (file)
Binary files a/server/tests/fixtures/video_short2.webm.jpg and b/server/tests/fixtures/video_short2.webm.jpg differ
index 62cd77435a2f1a90ac37bc6d09ed710e9036ee5c..b572f676e535eb974cfa75bf0c4f0c3825689ce7 100644 (file)
Binary files a/server/tests/fixtures/video_short3.webm.jpg and b/server/tests/fixtures/video_short3.webm.jpg differ
index 19a99cba91c679b24dd0ddca13abca4637e99b22..530c9bacd962025f6756c6086b6e8bf2f68bb16f 100644 (file)
@@ -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')
index 523d37420f9b33f301e68b813dd94add124df9f0..c0098b293851a50299fab61647193dcd60a3b4f7 100644 (file)
@@ -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,
index 07d810ec1f49e10c452b156c6962e78168e78bc4..e307a79be8a570c4ecec75fb4fd78013e399f4f4 100644 (file)
@@ -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<VideoImport>(this.postUploadRequest({
       ...options,
index 76c71a1e102b137901d9f28e2b8e0f318c3f77c7..d5503ce3ad8c18d6ce820bc1abf9b451ae1ddc1c 100644 (file)
--- 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"