import json import time from concurrent.futures import ThreadPoolExecutor from pathlib import Path import pytest from fastapi.testclient import TestClient from sqlalchemy import select, update from app.config import settings from app.db import Job, claim, engine, sessions from app.main import app from app.storage import storage from app.worker import process KEY = 'test-api-key-' + 'x'*40 @pytest.fixture def client(tmp_path, monkeypatch): monkeypatch.setenv('STORAGE_BACKEND', 'local') monkeypatch.setenv('STORAGE_DIR', str(tmp_path)) monkeypatch.setenv('DATABASE_URL', f'sqlite:///{tmp_path}/test.db') monkeypatch.setenv('API_KEY', KEY) monkeypatch.setenv('PUBLIC_BASE_URL', 'http://testserver') monkeypatch.setenv('MAX_UPLOAD_BYTES', '1048576') settings.cache_clear(); storage.cache_clear(); sessions.cache_clear(); engine.cache_clear() with TestClient(app) as client: yield client engine().dispose() settings.cache_clear(); storage.cache_clear(); sessions.cache_clear(); engine.cache_clear() def upload(client, data, **fields): return client.post('/api/v1/schematics/render', files={'file': ('sample.SchDoc', data, 'application/octet-stream')}, data=fields, headers={'X-API-Key': KEY}) def test_private_upload_worker_viewer_and_expiry(client, ascii_schematic): response = upload(client, ascii_schematic) assert response.status_code == 202, response.text body = response.json(); id = body['id']; token = {'X-Viewer-Token': body['viewer_token']} assert len(id) == 48 and '#token=' in body['viewer_url'] base = f'/api/v1/schematics/{id}' assert client.get(base+'/status').status_code == 404 assert client.get(base+'/status',headers=token).json()['status'] == 'queued' assert client.get(base+'/data',headers=token).status_code == 409 job = claim(); assert job['id'] == id process(job) response = client.get(base+'/status',headers=token) assert response.json()['status'] == 'completed', response.text assert response.json()['compatibility'] == 'partial' data = client.get(base+'/data',headers=token).json() assert data['components'][0]['designator'] == 'R1' drawing = client.get(base+'/svg',headers=token) assert drawing.status_code == 200 and '