Skip to content

Commit 66029aa

Browse files
committed
Real-time collaboration: [no-pr] Do not call saveRecord when persistence is not supported
* Real-time collaboration: Do not call saveRecord when persistence is not supported * Update unit tests * DRY up mocks
1 parent 51e6548 commit 66029aa

File tree

2 files changed

+22
-92
lines changed

2 files changed

+22
-92
lines changed

packages/sync/src/manager.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,11 @@ export function createSyncManager(): SyncManager {
172172
syncConfig.applyChangesToCRDTDoc( ydoc, record );
173173
}, LOCAL_SYNC_MANAGER_ORIGIN );
174174

175-
const meta = createEntityMeta( objectType, objectId );
176-
handlers.editRecord( { meta } );
177-
handlers.saveRecord();
175+
// If the entity support CRDT persistence, trigger a save. The entity
176+
// will call `createEntityMeta` via its pre-persist hook.
177+
if ( syncConfig.supports?.crdtPersistence ) {
178+
handlers.saveRecord();
179+
}
178180
}
179181
}
180182

@@ -417,7 +419,7 @@ export function createSyncManager(): SyncManager {
417419
const entityId = getEntityId( objectType, objectId );
418420
const entityState = entityStates.get( entityId );
419421

420-
if ( ! entityState?.syncConfig.supports?.crdtPersistence ) {
422+
if ( ! entityState ) {
421423
return {};
422424
}
423425

packages/sync/src/test/manager.ts

Lines changed: 16 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import {
2222
CRDT_RECORD_METADATA_MAP_KEY as RECORD_METADATA_MAP_KEY,
2323
CRDT_RECORD_METADATA_SAVED_AT_KEY as SAVED_AT_KEY,
2424
CRDT_RECORD_METADATA_SAVED_BY_KEY as SAVED_BY_KEY,
25-
WORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE,
2625
} from '../config';
2726
import { createPersistedCRDTDoc } from '../persistence';
2827
import { getProviderCreators } from '../providers';
@@ -48,6 +47,9 @@ describe( 'SyncManager', () => {
4847
let mockRecord: ObjectData;
4948
let mockSyncConfig: jest.MockedObject< SyncConfig >;
5049

50+
// Capture the Y.Doc from provider creator
51+
let capturedDoc: Y.Doc | null = null;
52+
5153
beforeEach( () => {
5254
// Reset all mocks
5355
jest.clearAllMocks();
@@ -60,8 +62,15 @@ describe( 'SyncManager', () => {
6062
mockProviderResult = {
6163
destroy: jest.fn(),
6264
};
63-
mockProviderCreator = jest.fn( () =>
64-
Promise.resolve( mockProviderResult )
65+
mockProviderCreator = jest.fn(
66+
async (
67+
_objectType: string,
68+
_objectId: string | null,
69+
ydoc: Y.Doc
70+
) => {
71+
capturedDoc = ydoc;
72+
return mockProviderResult;
73+
}
6574
);
6675
mockGetProviderCreators.mockReturnValue( [ mockProviderCreator ] );
6776

@@ -91,6 +100,7 @@ describe( 'SyncManager', () => {
91100
getEditedRecord: jest.fn( async () =>
92101
Promise.resolve( mockRecord )
93102
),
103+
refetchRecord: jest.fn( async () => Promise.resolve() ),
94104
saveRecord: jest.fn( async () => Promise.resolve() ),
95105
};
96106
} );
@@ -284,13 +294,6 @@ describe( 'SyncManager', () => {
284294
).not.toHaveBeenCalled();
285295

286296
// Verify a save operation occurred.
287-
expect( mockHandlers.editRecord ).toHaveBeenCalledTimes( 1 );
288-
expect( mockHandlers.editRecord ).toHaveBeenCalledWith( {
289-
meta: {
290-
[ WORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE ]:
291-
expect.any( String ),
292-
},
293-
} );
294297
expect( mockHandlers.saveRecord ).toHaveBeenCalledTimes( 1 );
295298
} );
296299

@@ -377,13 +380,6 @@ describe( 'SyncManager', () => {
377380
).toHaveBeenCalledWith( expect.any( Y.Doc ), record );
378381

379382
// Verify a save operation occurred.
380-
expect( mockHandlers.editRecord ).toHaveBeenCalledTimes( 1 );
381-
expect( mockHandlers.editRecord ).toHaveBeenCalledWith( {
382-
meta: {
383-
[ WORDPRESS_META_KEY_FOR_CRDT_DOC_PERSISTENCE ]:
384-
expect.any( String ),
385-
},
386-
} );
387383
expect( mockHandlers.saveRecord ).toHaveBeenCalledTimes( 1 );
388384
} );
389385

@@ -425,12 +421,9 @@ describe( 'SyncManager', () => {
425421
mockSyncConfig.getChangesFromCRDTDoc
426422
).not.toHaveBeenCalled();
427423

428-
// Verify a save operation occurred.
429-
expect( mockHandlers.editRecord ).toHaveBeenCalledTimes( 1 );
430-
expect( mockHandlers.editRecord ).toHaveBeenCalledWith( {
431-
meta: {},
432-
} );
433-
expect( mockHandlers.saveRecord ).toHaveBeenCalledTimes( 1 );
424+
// Verify that meta was not added and no save operation occurred.
425+
expect( mockHandlers.editRecord ).not.toHaveBeenCalled();
426+
expect( mockHandlers.saveRecord ).not.toHaveBeenCalled();
434427
} );
435428
} );
436429
} );
@@ -523,19 +516,6 @@ describe( 'SyncManager', () => {
523516

524517
describe( 'update', () => {
525518
it( 'updates CRDT document with local changes', async () => {
526-
// Capture the Y.Doc from provider creator
527-
let capturedDoc: Y.Doc | null = null;
528-
mockProviderCreator.mockImplementation(
529-
async (
530-
_objectType: string,
531-
_objectId: string,
532-
ydoc: Y.Doc
533-
) => {
534-
capturedDoc = ydoc;
535-
return mockProviderResult;
536-
}
537-
);
538-
539519
const manager = createSyncManager();
540520

541521
await manager.load(
@@ -576,19 +556,6 @@ describe( 'SyncManager', () => {
576556
} );
577557

578558
it( 'applies changes with specified origin', async () => {
579-
// Capture the Y.Doc from provider creator
580-
let capturedDoc: Y.Doc | null = null;
581-
mockProviderCreator.mockImplementation(
582-
async (
583-
_objectType: string,
584-
_objectId: string,
585-
ydoc: Y.Doc
586-
) => {
587-
capturedDoc = ydoc;
588-
return mockProviderResult;
589-
}
590-
);
591-
592559
const manager = createSyncManager();
593560

594561
await manager.load(
@@ -620,19 +587,6 @@ describe( 'SyncManager', () => {
620587
} );
621588

622589
it( 'updates the record metadata when the update is associated with a save', async () => {
623-
// Capture the Y.Doc from provider creator.
624-
let capturedDoc: Y.Doc | null = null;
625-
mockProviderCreator.mockImplementation(
626-
async (
627-
_objectType: string,
628-
_objectId: string,
629-
ydoc: Y.Doc
630-
) => {
631-
capturedDoc = ydoc;
632-
return mockProviderResult;
633-
}
634-
);
635-
636590
const manager = createSyncManager();
637591

638592
await manager.load(
@@ -668,19 +622,6 @@ describe( 'SyncManager', () => {
668622

669623
describe( 'CRDT doc observation', () => {
670624
it( 'edits the local entity record when remote updates arrive', async () => {
671-
// Capture the Y.Doc from provider creator.
672-
let capturedDoc: Y.Doc | null = null;
673-
mockProviderCreator.mockImplementation(
674-
async (
675-
_objectType: string,
676-
_objectId: string,
677-
ydoc: Y.Doc
678-
) => {
679-
capturedDoc = ydoc;
680-
return mockProviderResult;
681-
}
682-
);
683-
684625
const manager = createSyncManager();
685626

686627
await manager.load(
@@ -717,19 +658,6 @@ describe( 'SyncManager', () => {
717658
} );
718659

719660
it( 'does not edit the local record for local transactions', async () => {
720-
// Capture the Y.Doc from provider creator.
721-
let capturedDoc: Y.Doc | null = null;
722-
mockProviderCreator.mockImplementation(
723-
async (
724-
_objectType: string,
725-
_objectId: string,
726-
ydoc: Y.Doc
727-
) => {
728-
capturedDoc = ydoc;
729-
return mockProviderResult;
730-
}
731-
);
732-
733661
const manager = createSyncManager();
734662

735663
await manager.load(

0 commit comments

Comments
 (0)