@@ -6,10 +6,21 @@ import { recordIdentifierFor } from '@ember-data/store';
6
6
import type { StableRecordIdentifier } from '@warp-drive/core-types' ;
7
7
import { Type } from '@warp-drive/core-types/symbols' ;
8
8
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' ;
10
10
11
11
import type Store from 'warp-drive__schema-record/services/store' ;
12
12
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
+
13
24
interface User {
14
25
id : string | null ;
15
26
$type : 'user' ;
@@ -18,6 +29,9 @@ interface User {
18
29
netWorth : number ;
19
30
coolometer : number ;
20
31
rank : number ;
32
+ bestFriend ?: User | null ;
33
+ [ Type ] : 'user' ;
34
+ [ Checkout ] ( ) : Promise < EditableUser > ;
21
35
}
22
36
23
37
module ( 'Reads | basic fields' , function ( hooks ) {
@@ -193,4 +207,47 @@ module('Reads | basic fields', function (hooks) {
193
207
assert . strictEqual ( resource . attributes ?. coolometer , '100.000' , 'resource cache value for coolometer is correct' ) ;
194
208
assert . strictEqual ( resource . attributes ?. rank , '0' , 'resource cache value for rank is correct' ) ;
195
209
} ) ;
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
+ } , / E r r o r : C a n n o t s e t n a m e o n u s e r b e c a u s e t h e r e c o r d i s n o t e d i t a b l e / ) ;
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
+ } ) ;
196
253
} ) ;
0 commit comments