Skip to content

Commit 73fb9e5

Browse files
authored
test : add tests for pagination of progresses api (#2328)
* added test for the get progresses pagination * added test for dev=false * minor fix * added unit test for utils/progresses functions * added progressed model unit tests * added test for 500 * added 500 message from constant * fix test naming
1 parent cbd992a commit 73fb9e5

File tree

4 files changed

+559
-35
lines changed

4 files changed

+559
-35
lines changed

test/integration/progressesTasks.test.js

Lines changed: 153 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const firestore = require("../../utils/firestore");
55
const app = require("../../server");
66
const authService = require("../../services/authService");
77
const tasks = require("../../models/tasks");
8-
8+
const progressesModel = require("../../models/progresses");
99
const addUser = require("../utils/addUser");
1010
const cleanDb = require("../utils/cleanDb");
1111
const {
@@ -16,7 +16,7 @@ const {
1616

1717
const userData = require("../fixtures/user/user")();
1818
const taskData = require("../fixtures/tasks/tasks")();
19-
19+
const { INTERNAL_SERVER_ERROR_MESSAGE } = require("../../constants/progresses");
2020
const cookieName = config.get("userToken.cookieName");
2121
const { expect } = chai;
2222

@@ -615,4 +615,155 @@ describe("Test Progress Updates API for Tasks", function () {
615615
});
616616
});
617617
});
618+
619+
describe("GET /progresses (getPaginatedProgressDocument)", function () {
620+
beforeEach(async function () {
621+
const userId = await addUser(userData[1]);
622+
const taskObject1 = await tasks.updateTask(taskData[0]);
623+
const taskId1 = taskObject1.taskId;
624+
const progressData1 = stubbedModelTaskProgressData(userId, taskId1, 1683626400000, 1683590400000); // 2023-05-09
625+
const progressData2 = stubbedModelTaskProgressData(userId, taskId1, 1683885600000, 1683849600000); // 2023-05-12
626+
await firestore.collection("progresses").doc("taskProgressDocument1").set(progressData1);
627+
await firestore.collection("progresses").doc("taskProgressDocument2").set(progressData2);
628+
});
629+
630+
afterEach(async function () {
631+
await cleanDb();
632+
});
633+
634+
it("should return paginated results when dev=true is passed", function (done) {
635+
chai
636+
.request(app)
637+
.get(`/progresses?type=task&dev=true&page=0&size=1`)
638+
.end((err, res) => {
639+
if (err) return done(err);
640+
expect(res).to.have.status(200);
641+
expect(res.body).to.have.keys(["message", "data", "count", "links"]);
642+
expect(res.body.links).to.have.keys(["next", "prev"]);
643+
expect(res.body.data).to.be.an("array");
644+
expect(res.body.message).to.be.equal("Progress document retrieved successfully.");
645+
expect(res.body.count).to.be.equal(1);
646+
res.body.data.forEach((progress) => {
647+
expect(progress).to.have.keys([
648+
"id",
649+
"type",
650+
"completed",
651+
"planned",
652+
"blockers",
653+
"userId",
654+
"userData",
655+
"taskId",
656+
"createdAt",
657+
"date",
658+
]);
659+
});
660+
661+
return done();
662+
});
663+
});
664+
665+
it("should not return paginated results when dev=false is passed", function (done) {
666+
chai
667+
.request(app)
668+
.get(`/progresses?type=task&dev=false&page=0&size=1`)
669+
.end((err, res) => {
670+
if (err) return done(err);
671+
expect(res).to.have.status(200);
672+
expect(res.body).to.have.keys(["message", "data", "count"]);
673+
expect(res.body.data).to.be.an("array");
674+
expect(res.body.count).to.not.equal(1);
675+
expect(res.body.message).to.be.equal("Progress document retrieved successfully.");
676+
res.body.data.forEach((progress) => {
677+
expect(progress).to.have.keys([
678+
"id",
679+
"type",
680+
"completed",
681+
"planned",
682+
"blockers",
683+
"userId",
684+
"taskId",
685+
"createdAt",
686+
"date",
687+
]);
688+
});
689+
690+
return done();
691+
});
692+
});
693+
694+
it("should return null for next link on the last page", function (done) {
695+
const size = 1;
696+
const page = 1;
697+
698+
chai
699+
.request(app)
700+
.get(`/progresses?type=task&dev=true&page=${page}&size=${size}`)
701+
.end((err, res) => {
702+
if (err) return done(err);
703+
expect(res).to.have.status(200);
704+
expect(res.body).to.have.keys(["message", "data", "count", "links"]);
705+
expect(res.body.links).to.have.keys(["next", "prev"]);
706+
expect(res.body.data).to.be.an("array");
707+
expect(res.body.message).to.be.equal("Progress document retrieved successfully.");
708+
expect(res.body.links.next).to.be.equal(null);
709+
expect(res.body.links.prev).to.equal(`/progresses?type=task&page=${page - 1}&size=${size}&dev=true`);
710+
return done();
711+
});
712+
});
713+
714+
it("should return a bad request error for invalid size parameter", function (done) {
715+
chai
716+
.request(app)
717+
.get(`/progresses?type=task&dev=true&page=0&size=104`)
718+
.end((_err, res) => {
719+
expect(res).to.have.status(400);
720+
expect(res.body).to.be.an("object");
721+
expect(res.body.message).to.equal("size must be in the range 1-100");
722+
return done();
723+
});
724+
});
725+
726+
it("should return an empty array of progresses data on a page with no data", function (done) {
727+
const size = 10;
728+
const page = 100;
729+
730+
chai
731+
.request(app)
732+
.get(`/progresses?type=task&dev=true&page=${page}&size=${size}`)
733+
.end((err, res) => {
734+
if (err) return done(err);
735+
expect(res).to.have.status(200);
736+
expect(res.body).to.be.an("object");
737+
expect(res.body.message).to.equal("Progress document retrieved successfully.");
738+
// eslint-disable-next-line no-unused-expressions
739+
expect(res.body.data).to.be.an("array").that.is.empty;
740+
expect(res.body.links).to.have.keys(["next", "prev"]);
741+
// eslint-disable-next-line no-unused-expressions
742+
expect(res.body.links.next).to.be.null;
743+
expect(res.body.links.prev).to.equal(`/progresses?type=task&page=${page - 1}&size=${size}&dev=true`);
744+
return done();
745+
});
746+
});
747+
748+
it("Should return 500 Internal Server Error if there is an exception", function (done) {
749+
sinon.stub(progressesModel, "getPaginatedProgressDocument").throws(new Error("Database error"));
750+
751+
chai
752+
.request(app)
753+
.get(`/progresses?type=task&dev=true&page=0&size=1`)
754+
.end((err, res) => {
755+
if (err) return done(err);
756+
757+
if (err) {
758+
return done(err);
759+
}
760+
761+
expect(res).to.have.status(500);
762+
expect(res.body).to.deep.equal({
763+
message: INTERNAL_SERVER_ERROR_MESSAGE,
764+
});
765+
return done();
766+
});
767+
});
768+
});
618769
});

