- sql_executor: remplace le filtre regex fragile par une autorisation SQLite (set_authorizer) en complément de mode=ro ; rejette les instructions multiples - uploads: lecture bornée des PDF (helper read_upload_limited, limite 20 Mo, HTTP 413) branchée sur /extract et /save-with-pdf - tests: suite pytest (54 tests) couvrant amounts, dates, storage, sql_executor, uploads et DatabaseService.save_document ; pytest ajouté en dépendance dev Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
"""Tests des helpers de stockage (chemins, sanitisation)."""
|
|
|
|
from datetime import date
|
|
|
|
import pytest
|
|
|
|
from plesna_gerance.database.storage import (
|
|
extract_street_letter,
|
|
sanitize_filename,
|
|
compute_document_paths,
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"adresse,expected",
|
|
[
|
|
("4 RUE SERVIENT", "S"),
|
|
("33 RUE MARC BLOCH", "M"),
|
|
("12 AVENUE JEAN JAURES", "J"),
|
|
("1 BOULEVARD GAMBETTA", "G"),
|
|
(None, "X"),
|
|
("", "X"),
|
|
("42", "X"), # que des chiffres -> rien d'alpha
|
|
],
|
|
)
|
|
def test_extract_street_letter(adresse, expected):
|
|
assert extract_street_letter(adresse) == expected
|
|
|
|
|
|
def test_sanitize_filename_removes_problematic_chars():
|
|
assert sanitize_filename('a/b:c*d?"e') == "a_b_c_d__e"
|
|
|
|
|
|
def test_sanitize_filename_strips_dots_and_spaces():
|
|
assert sanitize_filename(" .nom. ") == "nom"
|
|
|
|
|
|
def test_compute_document_paths():
|
|
pdf, json_p = compute_document_paths(
|
|
reference="REF-01234",
|
|
doc_date=date(2024, 1, 15),
|
|
immeuble_adresse="4 RUE SERVIENT",
|
|
)
|
|
assert pdf == "2024/S_REF-01234_2024-01-15.pdf"
|
|
assert json_p == "2024/S_REF-01234_2024-01-15.json"
|
|
|
|
|
|
def test_compute_document_paths_unknown_address():
|
|
pdf, _ = compute_document_paths("R1", date(2023, 7, 9), None)
|
|
assert pdf == "2023/X_R1_2023-07-09.pdf"
|