* core: channel messages (WIP) * do not include member ID when quoting channel messages * query plans * reduce duplication * refactor * refactor plan * refactor 2 * all tests * remove plan * refactor 3 * refactor 4 * refactor 5 * refactor 6 * plans * plans to imrove test coverage and fix bugs * update plan * update plan * bug fixes (wip) * new plan * fixes wip * more tests * comment, fix lint * restore comment * restore comments * rename param * move type * simplify * comment * fix stale state * refactor * less diff * simplify * less diff * refactor --------- Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com> Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com>
13 KiB
Group & Channel Feature Test Coverage Plan
Table of Contents
- Executive Summary
- Feature Coverage Matrix
- Gap Analysis by Category
- Recommended New Tests
- Implementation Roadmap
Executive Summary
Current State: The test suite in Groups.hs provides comprehensive coverage across 120+ scenarios in 14 categories. Core functionality (group CRUD, messaging, member management) is well-tested.
Key Gaps Identified:
- Business/contact card group links (untested invitation flow)
- Legacy group link auto-accept path
- Permission enforcement for
SGFFullDelete - Error recovery paths (file transfers, database busy, duplicate forwarding)
- Moderator-only scoped message delivery (
DJSMemberSupport) - Edge cases in channel message deletion
Risk Assessment:
| Priority | Gap Count | Impact |
|---|---|---|
| Critical | 3 | Production failures in business flows |
| High | 5 | Feature regressions possible |
| Medium | 4 | Edge case handling incomplete |
Recommendation: Add 12 new test scenarios in 3 phases over 2 sprints.
Feature Coverage Matrix
Legend
- ✅ Tested (comprehensive)
- ⚠️ Partial (some paths covered)
- ❌ Untested
Core Group Operations
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| Group creation | ✅ | testGroup |
Basic + edge cases |
| Group deletion | ✅ | testGroupDelete* |
Multiple scenarios |
| Group naming/description | ✅ | testUpdateGroupProfile |
|
| Group preferences | ✅ | testGroupPreferences |
Voice, files, etc. |
| Group link creation | ✅ | testGroupLink* |
|
| Group link via contact card | ❌ | - | Business links untested |
| Legacy auto-accept | ❌ | - | Deprecated path |
Message Operations
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| XMsgNew (send) | ✅ | Multiple | Core flow |
| XMsgUpdate (edit) | ✅ | testGroupMessageUpdate |
|
| XMsgDel (delete) | ✅ | testGroupMessageDelete |
|
| XMsgReact | ✅ | testGroupMsgReaction |
|
| XMsgFileDescr | ✅ | testGroupFileTransfer |
|
| Batch messages | ✅ | testBatch* |
|
| Live messages | ✅ | testGroupLiveMessage |
|
| Quote messages | ✅ | testGroup*Quote* |
|
| Duplicate forwarding | ❌ | - | De-dup logic untested |
Member Management
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| Member add | ✅ | testGroupAddMember* |
|
| Member remove | ✅ | testGroupRemoveMember* |
|
| Member roles | ✅ | testGroupMemberRole* |
|
| Member blocking | ✅ | testGroupBlock* |
|
| Member merging | ✅ | testMergeMemberContact* |
|
| Member deletion errors | ❌ | - | Error paths missing |
| Contact from member | ✅ | testCreateMemberContact* |
Moderation & Full Delete
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| Moderate message | ✅ | testGroupModerate* |
|
| Block for all | ✅ | testGroupBlockForAll* |
|
| SGFFullDelete enabled | ✅ | testFullDeleteGroup* |
|
| SGFFullDelete restricted | ❌ | - | Permission checks |
Channels & Relays
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| 1-relay delivery | ✅ | testChannel1Relay* |
|
| 2-relay delivery | ✅ | testChannel2Relay* |
|
| Owner-only sending | ✅ | testChannel*Message* |
|
| Identity protection | ✅ | testChannel*Incognito* |
|
| Channel msg delete errors | ❌ | - | Invalid state handling |
Scoped Messages (Support Chats)
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| Single moderator | ✅ | testSupportChat* |
|
| Multi moderator | ✅ | testSupportChat*Multi* |
|
| Member reports | ✅ | testReportMessage* |
|
| Forwarding in scope | ✅ | testSupportChatForward* |
|
| Stats | ✅ | testSupportChatStats |
|
| DJSMemberSupport delivery | ❌ | - | Moderator-only path |
Group Links & Invitations
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| Create/delete link | ✅ | testGroupLink* |
|
| Join via link | ✅ | testGroupLink* |
|
| Link screening | ✅ | testGroupLink*Screening* |
|
| Connection plans | ✅ | testPlanGroupLink* |
|
| Short links | ✅ | testGroupShortLink* |
|
| Business link invitation | ❌ | - | Contact card flow |
Error Handling
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| CEGroupNotJoined | ⚠️ | Implicit | Some coverage |
| CEGroupMemberNotFound | ⚠️ | Implicit | Some coverage |
| File transfer errors | ❌ | - | Recovery paths |
| Database busy | ❌ | - | Retry logic |
| Simplex link warnings | ❌ | - | Feature gate |
History & Disappearing
| Feature | Status | Test Location | Notes |
|---|---|---|---|
| History on join | ✅ | testGroupHistory* |
|
| File history | ✅ | testGroupHistoryFiles |
|
| Disappearing messages | ✅ | testGroupHistoryDisappear* |
Gap Analysis by Category
Critical Priority (Production Impact)
1. Business Group Link via Contact Card
Location: APIAddMember with InvitationContact path
Risk: Business users cannot invite via contact cards
Current State: Only InvitationMember path tested
Missing Coverage:
processGroupInvitationwithCTContactRequest- Auto-accept flow for business links
- Profile merge on business join
2. SGFFullDelete Permission Enforcement
Location: canFullDelete, checkFullDeleteAllowed
Risk: Non-admins might delete others' messages
Missing Coverage:
SGFFullDeleteset toFAAdminsrestriction- Error
CECommandErrorwhen non-admin attempts full delete - Role-based permission matrix
3. DJSMemberSupport Delivery Path
Location: deliverGroupMessages, groupMsgDeliveryJobs
Risk: Support messages not reaching moderators correctly
Missing Coverage:
DJSMemberSupportjob creation- Moderator-only broadcast logic
- Scope isolation verification
High Priority (Feature Regressions)
4. Channel Message Deletion Errors
Location: apiDeleteMemberChatItem, deleteGroupChatItemInternal
Missing Coverage:
- Delete non-existent channel message
- Delete by non-owner in channel
CEInvalidChatItemDeleteerror path
5. Member Deletion Error Paths
Location: removeMemberDeleteItem, deleteGroupChatItem
Missing Coverage:
- Delete item for already-removed member
- Concurrent deletion race condition
CEGroupMemberNotFoundspecific handling
6. File Transfer Error Recovery
Location: rcvFileError, sndFileError
Missing Coverage:
- Partial transfer resume
CEFileTransferErrorhandling- Cleanup on failed transfers
7. Legacy Group Link Auto-Accept
Location: processGroupInvitation, autoAcceptGroupLink
Risk: Breaking change for older clients
Missing Coverage:
- V1 protocol compatibility
- Auto-accept timing
8. Duplicate Message Forwarding
Location: forwardGroupMessage, checkDuplicateForward
Missing Coverage:
- Same message forwarded twice
- De-duplication by
sharedMsgId - UI state consistency
Medium Priority (Edge Cases)
9. Simplex Links Feature Warnings
Location: simplexLinkWarning, SGFSimplexLinks
Missing Coverage:
- Warning when feature disabled
- Link detection in messages
- User preference override
10. Database Busy Error Handling
Location: withTransaction, retryOnBusy
Missing Coverage:
- Concurrent group operations
- Retry exhaustion
- State consistency after retry
11. Invalid Channel/Member Scope Errors
Location: validateGroupChatScope, scopeNotAllowed
Missing Coverage:
- Member sending to wrong scope
- Scope mismatch on receive
CECommandError "scope not allowed"path
12. Contact Card Profile Merge
Location: mergeMemberContactProfile, updateContactProfile
Missing Coverage:
- Profile conflict resolution
- Image merge logic
- Display name precedence
Recommended New Tests
Phase 1: Critical (Sprint 1)
-- Test 1: Business Group Link Invitation
testBusinessGroupLinkInvitation :: HasCallStack => TestParams -> IO ()
-- Covers: InvitationContact path, CTContactRequest, auto-accept
-- Test 2: Full Delete Permission Restriction
testFullDeletePermissionRestricted :: HasCallStack => TestParams -> IO ()
-- Covers: SGFFullDelete FAAdmins, non-admin rejection, CECommandError
-- Test 3: Moderator-Only Support Delivery
testSupportChatModeratorOnlyDelivery :: HasCallStack => TestParams -> IO ()
-- Covers: DJSMemberSupport, moderator broadcast, scope isolation
Phase 2: High (Sprint 1-2)
-- Test 4: Channel Message Delete Errors
testChannelMessageDeleteErrors :: HasCallStack => TestParams -> IO ()
-- Covers: non-existent delete, non-owner delete, CEInvalidChatItemDelete
-- Test 5: Member Deletion Error Paths
testMemberDeletionErrorPaths :: HasCallStack => TestParams -> IO ()
-- Covers: removed member delete, concurrent delete, CEGroupMemberNotFound
-- Test 6: File Transfer Error Recovery
testGroupFileTransferErrorRecovery :: HasCallStack => TestParams -> IO ()
-- Covers: partial resume, CEFileTransferError, cleanup
-- Test 7: Legacy Group Link Compatibility
testLegacyGroupLinkAutoAccept :: HasCallStack => TestParams -> IO ()
-- Covers: V1 protocol, auto-accept timing
-- Test 8: Duplicate Forward Prevention
testDuplicateMessageForwardPrevention :: HasCallStack => TestParams -> IO ()
-- Covers: duplicate detection, sharedMsgId, UI consistency
Phase 3: Medium (Sprint 2)
-- Test 9: Simplex Links Feature Warning
testSimplexLinksFeatureWarning :: HasCallStack => TestParams -> IO ()
-- Covers: disabled feature warning, link detection
-- Test 10: Database Busy Retry
testGroupOperationsDatabaseBusy :: HasCallStack => TestParams -> IO ()
-- Covers: concurrent ops, retry logic, state consistency
-- Test 11: Scope Validation Errors
testGroupChatScopeValidationErrors :: HasCallStack => TestParams -> IO ()
-- Covers: wrong scope send, scope mismatch, CECommandError
-- Test 12: Contact Card Profile Merge
testMemberContactProfileMerge :: HasCallStack => TestParams -> IO ()
-- Covers: conflict resolution, image merge, name precedence
Implementation Roadmap
Sprint 1 (Week 1-2)
| Day | Task | Owner | Deliverable |
|---|---|---|---|
| 1-2 | Test 1: Business link | - | PR ready |
| 3-4 | Test 2: Full delete perms | - | PR ready |
| 5 | Test 3: Moderator delivery | - | PR ready |
| 6-7 | Test 4: Channel delete errors | - | PR ready |
| 8-9 | Test 5: Member delete errors | - | PR ready |
| 10 | Integration + Review | - | Merged |
Sprint 2 (Week 3-4)
| Day | Task | Owner | Deliverable |
|---|---|---|---|
| 1-2 | Test 6: File error recovery | - | PR ready |
| 3-4 | Test 7: Legacy link compat | - | PR ready |
| 5-6 | Test 8: Duplicate forward | - | PR ready |
| 7-8 | Tests 9-12: Medium priority | - | PR ready |
| 9-10 | Final integration + CI | - | Release |
Dependencies
Test 1 (Business Link) ─┬─> Test 12 (Profile Merge)
│
Test 3 (Moderator) ─────┴─> Test 11 (Scope Validation)
Test 4 (Channel Delete) ──> Test 5 (Member Delete)
Test 6 (File Error) ──────> (standalone)
Test 7 (Legacy Link) ─────> Test 1 (Business Link)
Test 8 (Duplicate) ───────> (standalone)
Tests 9, 10 ──────────────> (standalone)
Success Criteria
- Coverage Target: 95%+ of identified gaps covered
- CI Integration: All tests in nightly suite
- Documentation: Test rationale in docstrings
- No Regressions: Existing 120+ tests still pass
Risk Mitigation
| Risk | Mitigation |
|---|---|
| Test flakiness | Use explicit waits, avoid timing assumptions |
| Database state leaks | Ensure proper cleanup in each test |
| Protocol version issues | Test both V1 and V2 where applicable |
| CI timeout | Parallelize independent tests |
Appendix: Test File Locations
| Test Category | Primary File | Secondary |
|---|---|---|
| Group Core | tests/ChatTests/Groups.hs |
- |
| Channels | tests/ChatTests/Groups.hs |
Channels/ if split |
| Support Chats | tests/ChatTests/Groups.hs |
ScopedMessages/ if split |
| File Transfers | tests/ChatTests/Files.hs |
Groups.hs |
| Error Handling | Inline with feature tests | - |
Generated: 2026-02-06 Branch: ep/channel-messages-2 Coverage baseline: 120+ scenarios, 14 categories