From ff3da334bfd4a811d33cc63a3bdc1be343a2b0fb Mon Sep 17 00:00:00 2001
From: Rudolf Copi Eckelberg <rce16@inf.ufpr.br>
Date: Mon, 10 Oct 2016 11:49:51 -0300
Subject: [PATCH] More simulation tests and code cleaning

---
 src/libs/models/simulation.js | 22 ++++++----
 src/test/test.js              | 78 +++++++++++++++++++++++++++++++----
 2 files changed, 82 insertions(+), 18 deletions(-)

diff --git a/src/libs/models/simulation.js b/src/libs/models/simulation.js
index 7d5df97e..aa6589d1 100644
--- a/src/libs/models/simulation.js
+++ b/src/libs/models/simulation.js
@@ -52,7 +52,12 @@ SimulationSchema.methods.setInclusionGoals = function (g) {
     return true;
 };
 SimulationSchema.methods.setEnrollments = function (e) {
-    e = JSON.parse(e);
+    try{
+        e = JSON.parse(e);
+    } catch (err) {
+        return false;
+    }
+    let success = true;
     for(let i=0; i<e.length; i++){
         if(!(e[i] instanceof Array)){
             return false;
@@ -60,15 +65,16 @@ SimulationSchema.methods.setEnrollments = function (e) {
         if(e[i].length !== this.time){
             return false;
         }
-        for(let n of e[i])
-            if(!(n instanceof Number) && (n !== parseInt(n, 10))){
-                return false;
+        e[i].forEach((n, i, array) => {
+            if(n !== parseInt(n, 10)){
+                success = false;
             }
+        });
+
     }
-    log.debug("rolou");
-    this.enrollments = e;
+    if (success) this.enrollments = e;
 
-    return true;
+    return success;
 }
 SimulationSchema.methods.update = function (property, value) {
     let success = true;
@@ -94,8 +100,6 @@ SimulationSchema.methods.update = function (property, value) {
         case 'name':
             this.name = value;
             break;
-        default:
-            success = false;
     }
     return success;
 };
diff --git a/src/test/test.js b/src/test/test.js
index bcda16e0..ba617e12 100644
--- a/src/test/test.js
+++ b/src/test/test.js
@@ -424,8 +424,8 @@ describe('Requires a simulation', () => {
                     simulation.should.have.property('name');
                     simulation.name.should.be.a('string');
                     simulation.name.should.equal('test_entry');
+                    done();
                 });
-                done();
             });
     });
     it('should not create a nameless simulation', (done) => {
@@ -441,8 +441,8 @@ describe('Requires a simulation', () => {
                 res.body.success.should.equal(false);
                 Simulation.findById(res.body.id, (err, simulation) => {
                     expect(simulation).to.not.exist;
+                    done();
                 });
-                done();
             });
     });
     it('should find an existing simulation', (done) => {
@@ -496,8 +496,8 @@ describe('Requires a simulation', () => {
                         simulation.should.have.property('location');
                         simulation.location.should.be.a('number');
                         simulation.location.should.equal(5);
+                        done();
                     });
-                    done();
                 });
         });
     });
@@ -540,8 +540,8 @@ describe('Requires a simulation', () => {
                         simulation.should.have.property('goals_inclusion');
                         simulation.goals_inclusion.should.be.a('array');
                         simulation.goals_inclusion.length.should.equal(3);
+                        done();
                     });
-                    done();
                 });
         });
     });
@@ -578,8 +578,8 @@ describe('Requires a simulation', () => {
                         simulation.should.have.property('time');
                         simulation.time.should.be.a('number');
                         simulation.time.should.equal(5);
+                        done();
                     });
-                    done();
                 });
         });
     });
@@ -644,8 +644,8 @@ describe('Requires a simulation', () => {
                         simulation.should.have.property('time');
                         simulation.time.should.be.a('number');
                         simulation.time.should.equal(5);
+                        done();
                     });
-                    done();
                 });
         });
     });
@@ -663,7 +663,7 @@ describe('Requires a simulation', () => {
                     res.should.have.status(200);
                     res.should.be.json;
                     res.body.should.have.property('success');
-                    res.body.id.should.equal(false);
+                    res.body.success.should.equal(false);
                     });
                     done();
                 });
@@ -683,9 +683,69 @@ describe('Requires a simulation', () => {
                     res.should.have.status(200);
                     res.should.be.json;
                     res.body.should.have.property('success');
-                    res.body.id.should.equal(false);
-                    });
+                    res.body.success.should.equal(false);
+                    done();
+                });
+        });
+    });
+    it('should not include arrays of non arrays as enrollments', (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: "[\"Tomato\"]",
+                })
+                .end((err, res) => {
+                    res.should.have.status(200);
+                    res.should.be.json;
+                    res.body.should.have.property('success');
+                    res.body.success.should.equal(false);
+                    done();
+                });
+        });
+    });
+    it('should not accept non array enrollments', (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: "Am I still wanted here?",
+                })
+                .end((err, res) => {
+                    res.should.have.status(200);
+                    res.should.be.json;
+                    res.body.should.have.property('success');
+                    res.body.success.should.equal(false);
                     done();
+                });
+        });
+    });
+    it('should not accept an enrollment with anything other than a number', (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: "[[1,2,\"malicious payload\",4,5]]",
+                })
+                .end((err, res) => {
+                    res.should.have.status(200);
+                    res.should.be.json;
+                    res.body.should.have.property('success');
+                    res.body.success.should.equal(false);
+                    done();
+                });
         });
     });
 });
-- 
GitLab