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.
172 lines
5.0 KiB
172 lines
5.0 KiB
3 years ago
|
'use strict';
|
||
|
|
||
|
var Promise = require('bluebird'),
|
||
|
request = require('request'),
|
||
|
expect = require('chai').expect,
|
||
|
_ = require('lodash'),
|
||
|
rest = require('../../lib'),
|
||
|
test = require('../support');
|
||
|
|
||
|
describe('Associations(HasOne)', function() {
|
||
|
before(function() {
|
||
|
test.models.User = test.db.define('users', {
|
||
|
id: { type: test.Sequelize.INTEGER, autoIncrement: true, primaryKey: true },
|
||
|
username: { type: test.Sequelize.STRING, unique: true },
|
||
|
email: { type: test.Sequelize.STRING, unique: true, validate: { isEmail: true } }
|
||
|
}, {
|
||
|
underscored: true,
|
||
|
timestamps: false
|
||
|
});
|
||
|
|
||
|
test.models.Address = test.db.define('addresses', {
|
||
|
id: { type: test.Sequelize.INTEGER, autoIncrement: true, primaryKey: true },
|
||
|
street: { type: test.Sequelize.STRING },
|
||
|
state_province: { type: test.Sequelize.STRING },
|
||
|
postal_code: { type: test.Sequelize.STRING },
|
||
|
country_code: { type: test.Sequelize.STRING }
|
||
|
}, {
|
||
|
underscored: true,
|
||
|
timestamps: false
|
||
|
});
|
||
|
|
||
|
test.models.User.hasOne(test.models.Address);
|
||
|
});
|
||
|
|
||
|
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
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
afterEach(function() {
|
||
|
return test.clearDatabase()
|
||
|
.then(function() { return test.closeServer(); });
|
||
|
});
|
||
|
|
||
|
// TESTS
|
||
|
describe('read', function() {
|
||
|
beforeEach(function() {
|
||
|
return Promise.all([
|
||
|
test.models.Address.create({
|
||
|
street: '221B Baker Street',
|
||
|
state_province: 'London',
|
||
|
postal_code: 'NW1',
|
||
|
country_code: '44'
|
||
|
}),
|
||
|
test.models.Address.create({
|
||
|
street: 'Avenue de l\'Atomium',
|
||
|
state_province: 'Brussels',
|
||
|
postal_code: '1020',
|
||
|
country_code: '32'
|
||
|
}),
|
||
|
test.models.User.create({
|
||
|
username: 'sherlock',
|
||
|
email: 'sherlock@holmes.com'
|
||
|
}),
|
||
|
test.models.User.create({
|
||
|
username: 'MannekenPis',
|
||
|
email: 'manneken.pis@brussels.be'
|
||
|
})
|
||
|
]).spread(function(address, address2, user, user2) {
|
||
|
return user.setAddress(address).then(function() {
|
||
|
return user2.setAddress(address2);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should return associated data by url', function(done) {
|
||
|
request.get({
|
||
|
url: test.baseUrl + '/users/1/address'
|
||
|
}, function(error, response, body) {
|
||
|
expect(response.statusCode).to.equal(200);
|
||
|
var result = _.isObject(body) ? body : JSON.parse(body);
|
||
|
var expected = {
|
||
|
id: 1,
|
||
|
street: '221B Baker Street',
|
||
|
state_province: 'London',
|
||
|
postal_code: 'NW1',
|
||
|
country_code: '44',
|
||
|
user_id: 1
|
||
|
};
|
||
|
|
||
|
expect(result).to.eql(expected);
|
||
|
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/address'
|
||
|
}, function(error, response, body) {
|
||
|
expect(response.statusCode).to.equal(200);
|
||
|
var result = _.isObject(body) ? body : JSON.parse(body);
|
||
|
var expected = {
|
||
|
id: 1,
|
||
|
street: '221B Baker Street',
|
||
|
state_province: 'London',
|
||
|
postal_code: 'NW1',
|
||
|
country_code: '44'
|
||
|
};
|
||
|
|
||
|
expect(result).to.eql(expected);
|
||
|
test.resource.associationOptions.removeForeignKeys = false;
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should return associated data by url (2)', function(done) {
|
||
|
request.get({
|
||
|
url: test.baseUrl + '/users/2/address'
|
||
|
}, function(error, response, body) {
|
||
|
expect(response.statusCode).to.equal(200);
|
||
|
var result = _.isObject(body) ? body : JSON.parse(body);
|
||
|
var expected = {
|
||
|
id: 2,
|
||
|
street: 'Avenue de l\'Atomium',
|
||
|
state_province: 'Brussels',
|
||
|
postal_code: '1020',
|
||
|
country_code: '32',
|
||
|
user_id: 2
|
||
|
};
|
||
|
|
||
|
expect(result).to.eql(expected);
|
||
|
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/address'
|
||
|
}, function(error, response, body) {
|
||
|
expect(response.statusCode).to.equal(200);
|
||
|
var result = _.isObject(body) ? body : JSON.parse(body);
|
||
|
var expected = {
|
||
|
id: 2,
|
||
|
street: 'Avenue de l\'Atomium',
|
||
|
state_province: 'Brussels',
|
||
|
postal_code: '1020',
|
||
|
country_code: '32'
|
||
|
};
|
||
|
|
||
|
expect(result).to.eql(expected);
|
||
|
test.resource.associationOptions.removeForeignKeys = false;
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
});
|
||
|
|
||
|
});
|