From 6fa40c3f9b42d796859888785995ae06c4022d5f Mon Sep 17 00:00:00 2001 From: David Jay Date: Mon, 14 Nov 2016 15:11:25 -0500 Subject: [PATCH] Adding model tests for assets. --- models/asset.js | 12 +- tests/models/asset.js | 181 +++++++++++++++++-------------- tests/routes/api/assets/index.js | 95 ++++++++++++++++ 3 files changed, 203 insertions(+), 85 deletions(-) create mode 100644 tests/routes/api/assets/index.js diff --git a/models/asset.js b/models/asset.js index de8155131..1092cd3e0 100644 --- a/models/asset.js +++ b/models/asset.js @@ -62,11 +62,21 @@ AssetSchema.statics.findByUrl = function(url) { }; +/** + * Finds a asset by its url. + * @param {String} url identifier of the asset (uuid). +*/ +AssetSchema.statics.findOrCreateByUrl = function(url) { + + return Asset.findOne({url}) + .then((asset) => asset ? asset + : Asset.upsert({url})); +}; + /** * Upserts an asset. */ AssetSchema.statics.upsert = function(data) { - // If an id is not sent, create one. if (typeof data.id === 'undefined') { data.id = uuid.v4(); diff --git a/tests/models/asset.js b/tests/models/asset.js index b4d950a93..d0c3d3429 100644 --- a/tests/models/asset.js +++ b/tests/models/asset.js @@ -1,95 +1,108 @@ +/* eslint-env node, mocha */ + require('../utils/mongoose'); -const chai = require('chai'); -const expect = chai.expect; -const server = require('../../app'); +const Asset = require('../../models/asset'); +const expect = require('chai').expect; -// Setup chai. -chai.should(); -chai.use(require('chai-http')); +describe('Asset: model', () => { -let fixture = { - 'url': 'http://hhgg.com/total-perspective-vortex', - 'type': 'article', - 'headline': 'The Total Perspective Vortex', - 'summary': 'You are an insignificant dot on an insignificant dot.', - 'section': 'Everything', - 'authors': ['Ford Prefect'] -}; + beforeEach(() => { + const defaults = {url:'http://test.com'}; + return Asset.update({id: '1'}, {$setOnInsert: defaults}, {upsert: true}); + }); -describe('Asset: models', () => { - - describe('/GET Asset', () => { - describe('#get', () => { - it('It should get an empty array when there are no assets.', (done) => { - - chai.request(server) - .get('/api/v1/asset') - .end((err, res) => { - - if (err) { - throw new Error(err); - } - - res.should.have.status(200); - res.body.should.be.a('array'); - res.body.length.should.be.eql(0); - done(); - }); - - }); + describe('#findById', ()=> { + it('should find an asset by the id', () => { + return Asset.findById(1) + .then((asset) => { + expect(asset).to.have.property('url') + .and.to.equal('http://test.com'); + }); }); }); - // This test checks PUT and read - describe('/PUT Asset', () => { - describe('#put', () => { - it('It should save an asset and load it again.', (done) => { - - chai.request(server) - .put('/api/v1/asset') - .send(fixture) - .end((err, res) => { - - if (err) { - throw new Error(err); - } - - res.should.have.status(200); - res.body.should.be.a('object'); - - // Id should be generated by the model if absent. - res.body.should.have.property('id'); - - // Save the asset id to compare with GET result. - let assetId = res.body.id; - - // Load the asset to make sure it's really there. - chai.request(server) - .get(`/api/v1/asset?url=${encodeURIComponent(fixture.url)}`) - .end((err, res) => { - - if (err) { - throw new Error(err); - } - - res.should.have.status(200); - res.body.should.be.an('array'); - - let asset = res.body[0]; - - expect(asset).to.have.property('id'); - - // Ensure the asset has the same id as above. - // This tests the single url per Id concept. - expect(assetId).to.equal(asset.id); - - done(); - - }); - }); - }); + describe('#findByUrl', ()=> { + it('should find an asset by a url', () => { + return Asset.findByUrl('http://test.com') + .then((asset) => { + expect(asset).to.have.property('url') + .and.to.equal('http://test.com'); + }); }); - }); // End describe /PUT Asset + it('should return null when a url does not exist', () => { + return Asset.findByUrl('http://new.test.com') + .then((asset) => { + expect(asset).to.be.null; + }); + }); + }); + + describe('#findOrCreateByUrl', ()=> { + it('should find an asset by a url', () => { + return Asset.findOrCreateByUrl('http://test.com') + .then((asset) => { + expect(asset).to.have.property('url') + .and.to.equal('http://test.com'); + }); + }); + + it('should return a new asset when the url does not exist', () => { + return Asset.findOrCreateByUrl('http://new.test.com') + .then((asset) => { + expect(asset).to.have.property('id') + .and.to.not.equal(1); + }); + }); + }); + + describe('#findOrCreateByUrl', ()=> { + it('should find an asset by a url', () => { + return Asset.findOrCreateByUrl('http://test.com') + .then((asset) => { + expect(asset).to.have.property('url') + .and.to.equal('http://test.com'); + }); + }); + + it('should return a new asset when the url does not exist', () => { + return Asset.findOrCreateByUrl('http://new.test.com') + .then((asset) => { + expect(asset).to.have.property('id') + .and.to.not.equal(1); + }); + }); + }); + + describe('#upsert', ()=> { + it('should insert an asset with no id', () => { + return Asset.upsert({url: 'http://newasset.test.com'}) + .then((asset) => { + expect(asset).to.have.property('id'); + }); + }); + + it('should update an asset when the id exists', () => { + return Asset.upsert({id: 1, url: 'http://new.test.com'}) + .then((asset) => { + expect(asset).to.have.property('id') + .and.to.equal('1'); + expect(asset).to.have.property('url') + .and.to.equal('http://new.test.com'); + }); + }); + }); + + describe('#removeAll', ()=> { + it('should insert an asset with no id', () => { + return Asset.removeAll({id:1}) + .then(() => { + return Asset.findById(1); + }) + .then((result) => { + expect(result).to.be.null; + }); + }); + }); }); diff --git a/tests/routes/api/assets/index.js b/tests/routes/api/assets/index.js new file mode 100644 index 000000000..aa764e214 --- /dev/null +++ b/tests/routes/api/assets/index.js @@ -0,0 +1,95 @@ +require('../../../utils/mongoose'); + +const chai = require('chai'); +const expect = chai.expect; +const server = require('../../../../app'); + +// Setup chai. +chai.should(); +chai.use(require('chai-http')); + +let fixture = { + 'url': 'http://hhgg.com/total-perspective-vortex', + 'type': 'article', + 'headline': 'The Total Perspective Vortex', + 'summary': 'You are an insignificant dot on an insignificant dot.', + 'section': 'Everything', + 'authors': ['Ford Prefect'] +}; + +describe('Asset: routes', () => { + + describe('/GET Asset', () => { + describe('#get', () => { + it('It should get an empty array when there are no assets.', (done) => { + + chai.request(server) + .get('/api/v1/asset') + .end((err, res) => { + + if (err) { + throw new Error(err); + } + + res.should.have.status(200); + res.body.should.be.a('array'); + res.body.length.should.be.eql(0); + done(); + }); + + }); + }); + }); + + // This test checks PUT and read + describe('/PUT Asset', () => { + describe('#put', () => { + it('It should save an asset and load it again.', (done) => { + + chai.request(server) + .put('/api/v1/asset') + .send(fixture) + .end((err, res) => { + + if (err) { + throw new Error(err); + } + + res.should.have.status(200); + res.body.should.be.a('object'); + + // Id should be generated by the model if absent. + res.body.should.have.property('id'); + + // Save the asset id to compare with GET result. + let assetId = res.body.id; + + // Load the asset to make sure it's really there. + chai.request(server) + .get(`/api/v1/asset?url=${encodeURIComponent(fixture.url)}`) + .end((err, res) => { + + if (err) { + throw new Error(err); + } + + res.should.have.status(200); + res.body.should.be.an('array'); + + let asset = res.body[0]; + + expect(asset).to.have.property('id'); + + // Ensure the asset has the same id as above. + // This tests the single url per Id concept. + expect(assetId).to.equal(asset.id); + + done(); + + }); + }); + }); + }); + }); // End describe /PUT Asset + +});