PrintMaster DOCS
GitHub ↗

PrintMaster Test Coverage Analysis

Last Updated: December 27, 2025

This document provides a comprehensive analysis of test coverage across the PrintMaster codebase, identifying well-tested areas, gaps, and recommendations for improvement.


Executive Summary

ComponentTest FilesCoverage LevelPriority for Improvement
Server Storage20+⭐⭐⭐⭐⭐ ExcellentLow
Agent Scanner8⭐⭐⭐⭐ GoodMedium
Common Libraries12⭐⭐⭐⭐ GoodLow
Server API/Handlers3⭐⭐⭐ ModerateMedium
Agent Storage6⭐⭐⭐⭐ GoodLow
Reports System3⭐⭐⭐ ModerateMedium
WebSocket/Proxy2⭐⭐⭐ ModerateMedium
E2E Tests3⭐⭐ BasicHIGH
Email Templates0⭐ NoneHIGH
Spooler (Windows)0⭐ NoneHIGH
Metrics Collector0⭐ NoneHIGH
Report Scheduler0⭐ NoneHIGH
OIDC Handlers0⭐ NoneMedium
JS/Frontend14⭐⭐⭐ ModerateMedium

1. Go Unit Tests (92 test files)

1.1 Server Package (server/)

✅ Excellent Coverage

