Data Correctness Framework + Testing
## Data Correctness Framework + Tests End-to-end validation that the query engine returns correct results for every query shape. This covers a purpose-built test harness that seeds a known dataset into ClickHouse, runs queries through the full compilation and execution pipeline, and asserts on row-level correctness including sort order, redaction, pagination, and aggregation. ### Framework and harness | Status | Label | MR | Description | |--------|-------|----|-------------| | [x] | Harness | !522 | feat(testing): add data correctness harness + data integration tests | | [x] | Assertions | !527 | feat(testing): enforce assertion usage via query introspection in data correctness harness | | [x] | Hardening | !535 | chore(testing): harden assertion enforcement | | [x] | Cleanup | !537 | chore(cleanup): continue hardening data correctness harness + remove cruft | ### Seed data | Status | Label | MR | Description | |--------|-------|----|-------------| | [x] | Seed data | !539 | chore(testing): extend seed data with subgroups, notes, unicode user, and new edges | ### Test suites | Status | Label | MR | Description | |--------|-------|----|-------------| | [x] | Search | !540 | chore(testing): add search tests for contains, is_null, ordering, redaction, and unicode | | [x] | Pagination | !541 | chore(testing): add pagination, limit, empty result, and combined feature tests | | [x] | Aggregation | !542 | chore(testing): add aggregation sort, sum, and redaction tests | | [x] | Path finding | !543 | chore(testing): add path finding max_depth and redaction tests | | [x] | Traversal | !544 | chore(testing): add traversal order_by, variable-length, incoming, and filter tests | | [x] | Neighbors | !545 | chore(testing): add neighbors mixed entity types and redaction tests | | [x] | Edge cases | !546 | chore(testing): add edge case tests for giant strings, sql injection, and empty results | ### Correctness fixes found through testing | Status | Label | MR | Description | |--------|-------|----|-------------| | [x] | Fix | !526 | fix(querying): graph formatter removes node sort order with hashmap - use indexmap instead | | [x] | Fix | !574 | fix(data): enforce assert_node_count on all search/traversal/neighbors tests | | [x] | Fix | !576 | fix(tests): assert edge set instead of discarding in traversal_with_order_by + harden MustInspect | ### Additional coverage | Status | Label | MR | Description | |--------|-------|----|-------------| | [x] | Search | !577 | Unicode properties, wildcard/boolean/datetime/nullable columns, node ID filtering, order_by, empty auth returning zero nodes, exact redaction, contains and is_null filter operators | | [x] | Traversal | !577 | Variable-length hops with min/max bounds, redaction at depth, incoming and bidirectional directions, shared-node deduplication, filter narrowing, fan-in from multiple source types | | [x] | Aggregation | !577 | Sum, avg, min, max, min on strings, multiple functions in one query, redacted users excluded from counts | | [x] | Path finding | !577 | all_shortest and any path types, rel_types filtering, redaction blocking intermediate nodes, max_depth enforcement | | [x] | Neighbors | !577 | Mixed entity types on a single center node, dynamic_columns wildcard, rel_types filtering, redaction, edge direction preserved for both-direction queries | | [x] | Edge cases | !577 | Giant strings (10k chars), SQL injection payloads stored as data, empty results with valid schema |
issue