"""Tests for domain renewal functionality.""" import csv import os import tempfile from datetime import date from typing import Any import pytest from agenda.domains import renewal_dates, url from agenda.event import Event class TestRenewalDates: """Test the renewal_dates function.""" def test_renewal_dates_empty_directory(self) -> None: """Test with empty directory.""" with tempfile.TemporaryDirectory() as temp_dir: with pytest.raises(ValueError, match="max\\(\\) iterable argument is empty"): renewal_dates(temp_dir) def test_renewal_dates_no_matching_files(self) -> None: """Test with directory containing no matching files.""" with tempfile.TemporaryDirectory() as temp_dir: # Create some non-matching files with open(os.path.join(temp_dir, "other_file.csv"), "w") as f: f.write("test") with open(os.path.join(temp_dir, "not_export.csv"), "w") as f: f.write("test") with pytest.raises(ValueError, match="max\\(\\) iterable argument is empty"): renewal_dates(temp_dir) def test_renewal_dates_single_file(self) -> None: """Test with single domain export file.""" with tempfile.TemporaryDirectory() as temp_dir: # Create a domain export file filename = "export_domains_01_15_2024_02_30_PM.csv" filepath = os.path.join(temp_dir, filename) # Create CSV content csv_data = [ ["fqdn", "date_registry_end_utc"], ["example.com", "2024-06-15T00:00:00Z"], ["test.org", "2024-12-31T00:00:00Z"] ] with open(filepath, "w", newline="") as f: writer = csv.writer(f) writer.writerows(csv_data) result = renewal_dates(temp_dir) assert len(result) == 2 # Check first domain assert result[0].name == "domain" assert result[0].title == "🌐 example.com" assert result[0].date == date(2024, 6, 15) assert result[0].url == url + "example.com" # Check second domain assert result[1].name == "domain" assert result[1].title == "🌐 test.org" assert result[1].date == date(2024, 12, 31) assert result[1].url == url + "test.org" def test_renewal_dates_multiple_files_latest_used(self) -> None: """Test that the latest file is used when multiple exist.""" with tempfile.TemporaryDirectory() as temp_dir: # Create older file older_filename = "export_domains_01_15_2024_02_30_PM.csv" older_filepath = os.path.join(temp_dir, older_filename) older_csv_data = [ ["fqdn", "date_registry_end_utc"], ["old.com", "2024-06-15T00:00:00Z"] ] with open(older_filepath, "w", newline="") as f: writer = csv.writer(f) writer.writerows(older_csv_data) # Create newer file newer_filename = "export_domains_01_16_2024_03_45_PM.csv" newer_filepath = os.path.join(temp_dir, newer_filename) newer_csv_data = [ ["fqdn", "date_registry_end_utc"], ["new.com", "2024-08-20T00:00:00Z"] ] with open(newer_filepath, "w", newline="") as f: writer = csv.writer(f) writer.writerows(newer_csv_data) result = renewal_dates(temp_dir) # Should only get data from newer file assert len(result) == 1 assert result[0].title == "🌐 new.com" assert result[0].date == date(2024, 8, 20) def test_renewal_dates_empty_csv(self) -> None: """Test with empty CSV file.""" with tempfile.TemporaryDirectory() as temp_dir: filename = "export_domains_01_15_2024_02_30_PM.csv" filepath = os.path.join(temp_dir, filename) # Create CSV with only headers csv_data = [["fqdn", "date_registry_end_utc"]] with open(filepath, "w", newline="") as f: writer = csv.writer(f) writer.writerows(csv_data) result = renewal_dates(temp_dir) assert result == [] def test_renewal_dates_directory_not_found(self) -> None: """Test error handling when directory doesn't exist.""" with pytest.raises(FileNotFoundError): renewal_dates("/nonexistent/directory") def test_renewal_dates_malformed_filename(self) -> None: """Test with malformed filename that can't be parsed.""" with tempfile.TemporaryDirectory() as temp_dir: # Create file with name that starts correctly but can't be parsed as date filename = "export_domains_invalid_date.csv" filepath = os.path.join(temp_dir, filename) with open(filepath, "w") as f: f.write("test") # Should raise ValueError when trying to parse the malformed date with pytest.raises(ValueError, match="time data .* does not match format"): renewal_dates(temp_dir) def test_renewal_dates_various_date_formats(self) -> None: """Test with various date formats in the CSV.""" with tempfile.TemporaryDirectory() as temp_dir: filename = "export_domains_01_15_2024_02_30_PM.csv" filepath = os.path.join(temp_dir, filename) csv_data = [ ["fqdn", "date_registry_end_utc"], ["example1.com", "2024-06-15T12:34:56Z"], ["example2.com", "2024-12-31T00:00:00+00:00"], ["example3.com", "2024-03-20T23:59:59.999Z"] ] with open(filepath, "w", newline="") as f: writer = csv.writer(f) writer.writerows(csv_data) result = renewal_dates(temp_dir) assert len(result) == 3 assert result[0].date == date(2024, 6, 15) assert result[1].date == date(2024, 12, 31) assert result[2].date == date(2024, 3, 20) class TestConstants: """Test module constants.""" def test_url_constant(self) -> None: """Test that URL constant has expected value.""" expected_url = "https://admin.gandi.net/domain/01578ef0-a84b-11e7-bdf3-00163e6dc886/" assert url == expected_url