import pytest from datetime import date from forms import AssessmentForm, ClassGroupForm, StudentForm from models import db, ClassGroup from repositories import ClassRepository class TestAssessmentForm: def test_assessment_form_valid_data(self, app): with app.app_context(): class_group = ClassGroup(name="6A", year="2023-2024") db.session.add(class_group) db.session.commit() # Create form without CSRF token for testing with app.test_request_context(): form = AssessmentForm() form.title.data = 'Test Math' form.description.data = 'Contrôle de mathématiques' form.date.data = date(2023, 10, 15) form.class_group_id.data = class_group.id form.coefficient.data = 2.0 assert form.title.data == 'Test Math' assert form.description.data == 'Contrôle de mathématiques' assert form.date.data == date(2023, 10, 15) assert form.class_group_id.data == class_group.id assert form.coefficient.data == 2.0 def test_assessment_form_missing_title(self, app): with app.app_context(): class_group = ClassGroup(name="6A", year="2023-2024") db.session.add(class_group) db.session.commit() with app.test_request_context(): # Test form data validation by checking field requirements form = AssessmentForm() # Title field is required, so it should be marked as required assert form.title.flags.required def test_assessment_form_coefficient_field(self, app): with app.app_context(): with app.test_request_context(): form = AssessmentForm() # Test that coefficient field exists and has validators assert hasattr(form, 'coefficient') assert form.coefficient.flags.required # Check that NumberRange validator is present has_number_range = any(v.__class__.__name__ == 'NumberRange' for v in form.coefficient.validators) assert has_number_range def test_assessment_form_default_values(self, app): with app.app_context(): with app.test_request_context(): form = AssessmentForm() # Test that defaults are callable functions, not values assert callable(form.date.default) assert form.coefficient.default == 1.0 def test_assessment_form_class_choices_populated(self, app): with app.app_context(): class_group1 = ClassGroup(name="6A", year="2023-2024") class_group2 = ClassGroup(name="6B", year="2023-2024") db.session.add_all([class_group1, class_group2]) db.session.commit() with app.test_request_context(): form = AssessmentForm() class_repo = ClassRepository() form.populate_class_choices(class_repo) assert len(form.class_group_id.choices) >= 2 choice_names = [choice[1] for choice in form.class_group_id.choices] assert "6A" in choice_names assert "6B" in choice_names class TestClassGroupForm: def test_class_group_form_valid_data(self, app): with app.app_context(): with app.test_request_context(): form = ClassGroupForm() form.name.data = '6A' form.description.data = 'Classe de 6ème A' form.year.data = '2023-2024' assert form.name.data == '6A' assert form.description.data == 'Classe de 6ème A' assert form.year.data == '2023-2024' def test_class_group_form_name_required(self, app): with app.app_context(): with app.test_request_context(): form = ClassGroupForm() # Test that name field is required assert form.name.flags.required def test_class_group_form_default_year(self, app): with app.app_context(): with app.test_request_context(): form = ClassGroupForm() assert form.year.default == "2024-2025" class TestStudentForm: def test_student_form_valid_data(self, app): with app.app_context(): class_group = ClassGroup(name="6A", year="2023-2024") db.session.add(class_group) db.session.commit() with app.test_request_context(): form = StudentForm() form.first_name.data = 'Jean' form.last_name.data = 'Dupont' form.email.data = 'jean.dupont@example.com' form.class_group_id.data = class_group.id assert form.first_name.data == 'Jean' assert form.last_name.data == 'Dupont' assert form.email.data == 'jean.dupont@example.com' assert form.class_group_id.data == class_group.id def test_student_form_required_fields(self, app): with app.app_context(): with app.test_request_context(): form = StudentForm() # Test that required fields are marked as required assert form.first_name.flags.required assert form.last_name.flags.required assert form.class_group_id.flags.required def test_student_form_email_validator(self, app): with app.app_context(): with app.test_request_context(): form = StudentForm() # Test that email field has email validator has_email_validator = any(v.__class__.__name__ == 'Email' for v in form.email.validators) assert has_email_validator # Email field should be optional assert not form.email.flags.required def test_student_form_optional_email(self, app): with app.app_context(): class_group = ClassGroup(name="6A", year="2023-2024") db.session.add(class_group) db.session.commit() with app.test_request_context(): form = StudentForm() form.first_name.data = 'Jean' form.last_name.data = 'Dupont' form.class_group_id.data = class_group.id # Don't set email - should be valid assert form.first_name.data == 'Jean' assert form.last_name.data == 'Dupont' assert form.email.data is None