feat: admin panel enrichment
This commit is contained in:
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
from django.contrib.auth.models import User
|
||||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
|
||||
from apps.accounts.forms import SignUpForm
|
||||
from apps.accounts.models import ClientProfile
|
||||
|
||||
|
||||
class SignUpFormTest(TestCase):
|
||||
def test_signup_creates_user_and_profile(self):
|
||||
form = SignUpForm(
|
||||
data={
|
||||
"username": "client1",
|
||||
"first_name": "Ada",
|
||||
"last_name": "Lovelace",
|
||||
"email": "ada@example.com",
|
||||
"company": "Analytical Engines",
|
||||
"phone": "+1 555 0100",
|
||||
"timezone": "UTC",
|
||||
"password1": "Str0ngPass!word",
|
||||
"password2": "Str0ngPass!word",
|
||||
}
|
||||
)
|
||||
self.assertTrue(form.is_valid(), form.errors)
|
||||
user = form.save()
|
||||
self.assertEqual(user.email, "ada@example.com")
|
||||
profile = ClientProfile.objects.get(user=user)
|
||||
self.assertEqual(profile.company, "Analytical Engines")
|
||||
self.assertEqual(profile.timezone, "UTC")
|
||||
|
||||
|
||||
class AccountViewsTest(TestCase):
|
||||
def test_signup_page_renders(self):
|
||||
response = self.client.get(reverse("accounts:signup"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_signup_creates_account_and_logs_in(self):
|
||||
response = self.client.post(
|
||||
reverse("accounts:signup"),
|
||||
data={
|
||||
"username": "newclient",
|
||||
"first_name": "Grace",
|
||||
"last_name": "Hopper",
|
||||
"email": "grace@example.com",
|
||||
"company": "",
|
||||
"phone": "",
|
||||
"timezone": "UTC",
|
||||
"password1": "Str0ngPass!word",
|
||||
"password2": "Str0ngPass!word",
|
||||
},
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(response.url, reverse("projects:dashboard"))
|
||||
self.assertTrue(User.objects.filter(username="newclient").exists())
|
||||
|
||||
def test_login_required_for_profile(self):
|
||||
response = self.client.get(reverse("accounts:profile"))
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertIn(reverse("accounts:login"), response.url)
|
||||
|
||||
def test_logout_requires_post_and_clears_session(self):
|
||||
self.client.login(username="newclient", password="Str0ngPass!word")
|
||||
response = self.client.get(reverse("accounts:logout"))
|
||||
self.assertEqual(response.status_code, 405)
|
||||
|
||||
response = self.client.post(reverse("accounts:logout"))
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(response.url, reverse("pages:home"))
|
||||
|
||||
response = self.client.get(reverse("projects:dashboard"))
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertIn(reverse("accounts:login"), response.url)
|
||||
@@ -0,0 +1,99 @@
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.test import TestCase, override_settings
|
||||
from django.urls import reverse
|
||||
|
||||
from apps.accounts.adapters import TecvicoSocialAccountAdapter
|
||||
from apps.accounts.social import enabled_social_providers
|
||||
|
||||
|
||||
class SocialAuthHelpersTest(TestCase):
|
||||
@override_settings(
|
||||
SOCIALACCOUNT_PROVIDERS={
|
||||
"google": {"APP": {"client_id": "g-id", "secret": "g-secret"}},
|
||||
"github": {"APP": {"client_id": "", "secret": ""}},
|
||||
}
|
||||
)
|
||||
def test_enabled_social_providers_filters_missing_credentials(self):
|
||||
providers = enabled_social_providers()
|
||||
self.assertEqual(len(providers), 1)
|
||||
self.assertEqual(providers[0]["id"], "google")
|
||||
|
||||
|
||||
class SocialAuthViewsTest(TestCase):
|
||||
@override_settings(
|
||||
SOCIALACCOUNT_PROVIDERS={
|
||||
"google": {"APP": {"client_id": "g-id", "secret": "g-secret"}},
|
||||
"github": {"APP": {"client_id": "gh-id", "secret": "gh-secret"}},
|
||||
}
|
||||
)
|
||||
def test_login_page_renders_social_buttons(self):
|
||||
response = self.client.get(reverse("accounts:login"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, "Continue with")
|
||||
self.assertContains(response, "Google")
|
||||
self.assertContains(response, "GitHub")
|
||||
self.assertContains(response, "/accounts/google/login/")
|
||||
|
||||
@override_settings(
|
||||
SOCIALACCOUNT_PROVIDERS={
|
||||
"google": {"APP": {"client_id": "", "secret": ""}},
|
||||
"github": {"APP": {"client_id": "", "secret": ""}},
|
||||
}
|
||||
)
|
||||
def test_login_page_hides_social_buttons_without_credentials(self):
|
||||
response = self.client.get(reverse("accounts:login"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertNotContains(response, "Continue with")
|
||||
|
||||
@override_settings(
|
||||
SOCIALACCOUNT_PROVIDERS={
|
||||
"google": {"APP": {"client_id": "g-id", "secret": "g-secret"}},
|
||||
"github": {"APP": {"client_id": "gh-id", "secret": "gh-secret"}},
|
||||
}
|
||||
)
|
||||
def test_signup_page_renders_social_buttons(self):
|
||||
response = self.client.get(reverse("accounts:signup"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, "Google")
|
||||
self.assertContains(response, "GitHub")
|
||||
|
||||
@override_settings(
|
||||
SOCIALACCOUNT_PROVIDERS={
|
||||
"google": {"APP": {"client_id": "g-id", "secret": "g-secret"}},
|
||||
"github": {"APP": {"client_id": "gh-id", "secret": "gh-secret"}},
|
||||
}
|
||||
)
|
||||
def test_google_login_page_uses_portal_styles(self):
|
||||
response = self.client.get(reverse("google_login"))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertContains(response, "Sign in with Google")
|
||||
self.assertContains(response, "social-oauth-card")
|
||||
self.assertContains(response, "navbar")
|
||||
self.assertContains(response, "Continue to Google")
|
||||
|
||||
|
||||
class TecvicoSocialAccountAdapterTest(TestCase):
|
||||
def test_apply_profile_names_from_google(self):
|
||||
user = User(username="oauth-user", email="oauth@example.com")
|
||||
sociallogin = MagicMock()
|
||||
sociallogin.account.provider = "google"
|
||||
sociallogin.account.extra_data = {
|
||||
"given_name": "OAuth",
|
||||
"family_name": "User",
|
||||
}
|
||||
adapter = TecvicoSocialAccountAdapter()
|
||||
adapter._apply_profile_names(user, sociallogin)
|
||||
self.assertEqual(user.first_name, "OAuth")
|
||||
self.assertEqual(user.last_name, "User")
|
||||
|
||||
def test_apply_profile_names_from_github(self):
|
||||
user = User(username="gh-user", email="gh@example.com")
|
||||
sociallogin = MagicMock()
|
||||
sociallogin.account.provider = "github"
|
||||
sociallogin.account.extra_data = {"name": "Grace Hopper"}
|
||||
adapter = TecvicoSocialAccountAdapter()
|
||||
adapter._apply_profile_names(user, sociallogin)
|
||||
self.assertEqual(user.first_name, "Grace")
|
||||
self.assertEqual(user.last_name, "Hopper")
|
||||
Reference in New Issue
Block a user