Increases overall test coverage from 53% to 56% by adding tests for: - accommodation.py (60% → 100%) - birthday.py (24% → 100%) - calendar.py (19% → 100%) - carnival.py (33% → 100%) - domains.py (75% → 100%) - events_yaml.py (50% → 96%) - fx.py (14% → 21% for tested functions) - sun.py (55% → 100%) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
168 lines
6.6 KiB
Python
168 lines
6.6 KiB
Python
"""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 |