diff --git a/backend/src/test/studyplan.controller.test.js b/backend/src/test/studyplan.controller.test.js
index 9d0851097de6cb09ad1912ff9bbf6813f0a5e007..cd55ad83c498c6be44bf4fc13aa818ea7cfdfcd6 100644
--- a/backend/src/test/studyplan.controller.test.js
+++ b/backend/src/test/studyplan.controller.test.js
@@ -5,14 +5,16 @@ const {
     User,
     Student,
     Lecturer,
-    StudyPlan
+    StudyPlan,
+    StudyPlanCourse,
 } = require('../models/index');
 
 const {
     EndpointEnum,
     CourseClassStatusEnum,
     SemesterEnum,
-    StudyPlanStatusEnum
+    StudyPlanStatusEnum,
+    StudyPlanCourseStatusEnum
 } = require('../enums/index');
 
 let chai = require('chai');
@@ -47,7 +49,7 @@ const STUDY_PLAN_EXIST_ERROR = 'Study plan\'s already exist';
 const SEMESTER_UNDEFINED_ERROR = 'Undefined semester';
 
 describe('Study Plan Test', () => {
-  let availableCourseClass, unavailableCourseClass, student, studyPlan;
+  let availableCourseClass, unavailableCourseClass, student, studyPlan, studyPlanCourse;
 
   beforeEach(async() => {
     await CourseClass.destroy({where: {}});
@@ -98,6 +100,11 @@ describe('Study Plan Test', () => {
       semester: SemesterEnum.EVEN,
       notes: NOTES
     });
+
+    studyPlanCourse = await StudyPlanCourse.create({
+      studyPlanId: studyPlan.id,
+      courseClassId: availableCourseClass.id,
+    });
   });
 
   afterEach(() => {
@@ -276,4 +283,163 @@ describe('Study Plan Test', () => {
         });
     });
   });
