51 lines
2.5 KiB
Markdown
51 lines
2.5 KiB
Markdown
# QA Plan: Community Profile Sync
|
|
|
|
## Scope
|
|
|
|
Validate that opt-in community membership is correctly persisted, rebuilt on restart, and that signal forwarding routes events to community aggregates without affecting the primary signal write path.
|
|
|
|
---
|
|
|
|
## Test Suite
|
|
|
|
### Unit Tests (lib)
|
|
|
|
| Module | Test | Validates |
|
|
|--------|------|-----------|
|
|
| `entities/community.rs` | `add_and_get` | `add()` inserts; `get()` returns sorted list |
|
|
| `entities/community.rs` | `add_idempotent` | Adding same community twice yields one entry |
|
|
| `entities/community.rs` | `contains_present_and_absent` | `contains()` returns true/false correctly |
|
|
| `entities/community.rs` | `get_unknown_user_empty` | Returns empty vec for user with no memberships |
|
|
| `entities/community.rs` | `entry_count_multiple` | Counts (user, community) pairs correctly |
|
|
| `storage/keys.rs` | `tag_byte_never_zero` | CommunityMembership byte != 0x00 |
|
|
| `storage/keys.rs` | `all_tags_have_unique_bytes` | No tag byte collision |
|
|
| `storage/keys.rs` | `tag_roundtrip_all_variants` | CommunityMembership roundtrips |
|
|
|
|
### Integration Tests (`tidal/tests/m9_community_sync.rs`)
|
|
|
|
| Test | Input | Expected |
|
|
|------|-------|----------|
|
|
| `join_and_query_membership` | `join_community(1, "jazz")` | `is_community_member == true`; `get_community_memberships == ["jazz"]` |
|
|
| `signal_routes_to_community_aggregate` | Member writes signal | Community aggregate shows count=1 |
|
|
| `nonmember_signal_not_forwarded` | Non-member writes signal | Community aggregate shows count=0 |
|
|
| `multiple_communities_independent` | User in 2 communities, one signal | Both aggregates show count=1 |
|
|
| `membership_persists_across_restart` | Close + reopen | Memberships restored from storage |
|
|
| `join_idempotent` | Join twice | One membership in result |
|
|
| `invalid_community_name_empty` | Empty name | `TidalError::InvalidInput` |
|
|
| `invalid_community_name_too_long` | 65-char name | `TidalError::InvalidInput` |
|
|
| `forwarding_does_not_block_primary_write` | Signal write with community member | Base ledger updated regardless |
|
|
| `community_aggregate_windowed_count` | 3 signals from member | Count=3 in community aggregate |
|
|
|
|
---
|
|
|
|
## Execution
|
|
|
|
```bash
|
|
cargo test --manifest-path tidal/Cargo.toml --lib
|
|
cargo test --manifest-path tidal/Cargo.toml --test m9_community_sync
|
|
cargo clippy --manifest-path tidal/Cargo.toml --lib -- -D warnings
|
|
cargo fmt --manifest-path tidal/Cargo.toml -- --check
|
|
```
|
|
|
|
**Pass criteria:** All 10 integration tests pass. All lib tests pass. Clippy clean. Fmt clean.
|