@@ -229,6 +229,181 @@ describe('Parse Object', () => {
229229 } ) ;
230230 } ) ;
231231
232+ it ( 'can increment nested fields' , async ( ) => {
233+ const obj = new TestObject ( ) ;
234+ obj . set ( 'objectField' , { number : 5 } ) ;
235+ assert . equal ( obj . get ( 'objectField' ) . number , 5 ) ;
236+ await obj . save ( ) ;
237+
238+ obj . increment ( 'objectField.number' , 15 ) ;
239+ assert . equal ( obj . get ( 'objectField' ) . number , 20 ) ;
240+ await obj . save ( ) ;
241+
242+ assert . equal ( obj . get ( 'objectField' ) . number , 20 ) ;
243+
244+ const query = new Parse . Query ( TestObject ) ;
245+ const result = await query . get ( obj . id ) ;
246+ assert . equal ( result . get ( 'objectField' ) . number , 20 ) ;
247+ } ) ;
248+
249+ it ( 'can increment non existing field' , async ( ) => {
250+ const obj = new TestObject ( ) ;
251+ obj . set ( 'objectField' , { number : 5 } ) ;
252+ await obj . save ( ) ;
253+
254+ obj . increment ( 'objectField.unknown' , 15 ) ;
255+ assert . deepEqual ( obj . get ( 'objectField' ) , {
256+ number : 5 ,
257+ unknown : 15 ,
258+ } ) ;
259+ await obj . save ( ) ;
260+
261+ const query = new Parse . Query ( TestObject ) ;
262+ const result = await query . get ( obj . id ) ;
263+ assert . equal ( result . get ( 'objectField' ) . number , 5 ) ;
264+ assert . equal ( result . get ( 'objectField' ) . unknown , 15 ) ;
265+ } ) ;
266+
267+ it ( 'can increment nested fields two levels' , async ( ) => {
268+ const obj = new TestObject ( ) ;
269+ obj . set ( 'objectField' , { foo : { bar : 5 } } ) ;
270+ assert . equal ( obj . get ( 'objectField' ) . foo . bar , 5 ) ;
271+ await obj . save ( ) ;
272+
273+ obj . increment ( 'objectField.foo.bar' , 15 ) ;
274+ assert . equal ( obj . get ( 'objectField' ) . foo . bar , 20 ) ;
275+ await obj . save ( ) ;
276+
277+ assert . equal ( obj . get ( 'objectField' ) . foo . bar , 20 ) ;
278+
279+ const query = new Parse . Query ( TestObject ) ;
280+ const result = await query . get ( obj . id ) ;
281+ assert . equal ( result . get ( 'objectField' ) . foo . bar , 20 ) ;
282+ } ) ;
283+
284+ it ( 'can increment nested fields without object' , async ( ) => {
285+ const obj = new TestObject ( ) ;
286+ obj . set ( 'hello' , 'world' ) ;
287+ await obj . save ( ) ;
288+
289+ obj . increment ( 'hello.dot' , 15 ) ;
290+ try {
291+ await obj . save ( ) ;
292+ assert . equal ( false , true ) ;
293+ } catch ( error ) {
294+ assert . equal ( error . message , "Cannot create property 'dot' on string 'world'" ) ;
295+ }
296+ } ) ;
297+
298+ it ( 'can set nested fields' , async ( ) => {
299+ const obj = new TestObject ( { objectField : { number : 5 } } ) ;
300+ assert . equal ( obj . get ( 'objectField' ) . number , 5 ) ;
301+ await obj . save ( ) ;
302+
303+ assert . equal ( obj . get ( 'objectField' ) . number , 5 ) ;
304+ obj . set ( 'objectField.number' , 20 ) ;
305+ assert . equal ( obj . get ( 'objectField' ) . number , 20 ) ;
306+ await obj . save ( ) ;
307+
308+ const query = new Parse . Query ( TestObject ) ;
309+ const result = await query . get ( obj . id ) ;
310+ assert . equal ( result . get ( 'objectField' ) . number , 20 ) ;
311+ } ) ;
312+
313+ it ( 'can set non existing fields' , async ( ) => {
314+ const obj = new TestObject ( ) ;
315+ obj . set ( 'objectField' , { number : 5 } ) ;
316+ await obj . save ( ) ;
317+
318+ obj . set ( 'objectField.unknown' , 20 ) ;
319+ await obj . save ( ) ;
320+ const query = new Parse . Query ( TestObject ) ;
321+ const result = await query . get ( obj . id ) ;
322+ assert . equal ( result . get ( 'objectField' ) . number , 5 ) ;
323+ assert . equal ( result . get ( 'objectField' ) . unknown , 20 ) ;
324+ } ) ;
325+
326+ it ( 'ignore set nested fields on new object' , async ( ) => {
327+ const obj = new TestObject ( ) ;
328+ obj . set ( 'objectField.number' , 5 ) ;
329+ assert . deepEqual ( obj . _getPendingOps ( ) [ 0 ] , { } ) ;
330+ assert . equal ( obj . get ( 'objectField' ) , undefined ) ;
331+
332+ await obj . save ( ) ;
333+ assert . equal ( obj . get ( 'objectField' ) , undefined ) ;
334+ } ) ;
335+
336+ it ( 'can set nested fields two levels' , async ( ) => {
337+ const obj = new TestObject ( { objectField : { foo : { bar : 5 } } } ) ;
338+ assert . equal ( obj . get ( 'objectField' ) . foo . bar , 5 ) ;
339+ await obj . save ( ) ;
340+
341+ assert . equal ( obj . get ( 'objectField' ) . foo . bar , 5 ) ;
342+ obj . set ( 'objectField.foo.bar' , 20 ) ;
343+ assert . equal ( obj . get ( 'objectField' ) . foo . bar , 20 ) ;
344+ await obj . save ( ) ;
345+
346+ const query = new Parse . Query ( TestObject ) ;
347+ const result = await query . get ( obj . id ) ;
348+ assert . equal ( result . get ( 'objectField' ) . foo . bar , 20 ) ;
349+ } ) ;
350+
351+ it ( 'can unset nested fields' , async ( ) => {
352+ const obj = new TestObject ( {
353+ objectField : {
354+ number : 5 ,
355+ string : 'hello' ,
356+ }
357+ } ) ;
358+ await obj . save ( ) ;
359+
360+ obj . unset ( 'objectField.number' ) ;
361+ assert . equal ( obj . get ( 'objectField' ) . number , undefined ) ;
362+ assert . equal ( obj . get ( 'objectField' ) . string , 'hello' ) ;
363+ await obj . save ( ) ;
364+
365+ const query = new Parse . Query ( TestObject ) ;
366+ const result = await query . get ( obj . id ) ;
367+ assert . equal ( result . get ( 'objectField' ) . number , undefined ) ;
368+ assert . equal ( result . get ( 'objectField' ) . string , 'hello' ) ;
369+ } ) ;
370+
371+ it ( 'can unset nested fields two levels' , async ( ) => {
372+ const obj = new TestObject ( {
373+ objectField : {
374+ foo : {
375+ bar : 5 ,
376+ } ,
377+ string : 'hello' ,
378+ }
379+ } ) ;
380+ await obj . save ( ) ;
381+
382+ obj . unset ( 'objectField.foo.bar' ) ;
383+ assert . equal ( obj . get ( 'objectField' ) . foo . bar , undefined ) ;
384+ assert . equal ( obj . get ( 'objectField' ) . string , 'hello' ) ;
385+ await obj . save ( ) ;
386+
387+ const query = new Parse . Query ( TestObject ) ;
388+ const result = await query . get ( obj . id ) ;
389+ assert . equal ( result . get ( 'objectField' ) . foo . bar , undefined ) ;
390+ assert . equal ( result . get ( 'objectField' ) . string , 'hello' ) ;
391+ } ) ;
392+
393+ it ( 'can unset non existing fields' , async ( ) => {
394+ const obj = new TestObject ( ) ;
395+ obj . set ( 'objectField' , { number : 5 } ) ;
396+ await obj . save ( ) ;
397+
398+ obj . unset ( 'objectField.unknown' ) ;
399+ await obj . save ( ) ;
400+
401+ const query = new Parse . Query ( TestObject ) ;
402+ const result = await query . get ( obj . id ) ;
403+ assert . equal ( result . get ( 'objectField' ) . number , 5 ) ;
404+ assert . equal ( result . get ( 'objectField' ) . unknown , undefined ) ;
405+ } ) ;
406+
232407 it ( 'can set keys to null' , ( done ) => {
233408 const obj = new TestObject ( ) ;
234409 obj . set ( 'foo' , null ) ;
0 commit comments