certify-shared-page-attachment.spec.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import type { Response } from 'express';
  2. import { mock } from 'vitest-mock-extended';
  3. import type { ShareLinkDocument } from '~/server/models/share-link';
  4. import {
  5. certifySharedPageAttachmentMiddleware,
  6. type RequestToAllowShareLink,
  7. } from './certify-shared-page-attachment';
  8. import type { ValidReferer } from './interfaces';
  9. const mocks = vi.hoisted(() => {
  10. return {
  11. validateRefererMock: vi.fn(),
  12. retrieveValidShareLinkByRefererMock: vi.fn(),
  13. validateAttachmentMock: vi.fn(),
  14. };
  15. });
  16. vi.mock('./validate-referer', () => ({
  17. validateReferer: mocks.validateRefererMock,
  18. }));
  19. vi.mock('./retrieve-valid-share-link', () => ({
  20. retrieveValidShareLinkByReferer: mocks.retrieveValidShareLinkByRefererMock,
  21. }));
  22. vi.mock('./validate-attachment', () => ({
  23. validateAttachment: mocks.validateAttachmentMock,
  24. }));
  25. describe('certifySharedPageAttachmentMiddleware', () => {
  26. const res = mock<Response>();
  27. const next = vi.fn();
  28. describe('should called next() without req.isSharedPage set', () => {
  29. it('when the fileId param is null', async () => {
  30. // setup
  31. const req = mock<RequestToAllowShareLink>();
  32. req.params = {}; // id: undefined
  33. req.headers = {};
  34. // when
  35. await certifySharedPageAttachmentMiddleware(req, res, next);
  36. // then
  37. expect(mocks.validateRefererMock).not.toHaveBeenCalled();
  38. expect(req.isSharedPage === true).toBeFalsy();
  39. expect(next).toHaveBeenCalledOnce();
  40. });
  41. it('when validateReferer returns null', async () => {
  42. // setup
  43. const req = mock<RequestToAllowShareLink>();
  44. req.params = { id: 'file id string' };
  45. req.headers = { referer: 'referer string' };
  46. // when
  47. await certifySharedPageAttachmentMiddleware(req, res, next);
  48. // then
  49. expect(mocks.validateRefererMock).toHaveBeenCalledOnce();
  50. expect(mocks.validateRefererMock).toHaveBeenCalledWith('referer string');
  51. expect(req.isSharedPage === true).toBeFalsy();
  52. expect(next).toHaveBeenCalledOnce();
  53. });
  54. it('when retrieveValidShareLinkByReferer returns null', async () => {
  55. // setup
  56. const req = mock<RequestToAllowShareLink>();
  57. req.params = { id: 'file id string' };
  58. req.headers = { referer: 'referer string' };
  59. const validReferer: ValidReferer = {
  60. referer: 'referer string',
  61. shareLinkId: 'ffffffffffffffffffffffff',
  62. };
  63. mocks.validateRefererMock.mockImplementation(() => validReferer);
  64. mocks.retrieveValidShareLinkByRefererMock.mockResolvedValue(null);
  65. // when
  66. await certifySharedPageAttachmentMiddleware(req, res, next);
  67. // then
  68. expect(mocks.validateRefererMock).toHaveBeenCalledOnce();
  69. expect(mocks.validateRefererMock).toHaveBeenCalledWith('referer string');
  70. expect(mocks.retrieveValidShareLinkByRefererMock).toHaveBeenCalledOnce();
  71. expect(mocks.retrieveValidShareLinkByRefererMock).toHaveBeenCalledWith(
  72. validReferer,
  73. );
  74. expect(req.isSharedPage === true).toBeFalsy();
  75. expect(next).toHaveBeenCalledOnce();
  76. });
  77. it('when validateAttachment returns false', async () => {
  78. // setup
  79. const req = mock<RequestToAllowShareLink>();
  80. req.params = { id: 'file id string' };
  81. req.headers = { referer: 'referer string' };
  82. const validReferer = vi.fn();
  83. mocks.validateRefererMock.mockImplementation(() => validReferer);
  84. const shareLinkMock = mock<ShareLinkDocument>();
  85. mocks.retrieveValidShareLinkByRefererMock.mockResolvedValue(
  86. shareLinkMock,
  87. );
  88. mocks.validateAttachmentMock.mockResolvedValue(false);
  89. // when
  90. await certifySharedPageAttachmentMiddleware(req, res, next);
  91. // then
  92. expect(mocks.validateRefererMock).toHaveBeenCalledOnce();
  93. expect(mocks.validateRefererMock).toHaveBeenCalledWith('referer string');
  94. expect(mocks.retrieveValidShareLinkByRefererMock).toHaveBeenCalledOnce();
  95. expect(mocks.retrieveValidShareLinkByRefererMock).toHaveBeenCalledWith(
  96. validReferer,
  97. );
  98. expect(mocks.validateAttachmentMock).toHaveBeenCalledOnce();
  99. expect(mocks.validateAttachmentMock).toHaveBeenCalledWith(
  100. 'file id string',
  101. shareLinkMock,
  102. );
  103. expect(req.isSharedPage === true).toBeFalsy();
  104. expect(next).toHaveBeenCalledOnce();
  105. });
  106. });
  107. it('should set req.isSharedPage true', async () => {
  108. // setup
  109. const req = mock<RequestToAllowShareLink>();
  110. req.params = { id: 'file id string' };
  111. req.headers = { referer: 'referer string' };
  112. const validReferer = vi.fn();
  113. mocks.validateRefererMock.mockImplementation(() => validReferer);
  114. const shareLinkMock = mock<ShareLinkDocument>();
  115. mocks.retrieveValidShareLinkByRefererMock.mockResolvedValue(shareLinkMock);
  116. mocks.validateAttachmentMock.mockResolvedValue(true);
  117. // when
  118. await certifySharedPageAttachmentMiddleware(req, res, next);
  119. // then
  120. expect(mocks.validateRefererMock).toHaveBeenCalledOnce();
  121. expect(mocks.validateRefererMock).toHaveBeenCalledWith('referer string');
  122. expect(mocks.retrieveValidShareLinkByRefererMock).toHaveBeenCalledOnce();
  123. expect(mocks.retrieveValidShareLinkByRefererMock).toHaveBeenCalledWith(
  124. validReferer,
  125. );
  126. expect(mocks.validateAttachmentMock).toHaveBeenCalledOnce();
  127. expect(mocks.validateAttachmentMock).toHaveBeenCalledWith(
  128. 'file id string',
  129. shareLinkMock,
  130. );
  131. expect(req.isSharedPage === true).toBeTruthy();
  132. expect(next).toHaveBeenCalledOnce();
  133. });
  134. });