|
|
|
var _ = require('lodash'); |
|
var async = require('async'); |
|
var faker = require('faker'); |
|
var assert = require('assert'); |
|
var request = require('supertest'); |
|
var compare = require('compare-property'); |
|
|
|
var testUtils = require('../../lib/TestUtils'); |
|
var clients = require('../../fixtures/Client'); |
|
var vendors = require('../../fixtures/Vendor'); |
|
var poser = require('../../fixtures/poser'); |
|
|
|
var financialIcon = "<svg class=\"columbian white\" version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 100 100\" enable-background=\"new 0 0 100 100\" xml:space=\"preserve\"><g><path d=\"M52.7,57.9c0-9.5,7.7-17.2,17.2-17.2c4,0,7.7,1.4,10.6,3.7c1.9-6.6,0.2-13.8-4.9-18.8c-7.5-7.5-19.7-7.4-27.1,0.1c-7.5-7.5-19.6-7.5-27.1-0.1c-7.5,7.5-7.7,19.5,0.6,27.8c9.2,9.2,24,24,26.6,26.6c1.2-1.2,5-5,9.6-9.6C54.7,67.3,52.7,62.8,52.7,57.9z\"/><path d=\"M79.5,47.2c-2.6-2.3-5.9-3.7-9.6-3.7c-8,0-14.4,6.5-14.4,14.4c0,4.2,1.8,7.9,4.6,10.5c2.6,2.4,6,3.9,9.8,3.9c8,0,14.4-6.5,14.4-14.4C84.3,53.6,82.4,49.8,79.5,47.2z M70.9,65.2v2.5h-2.3v-2.3c-1.6,0-3.2-0.5-4.1-1l0.1-0.6l0.6-2.2c0.3,0.2,0.7,0.4,1.1,0.5c0.8,0.3,1.8,0.5,2.8,0.5c1.4,0,2.3-0.6,2.3-1.5c0-0.9-0.7-1.4-2.2-2c-0.1,0-0.2-0.1-0.3-0.1c-2.6-0.9-4.3-2.1-4.3-4.4c0-2.1,1.5-3.8,4.1-4.3v-2.3h2.3v2.1c1.6,0,2.7,0.4,3.5,0.8l-0.7,2.7c-0.6-0.3-1.7-0.8-3.5-0.8c-1.6,0-2.1,0.7-2.1,1.4c0,0.8,0.8,1.3,2.9,2c0.2,0.1,0.5,0.2,0.7,0.3c2.4,1,3.3,2.2,3.3,4.2C75.2,62.9,73.7,64.7,70.9,65.2z\"/></g></svg>"; |
|
|
|
var quotes = [ |
|
poser.quote(), |
|
poser.quote(), |
|
poser.quote(), |
|
poser.quote(), |
|
poser.quote(), |
|
poser.quote(), |
|
]; |
|
|
|
var fakeOtherClient = poser.client(); |
|
|
|
var users = [ |
|
poser.user({ id: quotes[0].owner, owner: clients.fakeTenant.id, team: clients.fakeTenant.teams[0] }), |
|
poser.user({ id: quotes[1].owner, owner: clients.fakeTenant.id, team: clients.fakeTenant.teams[0] }), |
|
poser.user({ owner: clients.fakeTenant.id, team: clients.fakeTenant.teams[1] }), |
|
poser.user({ owner: clients.fakeTenant.id, team: clients.fakeTenant.teams[1] }), |
|
poser.user({ id: quotes[2].owner, owner: fakeOtherClient.id, team: fakeOtherClient.teams[0] }), |
|
poser.user({ id: quotes[3].owner, owner: fakeOtherClient.id, team: fakeOtherClient.teams[0] }), |
|
poser.user({ id: quotes[4].owner, owner: fakeOtherClient.id, team: fakeOtherClient.teams[0] }), |
|
poser.user({ id: quotes[5].owner, owner: fakeOtherClient.id, team: fakeOtherClient.teams[0] }) |
|
]; |
|
var expectedUsers = users.slice(0, 4); |
|
|
|
var portfolioUnits = [ |
|
poser.portfolioUnit(), |
|
poser.portfolioUnit(), |
|
poser.portfolioUnit(), |
|
poser.portfolioUnit(), |
|
poser.portfolioUnit() |
|
] |
|
|
|
var portfolio = poser.portfolio({ |
|
clients: [ clients.fakeTenant.id ], |
|
portfolioUnits: _.map(portfolioUnits.slice(0, 3), "id"), |
|
}); |
|
|
|
var geographies = [ |
|
poser.geography({ owner: portfolioUnits[0].id }), |
|
poser.geography({ owner: portfolioUnits[1].id }) |
|
]; |
|
|
|
var tags = [ |
|
poser.tag({ owner: portfolioUnits[0].id }), |
|
poser.tag({ owner: portfolioUnits[1].id }) |
|
]; |
|
|
|
var opportunities = [ |
|
poser.opportunity({ typeIconUrl: financialIcon, supporterCount: 3, owner: portfolioUnits[0].id }), |
|
poser.opportunity({ typeIconUrl: financialIcon, supporterCount: 2, owner: portfolioUnits[0].id }), |
|
poser.opportunity({ typeIconUrl: financialIcon, supporterCount: 4, owner: portfolioUnits[1].id }), |
|
poser.opportunity({ typeIconUrl: financialIcon, supporterCount: 3, owner: portfolioUnits[2].id }), |
|
poser.opportunity({ typeIconUrl: financialIcon, supporterCount: 1, owner: portfolioUnits[2].id }), |
|
poser.opportunity({ typeIconUrl: financialIcon, supporterCount: 1, owner: portfolioUnits[2].id }), |
|
poser.opportunity({ typeIconUrl: financialIcon, supporterCount: 0, owner: portfolioUnits[3].id }), |
|
poser.opportunity({ typeIconUrl: financialIcon, supporterCount: 0, owner: portfolioUnits[4].id }) |
|
]; |
|
|
|
var engagements = [ |
|
poser.engagement({ opportunityId: opportunities[0].id, owner: users[0].id }), |
|
poser.engagement({ opportunityId: opportunities[0].id, owner: users[1].id }), |
|
poser.engagement({ opportunityId: opportunities[0].id, owner: users[2].id }), |
|
poser.engagement({ opportunityId: opportunities[1].id, owner: users[1].id }), |
|
poser.engagement({ opportunityId: opportunities[1].id, owner: users[2].id }), |
|
poser.engagement({ opportunityId: opportunities[2].id, owner: users[2].id }), |
|
poser.engagement({ opportunityId: opportunities[2].id, owner: users[3].id }), |
|
poser.engagement({ opportunityId: opportunities[2].id, owner: users[0].id }), |
|
poser.engagement({ opportunityId: opportunities[2].id, owner: users[5].id }), |
|
poser.engagement({ opportunityId: opportunities[2].id, owner: users[4].id }), |
|
poser.engagement({ opportunityId: opportunities[2].id, owner: users[3].id }), |
|
poser.engagement({ opportunityId: opportunities[3].id, owner: users[2].id }), |
|
poser.engagement({ opportunityId: opportunities[3].id, owner: users[1].id }), |
|
poser.engagement({ opportunityId: opportunities[3].id, owner: users[0].id }), |
|
poser.engagement({ opportunityId: opportunities[3].id, owner: users[7].id }), |
|
poser.engagement({ opportunityId: opportunities[3].id, owner: users[6].id }), |
|
poser.engagement({ opportunityId: opportunities[4].id, owner: users[7].id }), |
|
poser.engagement({ opportunityId: opportunities[4].id, owner: users[6].id }), |
|
poser.engagement({ opportunityId: opportunities[4].id, owner: users[5].id }), |
|
poser.engagement({ opportunityId: opportunities[4].id, owner: users[4].id }), |
|
poser.engagement({ opportunityId: opportunities[4].id, owner: users[3].id }), |
|
poser.engagement({ opportunityId: opportunities[5].id, owner: users[2].id }), |
|
poser.engagement({ opportunityId: opportunities[6].id, owner: users[7].id }), |
|
poser.engagement({ opportunityId: opportunities[6].id, owner: users[6].id }) |
|
]; |
|
|
|
var expected = { |
|
get client() { |
|
return _.extend({}, clients.fakeTenant, { |
|
enrolledEmployees: expectedUsers.length, |
|
projectedDonations: _.sum(expectedUsers, 'payrollDeduction') * 24, |
|
projectedDonationsUnit: "USD", |
|
portfolio: portfolio.id |
|
}); |
|
}, |
|
vendor: vendors.one, |
|
portfolioUnits: portfolio.portfolioUnits.map(function (idIn) { |
|
return _.find(portfolioUnits, { id: idIn }); |
|
}), |
|
opportunities: opportunities.slice(0,6), |
|
quotes: [ |
|
_.defaults( |
|
{}, |
|
_.pick(quotes[0], "id", "text", "owner"), |
|
_.pick(users[0], "avatarUrl", "firstName", "lastName") |
|
), |
|
_.defaults( |
|
{}, |
|
_.pick(quotes[1], "id", "text", "owner"), |
|
_.pick(users[1], "avatarUrl", "firstName", "lastName") |
|
) |
|
] |
|
}; |
|
|
|
describe('DataController', function() { |
|
before(function (done) { |
|
async.series( |
|
[].concat( |
|
testUtils.createAll([fakeOtherClient], Client), |
|
testUtils.createAll(portfolioUnits, PortfolioUnit), |
|
testUtils.createAll([portfolio], Portfolio), |
|
testUtils.createAll(opportunities, Opportunity), |
|
testUtils.createAll(quotes, Quote), |
|
testUtils.createAll(users, User), |
|
testUtils.createAll(geographies, Geography), |
|
testUtils.createAll(tags, Tag), |
|
[] |
|
), function (err, results) { |
|
if (err) return sails.log.error(JSON.stringify(err, 0, 2)), done(err); |
|
async.parallel([].concat( |
|
testUtils.createAll(engagements, Engagement) |
|
), done); |
|
geographies.forEach(function (geo) { |
|
var pu = _.find(portfolioUnits, { id: geo.owner }); |
|
pu.geographies.push(geo); |
|
}); |
|
tags.forEach(function (tag) { |
|
var pu = _.find(portfolioUnits, { id: tag.owner }); |
|
pu.tags.push(tag); |
|
}); |
|
} |
|
); |
|
}); |
|
after(function (done) { |
|
async.parallel( |
|
[].concat( |
|
testUtils.destroyAll(portfolioUnits, PortfolioUnit), |
|
testUtils.destroyAll([portfolio], Portfolio), |
|
testUtils.destroyAll(opportunities, Opportunity), |
|
testUtils.destroyAll(engagements, Engagement), |
|
testUtils.destroyAll(quotes, Quote), |
|
testUtils.destroyAll(users, User), |
|
testUtils.destroyAll(geographies, Geography), |
|
testUtils.destroyAll(tags, Tag), |
|
[] |
|
), done |
|
); |
|
}); |
|
describe('GET /data', function(){ |
|
it('should return all data for the Payroll Signup page', function(done) { |
|
this.timeout(10000); |
|
request(sails.hooks.http.app) |
|
.get('/data') |
|
.expect(200) |
|
.expect(function (res) { |
|
var body = res.body; |
|
var actualClient = _.omit(body.client, "createdAt", "updatedAt"); |
|
assert.deepEqual(actualClient, expected.client, "client mismatch"); |
|
assert.deepEqual(body.vendor, expected.vendor, "vendor mismatch"); |
|
|
|
var actualPus = body.portfolioUnits.map(function (pu) { |
|
return _.defaults({ |
|
geographies: pu.geographies.map(omitted("createdAt", "updatedAt")), |
|
tags: pu.tags.map(omitted("createdAt", "updatedAt")), |
|
}, _.omit(pu, "createdAt", "updatedAt")); |
|
}); |
|
actualPus.sort(compare.property('id')); |
|
expected.portfolioUnits.sort(compare.property('id')); |
|
assert.deepEqual(actualPus, expected.portfolioUnits, "portfolioUnits mismatch"); |
|
|
|
var actualOpportunities = body.opportunities.map(omitted("createdAt", "updatedAt")); |
|
actualOpportunities.sort(compare.property('id')); |
|
expected.opportunities.sort(compare.property('id')); |
|
assert.deepEqual(actualOpportunities, expected.opportunities, "opportunities mismatch"); |
|
|
|
var actualQuotes = body.quotes.map(omitted("createdAt", "updatedAt")); |
|
actualQuotes.sort(compare.property('id')); |
|
expected.quotes.sort(compare.property('id')); |
|
assert.deepEqual(actualQuotes, expected.quotes, "quotes mismatch"); |
|
}) |
|
.end(done) |
|
}) |
|
}); |
|
}); |
|
|
|
function omitted () { |
|
var args = _.flatten(_.slice(arguments)); |
|
return function (it) { return _.omit(it, args) }; |
|
} |