feat(04-02): add script download API endpoints and router registration

- imptune/api/scripts.py: GET /printers/{id}/scripts/{install,uninstall,detect}
- 404 for missing printer, 422 for missing driver/INF/driver_desc
- Content-Disposition attachment header on all responses
- imptune/main.py: register scripts.router
- 5 integration tests covering all endpoint cases (200/404/422)
This commit is contained in:
2026-04-10 13:36:07 +02:00
parent 6bff8f3c0c
commit b7b0d1b4a5
3 changed files with 173 additions and 1 deletions
+77
View File
@@ -3,6 +3,30 @@ import pytest
from imptune.generators.script_generator import render_detect, render_install, render_uninstall
def _create_test_driver_and_printer():
"""Helper: create a Driver + Printer for integration tests."""
from imptune.db.models import Driver, Printer
driver = Driver.create(
sha256="abc123",
original_filename="test.zip",
size_bytes=100,
driver_desc='["Test Driver"]',
inf_filename="test.inf",
)
printer = Printer.create(
name="Test Printer",
ip_address="10.0.0.1",
port_name="IP_10.0.0.1",
driver=driver,
duplex_mode="LongEdge",
color_mode=True,
paper_size="A4",
collate=True,
)
return driver, printer
SAMPLE_ARGS = dict(
printer_name="HP LaserJet 4000",
ip_address="192.168.1.10",
@@ -118,3 +142,56 @@ def test_render_detect():
assert "Write-Output" in result
assert "exit 0" in result
assert "exit 1" in result
# ---------------------------------------------------------------------------
# Integration tests — script API endpoints
# ---------------------------------------------------------------------------
def test_install_endpoint(client):
"""GET /printers/{id}/scripts/install returns 200 with pnputil in content."""
_driver, printer = _create_test_driver_and_printer()
response = client.get(f"/printers/{printer.id}/scripts/install")
assert response.status_code == 200
assert "pnputil" in response.text
def test_uninstall_endpoint(client):
"""GET /printers/{id}/scripts/uninstall returns 200 with Remove-Printer in content."""
_driver, printer = _create_test_driver_and_printer()
response = client.get(f"/printers/{printer.id}/scripts/uninstall")
assert response.status_code == 200
assert "Remove-Printer" in response.text
def test_detect_endpoint(client):
"""GET /printers/{id}/scripts/detect returns 200 with Write-Output in content."""
_driver, printer = _create_test_driver_and_printer()
response = client.get(f"/printers/{printer.id}/scripts/detect")
assert response.status_code == 200
assert "Write-Output" in response.text
def test_script_endpoint_missing_printer(client):
"""GET /printers/{id}/scripts/install returns 404 for nonexistent printer."""
response = client.get("/printers/9999/scripts/install")
assert response.status_code == 404
def test_script_endpoint_no_driver(client):
"""GET /printers/{id}/scripts/install returns 422 when no driver assigned."""
from imptune.db.models import Printer
printer = Printer.create(
name="No Driver Printer",
ip_address="10.0.0.2",
port_name="IP_10.0.0.2",
driver=None,
duplex_mode="OneSided",
color_mode=True,
paper_size="A4",
collate=True,
)
response = client.get(f"/printers/{printer.id}/scripts/install")
assert response.status_code == 422