import pytest from django.contrib.auth.models import User from django.urls import reverse from quiz.models import QuizUser, Question, Option, QuizResult @pytest.mark.django_db @pytest.mark.admin class TestAdminPages: """Test that all admin pages render without errors""" @pytest.fixture def admin_client(self, client, django_user_model, db): """Create authenticated admin client""" admin_user = django_user_model.objects.create_superuser( username='testadmin', email='admin@test.com', password='admin123' ) client.login(username='testadmin', password='admin123') return client @pytest.fixture def test_data(self, db): """Create test data""" quiz_user = QuizUser.objects.create(session_key='test_session_123') question = Question.objects.create( file_path='test/question1.md', text='Test question?', correct_answer='A', file_mtime=1234567890.0 ) Option.objects.create(question=question, letter='A', text='Correct answer') Option.objects.create(question=question, letter='B', text='Wrong answer') quiz_result = QuizResult.objects.create( user=quiz_user, question=question, selected_answer='A', is_correct=True ) return { 'quiz_user': quiz_user, 'question': question, 'quiz_result': quiz_result } def test_admin_index(self, admin_client): """Test admin index page""" response = admin_client.get(reverse('admin:index')) assert response.status_code == 200 assert 'Site administration' in response.content.decode() def test_question_changelist(self, admin_client, test_data): """Test Question list page""" response = admin_client.get(reverse('admin:quiz_question_changelist')) assert response.status_code == 200 assert 'Test question?' in response.content.decode() def test_question_add(self, admin_client): """Test Question add page""" response = admin_client.get(reverse('admin:quiz_question_add')) assert response.status_code == 200 assert 'Add question' in response.content.decode() def test_question_change(self, admin_client, test_data): """Test Question change/edit page""" response = admin_client.get( reverse('admin:quiz_question_change', args=[test_data['question'].pk]) ) assert response.status_code == 200 assert 'Test question?' in response.content.decode() assert 'Correct answer' in response.content.decode() def test_question_delete(self, admin_client, test_data): """Test Question delete page""" response = admin_client.get( reverse('admin:quiz_question_delete', args=[test_data['question'].pk]) ) assert response.status_code == 200 assert 'Are you sure' in response.content.decode() def test_option_add(self, admin_client): """Test Option add page""" response = admin_client.get(reverse('admin:quiz_option_add')) assert response.status_code == 200 assert 'Add option' in response.content.decode() def test_option_change(self, admin_client, test_data): """Test Option change/edit page""" option = test_data['question'].options.first() response = admin_client.get( reverse('admin:quiz_option_change', args=[option.pk]) ) assert response.status_code == 200 assert 'Correct answer' in response.content.decode() def test_quizuser_changelist(self, admin_client, test_data): """Test QuizUser list page""" response = admin_client.get(reverse('admin:quiz_quizuser_changelist')) assert response.status_code == 200 assert 'test_session' in response.content.decode() def test_quizuser_add(self, admin_client): """Test QuizUser add page""" response = admin_client.get(reverse('admin:quiz_quizuser_add')) assert response.status_code == 200 assert 'Add Quiz User' in response.content.decode() def test_quizuser_change(self, admin_client, test_data): """Test QuizUser change/edit page""" response = admin_client.get( reverse('admin:quiz_quizuser_change', args=[test_data['quiz_user'].pk]) ) assert response.status_code == 200 assert 'test_session' in response.content.decode() def test_quizresult_changelist(self, admin_client, test_data): """Test QuizResult list page""" response = admin_client.get(reverse('admin:quiz_quizresult_changelist')) assert response.status_code == 200 assert 'Test question' in response.content.decode() def test_quizresult_add(self, admin_client): """Test QuizResult add page""" response = admin_client.get(reverse('admin:quiz_quizresult_add')) assert response.status_code == 200 assert 'Add quiz result' in response.content.decode() def test_quizresult_change(self, admin_client, test_data): """Test QuizResult change/edit page""" response = admin_client.get( reverse('admin:quiz_quizresult_change', args=[test_data['quiz_result'].pk]) ) assert response.status_code == 200 assert 'Test question' in response.content.decode() def test_admin_custom_displays(self, admin_client, test_data): """Test custom admin display methods render correctly""" # Question admin with custom fields response = admin_client.get(reverse('admin:quiz_question_changelist')) assert 'question1.md' in response.content.decode() # QuizUser admin with score percentage response = admin_client.get(reverse('admin:quiz_quizuser_changelist')) assert '100.0%' in response.content.decode() # QuizResult admin with result status response = admin_client.get(reverse('admin:quiz_quizresult_changelist')) assert 'Correct' in response.content.decode() def test_admin_search(self, admin_client, test_data): """Test admin search functionality""" response = admin_client.get( reverse('admin:quiz_question_changelist') + '?q=Test' ) assert response.status_code == 200 assert 'Test question?' in response.content.decode() def test_admin_filters(self, admin_client, test_data): """Test admin filter functionality""" response = admin_client.get( reverse('admin:quiz_quizresult_changelist') + '?is_correct__exact=1' ) assert response.status_code == 200 @pytest.mark.parametrize('url_name', [ 'admin:index', 'admin:quiz_question_changelist', 'admin:quiz_question_add', 'admin:quiz_quizuser_changelist', 'admin:quiz_quizuser_add', 'admin:quiz_quizresult_changelist', 'admin:quiz_quizresult_add', ]) def test_all_admin_pages_no_errors(self, admin_client, test_data, url_name): """Integration test: verify no admin pages return errors""" url = reverse(url_name) response = admin_client.get(url) assert response.status_code == 200, f"Failed to load {url}"