| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- import { Types } from 'mongoose';
- import type { Server } from 'socket.io';
- import { mock } from 'vitest-mock-extended';
- import type { MongodbPersistence } from 'y-mongodb-provider';
- import { Revision } from '../models/revision';
- import type { IYjsService } from './yjs';
- import { getYjsService, initializeYjsService } from './yjs';
- vi.mock('y-socket.io/dist/server', () => {
- const YSocketIO = vi.fn();
- YSocketIO.prototype.initialize = vi.fn();
- return { YSocketIO };
- });
- const ObjectId = Types.ObjectId;
- const getPrivateMdbInstance = (yjsService: IYjsService): MongodbPersistence => {
- // eslint-disable-next-line dot-notation
- return yjsService['mdb'];
- };
- describe('YjsService', () => {
- describe('hasYdocsNewerThanLatestRevision()', () => {
- beforeAll(async() => {
- const ioMock = mock<Server>();
- // initialize
- initializeYjsService(ioMock);
- });
- afterAll(async() => {
- // flush revisions
- await Revision.deleteMany({});
- // flush yjs-writings
- const yjsService = getYjsService();
- const privateMdb = getPrivateMdbInstance(yjsService);
- await privateMdb.flushDB();
- });
- it('returns false when neither revisions nor YDocs exists', async() => {
- // arrange
- const yjsService = getYjsService();
- const pageId = new ObjectId();
- // act
- const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
- // assert
- expect(result).toBe(false);
- });
- it('returns true when no revisions exist', async() => {
- // arrange
- const yjsService = getYjsService();
- const pageId = new ObjectId();
- const privateMdb = getPrivateMdbInstance(yjsService);
- await privateMdb.setMeta(pageId.toString(), 'updatedAt', 1000);
- // act
- const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
- // assert
- expect(result).toBe(true);
- });
- it('returns false when the latest revision is newer than meta data', async() => {
- // arrange
- const yjsService = getYjsService();
- const pageId = new ObjectId();
- await Revision.insertMany([
- { pageId, body: '' },
- ]);
- const privateMdb = getPrivateMdbInstance(yjsService);
- await privateMdb.setMeta(pageId.toString(), 'updatedAt', (new Date(2024, 1, 1)).getTime());
- // act
- const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
- // assert
- expect(result).toBe(false);
- });
- it('returns false when no YDocs exist', async() => {
- // arrange
- const yjsService = getYjsService();
- const pageId = new ObjectId();
- await Revision.insertMany([
- { pageId, body: '' },
- ]);
- // act
- const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
- // assert
- expect(result).toBe(false);
- });
- it('returns true when the newer YDocs exist', async() => {
- // arrange
- const yjsService = getYjsService();
- const pageId = new ObjectId();
- await Revision.insertMany([
- { pageId, body: '' },
- ]);
- const privateMdb = getPrivateMdbInstance(yjsService);
- await privateMdb.setMeta(pageId.toString(), 'updatedAt', (new Date(2034, 1, 1)).getTime());
- // act
- const result = await yjsService.hasYdocsNewerThanLatestRevision(pageId.toString());
- // assert
- expect(result).toBe(true);
- });
- });
- });
|