Skip to content

Commit

Permalink
fixup!: testing is hard
Browse files Browse the repository at this point in the history
  • Loading branch information
rgraber committed Aug 7, 2024
1 parent 6637688 commit 2b6c48f
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 11 deletions.
4 changes: 4 additions & 0 deletions kobo/apps/accounts/tests/test_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from kobo.apps.openrosa.apps.main.models import UserProfile
from kobo.apps.kobo_auth.shortcuts import User
from .constants import SOCIALACCOUNT_PROVIDERS
from kobo.apps.audit_log.models import AuditLog, AuditAction


class SSOLoginTest(TestCase):
Expand Down Expand Up @@ -98,4 +99,7 @@ def test_keep_django_auth_backend_with_sso(self, mock_verify_and_unstash_state):
self.assertRedirects(response, reverse(settings.LOGIN_REDIRECT_URL))

self.assertTrue(response.wsgi_request.user.is_authenticated)
# Ensure there is a record of the login
audit_log: AuditLog = AuditLog.objects.filter(user=response.wsgi_request.user).first()
self.assertEquals(audit_log.action, AuditAction.AUTH)
assert response.wsgi_request.user.backend == settings.AUTHENTICATION_BACKENDS[0]
6 changes: 4 additions & 2 deletions kobo/apps/audit_log/signals.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from django.dispatch import receiver
from django.contrib.auth.signals import user_logged_in
from logging import getLogger

from django.contrib.auth.signals import user_logged_in
from django.dispatch import receiver

from .models import AuditLog

logger = getLogger(__name__)
Expand Down
76 changes: 67 additions & 9 deletions kobo/apps/audit_log/tests/test_signals.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,73 @@
from kpi.tests.base_test_case import BaseTestCase
from django.contrib.auth import get_user_model
from unittest.mock import patch

from allauth.account.models import (
EmailAddress,
EmailConfirmation,
EmailConfirmationHMAC,
)
from django.contrib.auth import get_user_model
from django.urls import resolve, reverse

from kobo.apps.audit_log.models import AuditAction, AuditLog
from kpi.tests.base_test_case import BaseTestCase


class AuditLogTestCase(BaseTestCase):
@patch('kobo.apps.audit_log.signals.AuditLog.create_auth_log_from_request')
def test_audit_log_created_on_login(self, patched_create):
user = get_user_model().objects.create_user(
"""
Class for testing that logins produce AuditLogs.
AuditLogs for more complicated login flows are tested as part of the tests for those flows to avoid
copying lots of complicated setup.
"""

@classmethod
def setUpClass(cls):
super().setUpClass()
cls.user = get_user_model().objects.create_user(
'user', '[email protected]', 'pass'
)
cls.user.backend = 'django.contrib.auth.backends.ModelBackend'
cls.user.save()

@patch('kobo.apps.audit_log.signals.AuditLog.create_auth_log_from_request')
def test_audit_log_created_on_login(self, patched_create):
"""
Basic plumbing test to make sure the signal is hooked up
"""
self.client.login(username='user', password='pass')
request = patched_create.call_args.args[0]
self.assertEquals(request.user, user)
print(f'{vars(request)}')
assert False
patched_create.assert_called_once()

def test_simple_login(self):
count = AuditLog.objects.count()
self.assertEqual(count, 0)
user = AuditLogTestCase.user
data = {
'login': 'user',
'password': 'pass',
}
with self.settings(ACCOUNT_EMAIL_VERIFICATION='none'):
response = self.client.post(
reverse('kobo_login'), data=data, follow=True
)
audit_log = AuditLog.objects.first()
# AuditLogs are tested more fully elsewhere, just make sure one was created
self.assertEqual(audit_log.user.id, user.id)
self.assertEqual(audit_log.action, AuditAction.AUTH)

def test_login_with_email_verification(self):
user = AuditLogTestCase.user
data = {
'login': 'user',
'password': 'pass',
}
self.client.post(reverse('kobo_login'), data=data, follow=True)
# no audit log should be created yet because the email has not been verified
self.assertEquals(AuditLog.objects.count(), 0)
# verify the email and try again
email: EmailAddress = EmailAddress.objects.filter(user=user).first()
email.verified = True
email.save()
self.client.post(reverse('kobo_login'), data=data, follow=True)
audit_log = AuditLog.objects.first()
self.assertEqual(audit_log.user.id, user.id)
self.assertEqual(audit_log.action, AuditAction.AUTH)

0 comments on commit 2b6c48f

Please sign in to comment.