Skip to content

Commit

Permalink
Postgres: Operations, Hooks, OAuth login, Files support (#2528)
Browse files Browse the repository at this point in the history
* Adds files related tests through fs-adapter with PG

* Schema deletions implementations

* Adds Hooks spec

* Fix test

* Adds support for containsAll (numbers and strings)

* Better support for deleteFields and deleteClass

* Recursive JSON update for authData

* Adds node_modules to travis cache

* Disable temporarily to make tests pass

* Adds _perishable_token support for _User class

* ignore when a table creation fails at init (table exists)

* Adds support for AddUnique and Remove

* PG 9.4 compatible functions

* Re-enable tests

* nit

* Better handling of schema creation race
  • Loading branch information
flovilmart committed Aug 18, 2016
1 parent 3164b47 commit 9ecb9a3
Show file tree
Hide file tree
Showing 18 changed files with 350 additions and 130 deletions.
2 changes: 1 addition & 1 deletion .istanbul.yml
@@ -1,2 +1,2 @@
instrumentation:
excludes: ["**/spec/**", "**/PostgresStorageAdapter.js"]
excludes: ["**/spec/**"]
1 change: 1 addition & 0 deletions .travis.yml
Expand Up @@ -27,6 +27,7 @@ branches:
- /^[0-9]+.[0-9]+.[0-9]+(-.*)?$/
cache:
directories:
- node_modules
- "$HOME/.mongodb/versions"
after_script:
- bash <(curl -s https://codecov.io/bash)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -32,7 +32,7 @@
"mongodb": "2.2.5",
"multer": "1.2.0",
"parse": "1.9.1",
"parse-server-fs-adapter": "1.0.0",
"parse-server-fs-adapter": "1.0.1",
"parse-server-push-adapter": "1.0.4",
"parse-server-s3-adapter": "1.0.4",
"parse-server-simple-mailgun-adapter": "1.0.0",
Expand Down
5 changes: 3 additions & 2 deletions spec/ParseAPI.spec.js
Expand Up @@ -212,7 +212,7 @@ describe('miscellaneous', function() {
});
});

