diff --git a/mocha.start.js b/mocha.start.js index af0bffa..9954e70 100644 --- a/mocha.start.js +++ b/mocha.start.js @@ -1,44 +1,20 @@ /*global assert:true */ 'use strict'; -var assert = require('chai').assert; -assert.equalObjects = function (a, b, m) { - assert.deepEqual(JSON.parse(JSON.stringify(a)), JSON.parse(JSON.stringify(b)), m || 'Objects should be equal!'); -}; +var JSData = require('js-data'); +var TestRunner = require('js-data-adapter-tests'); + var mocha = require('mocha'); var coMocha = require('co-mocha'); + coMocha(mocha); -var JSData = require('js-data'); JSData.DSUtils.Promise = require('bluebird'); -var DSSqlAdapter = require('./'); -var adapter, store, DSUtils, DSErrors, Profile, User, Post, Comment; +var DSSqlAdapter = require('./'); var globals = module.exports = { - fail: function (msg) { - assert.equal('should not reach this!: ' + msg, 'failure'); - }, - TYPES_EXCEPT_STRING: [123, 123.123, null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_ARRAY: [123, 123.123, null, undefined, {}, true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_NUMBER: [null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_OBJECT: [123, 123.123, null, undefined, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_NUMBER_OBJECT: [null, undefined, [], true, false, function () { - }], - TYPES_EXCEPT_STRING_OR_ARRAY_OR_NUMBER: [null, undefined, {}, true, false, function () { - }], - TYPES_EXCEPT_NUMBER: ['string', null, undefined, {}, [], true, false, function () { - }], - TYPES_EXCEPT_OBJECT: ['string', 123, 123.123, null, undefined, true, false, function () { - }], - TYPES_EXCEPT_BOOLEAN: ['string', 123, 123.123, null, undefined, {}, [], function () { - }], - TYPES_EXCEPT_FUNCTION: ['string', 123, 123.123, null, undefined, {}, [], true, false], - assert: assert, - adapter: undefined, + TestRunner: TestRunner, + assert: TestRunner.assert, co: require('co') }; @@ -52,91 +28,27 @@ for (var key in globals) { } test.globals(testGlobals); -beforeEach(function () { - store = new JSData.DS({ - log: false - }); - adapter = new DSSqlAdapter({ - client: 'mysql', - connection: { - host: process.env.DB_HOST || 'localhost', - user: process.env.DB_USER || process.env.C9_USER || 'ubuntu', - database: process.env.DB_NAME || (process.env.C9_USER ? 'c9' : 'circle_test') - //user: 'root', - //database: 'test' - } - }); - DSUtils = JSData.DSUtils; - DSErrors = JSData.DSErrors; - globals.Profile = global.Profile = Profile = store.defineResource({ - name: 'profile' - }); - globals.User = global.User = User = store.defineResource({ - name: 'user', - relations: { - hasMany: { - post: { - localField: 'posts', - foreignKey: 'post' - } - }, - hasOne: { - profile: { - localField: 'profile', - localKey: 'profileId' - } - } - } - }); - globals.Post = global.Post = Post = store.defineResource({ - name: 'post', - relations: { - belongsTo: { - user: { - localField: 'user', - localKey: 'userId' - } - }, - hasMany: { - comment: { - localField: 'comments', - foreignKey: 'postId' - } - } - } - }); - globals.Comment = global.Comment = Comment = store.defineResource({ - name: 'comment', - relations: { - belongsTo: { - post: { - localField: 'post', - localKey: 'postId' - }, - user: { - localField: 'user', - localKey: 'userId' - } - } - } - }); - - globals.adapter = adapter; - global.adapter = globals.adapter; - - globals.DSUtils = DSUtils; - global.DSUtils = globals.DSUtils; +var config = { + client: 'mysql', + connection: { + host: process.env.DB_HOST || 'localhost', + user: process.env.DB_USER || process.env.C9_USER || 'ubuntu', + database: process.env.DB_NAME || (process.env.C9_USER ? 'c9' : 'circle_test') + } +}; - globals.DSErrors = DSErrors; - global.DSErrors = globals.DSErrors; +TestRunner.init({ + DS: JSData.DS, + Adapter: DSSqlAdapter, + adapterConfig: config }); -afterEach(function* () { - globals.adapter = null; - global.adapter = null; - - yield adapter.destroyAll(Comment); - yield adapter.destroyAll(Post); - yield adapter.destroyAll(User); - yield adapter.destroyAll(Profile); +beforeEach(function () { + globals.DSUtils = global.DSUtils = this.$$DSUtils + globals.DSErrors = global.DSErrors = this.$$DSErrors + globals.adapter = global.adapter = this.$$adapter + globals.User = global.User = this.$$User + globals.Profile = global.Profile = this.$$Profile; + globals.Post = global.Post = this.$$Post; + globals.Comment = global.Comment = this.$$Comment; }); diff --git a/package.json b/package.json index a63c603..eee2978 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,13 @@ "babel-eslint": "4.1.3", "babel-loader": "5.3.2", "bluebird": "2.10.2", - "chai": "3.3.0", + "chai": "3.4.1", "co": "4.6.0", "co-mocha": "1.1.2", "codacy-coverage": "1.1.3", "coveralls": "2.11.4", "istanbul": "0.4.0", + "js-data-adapter-tests": "~1.x", "mocha": "2.3.3", "standard": "5.3.1", "webpack": "1.12.2" @@ -55,7 +56,7 @@ "mout": "0.11.0" }, "peerDependencies": { - "js-data": ">=2.0.0", + "js-data": "~2.x", "knex": ">=0.7.4" } } diff --git a/test/create.spec.js b/test/create.spec.js deleted file mode 100644 index e9fc6b0..0000000 --- a/test/create.spec.js +++ /dev/null @@ -1,23 +0,0 @@ -describe('DSSqlAdapter#create', function () { - it('should create a user in a sql db', function* () { - var createUser = yield adapter.create(User, {name: 'John'}); - var id = createUser.id; - assert.equal(createUser.name, 'John'); - assert.isDefined(createUser.id); - - var findUser = yield adapter.find(User, createUser.id); - assert.equal(findUser.name, 'John'); - assert.isDefined(findUser.id); - assert.equalObjects(findUser, {id: id, name: 'John', age: null, profileId: null}); - - var destoryUser = yield adapter.destroy(User, findUser.id); - assert.isFalse(!!destoryUser); - - try { - var findUser2 = yield adapter.find(User, id); - throw new Error('Should not have reached here!'); - } catch(err) { - assert.equal(err.message, 'Not Found!'); - } - }); -}); diff --git a/test/destroy.spec.js b/test/destroy.spec.js deleted file mode 100644 index 91c75d4..0000000 --- a/test/destroy.spec.js +++ /dev/null @@ -1,16 +0,0 @@ -describe('DSSqlAdapter#destroy', function () { - it('should destroy a user from a Sql db', function* () { - var createUser = yield adapter.create(User, {name: 'John'}) - var id = createUser.id; - - var destroyUser = yield adapter.destroy(User, createUser.id); - assert.isFalse(!!destroyUser); - - try { - var findUser = yield adapter.find(User, id); - throw new Error('Should not have reached here!'); - } catch (err) { - assert.equal(err.message, 'Not Found!'); - } - }); -}); diff --git a/test/destroyAll.spec.js b/test/destroyAll.spec.js deleted file mode 100644 index 171dcf1..0000000 --- a/test/destroyAll.spec.js +++ /dev/null @@ -1,14 +0,0 @@ -describe('DSSqlAdapter#destroyAll', function () { - it('should destroy all items', function* () { - var createUser = yield adapter.create(User, {name: 'John'}); - var id = createUser.id; - - var findUsers = yield adapter.findAll(User, { name: 'John' }); - assert.equal(findUsers.length, 1); - assert.equalObjects(findUsers[0], {id: id, name: 'John', age: null, profileId: null}); - - var destroyUser = yield adapter.destroyAll(User, { name: 'John' }); - var findUsers2 = yield adapter.findAll(User, { name: 'John' }); - assert.equal(findUsers2.length, 0); - }); -}); diff --git a/test/find.spec.js b/test/find.spec.js deleted file mode 100644 index a961a06..0000000 --- a/test/find.spec.js +++ /dev/null @@ -1,83 +0,0 @@ -describe('DSSqlAdapter#find', function () { - it('should find a user in a Sql db', function* () { - var user = yield adapter.create(User, {name: 'John'}); - var userId = user.id; - assert.equal(user.name, 'John'); - assert.isDefined(user.id); - - var user2 = yield adapter.find(User, user.id); - assert.equal(user2.name, 'John'); - assert.isDefined(user2.id); - assert.equalObjects(user2, {id: userId, name: 'John', age: null, profileId: null}); - - var post = yield adapter.create(Post, { content: 'test', userId: userId }); - var postId = post.id; - assert.equal(post.content, 'test'); - assert.isDefined(post.id); - assert.isDefined(post.userId); - - var comments = yield [ - adapter.create(Comment, { - content: 'test2', - postId: post.id, - userId: user.id - }), - adapter.create(Comment, { - content: 'test3', - postId: post.id, - userId: user.id - }) - ]; - - comments.sort(function (a, b) { - return a.content > b.content; - }); - - var findPost = yield adapter.find(Post, postId, {with: ['user', 'comment']}); - findPost.comments.sort(function (a, b) { - return a.content > b.content; - }); - assert.equalObjects(findPost.user, user); - assert.equalObjects(findPost.comments, comments); - - yield adapter.destroyAll(Comment); - yield adapter.destroy(Post, postId); - var destroyUser = yield adapter.destroy(User, userId); - assert.isFalse(!!destroyUser); - - try { - yield adapter.find(User, userId); - throw new Error('Should not have reached here!'); - } catch (err) { - assert.equal(err.message, 'Not Found!'); - } - }); - - it('should load belongsTo relations', function* () { - var profile = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user = yield adapter.create(User, {name: 'John', profileId: profile.id}); - var post = yield adapter.create(Post, {content: 'foo', userId: user.id}); - var comment = yield adapter.create(Comment, { content: 'test2', postId: post.id, userId: post.userId }); - - var comment = yield adapter.find(Comment, comment.id, {'with': ['user', 'user.profile', 'post', 'post.user']}); - assert.isDefined(comment); - assert.isDefined(comment.post); - assert.isDefined(comment.post.user); - assert.isDefined(comment.user); - assert.isDefined(comment.user.profile); - }); - - it('should load hasMany and belongsTo relations', function* () { - var profile = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user = yield adapter.create(User, {name: 'John', profileId: profile.id}); - var post = yield adapter.create(Post, {content: 'foo', userId: user.id}); - var comment = yield adapter.create(Comment, { content: 'test2', postId: post.id, userId: post.userId }); - - var foundPost = yield adapter.find(Post, post.id, {'with': ['user', 'comment', 'comment.user', 'comment.user.profile']}); - assert.isDefined(foundPost.comments); - assert.isDefined(foundPost.comments[0].user); - assert.isDefined(foundPost.comments[0].user.profile); - assert.isDefined(foundPost.user); - }); - -}); diff --git a/test/findAll.spec.js b/test/findAll.spec.js deleted file mode 100644 index 550534f..0000000 --- a/test/findAll.spec.js +++ /dev/null @@ -1,194 +0,0 @@ -describe('DSSqlAdapter#findAll', function () { - it('should filter users', function* () { - var users = yield adapter.findAll(User, { age: 30 }); - assert.equal(users.length, 0); - - var user = yield adapter.create(User, {name: 'John'}); - var id = user.id; - - var users2 = yield adapter.findAll(User, { name: 'John' }); - assert.equal(users2.length, 1); - assert.equalObjects(users2[0], {id: id, name: 'John', age: null, profileId: null}); - - var destroyedUser = yield adapter.destroy(User, id); - assert.isFalse(!!destroyedUser); - }); - - it('should filter users using the "in" operator', function* () { - var users = yield adapter.findAll(User, { - where: { - age: { - 'in': [30] - } - } - }); - assert.equal(users.length, 0); - - var user = yield adapter.create(User, {name: 'John'}); - var id = user.id; - - var users2 = yield adapter.findAll(User, { name: 'John' }); - assert.equal(users2.length, 1); - assert.equalObjects(users2[0], {id: id, name: 'John', age: null, profileId: null}); - - var destroyedUser = yield adapter.destroy(User, id); - assert.isFalse(!!destroyedUser); - }); - - it('should filter users using the "like" operator', function* () { - var users = yield adapter.findAll(User, { - where: { - name: { - 'like': '%J%' - } - } - }); - assert.equal(users.length, 0); - - var user = yield adapter.create(User, {name: 'John'}); - var id = user.id; - - var users2 = yield adapter.findAll(User, { - where: { - name: { - 'like': '%J%' - } - } - }); - assert.equal(users2.length, 1); - assert.deepEqual(users2[0], {id: id, name: 'John', age: null, profileId: null}); - - var destroyedUser = yield adapter.destroy(User, id); - assert.isFalse(!!destroyedUser); - }); - - it('should throw "Operator not found" error', function* () { - var op = '>=<'; - - assert.throw(function () { - return adapter.findAll(User, { - where: { - name: { - op: 'John' - } - } - }); - } - , Error, 'Operator not found'); - }); - - it('should load belongsTo relations', function* () { - var profile1 = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user1 = yield adapter.create(User, {name: 'John', profileId: profile1.id}); - var post1 = yield adapter.create(Post, {content: 'foo', userId: user1.id}); - var comment1 = yield adapter.create(Comment, { content: 'test2', postId: post1.id, userId: post1.userId }); - - var user2 = yield adapter.create(User, {name: 'Sally'}); - var post2 = yield adapter.create(Post, {content: 'bar', userId: user2.id}); - var comment2 = yield adapter.create(Comment, { content: 'test3', postId: post2.id, userId: post2.userId }); - - var comments = yield adapter.findAll(Comment, {}, {'with': ['user', 'user.profile', 'post', 'post.user']}); - assert.isDefined(comments[0].post); - assert.isDefined(comments[0].post.user); - assert.isDefined(comments[0].user); - assert.isDefined(comments[0].user.profile || comments[1].user.profile); - assert.isDefined(comments[1].post); - assert.isDefined(comments[1].post.user); - assert.isDefined(comments[1].user); - }); - - it('should load hasMany and belongsTo relations', function* () { - var profile = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user1 = yield adapter.create(User, {name: 'John', profileId: profile.id}); - var post1 = yield adapter.create(Post, {content: 'foo', userId: user1.id}); - var comment1 = yield adapter.create(Comment, { content: 'test2', postId: post1.id, userId: post1.userId }); - - var user2 = yield adapter.create(User, {name: 'Sally'}); - var post2 = yield adapter.create(Post, {content: 'bar', userId: user2.id}); - var comment2 = yield adapter.create(Comment, { content: 'test3', postId: post2.id, userId: post2.userId }); - - var posts = yield adapter.findAll(Post, {}, {'with': ['user', 'comment', 'comment.user', 'comment.user.profile']}); - assert.isDefined(posts[0].comments); - assert.isDefined(posts[0].comments[0].user); - assert.isDefined(posts[0].comments[0].user.profile || posts[1].comments[0].user.profile); - assert.isDefined(posts[0].user); - assert.isDefined(posts[1].comments); - assert.isDefined(posts[1].comments[0].user); - assert.isDefined(posts[1].user); - }); - - it('should filter using belongsTo relation', function* () { - var profile1 = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user1 = yield adapter.create(User, {name: 'John', profileId: profile1.id}); - var post1 = yield adapter.create(Post, {content: 'foo', userId: user1.id}); - var comment1 = yield adapter.create(Comment, {content: 'test1', postId: post1.id, userId: post1.userId}); - - var user2 = yield adapter.create(User, {name: 'Sally'}); - var post2 = yield adapter.create(Post, {content: 'bar', userId: user2.id}); - var comment2 = yield adapter.create(Comment, {content: 'test2', postId: post2.id, userId: post2.userId}); - - var users = yield adapter.findAll(User, {'profile.email': 'foo@test.com'}); - assert.equal(users.length, 1); - assert.equal(users[0].profileId, profile1.id); - assert.equal(users[0].name, 'John'); - }); - - it('should filter through multiple hasOne/belongsTo relations', function* () { - var profile1 = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user1 = yield adapter.create(User, {name: 'John', profileId: profile1.id}); - var post1 = yield adapter.create(Post, {content: 'foo', userId: user1.id}); - var comment1 = yield adapter.create(Comment, {content: 'test1', postId: post1.id, userId: post1.userId}); - - var profile2 = yield adapter.create(Profile, { email: 'bar@test.com' }); - var user2 = yield adapter.create(User, {name: 'Sally', profileId: profile2.id}); - var post2 = yield adapter.create(Post, {content: 'bar', userId: user2.id}); - var comment2 = yield adapter.create(Comment, {content: 'test2', postId: post2.id, userId: post2.userId}); - - var comments = yield adapter.findAll(Comment, { 'user.profile.email': 'foo@test.com' }) - assert.equal(comments.length, 1); - assert.equal(comments[0].userId, user1.id); - assert.equal(comments[0].content, 'test1'); - }); - - it('should filter using multiple hasOne/belongsTo relations', function* () { - var profile1 = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user1 = yield adapter.create(User, {name: 'John', profileId: profile1.id}); - var post1 = yield adapter.create(Post, {content: 'foo', userId: user1.id}); - var comment1 = yield adapter.create(Comment, {content: 'test1', postId: post1.id, userId: post1.userId}); - - var profile2 = yield adapter.create(Profile, { email: 'bar@test.com' }); - var user2 = yield adapter.create(User, {name: 'Sally', profileId: profile2.id}); - var post2 = yield adapter.create(Post, {content: 'bar', userId: user2.id}); - var comment2 = yield adapter.create(Comment, {content: 'test2', postId: post2.id, userId: post2.userId}); - - var comments = yield adapter.findAll(Comment, { 'user.name': 'John', 'user.profile.email': 'foo@test.com' }) - assert.equal(comments.length, 1); - assert.equal(comments[0].userId, user1.id); - assert.equal(comments[0].content, 'test1'); - }); - - it('should allow passing limit and offset as strings', function* () { - var user = yield adapter.findAll(User, {limit: '10', offset: '20'}); - }); - - it('should not return relation columns on parent', function* () { - var profile1 = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user1 = yield adapter.create(User, {name: 'John', profileId: profile1.id}); - - var users = yield adapter.findAll(User, {'profile.email': 'foo@test.com'}); - assert.equal(users.length, 1); - assert.equal(users[0].profileId, profile1.id); - assert.isUndefined(users[0].email); - }); - - it('should filter when relations have same column if column is qualified', function* () { - var profile1 = yield adapter.create(Profile, { email: 'foo@test.com' }); - var user1 = yield adapter.create(User, {name: 'John', profileId: profile1.id}); - - // `id` column must be qualified with `user.` - var users = yield adapter.findAll(User, {'user.id': user1.id, 'profile.email': 'foo@test.com'}); - assert.equal(users.length, 1); - assert.equal(users[0].profileId, profile1.id); - }); - -}); diff --git a/test/update.spec.js b/test/update.spec.js deleted file mode 100644 index 03e185d..0000000 --- a/test/update.spec.js +++ /dev/null @@ -1,33 +0,0 @@ -describe('DSSqlAdapter#update', function () { - it('should update a user in a Sql db', function* () { - var user = yield adapter.create(User, {name: 'John'}) - var id = user.id; - assert.equal(user.name, 'John'); - assert.isDefined(user.id); - - var foundUser = yield adapter.find(User, user.id); - assert.equal(foundUser.name, 'John'); - assert.isDefined(foundUser.id); - assert.equalObjects(foundUser, {id: id, name: 'John', age: null, profileId: null}); - - var updatedUser = yield adapter.update(User, foundUser.id, {name: 'Johnny'}); - assert.equal(updatedUser.name, 'Johnny'); - assert.isDefined(updatedUser.id); - assert.equalObjects(updatedUser, {id: id, name: 'Johnny', age: null, profileId: null}); - - var foundUser2 = yield adapter.find(User, updatedUser.id); - assert.equal(foundUser2.name, 'Johnny'); - assert.isDefined(foundUser2.id); - assert.equalObjects(foundUser2, {id: id, name: 'Johnny', age: null, profileId: null}); - - var destroyUser = yield adapter.destroy(User, foundUser2.id); - assert.isFalse(!!destroyUser); - - try { - yield adapter.find(User, id); - throw new Error('Should not have reached here!'); - } catch (err) { - assert.equal(err.message, 'Not Found!'); - } - }); -}); diff --git a/test/updateAll.spec.js b/test/updateAll.spec.js deleted file mode 100644 index cda2ad1..0000000 --- a/test/updateAll.spec.js +++ /dev/null @@ -1,43 +0,0 @@ -describe('DSSqlAdapter#updateAll', function () { - it('should update all items', function* () { - var user1 = yield adapter.create(User, {name: 'John', age: 20}) - var userId1 = user1.id; - - var user2 = yield adapter.create(User, {name: 'John', age: 30}); - var userId2 = user2.id; - - var users = yield adapter.findAll(User, { name: 'John' }); - users.sort(function (a, b) { - return a.age - b.age; - }); - assert.equalObjects(users, [ - {id: userId1, name: 'John', age: 20, profileId: null}, - {id: userId2, name: 'John', age: 30, profileId: null} - ]); - - var users2 = yield adapter.updateAll(User, { name: 'Johnny' }, { name: 'John' }); - users2.sort(function (a, b) { - return a.age - b.age; - }); - assert.equalObjects(users2, [ - {id: userId1, name: 'Johnny', age: 20, profileId: null}, - {id: userId2, name: 'Johnny', age: 30, profileId: null} - ]); - - var users3 = yield adapter.findAll(User, { name: 'John' }); - assert.equalObjects(users3, []); - assert.equal(users3.length, 0); - - var users4 = yield adapter.findAll(User, { name: 'Johnny' }); - users4.sort(function (a, b) { - return a.age - b.age; - }); - assert.equalObjects(users4, [ - {id: userId1, name: 'Johnny', age: 20, profileId: null}, - {id: userId2, name: 'Johnny', age: 30, profileId: null} - ]); - - var destroyedUser = yield adapter.destroyAll(User); - assert.isFalse(!!destroyedUser); - }); -});