diff options
| author | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2024-11-15 11:30:37 +0100 |
|---|---|---|
| committer | Baptiste Mispelon <bmispelon@gmail.com> | 2024-11-17 21:28:18 +0100 |
| commit | 2495507fd80a9e175f698c0f3521a0c81a324036 (patch) | |
| tree | 0241d3e88bd8e13f1084bc3500621bbefc652f52 /accounts | |
| parent | 9997c224b2961790ff84d1036809efbe3a151b1e (diff) | |
Added links for user-profile stats.
Diffstat (limited to 'accounts')
| -rw-r--r-- | accounts/tests.py | 168 | ||||
| -rw-r--r-- | accounts/views.py | 2 |
2 files changed, 156 insertions, 14 deletions
diff --git a/accounts/tests.py b/accounts/tests.py index 2805ae16..bc6c48e5 100644 --- a/accounts/tests.py +++ b/accounts/tests.py @@ -1,23 +1,165 @@ -from unittest import mock - from django.contrib.auth.models import User -from django.test import TestCase +from django.test import TestCase, override_settings from django_hosts.resolvers import reverse +from tracdb.models import Revision, Ticket, TicketChange +from tracdb.testutils import TracDBCreateDatabaseMixin + + +@override_settings(TRAC_URL="https://code.djangoproject.com/") +class UserProfileTests(TracDBCreateDatabaseMixin, TestCase): + databases = {"default", "trac"} + + @classmethod + def setUpTestData(cls): + User.objects.create_user(username="user1", password="password") + User.objects.create_user(username="user2", password="password") + cls.user1_url = reverse("user_profile", args=["user1"]) + cls.user2_url = reverse("user_profile", args=["user2"]) + + def test_username_is_page_title(self): + response = self.client.get(self.user1_url) + self.assertContains(response, "<h1>user1</h1>", html=True) + + def test_stat_commits(self): + Revision.objects.create( + author="user1", + rev="91c879eda595c12477bbfa6f51115e88b75ddf88", + _time=1731669560, + ) + Revision.objects.create( + author="user1", + rev="da2432cccae841f0d7629f17a5d79ec47ed7b7cb", + _time=1731669560, + ) + Revision.objects.create( + author="user3", + rev="63dbe30d3363715deaf280214d75b03f6d65a571", + _time=1731669560, + ) + + user1_response = self.client.get(self.user1_url) + user2_response = self.client.get(self.user2_url) + self.assertContains( + user1_response, + '<a href="https://github.com/django/django/commits/main/' + '?author=user1">Commits: 2.</a>', + html=True, + ) + self.assertNotContains(user2_response, "Commits") -class ViewTests(TestCase): - def setUp(self): - self.credentials = {"username": "a-user", "password": "password"} - self.user = User.objects.create_user(**self.credentials) + def test_stat_tickets(self): + Ticket.objects.create(status="new", reporter="user1") + Ticket.objects.create(status="new", reporter="user2") + Ticket.objects.create( + status="closed", reporter="user1", owner="user1", resolution="fixed" + ) + Ticket.objects.create( + status="closed", reporter="user2", owner="user1", resolution="fixed" + ) + Ticket.objects.create( + status="closed", reporter="user2", owner="user2", resolution="fixed" + ) + Ticket.objects.create( + status="closed", reporter="user2", owner="user1", resolution="wontfix" + ) - @mock.patch("accounts.views.get_user_stats") - def test_user_profile(self, mock_user_stats): - response = self.client.get(reverse("user_profile", host="www", args=["a-user"])) - self.assertContains(response, "a-user") - mock_user_stats.assert_called_once_with(self.user) + user1_response = self.client.get(self.user1_url) + user2_response = self.client.get(self.user2_url) + self.assertContains( + user1_response, + '<a href="https://code.djangoproject.com/query?' + 'owner=user1&resolution=fixed&desc=1&order=changetime">' + "Tickets fixed: 2.</a>", + html=True, + ) + self.assertContains( + user2_response, + '<a href="https://code.djangoproject.com/query?' + 'owner=user2&resolution=fixed&desc=1&order=changetime">' + "Tickets fixed: 1.</a>", + html=True, + ) + self.assertContains( + user1_response, + '<a href="https://code.djangoproject.com/query?' + 'reporter=user1&desc=1&order=changetime">' + "Tickets opened: 2.</a>", + html=True, + ) + self.assertContains( + user2_response, + '<a href="https://code.djangoproject.com/query?' + 'reporter=user2&desc=1&order=changetime">' + "Tickets opened: 4.</a>", + html=True, + ) + + def test_stat_tickets_triaged(self): + # Possible values are from trac.ini in code.djangoproject.com. + initial_ticket_values = { + "field": "stage", + "oldvalue": "Unreviewed", + "_time": 1731669560, + } + TicketChange.objects.create( + author="user1", + newvalue="Accepted", + ticket=Ticket.objects.create(), + **initial_ticket_values + ) + TicketChange.objects.create( + author="user1", + newvalue="Someday/Maybe", + ticket=Ticket.objects.create(), + **initial_ticket_values + ) + TicketChange.objects.create( + author="user1", + newvalue="Ready for checkin", + ticket=Ticket.objects.create(), + **initial_ticket_values + ) + TicketChange.objects.create( + author="user2", + newvalue="Accepted", + ticket=Ticket.objects.create(), + **initial_ticket_values + ) + + response = self.client.get(self.user1_url) + self.assertContains(response, "New tickets triaged: 3.") + + def test_stat_tickets_triaged_unaccepted_not_counted(self): + common_ticket_values = { + "field": "stage", + "author": "user1", + "_time": 1731669560, + } + TicketChange.objects.create( + oldvalue="Unreviewed", + newvalue="Accepted", + ticket=Ticket.objects.create(), + **common_ticket_values + ) + TicketChange.objects.create( + oldvalue="Accepted", + newvalue="Unreviewed", + ticket=Ticket.objects.create(), + **common_ticket_values + ) + + response = self.client.get(self.user1_url) + self.assertContains(response, "New tickets triaged: 1.") + + +class ViewsTests(TestCase): def test_login_redirect(self): - response = self.client.post(reverse("login"), self.credentials) + credentials = {"username": "a-user", "password": "password"} + User.objects.create_user(**credentials) + + response = self.client.post(reverse("login"), credentials) self.assertRedirects(response, "/accounts/edit/") def test_profile_view_reversal(self): diff --git a/accounts/views.py b/accounts/views.py index 4b6371ab..bbdf888d 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -44,7 +44,7 @@ def get_user_stats(user): # Hide any stat with a value = 0 so that we don't accidentally insult # non-contributors. for k, v in list(info.items()): - if v == 0: + if v.count == 0: info.pop(k) c.set(key, info, 60 * 60) return info |
