From 3147eb0afc30f4b019a4513010fa14702a193362 Mon Sep 17 00:00:00 2001
From: Andreas Ellewsen <ae@uio.no>
Date: Tue, 30 Nov 2021 13:55:49 +0100
Subject: [PATCH] Expand test coverage

---
 gregui/tests/api/views/test_identity.py | 32 +++++++++++++++++++++++++
 gregui/tests/api/views/test_userinfo.py |  8 +++++++
 gregui/tests/conftest.py                | 13 ++++++++++
 gregui/tests/test_mailutils.py          | 19 +++++++++++++++
 gregui/tests/test_utils.py              | 23 ++++++++++++++++++
 5 files changed, 95 insertions(+)
 create mode 100644 gregui/tests/api/views/test_identity.py
 create mode 100644 gregui/tests/test_utils.py

diff --git a/gregui/tests/api/views/test_identity.py b/gregui/tests/api/views/test_identity.py
new file mode 100644
index 00000000..7d24aec7
--- /dev/null
+++ b/gregui/tests/api/views/test_identity.py
@@ -0,0 +1,32 @@
+import pytest
+
+from rest_framework.reverse import reverse
+
+from greg.models import Identity
+from gregui.models import GregUserProfile
+
+
+@pytest.mark.django_db
+def test_identity_get(client, log_in, user_sponsor, person_foo):
+    log_in(user_sponsor)
+    response = client.get(
+        reverse("gregui-v1:identity-detail", kwargs={"pk": person_foo.fnr.id})
+    )
+    assert response.status_code == 200
+    content = response.json()
+    assert content["person"] == person_foo.id
+
+
+@pytest.mark.django_db
+def test_identity_patch(client, log_in, user_sponsor, person_foo):
+    log_in(user_sponsor)
+    ident = Identity.objects.get(pk=person_foo.fnr.id)
+    assert not ident.verified
+
+    client.patch(
+        reverse("gregui-v1:identity-detail", kwargs={"pk": person_foo.fnr.id}),
+        data={},
+    )
+    ident.refresh_from_db()
+    assert ident.verified == Identity.Verified.MANUAL
+    assert ident.verified_by == GregUserProfile.objects.get(user=user_sponsor).sponsor
diff --git a/gregui/tests/api/views/test_userinfo.py b/gregui/tests/api/views/test_userinfo.py
index c5caaa30..8b615661 100644
--- a/gregui/tests/api/views/test_userinfo.py
+++ b/gregui/tests/api/views/test_userinfo.py
@@ -43,6 +43,14 @@ def test_userinfo_invited_get(client, invitation_link):
     }
 
 
+@pytest.mark.django_db
+def test_userinfo_user_no_profile(client, log_in, user_no_profile):
+    """Pure django users should be forbidden"""
+    log_in(user_no_profile)
+    response = client.get(reverse("api-userinfo"))
+    assert response.status_code == status.HTTP_403_FORBIDDEN
+
+
 @pytest.mark.django_db
 def test_userinfo_sponsor_get(client, log_in, user_sponsor):
     """Sponsors should get info about themselves"""
diff --git a/gregui/tests/conftest.py b/gregui/tests/conftest.py
index f30b5e00..c7e5d52a 100644
--- a/gregui/tests/conftest.py
+++ b/gregui/tests/conftest.py
@@ -142,6 +142,19 @@ def create_user() -> Callable[[str, str, str, str], UserModel]:
     return create_user
 
 
+@pytest.fixture
+def user_no_profile(create_user) -> User:
+    """User without a GregUserProfile"""
+    user_model = get_user_model()
+    user = create_user(
+        username="no_profile",
+        email="no_profile@example.org",
+        first_name="No",
+        last_name="Profile",
+    )
+    return user_model.objects.get(id=user.id)
+
+
 @pytest.fixture
 def user_sponsor(sponsor_foo: Sponsor, create_user) -> User:
     user_model = get_user_model()
diff --git a/gregui/tests/test_mailutils.py b/gregui/tests/test_mailutils.py
index 7977f4cf..04bf6dcd 100644
--- a/gregui/tests/test_mailutils.py
+++ b/gregui/tests/test_mailutils.py
@@ -57,3 +57,22 @@ def test_confirmation_mail(confirmation_template):
     assert result(task_id) == 1
     assert len(mail.outbox) == 1
     assert mail.outbox[0].to == ["test@example.no"]
+
+
+@pytest.mark.django_db
+def test_send_invite_mail(registration_template, invited_person):
+    """Verify function queues an email when called"""
+    _, link = invited_person
+    assert len(mail.outbox) == 0
+    assert mailutils.send_invite_mail(link)
+    assert len(mail.outbox) == 1
+
+
+@pytest.mark.django_db
+def test_send_invite_mail_no_mail(invited_person):
+    """Verify function returns None if an email is not present"""
+    person, link = invited_person
+    person.private_email.delete()
+    assert len(mail.outbox) == 0
+    assert mailutils.send_invite_mail(link) is None
+    assert len(mail.outbox) == 0
diff --git a/gregui/tests/test_utils.py b/gregui/tests/test_utils.py
new file mode 100644
index 00000000..f759f306
--- /dev/null
+++ b/gregui/tests/test_utils.py
@@ -0,0 +1,23 @@
+from gregui.utils import name_diff, restricted_damarau_levenshtein
+
+
+def test_rdm_replace():
+    assert restricted_damarau_levenshtein("abc", "abd") == 1
+
+
+def test_rdm_swap():
+    assert restricted_damarau_levenshtein("abc", "bac") == 1
+
+
+def test_name_diff():
+    assert name_diff("Foo Bar", "Foo Baz") == 1
+
+
+def test_name_longer():
+    """Verify stops early with default threshold"""
+    assert name_diff("Abcdefgh Ijklmnop", "Qrstuvw Xyz") == 5
+
+
+def test_name_threshold():
+    """Verify continues with raised threshold"""
+    assert name_diff("Abcdefgh Ijklmnop", "Qrstuvw Xyz", 100) == 10
-- 
GitLab