@@ -1517,6 +1517,14 @@ describe('ObjectController', () => {
1517
1517
jest . runAllTicks ( ) ;
1518
1518
} ) ) ;
1519
1519
1520
+ it ( 'returns an empty promise from an empty save' , asyncHelper ( ( done ) => {
1521
+ var objectController = CoreManager . getObjectController ( ) ;
1522
+ objectController . save ( ) . then ( ( ) => {
1523
+ done ( ) ;
1524
+ } ) ;
1525
+ jest . runAllTicks ( ) ;
1526
+ } ) ) ;
1527
+
1520
1528
it ( 'can save an array of files' , asyncHelper ( ( done ) => {
1521
1529
var objectController = CoreManager . getObjectController ( ) ;
1522
1530
var xhrs = [ ] ;
@@ -1667,6 +1675,188 @@ describe('ObjectController', () => {
1667
1675
} ) ;
1668
1676
} ) ;
1669
1677
1678
+ describe ( 'ParseObject (unique instance mode)' , ( ) => {
1679
+ beforeEach ( ( ) => {
1680
+ ParseObject . disableSingleInstance ( ) ;
1681
+ } ) ;
1682
+
1683
+ it ( 'can be created with initial attributes' , ( ) => {
1684
+ var o = new ParseObject ( {
1685
+ className : 'Item' ,
1686
+ value : 12
1687
+ } ) ;
1688
+ expect ( o . className ) . toBe ( 'Item' ) ;
1689
+ expect ( o . attributes ) . toEqual ( { value : 12 } ) ;
1690
+ } ) ;
1691
+
1692
+ it ( 'can be inflated from server JSON' , ( ) => {
1693
+ var json = {
1694
+ className : 'Item' ,
1695
+ createdAt : '2013-12-14T04:51:19Z' ,
1696
+ objectId : 'I1' ,
1697
+ size : 'medium'
1698
+ } ;
1699
+ var o = ParseObject . fromJSON ( json ) ;
1700
+ expect ( o . className ) . toBe ( 'Item' ) ;
1701
+ expect ( o . id ) . toBe ( 'I1' ) ;
1702
+ expect ( o . attributes ) . toEqual ( {
1703
+ size : 'medium' ,
1704
+ createdAt : new Date ( Date . UTC ( 2013 , 11 , 14 , 4 , 51 , 19 ) ) ,
1705
+ updatedAt : new Date ( Date . UTC ( 2013 , 11 , 14 , 4 , 51 , 19 ) )
1706
+ } ) ;
1707
+ expect ( o . dirty ( ) ) . toBe ( false ) ;
1708
+ } ) ;
1709
+
1710
+ it ( 'can be rendered to JSON' , ( ) => {
1711
+ var o = new ParseObject ( 'Item' ) ;
1712
+ o . set ( {
1713
+ size : 'large' ,
1714
+ inStock : 18
1715
+ } ) ;
1716
+ expect ( o . toJSON ( ) ) . toEqual ( {
1717
+ size : 'large' ,
1718
+ inStock : 18
1719
+ } ) ;
1720
+ o = new ParseObject ( 'Item' ) ;
1721
+ o . _finishFetch ( {
1722
+ objectId : 'O2' ,
1723
+ size : 'medium' ,
1724
+ inStock : 12
1725
+ } ) ;
1726
+ expect ( o . id ) . toBe ( 'O2' ) ;
1727
+ expect ( o . toJSON ( ) ) . toEqual ( {
1728
+ objectId : 'O2' ,
1729
+ size : 'medium' ,
1730
+ inStock : 12
1731
+ } ) ;
1732
+ } ) ;
1733
+
1734
+ it ( 'can add, update, and remove attributes' , ( ) => {
1735
+ var o = new ParseObject ( {
1736
+ className : 'Item' ,
1737
+ objectId : 'anObjectId' ,
1738
+ value : 12 ,
1739
+ valid : true
1740
+ } ) ;
1741
+ o . set ( { value : 14 } ) ;
1742
+ expect ( o . get ( 'value' ) ) . toBe ( 14 ) ;
1743
+ o . unset ( 'valid' ) ;
1744
+ expect ( o . get ( 'valid' ) ) . toBe ( undefined ) ;
1745
+ expect ( o . dirtyKeys ( ) ) . toEqual ( [ 'value' , 'valid' ] ) ;
1746
+ o . increment ( 'value' ) ;
1747
+ expect ( o . get ( 'value' ) , 15 ) ;
1748
+
1749
+ o . clear ( ) ;
1750
+ expect ( o . get ( 'value' ) ) . toBe ( undefined ) ;
1751
+
1752
+ var o2 = ParseObject . fromJSON ( {
1753
+ className : 'Item' ,
1754
+ tags : [ '#tbt' ]
1755
+ } ) ;
1756
+
1757
+ o2 . add ( 'tags' , '#nofilter' ) ;
1758
+ expect ( o2 . get ( 'tags' ) ) . toEqual ( [ '#tbt' , '#nofilter' ] ) ;
1759
+
1760
+ o2 . revert ( ) ;
1761
+ o2 . addUnique ( 'tags' , '#tbt' ) ;
1762
+ expect ( o2 . get ( 'tags' ) ) . toEqual ( [ '#tbt' ] ) ;
1763
+
1764
+ o2 . revert ( ) ;
1765
+ o2 . remove ( 'tags' , '#tbt' ) ;
1766
+ expect ( o2 . get ( 'tags' ) ) . toEqual ( [ ] ) ;
1767
+ } ) ;
1768
+
1769
+ it ( 'can save the object' , asyncHelper ( ( done ) => {
1770
+ CoreManager . getRESTController ( ) . _setXHR (
1771
+ mockXHR ( [ {
1772
+ status : 200 ,
1773
+ response : {
1774
+ objectId : 'P1' ,
1775
+ count : 1
1776
+ }
1777
+ } ] )
1778
+ ) ;
1779
+ var p = new ParseObject ( 'Person' ) ;
1780
+ p . set ( 'age' , 38 ) ;
1781
+ p . increment ( 'count' ) ;
1782
+ p . save ( ) . then ( ( obj ) => {
1783
+ expect ( obj ) . toBe ( p ) ;
1784
+ expect ( obj . get ( 'age' ) ) . toBe ( 38 ) ;
1785
+ expect ( obj . get ( 'count' ) ) . toBe ( 1 ) ;
1786
+ expect ( obj . op ( 'age' ) ) . toBe ( undefined ) ;
1787
+ expect ( obj . dirty ( ) ) . toBe ( false ) ;
1788
+ done ( ) ;
1789
+ } ) ;
1790
+ } ) ) ;
1791
+
1792
+ it ( 'can save an array of objects' , asyncHelper ( ( done ) => {
1793
+ var xhr = {
1794
+ setRequestHeader : jest . genMockFn ( ) ,
1795
+ open : jest . genMockFn ( ) ,
1796
+ send : jest . genMockFn ( )
1797
+ } ;
1798
+ RESTController . _setXHR ( function ( ) { return xhr ; } ) ;
1799
+ var objects = [ ] ;
1800
+ for ( var i = 0 ; i < 5 ; i ++ ) {
1801
+ objects [ i ] = new ParseObject ( 'Person' ) ;
1802
+ }
1803
+ ParseObject . saveAll ( objects ) . then ( ( ) => {
1804
+ expect ( xhr . open . mock . calls [ 0 ] ) . toEqual (
1805
+ [ 'POST' , 'https://api.parse.com/1/batch' , true ]
1806
+ ) ;
1807
+ expect ( JSON . parse ( xhr . send . mock . calls [ 0 ] ) . requests [ 0 ] ) . toEqual ( {
1808
+ method : 'POST' ,
1809
+ path : '/1/classes/Person' ,
1810
+ body : { }
1811
+ } ) ;
1812
+ done ( ) ;
1813
+ } ) ;
1814
+ jest . runAllTicks ( ) ;
1815
+
1816
+ xhr . status = 200 ;
1817
+ xhr . responseText = JSON . stringify ( [
1818
+ { success : { objectId : 'pid0' } } ,
1819
+ { success : { objectId : 'pid1' } } ,
1820
+ { success : { objectId : 'pid2' } } ,
1821
+ { success : { objectId : 'pid3' } } ,
1822
+ { success : { objectId : 'pid4' } } ,
1823
+ ] ) ;
1824
+ xhr . readyState = 4 ;
1825
+ xhr . onreadystatechange ( ) ;
1826
+ jest . runAllTicks ( ) ;
1827
+ } ) ) ;
1828
+
1829
+ it ( 'preserves changes when changing the id' , ( ) => {
1830
+ var o = new ParseObject ( {
1831
+ className : 'Item' ,
1832
+ objectId : 'anObjectId' ,
1833
+ value : 12
1834
+ } ) ;
1835
+ o . id = 'otherId' ;
1836
+ expect ( o . get ( 'value' ) ) . toBe ( 12 ) ;
1837
+ } ) ;
1838
+
1839
+ it ( 'can maintain differences between two instances of an object' , ( ) => {
1840
+ var o = new ParseObject ( {
1841
+ className : 'Item' ,
1842
+ objectId : 'anObjectId' ,
1843
+ value : 12
1844
+ } ) ;
1845
+ var o2 = new ParseObject ( {
1846
+ className : 'Item' ,
1847
+ objectId : 'anObjectId' ,
1848
+ value : 12
1849
+ } ) ;
1850
+ o . set ( { value : 100 } ) ;
1851
+ expect ( o . get ( 'value' ) ) . toBe ( 100 ) ;
1852
+ expect ( o2 . get ( 'value' ) ) . toBe ( 12 ) ;
1853
+
1854
+ o2 . set ( { name : 'foo' } ) ;
1855
+ expect ( o . has ( 'name' ) ) . toBe ( false ) ;
1856
+ expect ( o2 . has ( 'name' ) ) . toBe ( true ) ;
1857
+ } ) ;
1858
+ } ) ;
1859
+
1670
1860
class MyObject extends ParseObject {
1671
1861
constructor ( ) {
1672
1862
super ( 'MyObject' ) ;
@@ -1684,6 +1874,10 @@ class MyObject extends ParseObject {
1684
1874
ParseObject . registerSubclass ( 'MyObject' , MyObject ) ;
1685
1875
1686
1876
describe ( 'ParseObject Subclasses' , ( ) => {
1877
+ beforeEach ( ( ) => {
1878
+ ParseObject . enableSingleInstance ( ) ;
1879
+ } ) ;
1880
+
1687
1881
it ( 'can be extended with ES6 classes' , ( ) => {
1688
1882
var o = new MyObject ( ) ;
1689
1883
expect ( o . className ) . toBe ( 'MyObject' ) ;
@@ -1753,6 +1947,10 @@ describe('ParseObject Subclasses', () => {
1753
1947
} ) ;
1754
1948
1755
1949
describe ( 'ParseObject extensions' , ( ) => {
1950
+ beforeEach ( ( ) => {
1951
+ ParseObject . enableSingleInstance ( ) ;
1952
+ } ) ;
1953
+
1756
1954
it ( 'can generate ParseObjects with a default className' , ( ) => {
1757
1955
var YourObject = ParseObject . extend ( 'YourObject' ) ;
1758
1956
var yo = new YourObject ( ) ;
@@ -1801,4 +1999,4 @@ describe('ParseObject extensions', () => {
1801
1999
f = new FeatureObject ( ) ;
1802
2000
expect ( f . foo ( ) + f . bar ( ) ) . toBe ( 'FB' ) ;
1803
2001
} ) ;
1804
- } )
2002
+ } ) ;
0 commit comments