mirror of
https://github.com/immich-app/immich.git
synced 2026-04-28 03:40:46 -04:00
* feat(server): added backchannel logout api endpoint * test(server): fixed e2e tests * fix(server): fixed suggested changes by reviewer * feat(server): created function invalidateOAuth * fix(server): fixed session.repository.sql * test(server): added unit tests for backchannelLogout function * test(server): added e2e tests for oidc backchnnel logout * docs(server): added documentation on backchannel logout url * docs(server): fixed typo * feat(server): minor improvements of the oidc backchannel logout * test(server): fixed tests after merge with main * fix(server): fixed e2e test file * refactor(server): tiny refactor of validateLogoutToken * chore: cleanup * fix: tests * fix: make jwks extractable --------- Co-authored-by: Daniel Dietzler <mail@ddietzler.dev>
75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
import { JobStatus } from 'src/enum';
|
|
import { SessionService } from 'src/services/session.service';
|
|
import { AuthFactory } from 'test/factories/auth.factory';
|
|
import { SessionFactory } from 'test/factories/session.factory';
|
|
import { authStub } from 'test/fixtures/auth.stub';
|
|
import { newTestService, ServiceMocks } from 'test/utils';
|
|
|
|
describe('SessionService', () => {
|
|
let sut: SessionService;
|
|
let mocks: ServiceMocks;
|
|
|
|
beforeEach(() => {
|
|
({ sut, mocks } = newTestService(SessionService));
|
|
});
|
|
|
|
it('should be defined', () => {
|
|
expect(sut).toBeDefined();
|
|
});
|
|
|
|
describe('handleCleanup', () => {
|
|
it('should clean sessions', async () => {
|
|
mocks.session.cleanup.mockResolvedValue([]);
|
|
await expect(sut.handleCleanup()).resolves.toEqual(JobStatus.Success);
|
|
});
|
|
});
|
|
|
|
describe('getAll', () => {
|
|
it('should get the devices', async () => {
|
|
const currentSession = SessionFactory.create();
|
|
const otherSession = SessionFactory.create();
|
|
const auth = AuthFactory.from().session(currentSession).build();
|
|
|
|
mocks.session.getByUserId.mockResolvedValue([currentSession, otherSession]);
|
|
|
|
await expect(sut.getAll(auth)).resolves.toEqual([
|
|
expect.objectContaining({ current: true, id: currentSession.id }),
|
|
expect.objectContaining({ current: false, id: otherSession.id }),
|
|
]);
|
|
|
|
expect(mocks.session.getByUserId).toHaveBeenCalledWith(auth.user.id);
|
|
});
|
|
});
|
|
|
|
describe('logoutDevices', () => {
|
|
it('should logout all devices', async () => {
|
|
const currentSession = SessionFactory.create();
|
|
const auth = AuthFactory.from().session(currentSession).build();
|
|
|
|
mocks.session.invalidateAll.mockResolvedValue();
|
|
|
|
await sut.deleteAll(auth);
|
|
|
|
expect(mocks.session.invalidateAll).toHaveBeenCalledWith({
|
|
userId: auth.user.id,
|
|
excludeId: currentSession.id,
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('logoutDevice', () => {
|
|
it('should logout the device', async () => {
|
|
mocks.access.authDevice.checkOwnerAccess.mockResolvedValue(new Set(['token-1']));
|
|
mocks.session.delete.mockResolvedValue();
|
|
|
|
await sut.delete(authStub.user1, 'token-1');
|
|
|
|
expect(mocks.access.authDevice.checkOwnerAccess).toHaveBeenCalledWith(
|
|
authStub.user1.user.id,
|
|
new Set(['token-1']),
|
|
);
|
|
expect(mocks.session.delete).toHaveBeenCalledWith('token-1');
|
|
});
|
|
});
|
|
});
|