|
@@ -1,22 +1,15 @@
|
|
|
-import {
|
|
|
- AdminSignupResponseDto,
|
|
|
- AlbumResponseDto,
|
|
|
- AuthDeviceResponseDto,
|
|
|
- AuthUserDto,
|
|
|
- CreateUserDto,
|
|
|
- LibraryResponseDto,
|
|
|
- LoginCredentialDto,
|
|
|
- LoginResponseDto,
|
|
|
- SharedLinkCreateDto,
|
|
|
- SharedLinkResponseDto,
|
|
|
- UpdateUserDto,
|
|
|
- UserResponseDto,
|
|
|
-} from '@app/domain';
|
|
|
-import { CreateAlbumDto } from '@app/domain/album/dto/album-create.dto';
|
|
|
import { dataSource } from '@app/infra';
|
|
|
-import { UserEntity } from '@app/infra/entities';
|
|
|
-import request from 'supertest';
|
|
|
-import { adminSignupStub, loginResponseStub, loginStub, signupResponseStub } from './fixtures';
|
|
|
+
|
|
|
+import { IJobRepository, JobItem, JobItemHandler, QueueName } from '@app/domain';
|
|
|
+import { AppModule } from '@app/immich';
|
|
|
+import { INestApplication, Logger } from '@nestjs/common';
|
|
|
+import { Test, TestingModule } from '@nestjs/testing';
|
|
|
+import * as fs from 'fs';
|
|
|
+import path from 'path';
|
|
|
+import { AppService } from '../src/microservices/app.service';
|
|
|
+
|
|
|
+export const IMMICH_TEST_ASSET_PATH = process.env.IMMICH_TEST_ASSET_PATH;
|
|
|
+export const IMMICH_TEST_ASSET_TEMP_PATH = path.normalize(`${IMMICH_TEST_ASSET_PATH}/temp/`);
|
|
|
|
|
|
export const db = {
|
|
|
reset: async () => {
|
|
@@ -41,135 +34,53 @@ export const db = {
|
|
|
},
|
|
|
};
|
|
|
|
|
|
-export function getAuthUser(): AuthUserDto {
|
|
|
- return {
|
|
|
- id: '3108ac14-8afb-4b7e-87fd-39ebb6b79750',
|
|
|
- email: 'test@email.com',
|
|
|
- isAdmin: false,
|
|
|
- };
|
|
|
+let _handler: JobItemHandler = () => Promise.resolve();
|
|
|
+
|
|
|
+export async function createTestApp(runJobs = false, log = false): Promise<INestApplication> {
|
|
|
+ const moduleBuilder = Test.createTestingModule({
|
|
|
+ imports: [AppModule],
|
|
|
+ providers: [AppService],
|
|
|
+ })
|
|
|
+ .overrideProvider(IJobRepository)
|
|
|
+ .useValue({
|
|
|
+ addHandler: (_queueName: QueueName, _concurrency: number, handler: JobItemHandler) => (_handler = handler),
|
|
|
+ queue: (item: JobItem) => runJobs && _handler(item),
|
|
|
+ resume: jest.fn(),
|
|
|
+ empty: jest.fn(),
|
|
|
+ setConcurrency: jest.fn(),
|
|
|
+ getQueueStatus: jest.fn(),
|
|
|
+ getJobCounts: jest.fn(),
|
|
|
+ pause: jest.fn(),
|
|
|
+ } as IJobRepository);
|
|
|
+
|
|
|
+ const moduleFixture: TestingModule = await moduleBuilder.compile();
|
|
|
+
|
|
|
+ const app = moduleFixture.createNestApplication();
|
|
|
+ if (log) {
|
|
|
+ app.useLogger(new Logger());
|
|
|
+ } else {
|
|
|
+ app.useLogger(false);
|
|
|
+ }
|
|
|
+ await app.init();
|
|
|
+ const appService = app.get(AppService);
|
|
|
+ await appService.init();
|
|
|
+
|
|
|
+ return app;
|
|
|
}
|
|
|
|
|
|
-export const api = {
|
|
|
- adminSignUp: async (server: any) => {
|
|
|
- const { status, body } = await request(server).post('/auth/admin-sign-up').send(adminSignupStub);
|
|
|
-
|
|
|
- expect(status).toBe(201);
|
|
|
- expect(body).toEqual(signupResponseStub);
|
|
|
-
|
|
|
- return body as AdminSignupResponseDto;
|
|
|
- },
|
|
|
- adminLogin: async (server: any) => {
|
|
|
- const { status, body } = await request(server).post('/auth/login').send(loginStub.admin);
|
|
|
-
|
|
|
- expect(body).toEqual(loginResponseStub.admin.response);
|
|
|
- expect(body).toMatchObject({ accessToken: expect.any(String) });
|
|
|
- expect(status).toBe(201);
|
|
|
-
|
|
|
- return body as LoginResponseDto;
|
|
|
- },
|
|
|
- userCreate: async (server: any, accessToken: string, user: Partial<UserEntity>) => {
|
|
|
- const { status, body } = await request(server)
|
|
|
- .post('/user')
|
|
|
- .set('Authorization', `Bearer ${accessToken}`)
|
|
|
- .send(user);
|
|
|
-
|
|
|
- expect(status).toBe(201);
|
|
|
-
|
|
|
- return body as UserResponseDto;
|
|
|
- },
|
|
|
- login: async (server: any, dto: LoginCredentialDto) => {
|
|
|
- const { status, body } = await request(server).post('/auth/login').send(dto);
|
|
|
-
|
|
|
- expect(status).toEqual(201);
|
|
|
- expect(body).toMatchObject({ accessToken: expect.any(String) });
|
|
|
-
|
|
|
- return body as LoginResponseDto;
|
|
|
- },
|
|
|
- getAuthDevices: async (server: any, accessToken: string) => {
|
|
|
- const { status, body } = await request(server).get('/auth/devices').set('Authorization', `Bearer ${accessToken}`);
|
|
|
-
|
|
|
- expect(body).toEqual(expect.any(Array));
|
|
|
- expect(status).toBe(200);
|
|
|
-
|
|
|
- return body as AuthDeviceResponseDto[];
|
|
|
- },
|
|
|
- validateToken: async (server: any, accessToken: string) => {
|
|
|
- const response = await request(server).post('/auth/validateToken').set('Authorization', `Bearer ${accessToken}`);
|
|
|
- expect(response.body).toEqual({ authStatus: true });
|
|
|
- expect(response.status).toBe(200);
|
|
|
- },
|
|
|
- albumApi: {
|
|
|
- create: async (server: any, accessToken: string, dto: CreateAlbumDto) => {
|
|
|
- const res = await request(server).post('/album').set('Authorization', `Bearer ${accessToken}`).send(dto);
|
|
|
- expect(res.status).toEqual(201);
|
|
|
- return res.body as AlbumResponseDto;
|
|
|
- },
|
|
|
- },
|
|
|
- libraryApi: {
|
|
|
- getAll: async (server: any, accessToken: string) => {
|
|
|
- const res = await request(server).get('/library').set('Authorization', `Bearer ${accessToken}`);
|
|
|
- expect(res.status).toEqual(200);
|
|
|
- expect(Array.isArray(res.body)).toBe(true);
|
|
|
- return res.body as LibraryResponseDto[];
|
|
|
- },
|
|
|
- },
|
|
|
- sharedLinkApi: {
|
|
|
- create: async (server: any, accessToken: string, dto: SharedLinkCreateDto) => {
|
|
|
- const { status, body } = await request(server)
|
|
|
- .post('/shared-link')
|
|
|
- .set('Authorization', `Bearer ${accessToken}`)
|
|
|
- .send(dto);
|
|
|
- expect(status).toBe(201);
|
|
|
- return body as SharedLinkResponseDto;
|
|
|
- },
|
|
|
- },
|
|
|
- userApi: {
|
|
|
- create: async (server: any, accessToken: string, dto: CreateUserDto) => {
|
|
|
- const { status, body } = await request(server)
|
|
|
- .post('/user')
|
|
|
- .set('Authorization', `Bearer ${accessToken}`)
|
|
|
- .send(dto);
|
|
|
-
|
|
|
- expect(status).toBe(201);
|
|
|
- expect(body).toMatchObject({
|
|
|
- id: expect.any(String),
|
|
|
- createdAt: expect.any(String),
|
|
|
- updatedAt: expect.any(String),
|
|
|
- email: dto.email,
|
|
|
- });
|
|
|
-
|
|
|
- return body as UserResponseDto;
|
|
|
- },
|
|
|
- get: async (server: any, accessToken: string, id: string) => {
|
|
|
- const { status, body } = await request(server)
|
|
|
- .get(`/user/info/${id}`)
|
|
|
- .set('Authorization', `Bearer ${accessToken}`);
|
|
|
-
|
|
|
- expect(status).toBe(200);
|
|
|
- expect(body).toMatchObject({ id });
|
|
|
-
|
|
|
- return body as UserResponseDto;
|
|
|
- },
|
|
|
- update: async (server: any, accessToken: string, dto: UpdateUserDto) => {
|
|
|
- const { status, body } = await request(server)
|
|
|
- .put('/user')
|
|
|
- .set('Authorization', `Bearer ${accessToken}`)
|
|
|
- .send(dto);
|
|
|
-
|
|
|
- expect(status).toBe(200);
|
|
|
- expect(body).toMatchObject({ id: dto.id });
|
|
|
-
|
|
|
- return body as UserResponseDto;
|
|
|
- },
|
|
|
- delete: async (server: any, accessToken: string, id: string) => {
|
|
|
- const { status, body } = await request(server)
|
|
|
- .delete(`/user/${id}`)
|
|
|
- .set('Authorization', `Bearer ${accessToken}`);
|
|
|
-
|
|
|
- expect(status).toBe(200);
|
|
|
- expect(body).toMatchObject({ id, deletedAt: expect.any(String) });
|
|
|
-
|
|
|
- return body as UserResponseDto;
|
|
|
- },
|
|
|
- },
|
|
|
-} as const;
|
|
|
+export const runAllTests: boolean = process.env.IMMICH_RUN_ALL_TESTS === 'true';
|
|
|
+
|
|
|
+const directoryExists = async (dirPath: string) =>
|
|
|
+ await fs.promises
|
|
|
+ .access(dirPath)
|
|
|
+ .then(() => true)
|
|
|
+ .catch(() => false);
|
|
|
+
|
|
|
+export async function restoreTempFolder(): Promise<void> {
|
|
|
+ if (await directoryExists(`${IMMICH_TEST_ASSET_TEMP_PATH}`)) {
|
|
|
+ // Temp directory exists, delete all files inside it
|
|
|
+ await fs.promises.rm(IMMICH_TEST_ASSET_TEMP_PATH, { recursive: true });
|
|
|
+ }
|
|
|
+ // Create temp folder
|
|
|
+ await fs.promises.mkdir(IMMICH_TEST_ASSET_TEMP_PATH);
|
|
|
+}
|