it('ensure that if you try to sign up a user with a unique username and email, but duplicates in some other field that has a uniqueness constraint, you get a regular duplicate value error', done => {
it_exclude_dbs(['postgres'])('ensure that if you try to sign up a user with a unique username and email, but duplicates in some other field that has a uniqueness constraint, you get a regular duplicate value error', done => {
let config = new Config('test');
config.database.adapter.addFieldIfNotExists('_User', 'randomField', { type: 'String' })
.then(() => config.database.adapter.ensureUniqueness('_User', userSchema, ['randomField']))
Expand All @@ -233,6 +233,7 @@ describe('miscellaneous', function() {
return user.signUp()
})
.catch(error => {
console.error(error);
expect(error.code).toEqual(Parse.Error.DUPLICATE_VALUE);
done();
});
Expand Down Expand Up @@ -816,7 +817,7 @@ describe('miscellaneous', function() {
});
});

it_exclude_dbs(['postgres'])('should return the updated fields on PUT', done => {
it('should return the updated fields on PUT', done => {
let obj = new Parse.Object('GameScore');
obj.save({a:'hello', c: 1, d: ['1'], e:['1'], f:['1','2']}).then(( ) => {
var headers = {
Expand Down
14 changes: 7 additions & 7 deletions spec/ParseFile.spec.js
Expand Up @@ -11,8 +11,8 @@ for (var i = 0; i < str.length; i++) {
data.push(str.charCodeAt(i));
}

describe_only_db('mongo')('Parse.File testing', () => {
describe_only_db('mongo')('creating files', () => {
describe('Parse.File testing', () => {
describe('creating files', () => {
it('works with Content-Type', done => {
var headers = {
'Content-Type': 'application/octet-stream',
Expand Down Expand Up @@ -88,7 +88,7 @@ describe_only_db('mongo')('Parse.File testing', () => {
});
});

it_exclude_dbs(['postgres'])('supports REST end-to-end file create, read, delete, read', done => {
it('supports REST end-to-end file create, read, delete, read', done => {
var headers = {
'Content-Type': 'image/jpeg',
'X-Parse-Application-Id': 'test',
Expand Down Expand Up @@ -204,7 +204,7 @@ describe_only_db('mongo')('Parse.File testing', () => {
});
});

it_exclude_dbs(['postgres'])("save file", done => {
it("save file", done => {
var file = new Parse.File("hello.txt", data, "text/plain");
ok(!file.url());
file.save(expectSuccess({
Expand Down Expand Up @@ -273,7 +273,7 @@ describe_only_db('mongo')('Parse.File testing', () => {
}, done));
});

it_exclude_dbs(['postgres'])("autosave file in object", done => {
it("autosave file in object", done => {
var file = new Parse.File("hello.txt", data, "text/plain");
ok(!file.url());
var object = new Parse.Object("TestObject");
Expand Down Expand Up @@ -506,7 +506,7 @@ describe_only_db('mongo')('Parse.File testing', () => {
});
});

it_exclude_dbs(['postgres'])('creates correct url for old files hosted on files.parsetfss.com', done => {
it('creates correct url for old files hosted on files.parsetfss.com', done => {
var file = {
__type: 'File',
url: 'http://irrelevant.elephant/',
Expand All @@ -529,7 +529,7 @@ describe_only_db('mongo')('Parse.File testing', () => {
});
});

it_exclude_dbs(['postgres'])('creates correct url for old files hosted on files.parse.com', done => {
it('creates correct url for old files hosted on files.parse.com', done => {
var file = {
__type: 'File',
url: 'http://irrelevant.elephant/',
Expand Down
32 changes: 16 additions & 16 deletions spec/ParseHooks.spec.js
Expand Up @@ -15,7 +15,7 @@ app.use(bodyParser.json({ 'type': '*/*' }))
app.listen(12345);

describe('Hooks', () => {
it_exclude_dbs(['postgres'])("should have no hooks registered", (done) => {
it("should have no hooks registered", (done) => {
Parse.Hooks.getFunctions().then((res) => {
expect(res.constructor).toBe(Array.prototype.constructor);
done();
Expand All @@ -25,7 +25,7 @@ describe('Hooks', () => {
});
});

it_exclude_dbs(['postgres'])("should have no triggers registered", (done) => {
it("should have no triggers registered", (done) => {
Parse.Hooks.getTriggers().then( (res) => {
expect(res.constructor).toBe(Array.prototype.constructor);
done();
Expand All @@ -35,7 +35,7 @@ describe('Hooks', () => {
});
});

it_exclude_dbs(['postgres'])("should CRUD a function registration", (done) => {
it("should CRUD a function registration", (done) => {
// Create
Parse.Hooks.createFunction("My-Test-Function", "http://someurl")
.then(response => {
Expand Down Expand Up @@ -76,7 +76,7 @@ describe('Hooks', () => {
})
});

it_exclude_dbs(['postgres'])("should CRUD a trigger registration", (done) => {
it("should CRUD a trigger registration", (done) => {
// Create
Parse.Hooks.createTrigger("MyClass","beforeDelete", "http://someurl").then((res) => {
expect(res.className).toBe("MyClass");
Expand Down Expand Up @@ -142,7 +142,7 @@ describe('Hooks', () => {
})
});

it_exclude_dbs(['postgres'])("should fail trying to create two times the same function", (done) => {
it("should fail trying to create two times the same function", (done) => {
Parse.Hooks.createFunction("my_new_function", "http://url.com").then( () => {
return Parse.Hooks.createFunction("my_new_function", "http://url.com")
}, () => {
Expand All @@ -165,7 +165,7 @@ describe('Hooks', () => {
})
});

it_exclude_dbs(['postgres'])("should fail trying to create two times the same trigger", (done) => {
it("should fail trying to create two times the same trigger", (done) => {
Parse.Hooks.createTrigger("MyClass", "beforeSave", "http://url.com").then( () => {
return Parse.Hooks.createTrigger("MyClass", "beforeSave", "http://url.com")
}, () => {
Expand All @@ -188,7 +188,7 @@ describe('Hooks', () => {
})
});

it_exclude_dbs(['postgres'])("should fail trying to update a function that don't exist", (done) => {
it("should fail trying to update a function that don't exist", (done) => {
Parse.Hooks.updateFunction("A_COOL_FUNCTION", "http://url.com").then( () => {
fail("Should not succeed")
}, (err) => {
Expand All @@ -213,7 +213,7 @@ describe('Hooks', () => {
});
});

it_exclude_dbs(['postgres'])("should fail trying to update a trigger that don't exist", (done) => {
it("should fail trying to update a trigger that don't exist", (done) => {
Parse.Hooks.updateTrigger("AClassName","beforeSave", "http://url.com").then( () => {
fail("Should not succeed")
}, (err) => {
Expand Down Expand Up @@ -269,7 +269,7 @@ describe('Hooks', () => {
});


it_exclude_dbs(['postgres'])("should create hooks and properly preload them", (done) => {
it("should create hooks and properly preload them", (done) => {

var promises = [];
for (var i = 0; i<5; i++) {
Expand Down Expand Up @@ -304,7 +304,7 @@ describe('Hooks', () => {
})
});

it_exclude_dbs(['postgres'])("should run the function on the test server", (done) => {
it("should run the function on the test server", (done) => {

app.post("/SomeFunction", function(req, res) {
res.json({success:"OK!"});
Expand All @@ -326,7 +326,7 @@ describe('Hooks', () => {
});
});

it_exclude_dbs(['postgres'])("should run the function on the test server", (done) => {
it("should run the function on the test server", (done) => {

app.post("/SomeFunctionError", function(req, res) {
res.json({error: {code: 1337, error: "hacking that one!"}});
Expand All @@ -353,7 +353,7 @@ describe('Hooks', () => {
});
});

it_exclude_dbs(['postgres'])("should provide X-Parse-Webhook-Key when defined", (done) => {
it("should provide X-Parse-Webhook-Key when defined", (done) => {
app.post("/ExpectingKey", function(req, res) {
if (req.get('X-Parse-Webhook-Key') === 'hook') {
res.json({success: "correct key provided"});
Expand All @@ -378,7 +378,7 @@ describe('Hooks', () => {
});
});

it_exclude_dbs(['postgres'])("should not pass X-Parse-Webhook-Key if not provided", (done) => {
it("should not pass X-Parse-Webhook-Key if not provided", (done) => {
reconfigureServer({ webhookKey: undefined })
.then(() => {
app.post("/ExpectingKeyAlso", function(req, res) {
Expand Down Expand Up @@ -411,7 +411,7 @@ describe('Hooks', () => {
});


it_exclude_dbs(['postgres'])("should run the beforeSave hook on the test server", (done) => {
it("should run the beforeSave hook on the test server", (done) => {
var triggerCount = 0;
app.post("/BeforeSaveSome", function(req, res) {
triggerCount++;
Expand All @@ -438,7 +438,7 @@ describe('Hooks', () => {
});
});

it_exclude_dbs(['postgres'])("beforeSave hooks should correctly handle responses containing entire object", (done) => {
it("beforeSave hooks should correctly handle responses containing entire object", (done) => {
app.post("/BeforeSaveSome2", function(req, res) {
var object = Parse.Object.fromJSON(req.body.object);
object.set('hello', "world");
Expand All @@ -458,7 +458,7 @@ describe('Hooks', () => {
});
});

it_exclude_dbs(['postgres'])("should run the afterSave hook on the test server", (done) => {
it("should run the afterSave hook on the test server", (done) => {
var triggerCount = 0;
var newObjectId;
app.post("/AfterSaveSome", function(req, res) {
Expand Down
32 changes: 22 additions & 10 deletions spec/ParseObject.spec.js
Expand Up @@ -591,14 +591,19 @@ describe('Parse.Object testing', () => {
var objectId = x1.id;
var x2 = new Parse.Object('X', {objectId: objectId});
x2.addUnique('stuff', 2);
x2.addUnique('stuff', 3);
expect(x2.get('stuff')).toEqual([2, 3]);
x2.addUnique('stuff', 4);
expect(x2.get('stuff')).toEqual([2, 4]);
return x2.save();
}).then(() => {
var query = new Parse.Query('X');
return query.get(x1.id);
}).then((x3) => {
expect(x3.get('stuff')).toEqual([1, 2, 3]);
let stuff = x3.get('stuff');
let expected = [1, 2, 4];
expect(stuff.length).toBe(expected.length);
for (var i of stuff) {
expect(expected.indexOf(i) >= 0).toBe(true);
}
done();
}, (error) => {
on_db('mongo', () => {
Expand All @@ -625,15 +630,21 @@ describe('Parse.Object testing', () => {
var query = new Parse.Query('X');
return query.get(x1.id);
}).then((x3) => {
expect(x3.get('stuff')).toEqual([1, {'hello': 'world'}, {'foo': 'bar'}, {'bar': 'baz'}]);
let stuff = x3.get('stuff');
let target = [1, {'hello': 'world'}, {'foo': 'bar'}, {'bar': 'baz'}];
expect(stuff.length).toEqual(target.length);
let found = 0;
for (let thing in target) {
for (let st in stuff) {
if (st == thing) {
found++;
}
}
}
expect(found).toBe(target.length);
done();
}, (error) => {
on_db('mongo', () => {
jfail(error);
});
on_db('postgres', () => {
expect(error.message).toEqual("Postgres does not support AddUnique operator.");
});
jfail(error);
done();
});
});
Expand All @@ -654,6 +665,7 @@ describe('Parse.Object testing', () => {
expect(x3.get('stuff')).toEqual([1, {'foo': 'bar'}]);
done();
}, (error) => {
console.error(error);
on_db('mongo', () => {
jfail(error);
});
Expand Down
6 changes: 3 additions & 3 deletions spec/ParseQuery.spec.js
Expand Up @@ -185,7 +185,7 @@ describe('Parse.Query testing', () => {
});
});

it_exclude_dbs(['postgres'])("containsAll number array queries", function(done) {
it("containsAll number array queries", function(done) {
var NumberSet = Parse.Object.extend({ className: "NumberSet" });

var objectsList = [];
Expand All @@ -211,7 +211,7 @@ describe('Parse.Query testing', () => {
});
});

it_exclude_dbs(['postgres'])("containsAll string array queries", function(done) {
it("containsAll string array queries", function(done) {
var StringSet = Parse.Object.extend({ className: "StringSet" });

var objectsList = [];
Expand Down Expand Up @@ -872,7 +872,7 @@ describe('Parse.Query testing', () => {
});
});

it("order by descending number and string", function(done) {
it_exclude_dbs(['postgres'])("order by descending number and string", function(done) {
var strings = ["a", "b", "c", "d"];
var makeBoxedNumber = function(num, i) {
return new BoxedNumber({ number: num, string: strings[i] });
Expand Down
3 changes: 3 additions & 0 deletions spec/ParseRelation.spec.js
Expand Up @@ -331,6 +331,9 @@ describe('Parse.Relation testing', () => {
done();
});
});
}).catch(err => {
jfail(err);
done();
});
});

Expand Down
2 changes: 1 addition & 1 deletion spec/ParseRole.spec.js
Expand Up @@ -76,7 +76,7 @@ describe('Parse Role testing', () => {
return role.save({}, { useMasterKey: true });
};

it("should not recursively load the same role multiple times", (done) => {
it_exclude_dbs(['postgres'])("should not recursively load the same role multiple times", (done) => {
var rootRole = "RootRole";
var roleNames = ["FooRole", "BarRole", "BazRole"];
var allRoles = [rootRole].concat(roleNames);
Expand Down

0 comments on commit 9ecb9a3

Please sign in to comment.