loko/streetup/analytics/tests.py
2026-07-22 14:48:40 +02:00

286 lines
9.8 KiB
Python

"""
Tests pour le système Analytics.
"""
from django.test import TestCase, Client, RequestFactory
from django.contrib.auth.models import User
from django.utils import timezone
from datetime import timedelta
from .models import PageView, UserSession
from .middleware import AnalyticsMiddleware
class PageViewModelTest(TestCase):
"""Tests pour le modèle PageView."""
def setUp(self):
self.user = User.objects.create_user(
username='testuser',
password='testpass123'
)
def test_create_page_view(self):
"""Test de création d'une vue de page."""
page_view = PageView.objects.create(
user=self.user,
session_key='test_session_123',
path='/test/page/',
method='GET',
ip_address='127.0.0.1',
response_time_ms=100
)
self.assertEqual(page_view.user, self.user)
self.assertEqual(page_view.path, '/test/page/')
self.assertEqual(page_view.response_time_ms, 100)
self.assertIsNotNone(page_view.timestamp)
def test_page_view_str(self):
"""Test de la représentation string d'une PageView."""
page_view = PageView.objects.create(
user=self.user,
session_key='test_session_123',
path='/test/page/',
)
str_repr = str(page_view)
self.assertIn('testuser', str_repr)
self.assertIn('/test/page/', str_repr)
def test_page_view_without_user(self):
"""Test de création d'une vue de page sans utilisateur (anonyme)."""
page_view = PageView.objects.create(
user=None,
session_key='anonymous_session',
path='/public/page/',
)
self.assertIsNone(page_view.user)
str_repr = str(page_view)
self.assertIn('Anonyme', str_repr)
class UserSessionModelTest(TestCase):
"""Tests pour le modèle UserSession."""
def setUp(self):
self.user = User.objects.create_user(
username='testuser',
password='testpass123'
)
def test_create_user_session(self):
"""Test de création d'une session utilisateur."""
now = timezone.now()
session = UserSession.objects.create(
user=self.user,
session_key='test_session_456',
login_time=now,
last_activity=now,
ip_address='127.0.0.1',
is_active=True
)
self.assertEqual(session.user, self.user)
self.assertEqual(session.session_key, 'test_session_456')
self.assertTrue(session.is_active)
self.assertIsNone(session.logout_time)
def test_session_duration(self):
"""Test du calcul de la durée d'une session."""
now = timezone.now()
later = now + timedelta(hours=2)
session = UserSession.objects.create(
user=self.user,
session_key='test_session_789',
login_time=now,
last_activity=later,
is_active=True
)
duration = session.duration
self.assertEqual(duration.total_seconds(), 7200) # 2 heures
self.assertEqual(session.duration_seconds, 7200)
def test_mark_inactive(self):
"""Test de marquage d'une session comme inactive."""
session = UserSession.objects.create(
user=self.user,
session_key='test_session_abc',
login_time=timezone.now(),
last_activity=timezone.now(),
is_active=True
)
self.assertTrue(session.is_active)
self.assertIsNone(session.logout_time)
session.mark_inactive()
session.refresh_from_db()
self.assertFalse(session.is_active)
self.assertIsNotNone(session.logout_time)
def test_session_str(self):
"""Test de la représentation string d'une UserSession."""
session = UserSession.objects.create(
user=self.user,
session_key='test_session_def',
login_time=timezone.now(),
last_activity=timezone.now(),
is_active=True
)
str_repr = str(session)
self.assertIn('testuser', str_repr)
self.assertIn('Active', str_repr)
class AnalyticsMiddlewareTest(TestCase):
"""Tests pour le middleware Analytics."""
def setUp(self):
self.factory = RequestFactory()
self.user = User.objects.create_user(
username='testuser',
password='testpass123'
)
self.middleware = AnalyticsMiddleware(lambda r: None)
def test_should_track_normal_request(self):
"""Test que les requêtes normales sont trackées."""
request = self.factory.get('/test/page/')
self.assertTrue(self.middleware._should_track(request))
def test_should_not_track_static_files(self):
"""Test que les fichiers statiques ne sont pas trackés."""
request = self.factory.get('/static/css/style.css')
self.assertFalse(self.middleware._should_track(request))
def test_should_not_track_media_files(self):
"""Test que les fichiers media ne sont pas trackés."""
request = self.factory.get('/media/images/photo.jpg')
self.assertFalse(self.middleware._should_track(request))
def test_should_not_track_favicon(self):
"""Test que le favicon n'est pas tracké."""
request = self.factory.get('/favicon.ico')
self.assertFalse(self.middleware._should_track(request))
def test_should_not_track_head_method(self):
"""Test que les requêtes HEAD ne sont pas trackées."""
request = self.factory.head('/test/page/')
self.assertFalse(self.middleware._should_track(request))
def test_should_track_post_method(self):
"""Test que les requêtes POST sont trackées."""
request = self.factory.post('/test/form/')
self.assertTrue(self.middleware._should_track(request))
def test_get_client_ip(self):
"""Test de récupération de l'adresse IP du client."""
# IP directe
request = self.factory.get('/')
request.META['REMOTE_ADDR'] = '192.168.1.100'
ip = self.middleware._get_client_ip(request)
self.assertEqual(ip, '192.168.1.100')
# IP via proxy (X-Forwarded-For)
request = self.factory.get('/')
request.META['HTTP_X_FORWARDED_FOR'] = '203.0.113.1, 192.168.1.1'
ip = self.middleware._get_client_ip(request)
self.assertEqual(ip, '203.0.113.1')
class AnalyticsViewsTest(TestCase):
"""Tests pour les vues Analytics."""
def setUp(self):
self.client = Client()
self.user = User.objects.create_user(
username='testuser',
password='testpass123'
)
self.superuser = User.objects.create_superuser(
username='superuser',
password='testpass123'
)
def test_dashboard_requires_superuser(self):
"""Test que le dashboard nécessite les droits superuser."""
# Utilisateur non authentifié
response = self.client.get('/analytics/')
self.assertEqual(response.status_code, 302) # Redirection vers login
# Utilisateur authentifié mais non superuser
self.client.login(username='testuser', password='testpass123')
response = self.client.get('/analytics/')
self.assertEqual(response.status_code, 302) # Redirection
# Utilisateur superuser
self.client.login(username='superuser', password='testpass123')
response = self.client.get('/analytics/')
self.assertEqual(response.status_code, 200) # Accès autorisé
def test_dashboard_displays_stats(self):
"""Test que le dashboard affiche les statistiques."""
# Créer quelques données de test
PageView.objects.create(
user=self.user,
session_key='session1',
path='/test/',
)
self.client.login(username='superuser', password='testpass123')
response = self.client.get('/analytics/')
self.assertEqual(response.status_code, 200)
self.assertIn('stats', response.context)
self.assertIn('chart_data', response.context)
def test_dashboard_days_filter(self):
"""Test du filtre de période du dashboard."""
self.client.login(username='superuser', password='testpass123')
# 7 jours
response = self.client.get('/analytics/?days=7')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['days'], 7)
# 30 jours
response = self.client.get('/analytics/?days=30')
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context['days'], 30)
class AnalyticsIntegrationTest(TestCase):
"""Tests d'intégration du système Analytics."""
def setUp(self):
self.user = User.objects.create_user(
username='testuser',
password='testpass123'
)
def test_page_view_tracking_flow(self):
"""Test du flux complet de tracking d'une page view."""
# Se connecter
client = Client()
client.login(username='testuser', password='testpass123')
# Naviguer sur une page (le middleware devrait créer une PageView)
# Note: En environnement de test, le middleware peut ne pas être actif
# Ce test vérifie plutôt la structure
# Vérifier qu'on peut créer manuellement une PageView
initial_count = PageView.objects.count()
PageView.objects.create(
user=self.user,
session_key=client.session.session_key or 'test_session',
path='/test/page/',
)
final_count = PageView.objects.count()
self.assertEqual(final_count, initial_count + 1)