validate-share-link.spec.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import type { HydratedDocument } from 'mongoose';
  2. import { beforeEach, describe, expect, it, vi } from 'vitest';
  3. import type { ShareLinkDocument } from '~/server/models/share-link';
  4. import { validateShareLink } from './validate-share-link';
  5. describe('validateShareLink', () => {
  6. const mockShareLinkId = '507f1f77bcf86cd799439011';
  7. const mockPageId = '507f1f77bcf86cd799439012';
  8. describe('success case', () => {
  9. it('should return success result when ShareLink exists, relatedPage matches, and is not expired', async () => {
  10. // Arrange
  11. const mockShareLink = {
  12. _id: mockShareLinkId,
  13. relatedPage: mockPageId,
  14. isExpired: () => false,
  15. } as unknown as HydratedDocument<ShareLinkDocument>;
  16. const mockFindOne = vi.fn().mockResolvedValue(mockShareLink);
  17. const mockShareLinkModel = { findOne: mockFindOne } as any;
  18. // Act
  19. const result = await validateShareLink(
  20. mockShareLinkModel,
  21. mockShareLinkId,
  22. mockPageId,
  23. );
  24. // Assert
  25. expect(result.type).toBe('success');
  26. if (result.type === 'success') {
  27. expect(result.shareLink).toEqual(mockShareLink);
  28. }
  29. expect(mockFindOne).toHaveBeenCalledWith({
  30. _id: mockShareLinkId,
  31. relatedPage: mockPageId,
  32. });
  33. });
  34. });
  35. describe('not-found case', () => {
  36. it('should return not-found result when ShareLink does not exist', async () => {
  37. // Arrange
  38. const mockFindOne = vi.fn().mockResolvedValue(null);
  39. const mockShareLinkModel = { findOne: mockFindOne } as any;
  40. // Act
  41. const result = await validateShareLink(
  42. mockShareLinkModel,
  43. mockShareLinkId,
  44. mockPageId,
  45. );
  46. // Assert
  47. expect(result.type).toBe('not-found');
  48. });
  49. it('should return not-found result when relatedPage does not match', async () => {
  50. // Arrange
  51. const anotherPageId = '507f1f77bcf86cd799439099';
  52. const mockShareLink = {
  53. _id: mockShareLinkId,
  54. relatedPage: anotherPageId,
  55. isExpired: () => false,
  56. } as unknown as HydratedDocument<ShareLinkDocument>;
  57. const mockFindOne = vi.fn().mockResolvedValue(null);
  58. const mockShareLinkModel = { findOne: mockFindOne } as any;
  59. // Act
  60. const result = await validateShareLink(
  61. mockShareLinkModel,
  62. mockShareLinkId,
  63. mockPageId,
  64. );
  65. // Assert
  66. expect(result.type).toBe('not-found');
  67. });
  68. });
  69. describe('expired case', () => {
  70. it('should return expired result when ShareLink is expired', async () => {
  71. // Arrange
  72. const mockShareLink = {
  73. _id: mockShareLinkId,
  74. relatedPage: mockPageId,
  75. isExpired: () => true,
  76. } as unknown as HydratedDocument<ShareLinkDocument>;
  77. const mockFindOne = vi.fn().mockResolvedValue(mockShareLink);
  78. const mockShareLinkModel = { findOne: mockFindOne } as any;
  79. // Act
  80. const result = await validateShareLink(
  81. mockShareLinkModel,
  82. mockShareLinkId,
  83. mockPageId,
  84. );
  85. // Assert
  86. expect(result.type).toBe('expired');
  87. });
  88. });
  89. });