Skip to content

Commit fb1c397

Browse files
committed
moar tests
1 parent 386610b commit fb1c397

File tree

2 files changed

+209
-1
lines changed

2 files changed

+209
-1
lines changed

src/__tests__/ParseObject-test.js

Lines changed: 199 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1517,6 +1517,14 @@ describe('ObjectController', () => {
15171517
jest.runAllTicks();
15181518
}));
15191519

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+
15201528
it('can save an array of files', asyncHelper((done) => {
15211529
var objectController = CoreManager.getObjectController();
15221530
var xhrs = [];
@@ -1667,6 +1675,188 @@ describe('ObjectController', () => {
16671675
});
16681676
});
16691677

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+
16701860
class MyObject extends ParseObject {
16711861
constructor() {
16721862
super('MyObject');
@@ -1684,6 +1874,10 @@ class MyObject extends ParseObject {
16841874
ParseObject.registerSubclass('MyObject', MyObject);
16851875

16861876
describe('ParseObject Subclasses', () => {
1877+
beforeEach(() => {
1878+
ParseObject.enableSingleInstance();
1879+
});
1880+
16871881
it('can be extended with ES6 classes', () => {
16881882
var o = new MyObject();
16891883
expect(o.className).toBe('MyObject');
@@ -1753,6 +1947,10 @@ describe('ParseObject Subclasses', () => {
17531947
});
17541948

17551949
describe('ParseObject extensions', () => {
1950+
beforeEach(() => {
1951+
ParseObject.enableSingleInstance();
1952+
});
1953+
17561954
it('can generate ParseObjects with a default className', () => {
17571955
var YourObject = ParseObject.extend('YourObject');
17581956
var yo = new YourObject();
@@ -1801,4 +1999,4 @@ describe('ParseObject extensions', () => {
18011999
f = new FeatureObject();
18022000
expect(f.foo() + f.bar()).toBe('FB');
18032001
});
1804-
})
2002+
});

src/__tests__/UniqueInstanceState-test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,4 +410,14 @@ describe('UniqueInstanceState', () => {
410410
});
411411
expect(UniqueInstanceState.getState(obj)).toBe(null);
412412
});
413+
414+
it('can allocate many objects without running out of memory', () => {
415+
let closure = function() {
416+
let obj = new ParseObject();
417+
UniqueInstanceState.setServerData(obj, { spacious: true });
418+
};
419+
for (var i = 0; i < 1e5; i++) {
420+
closure();
421+
}
422+
});
413423
});

0 commit comments

Comments
 (0)