copilot test
This commit is contained in:
56
tests/test_docker_integration.py
Normal file
56
tests/test_docker_integration.py
Normal file
@@ -0,0 +1,56 @@
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import time
|
||||
import socket
|
||||
import urllib.request
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
def docker_available():
|
||||
return shutil.which("docker") is not None
|
||||
|
||||
|
||||
def wait_for_http(url, timeout=30):
|
||||
end = time.time() + timeout
|
||||
last_exc = None
|
||||
while time.time() < end:
|
||||
try:
|
||||
with urllib.request.urlopen(url, timeout=3) as r:
|
||||
body = r.read().decode('utf-8', errors='ignore')
|
||||
return r.getcode(), body
|
||||
except Exception as e:
|
||||
last_exc = e
|
||||
time.sleep(0.5)
|
||||
raise RuntimeError(f"HTTP check failed after {timeout}s: {last_exc}")
|
||||
|
||||
|
||||
@pytest.mark.skipif(not docker_available(), reason="Docker is not available on this runner")
|
||||
@pytest.mark.integration
|
||||
def test_build_run_and_cleanup_docker():
|
||||
image_tag = "scenar-creator:latest"
|
||||
container_name = "scenar-creator-test"
|
||||
port = int(os.environ.get('SCENAR_TEST_PORT', '8080'))
|
||||
|
||||
# Build image
|
||||
subprocess.run(["docker", "build", "-t", image_tag, "."], check=True)
|
||||
|
||||
# Ensure no leftover container
|
||||
subprocess.run(["docker", "rm", "-f", container_name], check=False)
|
||||
|
||||
try:
|
||||
# Run container
|
||||
subprocess.run([
|
||||
"docker", "run", "-d", "--name", container_name, "-p", f"{port}:8080", image_tag
|
||||
], check=True)
|
||||
|
||||
# Wait for HTTP and verify content
|
||||
code, body = wait_for_http(f"http://127.0.0.1:{port}/")
|
||||
assert code == 200
|
||||
assert "Vytvoření Scénáře" in body or "Scenar" in body or "Vytvoření" in body
|
||||
|
||||
finally:
|
||||
# Cleanup container and image
|
||||
subprocess.run(["docker", "rm", "-f", container_name], check=False)
|
||||
subprocess.run(["docker", "rmi", image_tag], check=False)
|
||||
86
tests/test_read_excel.py
Normal file
86
tests/test_read_excel.py
Normal file
@@ -0,0 +1,86 @@
|
||||
import io
|
||||
import os
|
||||
import pandas as pd
|
||||
import importlib.util
|
||||
import sys
|
||||
import types
|
||||
|
||||
|
||||
def load_scenar_module():
|
||||
repo_root = os.path.dirname(os.path.dirname(__file__))
|
||||
scenar_path = os.path.join(repo_root, 'cgi-bin', 'scenar.py')
|
||||
# Provide a minimal fake `cgi` module so top-level imports in the CGI script don't fail
|
||||
if 'cgi' not in sys.modules:
|
||||
fake_cgi = types.ModuleType('cgi')
|
||||
class FakeFieldStorage:
|
||||
def getvalue(self, key, default=None):
|
||||
return default
|
||||
def keys(self):
|
||||
return []
|
||||
def __contains__(self, item):
|
||||
return False
|
||||
fake_cgi.FieldStorage = FakeFieldStorage
|
||||
sys.modules['cgi'] = fake_cgi
|
||||
# minimal fake cgitb (some environments don't expose it)
|
||||
if 'cgitb' not in sys.modules:
|
||||
fake_cgitb = types.ModuleType('cgitb')
|
||||
def fake_enable():
|
||||
return None
|
||||
fake_cgitb.enable = fake_enable
|
||||
sys.modules['cgitb'] = fake_cgitb
|
||||
|
||||
spec = importlib.util.spec_from_file_location('scenar', scenar_path)
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
# executing the module will run top-level CGI code (prints etc.) but defines functions we need
|
||||
spec.loader.exec_module(module)
|
||||
return module
|
||||
|
||||
|
||||
def make_excel_bytes(df: pd.DataFrame) -> bytes:
|
||||
bio = io.BytesIO()
|
||||
with pd.ExcelWriter(bio, engine='openpyxl') as writer:
|
||||
df.to_excel(writer, index=False)
|
||||
return bio.getvalue()
|
||||
|
||||
|
||||
def test_read_excel_happy_path():
|
||||
scenar = load_scenar_module()
|
||||
|
||||
df = pd.DataFrame({
|
||||
'Datum': [pd.Timestamp('2025-11-13').date()],
|
||||
'Zacatek': ['09:00'],
|
||||
'Konec': ['10:00'],
|
||||
'Program': ['Test program'],
|
||||
'Typ': ['WORKSHOP'],
|
||||
'Garant': ['Garant Name'],
|
||||
'Poznamka': ['Pozn']
|
||||
})
|
||||
|
||||
content = make_excel_bytes(df)
|
||||
valid, errors = scenar.read_excel(content)
|
||||
|
||||
assert isinstance(valid, pd.DataFrame)
|
||||
assert len(errors) == 0
|
||||
assert len(valid) == 1
|
||||
assert valid.iloc[0]['Program'] == 'Test program'
|
||||
|
||||
|
||||
def test_read_excel_invalid_time():
|
||||
scenar = load_scenar_module()
|
||||
|
||||
df = pd.DataFrame({
|
||||
'Datum': [pd.Timestamp('2025-11-13').date()],
|
||||
'Zacatek': ['not-a-time'],
|
||||
'Konec': ['10:00'],
|
||||
'Program': ['Bad Time'],
|
||||
'Typ': ['LECTURE'],
|
||||
'Garant': [None],
|
||||
'Poznamka': [None]
|
||||
})
|
||||
|
||||
content = make_excel_bytes(df)
|
||||
valid, errors = scenar.read_excel(content)
|
||||
|
||||
# invalid time should produce at least one error row and valid may be empty
|
||||
assert isinstance(errors, list)
|
||||
assert len(errors) >= 1
|
||||
Reference in New Issue
Block a user