Complete name-first 1C adapter saved-state support
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[2]
|
||||
sys.path.insert(0, str(ROOT / "plugins" / "1c"))
|
||||
sys.path.insert(0, str(ROOT / "plugins" / "1c" / "connector"))
|
||||
|
||||
import adapter_1c_server # noqa: E402
|
||||
|
||||
|
||||
class FakeCursor:
|
||||
def __init__(self) -> None:
|
||||
self.rows = []
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, *_args):
|
||||
return False
|
||||
|
||||
def execute(self, query, _params=None) -> None:
|
||||
if "FROM dbo.[Params]" in query:
|
||||
self.rows = [
|
||||
{"FileName": "a.ui", "PartNo": 0, "BinaryData": b"one"},
|
||||
{"FileName": "a.ui", "PartNo": 1, "BinaryData": b"two"},
|
||||
{"FileName": "b.si", "PartNo": 0, "BinaryData": b"three"},
|
||||
]
|
||||
else:
|
||||
self.rows = []
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.rows)
|
||||
|
||||
def fetchall(self):
|
||||
return list(self.rows)
|
||||
|
||||
|
||||
class FakeConnection:
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, *_args):
|
||||
return False
|
||||
|
||||
def cursor(self, as_dict=False):
|
||||
assert as_dict is True
|
||||
return FakeCursor()
|
||||
|
||||
|
||||
def test_repository_sql_state_snapshot_hashes_parts_without_payload(monkeypatch) -> None:
|
||||
monkeypatch.setattr(
|
||||
adapter_1c_server,
|
||||
"connect_live_sql",
|
||||
lambda base_id, method, timeout_seconds=120: (FakeConnection(), {"database": "db"}, None),
|
||||
)
|
||||
result = adapter_1c_server.repository_sql_state_snapshot(
|
||||
{"base_id": "base", "tables": ["Params"], "include_extensions": False, "diagnostic": True}
|
||||
)
|
||||
assert result["status"] == "ok"
|
||||
assert result["counts"] == {"records": 2, "extensions": 0}
|
||||
first = result["records"][0]
|
||||
assert first["file_name"] == "a.ui"
|
||||
assert first["part_count"] == 2
|
||||
assert first["bytes"] == 6
|
||||
assert "payload" not in first
|
||||
assert result["diagnostics"]["payload_returned"] is False
|
||||
token_diff = adapter_1c_server.repository_sql_state_diff(
|
||||
{
|
||||
"before_token": result["comparison_token"],
|
||||
"after_token": result["comparison_token"],
|
||||
"diagnostic": True,
|
||||
}
|
||||
)
|
||||
assert token_diff["status"] == "ok"
|
||||
assert token_diff["changed"] is False
|
||||
|
||||
|
||||
def test_repository_sql_state_diff_reports_changed_part() -> None:
|
||||
before = {
|
||||
"schema": "onec_repository_sql_state_snapshot.v1",
|
||||
"base_id": "base",
|
||||
"snapshot_id": "before",
|
||||
"records": [
|
||||
{
|
||||
"table": "Params",
|
||||
"file_name": "a.ui",
|
||||
"bytes": 3,
|
||||
"sha1": "old",
|
||||
"part_count": 1,
|
||||
"parts": [{"part_no": 0, "bytes": 3, "sha1": "old"}],
|
||||
}
|
||||
],
|
||||
"extensions": [],
|
||||
}
|
||||
after = {
|
||||
**before,
|
||||
"snapshot_id": "after",
|
||||
"records": [
|
||||
{
|
||||
"table": "Params",
|
||||
"file_name": "a.ui",
|
||||
"bytes": 4,
|
||||
"sha1": "new",
|
||||
"part_count": 1,
|
||||
"parts": [{"part_no": 0, "bytes": 4, "sha1": "new"}],
|
||||
}
|
||||
],
|
||||
}
|
||||
result = adapter_1c_server.repository_sql_state_diff(
|
||||
{"before": before, "after": after, "diagnostic": True}
|
||||
)
|
||||
assert result["status"] == "ok"
|
||||
assert result["changed"] is True
|
||||
assert result["counts"] == {"added": 0, "removed": 0, "modified": 1}
|
||||
assert result["modified"][0]["key"] == "storage:Params:a.ui"
|
||||
assert result["modified"][0]["changed_parts"] == ["0"]
|
||||
Reference in New Issue
Block a user