test(mcp): add comprehensive Quota System tests (P2-016)

Add extensive Pest tests for the MCP quota system covering:
- Usage recording and tracking (tool calls, tokens)
- Quota enforcement per tier (free, starter, pro, business, enterprise)
- Token quota enforcement independently of tool calls
- Detailed quota check responses with reasons
- Remaining quota calculation
- Quota reset and monthly period management
- Usage history retrieval
- Quota HTTP headers (X-MCP-Quota-*)
- Quota limits retrieval and caching
- CheckMcpQuota middleware (429 responses, headers injection)
- Workspace-scoped quotas (isolation, independent limits)
- McpUsageQuota model (scopes, accessors, static methods)
- Edge cases (concurrent requests, cache invalidation, month boundaries)
- Cache management (performance caching, invalidation)

Replaces basic test coverage with ~100 test cases for thorough validation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Snider 2026-01-29 19:48:21 +00:00
parent 64ce1ee324
commit 7e881f6565
2 changed files with 1401 additions and 115 deletions

16
TODO.md
View file

@ -32,13 +32,15 @@
- **Completed:** 29 January 2026
- **File:** `src/Mcp/Tests/Unit/ToolAnalyticsServiceTest.php`
- [ ] **Test Coverage: Quota System** - Test limits and enforcement
- [ ] Test McpQuotaService tier limits
- [ ] Test quota exceeded detection
- [ ] Test quota reset timing
- [ ] Test workspace-scoped quotas
- [ ] Test custom quota overrides
- **Estimated effort:** 3-4 hours
- [x] **Test Coverage: Quota System** - Test limits and enforcement
- [x] Test McpQuotaService tier limits (free, starter, pro, business, enterprise)
- [x] Test quota exceeded detection
- [x] Test quota reset timing
- [x] Test workspace-scoped quotas
- [x] Test CheckMcpQuota middleware (429 responses, headers)
- [x] Test edge cases (concurrent requests, cache invalidation, month boundaries)
- **Completed:** 29 January 2026
- **File:** `src/Mcp/Tests/Unit/McpQuotaServiceTest.php`
### Medium Priority

File diff suppressed because it is too large Load diff