Simpl-Resultat/decisions-log.md
le king fu 531624bcb4
All checks were successful
PR Check / rust (push) Successful in 25m28s
PR Check / frontend (push) Successful in 2m33s
PR Check / rust (pull_request) Successful in 25m38s
PR Check / frontend (pull_request) Successful in 2m44s
feat(prices): Rust Tauri command fetch_price + tests
- Add fetch_price command with PriceResponse and FetchPriceError types
- Privacy-strict header policy (Authorization, Accept, User-Agent only)
- Rename SIMPL_API_URL -> MAXIMUS_API_URL across src-tauri
- 7+ mockito tests covering happy path, 401/403/404/429/5xx, and header allowlist
- Fix pre-existing clippy warnings (doc_overindented_list_items, is_multiple_of)

Closes #155
2026-04-27 08:23:18 -04:00

1.9 KiB

Issue #155 — fetch_price token loading refactor (MEDIUM)

The existing license_commands.rs token loading lives in activation_path() + fs::read_to_string() spread across the file — no single public helper reads the activation token. To keep tests clean (avoid touching the file system), the implementation extracts a private fetch_price_with_token(token, symbol, date) function and a thin public fetch_price wrapper that reads the activation token from disk and delegates. Tests call the inner function directly, injecting a fake token string. This avoids the need for a temp file setup in every test, keeps the coupling minimal, and matches the existing pattern used in validate_with_key (pure inner fn + thin Tauri command wrapper).

Issue #155 — FetchPriceError serialization format (MEDIUM)

The Result<PriceResponse, String> boundary requires serializing FetchPriceError to a String. Chosen: serde_json::to_string(&err).unwrap_or("{\"code\":\"internal\"}".to_string()). This gives the JS layer a stable JSON string it can JSON.parse() to read the code field and the optional retry_after_s. The serde tag #[serde(tag = "code", rename_all = "snake_case")] produces {"code":"auth"}, {"code":"rate_limit","retry_after_s":42} etc. — clean and consistent with the spec's error.code shape.

Issue #155 — MAXIMUS_API_URL env var in tests (MEDIUM)

std::env::set_var is deprecated as unsafe in Rust 1.81+ due to multi-threading concerns. However, the tests use #[tokio::test] (each runs in isolation) and the set_var call happens before any HTTP client is built, so the race window is practically zero. The alternative mockito::Server::new_async() returns a URL we need to inject; the simplest approach is env var override. We use unsafe { std::env::set_var(...) } with an explicit comment explaining the safety rationale. This matches common practice in Rust integration tests with mockito.