validate-referer.spec.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. import { objectIdUtils } from '@growi/core/dist/utils';
  2. import { validateReferer } from './validate-referer';
  3. const mocks = vi.hoisted(() => {
  4. return {
  5. retrieveSiteUrlMock: vi.fn(),
  6. };
  7. });
  8. vi.mock('./retrieve-site-url', () => ({ retrieveSiteUrl: mocks.retrieveSiteUrlMock }));
  9. describe('validateReferer', () => {
  10. const isValidObjectIdSpy = vi.spyOn(objectIdUtils, 'isValidObjectId');
  11. beforeEach(() => {
  12. isValidObjectIdSpy.mockClear();
  13. });
  14. describe('refurns false', () => {
  15. it('when the referer argument is undefined', () => {
  16. // setup
  17. // when
  18. const result = validateReferer(undefined);
  19. // then
  20. expect(result).toBeFalsy();
  21. expect(mocks.retrieveSiteUrlMock).not.toHaveBeenCalled();
  22. expect(isValidObjectIdSpy).not.toHaveBeenCalled();
  23. });
  24. it('when the referer is invalid', () => {
  25. // when
  26. const result = validateReferer('invalid URL');
  27. // then
  28. expect(result).toBeFalsy();
  29. expect(mocks.retrieveSiteUrlMock).not.toHaveBeenCalledOnce();
  30. expect(isValidObjectIdSpy).not.toHaveBeenCalled();
  31. });
  32. it('when the siteUrl returns null', () => {
  33. // setup
  34. mocks.retrieveSiteUrlMock.mockImplementation(() => {
  35. return null;
  36. });
  37. // when
  38. const refererString = 'https://example.org/share/xxxxx';
  39. const result = validateReferer(refererString);
  40. // then
  41. expect(result).toBeFalsy();
  42. expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
  43. expect(isValidObjectIdSpy).not.toHaveBeenCalled();
  44. });
  45. it('when the hostname of the referer does not match with siteUrl', () => {
  46. // setup
  47. mocks.retrieveSiteUrlMock.mockImplementation(() => {
  48. return new URL('https://example.com');
  49. });
  50. // when
  51. const refererString = 'https://example.org/share/xxxxx';
  52. const result = validateReferer(refererString);
  53. // then
  54. expect(result).toBeFalsy();
  55. expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
  56. expect(isValidObjectIdSpy).not.toHaveBeenCalled();
  57. });
  58. it('when the port of the referer does not match with siteUrl', () => {
  59. // setup
  60. mocks.retrieveSiteUrlMock.mockImplementation(() => {
  61. return new URL('https://example.com');
  62. });
  63. // when
  64. const refererString = 'https://example.com:8080/share/xxxxx';
  65. const result = validateReferer(refererString);
  66. // then
  67. expect(result).toBeFalsy();
  68. expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
  69. expect(isValidObjectIdSpy).not.toHaveBeenCalled();
  70. });
  71. it('when the shareLinkId is invalid', () => {
  72. // setup
  73. mocks.retrieveSiteUrlMock.mockImplementation(() => {
  74. return new URL('https://example.com');
  75. });
  76. // when
  77. const refererString = 'https://example.com/share/FFFFFFFFFFFFFFFFFFFFFFFF';
  78. const result = validateReferer(refererString);
  79. // then
  80. expect(result).toBeFalsy();
  81. expect(mocks.retrieveSiteUrlMock).toHaveBeenCalledOnce();
  82. expect(isValidObjectIdSpy).toHaveBeenCalledOnce();
  83. });
  84. });
  85. it('returns ValidReferer instance', () => {
  86. // setup
  87. mocks.retrieveSiteUrlMock.mockImplementation(() => {
  88. return new URL('https://example.com');
  89. });
  90. // when
  91. const shareLinkId = '65436ba09ae6983bd608b89c';
  92. const refererString = `https://example.com/share/${shareLinkId}`;
  93. const result = validateReferer(refererString);
  94. // then
  95. expect(result).toStrictEqual({
  96. referer: refererString,
  97. shareLinkId,
  98. });
  99. });
  100. });