From bef7a62cfdd078c6325d9f4db25b2285dcf182ea Mon Sep 17 00:00:00 2001
From: Martin Mladenov <m.mladenov@student.tudelft.nl>
Date: Sun, 15 Jan 2023 12:57:30 +0200
Subject: [PATCH 1/3] Add tests for project status transitions

---
 test/models/project_test.rb | 147 ++++++++++++++++++++++++++++++++++++
 1 file changed, 147 insertions(+)

diff --git a/test/models/project_test.rb b/test/models/project_test.rb
index 846ce5de4..ac84f6958 100644
--- a/test/models/project_test.rb
+++ b/test/models/project_test.rb
@@ -63,4 +63,151 @@ class ProjectTest < ActiveSupport::TestCase
     project = projects(:taken_project_client_approved_group)
     assert_not_includes(Project.where(course_edition_id: course_edition.id).untaken.ids, project.id)
   end
+
+  # tests for project status transitions
+  test 'rejecting approved project marks it as not approved' do
+    project = projects(:bepsys_empty)
+    assert_equal 'approved', project.status
+    assert_not_nil project.approved_at
+
+    project.status = :rejected
+    project.save!
+
+    assert_nil project.approved_at
+  end
+
+  test 'rejecting pending project keeps it marked as not approved' do
+    project = projects(:bepsys_pending)
+    assert_equal 'pending', project.status
+    assert_nil project.approved_at
+
+    project.status = :rejected
+    project.save!
+
+    assert_nil project.approved_at
+  end
+
+  test 'reverting approved project to pending marks it as not approved' do
+    project = projects(:bepsys_empty)
+    assert_equal 'approved', project.status
+    assert_not_nil project.approved_at
+
+    project.status = :pending
+    project.save!
+
+    assert_nil project.approved_at
+  end
+
+  test 'updating approved project keeps it marked as approved' do
+    project = projects(:bepsys_empty)
+    assert_equal 'approved', project.status
+    assert_not_nil project.approved_at
+
+    project.status = :updated
+    project.save!
+
+    assert_not_nil project.approved_at
+  end
+
+  test 'approving rejected project marks it as approved' do
+    project = projects(:bepsys_pending)
+    project.status = :rejected
+    project.save!
+    assert_equal 'rejected', project.status
+    assert_nil project.approved_at
+
+    project.status = :approved
+    project.save!
+
+    assert_not_nil project.approved_at
+  end
+
+  test 'rejecting update of approved project keeps it marked as approved' do
+    project = projects(:bepsys_empty)
+    assert_equal 'approved', project.status
+    assert_not_nil project.approved_at
+
+    project.status = :updated
+    project.save!
+
+    project.status = :update_rejected
+    project.save!
+
+    assert_not_nil project.approved_at
+  end
+
+  test 'updating approved project twice keeps it marked as approved' do
+    project = projects(:bepsys_empty)
+    assert_equal 'approved', project.status
+    assert_not_nil project.approved_at
+
+    project.status = :updated
+    project.save!
+
+    project.status = :updated
+    project.save!
+
+    assert_not_nil project.approved_at
+  end
+
+  test 'updating pending project twice keeps it marked as not approved' do
+    project = projects(:bepsys_pending)
+    assert_equal 'pending', project.status
+    assert_nil project.approved_at
+
+    project.status = :pending
+    project.save!
+
+    project.status = :pending
+    project.save!
+
+    assert_nil project.approved_at
+  end
+
+  test 'approving project marks it as approved' do
+    project = projects(:bepsys_pending)
+    assert_equal 'pending', project.status
+    assert_nil project.approved_at
+
+    project.status = :approved
+    project.save!
+
+    assert_not_nil project.approved_at
+  end
+
+  test 'requesting changes on a pending project keeps it marked as not approved' do
+    project = projects(:bepsys_pending)
+    assert_equal 'pending', project.status
+    assert_nil project.approved_at
+
+    project.status = :changes_requested
+    project.save!
+
+    assert_nil project.approved_at
+  end
+
+  test 'requesting changes on an updated approved project keeps it marked as approved' do
+    project = projects(:bepsys_empty)
+    assert_equal 'approved', project.status
+    assert_not_nil project.approved_at
+
+    project.status = :updated
+    project.save!
+
+    project.status = :changes_requested
+    project.save!
+
+    assert_not_nil project.approved_at
+  end
+
+  test 'deactivating approved project keeps it marked as approved' do
+    project = projects(:bepsys_empty)
+    assert_equal 'approved', project.status
+    assert_not_nil project.approved_at
+
+    project.status = :deactivated
+    project.save!
+
+    assert_not_nil project.approved_at
+  end
 end
-- 
GitLab


From 8b8f880e0bc71e25b12c1c04b05489cf88e985dc Mon Sep 17 00:00:00 2001
From: Martin Mladenov <m.mladenov@student.tudelft.nl>
Date: Sun, 15 Jan 2023 12:57:53 +0200
Subject: [PATCH 2/3] Unset approved_at if project status is reverted to
 pending

---
 app/models/project.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/models/project.rb b/app/models/project.rb
index f8a96f10b..77478cc8c 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -107,7 +107,7 @@ class Project < ApplicationRecord
   # Before updating, if the status changed to approved, set approved_at
   before_update :set_approved_at, if: (-> { status_changed?(to: 'approved') && approved_at.blank? })
   # Before updating, if the status changed to rejected, unset approved_at
-  before_update :unset_approved_at, if: (-> { status_changed?(to: 'rejected') })
+  before_update :unset_approved_at, if: (-> { status_changed?(to: 'rejected') || status_changed?(to: 'pending') })
   # Before updating, if the status changed to approved and the proposal is recurrent, copy to existing course editions
   before_update :assign_to_recurrent_editions, if: (-> { status_changed?(to: 'approved') })
 
-- 
GitLab


From bfd963edcb1cb4926c46a3bc8310ef7f108f7fba Mon Sep 17 00:00:00 2001
From: Martin Mladenov <m.mladenov@student.tudelft.nl>
Date: Sun, 15 Jan 2023 12:58:53 +0200
Subject: [PATCH 3/3] Add test for reverting updated project to pending

---
 test/models/project_test.rb | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/test/models/project_test.rb b/test/models/project_test.rb
index ac84f6958..ee290ae59 100644
--- a/test/models/project_test.rb
+++ b/test/models/project_test.rb
@@ -98,6 +98,21 @@ class ProjectTest < ActiveSupport::TestCase
     assert_nil project.approved_at
   end
 
+  test 'reverting updated project to pending marks it as not approved' do
+    project = projects(:bepsys_empty)
+    assert_equal 'approved', project.status
+    assert_not_nil project.approved_at
+
+    project.status = :updated
+    project.save!
+    assert_not_nil project.approved_at
+
+    project.status = :pending
+    project.save!
+
+    assert_nil project.approved_at
+  end
+
   test 'updating approved project keeps it marked as approved' do
     project = projects(:bepsys_empty)
     assert_equal 'approved', project.status
-- 
GitLab