наблюдаемость: ввести безопасный контракт метрик
CI / Rust Checks (pull_request) Successful in 6m15s
CI / UI Checks (pull_request) Successful in 5s
CI / Community Image Smoke (pull_request) Successful in 4m25s
CI / Frontend E2E (pull_request) Successful in 5m17s
CI / Deploy (pull_request) Has been skipped
CI / Rust Checks (push) Successful in 6m9s
CI / UI Checks (push) Successful in 5s
CI / Community Image Smoke (push) Successful in 1m3s
CI / Frontend E2E (push) Successful in 3m47s
CI / Deploy (push) Failing after 3s
CI / Rust Checks (pull_request) Successful in 6m15s
CI / UI Checks (pull_request) Successful in 5s
CI / Community Image Smoke (pull_request) Successful in 4m25s
CI / Frontend E2E (pull_request) Successful in 5m17s
CI / Deploy (pull_request) Has been skipped
CI / Rust Checks (push) Successful in 6m9s
CI / UI Checks (push) Successful in 5s
CI / Community Image Smoke (push) Successful in 1m3s
CI / Frontend E2E (push) Successful in 3m47s
CI / Deploy (push) Failing after 3s
This commit is contained in:
@@ -27,6 +27,10 @@ def package(root: Path, name: str, rel_dir: str, dependencies: list[str] | None
|
||||
}
|
||||
|
||||
|
||||
def dependency(name: str, kind: str | None = None) -> dict:
|
||||
return {"name": name, "kind": kind}
|
||||
|
||||
|
||||
def metadata(packages: list[dict], root: Path | None = None) -> dict:
|
||||
root = root or Path("/tmp/crank")
|
||||
return {
|
||||
@@ -124,6 +128,44 @@ class RustBoundaryCheckTests(unittest.TestCase):
|
||||
self.assertEqual(violations[0].source, "crank-observability")
|
||||
self.assertEqual(violations[0].dependency, dependency)
|
||||
|
||||
def test_allows_observability_and_product_crates_to_depend_on_metrics_contract(self) -> None:
|
||||
packages = [
|
||||
package(
|
||||
self.root,
|
||||
"crank-observability",
|
||||
"crates/crank-observability",
|
||||
["crank-metrics"],
|
||||
),
|
||||
package(
|
||||
self.root,
|
||||
"crank-runtime",
|
||||
"crates/crank-runtime",
|
||||
["crank-metrics"],
|
||||
),
|
||||
package(self.root, "crank-metrics", "crates/crank-metrics"),
|
||||
]
|
||||
|
||||
violations = self.checker.find_violations(metadata(packages, self.root))
|
||||
|
||||
self.assertEqual(violations, [])
|
||||
|
||||
def test_rejects_metrics_contract_dependency_on_workspace_crates(self) -> None:
|
||||
packages = [
|
||||
package(
|
||||
self.root,
|
||||
"crank-metrics",
|
||||
"crates/crank-metrics",
|
||||
["crank-core"],
|
||||
),
|
||||
package(self.root, "crank-core", "crates/crank-core"),
|
||||
]
|
||||
|
||||
violations = self.checker.find_violations(metadata(packages, self.root))
|
||||
|
||||
self.assertEqual(len(violations), 1)
|
||||
self.assertEqual(violations[0].source, "crank-metrics")
|
||||
self.assertEqual(violations[0].dependency, "crank-core")
|
||||
|
||||
def test_rejects_domain_and_runtime_dependencies_on_observability(self) -> None:
|
||||
for source in ("crank-core", "crank-registry", "crank-runtime"):
|
||||
packages = [
|
||||
@@ -146,6 +188,23 @@ class RustBoundaryCheckTests(unittest.TestCase):
|
||||
self.assertEqual(violations[0].source, source)
|
||||
self.assertEqual(violations[0].dependency, "crank-observability")
|
||||
|
||||
def test_rejects_direct_production_metrics_dependency_outside_contract(self) -> None:
|
||||
app = package(self.root, "admin-api", "apps/admin-api")
|
||||
app["dependencies"] = [dependency("metrics")]
|
||||
|
||||
violations = self.checker.find_violations(metadata([app], self.root))
|
||||
|
||||
self.assertEqual(len(violations), 1)
|
||||
self.assertEqual(violations[0].dependency, "metrics")
|
||||
|
||||
def test_allows_metrics_as_test_only_dependency(self) -> None:
|
||||
app = package(self.root, "admin-api", "apps/admin-api")
|
||||
app["dependencies"] = [dependency("metrics", "dev")]
|
||||
|
||||
violations = self.checker.find_violations(metadata([app], self.root))
|
||||
|
||||
self.assertEqual(violations, [])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user