From f7acaa57af94ad44f1e4c4ddcbcc3a7baa90e82e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=93teris=20Caune?= Date: Sun, 12 Apr 2020 18:21:08 +0300 Subject: [PATCH] Adding tests. --- hc/accounts/tests/test_transfer_project.py | 138 +++++++++++++++++++++ hc/accounts/views.py | 6 - hc/test.py | 4 +- 3 files changed, 141 insertions(+), 7 deletions(-) create mode 100644 hc/accounts/tests/test_transfer_project.py diff --git a/hc/accounts/tests/test_transfer_project.py b/hc/accounts/tests/test_transfer_project.py new file mode 100644 index 00000000..48643eed --- /dev/null +++ b/hc/accounts/tests/test_transfer_project.py @@ -0,0 +1,138 @@ +from django.utils.timezone import now +from hc.api.models import Check +from hc.test import BaseTestCase + + +class ProjectTestCase(BaseTestCase): + def setUp(self): + super(ProjectTestCase, self).setUp() + + Check.objects.create(project=self.project) + + self.url = "/projects/%s/settings/" % self.project.code + + def test_transfer_project_works(self): + self.client.login(username="alice@example.org", password="password") + + form = {"transfer_project": "1", "email": "bob@example.org"} + r = self.client.post(self.url, form) + self.assertContains(r, "Transfer initiated!") + + self.bobs_membership.refresh_from_db() + self.assertIsNotNone(self.bobs_membership.transfer_request_date) + + def test_transfer_project_checks_ownership(self): + self.client.login(username="bob@example.org", password="password") + + form = {"transfer_project": "1", "email": "bob@example.org"} + r = self.client.post(self.url, form) + self.assertEqual(r.status_code, 403) + + def test_cancel_works(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.client.login(username="alice@example.org", password="password") + r = self.client.post(self.url, {"cancel_transfer": "1"}) + self.assertContains(r, "Transfer cancelled!") + + self.bobs_membership.refresh_from_db() + self.assertIsNone(self.bobs_membership.transfer_request_date) + + def test_cancel_checks_ownership(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.client.login(username="bob@example.org", password="password") + r = self.client.post(self.url, {"cancel_transfer": "1"}) + self.assertEqual(r.status_code, 403) + + self.bobs_membership.refresh_from_db() + self.assertIsNotNone(self.bobs_membership.transfer_request_date) + + def test_it_shows_transfer_request(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.client.login(username="bob@example.org", password="password") + r = self.client.get(self.url) + self.assertContains(r, "would like to transfer") + self.assertNotContains(r, "upgrade your account first") + + def test_it_shows_transfer_request_with_limit_notice(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.bobs_profile.check_limit = 0 + self.bobs_profile.save() + + self.client.login(username="bob@example.org", password="password") + r = self.client.get(self.url) + self.assertContains(r, "upgrade your account first") + + def test_accept_works(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.client.login(username="bob@example.org", password="password") + r = self.client.post(self.url, {"accept_transfer": "1"}) + self.assertContains(r, "You are now the owner of this project!") + + self.project.refresh_from_db() + # Bob should now be the owner + self.assertEqual(self.project.owner, self.bob) + + # Alice, the previous owner, should now be a member + self.assertTrue(self.project.team().filter(email="alice@example.org").exists()) + + def test_accept_requires_a_transfer_request(self): + self.client.login(username="bob@example.org", password="password") + r = self.client.post(self.url, {"accept_transfer": "1"}) + self.assertEqual(r.status_code, 403) + + self.project.refresh_from_db() + # Alice should still be the owner + self.assertEqual(self.project.owner, self.alice) + + def test_only_the_proposed_owner_can_accept(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.client.login(username="alice@example.org", password="password") + r = self.client.post(self.url, {"accept_transfer": "1"}) + self.assertEqual(r.status_code, 403) + + def test_it_checks_limits(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.bobs_profile.check_limit = 0 + self.bobs_profile.save() + + self.client.login(username="bob@example.org", password="password") + r = self.client.post(self.url, {"accept_transfer": "1"}) + self.assertEqual(r.status_code, 400) + + def test_reject_works(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.client.login(username="bob@example.org", password="password") + r = self.client.post(self.url, {"reject_transfer": "1"}) + self.assertEqual(r.status_code, 200) + + self.project.refresh_from_db() + # Alice should still be the owner + self.assertEqual(self.project.owner, self.alice) + + # The transfer_request_date should be cleared out + self.bobs_membership.refresh_from_db() + self.assertIsNone(self.bobs_membership.transfer_request_date) + + def test_only_the_proposed_owner_can_reject(self): + self.bobs_membership.transfer_request_date = now() + self.bobs_membership.save() + + self.client.login(username="alice@example.org", password="password") + r = self.client.post(self.url, {"reject_transfer": "1"}) + self.assertEqual(r.status_code, 403) diff --git a/hc/accounts/views.py b/hc/accounts/views.py index 01565498..05af1db8 100644 --- a/hc/accounts/views.py +++ b/hc/accounts/views.py @@ -372,9 +372,6 @@ def project(request, code): ctx["transfer_status"] = "success" elif "accept_transfer" in request.POST: - if not project.transfer_request: - return HttpResponseForbidden() - tr = project.transfer_request() if not tr or tr.user != request.user: return HttpResponseForbidden() @@ -396,9 +393,6 @@ def project(request, code): messages.success(request, "You are now the owner of this project!") elif "reject_transfer" in request.POST: - if not project.transfer_request: - return HttpResponseForbidden() - tr = project.transfer_request() if not tr or tr.user != request.user: return HttpResponseForbidden() diff --git a/hc/test.py b/hc/test.py index d6c47295..0223a8e0 100644 --- a/hc/test.py +++ b/hc/test.py @@ -34,7 +34,9 @@ class BaseTestCase(TestCase): self.bobs_profile = Profile(user=self.bob) self.bobs_profile.save() - Member.objects.create(user=self.bob, project=self.project) + self.bobs_membership = Member.objects.create( + user=self.bob, project=self.project + ) # Charlie should have no access to Alice's stuff self.charlie = User(username="charlie", email="charlie@example.org")