Skip to content

Commit 7472aee

Browse files
committed
Локальные тесты проходят
1 parent 1fda77c commit 7472aee

File tree

7 files changed

+60
-22
lines changed

7 files changed

+60
-22
lines changed

.vscode/tasks.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,31 @@
3232
"group": "build",
3333
"presentation": { "reveal": "always", "panel": "dedicated" },
3434
"problemMatcher": []
35+
},
36+
{
37+
"label": "Pytest (container)",
38+
"type": "shell",
39+
"command": "docker compose exec -e DATABASE_URL=postgresql+psycopg://xmlsvc:xmlsvc@postgres:5432/xmlsvc -e S3_ENDPOINT=http://minio:9000 -e S3_BUCKET=xmlsvc -e S3_ACCESS_KEY=minioadmin -e S3_SECRET_KEY=minioadmin app pytest -q",
40+
"group": "test",
41+
"presentation": { "reveal": "always", "panel": "dedicated" },
42+
"problemMatcher": []
43+
},
44+
{
45+
"label": "Pytest (host venv)",
46+
"type": "shell",
47+
"command": "pytest -q",
48+
"options": {
49+
"env": {
50+
"DATABASE_URL": "postgresql+psycopg://xmlsvc:xmlsvc@localhost:15433/xmlsvc",
51+
"S3_ENDPOINT": "http://localhost:19000",
52+
"S3_BUCKET": "xmlsvc",
53+
"S3_ACCESS_KEY": "minioadmin",
54+
"S3_SECRET_KEY": "minioadmin"
55+
}
56+
},
57+
"group": "test",
58+
"presentation": { "reveal": "always", "panel": "dedicated" },
59+
"problemMatcher": []
3560
}
3661
]
3762
}

app/db.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from sqlalchemy import create_engine
21
from sqlalchemy.orm import DeclarativeBase, sessionmaker
2+
from sqlalchemy import create_engine
33
import os
44

55
DATABASE_URL = os.getenv("DATABASE_URL", "postgresql+psycopg://xmlsvc:xmlsvc@localhost:15433/xmlsvc")

app/models_sqlalchemy.py

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,51 @@
1-
from sqlalchemy import Column, String, Integer, JSON, LargeBinary, ForeignKey, DateTime, func
2-
from sqlalchemy.orm import Mapped, mapped_column, relationship
1+
from __future__ import annotations
2+
from datetime import datetime
3+
from typing import Optional
4+
5+
from sqlalchemy import String, Integer, JSON, DateTime
6+
from sqlalchemy.orm import Mapped, mapped_column
7+
38
from app.db import Base
49

510
class DocumentRow(Base):
611
__tablename__ = "documents"
12+
713
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
814
doc_uid: Mapped[str] = mapped_column(String(64), unique=True, index=True)
915
cdm: Mapped[dict] = mapped_column(JSON)
10-
schema_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
11-
schema_version: Mapped[str | None] = mapped_column(String(32), nullable=True)
12-
created_at: Mapped = mapped_column(DateTime(timezone=True), server_default=func.now())
13-
updated_at: Mapped = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
16+
schema_id: Mapped[Optional[str]] = mapped_column(String(64), nullable=True)
17+
schema_version: Mapped[Optional[str]] = mapped_column(String(32), nullable=True)
18+
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True))
19+
updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True))
20+
1421

1522
class FileRow(Base):
1623
__tablename__ = "files"
24+
1725
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
1826
filename: Mapped[str] = mapped_column(String(255))
1927
sha256: Mapped[str] = mapped_column(String(64), index=True)
2028
size: Mapped[int] = mapped_column(Integer)
21-
mime: Mapped[str | None] = mapped_column(String(128), nullable=True)
22-
meta: Mapped[dict | None] = mapped_column(JSON, nullable=True)
23-
created_at: Mapped = mapped_column(DateTime(timezone=True), server_default=func.now())
29+
mime: Mapped[Optional[str]] = mapped_column(String(128), nullable=True)
30+
meta: Mapped[Optional[dict]] = mapped_column(JSON, nullable=True)
31+
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True))
2432

2533
class RuleRow(Base):
2634
__tablename__ = "rules"
35+
2736
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
2837
rule_id: Mapped[str] = mapped_column(String(128), unique=True, index=True)
2938
content: Mapped[dict] = mapped_column(JSON)
30-
version: Mapped[str | None] = mapped_column(String(32), nullable=True)
31-
created_at: Mapped = mapped_column(DateTime(timezone=True), server_default=func.now())
39+
version: Mapped[Optional[str]] = mapped_column(String(32), nullable=True)
40+
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True))
3241

3342
class Schema(Base):
3443
__tablename__ = "schemas"
3544

36-
id = Column(Integer, primary_key=True, index=True)
37-
name = Column(String, nullable=False)
38-
version = Column(String, nullable=True)
39-
namespace = Column(String, nullable=True)
40-
description = Column(String, nullable=True)
41-
file_path = Column(String, nullable=False)
42-
created_at = Column(DateTime, nullable=False)
45+
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
46+
name: Mapped[str] = mapped_column(String, nullable=False)
47+
version: Mapped[Optional[str]] = mapped_column(String, nullable=True)
48+
namespace: Mapped[Optional[str]] = mapped_column(String, nullable=True)
49+
description: Mapped[Optional[str]] = mapped_column(String, nullable=True)
50+
file_path: Mapped[str] = mapped_column(String, nullable=False)
51+
created_at: Mapped[datetime] = mapped_column(DateTime, nullable=False)

app/rules/example_rules.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
formula: "Project.object.volumeTotal * 0.6"
1414
- field: "Project.object.volumeBelow0"
1515
formula: "Project.object.volumeTotal - Project.object.volumeAbove0"
16-
validate:
16+
condition:
1717
- rule: "abs(Project.object.volumeAbove0 + Project.object.volumeBelow0 - Project.object.volumeTotal) <= 0.01"
1818
message: "Сумма частей должна равняться общему строительному объему"
1919
severity: "warning"

app/services/rules.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ class Rule(BaseModel):
1010
id: str
1111
when: str | None = None
1212
generate: List[Dict[str, Any]] | None = None
13-
validate: List[Dict[str, Any]] | None = None
13+
condition: List[Dict[str, Any]] | None = None
1414
severity: str | None = None
1515
version: str | None = None
1616

pytest.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[pytest]
2+
testpaths = tests
3+
pythonpath = app

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ alembic>=1.13.2
1111
psycopg[binary]>=3.1.19
1212
python-multipart>=0.0.9
1313
boto3>=1.34.0
14-
pytest
14+
httpx>=0.24
15+
pytest>=8.0

0 commit comments

Comments
 (0)