This commit is contained in:
Jason Rasmussen
2024-04-17 17:14:25 -04:00
parent c9a079201a
commit f7285191bd
61 changed files with 1090 additions and 284 deletions

View File

@@ -8,7 +8,7 @@ import {
} from '@immich/sdk';
import { cpSync, existsSync } from 'node:fs';
import { Socket } from 'socket.io-client';
import { userDto, uuidDto } from 'src/fixtures';
import { createUserDto, uuidDto } from 'src/fixtures';
import { errorDto } from 'src/responses';
import { app, asBearerAuth, testAssetDir, testAssetDirInternal, utils } from 'src/utils';
import request from 'supertest';
@@ -18,7 +18,7 @@ import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest';
const scan = async (accessToken: string, id: string, dto: ScanLibraryDto = {}) =>
scanLibrary({ id, scanLibraryDto: dto }, { headers: asBearerAuth(accessToken) });
describe('/library', () => {
describe.skip('/library', () => {
let admin: LoginResponseDto;
let user: LoginResponseDto;
let library: LibraryResponseDto;
@@ -28,7 +28,7 @@ describe('/library', () => {
await utils.resetDatabase();
admin = await utils.adminSetup();
await utils.resetAdminConfig(admin.accessToken);
user = await utils.userSetup(admin.accessToken, userDto.user1);
user = await utils.userSetup(admin.accessToken, createUserDto.user1);
library = await utils.createLibrary(admin.accessToken, { ownerId: admin.userId, type: LibraryType.External });
websocket = await utils.connectWebsocket(admin.accessToken);
utils.createImageFile(`${testAssetDir}/temp/directoryA/assetA.png`);

View File

@@ -135,7 +135,7 @@ describe('/user', () => {
expect(body).toEqual(errorDto.unauthorized);
});
for (const key of Object.keys(createUserDto.user1)) {
for (const key of ['email', 'password', 'name', 'permissionPreset']) {
it(`should not allow null ${key}`, async () => {
const { status, body } = await request(app)
.post(`/user`)
@@ -146,6 +146,17 @@ describe('/user', () => {
});
}
it(`should require permissions when using the custom preset `, async () => {
const { status, body } = await request(app)
.post(`/user`)
.set('Authorization', `Bearer ${admin.accessToken}`)
.send({ ...createUserDto.user1, permissionPreset: 'custom' });
expect(status).toBe(400);
expect(body).toEqual(
errorDto.badRequest([expect.stringContaining('each value in permissions must be one of the following')]),
);
});
it('should ignore `isAdmin`', async () => {
const { status, body } = await request(app)
.post(`/user`)
@@ -154,6 +165,7 @@ describe('/user', () => {
email: 'user5@immich.cloud',
password: 'password123',
name: 'Immich',
permissionPreset: 'user',
})
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toMatchObject({
@@ -172,6 +184,7 @@ describe('/user', () => {
password: 'Password123',
name: 'No Memories',
memoriesEnabled: false,
permissionPreset: 'user',
})
.set('Authorization', `Bearer ${admin.accessToken}`);
expect(body).toMatchObject({

View File

@@ -1,4 +1,4 @@
import { UserAvatarColor } from '@immich/sdk';
import { PermissionPreset, UserAvatarColor } from '@immich/sdk';
export const uuidDto = {
invalid: 'invalid-uuid',
@@ -26,33 +26,39 @@ export const createUserDto = {
email: `${key}@immich.cloud`,
name: `Generated User ${key}`,
password: `password-${key}`,
permissionPreset: PermissionPreset.User,
};
},
user1: {
email: 'user1@immich.cloud',
name: 'User 1',
password: 'password1',
permissionPreset: PermissionPreset.User,
},
user2: {
email: 'user2@immich.cloud',
name: 'User 2',
password: 'password12',
permissionPreset: PermissionPreset.User,
},
user3: {
email: 'user3@immich.cloud',
name: 'User 3',
permissionPreset: PermissionPreset.User,
password: 'password123',
},
user4: {
email: 'user4@immich.cloud',
name: 'User 4',
password: 'password123',
permissionPreset: PermissionPreset.User,
},
userQuota: {
email: 'user-quota@immich.cloud',
name: 'User Quota',
password: 'password-quota',
quotaSizeInBytes: 512,
permissionPreset: PermissionPreset.User,
},
};

View File

@@ -77,6 +77,91 @@ export const signupResponseDto = {
quotaUsageInBytes: 0,
quotaSizeInBytes: null,
status: 'active',
permissions: [
'activity.create',
'activity.read',
'activity.update',
'activity.delete',
'album.create',
'album.read',
'album.update',
'album.delete',
'asset.create',
'asset.read',
'asset.update',
'asset.delete',
'apiKey.create',
'apiKey.read',
'apiKey.update',
'apiKey.delete',
'authDevice.create',
'authDevice.read',
'authDevice.update',
'authDevice.delete',
'face.create',
'face.read',
'face.update',
'face.delete',
'library.create',
'library.read',
'library.update',
'library.delete',
'memory.create',
'memory.read',
'memory.update',
'memory.delete',
'memory.addAsset',
'memory.removeAsset',
'partner.create',
'partner.read',
'partner.update',
'partner.delete',
'person.create',
'person.read',
'person.update',
'person.delete',
'report.create',
'report.read',
'report.update',
'report.delete',
'sharedLink.create',
'sharedLink.read',
'sharedLink.update',
'sharedLink.delete',
'systemConfig.read',
'systemConfig.update',
'systemConfig.delete',
'stack.create',
'stack.read',
'stack.update',
'stack.delete',
'tag.create',
'tag.read',
'tag.update',
'tag.delete',
'user.create',
'user.read',
'user.update',
'user.delete',
'auth.changePassword',
'auth.oauth',
'album.addAsset',
'album.removeAsset',
'album.addUser',
'album.removeUser',
'asset.viewThumb',
'asset.viewPreview',
'asset.viewOriginal',
'asset.upload',
'asset.download',
'job.read',
'job.run',
'map.read',
'user.readSimple',
'user.changePassword',
'server.read',
'server.setup',
],
},
};