diff --git a/src/libs/models/simulation.js b/src/libs/models/simulation.js index a445c28064b681a69f306c5c71ba49d89584467a..cf6ad41c09f860d573dc1a5867fb8930d7b761ac 100644 --- a/src/libs/models/simulation.js +++ b/src/libs/models/simulation.js @@ -19,38 +19,73 @@ let SimulationSchema = new Schema({ failure_rate: Array, goals_care: Array, goals_inclusion: Array, + enrollments: Array, }); SimulationSchema.methods.setTime = function (t) { t = parseInt(t, 10); if (!t || t > MAX_SIMULATION_TIME) { // Throw an error? - return; + return false; } this.time = t; + return true; }; SimulationSchema.methods.setLocation = function (l) { // Should sanitize this.location = l; + return true; }; SimulationSchema.methods.setFailureRate = function (fr) { // Should sanitize this.failure_rate = fr; + return true; }; SimulationSchema.methods.setCareGoals = function (g) { // Should sanitize this.goals_care = g; + return true; }; SimulationSchema.methods.setInclusionGoals = function (g) { // Should sanitize this.goals_inclusion = g; + return true; }; +SimulationSchema.methods.setEnrollments = function (e) { + e = JSON.parse(e); + for(let i=0; i<e.length; i++){ + if(!(e[i] instanceof Array)){ + return false; + } + if(e[i].length !== this.time){ + return false; + } + for(let n of e[i]) + if(!(n instanceof Number) && (n !== parseInt(n, 10))){ + return false; + } + } + log.debug("rolou"); + this.enrollments = e; + + return true; +} SimulationSchema.methods.update = function (property, value) { - if (property === 'time') this.setTime(value); - if (property === 'location') this.setLocation(value); - if (property === 'failure_rate') this.setFailureRate(value); - if (property === 'goals_care') this.setCareGoals(value); - if (property === 'goals_inclusion') this.setInclusionGoals(value); + let success = true; + if (property === 'time') { + if (!this.setTime(value)) success = false; + } else if (property === 'location') { + if (!this.setLocation(value)) success = false; + } else if (property === 'failure_rate') { + if (!this.setFailureRate(value)) success = false; + } else if (property === 'goals_care') { + if (!this.setCareGoals(value)) success = false; + } else if (property === 'goals_inclusion') { + if (!this.setInclusionGoals(value)) success = false; + } else if (property === 'enrollments') { + if (!this.setEnrollments(value)) success = false; + } else success = false; + return success; }; SimulationSchema.methods.run = function () { diff --git a/src/libs/routes/simulation.js b/src/libs/routes/simulation.js index 961f6173315bf795ab490b50da79ed6898783839..ce1a2ff08f14e6bea32996cf317d2c9d1c90728e 100644 --- a/src/libs/routes/simulation.js +++ b/src/libs/routes/simulation.js @@ -85,7 +85,19 @@ simulationApp.post('/:id', (req, res, next) => { }, (req, res) => { for (let property in req.body) { if (Simulation.schema.tree.hasOwnProperty(property)) { - req.simulation.update(property, req.body[property]); + if(!req.simulation.update(property, req.body[property])){ + res.send({ + success: false, + msg: 'Invalid format for ' + property, + }); + return ; + } + } else { + res.send({ + success: false, + msg: 'Unknown property ' + property, + }); + return ; } } req.simulation.save((err) => { diff --git a/src/test/test.js b/src/test/test.js index a5fc30a6b704d67cea513c543e6da73854e42053..d0763cbee01e49e10270462d6f956eb4d2ab927e 100644 --- a/src/test/test.js +++ b/src/test/test.js @@ -597,7 +597,32 @@ describe('Requires a simulation', () => { done(); }); }); - }); - + it('should include consistent enrollment tables', (done) => { + newSimulation = new Simulation(); + newSimulation.name = 'test'; + newSimulation.save((err, sim) => { + let id = sim._id; + chai.request(server) + .post(`/api/v1/simulation/${id}`) + .send({ + time: 5, + enrollments: "[[100, 150, 200, 250, 300]]", + }) + .end((err, res) => { + res.should.have.status(200); + res.should.be.json; + res.body.should.have.property('id'); + res.body.id.should.be.a('string'); + Simulation.findById(res.body.id, (err, simulation) => { + simulation.should.have.property('name'); + simulation.name.should.be.a('string'); + simulation.should.have.property('time'); + simulation.time.should.be.a('number'); + simulation.time.should.equal(5); + }); + done(); + }); + }); + }); });