File/PackageTestsDescription
storage/*_test.go20+ filesMost comprehensive testing - Covers all CRUD operations, agents, devices, metrics, alerts, reports, users, sessions, tenants, settings, OIDC, dialects
main_test.go30+ testsHealth endpoints, auth, heartbeat, batch uploads, token handling, device proxy parsing
config_test.goMultipleConfiguration loading/parsing
websocket_test.go8+ testsWebSocket connection, heartbeat, proxy requests

Key storage tests:

  • base_store_test.go - Agent lifecycle, device lifecycle, metrics, tenants, sites, audit log
  • alerts_test.go / alerts_extended_test.go - Alert lifecycle, filters, notifications
  • reports_test.go / reports_extended_test.go - Report definitions, schedules, runs, cleanup
  • users_test.go - User CRUD, authentication, password updates
  • settings_test.go / settings_extended_test.go - Global/tenant settings, fleet policies
  • dialect_test.go - SQLite and Postgres SQL generation

⚠️ Moderate Coverage

File/PackageTestsGaps
alerts/2 filesevaluator_test.go, notifier_test.go - Good but no integration tests
reports/2 filesformatter_test.go, generator_test.go - Missing scheduler tests
releases/3 filesAPI, manager, intake worker
selfupdate/2 filesdetect, manager
settings/2 filesAPI, agent payload
tenancy/2 fileshandlers, store
authz/1 fileAuthorization logic
updatepolicy/1 fileUpdate policy API

❌ No Test Coverage

File/PackageLinesPriorityNotes
email/templates.go1153HIGHEmail generation for alerts, reports, password reset - zero tests
metrics/collector.go419HIGHServer metrics collection worker - zero tests
reports/scheduler.go409HIGHReport scheduling - zero tests
websocket.go602MediumSome coverage in websocket_test.go but many untested paths
oidc_handlers.go~300+MediumOIDC SSO handlers
tls.go~100LowTLS configuration
device_auth.go~150MediumDevice authentication
logging_helpers.go~50LowHelper functions
api_reports.go~200MediumReport API endpoints

1.2 Agent Package (agent/)

✅ Excellent Coverage

File/PackageTestsDescription
scanner/8 filesPipeline, detector, query, SNMP batch, capabilities
scanner/vendor/4 filesEpson, HP, Kyocera parsing, vendor detection
scanner/capabilities/1 fileDevice capability detection (color, mono, MFP)
storage/6 filesSQLite operations, rotation, downsampling, scan history, paths
agent/ (subpkg)5 filesRange parser, probe, parse, server client, WebSocket client

Key scanner tests:

  • pipeline_test.go - Liveness/detection pool orchestration
  • detector_test.go - Saved device bypass, SNMP detection, deep scan, enrichment
  • query_test.go - Query profiles (minimal, essential, metrics, full), vendor walks
  • vendor_test.go - Vendor detection, enterprise number extraction, supply colors
  • capabilities_test.go - 14+ tests for printer/color/mono detection, metric relevance

Key storage tests:

  • sqlite_test.go - 14+ tests for CRUD, atomic transactions, metrics rules
  • rotation_test.go - Database rotation, backup cleanup
  • scan_history_test.go - Scan history tracking, visibility filtering
  • downsample_test.go - Metrics downsampling

⚠️ Moderate Coverage

File/PackageTestsGaps
config_test.goYesBasic config loading
config_store_test.goYesConfig store operations
upload_worker_test.go2 testsOnly heartbeat settings handling tested
settings_manager_test.goYesSettings management
update_policy_test.go5 testsPolicy precedence logic
service_test.goYesService control
server_probe_test.goYesServer connectivity probing
server_config_test.goYesServer configuration
autoupdate/manager_test.goYesAuto-update manager
featureflags/1 fileFeature flag parsing
proxy/vendor_login_test.goYesVendor-specific login handling
supplies/normalize_test.goYesSupply description normalization

❌ No Test Coverage

File/PackageLinesPriorityNotes
spooler/*~200+HIGHWindows print spooler monitoring - zero tests
autoupdate_worker.go~300MediumAuto-update orchestration
spooler_worker.go~200MediumSpooler background worker
discover.go~200MediumMain discovery orchestration (tested indirectly)
main.go~800+MediumApplication bootstrap (difficult to unit test)
scanner_api.go~150LowScanner HTTP API handlers

1.3 Common Package (common/)

✅ Good Coverage

File/PackageTestsDescription
logger/logger_test.go12+ testsLog levels, context, circular buffer, file output, rate limiting, rotation, concurrency
ws/3 filesMessage serialization, hub register/unregister/broadcast, connection nil-safety
settings/types_test.go3 testsDefault settings, sanitization, schema validation
storage/types_test.go5 testsDevice/metrics JSON round-trip, field locks, filters
updatepolicy/types_test.go8 testsVersion pin, agent override, policy JSON, maintenance windows
config/config_test.goYesConfiguration parsing
snmp/oids/oids_test.go3 testsOID format validation, uniqueness, MIB prefixes
util/helpers_test.go4 testsOctet string decoding, integer coercion
util/secret_test.go2 testsEncryption round-trip, key validation

2. JavaScript Tests (14 test files)

2.1 Unit Tests (common/web/__tests__/)

Test FileCoverageDescription
formatters.test.js⭐⭐⭐Date/number formatting utilities
debounce.test.js⭐⭐⭐Debounce function
clipboard.test.js⭐⭐⭐Clipboard operations
dom-shims.test.js⭐⭐⭐DOM compatibility shims
rbac.test.js⭐⭐⭐Role-based access control
save-device.test.js⭐⭐⭐Device save operations
settings-save.test.js⭐⭐⭐Settings persistence
server/web/__tests__/login-page.test.js⭐⭐Login page functionality

2.2 Playwright E2E Tests (common/web/__tests__/playwright/)

Test FileCoverageDescription
smoke.test.js⭐⭐Toast notifications, confirm modals
login.test.js⭐⭐Login flow
sites-api.test.js⭐⭐Sites API
reports-api.test.js⭐⭐Reports API
alerting-api.test.js⭐⭐Alerting API
tenancy-tabs.test.js⭐⭐Multi-tenancy UI

3. Integration/E2E Tests (tests/)

Test FileStatusDescription
websocket_proxy_test.go⭐⭐⭐WebSocket proxy flow, unreachable targets - 432 lines
http_api_test.go⭐⭐⭐Agent registration, heartbeat - 314 lines
E2E_TESTING.md📄Strategy document (tests WIP)

Current E2E Limitations:

  • Tests use mock servers, not actual binaries
  • No real agent-server integration tests running in CI
  • Process management helpers not fully implemented

4. Critical Gaps Analysis

🔴 HIGH Priority (No Tests)

1. Email Templates (server/email/templates.go - 1153 lines)

Risk: Email rendering bugs affect user experience for alerts, reports, password resets Recommendation:

// Suggested tests:
- TestRenderAlertEmail_AllSeverities
- TestRenderReportEmail_AllFormats
- TestRenderPasswordResetEmail
- TestRenderInvitationEmail
- TestThemeVariants_DarkLightAuto
- TestEmailHTMLValidation

2. Metrics Collector (server/metrics/collector.go - 419 lines)

Risk: Fleet monitoring data could be incorrect or missing Recommendation:

// Suggested tests:
- TestCollector_FleetDataCollection
- TestCollector_AggregationCycle
- TestCollector_PruneCycle
- TestCollector_ConcurrentAccess
- TestCollector_ErrorRecovery

3. Report Scheduler (server/reports/scheduler.go - 409 lines)

Risk: Scheduled reports might not run or fail silently Recommendation:

// Suggested tests:
- TestScheduler_RunsDueReports
- TestScheduler_HandlesFailures
- TestScheduler_CalculatesNextRun
- TestScheduler_StartStop
- TestScheduler_ConcurrentSchedules

4. Windows Spooler (agent/spooler/ - ~200+ lines)

Risk: USB printer discovery broken on Windows Recommendation:

// Suggested tests (with mock Windows APIs):
- TestDiscoverLocalPrinters_Windows
- TestParsePortName
- TestClassifyPrinterType
- TestJobWatcher_Events

🟡 MEDIUM Priority

5. Upload Worker (agent/upload_worker.go)

Current: Only 2 tests for heartbeat settings Missing:

  • Device batch upload logic
  • Metrics batch upload logic
  • Retry/backoff behavior
  • Error handling paths

6. WebSocket Full Coverage (server/websocket.go - 602 lines)

Current: 8 tests cover basic flows Missing:

  • Proxy timeout handling
  • Connection loss recovery
  • Concurrent request handling
  • Agent reconnection logic

7. OIDC Handlers (server/oidc_handlers.go)

Risk: SSO authentication failures Missing:

  • OAuth flow tests
  • Token validation
  • Provider configuration
  • Session linking

5. Test Quality Observations

✅ Strengths

  1. Storage layer is exemplary - Comprehensive CRUD tests, edge cases, multiple dialects
  2. Scanner uses dependency injection - MockSNMP pattern enables thorough unit testing
  3. Table-driven tests - Many tests use idiomatic Go patterns
  4. Parallel execution - Most tests use t.Parallel() for speed
  5. In-memory databases - Storage tests use :memory: for isolation

⚠️ Areas for Improvement

  1. Missing negative tests - Many packages lack error-path testing
  2. No fuzz testing - Parser/deserializer code could benefit from fuzzing
  3. Limited concurrency tests - Race conditions not systematically tested
  4. No benchmark tests - Performance baselines not established
  5. E2E tests incomplete - tests/ directory has skeleton but not CI-integrated

6. Recommendations

Immediate Actions (Next Sprint)

  1. Add email template tests (1153 lines untested)

    • Create server/email/templates_test.go
    • Test each email type renders without error
    • Validate HTML structure
  2. Add metrics collector tests (419 lines untested)

    • Create server/metrics/collector_test.go
    • Mock store interface
    • Test collection/aggregation cycles
  3. Add report scheduler tests (409 lines untested)

    • Create server/reports/scheduler_test.go
    • Test schedule processing
    • Test failure handling

Short-term (Next Month)

  1. Expand upload worker tests

    • Add batch upload tests
    • Test retry logic
    • Test error scenarios
  2. Complete E2E test infrastructure

    • Implement process management helpers
    • Add to CI pipeline
    • Test critical paths (registration → heartbeat → upload)
  3. Add OIDC handler tests

    • Mock OAuth providers
    • Test authentication flows

Long-term (Quarterly)

  1. Add benchmark tests for performance-critical paths
  2. Add fuzz tests for parsers (SNMP, vendor-specific)
  3. Improve coverage metrics - Set up coverage reporting in CI

7. Test Commands Reference

# Run all agent tests
cd agent && go test ./... -v

# Run all server tests
cd server && go test ./... -v

# Run specific package tests
cd agent/scanner && go test -v

# Run tests with coverage
go test ./... -coverprofile=coverage.out
go tool cover -html=coverage.out

# Run short tests only (skip E2E)
go test -short ./...

# Run E2E tests
cd tests && go test -v ./...

# Run JavaScript tests
npm test

# Run Playwright E2E tests
npm run test:e2e

8. Coverage by Lines of Code (Estimated)

ComponentTotal LOCTested LOCCoverage %
Server Storage~8,000~7,500~94%
Agent Scanner~3,000~2,500~83%
Agent Storage~2,000~1,800~90%
Common Libs~2,000~1,600~80%
Server Main/API~3,000~1,500~50%
Untested Files
- email/templates1,15300%
- metrics/collector41900%
- reports/scheduler40900%
- spooler/*~40000%

Appendix: Test File Inventory

All 92 Go Test Files

Agent (33 files)

  • agent/config_store_test.go
  • agent/config_test.go
  • agent/health_test.go
  • agent/main_settings_test.go
  • agent/server_config_test.go
  • agent/server_probe_test.go
  • agent/service_test.go
  • agent/settings_manager_test.go
  • agent/update_policy_test.go
  • agent/upload_worker_test.go
  • agent/agent/parse_test.go
  • agent/agent/probe_test.go
  • agent/agent/rangeparser_test.go
  • agent/agent/server_client_test.go
  • agent/agent/snmp_performance_test.go
  • agent/agent/ws_client_test.go
  • agent/autoupdate/manager_test.go
  • agent/featureflags/featureflags_test.go
  • agent/proxy/vendor_login_test.go
  • agent/scanner/capabilities/capabilities_test.go
  • agent/scanner/detector_test.go
  • agent/scanner/pipeline_test.go
  • agent/scanner/query_test.go
  • agent/scanner/snmp_batch_test.go
  • agent/scanner/vendor/epson_remote_test.go
  • agent/scanner/vendor/epson_st2_parser_test.go
  • agent/scanner/vendor/vendor_test.go
  • agent/storage/downsample_test.go
  • agent/storage/paths_test.go
  • agent/storage/rotation_integration_test.go
  • agent/storage/rotation_test.go
  • agent/storage/scan_history_test.go
  • agent/storage/sqlite_test.go
  • agent/supplies/normalize_test.go

Server (37 files)

  • server/config_test.go
  • server/main_test.go
  • server/injection_test.go
  • server/static_test.go
  • server/testutil_test.go
  • server/websocket_test.go
  • server/auth_ratelimit_test.go
  • server/rbac_handlers_test.go
  • server/alerts/evaluator_test.go
  • server/alerts/notifier_test.go
  • server/authz/authz_test.go
  • server/internal/db/driver_test.go
  • server/logger/logger_test.go
  • server/releases/api_test.go
  • server/releases/intake_worker_test.go
  • server/releases/manager_test.go
  • server/reports/formatter_test.go
  • server/reports/generator_test.go
  • server/selfupdate/detect_test.go
  • server/selfupdate/manager_test.go
  • server/settings/agent_payload_test.go
  • server/settings/api_test.go
  • server/storage/aggregated_metrics_test.go
  • server/storage/alerts_extended_test.go
  • server/storage/alerts_test.go
  • server/storage/base_store_extended_test.go
  • server/storage/base_store_test.go
  • server/storage/dialect_extended_test.go
  • server/storage/dialect_test.go
  • server/storage/helpers_test.go
  • server/storage/oidc_test.go
  • server/storage/postgres_integration_test.go
  • server/storage/release_artifacts_test.go
  • server/storage/reports_extended_test.go
  • server/storage/reports_test.go
  • server/storage/selfupdate_runs_test.go
  • server/storage/settings_extended_test.go
  • server/storage/settings_test.go
  • server/storage/sqlite_sessions_test.go
  • server/storage/store_test.go
  • server/storage/types_test.go
  • server/storage/users_test.go
  • server/tenancy/handlers_test.go
  • server/tenancy/store_test.go
  • server/updatepolicy/api_test.go

Common (12 files)

  • common/config/config_test.go
  • common/logger/logger_test.go
  • common/settings/types_test.go
  • common/snmp/oids/oids_test.go
  • common/storage/types_test.go
  • common/updatepolicy/types_test.go
  • common/util/helpers_test.go
  • common/util/secret_test.go
  • common/ws/conn_test.go
  • common/ws/hub_test.go
  • common/ws/message_test.go

Integration/E2E (2 files)

  • tests/http_api_test.go
  • tests/websocket_proxy_test.go
All 14 JavaScript Test Files

Unit Tests

  • common/web/__tests__/clipboard.test.js
  • common/web/__tests__/debounce.test.js
  • common/web/__tests__/dom-shims.test.js
  • common/web/__tests__/formatters.test.js
  • common/web/__tests__/rbac.test.js
  • common/web/__tests__/save-device.test.js
  • common/web/__tests__/settings-save.test.js
  • server/web/__tests__/login-page.test.js

Playwright E2E Tests

  • common/web/__tests__/playwright/alerting-api.test.js
  • common/web/__tests__/playwright/login.test.js
  • common/web/__tests__/playwright/reports-api.test.js
  • common/web/__tests__/playwright/sites-api.test.js
  • common/web/__tests__/playwright/smoke.test.js
  • common/web/__tests__/playwright/tenancy-tabs.test.js