Skip to content

Commit

Permalink
Merge branch 'master' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
SylvainEstevez committed Aug 17, 2016
2 parents ac2e129 + d93bca9 commit 97e065a
Show file tree
Hide file tree
Showing 16 changed files with 158 additions and 53 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "restypie",
"main": "./src/index",
"description": "Tastypie inspired, lightweight and storage agnostic REST resources manager",
"version": "1.1.0",
"version": "1.3.5",
"repository": "https://github.com/SylvainEstevez/Restypie",
"bugs": "https://github.com/SylvainEstevez/Restypie/issues",
"engines": {
Expand Down
4 changes: 3 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ const Restypie = module.exports = {

listToArray(str) {
if (!str || !str.length) return [];
if (Array.isArray(str)) return str;
return str.split(this.LIST_SEPARATOR_REG);
},

Expand Down Expand Up @@ -279,6 +280,7 @@ const Restypie = module.exports = {
get Client() { return require('./client'); },
get Query() { return require('./client/lib/query'); },
get Logger() { return require('./logger'); },
get QueryScore() { return require('./query-score'); }
get QueryScore() { return require('./query-score'); },
get ResourceTester() { return require('./resource-tester'); }

};
19 changes: 19 additions & 0 deletions src/resource-tester.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
'use strict';

const Path = require('path');

const testSuitePath = Path.resolve(__dirname, '../test/resource-test-suite');

class ResourceTester {

static validate(resourceClass, options) {
options = options || {};
require(testSuitePath)(Object.assign({}, options, {
resource: resourceClass
}));
}

}


module.exports = ResourceTester;
11 changes: 3 additions & 8 deletions src/resources/lib/abstract-resource.js
Original file line number Diff line number Diff line change
Expand Up @@ -543,7 +543,7 @@ module.exports = class AbstractResource extends Restypie.Resources.AbstractCoreR
*/
parseSort(bundle) {
let fieldsByKey = this.fieldsByKey;
let sort = this.constructor.listToArray(bundle.query.sort);
let sort = Restypie.listToArray(bundle.query.sort);
sort.forEach(function (key) {
key = key.replace(/^-/, '');
let field = fieldsByKey[key];
Expand Down Expand Up @@ -681,7 +681,7 @@ module.exports = class AbstractResource extends Restypie.Resources.AbstractCoreR
parseSelect(bundle) {
const self = this;
let fieldsByKey = this.fieldsByKey;
let select = this.constructor.listToArray(bundle.query.select);
let select = Restypie.listToArray(bundle.query.select);
select.forEach(function (key) {
let field;
if (key === PRIMARY_KEY_KEYWORD) {
Expand All @@ -706,7 +706,7 @@ module.exports = class AbstractResource extends Restypie.Resources.AbstractCoreR
*/
parsePopulate(bundle) {
let fieldsByKey = this.fieldsByKey;
let toPopulate = this.constructor.listToArray(bundle.query.populate).reduce(function (acc, key) {
let toPopulate = Restypie.listToArray(bundle.query.populate).reduce(function (acc, key) {
let parts = key.split('.'); // FIXME shouldn't use "." directly
let rootKey = parts.shift();
let field = fieldsByKey[rootKey];
Expand Down Expand Up @@ -1333,9 +1333,4 @@ module.exports = class AbstractResource extends Restypie.Resources.AbstractCoreR

static get DEEP_PROPERTY_SEPARATOR() { return '.'; }

static listToArray(str) {
if (!str) return [];
return str.split(this.LIST_SEPARATOR);
}

};
4 changes: 4 additions & 0 deletions test/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ describe('Restypie', function () {
it('should return an empty array if no string', function () {
Restypie.listToArray().should.deep.equal([]);
});
it('should return str if it s an array', function () {
const arr = [1, 2, 3];
Restypie.listToArray(arr).should.equal(arr);
});
});

describe('.arrayToList()', function () {
Expand Down
2 changes: 2 additions & 0 deletions test/resource-test-suite/basic-routes/delete-single.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
'use strict';

const Restypie = require('../../../');

module.exports = function (Fixtures) {

describe('DELETE single', function () {
Expand Down
2 changes: 2 additions & 0 deletions test/resource-test-suite/basic-routes/get-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

const Promise = require('bluebird');

const Restypie = require('../../../');

module.exports = function (Fixtures, api) {

describe('GET many', function () {
Expand Down
2 changes: 2 additions & 0 deletions test/resource-test-suite/basic-routes/get-single.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

const Promise = require('bluebird');

const Restypie = require('../../../');

module.exports = function (Fixtures) {

describe('GET single', function () {
Expand Down
2 changes: 2 additions & 0 deletions test/resource-test-suite/basic-routes/patch-many.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

const Path = require('path');

const Restypie = require('../../../');

module.exports = function (Fixtures) {

describe('PATCH many', function () {
Expand Down
2 changes: 2 additions & 0 deletions test/resource-test-suite/basic-routes/patch-single.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

const Path = require('path');

const Restypie = require('../../../');

module.exports = function (Fixtures) {

describe('PATCH single', function () {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

const Path = require('path');

const Restypie = require('../../../');

module.exports = function(Fixtures, api) {

describe('POST single', function () {
Expand Down Expand Up @@ -198,6 +200,32 @@ module.exports = function(Fixtures, api) {
body.meta.keys.should.deep.equal({ email: 'john.doe@example.com' });
});
});

it('should create multiple users (no profile picture)', function () {
const data = [{
firstName: 'John',
lastName: 'Doe',
email: 'john.doe@example.com',
yearOfBirth: 1986,
password: 'Passw0rd',
hasSubscribedEmails: true,
gender: 'male'
}, {
firstName: 'Jane',
lastName: 'Doe',
email: 'jane.doe@example.com',
yearOfBirth: 1988,
password: 'Passw0rd',
hasSubscribedEmails: true,
gender: 'female'
}];

return Fixtures.createUsers(data).then((users) => {
should.exist(users);
users.should.be.an('array').and.have.lengthOf(2);
users.forEach(user => user.theId.should.be.a('number'));
});
});
});

};
2 changes: 2 additions & 0 deletions test/resource-test-suite/basic-routes/put.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
'use strict';

const Restypie = require('../../../');

module.exports = function (Fixtures, api) {

describe('PUT', function () {
Expand Down
7 changes: 6 additions & 1 deletion test/resource-test-suite/index.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
'use strict';

// For external callers
global.should = require('chai').should();

/***********************************************************************************************************************
* Dependencies
**********************************************************************************************************************/
const express = require('express');
const koa = require('koa');
const http = require('http');
const KoaRouter = require('koa-router');
const Restypie = require('../../');

const SERVER_PORT = 3333;


/***********************************************************************************************************************
* Resource tests suite. Run your implementation against this test suite to verify that it supports the basics of the
* features from Restypie.
Expand Down Expand Up @@ -92,7 +97,7 @@ module.exports = function (options) {
* BEGIN tests
****************************************/

require('./basic-routes/post-single')(Fixtures, api, supertest, app);
require('./basic-routes/post')(Fixtures, api, supertest, app);
require('./basic-routes/get-single')(Fixtures, api, supertest, app);
require('./basic-routes/get-many')(Fixtures, api, supertest, app);
require('./basic-routes/patch-single')(Fixtures, api, supertest, app);
Expand Down
4 changes: 3 additions & 1 deletion test/resource-test-suite/resources/users.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
'use strict';

const Restypie = require('../../../');

module.exports = function (options) {

const api = options.api;
Expand All @@ -11,7 +13,7 @@ module.exports = function (options) {
get minQueryScore() { return 15; }
get routes() {
return [
Restypie.BasicRoutes.PostRoute,
class extends Restypie.BasicRoutes.PostRoute { get allowsMany() { return true; } },
Restypie.BasicRoutes.GetSingleRoute,
Restypie.BasicRoutes.GetManyRoute,
Restypie.BasicRoutes.PatchSingleRoute,
Expand Down
18 changes: 18 additions & 0 deletions test/resource-test-suite/utils/fixtures.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const _ = require('lodash');
const Promise = require('bluebird');

const Utils = require('./');
const Restypie = require('../../../');

let UUID = 0;

Expand Down Expand Up @@ -100,6 +101,19 @@ module.exports = function (supertest, app, api) {
});
}

static createResources(path, data, options) {
options = options || {};
return new Promise((resolve, reject) => {
supertest(app)
.post(path)
.send(data)
.expect(options.statusCode || Restypie.Codes.Created, (err, res) => {
if (err) return reject(err);
return resolve(Fixtures.extractReturn(res, options));
});
});
}

static getResource(path, id, options) {
options = options || {};
return new Promise((resolve, reject) => {
Expand Down Expand Up @@ -262,6 +276,10 @@ module.exports = function (supertest, app, api) {
static createUser(data, options) {
return Fixtures.createResource('/v1/users', data, options);
}

static createUsers(data, options) {
return Fixtures.createResources('/v1/users', data, options);
}

static generateUser(generator) {
const uuid = Fixtures.uuid();
Expand Down
102 changes: 61 additions & 41 deletions test/resources/lib/sequelize.test.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
'use strict';

const Sequelize = require('sequelize');
const express = require('express');
const http = require('http');

const db = new Sequelize('restypie_test', 'root', '', {
host: 'localhost',
Expand Down Expand Up @@ -96,46 +98,64 @@ describe('Resources.SequelizeResource', function () {
});
});

// describe('Own tests', function () {
//
// // FIXME those tests should use their own data
//
// it('should map min validation error', function () {
// return api.resources.users.createObject({
// body: {
// fName : 'Sequelize',
// lName : 'Sequelize',
// email : 'sequelizewrongdate@example.com',
// year : 1850, // Too small
// pw : 'Passw0rd',
// emails: true,
// gender: 'male'
// }
// }).catch(function (err) {
// err.code.should.equal('OutOfRangeError');
// err.meta.key.should.equal('yearOfBirth');
// return Promise.resolve();
// });
// });
//
// it('should map min validation error', function () {
// return api.resources.users.createObject({
// body: {
// fName : 'Sequelize',
// lName : 'Sequelize',
// email : 'sequelizewrongdate@example.com',
// year : new Date().getFullYear() + 10, // Too big
// pw : 'Passw0rd',
// emails: true,
// gender: 'male'
// }
// }).catch(function (err) {
// err.code.should.equal('OutOfRangeError');
// err.meta.key.should.equal('yearOfBirth');
// return Promise.resolve();
// });
// });
//
// });
describe('Own tests', function () {

const app = express();
const api = new Restypie.API({ path: 'v1', routerType: Restypie.RouterTypes.EXPRESS });
const PORT = 8333;
const server = http.createServer(app);

const UsersResource = require('../../resource-test-suite/resources/users')({
api,
resource: SequelizeResource
});

api
.registerResources({ users: UsersResource })
.launch(app, { port: PORT });



before(function (cb) {
return server.listen(PORT, cb);
});

it('should map min validation error', function () {
return api.resources.users.createObject({
body: {
fName : 'Sequelize',
lName : 'Sequelize',
email : 'sequelizewrongdate@example.com',
year : 1850, // Too small
pw : 'Passw0rd',
emails: true,
gender: 'male'
}
}).catch(function (err) {
err.code.should.equal('OutOfRangeError');
err.meta.key.should.equal('yearOfBirth');
return Promise.resolve();
});
});

it('should map max validation error', function () {
return api.resources.users.createObject({
body: {
fName : 'Sequelize',
lName : 'Sequelize',
email : 'sequelizewrongdate@example.com',
year : new Date().getFullYear() + 10, // Too big
pw : 'Passw0rd',
emails: true,
gender: 'male'
}
}).catch(function (err) {
err.code.should.equal('OutOfRangeError');
err.meta.key.should.equal('yearOfBirth');
return Promise.resolve();
});
});

});

});

0 comments on commit 97e065a

Please sign in to comment.