test/integration/progressesUsers.test.js

Lines changed: 122 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const sinon = require("sinon");
44
const firestore = require("../../utils/firestore");
55
const app = require("../../server");
66
const authService = require("../../services/authService");
7-
7+
const progressesModel = require("../../models/progresses");
88
const addUser = require("../utils/addUser");
99
const cleanDb = require("../utils/cleanDb");
1010
const {
@@ -14,7 +14,7 @@ const {
1414
} = require("../fixtures/progress/progresses");
1515

1616
const userData = require("../fixtures/user/user")();
17-
17+
const { INTERNAL_SERVER_ERROR_MESSAGE } = require("../../constants/progresses");
1818
const cookieName = config.get("userToken.cookieName");
1919
const { expect } = chai;
2020

@@ -499,4 +499,124 @@ describe("Test Progress Updates API for Users", function () {
499499
});
500500
});
501501
});
502+
503+
describe("GET /progresses (getPaginatedProgressDocument)", function () {
504+
beforeEach(async function () {
505+
const userId1 = await addUser(userData[0]);
506+
const userId2 = await addUser(userData[1]);
507+
const progressData1 = stubbedModelProgressData(userId1, 1683957764140, 1683936000000);
508+
const progressData2 = stubbedModelProgressData(userId2, 1683957764140, 1683936000000);
509+
await firestore.collection("progresses").doc("progressDoc1").set(progressData1);
510+
await firestore.collection("progresses").doc("progressDoc2").set(progressData2);
511+
});
512+
513+
afterEach(async function () {
514+
await cleanDb();
515+
});
516+
517+
it("should return paginated results when dev=true is passed", function (done) {
518+
chai
519+
.request(app)
520+
.get(`/progresses?type=user&dev=true&page=0&size=1`)
521+
.end((err, res) => {
522+
if (err) return done(err);
523+
expect(res).to.have.status(200);
524+
expect(res.body).to.have.keys(["message", "data", "count", "links"]);
525+
expect(res.body.links).to.have.keys(["next", "prev"]);
526+
expect(res.body.data).to.be.an("array");
527+
expect(res.body.message).to.be.equal("Progress document retrieved successfully.");
528+
expect(res.body.count).to.be.equal(1);
529+
res.body.data.forEach((progress) => {
530+
expect(progress).to.have.keys([
531+
"id",
532+
"type",
533+
"completed",
534+
"planned",
535+
"blockers",
536+
"userData",
537+
"userId",
538+
"createdAt",
539+
"date",
540+
]);
541+
});
542+
543+
return done();
544+
});
545+
});
546+
547+
it("should return null for next link on the last page", function (done) {
548+
const size = 1;
549+
const page = 1;
550+
551+
chai
552+
.request(app)
553+
.get(`/progresses?type=user&dev=true&page=${page}&size=${size}`)
554+
.end((err, res) => {
555+
if (err) return done(err);
556+
expect(res).to.have.status(200);
557+
expect(res.body).to.have.keys(["message", "data", "count", "links"]);
558+
expect(res.body.links).to.have.keys(["next", "prev"]);
559+
expect(res.body.data).to.be.an("array");
560+
expect(res.body.message).to.be.equal("Progress document retrieved successfully.");
561+
expect(res.body.links.next).to.be.equal(null);
562+
expect(res.body.links.prev).to.equal(`/progresses?type=user&page=${page - 1}&size=${size}&dev=true`);
563+
return done();
564+
});
565+
});
566+
567+
it("should return a bad request error for invalid size parameter", function (done) {
568+
chai
569+
.request(app)
570+
.get(`/progresses?type=user&dev=true&page=0&size=104`)
571+
.end((_err, res) => {
572+
expect(res).to.have.status(400);
573+
expect(res.body).to.be.an("object");
574+
expect(res.body.message).to.equal("size must be in the range 1-100");
575+
return done();
576+
});
577+
});
578+
579+
it("should return an empty array of progresses data on a page with no data", function (done) {
580+
const size = 10;
581+
const page = 100;
582+
583+
chai
584+
.request(app)
585+
.get(`/progresses?type=user&dev=true&page=${page}&size=${size}`)
586+
.end((err, res) => {
587+
if (err) return done(err);
588+
expect(res).to.have.status(200);
589+
expect(res.body).to.be.an("object");
590+
expect(res.body.message).to.equal("Progress document retrieved successfully.");
591+
// eslint-disable-next-line no-unused-expressions
592+
expect(res.body.data).to.be.an("array").that.is.empty;
593+
expect(res.body.links).to.have.keys(["next", "prev"]);
594+
// eslint-disable-next-line no-unused-expressions
595+
expect(res.body.links.next).to.be.null;
596+
expect(res.body.links.prev).to.equal(`/progresses?type=user&page=${page - 1}&size=${size}&dev=true`);
597+
return done();
598+
});
599+
});
600+
601+
it("Should return 500 Internal Server Error if there is an exception", function (done) {
602+
sinon.stub(progressesModel, "getPaginatedProgressDocument").throws(new Error("Database error"));
603+
604+
chai
605+
.request(app)
606+
.get(`/progresses?type=user&dev=true&page=0&size=1`)
607+
.end((err, res) => {
608+
if (err) return done(err);
609+
610+
if (err) {
611+
return done(err);
612+
}
613+
614+
expect(res).to.have.status(500);
615+
expect(res.body).to.deep.equal({
616+
message: INTERNAL_SERVER_ERROR_MESSAGE,
617+
});
618+
return done();
619+
});
620+
});
621+
});
502622
});

0 commit comments

Comments
 (0)