Skip to content

Code Coverage & Testing Report ​

Date: 2026-06-29 (coverage re-measured on staging) Version: v1.1.0-beta (staging)

Test Suite Summary ​

SuiteTestsAssertionsStatusCommand
PHPUnit (backend + security + multi-claim regression)164332All passingphp artisan test
Vitest (frontend components)40-All passingnpm test
Dusk (E2E browser)2036All passingphp artisan dusk
k6 (load/stress)3 scripts-All profiles pass./tests/load/run-loadtests.sh
Total224+368+All passing

Changes since 2026-04-07 report:

  • +7 tests in ClaimMultiUseTest (multi-claim regression suite ported from staging hotfix)
  • +4 tests in SecurityTest (cross-user authorization gaps: code create, refund, check-claims, API token revoke)

PHP Code Coverage (PCOV) ​

Overall: 67.3% (CI threshold: 50%)

Controllers ​

ClassCoverageNotes
CampaignController61.8%Campaign CRUD, check claims, refund, QR download
CodeController55.8%Claim logic heavily branched; needs more test paths
PhyrhoseProxyController100.0%All 5 proxy endpoints covered
ProfileController77.8%Profile CRUD, token management
JobsController0.0%Minimal controller, dispatches jobs
Controller (base)100.0%-

Middleware ​

ClassCoverage
CheckProxyQuota100.0%
HandleInertiaRequests100.0%
LogProxyUsage100.0%
SecurityHeaders85.7%

Models ​

ClassCoverageNotes
Campaign86.7%Includes status accessor
Code100.0%-
Claim50.0%Relationship and accessor methods
Reward100.0%-
Wallet10.5%Balance queries use external APIs
User0.0%Laravel default, relationships only
ProxyUsage0.0%Simple model, created via middleware

Jobs ​

ClassCoverage
ProcessClaims92.0%
CheckClaims72.7%
ProcessUploadedCodes81.8%
CreateCampaignBucket69.2%
ManuallyProcessClaims0.0%

Services ​

ClassCoverage
NullBackend100.0%
ProxyBackend100.0%
PhyrhoseBackend57.7%

Other ​

ClassCoverageNotes
TransactionBackend (contract)100.0%-
ClaimException100.0%-
CardanoAddress (rule)53.3%-
AppServiceProvider80.4%-
CampaignPolicy62.5%-
UserPolicy0.0%Added post-report; not yet exercised
LoginRequest65.2%-
ProfileUpdateRequest100.0%-
TokenCollection (resource)57.1%Added post-report; API token listing
ProvisionOrphanedCampaigns (cmd)0.0%Added post-report; ops command, no test

Excluded from Coverage ​

The following are excluded from coverage metrics (unchanged Laravel/Breeze boilerplate):

  • app/Http/Controllers/Auth/*: Breeze auth controllers
  • app/Providers/BroadcastServiceProvider.php: unused default provider

Frontend Coverage (Vitest) ​

40 tests across 4 files

Test FileTestsWhat's Covered
Dashboard.test.js10Campaign list, empty state, create dialog, delete confirm, status badges, column headers
Welcome.test.js11Landing page, auth states, TEST MODE banner, beta banner, dark mode, footer links
CampaignCreate.test.js8Form fields, network options, default values, validation errors
CampaignShow.test.js11Campaign details, wallet address, claim URL, provisioning, backend mismatch, data table

Test environment: jsdom with real Vuetify rendering. Only MeshJS (WASM) and Inertia navigation are mocked.

E2E Browser Coverage (Laravel Dusk) ​

20 tests across 5 files, running against the Docker stack with Selenium Chrome.

Test FileTestsWhat's Covered
AuthTest.php5Login page, login flow, wrong password, logout, auth redirect
CampaignTest.php6Empty dashboard, create campaign, view details, delete, stats, cross-user 403
ClaimFlowTest.php4Codes table display, claim URL, API validation (missing code, invalid address)
ProfileTest.php4Profile page, user email, delete section, API tokens section
RegistrationTest.php1Registration page loads

Runs in CI: Yes, parallel job gating both staging and production deploys.

API Endpoint Coverage Matrix ​

EndpointMethodAuthPHPUnitDuskk6
GET /GETNoFeature--
GET /loginGETNoAuthAuthDashboard
POST /loginPOSTNoAuthAuthDashboard
POST /logoutPOSTYesAuthAuth-
GET /registerGETNoAuthReg-
POST /registerPOSTNoAuth--
GET /dashboardGETYesFeatureCampaignDashboard
GET /profileGETYesProfileProfile-
PATCH /profilePATCHYesProfile--
DELETE /profileDELETEYesProfile--
POST /profile/tokensPOSTYesProfile--
GET /campaignsGETYesCampaign--
POST /campaignsPOSTYesCampaignCampaign-
GET /campaigns/{id}GETYesCampaignCampaignDashboard
PUT /campaigns/{id}PUTYesCampaign--
DELETE /campaigns/{id}DELETEYesCampaignCampaign-
POST /campaigns/{id}/check-claimsPOSTYesCampaign--
POST /campaigns/{id}/refundPOSTYesCampaign--
GET /campaigns/{id}/download-qrGETYesQrDownload--
POST /codesPOSTYesCode, Bulk--
POST /api/claim/v1/{campaign}POSTNoClaimApi, SecurityClaimFlowClaim
POST /api/v1/proxy/bucketPOSTSanctumProxy, Security-Proxy
POST /api/v1/proxy/paymentPOSTSanctumProxy-Proxy
GET /api/v1/proxy/status/{id}GETSanctumProxy-Proxy
POST /api/v1/proxy/refundPOSTSanctumProxy--
GET /api/v1/proxy/balanceGETSanctumProxy, Security-Proxy

Coverage: 26/26 endpoints have at least one test. The claim API endpoint has the highest coverage (PHPUnit + Security + Dusk + k6).

Improvement Targets (M3) ​

AreaCurrentTargetIssue
PHP overall coverage67.3%70%#7
CodeController coverage55.8%60%+#7
Vitest coverage reportingNot configured60% threshold#8
Dusk code creation testsNot coveredCovered#9

Released under the Apache License 2.0.