first commit
This commit is contained in:
201
tests/test_data_consistency.py
Normal file
201
tests/test_data_consistency.py
Normal file
@@ -0,0 +1,201 @@
|
||||
import sys
|
||||
import os
|
||||
import csv
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
# Přidání adresáře src do sys.path, aby bylo možné importovat moduly
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
||||
|
||||
import data_fetcher
|
||||
import holidays
|
||||
|
||||
def create_test_csv(filename, dates):
|
||||
"""
|
||||
Vytvoří testovací CSV soubor s danými daty.
|
||||
|
||||
:param filename: Jméno souboru.
|
||||
:param dates: Seznam dat ve formátu DD.MM.YYYY.
|
||||
"""
|
||||
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
|
||||
writer = csv.writer(csvfile)
|
||||
# Hlavička
|
||||
writer.writerow(["Datum", "1_USD", "1_EUR"])
|
||||
# Data
|
||||
for date in dates:
|
||||
writer.writerow([date, "25.0", "28.0"])
|
||||
|
||||
def test_consistency_with_all_required_dates():
|
||||
"""Test: Všechny požadované pracovní dny jsou v souboru."""
|
||||
print("Test: Všechny požadované pracovní dny jsou v souboru...")
|
||||
|
||||
# Vytvoříme testovací soubor
|
||||
test_file = "data/test_2025_consistent.csv"
|
||||
os.makedirs("data", exist_ok=True)
|
||||
|
||||
# Definujeme testovací data - poslední 3 pracovní dny v srpnu 2025
|
||||
# Předpokládáme, že 19.8.2025 je úterý
|
||||
test_dates = [
|
||||
"18.08.2025", # Pondělí
|
||||
"15.08.2025", # Pátek
|
||||
"14.08.2025" # Čtvrtek
|
||||
]
|
||||
|
||||
create_test_csv(test_file, test_dates)
|
||||
|
||||
# Upravíme funkci check_yearly_data_consistency pro testování s jiným souborem
|
||||
# Pro jednoduchost testu zkopírujeme logiku a upravíme ji
|
||||
try:
|
||||
with open(test_file, 'r', encoding='utf-8') as csvfile:
|
||||
reader = csv.reader(csvfile)
|
||||
lines = list(reader)
|
||||
except IOError as e:
|
||||
print(f"Chyba při čtení souboru {test_file}: {e}")
|
||||
return False
|
||||
|
||||
if len(lines) < 2:
|
||||
print(f"Soubor {test_file} je prázdný nebo obsahuje pouze hlavičku.")
|
||||
return False
|
||||
|
||||
# Získáme seznam dat z CSV (první sloupec)
|
||||
dates_in_file = []
|
||||
for line in lines[1:]: # Přeskočíme hlavičku
|
||||
if line and line[0]: # Zkontrolujeme, že řádek a první sloupec nejsou prázdné
|
||||
dates_in_file.append(line[0])
|
||||
|
||||
# Pro test předpokládáme, že kontrolujeme rok 2025
|
||||
year = 2025
|
||||
|
||||
# Zkontrolujeme poslední 3 pracovní dny
|
||||
today = datetime(2025, 8, 19) # Simulujeme datum 19.8.2025
|
||||
checked_dates = []
|
||||
|
||||
# Projdeme posledních 7 dní (pro jistotu) a vybereme 3 pracovní dny
|
||||
current_date = today - timedelta(days=1) # Začneme včerejškem
|
||||
days_checked = 0
|
||||
|
||||
while len(checked_dates) < 3 and days_checked < 7:
|
||||
date_str = current_date.strftime("%d.%m.%Y")
|
||||
|
||||
# Zkontrolujeme, zda je to pracovní den (není víkend ani svátek)
|
||||
if not holidays.is_weekend(date_str) and not holidays.is_holiday(date_str):
|
||||
# Zkontrolujeme, zda je rok správný
|
||||
try:
|
||||
date_obj = datetime.strptime(date_str, "%d.%m.%Y")
|
||||
if date_obj.year == year:
|
||||
checked_dates.append(date_str)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
current_date -= timedelta(days=1)
|
||||
days_checked += 1
|
||||
|
||||
# Zkontrolujeme, zda všechny pracovní dny jsou v souboru
|
||||
missing_dates = []
|
||||
for date_str in checked_dates:
|
||||
if date_str not in dates_in_file:
|
||||
missing_dates.append(date_str)
|
||||
|
||||
# Vyčistíme testovací soubor
|
||||
if os.path.exists(test_file):
|
||||
os.remove(test_file)
|
||||
|
||||
if missing_dates:
|
||||
print(f"Test selhal: Chybí záznamy pro následující pracovní dny: {', '.join(missing_dates)}")
|
||||
return False
|
||||
else:
|
||||
print("Test: Všechny požadované pracovní dny jsou v souboru - OK")
|
||||
return True
|
||||
|
||||
def test_consistency_with_missing_dates():
|
||||
"""Test: Některé požadované pracovní dny chybí v souboru."""
|
||||
print("Test: Některé požadované pracovní dny chybí v souboru...")
|
||||
|
||||
# Vytvoříme testovací soubor
|
||||
test_file = "data/test_2025_inconsistent.csv"
|
||||
os.makedirs("data", exist_ok=True)
|
||||
|
||||
# Definujeme testovací data - chybí 18.08.2025
|
||||
test_dates = [
|
||||
"15.08.2025", # Pátek
|
||||
"14.08.2025" # Čtvrtek
|
||||
]
|
||||
|
||||
create_test_csv(test_file, test_dates)
|
||||
|
||||
# Upravíme funkci check_yearly_data_consistency pro testování s jiným souborem
|
||||
# Pro jednoduchost testu zkopírujeme logiku a upravíme ji
|
||||
try:
|
||||
with open(test_file, 'r', encoding='utf-8') as csvfile:
|
||||
reader = csv.reader(csvfile)
|
||||
lines = list(reader)
|
||||
except IOError as e:
|
||||
print(f"Chyba při čtení souboru {test_file}: {e}")
|
||||
return False
|
||||
|
||||
if len(lines) < 2:
|
||||
print(f"Soubor {test_file} je prázdný nebo obsahuje pouze hlavičku.")
|
||||
return False
|
||||
|
||||
# Získáme seznam dat z CSV (první sloupec)
|
||||
dates_in_file = []
|
||||
for line in lines[1:]: # Přeskočíme hlavičku
|
||||
if line and line[0]: # Zkontrolujeme, že řádek a první sloupec nejsou prázdné
|
||||
dates_in_file.append(line[0])
|
||||
|
||||
# Pro test předpokládáme, že kontrolujeme rok 2025
|
||||
year = 2025
|
||||
|
||||
# Zkontrolujeme poslední 3 pracovní dny
|
||||
today = datetime(2025, 8, 19) # Simulujeme datum 19.8.2025
|
||||
checked_dates = []
|
||||
|
||||
# Projdeme posledních 7 dní (pro jistotu) a vybereme 3 pracovní dny
|
||||
current_date = today - timedelta(days=1) # Začneme včerejškem
|
||||
days_checked = 0
|
||||
|
||||
while len(checked_dates) < 3 and days_checked < 7:
|
||||
date_str = current_date.strftime("%d.%m.%Y")
|
||||
|
||||
# Zkontrolujeme, zda je to pracovní den (není víkend ani svátek)
|
||||
if not holidays.is_weekend(date_str) and not holidays.is_holiday(date_str):
|
||||
# Zkontrolujeme, zda je rok správný
|
||||
try:
|
||||
date_obj = datetime.strptime(date_str, "%d.%m.%Y")
|
||||
if date_obj.year == year:
|
||||
checked_dates.append(date_str)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
current_date -= timedelta(days=1)
|
||||
days_checked += 1
|
||||
|
||||
# Zkontrolujeme, zda všechny pracovní dny jsou v souboru
|
||||
missing_dates = []
|
||||
for date_str in checked_dates:
|
||||
if date_str not in dates_in_file:
|
||||
missing_dates.append(date_str)
|
||||
|
||||
# Vyčistíme testovací soubor
|
||||
if os.path.exists(test_file):
|
||||
os.remove(test_file)
|
||||
|
||||
if missing_dates:
|
||||
print(f"Test: Některé požadované pracovní dny chybí v souboru - OK (chybí: {', '.join(missing_dates)})")
|
||||
return True
|
||||
else:
|
||||
print("Test selhal: Všechny pracovní dny jsou v souboru, ale očekávali jsme chybějící")
|
||||
return False
|
||||
|
||||
def run_all_tests():
|
||||
"""Spustí všechny testy."""
|
||||
print("Spouštím testy kontroly konzistence ročních dat...")
|
||||
test1_result = test_consistency_with_all_required_dates()
|
||||
test2_result = test_consistency_with_missing_dates()
|
||||
|
||||
if test1_result and test2_result:
|
||||
print("\nVšechny testy kontroly konzistence ročních dat byly úspěšné!")
|
||||
else:
|
||||
print("\nNěkteré testy kontroly konzistence ročních dat selhaly!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
run_all_tests()
|
||||
Reference in New Issue
Block a user