Skip to content

Commit a6ed270

Browse files
authoredMar 20, 2025
Add: tests verify behavior mutating a record (#9754)
* add: tests verify behavior mutating a related record from a checked-out record * fix: lint * fix: test * fix: lint
1 parent 1e28ed7 commit a6ed270

File tree

1 file changed

+58
-1
lines changed

1 file changed

+58
-1
lines changed
 

‎tests/warp-drive__schema-record/tests/polaris/basic-fields-field-read-test.ts

+58-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,21 @@ import { recordIdentifierFor } from '@ember-data/store';
66
import type { StableRecordIdentifier } from '@warp-drive/core-types';
77
import { Type } from '@warp-drive/core-types/symbols';
88
import type { SchemaRecord, Transformation } from '@warp-drive/schema-record';
9-
import { registerDerivations, withDefaults } from '@warp-drive/schema-record';
9+
import { Checkout, registerDerivations, withDefaults } from '@warp-drive/schema-record';
1010

1111
import type Store from 'warp-drive__schema-record/services/store';
1212

13+
type EditableUser = {
14+
readonly id: string;
15+
readonly $type: 'user';
16+
name: string;
17+
age: number;
18+
netWorth: number;
19+
coolometer: number;
20+
rank: number;
21+
readonly [Type]: 'user';
22+
};
23+
1324
interface User {
1425
id: string | null;
1526
$type: 'user';
@@ -18,6 +29,9 @@ interface User {
1829
netWorth: number;
1930
coolometer: number;
2031
rank: number;
32+
bestFriend?: User | null;
33+
[Type]: 'user';
34+
[Checkout](): Promise<EditableUser>;
2135
}
2236

2337
module('Reads | basic fields', function (hooks) {
@@ -193,4 +207,47 @@ module('Reads | basic fields', function (hooks) {
193207
assert.strictEqual(resource.attributes?.coolometer, '100.000', 'resource cache value for coolometer is correct');
194208
assert.strictEqual(resource.attributes?.rank, '0', 'resource cache value for rank is correct');
195209
});
210+
211+
test('Record is immutable without calling checkout', async function (assert) {
212+
const store = this.owner.lookup('service:store') as Store;
213+
const { schema } = store;
214+
registerDerivations(schema);
215+
216+
schema.registerResource(
217+
withDefaults({
218+
type: 'user',
219+
fields: [{ name: 'name', kind: 'field' }],
220+
})
221+
);
222+
223+
const immutableRecord = store.push<User>({
224+
data: {
225+
id: '1',
226+
type: 'user',
227+
attributes: {
228+
name: 'Rey Skybarker',
229+
},
230+
},
231+
});
232+
233+
assert.strictEqual(immutableRecord.id, '1', 'id is accessible');
234+
assert.strictEqual(immutableRecord.name, 'Rey Skybarker', 'name is accessible');
235+
236+
assert.throws(() => {
237+
immutableRecord.name = 'Gilfoyle';
238+
}, /Error: Cannot set name on user because the record is not editable/);
239+
240+
// Verify address remains unchanged
241+
assert.strictEqual(immutableRecord.name, 'Rey Skybarker', 'name remains unchanged after failed mutation attempt');
242+
243+
const editableRecord = await immutableRecord[Checkout]();
244+
editableRecord.name = 'Gilfoyle';
245+
246+
assert.strictEqual(editableRecord.name, 'Gilfoyle', 'name can be mutated after checkout');
247+
248+
// Verify cache updates
249+
const identifier = recordIdentifierFor(editableRecord);
250+
const cachedResourceData = store.cache.peek(identifier);
251+
assert.strictEqual(cachedResourceData?.attributes?.name, 'Gilfoyle', 'Cache reflects updated name after checkout');
252+
});
196253
});

0 commit comments

Comments
 (0)
Failed to load comments.