AnnotatedSessionsController.spec.ts 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import 'reflect-metadata'
  2. import * as express from 'express'
  3. import { AnnotatedSessionsController } from './AnnotatedSessionsController'
  4. import { results } from 'inversify-express-utils'
  5. import { User } from '@standardnotes/responses'
  6. import { AuthenticateRequest } from '../../Domain/UseCase/AuthenticateRequest'
  7. import { CreateCrossServiceToken } from '../../Domain/UseCase/CreateCrossServiceToken/CreateCrossServiceToken'
  8. import { GetActiveSessionsForUser } from '../../Domain/UseCase/GetActiveSessionsForUser'
  9. import { ProjectorInterface } from '../../Projection/ProjectorInterface'
  10. import { Session } from '../../Domain/Session/Session'
  11. describe('AnnotatedSessionsController', () => {
  12. let getActiveSessionsForUser: GetActiveSessionsForUser
  13. let authenticateRequest: AuthenticateRequest
  14. let sessionProjector: ProjectorInterface<Session>
  15. let session: Session
  16. let request: express.Request
  17. let response: express.Response
  18. let user: User
  19. let createCrossServiceToken: CreateCrossServiceToken
  20. const createController = () =>
  21. new AnnotatedSessionsController(
  22. getActiveSessionsForUser,
  23. authenticateRequest,
  24. sessionProjector,
  25. createCrossServiceToken,
  26. )
  27. beforeEach(() => {
  28. session = {} as jest.Mocked<Session>
  29. user = {} as jest.Mocked<User>
  30. getActiveSessionsForUser = {} as jest.Mocked<GetActiveSessionsForUser>
  31. getActiveSessionsForUser.execute = jest.fn().mockReturnValue({ sessions: [session] })
  32. authenticateRequest = {} as jest.Mocked<AuthenticateRequest>
  33. authenticateRequest.execute = jest.fn()
  34. sessionProjector = {} as jest.Mocked<ProjectorInterface<Session>>
  35. sessionProjector.projectCustom = jest.fn().mockReturnValue({ foo: 'bar' })
  36. createCrossServiceToken = {} as jest.Mocked<CreateCrossServiceToken>
  37. createCrossServiceToken.execute = jest.fn().mockReturnValue({ token: 'foobar' })
  38. request = {
  39. params: {},
  40. headers: {},
  41. } as jest.Mocked<express.Request>
  42. response = {
  43. locals: {},
  44. } as jest.Mocked<express.Response>
  45. })
  46. it('should get all active sessions for current user', async () => {
  47. response.locals = {
  48. user: {
  49. uuid: '123',
  50. },
  51. session: {
  52. uuid: '234',
  53. },
  54. }
  55. const httpResponse = await createController().getSessions(request, response)
  56. expect(httpResponse).toBeInstanceOf(results.JsonResult)
  57. const result = await httpResponse.executeAsync()
  58. expect(await result.content.readAsStringAsync()).toEqual('[{"foo":"bar"}]')
  59. })
  60. it('should validate a session from an incoming request', async () => {
  61. authenticateRequest.execute = jest.fn().mockReturnValue({
  62. success: true,
  63. user,
  64. session,
  65. })
  66. request.headers.authorization = 'test'
  67. const httpResponse = await createController().validate(request)
  68. expect(httpResponse).toBeInstanceOf(results.JsonResult)
  69. const result = await httpResponse.executeAsync()
  70. const httpResponseContent = await result.content.readAsStringAsync()
  71. const httpResponseJSON = JSON.parse(httpResponseContent)
  72. expect(httpResponseJSON.authToken).toEqual('foobar')
  73. })
  74. it('should validate a user from an incoming request', async () => {
  75. authenticateRequest.execute = jest.fn().mockReturnValue({
  76. success: true,
  77. user,
  78. })
  79. request.headers.authorization = 'test'
  80. const httpResponse = await createController().validate(request)
  81. expect(httpResponse).toBeInstanceOf(results.JsonResult)
  82. const result = await httpResponse.executeAsync()
  83. const httpResponseContent = await result.content.readAsStringAsync()
  84. const httpResponseJSON = JSON.parse(httpResponseContent)
  85. expect(httpResponseJSON.authToken).toEqual('foobar')
  86. })
  87. it('should not validate a session from an incoming request', async () => {
  88. authenticateRequest.execute = jest.fn().mockReturnValue({
  89. success: false,
  90. errorTag: 'invalid-auth',
  91. errorMessage: 'Invalid login credentials.',
  92. responseCode: 401,
  93. })
  94. request.headers.authorization = 'test'
  95. const httpResponse = await createController().validate(request)
  96. expect(httpResponse).toBeInstanceOf(results.JsonResult)
  97. expect(httpResponse.statusCode).toEqual(401)
  98. const result = await httpResponse.executeAsync()
  99. expect(await result.content.readAsStringAsync()).toEqual(
  100. '{"error":{"tag":"invalid-auth","message":"Invalid login credentials."}}',
  101. )
  102. })
  103. })