summaryrefslogtreecommitdiff
path: root/accounts
diff options
context:
space:
mode:
authorSarah Boyce <42296566+sarahboyce@users.noreply.github.com>2024-11-15 11:30:37 +0100
committerBaptiste Mispelon <bmispelon@gmail.com>2024-11-17 21:28:18 +0100
commit2495507fd80a9e175f698c0f3521a0c81a324036 (patch)
tree0241d3e88bd8e13f1084bc3500621bbefc652f52 /accounts
parent9997c224b2961790ff84d1036809efbe3a151b1e (diff)
Added links for user-profile stats.
Diffstat (limited to 'accounts')
-rw-r--r--accounts/tests.py168
-rw-r--r--accounts/views.py2
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