refactor: library e2e ()

* refactor: library e2e

* migrate and refactor library e2e

---------

Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
This commit is contained in:
Jason Rasmussen 2024-04-12 15:15:41 -04:00 committed by GitHub
parent 97c099e26d
commit 14b798fcc4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 838 additions and 426 deletions
e2e/src

View file

@ -1,4 +1,5 @@
import {
AllJobStatusResponseDto,
AssetFileUploadResponseDto,
AssetResponseDto,
CreateAlbumDto,
@ -18,6 +19,7 @@ import {
defaults,
deleteAssets,
getAllAssets,
getAllJobsStatus,
getAssetInfo,
login,
searchMetadata,
@ -31,6 +33,7 @@ import { createHash } from 'node:crypto';
import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
import { tmpdir } from 'node:os';
import path, { dirname } from 'node:path';
import { setTimeout as setAsyncTimeout } from 'node:timers/promises';
import { promisify } from 'node:util';
import pg from 'pg';
import { io, type Socket } from 'socket.io-client';
@ -209,35 +212,33 @@ export const utils = {
}
},
waitForWebsocketEvent: async ({ event, id, total: count, timeout: ms }: WaitOptions): Promise<void> => {
if (!id && !count) {
throw new Error('id or count must be provided for waitForWebsocketEvent');
}
const type = id ? `id=${id}` : `count=${count}`;
console.log(`Waiting for ${event} [${type}]`);
const set = events[event];
if ((id && set.has(id)) || (count && set.size >= count)) {
return;
}
waitForWebsocketEvent: ({ event, id, total: count, timeout: ms }: WaitOptions): Promise<void> => {
return new Promise<void>((resolve, reject) => {
if (!id && !count) {
reject(new Error('id or count must be provided for waitForWebsocketEvent'));
}
const timeout = setTimeout(() => reject(new Error(`Timed out waiting for ${event} event`)), ms || 10_000);
const type = id ? `id=${id}` : `count=${count}`;
console.log(`Waiting for ${event} [${type}]`);
const set = events[event];
const onId = () => {
clearTimeout(timeout);
resolve();
};
if ((id && set.has(id)) || (count && set.size >= count)) {
onId();
return;
}
if (id) {
idCallbacks[id] = () => {
clearTimeout(timeout);
resolve();
};
idCallbacks[id] = onId;
}
if (count) {
countCallbacks[event] = {
count,
callback: () => {
clearTimeout(timeout);
resolve();
},
callback: onId,
};
}
});
@ -406,6 +407,33 @@ export const utils = {
},
]),
deleteTempFolder: () => {
rmSync(`${testAssetDir}/temp`, { recursive: true, force: true });
},
isQueueEmpty: async (accessToken: string, queue: keyof AllJobStatusResponseDto) => {
const queues = await getAllJobsStatus({ headers: asBearerAuth(accessToken) });
const jobCounts = queues[queue].jobCounts;
return !jobCounts.active && !jobCounts.waiting;
},
waitForQueueFinish: (accessToken: string, queue: keyof AllJobStatusResponseDto, ms?: number) => {
return new Promise<void>(async (resolve, reject) => {
const timeout = setTimeout(() => reject(new Error('Timed out waiting for queue to empty')), ms || 10_000);
while (true) {
const done = await utils.isQueueEmpty(accessToken, queue);
if (done) {
break;
}
await setAsyncTimeout(200);
}
clearTimeout(timeout);
resolve();
});
},
cliLogin: async (accessToken: string) => {
const key = await utils.createApiKey(accessToken);
await immichCli(['login', app, `${key.secret}`]);