docs(15-02): complete PermissionConsolidator unit tests plan
- 9 tests pass covering RPT-04-a through RPT-04-i - Full solution builds with 0 errors, 321 tests pass - STATE.md updated, ROADMAP.md phase 15 marked Complete
This commit is contained in:
@@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
### v2.3 Tenant Management & Report Enhancements (Phases 15-19)
|
### v2.3 Tenant Management & Report Enhancements (Phases 15-19)
|
||||||
|
|
||||||
- [ ] **Phase 15: Consolidation Data Model** (2 plans) — PermissionConsolidator service and merged-row model; zero API calls, pure data shapes
|
- [x] **Phase 15: Consolidation Data Model** (2 plans) — PermissionConsolidator service and merged-row model; zero API calls, pure data shapes (completed 2026-04-09)
|
||||||
- [ ] **Phase 16: Report Consolidation Toggle** — Export settings toggle wired to PermissionConsolidator; first user-visible consolidation behavior
|
- [ ] **Phase 16: Report Consolidation Toggle** — Export settings toggle wired to PermissionConsolidator; first user-visible consolidation behavior
|
||||||
- [ ] **Phase 17: Group Expansion in HTML Reports** — Clickable group expansion in HTML exports with transitive membership resolution
|
- [ ] **Phase 17: Group Expansion in HTML Reports** — Clickable group expansion in HTML exports with transitive membership resolution
|
||||||
- [ ] **Phase 18: Auto-Take Ownership** — Global toggle and automatic site collection admin elevation on access denied
|
- [ ] **Phase 18: Auto-Take Ownership** — Global toggle and automatic site collection admin elevation on access denied
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
2. A `PermissionConsolidator` service accepts a flat list of permission rows and returns a consolidated list where duplicate user+level rows are merged
|
2. A `PermissionConsolidator` service accepts a flat list of permission rows and returns a consolidated list where duplicate user+level rows are merged
|
||||||
3. Consolidation logic has unit test coverage — a known 10-row input with 3 duplicate pairs produces the expected 7-row output
|
3. Consolidation logic has unit test coverage — a known 10-row input with 3 duplicate pairs produces the expected 7-row output
|
||||||
4. Existing HTML export services compile and produce identical output when consolidation is not applied (opt-in, defaults off)
|
4. Existing HTML export services compile and produce identical output when consolidation is not applied (opt-in, defaults off)
|
||||||
**Plans:** 1/2 plans executed
|
**Plans:** 2/2 plans complete
|
||||||
Plans:
|
Plans:
|
||||||
- [ ] 15-01-PLAN.md — Models (LocationInfo, ConsolidatedPermissionEntry) + PermissionConsolidator service
|
- [ ] 15-01-PLAN.md — Models (LocationInfo, ConsolidatedPermissionEntry) + PermissionConsolidator service
|
||||||
- [ ] 15-02-PLAN.md — Unit tests (10 test cases) + full solution build verification
|
- [ ] 15-02-PLAN.md — Unit tests (10 test cases) + full solution build verification
|
||||||
@@ -117,7 +117,7 @@ Plans:
|
|||||||
| 1-5 | v1.0 | 36/36 | Shipped | 2026-04-07 |
|
| 1-5 | v1.0 | 36/36 | Shipped | 2026-04-07 |
|
||||||
| 6-9 | v1.1 | 25/25 | Shipped | 2026-04-08 |
|
| 6-9 | v1.1 | 25/25 | Shipped | 2026-04-08 |
|
||||||
| 10-14 | v2.2 | 14/14 | Shipped | 2026-04-09 |
|
| 10-14 | v2.2 | 14/14 | Shipped | 2026-04-09 |
|
||||||
| 15. Consolidation Data Model | 1/2 | In Progress| | — |
|
| 15. Consolidation Data Model | 2/2 | Complete | 2026-04-09 | — |
|
||||||
| 16. Report Consolidation Toggle | v2.3 | 0/? | Not started | — |
|
| 16. Report Consolidation Toggle | v2.3 | 0/? | Not started | — |
|
||||||
| 17. Group Expansion in HTML Reports | v2.3 | 0/? | Not started | — |
|
| 17. Group Expansion in HTML Reports | v2.3 | 0/? | Not started | — |
|
||||||
| 18. Auto-Take Ownership | v2.3 | 0/? | Not started | — |
|
| 18. Auto-Take Ownership | v2.3 | 0/? | Not started | — |
|
||||||
|
|||||||
@@ -3,14 +3,14 @@ gsd_state_version: 1.0
|
|||||||
milestone: v2.3
|
milestone: v2.3
|
||||||
milestone_name: Tenant Management & Report Enhancements
|
milestone_name: Tenant Management & Report Enhancements
|
||||||
status: planning
|
status: planning
|
||||||
stopped_at: Completed 15-01-PLAN.md
|
stopped_at: Completed 15-02-PLAN.md
|
||||||
last_updated: "2026-04-09T09:42:37.151Z"
|
last_updated: "2026-04-09T09:46:35.245Z"
|
||||||
last_activity: 2026-04-09 — Roadmap created for v2.3 (phases 15-19)
|
last_activity: 2026-04-09 — Roadmap created for v2.3 (phases 15-19)
|
||||||
progress:
|
progress:
|
||||||
total_phases: 5
|
total_phases: 5
|
||||||
completed_phases: 0
|
completed_phases: 1
|
||||||
total_plans: 2
|
total_plans: 2
|
||||||
completed_plans: 1
|
completed_plans: 2
|
||||||
---
|
---
|
||||||
|
|
||||||
# Project State
|
# Project State
|
||||||
@@ -63,6 +63,7 @@ Decisions are logged in PROJECT.md Key Decisions table.
|
|||||||
- App registration must be atomic with rollback; partial Entra state is worse than no state
|
- App registration must be atomic with rollback; partial Entra state is worse than no state
|
||||||
- [Phase 15]: MakeKey declared internal for test access via InternalsVisibleTo without exposing as public API
|
- [Phase 15]: MakeKey declared internal for test access via InternalsVisibleTo without exposing as public API
|
||||||
- [Phase 15]: LINQ GroupBy+Select for consolidation merge instead of mutable dictionary — consistent with functional codebase style
|
- [Phase 15]: LINQ GroupBy+Select for consolidation merge instead of mutable dictionary — consistent with functional codebase style
|
||||||
|
- [Phase 15-consolidation-data-model]: RPT-04-g test data uses 11 rows (not 10) to produce 7 consolidated rows — plan description had a counting error; 4 unique rows + 3 merged groups = 7
|
||||||
|
|
||||||
### Pending Todos
|
### Pending Todos
|
||||||
|
|
||||||
@@ -74,7 +75,7 @@ None.
|
|||||||
|
|
||||||
## Session Continuity
|
## Session Continuity
|
||||||
|
|
||||||
Last session: 2026-04-09T09:42:37.149Z
|
Last session: 2026-04-09T09:46:35.243Z
|
||||||
Stopped at: Completed 15-01-PLAN.md
|
Stopped at: Completed 15-02-PLAN.md
|
||||||
Resume file: None
|
Resume file: None
|
||||||
Next step: `/gsd:plan-phase 15`
|
Next step: `/gsd:plan-phase 15`
|
||||||
|
|||||||
116
.planning/phases/15-consolidation-data-model/15-02-SUMMARY.md
Normal file
116
.planning/phases/15-consolidation-data-model/15-02-SUMMARY.md
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
---
|
||||||
|
phase: 15-consolidation-data-model
|
||||||
|
plan: "02"
|
||||||
|
subsystem: testing
|
||||||
|
tags: [csharp, xunit, unit-tests, permission-consolidation, tdd]
|
||||||
|
|
||||||
|
requires:
|
||||||
|
- phase: 15-01
|
||||||
|
provides: PermissionConsolidator.Consolidate, PermissionConsolidator.MakeKey (internal), UserAccessEntry, LocationInfo, ConsolidatedPermissionEntry
|
||||||
|
|
||||||
|
provides:
|
||||||
|
- PermissionConsolidatorTests with 9 [Fact] test methods covering RPT-04-a through RPT-04-i
|
||||||
|
- Validated MakeKey pipe-delimited lowercase format
|
||||||
|
- Validated 11-row / 3-merge-group / 7-row consolidation scenario
|
||||||
|
|
||||||
|
affects: [16-report-consolidation-toggle]
|
||||||
|
|
||||||
|
tech-stack:
|
||||||
|
added: []
|
||||||
|
patterns:
|
||||||
|
- "Private MakeEntry factory method for zero-boilerplate UserAccessEntry construction in tests"
|
||||||
|
- "Assert.Single(collection) preferred over Assert.Equal(1, collection.Count) per xUnit2013"
|
||||||
|
|
||||||
|
key-files:
|
||||||
|
created:
|
||||||
|
- SharepointToolbox.Tests/Helpers/PermissionConsolidatorTests.cs
|
||||||
|
modified: []
|
||||||
|
|
||||||
|
key-decisions:
|
||||||
|
- "Test data for RPT-04-g required 11 rows (not 10) to produce 7 output rows: 3 merge groups (alice-Contribute x3, bob x2, carol x2) + 4 unique rows = 7; plan description counted incorrectly"
|
||||||
|
|
||||||
|
patterns-established:
|
||||||
|
- "MakeEntry factory pattern: named optional parameters with sensible defaults, single return statement"
|
||||||
|
|
||||||
|
requirements-completed: [RPT-04]
|
||||||
|
|
||||||
|
duration: 2min
|
||||||
|
completed: "2026-04-09"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Phase 15 Plan 02: PermissionConsolidator Unit Tests Summary
|
||||||
|
|
||||||
|
**9 xUnit [Fact] tests covering all RPT-04 consolidation behaviors — empty input, single entry, multi-site merge, key separation, case-insensitive grouping, MakeKey format, 7-row scenario, LocationCount, and flag preservation**
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
|
||||||
|
- **Duration:** ~2 min
|
||||||
|
- **Started:** 2026-04-09T09:43:47Z
|
||||||
|
- **Completed:** 2026-04-09T09:45:46Z
|
||||||
|
- **Tasks:** 2
|
||||||
|
- **Files modified:** 1
|
||||||
|
|
||||||
|
## Accomplishments
|
||||||
|
|
||||||
|
- All 9 test cases (RPT-04-a through RPT-04-i) pass against the PermissionConsolidator built in Plan 01
|
||||||
|
- Full solution build succeeds with 0 errors, 0 warnings after xUnit2013 lint fix
|
||||||
|
- All 321 tests (295 passed + 26 skipped) pass — no regressions in existing code
|
||||||
|
- MakeKey internal accessor verified reachable via InternalsVisibleTo configured in AssemblyInfo.cs
|
||||||
|
|
||||||
|
## Task Commits
|
||||||
|
|
||||||
|
Each task was committed atomically:
|
||||||
|
|
||||||
|
1. **Task 1: Create PermissionConsolidatorTests with all 9 test cases** - `7b9f3e1` (test)
|
||||||
|
2. **Task 2: Verify full solution build** - no commit needed (verification only, no files changed)
|
||||||
|
|
||||||
|
## Files Created/Modified
|
||||||
|
|
||||||
|
- `SharepointToolbox.Tests/Helpers/PermissionConsolidatorTests.cs` - 9 [Fact] test methods covering all RPT-04 requirements, with private MakeEntry factory helper to reduce boilerplate
|
||||||
|
|
||||||
|
## Decisions Made
|
||||||
|
|
||||||
|
- Test data for RPT-04-g was adjusted from 10 to 11 input rows: plan commentary said "10-row input / 3 duplicate pairs / 7 rows" but the math (3+2+2+1+1+1=10, 3 groups+3 unique=6 output) produced 6, not 7. Added a 4th unique entry (frank@contoso.com) to correctly produce 7 consolidated rows as the requirement states.
|
||||||
|
|
||||||
|
## Deviations from Plan
|
||||||
|
|
||||||
|
### Auto-fixed Issues
|
||||||
|
|
||||||
|
**1. [Rule 1 - Bug] Corrected RPT-04-g test data count to produce 7 output rows**
|
||||||
|
- **Found during:** Task 1 (test execution)
|
||||||
|
- **Issue:** Plan description said "10-row input with 3 duplicate pairs produces 7 rows" but with 10 inputs as described only 6 groups were produced. Plan counting error: 3+2+2+1+1+1=10 rows but only 3+3=6 groups.
|
||||||
|
- **Fix:** Added a 4th unique entry (frank@contoso.com / Contribute / Group / "SharePoint Group: Members") making 11 rows total with 3 merged groups + 4 unique = 7 consolidated rows
|
||||||
|
- **Files modified:** SharepointToolbox.Tests/Helpers/PermissionConsolidatorTests.cs
|
||||||
|
- **Verification:** `Assert.Equal(7, result.Count)` passes
|
||||||
|
- **Committed in:** `7b9f3e1` (Task 1 commit)
|
||||||
|
|
||||||
|
**2. [Rule 2 - Missing Critical] Fixed xUnit2013 lint warning — replaced Assert.Equal(1, ...) with Assert.Single**
|
||||||
|
- **Found during:** Task 1 (test run output showed xUnit2013 warning)
|
||||||
|
- **Issue:** `Assert.Equal(1, result[0].Locations.Count)` triggers xUnit analyzer warning xUnit2013
|
||||||
|
- **Fix:** Rewrote to `var row = Assert.Single(result); Assert.Single(row.Locations);`
|
||||||
|
- **Files modified:** SharepointToolbox.Tests/Helpers/PermissionConsolidatorTests.cs
|
||||||
|
- **Verification:** Build output shows 0 warnings
|
||||||
|
- **Committed in:** `7b9f3e1` (Task 1 commit, fixed before final commit)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Total deviations:** 2 auto-fixed (1 bug in test data, 1 missing best practice)
|
||||||
|
**Impact on plan:** Both fixes essential for test correctness and clean build. No scope creep.
|
||||||
|
|
||||||
|
## Issues Encountered
|
||||||
|
|
||||||
|
None beyond the test data count deviation documented above.
|
||||||
|
|
||||||
|
## User Setup Required
|
||||||
|
|
||||||
|
None - no external service configuration required.
|
||||||
|
|
||||||
|
## Next Phase Readiness
|
||||||
|
|
||||||
|
- Phase 16 (Report Consolidation Toggle) can wire `PermissionConsolidator.Consolidate` into the export pipeline with confidence — all edge cases are now tested and verified
|
||||||
|
- RPT-04 requirement is fully satisfied: implementation (Plan 01) + tests (Plan 02) both complete
|
||||||
|
- `InternalsVisibleTo("SharepointToolbox.Tests")` confirmed working for MakeKey access
|
||||||
|
|
||||||
|
---
|
||||||
|
*Phase: 15-consolidation-data-model*
|
||||||
|
*Completed: 2026-04-09*
|
||||||
Reference in New Issue
Block a user