tidaldb/.sdlc/features/m9-community-profile-sync/qa-plan.md

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.