""" Tests for validation functions in the Flask job application system. """ import pytest from app import validate_email, validate_phone, validate_year, validate_zip, allowed_file class TestEmailValidation: """Tests for email validation.""" def test_valid_email(self): """Test that valid email addresses are accepted.""" assert validate_email('test@example.com') is True assert validate_email('user.name@domain.co.uk') is True assert validate_email('test+tag@example.com') is True assert validate_email('test_123@test-domain.com') is True def test_invalid_email(self): """Test that invalid email addresses are rejected.""" assert validate_email('') is False assert validate_email('invalid-email') is False assert validate_email('@example.com') is False assert validate_email('test@') is False assert validate_email('test@domain') is False assert validate_email('test @example.com') is False def test_email_edge_cases(self): """Test edge cases for email validation.""" assert validate_email('a@b.co') is True # Minimum valid email assert validate_email('test@@example.com') is False # Double @ assert validate_email('test..name@example.com') is True # Double dot in local part class TestPhoneValidation: """Tests for international phone number validation.""" def test_valid_phone_with_spaces(self): """Test valid phone numbers with spaces.""" assert validate_phone('+41 79 123 45 67') is True assert validate_phone('+1 555 123 4567') is True assert validate_phone('+49 30 12345678') is True def test_valid_phone_without_spaces(self): """Test valid phone numbers without spaces.""" assert validate_phone('+41791234567') is True assert validate_phone('+15551234567') is True assert validate_phone('+493012345678') is True def test_invalid_phone(self): """Test that invalid phone numbers are rejected.""" assert validate_phone('') is False assert validate_phone('079 123 45 67') is False # Missing + assert validate_phone('+41') is False # Too short assert validate_phone('41791234567') is False # Missing + assert validate_phone('+') is False # Only + def test_phone_edge_cases(self): """Test edge cases for phone validation.""" assert validate_phone('+1 123') is True # Minimum length assert validate_phone('+999 1234567890123456') is True # Long number within limit class TestYearValidation: """Tests for birth year validation.""" def test_valid_years(self): """Test that valid birth years are accepted.""" assert validate_year('1940') is True # Minimum assert validate_year('1990') is True # Middle assert validate_year('2010') is True # Maximum def test_invalid_years_out_of_range(self): """Test that years outside the valid range are rejected.""" assert validate_year('1939') is False # Too old assert validate_year('2011') is False # Too young assert validate_year('1900') is False assert validate_year('2025') is False def test_invalid_year_format(self): """Test that invalid year formats are rejected.""" assert validate_year('') is False assert validate_year('90') is False # 2 digits assert validate_year('990') is False # 3 digits assert validate_year('19900') is False # 5 digits assert validate_year('abcd') is False # Non-numeric assert validate_year('199a') is False # Mixed class TestZipValidation: """Tests for ZIP code validation.""" def test_valid_zip_codes(self): """Test that valid ZIP codes are accepted.""" assert validate_zip('8001') is True assert validate_zip('12345') is True assert validate_zip('1') is True # Single digit assert validate_zip('1234567890') is True # Max 10 digits def test_invalid_zip_codes(self): """Test that invalid ZIP codes are rejected.""" assert validate_zip('') is False assert validate_zip('12345678901') is False # 11 digits (too long) assert validate_zip('abc') is False # Non-numeric assert validate_zip('123a5') is False # Mixed def test_zip_edge_cases(self): """Test edge cases for ZIP validation.""" assert validate_zip('0') is True # Zero is valid assert validate_zip('00000') is True # Leading zeros class TestFileExtensionValidation: """Tests for file extension validation.""" def test_valid_file_extensions(self): """Test that files with valid extensions are accepted.""" assert allowed_file('document.pdf') is True assert allowed_file('resume.doc') is True assert allowed_file('cover.docx') is True assert allowed_file('notes.txt') is True assert allowed_file('photo.jpg') is True assert allowed_file('image.jpeg') is True assert allowed_file('picture.png') is True def test_invalid_file_extensions(self): """Test that files with invalid extensions are rejected.""" assert allowed_file('script.exe') is False assert allowed_file('data.zip') is False assert allowed_file('code.py') is False assert allowed_file('file.unknown') is False def test_file_without_extension(self): """Test that files without extensions are rejected.""" assert allowed_file('noextension') is False assert allowed_file('') is False def test_case_insensitive_extensions(self): """Test that file extension validation is case-insensitive.""" assert allowed_file('document.PDF') is True assert allowed_file('document.Pdf') is True assert allowed_file('image.JPG') is True assert allowed_file('image.JPEG') is True def test_multiple_dots_in_filename(self): """Test files with multiple dots in the filename.""" assert allowed_file('my.document.pdf') is True assert allowed_file('file.name.with.dots.jpg') is True assert allowed_file('test.tar.gz') is False # .gz not allowed