From 475e9c7fb717ec2bb16306f369a2ee44f8936169 Mon Sep 17 00:00:00 2001 From: dblythy Date: Tue, 9 Mar 2021 00:44:58 +1100 Subject: [PATCH 1/4] new: className in constructor --- integration/test/ParseSubclassTest.js | 17 +++++++++++++++++ src/ParseObject.js | 6 +++--- src/__tests__/ParseObject-test.js | 13 +++++++++++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/integration/test/ParseSubclassTest.js b/integration/test/ParseSubclassTest.js index eafeda726..639db7829 100644 --- a/integration/test/ParseSubclassTest.js +++ b/integration/test/ParseSubclassTest.js @@ -193,4 +193,21 @@ describe('Parse Object Subclasses', () => { const wartortle = new Wartortle(); assert(wartortle.water); }); + it('registerSubclass with unknown className', async () => { + let outerClassName = ''; + class TestObject extends Parse.Object { + constructor(className) { + super(className); + outerClassName = className; + } + } + Parse.Object.registerSubclass('TestObject', TestObject); + const o = new Parse.Object('TestObject'); + await o.save(); + const query = new Parse.Query('TestObject'); + const first = await query.first(); + expect(first instanceof TestObject).toBe(true); + expect(first.className).toBe('TestObject'); + expect(outerClassName).toBe('TestObject'); + }); }); diff --git a/src/ParseObject.js b/src/ParseObject.js index 191a57842..9ad04133b 100644 --- a/src/ParseObject.js +++ b/src/ParseObject.js @@ -930,7 +930,7 @@ class ParseObject { * @returns {Parse.Object} */ clone(): any { - const clone = new this.constructor(); + const clone = new this.constructor(this.className); if (!clone.className) { clone.className = this.className; } @@ -959,7 +959,7 @@ class ParseObject { * @returns {Parse.Object} */ newInstance(): any { - const clone = new this.constructor(); + const clone = new this.constructor(this.className); if (!clone.className) { clone.className = this.className; } @@ -1831,7 +1831,7 @@ class ParseObject { throw new Error('Cannot create an object without a className'); } const constructor = classMap[json.className]; - const o = constructor ? new constructor() : new ParseObject(json.className); + const o = constructor ? new constructor(json.className) : new ParseObject(json.className); const otherAttributes = {}; for (const attr in json) { if (attr !== 'className' && attr !== '__type') { diff --git a/src/__tests__/ParseObject-test.js b/src/__tests__/ParseObject-test.js index 976b0bf12..ae22e0d15 100644 --- a/src/__tests__/ParseObject-test.js +++ b/src/__tests__/ParseObject-test.js @@ -3425,6 +3425,19 @@ describe('ParseObject Subclasses', () => { 'You must register the subclass constructor. Did you attempt to register an instance of the subclass?' ); }); + it('registerSubclass with unknown className', () => { + let outerClassName = ''; + class TestObject extends ParseObject { + constructor(className) { + super(className); + outerClassName = className; + } + } + ParseObject.registerSubclass('TestObject', TestObject); + const o = new TestObject('TestObject'); + expect(o.className).toBe('TestObject'); + expect(outerClassName).toBe('TestObject'); + }); it('can inflate subclasses from server JSON', () => { const json = { From d642f7f33295c139843a83669730a231ec943c36 Mon Sep 17 00:00:00 2001 From: dblythy Date: Tue, 9 Mar 2021 01:00:06 +1100 Subject: [PATCH 2/4] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 445b8b2ad..a9082e449 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### master [Full Changelog](https://github.com/parse-community/Parse-SDK-JS/compare/3.1.0...master) +- Add className argument to Parse Object subclass constructor ([#1315](https://github.com/parse-community/Parse-SDK-JS/pull/1315)) ## 3.1.0 [Full Changelog](https://github.com/parse-community/Parse-SDK-JS/compare/3.0.0...3.1.0) From 5bba9443be72f87945020434f0deed4d4e53ad80 Mon Sep 17 00:00:00 2001 From: dblythy Date: Tue, 9 Mar 2021 04:10:55 +1100 Subject: [PATCH 3/4] update tests --- src/ParseObject.js | 6 ------ src/__tests__/ParseObject-test.js | 19 +++++++++++-------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/ParseObject.js b/src/ParseObject.js index 9ad04133b..516a36185 100644 --- a/src/ParseObject.js +++ b/src/ParseObject.js @@ -931,9 +931,6 @@ class ParseObject { */ clone(): any { const clone = new this.constructor(this.className); - if (!clone.className) { - clone.className = this.className; - } let attributes = this.attributes; if (typeof this.constructor.readOnlyAttributes === 'function') { const readonly = this.constructor.readOnlyAttributes() || []; @@ -960,9 +957,6 @@ class ParseObject { */ newInstance(): any { const clone = new this.constructor(this.className); - if (!clone.className) { - clone.className = this.className; - } clone.id = this.id; if (singleInstance) { // Just return an object with the right id diff --git a/src/__tests__/ParseObject-test.js b/src/__tests__/ParseObject-test.js index ae22e0d15..0afe3533f 100644 --- a/src/__tests__/ParseObject-test.js +++ b/src/__tests__/ParseObject-test.js @@ -3425,18 +3425,21 @@ describe('ParseObject Subclasses', () => { 'You must register the subclass constructor. Did you attempt to register an instance of the subclass?' ); }); - it('registerSubclass with unknown className', () => { - let outerClassName = ''; - class TestObject extends ParseObject { + it('can use on ParseObject subclass for multiple Parse.Object class names', () => { + class MyParseObjects extends ParseObject { constructor(className) { super(className); - outerClassName = className; } } - ParseObject.registerSubclass('TestObject', TestObject); - const o = new TestObject('TestObject'); - expect(o.className).toBe('TestObject'); - expect(outerClassName).toBe('TestObject'); + ParseObject.registerSubclass('TestObject', MyParseObjects); + ParseObject.registerSubclass('TestObject1', MyParseObjects); + ParseObject.registerSubclass('TestObject2', MyParseObjects); + const obj = new MyParseObjects('TestObject'); + expect(obj.className).toBe('TestObject'); + const obj1 = new MyParseObjects('TestObject1'); + expect(obj1.className).toBe('TestObject1'); + const obj2 = new MyParseObjects('TestObject2'); + expect(obj2.className).toBe('TestObject2'); }); it('can inflate subclasses from server JSON', () => { From cbae1c43d5107270de746b1ecb7e3a7ecd73a6fd Mon Sep 17 00:00:00 2001 From: dblythy Date: Tue, 9 Mar 2021 12:11:45 +1100 Subject: [PATCH 4/4] add spaces --- integration/test/ParseSubclassTest.js | 1 + src/__tests__/ParseObject-test.js | 1 + 2 files changed, 2 insertions(+) diff --git a/integration/test/ParseSubclassTest.js b/integration/test/ParseSubclassTest.js index 639db7829..5de1e2fe8 100644 --- a/integration/test/ParseSubclassTest.js +++ b/integration/test/ParseSubclassTest.js @@ -193,6 +193,7 @@ describe('Parse Object Subclasses', () => { const wartortle = new Wartortle(); assert(wartortle.water); }); + it('registerSubclass with unknown className', async () => { let outerClassName = ''; class TestObject extends Parse.Object { diff --git a/src/__tests__/ParseObject-test.js b/src/__tests__/ParseObject-test.js index 0afe3533f..6e72cc91a 100644 --- a/src/__tests__/ParseObject-test.js +++ b/src/__tests__/ParseObject-test.js @@ -3425,6 +3425,7 @@ describe('ParseObject Subclasses', () => { 'You must register the subclass constructor. Did you attempt to register an instance of the subclass?' ); }); + it('can use on ParseObject subclass for multiple Parse.Object class names', () => { class MyParseObjects extends ParseObject { constructor(className) {