process.env.NODE_ENV = 'test'; const { assert } = require('chai'); const chai=require('chai'); const chaiHttp=require('chai-http'); const { disconnectFromDatabase } = require('../../controller/MongoController'); const server=require("../../index"); const should = chai.should(); chai.use(chaiHttp); const Task=require("../../model/Task"); const config=require("config"); let baseURL=config.express.baseUrl+"/task"; describe('Task', () => { beforeEach((done) => { Task.deleteMany({}, (err) => { if(err){ console.error(err); }else{ done(); } }); }); afterEach((done) => { Task.deleteMany({}, (err) => { if(err){ console.error(err); }else{ done(); } }); }); after(()=>{ disconnectFromDatabase(); }) describe("/ GET", () => { it("Should get empty", (done)=>{ chai.request(server) .get(baseURL) .end((err,res)=>{ res.should.have.status(200); res.body.should.not.have.property('errors'); res.body.should.be.a('array'); res.body.length.should.be.eql(0); done(); }); }); }); describe("/:id GET", () => { it("Should return empty object if id not found", (done)=>{ chai.request(server) .get(baseURL+"/5e99ac68604ea9031e8545c8") .end((err,res)=>{ res.should.have.status(200); assert.isObject(res.body); assert.isEmpty(res.body); done(); }); }); it("Should return existing object", (done)=>{ let task=new Task({name:"Parent", _id:"5e99ac68604ea9031e8545c8"}); task.save((err,parent)=> { chai.request(server) .get(baseURL+"/5e99ac68604ea9031e8545c8") .end((err,res)=>{ res.should.have.status(200); res.body.should.be.a('object'); res.body.should.not.have.property('errors'); res.body.should.have.property('name'); res.body.name.should.equal(task.name); res.body.should.have.property('description'); res.body.description.should.equal(task.description); res.body.should.have.property('_id'); res.body._id.should.be.not.empty; res.body._id.should.equal(task.id.toString()); done(); }); }); }); }); describe("/ POST", () => { it("Should not accept empty name", (done)=>{ let task={ } chai.request(server) .post(baseURL) .send(task) .end((err,res)=>{ res.should.have.status(500); res.body.should.be.a('object'); res.body.should.have.property('errors'); res.body.errors.should.have.property('name'); res.body.errors.name.should.have.property('name').eql('ValidatorError'); res.body.errors.name.should.have.property('path').eql('name'); res.body.errors.name.should.have.property('kind').eql('required'); done(); }); }); it("Should add non empty task", (done)=>{ let task={ name: "Non empty name", description: "description" } chai.request(server) .post(baseURL+"/") .send(task) .end((err,res)=>{ res.should.have.status(200); res.body.should.be.a('object'); res.body.should.not.have.property('errors'); res.body.should.have.property('name'); res.body.name.should.equal(task.name); res.body.should.have.property('description'); res.body.description.should.equal(task.description); res.body.should.have.property('_id'); res.body._id.should.be.not.empty; done(); }); }); it("Should not create task with invalid parent id", (done)=>{ let task={ name: "TaskName", description: "TaskDescription", parent: "5e99ac36a60d08030772df30" } chai.request(server) .post(baseURL+"/") .send(task) .end((err,res)=>{ res.should.have.status(500); res.body.should.be.a('object'); res.body.should.have.property('errors'); res.body.errors.should.have.property('parent'); res.body.errors.parent.should.have.property('name').eql('ValidatorError'); res.body.errors.parent.should.have.property('path').eql('parent'); res.body.errors.parent.should.have.property('kind').eql('user defined'); done(); }); }); it("Should create task with valid parent id", (done)=>{ let task={ name: "TaskName", description: "description", parent: "5e99acf261eea30341340560" } let parentTask=new Task({name:"Parent", _id:"5e99acf261eea30341340560"}); parentTask.save((err,parent)=> { chai.request(server) .post(baseURL+"/") .send(task) .end((err,res)=>{ res.should.have.status(200); res.body.should.be.a('object'); res.body.should.not.have.property('errors'); res.body.should.have.property('name'); res.body.name.should.equal(task.name); res.body.should.have.property('description'); res.body.description.should.equal(task.description); res.body.should.have.property('_id'); res.body._id.should.be.not.empty; res.body.should.have.property("parent"); res.body.parent.should.equal(task.parent); done(); }); }); }); it("Should create task with no parent if parent=\"\"", (done)=>{ let task={ name: "TaskName", description: "description", parent: "" } chai.request(server) .post(baseURL+"/") .send(task) .end((err,res)=>{ res.should.have.status(200); res.body.should.be.a('object'); res.body.should.not.have.property('errors'); res.body.should.have.property('name'); res.body.name.should.equal(task.name); res.body.should.have.property('description'); res.body.description.should.equal(task.description); res.body.should.have.property('_id'); res.body._id.should.be.not.empty; res.body.should.not.have.property("parent"); done(); }); }); }); describe("/:id PUT", () => { it("Should not change invalid id", (done)=>{ chai.request(server) .put(baseURL+"/5e99ac36a60d08030772df30") .send({description:"New description"}) .end((err,res)=>{ res.should.have.status(500); assert.isNotEmpty(res.error.text); done(); }); }); it("Should change Task", (done)=>{ let task=new Task({ name: "TaskName", description: "description", _id: "5e99acf261eea30341340560" }); let updateValue={"description":"New description"} task.save((err,doc)=> { chai.request(server) .put(baseURL+"/"+task._id) .send(updateValue) .end((err,res)=>{ res.should.have.status(200); res.body.should.be.a('object'); res.body.should.not.have.property('errors'); res.body.should.have.property('name'); res.body.name.should.equal(task.name); res.body.should.have.property('description'); res.body.description.should.equal(updateValue.description); res.body.should.have.property('_id'); res.body._id.should.equal(task.id.toString()); done(); }); }); }); it("Should not change name empty", (done)=>{ let task=new Task({ name: "TaskName", description: "description", _id: "5e99acf261eea30341340560" }); task.save((err,doc)=> { chai.request(server) .put(baseURL+"/"+task._id) .send({title:""}) .end((err,res)=>{ res.should.have.status(200); res.body.should.be.a('object'); res.body.should.not.have.property('errors'); res.body.should.have.property('name'); res.body.name.should.equal(task.name); res.body.should.have.property('description'); res.body.description.should.equal(task.description); res.body.should.have.property('_id'); res.body._id.should.equal(task.id.toString()); done(); }); }); }); it("Should not change parent to invalid", (done)=>{ let task=new Task({ name: "TaskName", description: "description", _id: "5e99acf261eea30341340560" }); task.save((err,doc)=> { chai.request(server) .put(baseURL+"/"+task._id) .send({parent:"56"}) .end((err,res)=>{ res.should.have.status(500); res.body.should.be.a('object'); Task.findById(task._id).then((value)=>{ value.parent.should.be(task.parent); }).catch((reason)=>{assert.fail(reason)}); done(); }); }); }); it("Should not change parent to itself", (done)=>{ let task=new Task({ name: "TaskName", description: "description", _id: "5e99acf261eea30341340560" }); task.save((err,doc)=> { chai.request(server) .put(baseURL+"/"+task._id) .send({"parent":task._id}) .end((err,res)=>{ res.should.have.status(500); res.body.should.be.a('object'); Task.findById(task._id).then((value)=>{ value.parent.should.be(task.parent); }).catch((reason)=>{assert.fail(reason)}); done(); }); }); }); it("Should not change non specified property", (done)=>{ let task=new Task({ name: "TaskName", description: "description", parent: "5e99ac36a60d08030772df30", _id: "5e99acf261eea30341340560" }); let parentTask=new Task({name:"Parent", _id:"5e99ac36a60d08030772df30"}); parentTask.save((perr,pdoc)=>{ task.save((err,doc)=> { chai.request(server) .put(baseURL+"/"+task._id) .send({}) .end((err,res)=>{ res.should.have.status(200); res.body.should.be.a('object'); res.body.should.not.have.property('errors'); res.body.should.have.property('name'); res.body.name.should.equal(task.name); res.body.should.have.property('description'); res.body.description.should.equal(task.description); res.body.should.have.property('parent'); res.body.parent.should.equal(task.parent.toString()); res.body.should.have.property('_id'); res.body._id.should.equal(task.id.toString()); done(); }); }); }); }); it("Should remove parent on empty string", (done)=>{ let childTask=new Task({ name: "TaskName", description: "description", parent: "5e99ac36a60d08030772df30", _id: "5e99acf261eea30341340560" }); let parentTask=new Task({name:"Parent", _id:"5e99ac36a60d08030772df30"}); parentTask.save((perr,pdoc)=>{ childTask.save((err,doc)=> { chai.request(server) .put(baseURL+"/"+childTask._id) .send({parent:""}) .end((err,res)=>{ res.should.have.status(200); res.body.should.be.a('object'); res.body.should.not.have.property('errors'); res.body.should.have.property('name'); res.body.name.should.equal(childTask.name); res.body.should.have.property('description'); res.body.description.should.equal(childTask.description); res.body.should.not.have.property('parent'); res.body.should.have.property('_id'); res.body._id.should.equal(childTask.id.toString()); done(); }); }); }); }); }); describe("/:id DELETE", () => { it("Should not delete invalid id", (done)=>{ chai.request(server) .delete(baseURL+"/5e99ac36a60d08030772df99") .end((err,res)=>{ res.should.have.status(500); assert.isNotEmpty(res.error.text); done(); }); }); it("Should delete", (done)=>{ let task=new Task({ name: "TaskName", description: "description", _id: "5e99ac36a60d08030772df99" }); task.save((err,doc)=> { chai.request(server) .delete(baseURL+"/"+task._id) .end((err,res)=>{ res.should.have.status(200); res.body.should.be.an('object'); res.body._id.should.equal(task._id.toString()); done(); }); }); }); }); });