This is an automated email from the ASF dual-hosted git repository.

imbajin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hugegraph-ai.git


The following commit(s) were added to refs/heads/main by this push:
     new 6272a22f refactor(client): pin 1.7.0 shape with deterministic 
structural assertions (#342)
6272a22f is described below

commit 6272a22fa1996561161b0931536b7cd3c2b7a247
Author: Muawiya Amir <[email protected]>
AuthorDate: Mon Jun 8 09:36:27 2026 +0500

    refactor(client): pin 1.7.0 shape with deterministic structural assertions 
(#342)
    
    Replaces the loose assertGreater(len(...), 1) check in test_metric.py with 
deterministic structural assertions based on the actual /metrics/backend 
response captured from a real HugeGraph server.
---
 .../src/tests/api/test_metric.py                   | 96 ++++++++++++++++++++--
 1 file changed, 89 insertions(+), 7 deletions(-)

diff --git a/hugegraph-python-client/src/tests/api/test_metric.py 
b/hugegraph-python-client/src/tests/api/test_metric.py
index 4970152d..d62b42d0 100644
--- a/hugegraph-python-client/src/tests/api/test_metric.py
+++ b/hugegraph-python-client/src/tests/api/test_metric.py
@@ -23,6 +23,41 @@ from ..client_utils import ClientUtils
 
 pytestmark = [pytest.mark.integration, pytest.mark.hugegraph]
 
+# Expected server-entry keys for RocksDB backend
+# Captured from a real HugeGraph 1.7.0 server response at /metrics/backend
+EXPECTED_ROCKSDB_SERVER_KEYS = {
+    "mem_unit",
+    "disk_unit",
+    "mem_used",
+    "mem_used_readable",
+    "disk_usage",
+    "disk_usage_readable",
+    "block_cache_usage",
+    "block_cache_pinned_usage",
+    "block_cache_capacity",
+    "estimate_table_readers_mem",
+    "size_all_mem_tables",
+    "cur_size_all_mem_tables",
+    "estimate_live_data_size",
+    "total_sst_files_size",
+    "live_sst_files_size",
+    "estimate_pending_compaction_bytes",
+    "estimate_num_keys",
+    "num_entries_active_mem_table",
+    "num_entries_imm_mem_tables",
+    "num_deletes_active_mem_table",
+    "num_deletes_imm_mem_tables",
+    "num_running_flushes",
+    "mem_table_flush_pending",
+    "num_running_compactions",
+    "compaction_pending",
+    "num_immutable_mem_table",
+    "num_snapshots",
+    "oldest_snapshot_time",
+    "num_live_versions",
+    "current_super_version_number",
+}
+
 
 class TestMetricsManager(unittest.TestCase):
     client = None
@@ -74,10 +109,57 @@ class TestMetricsManager(unittest.TestCase):
         self.assertIsInstance(statistics, dict)
 
         backend_metrics = self.metrics.get_backend_metrics()
-        # In HugeGraph 1.7.0+, the backend_metrics structure changed
-        # It's still a dict, but the "hugegraph" key may not exist in the same 
format
-        self.assertIsInstance(backend_metrics, dict)
-        self.assertTrue(backend_metrics, "backend metrics should not be empty")
-        # Only assert on the "hugegraph" key if it exists (for backward 
compatibility)
-        if "hugegraph" in backend_metrics:
-            self.assertGreater(len(backend_metrics["hugegraph"]), 1)
+
+        # HugeGraph 1.7.0 backend_metrics shape (top-level key may be 
"<cluster>-<graph>"):
+        # { "<cluster>-<graph>": { "backend": str, "nodes": int, "cluster_id": 
str,
+        #                          "servers": { "<server_name>": { <metrics> } 
} } }
+        self.assertIsInstance(backend_metrics, dict, "backend_metrics should 
be a dict")
+        self.assertTrue(backend_metrics, "backend_metrics should not be empty")
+
+        # Select the graph entry deterministically using the configured graph 
name
+        graph_name = self.client.GRAPH
+        graph_key = next(
+            (k for k in backend_metrics if k == graph_name or 
k.endswith(f"-{graph_name}")),
+            None,
+        )
+        self.assertIsNotNone(
+            graph_key,
+            f"Expected a key matching '{graph_name}' in backend_metrics, got: 
{list(backend_metrics.keys())}",
+        )
+
+        graph_entry = backend_metrics[graph_key]
+        self.assertIsInstance(graph_entry, dict)
+
+        # Assert required top-level fields in graph entry (backend-agnostic 
contract)
+        self.assertIn("backend", graph_entry, "Missing 'backend' field")
+        self.assertIn("nodes", graph_entry, "Missing 'nodes' field")
+        self.assertIn("cluster_id", graph_entry, "Missing 'cluster_id' field")
+        self.assertIn("servers", graph_entry, "Missing 'servers' field")
+        self.assertIsInstance(graph_entry["backend"], str)
+        self.assertIsInstance(graph_entry["nodes"], int)
+        self.assertIsInstance(graph_entry["cluster_id"], str)
+        self.assertIsInstance(graph_entry["servers"], dict)
+
+        # Assert every server entry — branch by backend type for portability
+        servers = graph_entry["servers"]
+        self.assertTrue(servers, "servers should not be empty")
+        backend_type = graph_entry["backend"]
+        for server_name, server_entry in servers.items():
+            self.assertIsInstance(
+                server_entry,
+                dict,
+                f"backend_metrics server entry for {server_name} should be a 
dict",
+            )
+            if backend_type == "rocksdb":
+                # Pin RocksDB-specific keys captured from HugeGraph 1.7.0
+                missing_keys = EXPECTED_ROCKSDB_SERVER_KEYS - 
set(server_entry.keys())
+                self.assertFalse(
+                    missing_keys,
+                    f"rocksdb server entry for {server_name} missing expected 
keys: {sorted(missing_keys)}",
+                )
+            else:
+                # Backend-agnostic: assert non-empty dict only
+                self.assertTrue(
+                    server_entry,
+                    f"server entry for {server_name} should not be empty",
+                )

Reply via email to