import 'reflect-metadata' import { SessionTokenData, TokenDecoderInterface } from '@standardnotes/security' import { RevokedSession } from '../Session/RevokedSession' import { Session } from '../Session/Session' import { SessionServiceInterface } from '../Session/SessionServiceInterface' import { User } from '../User/User' import { UserRepositoryInterface } from '../User/UserRepositoryInterface' import { AuthenticationMethodResolver } from './AuthenticationMethodResolver' import { Logger } from 'winston' describe('AuthenticationMethodResolver', () => { let userRepository: UserRepositoryInterface let sessionService: SessionServiceInterface let sessionTokenDecoder: TokenDecoderInterface let fallbackTokenDecoder: TokenDecoderInterface let user: User let session: Session let revokedSession: RevokedSession let logger: Logger const createResolver = () => new AuthenticationMethodResolver(userRepository, sessionService, sessionTokenDecoder, fallbackTokenDecoder, logger) beforeEach(() => { logger = {} as jest.Mocked logger.debug = jest.fn() user = {} as jest.Mocked session = { userUuid: '00000000-0000-0000-0000-000000000000', } as jest.Mocked revokedSession = {} as jest.Mocked userRepository = {} as jest.Mocked userRepository.findOneByUuid = jest.fn().mockReturnValue(user) sessionService = {} as jest.Mocked sessionService.getSessionFromToken = jest.fn() sessionService.getRevokedSessionFromToken = jest.fn() sessionService.markRevokedSessionAsReceived = jest.fn().mockReturnValue(revokedSession) sessionTokenDecoder = {} as jest.Mocked> sessionTokenDecoder.decodeToken = jest.fn() fallbackTokenDecoder = {} as jest.Mocked> fallbackTokenDecoder.decodeToken = jest.fn() }) it('should resolve jwt authentication method', async () => { sessionTokenDecoder.decodeToken = jest.fn().mockReturnValue({ user_uuid: '00000000-0000-0000-0000-000000000000' }) expect(await createResolver().resolve('test')).toEqual({ claims: { user_uuid: '00000000-0000-0000-0000-000000000000', }, type: 'jwt', user, }) }) it('should not resolve jwt authentication method with invalid user uuid', async () => { sessionTokenDecoder.decodeToken = jest.fn().mockReturnValue({ user_uuid: 'invalid' }) expect(await createResolver().resolve('test')).toBeUndefined }) it('should resolve session authentication method', async () => { sessionService.getSessionFromToken = jest.fn().mockReturnValue(session) expect(await createResolver().resolve('test')).toEqual({ session, type: 'session_token', user, }) }) it('should not resolve session authentication method with invalid user uuid on session', async () => { sessionService.getSessionFromToken = jest.fn().mockReturnValue({ userUuid: 'invalid' }) expect(await createResolver().resolve('test')).toBeUndefined }) it('should resolve archvied session authentication method', async () => { sessionService.getRevokedSessionFromToken = jest.fn().mockReturnValue(revokedSession) expect(await createResolver().resolve('test')).toEqual({ revokedSession, type: 'revoked', user: null, }) expect(sessionService.markRevokedSessionAsReceived).toHaveBeenCalled() }) it('should indicated that authentication method cannot be resolved', async () => { expect(await createResolver().resolve('test')).toBeUndefined }) })