yjs.integ.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import { Types } from 'mongoose';
  2. import type { Server } from 'socket.io';
  3. import { mock } from 'vitest-mock-extended';
  4. import type { MongodbPersistence } from 'y-mongodb-provider';
  5. import { Revision } from '../models/revision';
  6. import type { IYjsService } from './yjs';
  7. import { getYjsService, initializeYjsService } from './yjs';
  8. vi.mock('y-socket.io/dist/server', () => {
  9. const YSocketIO = vi.fn();
  10. YSocketIO.prototype.initialize = vi.fn();
  11. return { YSocketIO };
  12. });
  13. const ObjectId = Types.ObjectId;
  14. const getPrivateMdbInstance = (yjsService: IYjsService): MongodbPersistence => {
  15. // eslint-disable-next-line dot-notation
  16. return yjsService['mdb'];
  17. };
  18. describe('YjsService', () => {
  19. describe('hasYdocsNewerThanLatestRevision()', () => {
  20. beforeAll(async() => {
  21. const ioMock = mock<Server>();
  22. // initialize
  23. initializeYjsService(ioMock);
  24. });
  25. afterAll(async() => {
  26. // flush revisions
  27. await Revision.deleteMany({});
  28. // flush yjs-writings
  29. const yjsService = getYjsService();
  30. const privateMdb = getPrivateMdbInstance(yjsService);
  31. await privateMdb.flushDB();
  32. });
  33. it('returns false when neither revisions nor YDocs exists', async() => {
  34. // arrange
  35. const yjsService = getYjsService();
  36. const pageId = new ObjectId();
  37. // act
  38. const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
  39. // assert
  40. expect(result).toBe(false);
  41. });
  42. it('returns true when no revisions exist', async() => {
  43. // arrange
  44. const yjsService = getYjsService();
  45. const pageId = new ObjectId();
  46. const privateMdb = getPrivateMdbInstance(yjsService);
  47. await privateMdb.setMeta(pageId.toString(), 'updatedAt', 1000);
  48. // act
  49. const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
  50. // assert
  51. expect(result).toBe(true);
  52. });
  53. it('returns false when the latest revision is newer than meta data', async() => {
  54. // arrange
  55. const yjsService = getYjsService();
  56. const pageId = new ObjectId();
  57. await Revision.insertMany([
  58. { pageId, body: '' },
  59. ]);
  60. const privateMdb = getPrivateMdbInstance(yjsService);
  61. await privateMdb.setMeta(pageId.toString(), 'updatedAt', (new Date(2024, 1, 1)).getTime());
  62. // act
  63. const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
  64. // assert
  65. expect(result).toBe(false);
  66. });
  67. it('returns false when no YDocs exist', async() => {
  68. // arrange
  69. const yjsService = getYjsService();
  70. const pageId = new ObjectId();
  71. await Revision.insertMany([
  72. { pageId, body: '' },
  73. ]);
  74. // act
  75. const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
  76. // assert
  77. expect(result).toBe(false);
  78. });
  79. it('returns true when the newer YDocs exist', async() => {
  80. // arrange
  81. const yjsService = getYjsService();
  82. const pageId = new ObjectId();
  83. await Revision.insertMany([
  84. { pageId, body: '' },
  85. ]);
  86. const privateMdb = getPrivateMdbInstance(yjsService);
  87. await privateMdb.setMeta(pageId.toString(), 'updatedAt', (new Date(2034, 1, 1)).getTime());
  88. // act
  89. const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
  90. // assert
  91. expect(result).toBe(true);
  92. });
  93. });
  94. });