132 lines
5.0 KiB
Python
132 lines
5.0 KiB
Python
"""
|
|
Integration tests for Auth module endpoints
|
|
Tests login, register, user management return unified format
|
|
"""
|
|
from rest_framework import status
|
|
from django.test import TestCase
|
|
from rest_framework.test import APIClient
|
|
from igny8_core.auth.models import User, Account, Plan
|
|
|
|
|
|
class AuthIntegrationTestCase(TestCase):
|
|
"""Integration tests for Auth module"""
|
|
|
|
def setUp(self):
|
|
"""Set up test fixtures"""
|
|
self.client = APIClient()
|
|
|
|
# Create test plan and account
|
|
self.plan = Plan.objects.create(
|
|
name="Test Plan",
|
|
slug="test-plan",
|
|
price=0,
|
|
credits_per_month=1000
|
|
)
|
|
|
|
# Create test user first (Account needs owner)
|
|
self.user = User.objects.create_user(
|
|
username='testuser',
|
|
email='test@test.com',
|
|
password='testpass123',
|
|
role='owner'
|
|
)
|
|
|
|
# Create test account with owner
|
|
self.account = Account.objects.create(
|
|
name="Test Account",
|
|
slug="test-account",
|
|
plan=self.plan,
|
|
owner=self.user
|
|
)
|
|
|
|
# Update user to have account
|
|
self.user.account = self.account
|
|
self.user.save()
|
|
|
|
def assert_unified_response_format(self, response, expected_success=True):
|
|
"""Assert response follows unified format"""
|
|
self.assertIn('success', response.data)
|
|
self.assertEqual(response.data['success'], expected_success)
|
|
|
|
if expected_success:
|
|
self.assertTrue('data' in response.data or 'results' in response.data)
|
|
else:
|
|
self.assertIn('error', response.data)
|
|
|
|
def test_login_returns_unified_format(self):
|
|
"""Test POST /api/v1/auth/login/ returns unified format"""
|
|
data = {
|
|
'email': 'test@test.com',
|
|
'password': 'testpass123'
|
|
}
|
|
response = self.client.post('/api/v1/auth/login/', data, format='json')
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assert_unified_response_format(response, expected_success=True)
|
|
self.assertIn('data', response.data)
|
|
self.assertIn('user', response.data['data'])
|
|
self.assertIn('access', response.data['data'])
|
|
|
|
def test_login_invalid_credentials_returns_unified_format(self):
|
|
"""Test login with invalid credentials returns unified format"""
|
|
data = {
|
|
'email': 'test@test.com',
|
|
'password': 'wrongpassword'
|
|
}
|
|
response = self.client.post('/api/v1/auth/login/', data, format='json')
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
|
|
self.assert_unified_response_format(response, expected_success=False)
|
|
self.assertIn('error', response.data)
|
|
self.assertIn('request_id', response.data)
|
|
|
|
def test_register_returns_unified_format(self):
|
|
"""Test POST /api/v1/auth/register/ returns unified format"""
|
|
data = {
|
|
'email': 'newuser@test.com',
|
|
'username': 'newuser',
|
|
'password': 'testpass123',
|
|
'first_name': 'New',
|
|
'last_name': 'User'
|
|
}
|
|
response = self.client.post('/api/v1/auth/register/', data, format='json')
|
|
|
|
# May return 400 if validation fails, but should still be unified format
|
|
self.assertIn(response.status_code, [status.HTTP_201_CREATED, status.HTTP_400_BAD_REQUEST])
|
|
self.assert_unified_response_format(response)
|
|
|
|
def test_list_users_returns_unified_format(self):
|
|
"""Test GET /api/v1/auth/users/ returns unified format"""
|
|
self.client.force_authenticate(user=self.user)
|
|
response = self.client.get('/api/v1/auth/users/')
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assert_paginated_response(response)
|
|
|
|
def test_list_accounts_returns_unified_format(self):
|
|
"""Test GET /api/v1/auth/accounts/ returns unified format"""
|
|
self.client.force_authenticate(user=self.user)
|
|
response = self.client.get('/api/v1/auth/accounts/')
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assert_paginated_response(response)
|
|
|
|
def test_list_sites_returns_unified_format(self):
|
|
"""Test GET /api/v1/auth/sites/ returns unified format"""
|
|
self.client.force_authenticate(user=self.user)
|
|
response = self.client.get('/api/v1/auth/sites/')
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assert_paginated_response(response)
|
|
|
|
def test_unauthorized_returns_unified_format(self):
|
|
"""Test 401 errors return unified format"""
|
|
# Don't authenticate
|
|
response = self.client.get('/api/v1/auth/users/')
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
|
|
self.assert_unified_response_format(response, expected_success=False)
|
|
self.assertIn('error', response.data)
|
|
self.assertIn('request_id', response.data)
|
|
|