mirror of
https://github.com/KevinMidboe/immich.git
synced 2025-10-29 17:40:28 +00:00
refactor(server)*: tsconfigs (#2689)
* refactor(server): tsconfigs * chore: dummy commit * fix: start.sh * chore: restore original entry scripts
This commit is contained in:
1080
server/test/fixtures.ts
Normal file
1080
server/test/fixtures.ts
Normal file
File diff suppressed because it is too large
Load Diff
3
server/test/global-setup.js
Normal file
3
server/test/global-setup.js
Normal file
@@ -0,0 +1,3 @@
|
||||
module.exports = async () => {
|
||||
process.env.TZ = 'UTC';
|
||||
};
|
||||
8
server/test/index.ts
Normal file
8
server/test/index.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
export * from './repositories';
|
||||
export * from './fixtures';
|
||||
|
||||
export async function asyncTick(steps: number) {
|
||||
for (let i = 0; i < steps; i++) {
|
||||
await Promise.resolve();
|
||||
}
|
||||
}
|
||||
9
server/test/repositories/access.repository.mock.ts
Normal file
9
server/test/repositories/access.repository.mock.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { IAccessRepository } from '@app/domain';
|
||||
|
||||
export const newAccessRepositoryMock = (): jest.Mocked<IAccessRepository> => {
|
||||
return {
|
||||
hasPartnerAccess: jest.fn(),
|
||||
hasPartnerAssetAccess: jest.fn(),
|
||||
hasSharedLinkAssetAccess: jest.fn(),
|
||||
};
|
||||
};
|
||||
19
server/test/repositories/album.repository.mock.ts
Normal file
19
server/test/repositories/album.repository.mock.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import { IAlbumRepository } from '@app/domain';
|
||||
|
||||
export const newAlbumRepositoryMock = (): jest.Mocked<IAlbumRepository> => {
|
||||
return {
|
||||
getByIds: jest.fn(),
|
||||
getByAssetId: jest.fn(),
|
||||
getAssetCountForIds: jest.fn(),
|
||||
getInvalidThumbnail: jest.fn(),
|
||||
getOwned: jest.fn(),
|
||||
getShared: jest.fn(),
|
||||
getNotShared: jest.fn(),
|
||||
deleteAll: jest.fn(),
|
||||
getAll: jest.fn(),
|
||||
hasAsset: jest.fn(),
|
||||
create: jest.fn(),
|
||||
update: jest.fn(),
|
||||
delete: jest.fn(),
|
||||
};
|
||||
};
|
||||
12
server/test/repositories/api-key.repository.mock.ts
Normal file
12
server/test/repositories/api-key.repository.mock.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { IKeyRepository } from '@app/domain';
|
||||
|
||||
export const newKeyRepositoryMock = (): jest.Mocked<IKeyRepository> => {
|
||||
return {
|
||||
create: jest.fn(),
|
||||
update: jest.fn(),
|
||||
delete: jest.fn(),
|
||||
getKey: jest.fn(),
|
||||
getById: jest.fn(),
|
||||
getByUserId: jest.fn(),
|
||||
};
|
||||
};
|
||||
18
server/test/repositories/asset.repository.mock.ts
Normal file
18
server/test/repositories/asset.repository.mock.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { IAssetRepository } from '@app/domain';
|
||||
|
||||
export const newAssetRepositoryMock = (): jest.Mocked<IAssetRepository> => {
|
||||
return {
|
||||
getByIds: jest.fn().mockResolvedValue([]),
|
||||
getWithout: jest.fn(),
|
||||
getWith: jest.fn(),
|
||||
getFirstAssetForAlbumId: jest.fn(),
|
||||
getAll: jest.fn().mockResolvedValue({
|
||||
items: [],
|
||||
hasNextPage: false,
|
||||
}),
|
||||
deleteAll: jest.fn(),
|
||||
save: jest.fn(),
|
||||
findLivePhotoMatch: jest.fn(),
|
||||
getMapMarkers: jest.fn(),
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,7 @@
|
||||
import { ICommunicationRepository } from '@app/domain';
|
||||
|
||||
export const newCommunicationRepositoryMock = (): jest.Mocked<ICommunicationRepository> => {
|
||||
return {
|
||||
send: jest.fn(),
|
||||
};
|
||||
};
|
||||
10
server/test/repositories/crypto.repository.mock.ts
Normal file
10
server/test/repositories/crypto.repository.mock.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { ICryptoRepository } from '@app/domain';
|
||||
|
||||
export const newCryptoRepositoryMock = (): jest.Mocked<ICryptoRepository> => {
|
||||
return {
|
||||
randomBytes: jest.fn().mockReturnValue(Buffer.from('random-bytes', 'utf8')),
|
||||
compareBcrypt: jest.fn().mockReturnValue(true),
|
||||
hashBcrypt: jest.fn().mockImplementation((input) => Promise.resolve(`${input} (hashed)`)),
|
||||
hashSha256: jest.fn().mockImplementation((input) => `${input} (hashed)`),
|
||||
};
|
||||
};
|
||||
9
server/test/repositories/face.repository.mock.ts
Normal file
9
server/test/repositories/face.repository.mock.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { IFaceRepository } from '@app/domain';
|
||||
|
||||
export const newFaceRepositoryMock = (): jest.Mocked<IFaceRepository> => {
|
||||
return {
|
||||
getAll: jest.fn(),
|
||||
getByIds: jest.fn(),
|
||||
create: jest.fn(),
|
||||
};
|
||||
};
|
||||
20
server/test/repositories/index.ts
Normal file
20
server/test/repositories/index.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
export * from './access.repository.mock';
|
||||
export * from './album.repository.mock';
|
||||
export * from './api-key.repository.mock';
|
||||
export * from './asset.repository.mock';
|
||||
export * from './communication.repository.mock';
|
||||
export * from './crypto.repository.mock';
|
||||
export * from './face.repository.mock';
|
||||
export * from './job.repository.mock';
|
||||
export * from './machine-learning.repository.mock';
|
||||
export * from './media.repository.mock';
|
||||
export * from './partner.repository.mock';
|
||||
export * from './person.repository.mock';
|
||||
export * from './search.repository.mock';
|
||||
export * from './shared-link.repository.mock';
|
||||
export * from './smart-info.repository.mock';
|
||||
export * from './storage.repository.mock';
|
||||
export * from './system-config.repository.mock';
|
||||
export * from './tag.repository.mock';
|
||||
export * from './user-token.repository.mock';
|
||||
export * from './user.repository.mock';
|
||||
14
server/test/repositories/job.repository.mock.ts
Normal file
14
server/test/repositories/job.repository.mock.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { IJobRepository } from '@app/domain';
|
||||
|
||||
export const newJobRepositoryMock = (): jest.Mocked<IJobRepository> => {
|
||||
return {
|
||||
addHandler: jest.fn(),
|
||||
setConcurrency: jest.fn(),
|
||||
empty: jest.fn(),
|
||||
pause: jest.fn(),
|
||||
resume: jest.fn(),
|
||||
queue: jest.fn().mockImplementation(() => Promise.resolve()),
|
||||
getQueueStatus: jest.fn(),
|
||||
getJobCounts: jest.fn(),
|
||||
};
|
||||
};
|
||||
10
server/test/repositories/machine-learning.repository.mock.ts
Normal file
10
server/test/repositories/machine-learning.repository.mock.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { IMachineLearningRepository } from '@app/domain';
|
||||
|
||||
export const newMachineLearningRepositoryMock = (): jest.Mocked<IMachineLearningRepository> => {
|
||||
return {
|
||||
classifyImage: jest.fn(),
|
||||
encodeImage: jest.fn(),
|
||||
encodeText: jest.fn(),
|
||||
detectFaces: jest.fn(),
|
||||
};
|
||||
};
|
||||
12
server/test/repositories/media.repository.mock.ts
Normal file
12
server/test/repositories/media.repository.mock.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { IMediaRepository } from '@app/domain';
|
||||
|
||||
export const newMediaRepositoryMock = (): jest.Mocked<IMediaRepository> => {
|
||||
return {
|
||||
extractThumbnailFromExif: jest.fn(),
|
||||
extractVideoThumbnail: jest.fn(),
|
||||
resize: jest.fn(),
|
||||
crop: jest.fn(),
|
||||
probe: jest.fn(),
|
||||
transcode: jest.fn(),
|
||||
};
|
||||
};
|
||||
10
server/test/repositories/partner.repository.mock.ts
Normal file
10
server/test/repositories/partner.repository.mock.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import { IPartnerRepository } from '@app/domain';
|
||||
|
||||
export const newPartnerRepositoryMock = (): jest.Mocked<IPartnerRepository> => {
|
||||
return {
|
||||
create: jest.fn(),
|
||||
remove: jest.fn(),
|
||||
getAll: jest.fn(),
|
||||
get: jest.fn(),
|
||||
};
|
||||
};
|
||||
15
server/test/repositories/person.repository.mock.ts
Normal file
15
server/test/repositories/person.repository.mock.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { IPersonRepository } from '@app/domain';
|
||||
|
||||
export const newPersonRepositoryMock = (): jest.Mocked<IPersonRepository> => {
|
||||
return {
|
||||
getById: jest.fn(),
|
||||
getAll: jest.fn(),
|
||||
getAssets: jest.fn(),
|
||||
getAllWithoutFaces: jest.fn(),
|
||||
|
||||
create: jest.fn(),
|
||||
update: jest.fn(),
|
||||
deleteAll: jest.fn(),
|
||||
delete: jest.fn(),
|
||||
};
|
||||
};
|
||||
20
server/test/repositories/search.repository.mock.ts
Normal file
20
server/test/repositories/search.repository.mock.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import { ISearchRepository } from '@app/domain';
|
||||
|
||||
export const newSearchRepositoryMock = (): jest.Mocked<ISearchRepository> => {
|
||||
return {
|
||||
setup: jest.fn(),
|
||||
checkMigrationStatus: jest.fn(),
|
||||
importAssets: jest.fn(),
|
||||
importAlbums: jest.fn(),
|
||||
importFaces: jest.fn(),
|
||||
deleteAlbums: jest.fn(),
|
||||
deleteAssets: jest.fn(),
|
||||
deleteFaces: jest.fn(),
|
||||
deleteAllFaces: jest.fn(),
|
||||
searchAssets: jest.fn(),
|
||||
searchAlbums: jest.fn(),
|
||||
vectorSearch: jest.fn(),
|
||||
explore: jest.fn(),
|
||||
searchFaces: jest.fn(),
|
||||
};
|
||||
};
|
||||
12
server/test/repositories/shared-link.repository.mock.ts
Normal file
12
server/test/repositories/shared-link.repository.mock.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { ISharedLinkRepository } from '@app/domain';
|
||||
|
||||
export const newSharedLinkRepositoryMock = (): jest.Mocked<ISharedLinkRepository> => {
|
||||
return {
|
||||
getAll: jest.fn(),
|
||||
get: jest.fn(),
|
||||
getByKey: jest.fn(),
|
||||
create: jest.fn(),
|
||||
remove: jest.fn(),
|
||||
update: jest.fn(),
|
||||
};
|
||||
};
|
||||
7
server/test/repositories/smart-info.repository.mock.ts
Normal file
7
server/test/repositories/smart-info.repository.mock.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import { ISmartInfoRepository } from '@app/domain';
|
||||
|
||||
export const newSmartInfoRepositoryMock = (): jest.Mocked<ISmartInfoRepository> => {
|
||||
return {
|
||||
upsert: jest.fn(),
|
||||
};
|
||||
};
|
||||
14
server/test/repositories/storage.repository.mock.ts
Normal file
14
server/test/repositories/storage.repository.mock.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { IStorageRepository } from '@app/domain';
|
||||
|
||||
export const newStorageRepositoryMock = (): jest.Mocked<IStorageRepository> => {
|
||||
return {
|
||||
createReadStream: jest.fn(),
|
||||
unlink: jest.fn(),
|
||||
unlinkDir: jest.fn().mockResolvedValue(true),
|
||||
removeEmptyDirs: jest.fn(),
|
||||
moveFile: jest.fn(),
|
||||
checkFileExists: jest.fn(),
|
||||
mkdirSync: jest.fn(),
|
||||
checkDiskUsage: jest.fn(),
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,9 @@
|
||||
import { ISystemConfigRepository } from '@app/domain';
|
||||
|
||||
export const newSystemConfigRepositoryMock = (): jest.Mocked<ISystemConfigRepository> => {
|
||||
return {
|
||||
load: jest.fn().mockResolvedValue([]),
|
||||
saveAll: jest.fn().mockResolvedValue([]),
|
||||
deleteKeys: jest.fn(),
|
||||
};
|
||||
};
|
||||
16
server/test/repositories/tag.repository.mock.ts
Normal file
16
server/test/repositories/tag.repository.mock.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { ITagRepository } from '@app/domain';
|
||||
|
||||
export const newTagRepositoryMock = (): jest.Mocked<ITagRepository> => {
|
||||
return {
|
||||
getAll: jest.fn(),
|
||||
getById: jest.fn(),
|
||||
create: jest.fn(),
|
||||
update: jest.fn(),
|
||||
remove: jest.fn(),
|
||||
hasAsset: jest.fn(),
|
||||
hasName: jest.fn(),
|
||||
getAssets: jest.fn(),
|
||||
addAssets: jest.fn(),
|
||||
removeAssets: jest.fn(),
|
||||
};
|
||||
};
|
||||
11
server/test/repositories/user-token.repository.mock.ts
Normal file
11
server/test/repositories/user-token.repository.mock.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import { IUserTokenRepository } from '@app/domain';
|
||||
|
||||
export const newUserTokenRepositoryMock = (): jest.Mocked<IUserTokenRepository> => {
|
||||
return {
|
||||
create: jest.fn(),
|
||||
save: jest.fn(),
|
||||
delete: jest.fn(),
|
||||
getByToken: jest.fn(),
|
||||
getAll: jest.fn(),
|
||||
};
|
||||
};
|
||||
18
server/test/repositories/user.repository.mock.ts
Normal file
18
server/test/repositories/user.repository.mock.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { IUserRepository } from '@app/domain';
|
||||
|
||||
export const newUserRepositoryMock = (): jest.Mocked<IUserRepository> => {
|
||||
return {
|
||||
get: jest.fn(),
|
||||
getAdmin: jest.fn(),
|
||||
getByEmail: jest.fn(),
|
||||
getByStorageLabel: jest.fn(),
|
||||
getByOAuthId: jest.fn(),
|
||||
getUserStats: jest.fn(),
|
||||
getList: jest.fn(),
|
||||
create: jest.fn(),
|
||||
update: jest.fn(),
|
||||
delete: jest.fn(),
|
||||
getDeletedUsers: jest.fn(),
|
||||
restore: jest.fn(),
|
||||
};
|
||||
};
|
||||
11
server/test/setup.ts
Normal file
11
server/test/setup.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
jest.mock('@nestjs/common', () => ({
|
||||
...jest.requireActual('@nestjs/common'),
|
||||
Logger: jest.fn().mockReturnValue({
|
||||
verbose: jest.fn(),
|
||||
debug: jest.fn(),
|
||||
log: jest.fn(),
|
||||
info: jest.fn(),
|
||||
warn: jest.fn(),
|
||||
error: jest.fn(),
|
||||
}),
|
||||
}));
|
||||
38
server/test/test-utils.ts
Normal file
38
server/test/test-utils.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { CanActivate, ExecutionContext } from '@nestjs/common';
|
||||
import { TestingModuleBuilder } from '@nestjs/testing';
|
||||
import { DataSource } from 'typeorm';
|
||||
import { AuthUserDto } from '@app/immich/decorators/auth-user.decorator';
|
||||
import { AuthGuard } from '@app/immich/middlewares/auth.guard';
|
||||
|
||||
type CustomAuthCallback = () => AuthUserDto;
|
||||
|
||||
export async function clearDb(db: DataSource) {
|
||||
const entities = db.entityMetadatas;
|
||||
for (const entity of entities) {
|
||||
const repository = db.getRepository(entity.name);
|
||||
await repository.query(`TRUNCATE ${entity.tableName} RESTART IDENTITY CASCADE;`);
|
||||
}
|
||||
}
|
||||
|
||||
export function getAuthUser(): AuthUserDto {
|
||||
return {
|
||||
id: '3108ac14-8afb-4b7e-87fd-39ebb6b79750',
|
||||
email: 'test@email.com',
|
||||
isAdmin: false,
|
||||
};
|
||||
}
|
||||
|
||||
export function auth(builder: TestingModuleBuilder): TestingModuleBuilder {
|
||||
return authCustom(builder, getAuthUser);
|
||||
}
|
||||
|
||||
export function authCustom(builder: TestingModuleBuilder, callback: CustomAuthCallback): TestingModuleBuilder {
|
||||
const canActivate: CanActivate = {
|
||||
canActivate: (context: ExecutionContext) => {
|
||||
const req = context.switchToHttp().getRequest();
|
||||
req.user = callback();
|
||||
return true;
|
||||
},
|
||||
};
|
||||
return builder.overrideProvider(AuthGuard).useValue(canActivate);
|
||||
}
|
||||
Reference in New Issue
Block a user