Proof of concept of a kanban style application.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

385 lines
11 KiB
Raw

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();
});
});
});
});
});