InversifyExpressSessionsController.spec.ts 4.6 KB

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