|
| 1 | +from typing import Optional |
| 2 | + |
1 | 3 | from backend.models.postgis.task import Task, TaskStatus |
2 | 4 | from backend.models.postgis.statuses import UserGender, UserRole, MappingLevel |
3 | 5 | from backend.exceptions import get_message_from_sub_code |
4 | 6 |
|
5 | | - |
6 | 7 | from tests.backend.base import BaseTestCase |
7 | 8 | from tests.backend.helpers.test_helpers import ( |
8 | 9 | return_canned_user, |
|
11 | 12 | create_canned_interest, |
12 | 13 | ) |
13 | 14 |
|
14 | | - |
15 | 15 | TEST_USERNAME = "test_user" |
16 | 16 | TEST_USER_ID = 1111111 |
17 | 17 | TEST_EMAIL = "test@hotmail.com" |
@@ -93,11 +93,11 @@ def test_returns_404_if_user_not_found(self): |
93 | 93 | @staticmethod |
94 | 94 | def assert_user_detail_response( |
95 | 95 | response, |
96 | | - user_id=TEST_USER_ID, |
97 | | - username=TEST_USERNAME, |
98 | | - email=TEST_EMAIL, |
99 | | - gender=None, |
100 | | - own_info=True, |
| 96 | + user_id: Optional[int] = TEST_USER_ID, |
| 97 | + username: Optional[str] = TEST_USERNAME, |
| 98 | + email: Optional[str] = TEST_EMAIL, |
| 99 | + gender: Optional[str] = None, |
| 100 | + own_info: bool = True, |
101 | 101 | ): |
102 | 102 | assert response.status_code == 200 |
103 | 103 | assert response.json["id"] == user_id |
@@ -556,3 +556,139 @@ def test_email_and_gender_not_returned_if_requested_by_other(self): |
556 | 556 | TestUsersQueriesUsernameAPI.assert_user_detail_response( |
557 | 557 | response, TEST_USER_ID, TEST_USERNAME, None, None, False |
558 | 558 | ) |
| 559 | + |
| 560 | + def test_user_can_delete_self(self): |
| 561 | + """Check that a user can delete (redact personal information) themselves""" |
| 562 | + # Arrange |
| 563 | + self.user.email_address = TEST_EMAIL |
| 564 | + self.user.gender = UserGender.FEMALE.value |
| 565 | + self.user.save() |
| 566 | + # Act |
| 567 | + response = self.client.delete( |
| 568 | + self.url, headers={"Authorization": self.user_session_token} |
| 569 | + ) |
| 570 | + next_response = self.client.get( |
| 571 | + f"/api/v2/users/{TEST_USER_ID}/", |
| 572 | + headers={"Authorization": self.user_session_token}, |
| 573 | + ) |
| 574 | + # Assert |
| 575 | + # Note that we return the deleted user information at this time |
| 576 | + TestUsersQueriesUsernameAPI.assert_user_detail_response( |
| 577 | + response, |
| 578 | + TEST_USER_ID, |
| 579 | + TEST_USERNAME, |
| 580 | + TEST_EMAIL, |
| 581 | + UserGender.FEMALE.name, |
| 582 | + True, |
| 583 | + ) |
| 584 | + TestUsersQueriesUsernameAPI.assert_user_detail_response( |
| 585 | + next_response, TEST_USER_ID, f"user_{TEST_USER_ID}", None, None, True |
| 586 | + ) |
| 587 | + |
| 588 | + def test_other_user_cannot_delete_self(self): |
| 589 | + """Check that another user cannot delete (redact personal information) about a different user""" |
| 590 | + # Arrange |
| 591 | + self.user.email_address = TEST_EMAIL |
| 592 | + self.user.gender = UserGender.FEMALE.value |
| 593 | + self.user.save() |
| 594 | + user_2 = return_canned_user("user_2", 2222222) |
| 595 | + user_2.create() |
| 596 | + user_2_session_token = generate_encoded_token(user_2.id) |
| 597 | + # Act |
| 598 | + response = self.client.delete( |
| 599 | + self.url, headers={"Authorization": user_2_session_token} |
| 600 | + ) |
| 601 | + # Assert |
| 602 | + self.assertEqual(401, response.status_code) |
| 603 | + rjson = response.json |
| 604 | + self.assertDictEqual( |
| 605 | + rjson, |
| 606 | + { |
| 607 | + "error": { |
| 608 | + "code": 401, |
| 609 | + "details": {}, |
| 610 | + "message": "Authentication credentials were missing or incorrect.", |
| 611 | + "sub_code": "UNAUTHORIZED", |
| 612 | + } |
| 613 | + }, |
| 614 | + ) |
| 615 | + |
| 616 | + def test_other_admin_user_can_delete_self(self): |
| 617 | + """Check that another user cannot delete (redact personal information) about a different user""" |
| 618 | + # Arrange |
| 619 | + self.user.email_address = TEST_EMAIL |
| 620 | + self.user.gender = UserGender.FEMALE.value |
| 621 | + self.user.save() |
| 622 | + user_2 = return_canned_user("user_2", 2222222) |
| 623 | + user_2.set_user_role(UserRole.ADMIN) |
| 624 | + user_2.create() |
| 625 | + user_2_session_token = generate_encoded_token(user_2.id) |
| 626 | + # Act |
| 627 | + response = self.client.delete( |
| 628 | + self.url, headers={"Authorization": user_2_session_token} |
| 629 | + ) |
| 630 | + next_response = self.client.get( |
| 631 | + f"/api/v2/users/{TEST_USER_ID}/", |
| 632 | + headers={"Authorization": user_2_session_token}, |
| 633 | + ) |
| 634 | + # Assert |
| 635 | + # Note that we return the deleted user information at this time |
| 636 | + TestUsersQueriesUsernameAPI.assert_user_detail_response( |
| 637 | + response, |
| 638 | + TEST_USER_ID, |
| 639 | + TEST_USERNAME, |
| 640 | + TEST_EMAIL, |
| 641 | + UserGender.FEMALE.name, |
| 642 | + False, |
| 643 | + ) |
| 644 | + TestUsersQueriesUsernameAPI.assert_user_detail_response( |
| 645 | + next_response, TEST_USER_ID, f"user_{TEST_USER_ID}", None, None, False |
| 646 | + ) |
| 647 | + |
| 648 | + def test_admin_user_can_remove_redacted_osm_accounts(self): |
| 649 | + """Check that an admin can redact redacted OSM accounts""" |
| 650 | + # Arrange |
| 651 | + self.user.email_address = TEST_EMAIL |
| 652 | + self.user.gender = UserGender.FEMALE.value |
| 653 | + self.user.id = 4 |
| 654 | + self.user.save() |
| 655 | + user_2 = return_canned_user("user_2", 2222222) |
| 656 | + user_2.set_user_role(UserRole.ADMIN) |
| 657 | + user_2.create() |
| 658 | + user_2_session_token = generate_encoded_token(user_2.id) |
| 659 | + # Act |
| 660 | + response = self.client.delete( |
| 661 | + "/api/v2/users/", headers={"Authorization": user_2_session_token} |
| 662 | + ) |
| 663 | + next_response = self.client.get( |
| 664 | + "/api/v2/users/4/", headers={"Authorization": user_2_session_token} |
| 665 | + ) |
| 666 | + # Assert |
| 667 | + self.assertEqual(200, response.status_code) |
| 668 | + TestUsersQueriesUsernameAPI.assert_user_detail_response( |
| 669 | + next_response, 4, "user_4", None, None, False |
| 670 | + ) |
| 671 | + |
| 672 | + def test_user_cannot_remove_redacted_osm_accounts(self): |
| 673 | + """Check that a user cannot redact redacted OSM accounts""" |
| 674 | + # Arrange |
| 675 | + self.user.email_address = TEST_EMAIL |
| 676 | + self.user.gender = UserGender.FEMALE.value |
| 677 | + self.user.id = 4 |
| 678 | + self.user.save() |
| 679 | + user_2 = return_canned_user("user_2", 2222222) |
| 680 | + user_2.set_user_role(UserRole.MAPPER) |
| 681 | + user_2.create() |
| 682 | + user_2_session_token = generate_encoded_token(user_2.id) |
| 683 | + # Act |
| 684 | + response = self.client.delete( |
| 685 | + "/api/v2/users/", headers={"Authorization": user_2_session_token} |
| 686 | + ) |
| 687 | + next_response = self.client.get( |
| 688 | + "/api/v2/users/4/", headers={"Authorization": user_2_session_token} |
| 689 | + ) |
| 690 | + # Assert |
| 691 | + self.assertEqual(401, response.status_code) |
| 692 | + TestUsersQueriesUsernameAPI.assert_user_detail_response( |
| 693 | + next_response, 4, TEST_USERNAME, None, None, False |
| 694 | + ) |
0 commit comments