+
+  describe("Update study plan", () => {
+    it("should return correct study plan when updating notes", (done) => {
+      const newNotes = "So far so good, Dimas said";
+      const request = {
+        notes: newNotes,
+      };
+
+      chai
+        .request(server)
+        .put(`${EndpointEnum.STUDY_PLAN}/${studyPlan.id}`)
+        .send(request)
+        .end((_, res) => {
+          res.should.have.status(SUCCESS_CODE);
+          res.body.should.have.property("id").to.not.equal(null);
+          res.body.should.have.property("startYear").to.not.equal(null);
+          res.body.should.have.property("creditsTotal").to.not.equal(null);
+          res.body.should.have.property("semester").to.not.equal(null);
+          res.body.should.have.property("status").to.not.equal(null);
+          res.body.should.have.property("notes").to.not.equal(null);
+          res.body.should.have.property("notes").to.not.equal(NOTES);
+          res.body.should.have.property("notes").to.equal(newNotes);
+          res.body.should.have.property("updatedAt").to.not.equal(null);
+          res.body.should.have.property("createdAt").to.not.equal(null);
+          res.body.should.have.property("studentId").to.not.equal(null);
+          res.body.should.have.property("studyPlanCourses").to.not.equal(null);
+          done();
+        });
+    });
+
+    it("should return correct study plan when updating status", (done) => {
+      const newStatus = StudyPlanStatusEnum.FINAL;
+      const request = {
+        status: newStatus,
+      };
+
+      chai
+        .request(server)
+        .put(`${EndpointEnum.STUDY_PLAN}/${studyPlan.id}`)
+        .send(request)
+        .end((_, res) => {
+          res.should.have.status(SUCCESS_CODE);
+          res.body.should.have.property("id").to.not.equal(null);
+          res.body.should.have.property("startYear").to.not.equal(null);
+          res.body.should.have.property("creditsTotal").to.not.equal(null);
+          res.body.should.have.property("semester").to.not.equal(null);
+          res.body.should.have.property("status").to.not.equal(null);
+          res.body.should.have
+            .property("status")
+            .to.not.equal(STUDY_PLAN_STATUS);
+          res.body.should.have.property("status").to.equal(newStatus);
+          res.body.should.have.property("notes").to.not.equal(null);
+          res.body.should.have.property("updatedAt").to.not.equal(null);
+          res.body.should.have.property("createdAt").to.not.equal(null);
+          res.body.should.have.property("studentId").to.not.equal(null);
+          res.body.should.have.property("studyPlanCourses").to.not.equal(null);
+          done();
+        });
+    });
+
+    it("should return correct study plan when updating study plan courses (empty)", (done) => {
+      const studyPlanCourses = [];
+      const request = {
+        studyPlanCourses,
+      };
+
+      chai
+        .request(server)
+        .put(`${EndpointEnum.STUDY_PLAN}/${studyPlan.id}`)
+        .send(request)
+        .end((_, res) => {
+          res.should.have.status(SUCCESS_CODE);
+          res.body.should.have.property("id").to.not.equal(null);
+          res.body.should.have.property("startYear").to.not.equal(null);
+          res.body.should.have.property("creditsTotal").to.not.equal(null);
+          res.body.should.have.property("semester").to.not.equal(null);
+          res.body.should.have.property("status").to.not.equal(null);
+          res.body.should.have.property("notes").to.not.equal(null);
+          res.body.should.have.property("updatedAt").to.not.equal(null);
+          res.body.should.have.property("createdAt").to.not.equal(null);
+          res.body.should.have.property("studentId").to.not.equal(null);
+          res.body.should.have.property("studyPlanCourses").to.not.equal(null);
+          res.body.should.have
+            .property("studyPlanCourses")
+            .to.deep.equal(studyPlanCourses);
+          done();
+        });
+    });
+
+    it("should return correct study plan when updating study plan courses (set APPROVED)", (done) => {
+      studyPlanCourse.status = StudyPlanCourseStatusEnum.APPROVED;
+
+      const studyPlanCourses = [studyPlanCourse];
+
+      const request = {
+        studyPlanCourses,
+      };
+
+      chai
+        .request(server)
+        .put(`${EndpointEnum.STUDY_PLAN}/${studyPlan.id}`)
+        .send(request)
+        .end((_, res) => {
+          res.should.have.status(SUCCESS_CODE);
+          res.body.should.have.property("id").to.not.equal(null);
+          res.body.should.have.property("startYear").to.not.equal(null);
+          res.body.should.have.property("creditsTotal").to.not.equal(null);
+          res.body.should.have.property("semester").to.not.equal(null);
+          res.body.should.have.property("status").to.not.equal(null);
+          res.body.should.have.property("notes").to.not.equal(null);
+          res.body.should.have.property("updatedAt").to.not.equal(null);
+          res.body.should.have.property("createdAt").to.not.equal(null);
+          res.body.should.have.property("studentId").to.not.equal(null);
+          res.body.should.have.property("studyPlanCourses").to.not.equal(null);
+          res.body.studyPlanCourses[0].should.have
+            .property("id")
+            .to.equal(studyPlanCourse.id);
+          res.body.studyPlanCourses[0].should.have
+            .property("status")
+            .to.equal(StudyPlanCourseStatusEnum.APPROVED);
+          done();
+        });
+    });
+
+    it("should return correct study plan when updating study plan courses (set UNAPPROVED)", (done) => {
+      studyPlanCourse.status = StudyPlanCourseStatusEnum.UNAPPROVED;
+
+      const studyPlanCourses = [studyPlanCourse];
+
+      const request = {
+        studyPlanCourses,
+      };
+
+      chai
+        .request(server)
+        .put(`${EndpointEnum.STUDY_PLAN}/${studyPlan.id}`)
+        .send(request)
+        .end((_, res) => {
+          res.should.have.status(SUCCESS_CODE);
+          res.body.should.have.property("id").to.not.equal(null);
+          res.body.should.have.property("startYear").to.not.equal(null);
+          res.body.should.have.property("creditsTotal").to.not.equal(null);
+          res.body.should.have.property("semester").to.not.equal(null);
+          res.body.should.have.property("status").to.not.equal(null);
+          res.body.should.have.property("notes").to.not.equal(null);
+          res.body.should.have.property("updatedAt").to.not.equal(null);
+          res.body.should.have.property("createdAt").to.not.equal(null);
+          res.body.should.have.property("studentId").to.not.equal(null);
+          res.body.should.have.property("studyPlanCourses").to.not.equal(null);
+          res.body.studyPlanCourses[0].should.have
+            .property("id")
+            .to.equal(studyPlanCourse.id);
+          res.body.studyPlanCourses[0].should.have
+            .property("status")
+            .to.equal(StudyPlanCourseStatusEnum.UNAPPROVED);
+          done();
+        });
+    });
+  });
 });