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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user