四好公路
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

165 lines
5.0 KiB

'use strict';
var Promise = require('bluebird'),
request = require('request'),
expect = require('chai').expect,
_ = require('lodash'),
rest = require('../../lib'),
test = require('../support');
describe('Associations(HasMany)', function() {
before(function() {
test.models.User = test.db.define('users', {
name: test.Sequelize.STRING
}, {
underscored: true,
timestamps: false
});
test.models.App = test.db.define('apps', {
name: test.Sequelize.STRING
}, {
underscored: true,
timestamps: false
});
test.models.Task = test.db.define('tasks', {
name: test.Sequelize.STRING
}, {
underscored: true,
timestamps: false
});
test.models.User.hasMany(test.models.Task);
test.models.App.hasMany(test.models.User);
test.models.User.belongsTo(test.models.App);
});
beforeEach(function() {
return Promise.all([ test.initializeDatabase(), test.initializeServer() ])
.then(function() {
rest.initialize({
app: test.app,
sequelize: test.Sequelize
});
test.resource = rest.resource({
model: test.models.User,
endpoints: ['/users', '/users/:id'],
associations: true
});
return Promise.all([
test.models.User.create({ name: 'sumo' }),
test.models.User.create({ name: 'ninja' }),
test.models.Task.create({ name: 'eat' }),
test.models.Task.create({ name: 'sleep' }),
test.models.Task.create({ name: 'eat again' }),
test.models.Task.create({ name: 'fight' })
]).spread(function(user, user2, task1, task2, task3, task4) {
return Promise.all([
user.setTasks([task1, task2, task3]),
user2.setTasks([task4])
]);
});
});
});
afterEach(function() {
return test.clearDatabase()
.then(function() { return test.closeServer(); });
});
// TESTS
describe('read', function() {
it('should return associated data by url', function(done) {
request.get({
url: test.baseUrl + '/users/1/tasks/1'
}, function(error, response, body) {
expect(response.statusCode).to.equal(200);
var result = _.isObject(body) ? body : JSON.parse(body);
expect(result).to.eql({ id: 1, name: 'eat', user_id: 1 });
done();
});
});
it('should return associated data by url without foreign keys', function(done) {
test.resource.associationOptions.removeForeignKeys = true;
request.get({
url: test.baseUrl + '/users/1/tasks/1'
}, function(error, response, body) {
expect(response.statusCode).to.equal(200);
var result = _.isObject(body) ? body : JSON.parse(body);
expect(result).to.eql({ id: 1, name: 'eat' });
test.resource.associationOptions.removeForeignKeys = false;
done();
});
});
});
describe('list', function() {
it('should return associated data by url', function(done) {
request.get({
url: test.baseUrl + '/users/1/tasks'
}, function(error, response, body) {
expect(response.statusCode).to.equal(200);
var result = _.isObject(body) ? body : JSON.parse(body);
expect(result).to.eql([
{ id: 1, name: 'eat', user_id: 1 },
{ id: 2, name: 'sleep', user_id: 1 },
{ id: 3, name: 'eat again', user_id: 1 }
]);
done();
});
});
it('should return associated data by url without foreign keys', function(done) {
test.resource.associationOptions.removeForeignKeys = true;
request.get({
url: test.baseUrl + '/users/1/tasks'
}, function(error, response, body) {
expect(response.statusCode).to.equal(200);
var result = _.isObject(body) ? body : JSON.parse(body);
expect(result).to.eql([
{ id: 1, name: 'eat' },
{ id: 2, name: 'sleep' },
{ id: 3, name: 'eat again' }
]);
test.resource.associationOptions.removeForeignKeys = false;
done();
});
});
it('should return associated data by url (2)', function(done) {
request.get({
url: test.baseUrl + '/users/2/tasks'
}, function(error, response, body) {
expect(response.statusCode).to.equal(200);
var result = _.isObject(body) ? body : JSON.parse(body);
expect(result).to.eql([ { id: 4, name: 'fight', user_id: 2 } ]);
done();
});
});
it('should return associated data by url without foreign keys (2)', function(done) {
test.resource.associationOptions.removeForeignKeys = true;
request.get({
url: test.baseUrl + '/users/2/tasks'
}, function(error, response, body) {
expect(response.statusCode).to.equal(200);
var result = _.isObject(body) ? body : JSON.parse(body);
expect(result).to.eql([ { id: 4, name: 'fight' } ]);
test.resource.associationOptions.removeForeignKeys = false;
done();
});
});
});
});