diff --git a/modules/data/spec/reducers/entity-change-tracker-base.spec.ts b/modules/data/spec/reducers/entity-change-tracker-base.spec.ts index 4b85dbd5a4..8ba2c7bd5e 100644 --- a/modules/data/spec/reducers/entity-change-tracker-base.spec.ts +++ b/modules/data/spec/reducers/entity-change-tracker-base.spec.ts @@ -580,6 +580,22 @@ describe('EntityChangeTrackerBase', () => { const collection = tracker.trackDeleteMany(['1234', 456], origCollection); expect(collection).toBe(origCollection); }); + + it('should not mutate changeState when called on a tracked "updated" entity', () => { + const existingEntity = getFirstExistingEntity(); + const updatedEntity = toUpdate({ + ...existingEntity, + name: 'test update', + }); + const collection = tracker.trackUpdateOne(updatedEntity, origCollection); + const change = collection.changeState[existingEntity!.id]; + expect(change).toBeDefined(); + expectChangeType(change, ChangeType.Updated); + Object.freeze(change); + expect(() => { + tracker.trackDeleteMany([existingEntity!.id], collection); + }).not.toThrowError(); + }); }); describe('#trackUpdateOne', () => { diff --git a/modules/data/src/reducers/entity-change-tracker-base.ts b/modules/data/src/reducers/entity-change-tracker-base.ts index b748f1d267..40ac0c0399 100644 --- a/modules/data/src/reducers/entity-change-tracker-base.ts +++ b/modules/data/src/reducers/entity-change-tracker-base.ts @@ -454,7 +454,7 @@ export class EntityChangeTrackerBase implements EntityChangeTracker { } else if (trackedChange.changeType === ChangeType.Updated) { // Special case: switch change type from Updated to Deleted. cloneChgStateOnce(); - trackedChange.changeType = ChangeType.Deleted; + chgState[id] = { ...chgState[id], changeType: ChangeType.Deleted }; } } else { // Start tracking this entity