Files
Charon/backend/test-output.txt
T
GitHub Actions edeaacbfaa fix(docs): correct typo in remaining contract tasks documentation
fix(scripts): enhance test coverage script with verbose output and race detection
2025-12-03 13:46:13 +00:00

2894 lines
201 KiB
Plaintext

# github.com/Wikid82/charon/backend/cmd/seed
go: no such tool "covdata"
# github.com/Wikid82/charon/backend/cmd/api
go: no such tool "covdata"
# github.com/Wikid82/charon/backend/internal/logger
go: no such tool "covdata"
# github.com/Wikid82/charon/backend/internal/metrics
go: no such tool "covdata"
# github.com/Wikid82/charon/backend/internal/util
go: no such tool "covdata"
=== RUN TestAccessListHandler_Create
=== RUN TestAccessListHandler_Create/create_whitelist_successfully
=== RUN TestAccessListHandler_Create/create_geo_whitelist_successfully
=== RUN TestAccessListHandler_Create/create_local_network_only
=== RUN TestAccessListHandler_Create/fail_with_invalid_type
=== RUN TestAccessListHandler_Create/fail_with_missing_name
--- PASS: TestAccessListHandler_Create (0.02s)
--- PASS: TestAccessListHandler_Create/create_whitelist_successfully (0.00s)
--- PASS: TestAccessListHandler_Create/create_geo_whitelist_successfully (0.00s)
--- PASS: TestAccessListHandler_Create/create_local_network_only (0.00s)
--- PASS: TestAccessListHandler_Create/fail_with_invalid_type (0.00s)
--- PASS: TestAccessListHandler_Create/fail_with_missing_name (0.00s)
=== RUN TestAccessListHandler_List
--- PASS: TestAccessListHandler_List (0.01s)
=== RUN TestAccessListHandler_Get
=== RUN TestAccessListHandler_Get/get_existing_ACL
=== RUN TestAccessListHandler_Get/get_non-existent_ACL
2025/12/03 13:11:12 /projects/Charon/backend/internal/services/access_list_service.go:91 record not found
[0.141ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListHandler_Get (0.01s)
--- PASS: TestAccessListHandler_Get/get_existing_ACL (0.00s)
--- PASS: TestAccessListHandler_Get/get_non-existent_ACL (0.00s)
=== RUN TestAccessListHandler_Update
=== RUN TestAccessListHandler_Update/update_successfully
=== RUN TestAccessListHandler_Update/update_non-existent_ACL
2025/12/03 13:11:12 /projects/Charon/backend/internal/services/access_list_service.go:91 record not found
[0.092ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListHandler_Update (0.02s)
--- PASS: TestAccessListHandler_Update/update_successfully (0.00s)
--- PASS: TestAccessListHandler_Update/update_non-existent_ACL (0.00s)
=== RUN TestAccessListHandler_Delete
=== RUN TestAccessListHandler_Delete/delete_successfully
=== RUN TestAccessListHandler_Delete/fail_to_delete_ACL_in_use
=== RUN TestAccessListHandler_Delete/delete_non-existent_ACL
--- PASS: TestAccessListHandler_Delete (0.02s)
--- PASS: TestAccessListHandler_Delete/delete_successfully (0.00s)
--- PASS: TestAccessListHandler_Delete/fail_to_delete_ACL_in_use (0.00s)
--- PASS: TestAccessListHandler_Delete/delete_non-existent_ACL (0.00s)
=== RUN TestAccessListHandler_TestIP
=== RUN TestAccessListHandler_TestIP/test_IP_in_whitelist
=== RUN TestAccessListHandler_TestIP/test_IP_not_in_whitelist
=== RUN TestAccessListHandler_TestIP/test_invalid_IP
=== RUN TestAccessListHandler_TestIP/test_non-existent_ACL
2025/12/03 13:11:12 /projects/Charon/backend/internal/services/access_list_service.go:91 record not found
[0.066ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListHandler_TestIP (0.02s)
--- PASS: TestAccessListHandler_TestIP/test_IP_in_whitelist (0.00s)
--- PASS: TestAccessListHandler_TestIP/test_IP_not_in_whitelist (0.00s)
--- PASS: TestAccessListHandler_TestIP/test_invalid_IP (0.00s)
--- PASS: TestAccessListHandler_TestIP/test_non-existent_ACL (0.00s)
=== RUN TestAccessListHandler_GetTemplates
--- PASS: TestAccessListHandler_GetTemplates (0.01s)
=== RUN TestAuthHandler_Login
--- PASS: TestAuthHandler_Login (1.58s)
=== RUN TestAuthHandler_Login_Errors
2025/12/03 13:11:14 /projects/Charon/backend/internal/services/auth_service.go:64 record not found
[0.115ms] [rows:0] SELECT * FROM `users` WHERE email = "nonexistent@example.com" ORDER BY `users`.`id` LIMIT 1
--- PASS: TestAuthHandler_Login_Errors (0.00s)
=== RUN TestAuthHandler_Register
--- PASS: TestAuthHandler_Register (0.73s)
=== RUN TestAuthHandler_Register_Duplicate
2025/12/03 13:11:15 /projects/Charon/backend/internal/services/auth_service.go:54 UNIQUE constraint failed: users.email
[0.461ms] [rows:0] INSERT INTO `users` (`uuid`,`email`,`api_key`,`password_hash`,`name`,`role`,`enabled`,`failed_login_attempts`,`locked_until`,`last_login`,`created_at`,`updated_at`) VALUES ("27721601-d22b-41ba-ac32-c75bd4e19167","dup@example.com","35bc31ae-2a31-41dd-a77c-d0438d9123ac","$2a$10$rUH.kxnabdTR3J4AxZDGtuwN6V7WJS1ULEJv1XhrGdTphQWv.sTHy","Dup User","user",true,0,NULL,NULL,"2025-12-03 13:11:14.837","2025-12-03 13:11:14.837") RETURNING `id`
--- PASS: TestAuthHandler_Register_Duplicate (0.75s)
=== RUN TestAuthHandler_Logout
--- PASS: TestAuthHandler_Logout (0.01s)
=== RUN TestAuthHandler_Me
--- PASS: TestAuthHandler_Me (0.00s)
=== RUN TestAuthHandler_Me_NotFound
2025/12/03 13:11:15 /projects/Charon/backend/internal/services/auth_service.go:147 record not found
[0.246ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestAuthHandler_Me_NotFound (0.01s)
=== RUN TestAuthHandler_ChangePassword
--- PASS: TestAuthHandler_ChangePassword (3.16s)
=== RUN TestAuthHandler_ChangePassword_WrongOld
--- PASS: TestAuthHandler_ChangePassword_WrongOld (1.65s)
=== RUN TestAuthHandler_ChangePassword_Errors
--- PASS: TestAuthHandler_ChangePassword_Errors (0.00s)
=== RUN TestBackupHandlerSanitizesFilename
--- PASS: TestBackupHandlerSanitizesFilename (0.00s)
=== RUN TestBackupLifecycle
--- PASS: TestBackupLifecycle (0.02s)
=== RUN TestBackupHandler_Errors
--- PASS: TestBackupHandler_Errors (0.00s)
=== RUN TestBackupHandler_List_Success
--- PASS: TestBackupHandler_List_Success (0.01s)
=== RUN TestBackupHandler_Create_Success
--- PASS: TestBackupHandler_Create_Success (0.00s)
=== RUN TestBackupHandler_Download_Success
--- PASS: TestBackupHandler_Download_Success (0.00s)
=== RUN TestBackupHandler_PathTraversal
--- PASS: TestBackupHandler_PathTraversal (0.00s)
=== RUN TestBackupHandler_Download_InvalidPath
--- PASS: TestBackupHandler_Download_InvalidPath (0.00s)
=== RUN TestBackupHandler_Create_ServiceError
--- PASS: TestBackupHandler_Create_ServiceError (0.00s)
=== RUN TestBackupHandler_Delete_InternalError
--- PASS: TestBackupHandler_Delete_InternalError (0.00s)
=== RUN TestBackupHandler_Restore_InternalError
--- PASS: TestBackupHandler_Restore_InternalError (0.01s)
=== RUN TestDeleteCertificate_InUse
--- PASS: TestDeleteCertificate_InUse (0.01s)
=== RUN TestDeleteCertificate_CreatesBackup
2025/12/03 13:11:20 /projects/Charon/backend/internal/api/handlers/certificate_handler_test.go:123 record not found
[0.056ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE `ssl_certificates`.`id` = 1 ORDER BY `ssl_certificates`.`id` LIMIT 1
--- PASS: TestDeleteCertificate_CreatesBackup (0.02s)
=== RUN TestDeleteCertificate_BackupFailure
--- PASS: TestDeleteCertificate_BackupFailure (0.01s)
=== RUN TestDeleteCertificate_InUse_NoBackup
--- PASS: TestDeleteCertificate_InUse_NoBackup (0.01s)
=== RUN TestCertificateHandler_List
--- PASS: TestCertificateHandler_List (0.02s)
=== RUN TestCertificateHandler_Upload_MissingName
--- PASS: TestCertificateHandler_Upload_MissingName (0.01s)
=== RUN TestCertificateHandler_Upload_MissingCertFile
--- PASS: TestCertificateHandler_Upload_MissingCertFile (0.01s)
=== RUN TestCertificateHandler_Upload_MissingKeyFile
--- PASS: TestCertificateHandler_Upload_MissingKeyFile (0.01s)
=== RUN TestCertificateHandler_Upload_Success
--- PASS: TestCertificateHandler_Upload_Success (0.24s)
=== RUN TestBackupHandlerQuick
--- PASS: TestBackupHandlerQuick (0.00s)
=== RUN TestDefaultCrowdsecExecutorPidFile
--- PASS: TestDefaultCrowdsecExecutorPidFile (0.00s)
=== RUN TestDefaultCrowdsecExecutorStartStatusStop
--- PASS: TestDefaultCrowdsecExecutorStartStatusStop (0.20s)
=== RUN TestCrowdsecEndpoints
--- PASS: TestCrowdsecEndpoints (0.00s)
=== RUN TestImportConfig
--- PASS: TestImportConfig (0.00s)
=== RUN TestImportCreatesBackup
--- PASS: TestImportCreatesBackup (0.00s)
=== RUN TestExportConfig
--- PASS: TestExportConfig (0.01s)
=== RUN TestListAndReadFile
--- PASS: TestListAndReadFile (0.00s)
=== RUN TestWriteFileCreatesBackup
--- PASS: TestWriteFileCreatesBackup (0.00s)
=== RUN TestDockerHandler_ListContainers
--- PASS: TestDockerHandler_ListContainers (0.02s)
=== RUN TestDockerHandler_ListContainers_NonExistentServerID
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.073ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestDockerHandler_ListContainers_NonExistentServerID (0.00s)
=== RUN TestDockerHandler_ListContainers_WithServerID
--- PASS: TestDockerHandler_ListContainers_WithServerID (0.01s)
=== RUN TestDockerHandler_ListContainers_WithHostQuery
--- PASS: TestDockerHandler_ListContainers_WithHostQuery (0.01s)
=== RUN TestDockerHandler_RegisterRoutes
--- PASS: TestDockerHandler_RegisterRoutes (0.01s)
=== RUN TestDockerHandler_NewDockerHandler
--- PASS: TestDockerHandler_NewDockerHandler (0.00s)
=== RUN TestDomainLifecycle
--- PASS: TestDomainLifecycle (0.01s)
=== RUN TestDomainErrors
--- PASS: TestDomainErrors (0.01s)
=== RUN TestDomainDelete_NotFound
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/domain_handler.go:73 record not found
[0.119ms] [rows:0] SELECT * FROM `domains` WHERE uuid = "nonexistent-uuid" AND `domains`.`deleted_at` IS NULL ORDER BY `domains`.`id` LIMIT 1
--- PASS: TestDomainDelete_NotFound (0.01s)
=== RUN TestDomainCreate_Duplicate
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/domain_handler.go:49 UNIQUE constraint failed: domains.name
[0.236ms] [rows:0] INSERT INTO `domains` (`uuid`,`name`,`created_at`,`updated_at`,`deleted_at`) VALUES ("b22b6427-d89f-4dda-966f-4cd0b0431515","duplicate.com","2025-12-03 13:11:21.1","2025-12-03 13:11:21.1",NULL) RETURNING `id`
--- PASS: TestDomainCreate_Duplicate (0.01s)
=== RUN TestDomainList_Empty
--- PASS: TestDomainList_Empty (0.00s)
=== RUN TestDomainCreate_LongName
--- PASS: TestDomainCreate_LongName (0.01s)
=== RUN TestFeatureFlags_GetAndUpdate
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 record not found
[0.072ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.global.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 record not found
[0.101ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 record not found
[0.084ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 record not found
[0.075ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.notifications.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 record not found
[0.105ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.docker.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlags_GetAndUpdate (0.00s)
=== RUN TestFeatureFlags_EnvFallback
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 no such table: settings
[1.312ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.global.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 no such table: settings
[0.059ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 no such table: settings
[0.058ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 no such table: settings
[0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.notifications.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:41 no such table: settings
[0.050ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.docker.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlags_EnvFallback (0.00s)
=== RUN TestHealthHandler
--- PASS: TestHealthHandler (0.00s)
=== RUN TestIsSafePathUnderBase
--- PASS: TestIsSafePathUnderBase (0.00s)
=== RUN TestImportUploadSanitizesFilename
--- PASS: TestImportUploadSanitizesFilename (0.00s)
=== RUN TestLogsLifecycle
--- PASS: TestLogsLifecycle (0.00s)
=== RUN TestLogsHandler_PathTraversal
--- PASS: TestLogsHandler_PathTraversal (0.00s)
=== RUN TestNotificationTemplateHandler_CRUDAndPreview
--- PASS: TestNotificationTemplateHandler_CRUDAndPreview (0.01s)
=== RUN TestNotificationTemplateHandler_Create_InvalidJSON
--- PASS: TestNotificationTemplateHandler_Create_InvalidJSON (0.00s)
=== RUN TestNotificationTemplateHandler_Update_InvalidJSON
--- PASS: TestNotificationTemplateHandler_Update_InvalidJSON (0.00s)
=== RUN TestNotificationTemplateHandler_Preview_InvalidJSON
--- PASS: TestNotificationTemplateHandler_Preview_InvalidJSON (0.00s)
=== RUN TestProxyHostLifecycle
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/proxyhost_service.go:111 record not found
[0.061ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "234adb38-e057-4603-ac03-8c550280e89d" ORDER BY `proxy_hosts`.`id` LIMIT 1
--- PASS: TestProxyHostLifecycle (0.01s)
=== RUN TestProxyHostDelete_WithUptimeCleanup
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/notification_service.go:81 no such table: notification_providers
[2.280ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true
2025/12/03 13:11:21 /projects/Charon/backend/internal/api/handlers/proxy_host_handler_test.go:141 record not found
[0.110ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "ph-delete-1" ORDER BY `proxy_hosts`.`id` LIMIT 1
--- PASS: TestProxyHostDelete_WithUptimeCleanup (0.02s)
=== RUN TestProxyHostErrors
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.097ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.050ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.053ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.078ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[2.832ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[1.187ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[1.223ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/proxyhost_service.go:111 record not found
[0.137ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/proxyhost_service.go:111 record not found
[0.095ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.109ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.083ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.078ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.078ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.057ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.044ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.046ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/proxyhost_service.go:111 record not found
[0.092ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.088ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.069ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.068ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.091ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.049ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.032ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.041ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestProxyHostErrors (0.04s)
=== RUN TestProxyHostValidation
--- PASS: TestProxyHostValidation (0.01s)
=== RUN TestProxyHostCreate_AdvancedConfig_InvalidJSON
--- PASS: TestProxyHostCreate_AdvancedConfig_InvalidJSON (0.01s)
=== RUN TestProxyHostCreate_AdvancedConfig_Normalization
--- PASS: TestProxyHostCreate_AdvancedConfig_Normalization (0.02s)
=== RUN TestProxyHostUpdate_CertificateID_Null
--- PASS: TestProxyHostUpdate_CertificateID_Null (0.01s)
=== RUN TestProxyHostConnection
--- PASS: TestProxyHostConnection (0.01s)
=== RUN TestProxyHostHandler_List_Error
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/proxyhost_service.go:120 sql: database is closed
[0.023ms] [rows:0] SELECT * FROM `proxy_hosts` ORDER BY updated_at desc
--- PASS: TestProxyHostHandler_List_Error (0.01s)
=== RUN TestProxyHostWithCaddyIntegration
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.091ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.082ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.073ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.074ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[1.034ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.914ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[2.777ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/notification_service.go:81 no such table: notification_providers
[1.321ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.065ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.070ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.061ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.060ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.060ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.050ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.031ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.070ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.080ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.051ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.080ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.036ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.020ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:21 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.021ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/notification_service.go:81 no such table: notification_providers
[0.045ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true
--- PASS: TestProxyHostWithCaddyIntegration (0.03s)
=== RUN TestProxyHostHandler_BulkUpdateACL_Success
--- PASS: TestProxyHostHandler_BulkUpdateACL_Success (0.01s)
=== RUN TestProxyHostHandler_BulkUpdateACL_RemoveACL
--- PASS: TestProxyHostHandler_BulkUpdateACL_RemoveACL (0.01s)
=== RUN TestProxyHostHandler_BulkUpdateACL_PartialFailure
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/proxyhost_service.go:111 record not found
[0.081ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "9f316f2c-7793-4805-bb02-66dd5c5a647b" ORDER BY `proxy_hosts`.`id` LIMIT 1
--- PASS: TestProxyHostHandler_BulkUpdateACL_PartialFailure (0.01s)
=== RUN TestProxyHostHandler_BulkUpdateACL_EmptyUUIDs
--- PASS: TestProxyHostHandler_BulkUpdateACL_EmptyUUIDs (0.01s)
=== RUN TestProxyHostHandler_BulkUpdateACL_InvalidJSON
--- PASS: TestProxyHostHandler_BulkUpdateACL_InvalidJSON (0.01s)
=== RUN TestProxyHostUpdate_AdvancedConfig_ClearAndBackup
--- PASS: TestProxyHostUpdate_AdvancedConfig_ClearAndBackup (0.01s)
=== RUN TestProxyHostUpdate_AdvancedConfig_InvalidJSON
--- PASS: TestProxyHostUpdate_AdvancedConfig_InvalidJSON (0.01s)
=== RUN TestProxyHostUpdate_SetCertificateID
--- PASS: TestProxyHostUpdate_SetCertificateID (0.01s)
=== RUN TestProxyHostUpdate_AdvancedConfig_SetBackup
--- PASS: TestProxyHostUpdate_AdvancedConfig_SetBackup (0.01s)
=== RUN TestProxyHostUpdate_ForwardPort_StringValue
--- PASS: TestProxyHostUpdate_ForwardPort_StringValue (0.01s)
=== RUN TestProxyHostUpdate_Locations_InvalidPayload
--- PASS: TestProxyHostUpdate_Locations_InvalidPayload (0.01s)
=== RUN TestProxyHostUpdate_SetBooleansAndApplication
--- PASS: TestProxyHostUpdate_SetBooleansAndApplication (0.01s)
=== RUN TestProxyHostUpdate_Locations_Replace
--- PASS: TestProxyHostUpdate_Locations_Replace (0.01s)
=== RUN TestProxyHostCreate_WithCertificateAndLocations
--- PASS: TestProxyHostCreate_WithCertificateAndLocations (0.01s)
=== RUN TestSanitizeForLog
--- PASS: TestSanitizeForLog (0.00s)
=== RUN TestSecurityHandler_GetConfigAndUpdateConfig
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.081ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:21 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.098ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GetConfigAndUpdateConfig (0.01s)
=== RUN TestSecurityHandler_GetStatus_Clean
--- PASS: TestSecurityHandler_GetStatus_Clean (0.00s)
=== RUN TestSecurityHandler_Cerberus_DBOverride
--- PASS: TestSecurityHandler_Cerberus_DBOverride (0.00s)
=== RUN TestSecurityHandler_ACL_DBOverride
--- PASS: TestSecurityHandler_ACL_DBOverride (0.00s)
=== RUN TestSecurityHandler_GenerateBreakGlass_ReturnsToken
2025/12/03 13:11:22 /projects/Charon/backend/internal/services/security_service.go:113 record not found
[0.213ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GenerateBreakGlass_ReturnsToken (0.73s)
=== RUN TestSecurityHandler_ACL_DisabledWhenCerberusOff
--- PASS: TestSecurityHandler_ACL_DisabledWhenCerberusOff (0.01s)
=== RUN TestSecurityHandler_CrowdSec_Mode_DBOverride
--- PASS: TestSecurityHandler_CrowdSec_Mode_DBOverride (0.00s)
=== RUN TestSecurityHandler_CrowdSec_ExternalMappedToDisabled_DBOverride
--- PASS: TestSecurityHandler_CrowdSec_ExternalMappedToDisabled_DBOverride (0.01s)
=== RUN TestSecurityHandler_ExternalModeMappedToDisabled
--- PASS: TestSecurityHandler_ExternalModeMappedToDisabled (0.00s)
=== RUN TestSecurityHandler_Enable_Disable_WithAdminWhitelistAndToken
--- PASS: TestSecurityHandler_Enable_Disable_WithAdminWhitelistAndToken (1.54s)
=== RUN TestSecurityHandler_CreateAndListDecisionAndRulesets
2025/12/03 13:11:23 /projects/Charon/backend/internal/services/security_service.go:204 record not found
[0.154ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityHandler_CreateAndListDecisionAndRulesets (0.12s)
=== RUN TestSecurityHandler_UpsertDeleteTriggersApplyConfig
2025/12/03 13:11:23 /projects/Charon/backend/internal/services/security_service.go:204 record not found
[0.127ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
2025/12/03 13:11:23 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.527ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:23 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.080ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:23 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.100ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:23 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.083ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:23 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.074ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:23 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.226ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:23 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.197ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:23 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.111ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestSecurityHandler_UpsertDeleteTriggersApplyConfig (0.03s)
=== RUN TestGetClientIPHeadersAndRemoteAddr
--- PASS: TestGetClientIPHeadersAndRemoteAddr (0.00s)
=== RUN TestGetMyIPHandler
--- PASS: TestGetMyIPHandler (0.00s)
=== RUN TestUpdateHandler_Check
--- PASS: TestUpdateHandler_Check (0.01s)
=== RUN TestUserHandler_GetSetupStatus
--- PASS: TestUserHandler_GetSetupStatus (0.01s)
=== RUN TestUserHandler_Setup
--- PASS: TestUserHandler_Setup (0.75s)
=== RUN TestUserHandler_Setup_DBError
--- PASS: TestUserHandler_Setup_DBError (0.00s)
=== RUN TestUserHandler_RegenerateAPIKey
--- PASS: TestUserHandler_RegenerateAPIKey (0.00s)
=== RUN TestUserHandler_GetProfile
--- PASS: TestUserHandler_GetProfile (0.00s)
=== RUN TestUserHandler_RegisterRoutes
--- PASS: TestUserHandler_RegisterRoutes (0.00s)
=== RUN TestUserHandler_Errors
2025/12/03 13:11:24 /projects/Charon/backend/internal/api/handlers/user_handler.go:147 record not found
[0.091ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 99999 ORDER BY `users`.`id` LIMIT 1
2025/12/03 13:11:24 /projects/Charon/backend/internal/api/handlers/user_handler.go:130 no such table: users
[0.186ms] [rows:0] UPDATE `users` SET `api_key`="65b8b12e-6395-444a-af17-649186b1ac83",`updated_at`="2025-12-03 13:11:24.714" WHERE id = 99999
--- PASS: TestUserHandler_Errors (0.00s)
=== RUN TestUserHandler_UpdateProfile
=== RUN TestUserHandler_UpdateProfile/Success_Name_Only
=== RUN TestUserHandler_UpdateProfile/Success_Email_Change
=== RUN TestUserHandler_UpdateProfile/Fail_Email_Change_No_Password
=== RUN TestUserHandler_UpdateProfile/Fail_Email_Change_Wrong_Password
=== RUN TestUserHandler_UpdateProfile/Fail_Email_In_Use
--- PASS: TestUserHandler_UpdateProfile (2.37s)
--- PASS: TestUserHandler_UpdateProfile/Success_Name_Only (0.00s)
--- PASS: TestUserHandler_UpdateProfile/Success_Email_Change (0.77s)
--- PASS: TestUserHandler_UpdateProfile/Fail_Email_Change_No_Password (0.00s)
--- PASS: TestUserHandler_UpdateProfile/Fail_Email_Change_Wrong_Password (0.84s)
--- PASS: TestUserHandler_UpdateProfile/Fail_Email_In_Use (0.00s)
=== RUN TestUserHandler_UpdateProfile_Errors
2025/12/03 13:11:27 /projects/Charon/backend/internal/api/handlers/user_handler.go:183 record not found
[0.102ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_UpdateProfile_Errors (0.00s)
=== RUN TestUserLoginAfterEmailChange
--- PASS: TestUserLoginAfterEmailChange (3.56s)
=== RUN TestRemoteServerHandler_List
--- PASS: TestRemoteServerHandler_List (0.02s)
=== RUN TestRemoteServerHandler_Create
--- PASS: TestRemoteServerHandler_Create (0.02s)
=== RUN TestRemoteServerHandler_TestConnection
--- PASS: TestRemoteServerHandler_TestConnection (0.02s)
=== RUN TestRemoteServerHandler_Get
--- PASS: TestRemoteServerHandler_Get (0.02s)
=== RUN TestRemoteServerHandler_Update
--- PASS: TestRemoteServerHandler_Update (0.02s)
=== RUN TestRemoteServerHandler_Delete
2025/12/03 13:11:30 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.088ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "71f10185-8109-4781-9724-420affba4fc0" ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerHandler_Delete (0.02s)
=== RUN TestProxyHostHandler_List
--- PASS: TestProxyHostHandler_List (0.02s)
=== RUN TestProxyHostHandler_Create
--- PASS: TestProxyHostHandler_Create (0.02s)
=== RUN TestProxyHostHandler_PartialUpdate_DoesNotWipeFields
--- PASS: TestProxyHostHandler_PartialUpdate_DoesNotWipeFields (0.01s)
=== RUN TestHealthHandler
--- PASS: TestHealthHandler (0.00s)
=== RUN TestRemoteServerHandler_Errors
2025/12/03 13:11:30 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.114ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1
2025/12/03 13:11:30 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.100ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1
2025/12/03 13:11:30 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.089ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerHandler_Errors (0.02s)
=== RUN TestImportHandler_GetStatus
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found
[0.221ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found
[0.119ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:70 record not found
[0.131ms] [rows:0] SELECT * FROM `import_sessions` WHERE source_file = "/tmp/TestImportHandler_GetStatus223029045/001/mounted.caddyfile" AND status = "committed" ORDER BY committed_at DESC,`import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_GetStatus (0.01s)
=== RUN TestImportHandler_GetPreview
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:122 record not found
[0.203ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_GetPreview (0.01s)
=== RUN TestImportHandler_Cancel
--- PASS: TestImportHandler_Cancel (0.01s)
=== RUN TestImportHandler_Commit
--- PASS: TestImportHandler_Commit (0.01s)
=== RUN TestImportHandler_Upload
--- PASS: TestImportHandler_Upload (0.01s)
=== RUN TestImportHandler_GetPreview_WithContent
--- PASS: TestImportHandler_GetPreview_WithContent (0.01s)
=== RUN TestImportHandler_Commit_Errors
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.086ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Commit_Errors (0.01s)
=== RUN TestImportHandler_Cancel_Errors
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found
[0.113ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Cancel_Errors (0.01s)
=== RUN TestCheckMountedImport
--- PASS: TestCheckMountedImport (0.01s)
=== RUN TestImportHandler_Upload_Failure
--- PASS: TestImportHandler_Upload_Failure (0.01s)
=== RUN TestImportHandler_Upload_Conflict
--- PASS: TestImportHandler_Upload_Conflict (0.02s)
=== RUN TestImportHandler_GetPreview_BackupContent
--- PASS: TestImportHandler_GetPreview_BackupContent (0.01s)
=== RUN TestImportHandler_RegisterRoutes
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found
[0.199ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_RegisterRoutes (0.01s)
=== RUN TestImportHandler_GetPreview_TransientMount
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:122 record not found
[0.681ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1
2025/12/03 13:11:30 /projects/Charon/backend/internal/api/handlers/import_handler.go:167 record not found
[0.115ms] [rows:0] SELECT * FROM `import_sessions` WHERE source_file = "/tmp/TestImportHandler_GetPreview_TransientMount2275059922/001/mounted.caddyfile" AND status = "committed" ORDER BY committed_at DESC,`import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_GetPreview_TransientMount (0.02s)
=== RUN TestImportHandler_Commit_TransientUpload
2025/12/03 13:11:31 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.166ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "f097ac93-08cd-485d-a620-b4511aef9ad4" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Commit_TransientUpload (0.03s)
=== RUN TestImportHandler_Commit_TransientMount
2025/12/03 13:11:31 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.125ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "01639183-afad-4cc5-b2cf-358a177609f4" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Commit_TransientMount (0.02s)
=== RUN TestImportHandler_Cancel_TransientUpload
2025/12/03 13:11:31 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found
[0.095ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "aad4278f-1dbe-4db0-8949-b83b94481003" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Cancel_TransientUpload (0.02s)
=== RUN TestImportHandler_Errors
2025/12/03 13:11:31 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.081ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
2025/12/03 13:11:31 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found
[0.072ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Errors (0.01s)
=== RUN TestImportHandler_DetectImports
=== RUN TestImportHandler_DetectImports/no_imports
=== RUN TestImportHandler_DetectImports/single_import
=== RUN TestImportHandler_DetectImports/multiple_imports
=== RUN TestImportHandler_DetectImports/import_with_comment
--- PASS: TestImportHandler_DetectImports (0.01s)
--- PASS: TestImportHandler_DetectImports/no_imports (0.00s)
--- PASS: TestImportHandler_DetectImports/single_import (0.00s)
--- PASS: TestImportHandler_DetectImports/multiple_imports (0.00s)
--- PASS: TestImportHandler_DetectImports/import_with_comment (0.00s)
=== RUN TestImportHandler_DetectImports_InvalidJSON
--- PASS: TestImportHandler_DetectImports_InvalidJSON (0.01s)
=== RUN TestImportHandler_UploadMulti
=== RUN TestImportHandler_UploadMulti/single_Caddyfile
=== RUN TestImportHandler_UploadMulti/Caddyfile_with_site_files
=== RUN TestImportHandler_UploadMulti/missing_Caddyfile
=== RUN TestImportHandler_UploadMulti/path_traversal_in_filename
=== RUN TestImportHandler_UploadMulti/empty_file_content
--- PASS: TestImportHandler_UploadMulti (0.02s)
--- PASS: TestImportHandler_UploadMulti/single_Caddyfile (0.00s)
--- PASS: TestImportHandler_UploadMulti/Caddyfile_with_site_files (0.00s)
--- PASS: TestImportHandler_UploadMulti/missing_Caddyfile (0.00s)
--- PASS: TestImportHandler_UploadMulti/path_traversal_in_filename (0.00s)
--- PASS: TestImportHandler_UploadMulti/empty_file_content (0.00s)
=== RUN TestNotificationHandler_List
--- PASS: TestNotificationHandler_List (0.01s)
=== RUN TestNotificationHandler_MarkAsRead
--- PASS: TestNotificationHandler_MarkAsRead (0.01s)
=== RUN TestNotificationHandler_MarkAllAsRead
--- PASS: TestNotificationHandler_MarkAllAsRead (0.01s)
=== RUN TestNotificationHandler_MarkAllAsRead_Error
--- PASS: TestNotificationHandler_MarkAllAsRead_Error (0.01s)
=== RUN TestNotificationHandler_DBError
--- PASS: TestNotificationHandler_DBError (0.01s)
=== RUN TestNotificationProviderHandler_CRUD
[GIN] 2025/12/03 - 13:11:31 | 201 | 414.902µs | | POST "/api/v1/notifications/providers"
[GIN] 2025/12/03 - 13:11:31 | 200 | 229.861µs | | GET "/api/v1/notifications/providers"
[GIN] 2025/12/03 - 13:11:31 | 200 | 384.911µs | | PUT "/api/v1/notifications/providers/978cd427-fd22-431e-93ae-e67b2e392313"
[GIN] 2025/12/03 - 13:11:31 | 200 | 213.951µs | | DELETE "/api/v1/notifications/providers/978cd427-fd22-431e-93ae-e67b2e392313"
--- PASS: TestNotificationProviderHandler_CRUD (0.01s)
=== RUN TestNotificationProviderHandler_Templates
[GIN] 2025/12/03 - 13:11:31 | 200 | 75.851µs | | GET "/api/v1/notifications/templates"
--- PASS: TestNotificationProviderHandler_Templates (0.00s)
=== RUN TestNotificationProviderHandler_Test
[GIN] 2025/12/03 - 13:11:31 | 400 | 257.281µs | | POST "/api/v1/notifications/providers/test"
--- PASS: TestNotificationProviderHandler_Test (0.01s)
=== RUN TestNotificationProviderHandler_Errors
[GIN] 2025/12/03 - 13:11:31 | 400 | 28.15µs | | POST "/api/v1/notifications/providers"
[GIN] 2025/12/03 - 13:11:31 | 400 | 16.339µs | | PUT "/api/v1/notifications/providers/123"
[GIN] 2025/12/03 - 13:11:31 | 400 | 14.72µs | | POST "/api/v1/notifications/providers/test"
--- PASS: TestNotificationProviderHandler_Errors (0.00s)
=== RUN TestNotificationProviderHandler_InvalidCustomTemplate_Rejects
[GIN] 2025/12/03 - 13:11:31 | 400 | 275.86µs | | POST "/api/v1/notifications/providers"
[GIN] 2025/12/03 - 13:11:31 | 201 | 510.481µs | | POST "/api/v1/notifications/providers"
[GIN] 2025/12/03 - 13:11:31 | 400 | 242.201µs | | PUT "/api/v1/notifications/providers/5a2df675-03c2-41ff-9778-991f7a650a79"
--- PASS: TestNotificationProviderHandler_InvalidCustomTemplate_Rejects (0.01s)
=== RUN TestNotificationProviderHandler_Preview
[GIN] 2025/12/03 - 13:11:31 | 200 | 519.073µs | | POST "/api/v1/notifications/providers/preview"
[GIN] 2025/12/03 - 13:11:31 | 400 | 283.401µs | | POST "/api/v1/notifications/providers/preview"
--- PASS: TestNotificationProviderHandler_Preview (0.01s)
=== RUN TestRemoteServerHandler_TestConnectionCustom
[GIN] 2025/12/03 - 13:11:31 | 200 | 593.793µs | | POST "/api/v1/remote-servers/test"
--- PASS: TestRemoteServerHandler_TestConnectionCustom (0.02s)
=== RUN TestRemoteServerHandler_FullCRUD
[GIN] 2025/12/03 - 13:11:31 | 201 | 979.364µs | | POST "/api/v1/remote-servers"
[GIN] 2025/12/03 - 13:11:31 | 200 | 322.731µs | | GET "/api/v1/remote-servers"
[GIN] 2025/12/03 - 13:11:31 | 200 | 255.851µs | | GET "/api/v1/remote-servers/957d8d6f-f4c6-4085-b565-9213e34f6c28"
[GIN] 2025/12/03 - 13:11:31 | 200 | 709.242µs | | PUT "/api/v1/remote-servers/957d8d6f-f4c6-4085-b565-9213e34f6c28"
[GIN] 2025/12/03 - 13:11:31 | 204 | 484.491µs | | DELETE "/api/v1/remote-servers/957d8d6f-f4c6-4085-b565-9213e34f6c28"
[GIN] 2025/12/03 - 13:11:31 | 400 | 32.161µs | | POST "/api/v1/remote-servers"
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.102ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1
[GIN] 2025/12/03 - 13:11:31 | 404 | 627.072µs | | PUT "/api/v1/remote-servers/non-existent-uuid"
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.505ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1
[GIN] 2025/12/03 - 13:11:31 | 404 | 616.742µs | | DELETE "/api/v1/remote-servers/non-existent-uuid"
--- PASS: TestRemoteServerHandler_FullCRUD (0.03s)
=== RUN TestSettingsHandler_GetSettings
--- PASS: TestSettingsHandler_GetSettings (0.00s)
=== RUN TestSettingsHandler_UpdateSettings
--- PASS: TestSettingsHandler_UpdateSettings (0.00s)
=== RUN TestSettingsHandler_Errors
--- PASS: TestSettingsHandler_Errors (0.00s)
=== RUN TestUptimeHandler_List
[GIN] 2025/12/03 - 13:11:31 | 200 | 420.652µs | | GET "/api/v1/uptime"
--- PASS: TestUptimeHandler_List (0.02s)
=== RUN TestUptimeHandler_GetHistory
[GIN] 2025/12/03 - 13:11:31 | 200 | 296.642µs | | GET "/api/v1/uptime/monitor-1/history"
--- PASS: TestUptimeHandler_GetHistory (0.02s)
=== RUN TestUptimeHandler_CheckMonitor
[GIN] 2025/12/03 - 13:11:31 | 200 | 339.442µs | | POST "/api/v1/uptime/check-mon-1/check"
--- PASS: TestUptimeHandler_CheckMonitor (0.02s)
=== RUN TestUptimeHandler_CheckMonitor_NotFound
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/uptime_service.go:819 record not found
[0.106ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1
[GIN] 2025/12/03 - 13:11:31 | 404 | 233.831µs | | POST "/api/v1/uptime/nonexistent/check"
--- PASS: TestUptimeHandler_CheckMonitor_NotFound (0.02s)
=== RUN TestUptimeHandler_Update
=== RUN TestUptimeHandler_Update/success
[GIN] 2025/12/03 - 13:11:31 | 200 | 789.673µs | | PUT "/api/v1/uptime/monitor-update"
=== RUN TestUptimeHandler_Update/invalid_json
[GIN] 2025/12/03 - 13:11:31 | 400 | 48.03µs | | PUT "/api/v1/uptime/monitor-1"
=== RUN TestUptimeHandler_Update/not_found
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/uptime_service.go:833 record not found
[0.114ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1
[GIN] 2025/12/03 - 13:11:31 | 500 | 263.372µs | | PUT "/api/v1/uptime/nonexistent"
--- PASS: TestUptimeHandler_Update (0.05s)
--- PASS: TestUptimeHandler_Update/success (0.02s)
--- PASS: TestUptimeHandler_Update/invalid_json (0.01s)
--- PASS: TestUptimeHandler_Update/not_found (0.02s)
=== RUN TestUptimeHandler_DeleteAndSync
=== RUN TestUptimeHandler_DeleteAndSync/delete_monitor
[GIN] 2025/12/03 - 13:11:31 | 200 | 2.158179ms | | DELETE "/api/v1/uptime/mon-delete"
2025/12/03 13:11:31 /projects/Charon/backend/internal/api/handlers/uptime_handler_test.go:202 record not found
[0.088ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "mon-delete" ORDER BY `uptime_monitors`.`id` LIMIT 1
=== RUN TestUptimeHandler_DeleteAndSync/sync_creates_monitor_for_proxy_host
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.164ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.105ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
[GIN] 2025/12/03 - 13:11:31 | 200 | 1.618067ms | | POST "/api/v1/uptime/sync"
=== RUN TestUptimeHandler_DeleteAndSync/update_enabled_via_PUT
[GIN] 2025/12/03 - 13:11:31 | 200 | 544.972µs | | PUT "/api/v1/uptime/mon-enable"
--- PASS: TestUptimeHandler_DeleteAndSync (0.07s)
--- PASS: TestUptimeHandler_DeleteAndSync/delete_monitor (0.02s)
--- PASS: TestUptimeHandler_DeleteAndSync/sync_creates_monitor_for_proxy_host (0.02s)
--- PASS: TestUptimeHandler_DeleteAndSync/update_enabled_via_PUT (0.02s)
=== RUN TestUptimeHandler_Sync_Success
[GIN] 2025/12/03 - 13:11:31 | 200 | 215.661µs | | POST "/api/v1/uptime/sync"
--- PASS: TestUptimeHandler_Sync_Success (0.02s)
=== RUN TestUptimeHandler_Delete_Error
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/uptime_service.go:861 no such table: uptime_monitors
[0.061ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1
[GIN] 2025/12/03 - 13:11:31 | 500 | 523.692µs | | DELETE "/api/v1/uptime/nonexistent"
--- PASS: TestUptimeHandler_Delete_Error (0.02s)
=== RUN TestUptimeHandler_List_Error
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/uptime_service.go:813 no such table: uptime_monitors
[0.038ms] [rows:0] SELECT * FROM `uptime_monitors` ORDER BY name ASC
[GIN] 2025/12/03 - 13:11:31 | 500 | 226.291µs | | GET "/api/v1/uptime"
--- PASS: TestUptimeHandler_List_Error (0.02s)
=== RUN TestUptimeHandler_GetHistory_Error
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/uptime_service.go:827 no such table: uptime_heartbeats
[0.129ms] [rows:0] SELECT * FROM `uptime_heartbeats` WHERE monitor_id = "monitor-1" ORDER BY created_at desc LIMIT 50
[GIN] 2025/12/03 - 13:11:31 | 500 | 325.741µs | | GET "/api/v1/uptime/monitor-1/history"
--- PASS: TestUptimeHandler_GetHistory_Error (0.01s)
PASS
coverage: 74.1% of statements
ok github.com/Wikid82/charon/backend/internal/api/handlers 20.180s coverage: 74.1% of statements
=== RUN TestAuthMiddleware_MissingHeader
--- PASS: TestAuthMiddleware_MissingHeader (0.00s)
=== RUN TestRequireRole_Success
--- PASS: TestRequireRole_Success (0.00s)
=== RUN TestRequireRole_Forbidden
--- PASS: TestRequireRole_Forbidden (0.00s)
=== RUN TestAuthMiddleware_Cookie
--- PASS: TestAuthMiddleware_Cookie (0.84s)
=== RUN TestAuthMiddleware_ValidToken
--- PASS: TestAuthMiddleware_ValidToken (0.86s)
=== RUN TestAuthMiddleware_InvalidToken
--- PASS: TestAuthMiddleware_InvalidToken (0.01s)
=== RUN TestRequireRole_MissingRoleInContext
--- PASS: TestRequireRole_MissingRoleInContext (0.00s)
=== RUN TestRecoveryLogsStacktraceVerbose
--- PASS: TestRecoveryLogsStacktraceVerbose (0.00s)
=== RUN TestRecoveryLogsBriefWhenNotVerbose
--- PASS: TestRecoveryLogsBriefWhenNotVerbose (0.00s)
=== RUN TestRecoverySanitizesHeadersAndPath
--- PASS: TestRecoverySanitizesHeadersAndPath (0.00s)
=== RUN TestRequestIDAddsHeaderAndLogger
--- PASS: TestRequestIDAddsHeaderAndLogger (0.00s)
=== RUN TestRequestLoggerSanitizesPath
--- PASS: TestRequestLoggerSanitizesPath (0.00s)
=== RUN TestRequestLoggerIncludesRequestID
--- PASS: TestRequestLoggerIncludesRequestID (0.00s)
PASS
coverage: 86.4% of statements
ok github.com/Wikid82/charon/backend/internal/api/middleware 2.772s coverage: 86.4% of statements
=== RUN TestRegister
time="2025-12-03T13:11:12Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..."
time="2025-12-03T13:11:12Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=/data
--- PASS: TestRegister (0.08s)
=== RUN TestRegisterImportHandler
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: scanning cert directory" certRoot=/data/certificates
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/data/certificates
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: disk sync complete" count=0
--- PASS: TestRegisterImportHandler (0.02s)
PASS
coverage: 86.7% of statements
ok github.com/Wikid82/charon/backend/internal/api/routes 1.151s coverage: 86.7% of statements
=== RUN TestIntegration_WAF_BlockAndMonitor
time="2025-12-03T13:11:12Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..."
time="2025-12-03T13:11:12Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=data/caddy/data
time="2025-12-03T13:11:12Z" level=warning msg="WAF blocked request" decision=block mode=block path=/api/v1/remote-servers query="test=<script>" source=waf
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: scanning cert directory" certRoot=data/caddy/data/certificates
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: cert directory does not exist" certRoot=data/caddy/data/certificates
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: disk sync complete" count=0
time="2025-12-03T13:11:12Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..."
time="2025-12-03T13:11:12Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=data/caddy/data
time="2025-12-03T13:11:12Z" level=info msg="WAF monitored request" decision=monitor mode=monitor path=/api/v1/remote-servers query="test=<script>" source=waf
--- PASS: TestIntegration_WAF_BlockAndMonitor (0.19s)
PASS
coverage: [no statements]
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: scanning cert directory" certRoot=data/caddy/data/certificates
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: cert directory does not exist" certRoot=data/caddy/data/certificates
time="2025-12-03T13:11:12Z" level=info msg="CertificateService: disk sync complete" count=0
ok github.com/Wikid82/charon/backend/internal/api/tests 1.250s coverage: [no statements]
=== RUN TestClient_Load_Success
--- PASS: TestClient_Load_Success (0.00s)
=== RUN TestClient_Load_Failure
--- PASS: TestClient_Load_Failure (0.00s)
=== RUN TestClient_GetConfig_Success
--- PASS: TestClient_GetConfig_Success (0.00s)
=== RUN TestClient_Ping_Success
--- PASS: TestClient_Ping_Success (0.00s)
=== RUN TestClient_Ping_Unreachable
--- PASS: TestClient_Ping_Unreachable (0.00s)
=== RUN TestClient_Load_CreateRequestFailure
--- PASS: TestClient_Load_CreateRequestFailure (0.00s)
=== RUN TestClient_Ping_CreateRequestFailure
--- PASS: TestClient_Ping_CreateRequestFailure (0.00s)
=== RUN TestClient_GetConfig_Failure
--- PASS: TestClient_GetConfig_Failure (0.00s)
=== RUN TestClient_GetConfig_InvalidJSON
--- PASS: TestClient_GetConfig_InvalidJSON (0.00s)
=== RUN TestClient_Ping_Failure
--- PASS: TestClient_Ping_Failure (0.00s)
=== RUN TestClient_RequestCreationErrors
--- PASS: TestClient_RequestCreationErrors (0.00s)
=== RUN TestClient_NetworkErrors
--- PASS: TestClient_NetworkErrors (0.00s)
=== RUN TestClient_Load_MarshalFailure
--- PASS: TestClient_Load_MarshalFailure (0.00s)
=== RUN TestClient_Ping_TransportError
--- PASS: TestClient_Ping_TransportError (0.00s)
=== RUN TestBuildACLHandler_GeoBlacklist
--- PASS: TestBuildACLHandler_GeoBlacklist (0.00s)
=== RUN TestBuildACLHandler_UnknownTypeReturnsNil
--- PASS: TestBuildACLHandler_UnknownTypeReturnsNil (0.00s)
=== RUN TestBuildACLHandler_GeoWhitelist
--- PASS: TestBuildACLHandler_GeoWhitelist (0.00s)
=== RUN TestBuildACLHandler_LocalNetwork
--- PASS: TestBuildACLHandler_LocalNetwork (0.00s)
=== RUN TestBuildACLHandler_IPRules
--- PASS: TestBuildACLHandler_IPRules (0.00s)
=== RUN TestBuildACLHandler_InvalidIPJSON
--- PASS: TestBuildACLHandler_InvalidIPJSON (0.00s)
=== RUN TestBuildACLHandler_NoIPRulesReturnsNil
--- PASS: TestBuildACLHandler_NoIPRulesReturnsNil (0.00s)
=== RUN TestBuildACLHandler_Whitelist
--- PASS: TestBuildACLHandler_Whitelist (0.00s)
=== RUN TestGenerateConfig_CatchAllFrontend
--- PASS: TestGenerateConfig_CatchAllFrontend (0.00s)
=== RUN TestGenerateConfig_AdvancedInvalidJSON
time="2025-12-03T13:11:14Z" level=warning msg="Failed to parse advanced_config for host" error="invalid character 'i' looking for beginning of object key string" host=adv1
--- PASS: TestGenerateConfig_AdvancedInvalidJSON (0.00s)
=== RUN TestGenerateConfig_AdvancedArrayHandler
--- PASS: TestGenerateConfig_AdvancedArrayHandler (0.00s)
=== RUN TestGenerateConfig_LowercaseDomains
--- PASS: TestGenerateConfig_LowercaseDomains (0.00s)
=== RUN TestGenerateConfig_AdvancedObjectHandler
--- PASS: TestGenerateConfig_AdvancedObjectHandler (0.00s)
=== RUN TestGenerateConfig_AdvancedHeadersStringToArray
--- PASS: TestGenerateConfig_AdvancedHeadersStringToArray (0.00s)
=== RUN TestGenerateConfig_ACLWhitelistIncluded
--- PASS: TestGenerateConfig_ACLWhitelistIncluded (0.00s)
=== RUN TestGenerateConfig_SkipsEmptyDomainEntries
--- PASS: TestGenerateConfig_SkipsEmptyDomainEntries (0.00s)
=== RUN TestGenerateConfig_AdvancedNoHandlerKey
time="2025-12-03T13:11:14Z" level=warning msg="advanced_config for host is not a handler object" host=adv3
--- PASS: TestGenerateConfig_AdvancedNoHandlerKey (0.00s)
=== RUN TestGenerateConfig_AdvancedUnexpectedJSONStructure
time="2025-12-03T13:11:14Z" level=warning msg="advanced_config for host has unexpected JSON structure" host=adv4
--- PASS: TestGenerateConfig_AdvancedUnexpectedJSONStructure (0.00s)
=== RUN TestBuildACLHandler_UnknownIPTypeReturnsNil
--- PASS: TestBuildACLHandler_UnknownIPTypeReturnsNil (0.00s)
=== RUN TestGenerateConfig_SecurityPipeline_Order
--- PASS: TestGenerateConfig_SecurityPipeline_Order (0.00s)
=== RUN TestGenerateConfig_SecurityPipeline_OmitWhenDisabled
--- PASS: TestGenerateConfig_SecurityPipeline_OmitWhenDisabled (0.00s)
=== RUN TestGenerateConfig_ZerosslAndBothProviders
--- PASS: TestGenerateConfig_ZerosslAndBothProviders (0.00s)
=== RUN TestGenerateConfig_SecurityPipeline_Order_Locations
--- PASS: TestGenerateConfig_SecurityPipeline_Order_Locations (0.00s)
=== RUN TestGenerateConfig_ACLLogWarning
--- PASS: TestGenerateConfig_ACLLogWarning (0.00s)
=== RUN TestGenerateConfig_ACLHandlerIncluded
--- PASS: TestGenerateConfig_ACLHandlerIncluded (0.00s)
=== RUN TestGenerateConfig_DecisionsBlockWithAdminExclusion
config_generate_additional_test.go:143: handles: [
{
"handler": "subroute",
"routes": [
{
"handle": [
{
"body": "Access denied: Blocked by security decision",
"handler": "static_response",
"status_code": 403
}
],
"match": [
{
"remote_ip": {
"ranges": [
"1.2.3.4"
]
}
},
{
"not": [
{
"remote_ip": {
"ranges": [
"10.0.0.1/32"
]
}
}
]
}
],
"terminal": true
}
]
},
{
"flush_interval": -1,
"handler": "reverse_proxy",
"upstreams": [
{
"dial": "app:8080"
}
]
}
]
--- PASS: TestGenerateConfig_DecisionsBlockWithAdminExclusion (0.00s)
=== RUN TestGenerateConfig_WAFModeAndRulesetReference
--- PASS: TestGenerateConfig_WAFModeAndRulesetReference (0.00s)
=== RUN TestGenerateConfig_WAFModeDisabledSkipsHandler
--- PASS: TestGenerateConfig_WAFModeDisabledSkipsHandler (0.00s)
=== RUN TestGenerateConfig_WAFSelectedSetsContentAndMode
--- PASS: TestGenerateConfig_WAFSelectedSetsContentAndMode (0.00s)
=== RUN TestGenerateConfig_DecisionAdminPartsEmpty
--- PASS: TestGenerateConfig_DecisionAdminPartsEmpty (0.00s)
=== RUN TestNormalizeHeaderOps_PreserveStringArray
--- PASS: TestNormalizeHeaderOps_PreserveStringArray (0.00s)
=== RUN TestGenerateConfig_WAFUsesRuleSet
--- PASS: TestGenerateConfig_WAFUsesRuleSet (0.00s)
=== RUN TestGenerateConfig_WAFUsesRuleSetFromAdvancedConfig
--- PASS: TestGenerateConfig_WAFUsesRuleSetFromAdvancedConfig (0.00s)
=== RUN TestGenerateConfig_WAFUsesRuleSetFromAdvancedConfig_Array
--- PASS: TestGenerateConfig_WAFUsesRuleSetFromAdvancedConfig_Array (0.00s)
=== RUN TestGenerateConfig_WAFUsesRulesetFromSecCfgFallback
--- PASS: TestGenerateConfig_WAFUsesRulesetFromSecCfgFallback (0.00s)
=== RUN TestGenerateConfig_RateLimitFromSecCfg
--- PASS: TestGenerateConfig_RateLimitFromSecCfg (0.00s)
=== RUN TestGenerateConfig_CrowdSecHandlerFromSecCfg
--- PASS: TestGenerateConfig_CrowdSecHandlerFromSecCfg (0.00s)
=== RUN TestGenerateConfig_EmptyHostsAndNoFrontend
--- PASS: TestGenerateConfig_EmptyHostsAndNoFrontend (0.00s)
=== RUN TestGenerateConfig_SkipsInvalidCustomCert
--- PASS: TestGenerateConfig_SkipsInvalidCustomCert (0.00s)
=== RUN TestGenerateConfig_SkipsDuplicateDomains
--- PASS: TestGenerateConfig_SkipsDuplicateDomains (0.00s)
=== RUN TestGenerateConfig_LoadPEMSetsTLSWhenNoACME
--- PASS: TestGenerateConfig_LoadPEMSetsTLSWhenNoACME (0.00s)
=== RUN TestGenerateConfig_DefaultAcmeStaging
--- PASS: TestGenerateConfig_DefaultAcmeStaging (0.00s)
=== RUN TestGenerateConfig_ACLHandlerBuildError
--- PASS: TestGenerateConfig_ACLHandlerBuildError (0.00s)
=== RUN TestGenerateConfig_SkipHostDomainEmptyAndDisabled
--- PASS: TestGenerateConfig_SkipHostDomainEmptyAndDisabled (0.00s)
=== RUN TestGenerateConfig_CustomCertsAndTLS
--- PASS: TestGenerateConfig_CustomCertsAndTLS (0.00s)
=== RUN TestGenerateConfig_Empty
--- PASS: TestGenerateConfig_Empty (0.00s)
=== RUN TestGenerateConfig_SingleHost
--- PASS: TestGenerateConfig_SingleHost (0.00s)
=== RUN TestGenerateConfig_MultipleHosts
--- PASS: TestGenerateConfig_MultipleHosts (0.00s)
=== RUN TestGenerateConfig_WebSocketEnabled
--- PASS: TestGenerateConfig_WebSocketEnabled (0.00s)
=== RUN TestGenerateConfig_EmptyDomain
--- PASS: TestGenerateConfig_EmptyDomain (0.00s)
=== RUN TestGenerateConfig_Logging
--- PASS: TestGenerateConfig_Logging (0.00s)
=== RUN TestGenerateConfig_Advanced
--- PASS: TestGenerateConfig_Advanced (0.00s)
=== RUN TestGenerateConfig_ACMEStaging
--- PASS: TestGenerateConfig_ACMEStaging (0.00s)
=== RUN TestBuildACLHandler_WhitelistAndBlacklistAdminMerge
--- PASS: TestBuildACLHandler_WhitelistAndBlacklistAdminMerge (0.00s)
=== RUN TestBuildACLHandler_GeoAndLocalNetwork
--- PASS: TestBuildACLHandler_GeoAndLocalNetwork (0.00s)
=== RUN TestBuildACLHandler_AdminWhitelistParsing
--- PASS: TestBuildACLHandler_AdminWhitelistParsing (0.00s)
=== RUN TestImporter_ExtractHosts_DialWithoutPortDefaultsTo80
--- PASS: TestImporter_ExtractHosts_DialWithoutPortDefaultsTo80 (0.00s)
=== RUN TestImporter_ExtractHosts_DetectsWebsocketFromHeaders
--- PASS: TestImporter_ExtractHosts_DetectsWebsocketFromHeaders (0.00s)
=== RUN TestImporter_ImportFile_ParseOutputInvalidJSON
--- PASS: TestImporter_ImportFile_ParseOutputInvalidJSON (0.00s)
=== RUN TestImporter_ImportFile_ExecutorError
--- PASS: TestImporter_ImportFile_ExecutorError (0.00s)
=== RUN TestImporter_ExtractHosts_TLSConnectionPolicyAndDialWithoutPort
--- PASS: TestImporter_ExtractHosts_TLSConnectionPolicyAndDialWithoutPort (0.00s)
=== RUN TestExtractHandlers_Subroute_WithUnsupportedSubhandle
--- PASS: TestExtractHandlers_Subroute_WithUnsupportedSubhandle (0.00s)
=== RUN TestExtractHandlers_Subroute_WithNonMapRoutes
--- PASS: TestExtractHandlers_Subroute_WithNonMapRoutes (0.00s)
=== RUN TestImporter_ExtractHosts_UpstreamsNonMapAndWarnings
--- PASS: TestImporter_ExtractHosts_UpstreamsNonMapAndWarnings (0.00s)
=== RUN TestBackupCaddyfile_ReadFailure
--- PASS: TestBackupCaddyfile_ReadFailure (0.00s)
=== RUN TestExtractHandlers_Subroute_EmptyAndHandleNotArray
--- PASS: TestExtractHandlers_Subroute_EmptyAndHandleNotArray (0.00s)
=== RUN TestImporter_ExtractHosts_ReverseProxyNoUpstreams
--- PASS: TestImporter_ExtractHosts_ReverseProxyNoUpstreams (0.00s)
=== RUN TestBackupCaddyfile_Success
--- PASS: TestBackupCaddyfile_Success (0.00s)
=== RUN TestExtractHandlers_Subroute_WithHeadersUpstreams
--- PASS: TestExtractHandlers_Subroute_WithHeadersUpstreams (0.00s)
=== RUN TestImporter_ExtractHosts_DuplicateHost
--- PASS: TestImporter_ExtractHosts_DuplicateHost (0.00s)
=== RUN TestBackupCaddyfile_WriteFailure
--- PASS: TestBackupCaddyfile_WriteFailure (0.00s)
=== RUN TestImporter_ExtractHosts_SSLForcedByDomainScheme
--- PASS: TestImporter_ExtractHosts_SSLForcedByDomainScheme (0.00s)
=== RUN TestImporter_ExtractHosts_MultipleHostsInMatch
--- PASS: TestImporter_ExtractHosts_MultipleHostsInMatch (0.00s)
=== RUN TestImporter_ExtractHosts_UpgradeHeaderAsString
--- PASS: TestImporter_ExtractHosts_UpgradeHeaderAsString (0.00s)
=== RUN TestImporter_ExtractHosts_SscanfFailureOnPort
--- PASS: TestImporter_ExtractHosts_SscanfFailureOnPort (0.00s)
=== RUN TestImporter_ExtractHosts_PartsSscanfFail
--- PASS: TestImporter_ExtractHosts_PartsSscanfFail (0.00s)
=== RUN TestImporter_ExtractHosts_PartsEmptyPortField
--- PASS: TestImporter_ExtractHosts_PartsEmptyPortField (0.00s)
=== RUN TestImporter_ExtractHosts_ForceSplitFallback_PartsNumericPort
--- PASS: TestImporter_ExtractHosts_ForceSplitFallback_PartsNumericPort (0.00s)
=== RUN TestImporter_ExtractHosts_ForceSplitFallback_PartsSscanfFail
--- PASS: TestImporter_ExtractHosts_ForceSplitFallback_PartsSscanfFail (0.00s)
=== RUN TestBackupCaddyfile_WriteErrorDeterministic
--- PASS: TestBackupCaddyfile_WriteErrorDeterministic (0.00s)
=== RUN TestParseCaddyfile_InvalidPath
--- PASS: TestParseCaddyfile_InvalidPath (0.00s)
=== RUN TestBackupCaddyfile_InvalidOriginalPath
--- PASS: TestBackupCaddyfile_InvalidOriginalPath (0.00s)
=== RUN TestExtractHandlers_Subroute
--- PASS: TestExtractHandlers_Subroute (0.00s)
=== RUN TestNewImporter
--- PASS: TestNewImporter (0.00s)
=== RUN TestImporter_ParseCaddyfile_NotFound
--- PASS: TestImporter_ParseCaddyfile_NotFound (0.00s)
=== RUN TestImporter_ParseCaddyfile_Success
--- PASS: TestImporter_ParseCaddyfile_Success (0.00s)
=== RUN TestImporter_ParseCaddyfile_Failure
--- PASS: TestImporter_ParseCaddyfile_Failure (0.00s)
=== RUN TestImporter_ExtractHosts
--- PASS: TestImporter_ExtractHosts (0.00s)
=== RUN TestImporter_ImportFile
--- PASS: TestImporter_ImportFile (0.00s)
=== RUN TestConvertToProxyHosts
--- PASS: TestConvertToProxyHosts (0.00s)
=== RUN TestImporter_ValidateCaddyBinary
--- PASS: TestImporter_ValidateCaddyBinary (0.00s)
=== RUN TestBackupCaddyfile
--- PASS: TestBackupCaddyfile (0.00s)
=== RUN TestDefaultExecutor_Execute
--- PASS: TestDefaultExecutor_Execute (0.00s)
=== RUN TestManager_ListSnapshots_ReadDirError
--- PASS: TestManager_ListSnapshots_ReadDirError (0.00s)
=== RUN TestManager_RotateSnapshots_NoOp
--- PASS: TestManager_RotateSnapshots_NoOp (0.00s)
=== RUN TestManager_Rollback_NoSnapshots
--- PASS: TestManager_Rollback_NoSnapshots (0.00s)
=== RUN TestManager_Rollback_UnmarshalError
--- PASS: TestManager_Rollback_UnmarshalError (0.00s)
=== RUN TestManager_Rollback_LoadSnapshotFail
--- PASS: TestManager_Rollback_LoadSnapshotFail (0.00s)
=== RUN TestManager_SaveSnapshot_WriteError
--- PASS: TestManager_SaveSnapshot_WriteError (0.00s)
=== RUN TestBackupCaddyfile_MkdirAllFailure
--- PASS: TestBackupCaddyfile_MkdirAllFailure (0.00s)
=== RUN TestManager_SaveSnapshot_Success
--- PASS: TestManager_SaveSnapshot_Success (0.00s)
=== RUN TestManager_ApplyConfig_WithSettings
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.065ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.090ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[1.224ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[1.252ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[3.801ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_WithSettings (0.03s)
=== RUN TestManager_RotateSnapshots_ListDirError
--- PASS: TestManager_RotateSnapshots_ListDirError (0.00s)
=== RUN TestManager_RotateSnapshots_DeletesOld
--- PASS: TestManager_RotateSnapshots_DeletesOld (0.00s)
=== RUN TestManager_ApplyConfig_RotateSnapshotsWarning
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.083ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.086ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.071ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.071ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[2.023ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[2.001ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.887ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RotateSnapshotsWarning (0.03s)
=== RUN TestManager_ApplyConfig_LoadFailsAndRollbackFails
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.110ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.084ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.064ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.046ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[1.800ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[1.022ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.967ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_LoadFailsAndRollbackFails (0.02s)
=== RUN TestManager_ApplyConfig_SaveSnapshotFails
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.044ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.070ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.048ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.043ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[1.259ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.877ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[3.096ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SaveSnapshotFails (0.02s)
=== RUN TestManager_ApplyConfig_LoadFailsThenRollbackSucceeds
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.070ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.056ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.041ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.038ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[2.952ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.768ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.781ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_LoadFailsThenRollbackSucceeds (0.02s)
=== RUN TestManager_SaveSnapshot_MarshalError
--- PASS: TestManager_SaveSnapshot_MarshalError (0.00s)
=== RUN TestManager_RotateSnapshots_DeleteError
--- PASS: TestManager_RotateSnapshots_DeleteError (0.00s)
=== RUN TestManager_ApplyConfig_GenerateConfigFails
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.068ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.047ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.039ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.037ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.840ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[2.333ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.755ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_GenerateConfigFails (0.02s)
=== RUN TestManager_ApplyConfig_RejectsWhenCerberusEnabledWithoutAdminWhitelist
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.056ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.072ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.068ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.064ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestManager_ApplyConfig_RejectsWhenCerberusEnabledWithoutAdminWhitelist (0.01s)
=== RUN TestManager_ApplyConfig_ValidateFails
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.052ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.047ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.040ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.039ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.960ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.808ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.848ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_ValidateFails (0.01s)
=== RUN TestManager_Rollback_ReadFileError
--- PASS: TestManager_Rollback_ReadFileError (0.00s)
=== RUN TestManager_ApplyConfig_RotateSnapshotsWarning_Stderr
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.043ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.044ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.039ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.036ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[1.420ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[1.442ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.723ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RotateSnapshotsWarning_Stderr (0.02s)
=== RUN TestManager_ApplyConfig_PassesAdminWhitelistToGenerateConfig
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.106ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.168ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.267ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.174ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[2.114ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.997ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_PassesAdminWhitelistToGenerateConfig (0.03s)
=== RUN TestManager_ApplyConfig_PassesRuleSetsToGenerateConfig
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.042ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.045ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.220ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.878ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_PassesRuleSetsToGenerateConfig (0.02s)
=== RUN TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.070ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.072ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.076ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.136ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[1.214ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
manager_additional_test.go:711: generated config: {"apps":{"http":{"servers":{"charon_server":{"listen":[":80",":443"],"routes":[{"match":[{"host":["ruleset.example.com"]}],"handle":[{"handler":"waf","include":["/tmp/TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset1789396734/001/coraza/rulesets/owasp-crs.conf"]},{"handler":"vars"},{"flush_interval":-1,"handler":"reverse_proxy","upstreams":[{"dial":"127.0.0.1:8080"}]}],"terminal":true}],"automatic_https":{},"logs":{"default_logger_name":"access_log"}}}}},"logging":{"logs":{"access":{"writer":{"output":"file","filename":"/tmp/TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset1789396734/logs/access.log","roll":true,"roll_size_mb":10,"roll_keep":5,"roll_keep_days":7},"encoder":{"format":"json"},"level":"INFO","include":["http.log.access.access_log"]}}},"storage":{"module":"file_system","root":"/tmp/TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset1789396734/001/data"}}
--- PASS: TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset (0.02s)
=== RUN TestManager_ApplyConfig_RulesetWriteFileFailure
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.044ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.056ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.068ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.062ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.821ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetWriteFileFailure (0.02s)
=== RUN TestManager_ApplyConfig_RulesetDirMkdirFailure
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.117ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.068ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.075ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.066ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.738ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetDirMkdirFailure (0.02s)
=== RUN TestManager_ApplyConfig_ReappliesOnFlagChange
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.066ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.105ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.082ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.064ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[1.900ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.677ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.716ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.041ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.044ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.042ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.028ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.036ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.074ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.097ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.063ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.040ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.031ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.035ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_ReappliesOnFlagChange (0.02s)
=== RUN TestManager_ApplyConfig_PrependsSecRuleEngineDirectives
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.079ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.167ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.077ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.059ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.897ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_PrependsSecRuleEngineDirectives (0.02s)
=== RUN TestManager_ApplyConfig_DoesNotPrependIfSecRuleEngineExists
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.046ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.081ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.582ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.071ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[1.115ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_DoesNotPrependIfSecRuleEngineExists (0.02s)
=== RUN TestManager_ApplyConfig_DebugMarshalFailure
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.077ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.057ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.042ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.038ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.767ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_DebugMarshalFailure (0.02s)
=== RUN TestManager_ApplyConfig_WAFModeMonitorUsesDetectionOnly
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.061ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.060ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.058ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.097ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[1.094ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_WAFModeMonitorUsesDetectionOnly (0.02s)
=== RUN TestManager_ApplyConfig_PerRulesetModeOverride
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.045ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.074ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.089ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.073ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.847ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_PerRulesetModeOverride (0.02s)
=== RUN TestManager_ApplyConfig_RulesetFileCleanup
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.066ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.094ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.080ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[1.715ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetFileCleanup (0.03s)
=== RUN TestManager_ApplyConfig_RulesetCleanupReadDirError
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.064ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.058ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.060ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.059ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:14 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[1.006ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetCleanupReadDirError (0.02s)
=== RUN TestManager_ApplyConfig_RulesetCleanupRemoveError
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.049ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.046ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.058ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.082ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.918ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetCleanupRemoveError (0.03s)
=== RUN TestManager_ApplyConfig_WAFModeBlockExplicit
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.064ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.108ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.074ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.073ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[2.915ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_WAFModeBlockExplicit (0.03s)
=== RUN TestManager_ApplyConfig
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.046ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.083ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.139ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.070ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[2.659ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[1.458ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[1.059ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig (0.03s)
=== RUN TestManager_ApplyConfig_Failure
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.044ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.045ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.043ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.039ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.829ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[2.151ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[7.645ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_Failure (0.03s)
=== RUN TestManager_Ping
--- PASS: TestManager_Ping (0.00s)
=== RUN TestManager_GetCurrentConfig
--- PASS: TestManager_GetCurrentConfig (0.00s)
=== RUN TestManager_RotateSnapshots
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.062ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.068ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.048ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.045ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[4.836ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[1.322ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[1.434ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_RotateSnapshots (0.03s)
=== RUN TestManager_Rollback_Success
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.050ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.315ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.077ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.049ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.892ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[1.782ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:15 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.664ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.058ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.058ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.068ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.059ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[0.033ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[0.019ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.032ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_Rollback_Success (1.13s)
=== RUN TestManager_ApplyConfig_DBError
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:61 sql: database is closed
[0.039ms] [rows:0] SELECT * FROM `proxy_hosts`
--- PASS: TestManager_ApplyConfig_DBError (0.02s)
=== RUN TestManager_ApplyConfig_ValidationError
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.083ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.186ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.127ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.112ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[1.353ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[1.655ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.771ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_ValidationError (0.02s)
=== RUN TestManager_Rollback_Failure
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.070ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.050ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.048ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.049ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:85 no such table: security_configs
[1.034ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:93 no such table: security_rule_sets
[3.607ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:100 no such table: security_decisions
[0.951ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_Rollback_Failure (0.02s)
=== RUN TestComputeEffectiveFlags_DefaultsNoDB
--- PASS: TestComputeEffectiveFlags_DefaultsNoDB (0.00s)
=== RUN TestComputeEffectiveFlags_DB_CerberusDisabled
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.078ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" AND `settings`.`id` = 1 ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestComputeEffectiveFlags_DB_CerberusDisabled (0.00s)
=== RUN TestComputeEffectiveFlags_DB_CrowdSecExternal
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.215ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.087ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestComputeEffectiveFlags_DB_CrowdSecExternal (0.00s)
=== RUN TestComputeEffectiveFlags_DB_CrowdSecUnknown
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.097ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.077ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestComputeEffectiveFlags_DB_CrowdSecUnknown (0.00s)
=== RUN TestComputeEffectiveFlags_DB_CrowdSecLocal
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.075ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:371 record not found
[0.109ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestComputeEffectiveFlags_DB_CrowdSecLocal (0.00s)
=== RUN TestComputeEffectiveFlags_DB_ACLTrueAndFalse
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.093ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/03 13:11:16 /projects/Charon/backend/internal/caddy/manager.go:366 record not found
[0.066ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestComputeEffectiveFlags_DB_ACLTrueAndFalse (0.00s)
=== RUN TestNormalizeAdvancedConfig_MapWithNestedHandles
--- PASS: TestNormalizeAdvancedConfig_MapWithNestedHandles (0.00s)
=== RUN TestNormalizeAdvancedConfig_ArrayTopLevel
--- PASS: TestNormalizeAdvancedConfig_ArrayTopLevel (0.00s)
=== RUN TestNormalizeAdvancedConfig_DefaultPrimitives
--- PASS: TestNormalizeAdvancedConfig_DefaultPrimitives (0.00s)
=== RUN TestNormalizeAdvancedConfig_CoerceNonStandardTypes
--- PASS: TestNormalizeAdvancedConfig_CoerceNonStandardTypes (0.00s)
=== RUN TestNormalizeAdvancedConfig_JSONRoundtrip
--- PASS: TestNormalizeAdvancedConfig_JSONRoundtrip (0.00s)
=== RUN TestNormalizeAdvancedConfig_TopLevelHeaders
--- PASS: TestNormalizeAdvancedConfig_TopLevelHeaders (0.00s)
=== RUN TestNormalizeAdvancedConfig_HeadersAlreadyArray
--- PASS: TestNormalizeAdvancedConfig_HeadersAlreadyArray (0.00s)
=== RUN TestNormalizeAdvancedConfig_MapWithTopLevelHandle
--- PASS: TestNormalizeAdvancedConfig_MapWithTopLevelHandle (0.00s)
=== RUN TestReverseProxyHandler_PlexAndOthers
--- PASS: TestReverseProxyHandler_PlexAndOthers (0.00s)
=== RUN TestHandlers
--- PASS: TestHandlers (0.00s)
=== RUN TestValidate_NilConfig
--- PASS: TestValidate_NilConfig (0.00s)
=== RUN TestValidateHandler_MissingHandlerField
--- PASS: TestValidateHandler_MissingHandlerField (0.00s)
=== RUN TestValidateHandler_UnknownHandlerAllowed
--- PASS: TestValidateHandler_UnknownHandlerAllowed (0.00s)
=== RUN TestValidateHandler_FileServerAndStaticResponseAllowed
--- PASS: TestValidateHandler_FileServerAndStaticResponseAllowed (0.00s)
=== RUN TestValidateRoute_InvalidHandler
--- PASS: TestValidateRoute_InvalidHandler (0.00s)
=== RUN TestValidateListenAddr_InvalidHostName
--- PASS: TestValidateListenAddr_InvalidHostName (0.00s)
=== RUN TestValidateListenAddr_InvalidPortNonNumeric
--- PASS: TestValidateListenAddr_InvalidPortNonNumeric (0.00s)
=== RUN TestValidate_MarshalError
--- PASS: TestValidate_MarshalError (0.00s)
=== RUN TestValidate_EmptyConfig
--- PASS: TestValidate_EmptyConfig (0.00s)
=== RUN TestValidate_ValidConfig
--- PASS: TestValidate_ValidConfig (0.00s)
=== RUN TestValidate_DuplicateHosts
--- PASS: TestValidate_DuplicateHosts (0.00s)
=== RUN TestValidate_NoListenAddresses
--- PASS: TestValidate_NoListenAddresses (0.00s)
=== RUN TestValidate_InvalidPort
--- PASS: TestValidate_InvalidPort (0.00s)
=== RUN TestValidate_NoHandlers
--- PASS: TestValidate_NoHandlers (0.00s)
=== RUN TestValidateListenAddr
=== RUN TestValidateListenAddr/Valid
=== RUN TestValidateListenAddr/ValidIP
=== RUN TestValidateListenAddr/ValidTCP
=== RUN TestValidateListenAddr/ValidUDP
=== RUN TestValidateListenAddr/InvalidFormat
=== RUN TestValidateListenAddr/InvalidPort
=== RUN TestValidateListenAddr/InvalidPortNegative
=== RUN TestValidateListenAddr/InvalidIP
--- PASS: TestValidateListenAddr (0.00s)
--- PASS: TestValidateListenAddr/Valid (0.00s)
--- PASS: TestValidateListenAddr/ValidIP (0.00s)
--- PASS: TestValidateListenAddr/ValidTCP (0.00s)
--- PASS: TestValidateListenAddr/ValidUDP (0.00s)
--- PASS: TestValidateListenAddr/InvalidFormat (0.00s)
--- PASS: TestValidateListenAddr/InvalidPort (0.00s)
--- PASS: TestValidateListenAddr/InvalidPortNegative (0.00s)
--- PASS: TestValidateListenAddr/InvalidIP (0.00s)
=== RUN TestValidateReverseProxy
=== RUN TestValidateReverseProxy/Valid
=== RUN TestValidateReverseProxy/MissingUpstreams
=== RUN TestValidateReverseProxy/EmptyUpstreams
=== RUN TestValidateReverseProxy/MissingDial
=== RUN TestValidateReverseProxy/InvalidDial
--- PASS: TestValidateReverseProxy (0.00s)
--- PASS: TestValidateReverseProxy/Valid (0.00s)
--- PASS: TestValidateReverseProxy/MissingUpstreams (0.00s)
--- PASS: TestValidateReverseProxy/EmptyUpstreams (0.00s)
--- PASS: TestValidateReverseProxy/MissingDial (0.00s)
--- PASS: TestValidateReverseProxy/InvalidDial (0.00s)
PASS
coverage: 100.0% of statements
ok github.com/Wikid82/charon/backend/internal/caddy 2.923s coverage: 100.0% of statements
=== RUN TestIsEnabled_ConfigTrue
--- PASS: TestIsEnabled_ConfigTrue (0.00s)
=== RUN TestIsEnabled_WAFModeEnabled
--- PASS: TestIsEnabled_WAFModeEnabled (0.00s)
=== RUN TestIsEnabled_ACLModeEnabled
--- PASS: TestIsEnabled_ACLModeEnabled (0.00s)
=== RUN TestIsEnabled_RateLimitModeEnabled
--- PASS: TestIsEnabled_RateLimitModeEnabled (0.00s)
=== RUN TestIsEnabled_CrowdSecModeLocal
--- PASS: TestIsEnabled_CrowdSecModeLocal (0.00s)
=== RUN TestIsEnabled_DBSetting
--- PASS: TestIsEnabled_DBSetting (0.01s)
=== RUN TestIsEnabled_DBSettingCaseInsensitive
--- PASS: TestIsEnabled_DBSettingCaseInsensitive (0.00s)
=== RUN TestIsEnabled_DBSettingFalse
--- PASS: TestIsEnabled_DBSettingFalse (0.00s)
=== RUN TestIsEnabled_DefaultFalse
--- PASS: TestIsEnabled_DefaultFalse (0.00s)
=== RUN TestMiddleware_WAFBlocksPayload
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
time="2025-12-03T13:11:15Z" level=warning msg="WAF blocked request" decision=block mode=block path=/ query="q=<script>" source=waf
--- PASS: TestMiddleware_WAFBlocksPayload (0.01s)
=== RUN TestMiddleware_ACLBlocksClientIP
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
--- PASS: TestMiddleware_ACLBlocksClientIP (0.01s)
=== RUN TestMiddleware_ACLAllowsClientIP
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
--- PASS: TestMiddleware_ACLAllowsClientIP (0.01s)
=== RUN TestMiddleware_NotEnabledSkips
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
2025/12/03 13:11:15 /projects/Charon/backend/internal/cerberus/cerberus.go:51 record not found
[0.097ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestMiddleware_NotEnabledSkips (0.01s)
=== RUN TestMiddleware_WAFPassesWithNoPayload
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
--- PASS: TestMiddleware_WAFPassesWithNoPayload (0.01s)
=== RUN TestMiddleware_WAFMonitorLogsButDoesNotBlock
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
time="2025-12-03T13:11:15Z" level=info msg="WAF monitored request" decision=monitor mode=monitor path=/ query="q=<script>" source=waf
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
--- PASS: TestMiddleware_WAFMonitorLogsButDoesNotBlock (0.01s)
=== RUN TestMiddleware_ACLDisabledDoesNotBlock
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
--- PASS: TestMiddleware_ACLDisabledDoesNotBlock (0.00s)
=== RUN TestCerberus_IsEnabled_ConfigTrue
--- PASS: TestCerberus_IsEnabled_ConfigTrue (0.00s)
=== RUN TestCerberus_IsEnabled_DBSetting
--- PASS: TestCerberus_IsEnabled_DBSetting (0.00s)
=== RUN TestCerberus_IsEnabled_Disabled
cerberus_test.go:47: cfg: {CrowdSecMode: CrowdSecAPIURL: CrowdSecAPIKey: WAFMode: RateLimitMode: ACLMode: CerberusEnabled:false}
2025/12/03 13:11:15 /projects/Charon/backend/internal/cerberus/cerberus.go:51 record not found
[0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
cerberus_test.go:48: IsEnabled() -> false
2025/12/03 13:11:15 /projects/Charon/backend/internal/cerberus/cerberus.go:51 record not found
[0.072ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestCerberus_IsEnabled_Disabled (0.00s)
PASS
coverage: 100.0% of statements
ok github.com/Wikid82/charon/backend/internal/cerberus 1.113s coverage: 100.0% of statements
=== RUN TestLoad
--- PASS: TestLoad (0.00s)
=== RUN TestLoad_Defaults
--- PASS: TestLoad_Defaults (0.00s)
=== RUN TestLoad_CharonPrefersOverCPM
--- PASS: TestLoad_CharonPrefersOverCPM (0.00s)
=== RUN TestLoad_Error
--- PASS: TestLoad_Error (0.00s)
PASS
coverage: 91.7% of statements
ok github.com/Wikid82/charon/backend/internal/config 1.024s coverage: 91.7% of statements
=== RUN TestConnect
--- PASS: TestConnect (0.00s)
=== RUN TestConnect_Error
--- PASS: TestConnect_Error (0.00s)
PASS
coverage: 100.0% of statements
ok github.com/Wikid82/charon/backend/internal/database 1.039s coverage: 100.0% of statements
=== RUN TestDomain_BeforeCreate
--- PASS: TestDomain_BeforeCreate (0.01s)
=== RUN TestNotificationTemplate_BeforeCreate
--- PASS: TestNotificationTemplate_BeforeCreate (0.01s)
=== RUN TestUptimeHost_BeforeCreate
--- PASS: TestUptimeHost_BeforeCreate (0.03s)
=== RUN TestUptimeNotificationEvent_BeforeCreate
--- PASS: TestUptimeNotificationEvent_BeforeCreate (0.02s)
=== RUN TestNotification_BeforeCreate
--- PASS: TestNotification_BeforeCreate (0.00s)
=== RUN TestUser_SetPassword
--- PASS: TestUser_SetPassword (0.80s)
=== RUN TestUser_CheckPassword
--- PASS: TestUser_CheckPassword (2.32s)
=== RUN TestNotificationProvider_BeforeCreate
--- PASS: TestNotificationProvider_BeforeCreate (0.00s)
=== RUN TestUptimeMonitor_BeforeCreate
--- PASS: TestUptimeMonitor_BeforeCreate (0.00s)
PASS
coverage: 97.2% of statements
ok github.com/Wikid82/charon/backend/internal/models 4.248s coverage: 97.2% of statements
=== RUN TestNewRouter
[GIN] 2025/12/03 - 13:11:18 | 200 | 15.280782ms | | GET "/"
--- PASS: TestNewRouter (0.02s)
PASS
coverage: 90.9% of statements
ok github.com/Wikid82/charon/backend/internal/server 1.046s coverage: 90.9% of statements
=== RUN TestAccessListService_Create
=== RUN TestAccessListService_Create/create_whitelist_with_valid_IP_rules
=== RUN TestAccessListService_Create/create_geo_whitelist_with_valid_country_codes
=== RUN TestAccessListService_Create/create_local_network_only_ACL
=== RUN TestAccessListService_Create/fail_with_empty_name
=== RUN TestAccessListService_Create/fail_with_invalid_type
=== RUN TestAccessListService_Create/fail_with_invalid_IP_address
=== RUN TestAccessListService_Create/fail_geo-blocking_without_country_codes
=== RUN TestAccessListService_Create/fail_with_invalid_country_code
--- PASS: TestAccessListService_Create (0.02s)
--- PASS: TestAccessListService_Create/create_whitelist_with_valid_IP_rules (0.00s)
--- PASS: TestAccessListService_Create/create_geo_whitelist_with_valid_country_codes (0.00s)
--- PASS: TestAccessListService_Create/create_local_network_only_ACL (0.00s)
--- PASS: TestAccessListService_Create/fail_with_empty_name (0.00s)
--- PASS: TestAccessListService_Create/fail_with_invalid_type (0.00s)
--- PASS: TestAccessListService_Create/fail_with_invalid_IP_address (0.00s)
--- PASS: TestAccessListService_Create/fail_geo-blocking_without_country_codes (0.00s)
--- PASS: TestAccessListService_Create/fail_with_invalid_country_code (0.00s)
=== RUN TestAccessListService_GetByID
=== RUN TestAccessListService_GetByID/get_existing_ACL
=== RUN TestAccessListService_GetByID/get_non-existent_ACL
2025/12/03 13:11:20 /projects/Charon/backend/internal/services/access_list_service.go:91 record not found
[0.136ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 99999 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListService_GetByID (0.01s)
--- PASS: TestAccessListService_GetByID/get_existing_ACL (0.00s)
--- PASS: TestAccessListService_GetByID/get_non-existent_ACL (0.00s)
=== RUN TestAccessListService_GetByUUID
=== RUN TestAccessListService_GetByUUID/get_existing_ACL_by_UUID
=== RUN TestAccessListService_GetByUUID/get_non-existent_ACL_by_UUID
2025/12/03 13:11:20 /projects/Charon/backend/internal/services/access_list_service.go:103 record not found
[0.094ms] [rows:0] SELECT * FROM `access_lists` WHERE uuid = "non-existent-uuid" ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListService_GetByUUID (0.01s)
--- PASS: TestAccessListService_GetByUUID/get_existing_ACL_by_UUID (0.00s)
--- PASS: TestAccessListService_GetByUUID/get_non-existent_ACL_by_UUID (0.00s)
=== RUN TestAccessListService_List
=== RUN TestAccessListService_List/list_all_ACLs
--- PASS: TestAccessListService_List (0.01s)
--- PASS: TestAccessListService_List/list_all_ACLs (0.00s)
=== RUN TestAccessListService_Update
=== RUN TestAccessListService_Update/update_successfully
=== RUN TestAccessListService_Update/fail_update_on_non-existent_ACL
2025/12/03 13:11:20 /projects/Charon/backend/internal/services/access_list_service.go:91 record not found
[0.110ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 99999 ORDER BY `access_lists`.`id` LIMIT 1
=== RUN TestAccessListService_Update/fail_update_with_invalid_data
--- PASS: TestAccessListService_Update (0.01s)
--- PASS: TestAccessListService_Update/update_successfully (0.00s)
--- PASS: TestAccessListService_Update/fail_update_on_non-existent_ACL (0.00s)
--- PASS: TestAccessListService_Update/fail_update_with_invalid_data (0.00s)
=== RUN TestAccessListService_Delete
=== RUN TestAccessListService_Delete/delete_successfully
2025/12/03 13:11:20 /projects/Charon/backend/internal/services/access_list_service.go:91 record not found
[0.071ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 1 ORDER BY `access_lists`.`id` LIMIT 1
=== RUN TestAccessListService_Delete/fail_delete_non-existent_ACL
=== RUN TestAccessListService_Delete/fail_delete_ACL_in_use
--- PASS: TestAccessListService_Delete (0.01s)
--- PASS: TestAccessListService_Delete/delete_successfully (0.00s)
--- PASS: TestAccessListService_Delete/fail_delete_non-existent_ACL (0.00s)
--- PASS: TestAccessListService_Delete/fail_delete_ACL_in_use (0.00s)
=== RUN TestAccessListService_TestIP
=== RUN TestAccessListService_TestIP/whitelist_allows_matching_IP
=== RUN TestAccessListService_TestIP/whitelist_blocks_non-matching_IP
=== RUN TestAccessListService_TestIP/blacklist_blocks_matching_IP
=== RUN TestAccessListService_TestIP/blacklist_allows_non-matching_IP
=== RUN TestAccessListService_TestIP/local_network_only_allows_RFC1918
=== RUN TestAccessListService_TestIP/disabled_ACL_allows_all
=== RUN TestAccessListService_TestIP/fail_with_invalid_IP
--- PASS: TestAccessListService_TestIP (0.01s)
--- PASS: TestAccessListService_TestIP/whitelist_allows_matching_IP (0.00s)
--- PASS: TestAccessListService_TestIP/whitelist_blocks_non-matching_IP (0.00s)
--- PASS: TestAccessListService_TestIP/blacklist_blocks_matching_IP (0.00s)
--- PASS: TestAccessListService_TestIP/blacklist_allows_non-matching_IP (0.00s)
--- PASS: TestAccessListService_TestIP/local_network_only_allows_RFC1918 (0.00s)
--- PASS: TestAccessListService_TestIP/disabled_ACL_allows_all (0.00s)
--- PASS: TestAccessListService_TestIP/fail_with_invalid_IP (0.00s)
=== RUN TestAccessListService_GetTemplates
--- PASS: TestAccessListService_GetTemplates (0.01s)
=== RUN TestAccessListService_Validation
=== RUN TestAccessListService_Validation/validate_CIDR_formats
=== RUN TestAccessListService_Validation/validate_country_codes
=== RUN TestAccessListService_Validation/validate_types
--- PASS: TestAccessListService_Validation (0.01s)
--- PASS: TestAccessListService_Validation/validate_CIDR_formats (0.00s)
--- PASS: TestAccessListService_Validation/validate_country_codes (0.00s)
--- PASS: TestAccessListService_Validation/validate_types (0.00s)
=== RUN TestAuthService_Register
--- PASS: TestAuthService_Register (1.52s)
=== RUN TestAuthService_Login
--- PASS: TestAuthService_Login (5.31s)
=== RUN TestAuthService_ChangePassword
2025/12/03 13:11:31 /projects/Charon/backend/internal/services/auth_service.go:113 record not found
[0.207ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestAuthService_ChangePassword (4.37s)
=== RUN TestAuthService_ValidateToken
--- PASS: TestAuthService_ValidateToken (1.53s)
=== RUN TestAuthService_GetUserByID
2025/12/03 13:11:33 /projects/Charon/backend/internal/services/auth_service.go:147 record not found
[0.084ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestAuthService_GetUserByID (0.74s)
=== RUN TestBackupService_CreateAndList
--- PASS: TestBackupService_CreateAndList (0.01s)
=== RUN TestBackupService_Restore_ZipSlip
--- PASS: TestBackupService_Restore_ZipSlip (0.00s)
=== RUN TestBackupService_PathTraversal
--- PASS: TestBackupService_PathTraversal (0.00s)
=== RUN TestBackupService_RunScheduledBackup
time="2025-12-03T13:11:33Z" level=info msg="Starting scheduled backup"
time="2025-12-03T13:11:33Z" level=warning msg="Warning: could not backup caddy dir" error="lstat /tmp/TestBackupService_RunScheduledBackup1679362788/001/data/caddy: no such file or directory"
time="2025-12-03T13:11:33Z" level=info msg="Scheduled backup created" backup=backup_2025-12-03_13-11-33.zip
--- PASS: TestBackupService_RunScheduledBackup (0.00s)
=== RUN TestBackupService_CreateBackup_Errors
=== RUN TestBackupService_CreateBackup_Errors/missing_database_file
=== RUN TestBackupService_CreateBackup_Errors/cannot_create_backup_directory
--- PASS: TestBackupService_CreateBackup_Errors (0.00s)
--- PASS: TestBackupService_CreateBackup_Errors/missing_database_file (0.00s)
--- PASS: TestBackupService_CreateBackup_Errors/cannot_create_backup_directory (0.00s)
=== RUN TestBackupService_RestoreBackup_Errors
=== RUN TestBackupService_RestoreBackup_Errors/non-existent_backup
=== RUN TestBackupService_RestoreBackup_Errors/invalid_zip_file
--- PASS: TestBackupService_RestoreBackup_Errors (0.00s)
--- PASS: TestBackupService_RestoreBackup_Errors/non-existent_backup (0.00s)
--- PASS: TestBackupService_RestoreBackup_Errors/invalid_zip_file (0.00s)
=== RUN TestBackupService_ListBackups_EmptyDir
--- PASS: TestBackupService_ListBackups_EmptyDir (0.00s)
=== RUN TestBackupService_ListBackups_MissingDir
--- PASS: TestBackupService_ListBackups_MissingDir (0.00s)
=== RUN TestCertificateService_GetCertificateInfo
time="2025-12-03T13:11:33Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/cert-test1819787141/certificates
2025/12/03 13:11:33 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.224ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:33 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[4.394ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:33Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-03T13:11:33Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/cert-test1819787141/certificates
2025/12/03 13:11:33 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.102ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "expired.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:33 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.025ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:33Z" level=info msg="CertificateService: disk sync complete" count=2
--- PASS: TestCertificateService_GetCertificateInfo (0.15s)
=== RUN TestCertificateService_UploadAndDelete
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_UploadAndDelete577779087/001/certificates
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_UploadAndDelete577779087/001/certificates
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_UploadAndDelete577779087/001/certificates
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_UploadAndDelete577779087/001/certificates
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=0
--- PASS: TestCertificateService_UploadAndDelete (0.17s)
=== RUN TestCertificateService_Persistence
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_Persistence4135381056/001/certificates
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.203ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "persist.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: deleting ACME cert file" path=/tmp/TestCertificateService_Persistence4135381056/001/certificates/acme-v02.api.letsencrypt.org-directory/persist.example.com/persist.example.com.crt
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_Persistence4135381056/001/certificates
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=0
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service_test.go:267 record not found
[0.107ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE (domains = "persist.example.com" AND provider = "letsencrypt") AND `ssl_certificates`.`id` = 1 ORDER BY `ssl_certificates`.`id` LIMIT 1
--- PASS: TestCertificateService_Persistence (0.11s)
=== RUN TestCertificateService_UploadCertificate_Errors
=== RUN TestCertificateService_UploadCertificate_Errors/invalid_PEM_format
=== RUN TestCertificateService_UploadCertificate_Errors/empty_certificate
=== RUN TestCertificateService_UploadCertificate_Errors/certificate_without_key_allowed
=== RUN TestCertificateService_UploadCertificate_Errors/valid_certificate_with_name
=== RUN TestCertificateService_UploadCertificate_Errors/expired_certificate_can_be_uploaded
--- PASS: TestCertificateService_UploadCertificate_Errors (0.40s)
--- PASS: TestCertificateService_UploadCertificate_Errors/invalid_PEM_format (0.00s)
--- PASS: TestCertificateService_UploadCertificate_Errors/empty_certificate (0.00s)
--- PASS: TestCertificateService_UploadCertificate_Errors/certificate_without_key_allowed (0.09s)
--- PASS: TestCertificateService_UploadCertificate_Errors/valid_certificate_with_name (0.15s)
--- PASS: TestCertificateService_UploadCertificate_Errors/expired_certificate_can_be_uploaded (0.16s)
=== RUN TestCertificateService_ListCertificates_EdgeCases
=== RUN TestCertificateService_ListCertificates_EdgeCases/empty_certificates_directory
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesempty_certific3506643386/001/certificates
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesempty_certific3506643386/001/certificates
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[2.665ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=0
=== RUN TestCertificateService_ListCertificates_EdgeCases/certificates_directory_does_not_exist
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasescertificates_d2048929609/001/does-not-exist/certificates
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasescertificates_d2048929609/001/does-not-exist/certificates
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.792ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=0
=== RUN TestCertificateService_ListCertificates_EdgeCases/invalid_certificate_files_are_skipped
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesinvalid_certif2881955154/001/certificates
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[2.256ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=0
=== RUN TestCertificateService_ListCertificates_EdgeCases/multiple_certificates_from_different_providers
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesmultiple_certi106121119/001/certificates
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.126ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "le.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.223ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=2
--- PASS: TestCertificateService_ListCertificates_EdgeCases (0.15s)
--- PASS: TestCertificateService_ListCertificates_EdgeCases/empty_certificates_directory (0.01s)
--- PASS: TestCertificateService_ListCertificates_EdgeCases/certificates_directory_does_not_exist (0.01s)
--- PASS: TestCertificateService_ListCertificates_EdgeCases/invalid_certificate_files_are_skipped (0.01s)
--- PASS: TestCertificateService_ListCertificates_EdgeCases/multiple_certificates_from_different_providers (0.13s)
=== RUN TestCertificateService_DeleteCertificate_Errors
=== RUN TestCertificateService_DeleteCertificate_Errors/delete_non-existent_certificate
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:410 record not found
[0.085ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE `ssl_certificates`.`id` = 99999 ORDER BY `ssl_certificates`.`id` LIMIT 1
=== RUN TestCertificateService_DeleteCertificate_Errors/delete_certificate_when_file_already_removed
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service_test.go:462 record not found
[0.099ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE id = 1 ORDER BY `ssl_certificates`.`id` LIMIT 1
--- PASS: TestCertificateService_DeleteCertificate_Errors (0.07s)
--- PASS: TestCertificateService_DeleteCertificate_Errors/delete_non-existent_certificate (0.00s)
--- PASS: TestCertificateService_DeleteCertificate_Errors/delete_certificate_when_file_already_removed (0.06s)
=== RUN TestCertificateService_StagingCertificates
=== RUN TestCertificateService_StagingCertificates/staging_certificate_detected_by_path
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesstaging_certificate_d726373456/001/certificates
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.221ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "staging.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:34 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.138ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:34Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_StagingCertificates/production_cert_preferred_over_staging
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesproduction_cert_prefe3854489670/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.172ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "both.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.100ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_StagingCertificates/upgrade_from_staging_to_production
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesupgrade_from_staging_342927476/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.214ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "upgrade.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[4.785ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesupgrade_from_staging_342927476/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.027ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
--- PASS: TestCertificateService_StagingCertificates (0.39s)
--- PASS: TestCertificateService_StagingCertificates/staging_certificate_detected_by_path (0.08s)
--- PASS: TestCertificateService_StagingCertificates/production_cert_preferred_over_staging (0.28s)
--- PASS: TestCertificateService_StagingCertificates/upgrade_from_staging_to_production (0.03s)
=== RUN TestCertificateService_ExpiringStatus
=== RUN TestCertificateService_ExpiringStatus/certificate_expiring_within_30_days
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatuscertificate_expiring_withi1207211675/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.180ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "expiring.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.218ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_ExpiringStatus/certificate_valid_for_more_than_30_days
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatuscertificate_valid_for_more1055223402/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.173ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "valid-long.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[2.845ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_ExpiringStatus/staging_cert_always_untrusted_even_if_expiring
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatusstaging_cert_always_untrus1183873335/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.190ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "staging-expiring.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.834ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
--- PASS: TestCertificateService_ExpiringStatus (0.29s)
--- PASS: TestCertificateService_ExpiringStatus/certificate_expiring_within_30_days (0.16s)
--- PASS: TestCertificateService_ExpiringStatus/certificate_valid_for_more_than_30_days (0.08s)
--- PASS: TestCertificateService_ExpiringStatus/staging_cert_always_untrusted_even_if_expiring (0.05s)
=== RUN TestCertificateService_StaleCertCleanup
=== RUN TestCertificateService_StaleCertCleanup/stale_DB_entries_removed_when_file_deleted
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StaleCertCleanupstale_DB_entries_removed2284661980/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.200ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "stale.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.035ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StaleCertCleanupstale_DB_entries_removed2284661980/001/certificates
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: removed stale DB cert" domain=stale.example.com
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.025ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=0
--- PASS: TestCertificateService_StaleCertCleanup (0.04s)
--- PASS: TestCertificateService_StaleCertCleanup/stale_DB_entries_removed_when_file_deleted (0.04s)
=== RUN TestCertificateService_CertificateWithSANs
=== RUN TestCertificateService_CertificateWithSANs/certificate_with_SANs_uses_joined_domains
--- PASS: TestCertificateService_CertificateWithSANs (0.24s)
--- PASS: TestCertificateService_CertificateWithSANs/certificate_with_SANs_uses_joined_domains (0.24s)
=== RUN TestCertificateService_CacheBehavior
=== RUN TestCertificateService_CacheBehavior/cache_returns_consistent_results
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorcache_returns_consistent_re1671282508/001/certificates
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorcache_returns_consistent_re1671282508/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[4.300ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_CacheBehavior/invalidate_cache_forces_resync
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res3113149211/001/certificates
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res3113149211/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.079ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res3113149211/001/certificates
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res3113149211/001/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.036ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=2
=== RUN TestCertificateService_CacheBehavior/refreshCacheFromDB_used_when_directory_nonexistent
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorrefreshCacheFromDB_used_whe187893614/001/nonexistent/certificates
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorrefreshCacheFromDB_used_whe187893614/001/nonexistent/certificates
2025/12/03 13:11:35 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[3.226ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-03T13:11:35Z" level=info msg="CertificateService: disk sync complete" count=1
--- PASS: TestCertificateService_CacheBehavior (0.18s)
--- PASS: TestCertificateService_CacheBehavior/cache_returns_consistent_results (0.12s)
--- PASS: TestCertificateService_CacheBehavior/invalidate_cache_forces_resync (0.05s)
--- PASS: TestCertificateService_CacheBehavior/refreshCacheFromDB_used_when_directory_nonexistent (0.01s)
=== RUN TestDockerService_New
--- PASS: TestDockerService_New (0.00s)
=== RUN TestDockerService_ListContainers
--- PASS: TestDockerService_ListContainers (0.01s)
=== RUN TestLogService
--- PASS: TestLogService (0.00s)
=== RUN TestNotificationService_Create
--- PASS: TestNotificationService_Create (0.00s)
=== RUN TestNotificationService_List
--- PASS: TestNotificationService_List (0.01s)
=== RUN TestNotificationService_MarkAsRead
--- PASS: TestNotificationService_MarkAsRead (0.00s)
=== RUN TestNotificationService_MarkAllAsRead
--- PASS: TestNotificationService_MarkAllAsRead (0.01s)
=== RUN TestNotificationService_Providers
--- PASS: TestNotificationService_Providers (0.00s)
=== RUN TestNotificationService_TestProvider_Webhook
--- PASS: TestNotificationService_TestProvider_Webhook (0.01s)
=== RUN TestNotificationService_SendExternal
--- PASS: TestNotificationService_SendExternal (0.01s)
=== RUN TestNotificationService_SendExternal_MinimalVsDetailedTemplates
--- PASS: TestNotificationService_SendExternal_MinimalVsDetailedTemplates (0.01s)
=== RUN TestNotificationService_SendExternal_Filtered
--- PASS: TestNotificationService_SendExternal_Filtered (0.10s)
=== RUN TestNotificationService_SendExternal_Shoutrrr
--- PASS: TestNotificationService_SendExternal_Shoutrrr (0.11s)
=== RUN TestNormalizeURL
=== RUN TestNormalizeURL/Discord_HTTPS
=== RUN TestNormalizeURL/Discord_HTTPS_with_app
=== RUN TestNormalizeURL/Discord_Shoutrrr
=== RUN TestNormalizeURL/Other_Service
--- PASS: TestNormalizeURL (0.00s)
--- PASS: TestNormalizeURL/Discord_HTTPS (0.00s)
--- PASS: TestNormalizeURL/Discord_HTTPS_with_app (0.00s)
--- PASS: TestNormalizeURL/Discord_Shoutrrr (0.00s)
--- PASS: TestNormalizeURL/Other_Service (0.00s)
=== RUN TestNotificationService_SendCustomWebhook_Errors
=== RUN TestNotificationService_SendCustomWebhook_Errors/invalid_URL
=== RUN TestNotificationService_SendCustomWebhook_Errors/unreachable_host
=== RUN TestNotificationService_SendCustomWebhook_Errors/server_returns_error
=== RUN TestNotificationService_SendCustomWebhook_Errors/valid_custom_payload_template
=== RUN TestNotificationService_SendCustomWebhook_Errors/default_payload_without_template
--- PASS: TestNotificationService_SendCustomWebhook_Errors (0.01s)
--- PASS: TestNotificationService_SendCustomWebhook_Errors/invalid_URL (0.00s)
--- PASS: TestNotificationService_SendCustomWebhook_Errors/unreachable_host (0.00s)
--- PASS: TestNotificationService_SendCustomWebhook_Errors/server_returns_error (0.00s)
--- PASS: TestNotificationService_SendCustomWebhook_Errors/valid_custom_payload_template (0.00s)
--- PASS: TestNotificationService_SendCustomWebhook_Errors/default_payload_without_template (0.00s)
=== RUN TestNotificationService_SendCustomWebhook_PropagatesRequestID
--- PASS: TestNotificationService_SendCustomWebhook_PropagatesRequestID (0.01s)
=== RUN TestNotificationService_TestProvider_Errors
=== RUN TestNotificationService_TestProvider_Errors/unsupported_provider_type
=== RUN TestNotificationService_TestProvider_Errors/webhook_with_invalid_URL
=== RUN TestNotificationService_TestProvider_Errors/discord_with_invalid_URL_format
=== RUN TestNotificationService_TestProvider_Errors/slack_with_unreachable_webhook
=== RUN TestNotificationService_TestProvider_Errors/webhook_success
--- PASS: TestNotificationService_TestProvider_Errors (0.01s)
--- PASS: TestNotificationService_TestProvider_Errors/unsupported_provider_type (0.00s)
--- PASS: TestNotificationService_TestProvider_Errors/webhook_with_invalid_URL (0.00s)
--- PASS: TestNotificationService_TestProvider_Errors/discord_with_invalid_URL_format (0.00s)
--- PASS: TestNotificationService_TestProvider_Errors/slack_with_unreachable_webhook (0.00s)
--- PASS: TestNotificationService_TestProvider_Errors/webhook_success (0.00s)
=== RUN TestValidateWebhookURL_PrivateIP
--- PASS: TestValidateWebhookURL_PrivateIP (0.00s)
=== RUN TestNotificationService_SendExternal_EdgeCases
=== RUN TestNotificationService_SendExternal_EdgeCases/no_enabled_providers
=== RUN TestNotificationService_SendExternal_EdgeCases/provider_filtered_by_category
time="2025-12-03T13:11:36Z" level=error msg="Failed to send notification" error="failed to send discord notification: response status code 400 Bad Request" provider="Test Discord"
=== RUN TestNotificationService_SendExternal_EdgeCases/custom_data_passed_to_webhook
--- PASS: TestNotificationService_SendExternal_EdgeCases (0.23s)
--- PASS: TestNotificationService_SendExternal_EdgeCases/no_enabled_providers (0.06s)
--- PASS: TestNotificationService_SendExternal_EdgeCases/provider_filtered_by_category (0.06s)
--- PASS: TestNotificationService_SendExternal_EdgeCases/custom_data_passed_to_webhook (0.11s)
=== RUN TestNotificationService_RenderTemplate
--- PASS: TestNotificationService_RenderTemplate (0.00s)
=== RUN TestNotificationService_CreateProvider_Validation
=== RUN TestNotificationService_CreateProvider_Validation/creates_provider_with_defaults
=== RUN TestNotificationService_CreateProvider_Validation/updates_existing_provider
=== RUN TestNotificationService_CreateProvider_Validation/deletes_non-existent_provider
--- PASS: TestNotificationService_CreateProvider_Validation (0.00s)
--- PASS: TestNotificationService_CreateProvider_Validation/creates_provider_with_defaults (0.00s)
--- PASS: TestNotificationService_CreateProvider_Validation/updates_existing_provider (0.00s)
--- PASS: TestNotificationService_CreateProvider_Validation/deletes_non-existent_provider (0.00s)
=== RUN TestNotificationService_CreateProvider_InvalidCustomTemplate
=== RUN TestNotificationService_CreateProvider_InvalidCustomTemplate/invalid_custom_template_on_create
=== RUN TestNotificationService_CreateProvider_InvalidCustomTemplate/invalid_custom_template_on_update
--- PASS: TestNotificationService_CreateProvider_InvalidCustomTemplate (0.00s)
--- PASS: TestNotificationService_CreateProvider_InvalidCustomTemplate/invalid_custom_template_on_create (0.00s)
--- PASS: TestNotificationService_CreateProvider_InvalidCustomTemplate/invalid_custom_template_on_update (0.00s)
=== RUN TestProxyHostService_ValidateUniqueDomain
=== RUN TestProxyHostService_ValidateUniqueDomain/New_unique_domain
=== RUN TestProxyHostService_ValidateUniqueDomain/Duplicate_domain
=== RUN TestProxyHostService_ValidateUniqueDomain/Same_domain_but_excluded_ID_(update_self)
--- PASS: TestProxyHostService_ValidateUniqueDomain (0.01s)
--- PASS: TestProxyHostService_ValidateUniqueDomain/New_unique_domain (0.00s)
--- PASS: TestProxyHostService_ValidateUniqueDomain/Duplicate_domain (0.00s)
--- PASS: TestProxyHostService_ValidateUniqueDomain/Same_domain_but_excluded_ID_(update_self) (0.00s)
=== RUN TestProxyHostService_CRUD
2025/12/03 13:11:36 /projects/Charon/backend/internal/services/proxyhost_service.go:102 record not found
[0.058ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE `proxy_hosts`.`id` = 1 ORDER BY `proxy_hosts`.`id` LIMIT 1
--- PASS: TestProxyHostService_CRUD (0.01s)
=== RUN TestProxyHostService_TestConnection
--- PASS: TestProxyHostService_TestConnection (0.01s)
=== RUN TestRemoteServerService_ValidateUniqueServer
--- PASS: TestRemoteServerService_ValidateUniqueServer (0.00s)
=== RUN TestRemoteServerService_CRUD
2025/12/03 13:11:36 /projects/Charon/backend/internal/services/remoteserver_service.go:68 record not found
[0.070ms] [rows:0] SELECT * FROM `remote_servers` WHERE `remote_servers`.`id` = 2 ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerService_CRUD (0.01s)
=== RUN TestSecurityService_Upsert_ValidateAdminWhitelist
2025/12/03 13:11:36 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.092ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Upsert_ValidateAdminWhitelist (0.01s)
=== RUN TestSecurityService_BreakGlassTokenLifecycle
2025/12/03 13:11:36 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.100ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_BreakGlassTokenLifecycle (2.28s)
=== RUN TestSecurityService_LogDecisionAndList
--- PASS: TestSecurityService_LogDecisionAndList (0.01s)
=== RUN TestSecurityService_UpsertRuleSet
2025/12/03 13:11:38 /projects/Charon/backend/internal/services/security_service.go:204 record not found
[0.073ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityService_UpsertRuleSet (0.01s)
=== RUN TestSecurityService_UpsertRuleSet_ContentTooLarge
--- PASS: TestSecurityService_UpsertRuleSet_ContentTooLarge (0.01s)
=== RUN TestSecurityService_DeleteRuleSet
2025/12/03 13:11:38 /projects/Charon/backend/internal/services/security_service.go:204 record not found
[0.063ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityService_DeleteRuleSet (0.01s)
=== RUN TestSecurityService_Upsert_RejectExternalMode
2025/12/03 13:11:38 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.104ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Upsert_RejectExternalMode (0.01s)
=== RUN TestSecurityService_GenerateBreakGlassToken_NewConfig
2025/12/03 13:11:39 /projects/Charon/backend/internal/services/security_service.go:113 record not found
[0.252ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "newconfig" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_GenerateBreakGlassToken_NewConfig (1.48s)
=== RUN TestSecurityService_GenerateBreakGlassToken_UpdateExisting
2025/12/03 13:11:40 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.075ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_GenerateBreakGlassToken_UpdateExisting (3.03s)
=== RUN TestSecurityService_VerifyBreakGlassToken_NoConfig
2025/12/03 13:11:43 /projects/Charon/backend/internal/services/security_service.go:134 record not found
[0.104ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "nonexistent" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_VerifyBreakGlassToken_NoConfig (0.01s)
=== RUN TestSecurityService_VerifyBreakGlassToken_NoHash
2025/12/03 13:11:43 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.069ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_VerifyBreakGlassToken_NoHash (0.01s)
=== RUN TestSecurityService_VerifyBreakGlassToken_WrongToken
2025/12/03 13:11:44 /projects/Charon/backend/internal/services/security_service.go:113 record not found
[0.301ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_VerifyBreakGlassToken_WrongToken (4.51s)
=== RUN TestSecurityService_Get_NotFound
2025/12/03 13:11:47 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.089ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Get_NotFound (0.01s)
=== RUN TestSecurityService_Upsert_PreserveBreakGlassHash
2025/12/03 13:11:48 /projects/Charon/backend/internal/services/security_service.go:113 record not found
[0.263ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Upsert_PreserveBreakGlassHash (1.45s)
=== RUN TestUpdateService_CheckForUpdates
--- PASS: TestUpdateService_CheckForUpdates (0.00s)
=== RUN TestUptimeService_CheckAll
2025/12/03 13:11:49 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.092ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:49 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.067ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:49Z" level=info msg="Created UptimeHost" host=127.0.0.1 host_id=b47523ad-3736-4c67-af64-2ff24542c990
2025/12/03 13:11:49 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.094ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 2 ORDER BY `uptime_monitors`.`id` LIMIT 1
time="2025-12-03T13:11:50Z" level=info msg="Host status changed" host_ip=127.0.0.1 host_name="127.0.0.1:38665" message="dial tcp 127.0.0.1:35887: connect: connection refused" new=down old=up
time="2025-12-03T13:11:50Z" level=info msg="Sent consolidated DOWN notification" host_name="127.0.0.1:38665" service_count=1
--- PASS: TestUptimeService_CheckAll (1.76s)
=== RUN TestUptimeService_ListMonitors
--- PASS: TestUptimeService_ListMonitors (0.03s)
=== RUN TestUptimeService_GetMonitorByID
=== RUN TestUptimeService_GetMonitorByID/get_existing_monitor
=== RUN TestUptimeService_GetMonitorByID/get_non-existent_monitor
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:819 record not found
[0.113ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent" ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestUptimeService_GetMonitorByID (0.03s)
--- PASS: TestUptimeService_GetMonitorByID/get_existing_monitor (0.00s)
--- PASS: TestUptimeService_GetMonitorByID/get_non-existent_monitor (0.00s)
=== RUN TestUptimeService_GetMonitorHistory
--- PASS: TestUptimeService_GetMonitorHistory (0.03s)
=== RUN TestUptimeService_SyncMonitors_Errors
=== RUN TestUptimeService_SyncMonitors_Errors/database_error_during_proxy_host_fetch
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:104 sql: database is closed
[0.044ms] [rows:0] SELECT * FROM `proxy_hosts`
=== RUN TestUptimeService_SyncMonitors_Errors/creates_monitors_for_new_hosts
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.110ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.081ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host= host_id=6a8a576a-1d4f-4fd5-9822-e456b8c97928
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.082ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 2 ORDER BY `uptime_monitors`.`id` LIMIT 1
=== RUN TestUptimeService_SyncMonitors_Errors/orphaned_monitors_persist_after_host_deletion
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.105ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.080ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host= host_id=d222e11c-5c90-4628-a513-4960160b47bf
--- PASS: TestUptimeService_SyncMonitors_Errors (0.09s)
--- PASS: TestUptimeService_SyncMonitors_Errors/database_error_during_proxy_host_fetch (0.03s)
--- PASS: TestUptimeService_SyncMonitors_Errors/creates_monitors_for_new_hosts (0.03s)
--- PASS: TestUptimeService_SyncMonitors_Errors/orphaned_monitors_persist_after_host_deletion (0.03s)
=== RUN TestUptimeService_SyncMonitors_NameSync
=== RUN TestUptimeService_SyncMonitors_NameSync/syncs_name_from_proxy_host_when_changed
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.098ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.088ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host= host_id=e4fa9292-1b78-4797-a58b-73f8e8ffce2c
=== RUN TestUptimeService_SyncMonitors_NameSync/uses_domain_name_when_proxy_host_name_is_empty
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.185ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.082ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host= host_id=8d71ddc2-cbd2-4baf-a9d3-3f21031bb1e9
=== RUN TestUptimeService_SyncMonitors_NameSync/updates_monitor_name_when_host_name_becomes_empty
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.109ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.101ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host= host_id=3f2cbd62-8566-4a28-a9dd-acb629e6a5ff
--- PASS: TestUptimeService_SyncMonitors_NameSync (0.09s)
--- PASS: TestUptimeService_SyncMonitors_NameSync/syncs_name_from_proxy_host_when_changed (0.03s)
--- PASS: TestUptimeService_SyncMonitors_NameSync/uses_domain_name_when_proxy_host_name_is_empty (0.03s)
--- PASS: TestUptimeService_SyncMonitors_NameSync/updates_monitor_name_when_host_name_becomes_empty (0.03s)
=== RUN TestUptimeService_SyncMonitors_TCPMigration
=== RUN TestUptimeService_SyncMonitors_TCPMigration/migrates_TCP_monitor_to_HTTP_for_public_URL
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.084ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=backend.local host_id=4a61273f-cc56-49c3-9a94-8e5368d47ee2
time="2025-12-03T13:11:51Z" level=info msg="Migrated monitor for host 1 to check public URL: http://public.com" host_id=1
=== RUN TestUptimeService_SyncMonitors_TCPMigration/does_not_migrate_TCP_monitor_with_custom_URL
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.090ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=backend.local host_id=b707300c-90ce-43ca-b624-f52f3fdf5b66
--- PASS: TestUptimeService_SyncMonitors_TCPMigration (0.05s)
--- PASS: TestUptimeService_SyncMonitors_TCPMigration/migrates_TCP_monitor_to_HTTP_for_public_URL (0.02s)
--- PASS: TestUptimeService_SyncMonitors_TCPMigration/does_not_migrate_TCP_monitor_with_custom_URL (0.03s)
=== RUN TestUptimeService_SyncMonitors_HTTPSUpgrade
=== RUN TestUptimeService_SyncMonitors_HTTPSUpgrade/upgrades_HTTP_to_HTTPS_when_SSL_forced
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.125ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host= host_id=8d9823f2-1ed9-46c6-a2f1-bf320d77da7e
time="2025-12-03T13:11:51Z" level=info msg="Upgraded monitor for host 1 to HTTPS: https://secure.com" host_id=1
=== RUN TestUptimeService_SyncMonitors_HTTPSUpgrade/does_not_downgrade_HTTPS_when_SSL_not_forced
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.145ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host= host_id=955e0e1f-ef88-4b37-94af-c2e9447d755f
--- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade (0.06s)
--- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade/upgrades_HTTP_to_HTTPS_when_SSL_forced (0.03s)
--- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade/does_not_downgrade_HTTPS_when_SSL_not_forced (0.03s)
=== RUN TestUptimeService_SyncMonitors_RemoteServers
=== RUN TestUptimeService_SyncMonitors_RemoteServers/creates_monitor_for_new_remote_server
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:209 record not found
[0.126ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.093ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=backend.local host_id=3950db08-12c4-4abc-842b-03f67757ac4f
=== RUN TestUptimeService_SyncMonitors_RemoteServers/creates_TCP_monitor_for_remote_server_without_scheme
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:209 record not found
[0.098ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.088ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "tcp.backend" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=tcp.backend host_id=46fc9394-3cf2-42ef-a9e0-06d7ab6c417e
=== RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_name_changes
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:209 record not found
[0.091ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.097ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=server.local host_id=d497f41a-452f-45f9-83f9-c8a5ce0f1464
=== RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_URL_changes
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:209 record not found
[0.120ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.088ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "old.host" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=old.host host_id=6d6c3e5e-b6ed-47b1-b783-adc842de1245
=== RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_enabled_status
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:209 record not found
[0.141ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.085ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=server.local host_id=96d81828-357e-49a9-a0a4-5c86a6216cbd
=== RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_scheme_change_from_TCP_to_HTTPS
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:209 record not found
[0.101ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.094ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=server.local host_id=3f5d66db-72d9-4f97-8713-2dec93284202
--- PASS: TestUptimeService_SyncMonitors_RemoteServers (0.18s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/creates_monitor_for_new_remote_server (0.03s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/creates_TCP_monitor_for_remote_server_without_scheme (0.03s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_name_changes (0.03s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_URL_changes (0.03s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_enabled_status (0.03s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_scheme_change_from_TCP_to_HTTPS (0.03s)
=== RUN TestUptimeService_CheckAll_Errors
=== RUN TestUptimeService_CheckAll_Errors/handles_empty_monitor_list
=== RUN TestUptimeService_CheckAll_Errors/orphan_monitors_don't_prevent_check_execution
=== RUN TestUptimeService_CheckAll_Errors/handles_timeout_for_slow_hosts
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.084ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:51 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.080ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "192.0.2.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:51Z" level=info msg="Created UptimeHost" host=192.0.2.1 host_id=d78b31df-a04a-472a-a02e-f4e180ffa71a
--- PASS: TestUptimeService_CheckAll_Errors (7.23s)
--- PASS: TestUptimeService_CheckAll_Errors/handles_empty_monitor_list (0.07s)
--- PASS: TestUptimeService_CheckAll_Errors/orphan_monitors_don't_prevent_check_execution (0.13s)
--- PASS: TestUptimeService_CheckAll_Errors/handles_timeout_for_slow_hosts (7.03s)
=== RUN TestUptimeService_CheckMonitor_EdgeCases
=== RUN TestUptimeService_CheckMonitor_EdgeCases/invalid_URL_format
=== RUN TestUptimeService_CheckMonitor_EdgeCases/http_404_response_treated_as_down
2025/12/03 13:11:59 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.106ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:11:59 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.081ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:11:59Z" level=info msg="Created UptimeHost" host=127.0.0.1 host_id=b6f20121-9b36-4a27-8156-69701d6be994
=== RUN TestUptimeService_CheckMonitor_EdgeCases/https_URL_without_valid_certificate
--- PASS: TestUptimeService_CheckMonitor_EdgeCases (3.95s)
--- PASS: TestUptimeService_CheckMonitor_EdgeCases/invalid_URL_format (0.54s)
--- PASS: TestUptimeService_CheckMonitor_EdgeCases/http_404_response_treated_as_down (0.39s)
--- PASS: TestUptimeService_CheckMonitor_EdgeCases/https_URL_without_valid_certificate (3.03s)
=== RUN TestUptimeService_GetMonitorHistory_EdgeCases
=== RUN TestUptimeService_GetMonitorHistory_EdgeCases/non-existent_monitor
=== RUN TestUptimeService_GetMonitorHistory_EdgeCases/limit_parameter_respected
--- PASS: TestUptimeService_GetMonitorHistory_EdgeCases (0.08s)
--- PASS: TestUptimeService_GetMonitorHistory_EdgeCases/non-existent_monitor (0.03s)
--- PASS: TestUptimeService_GetMonitorHistory_EdgeCases/limit_parameter_respected (0.05s)
=== RUN TestUptimeService_ListMonitors_EdgeCases
=== RUN TestUptimeService_ListMonitors_EdgeCases/empty_database
=== RUN TestUptimeService_ListMonitors_EdgeCases/monitors_with_associated_proxy_hosts
--- PASS: TestUptimeService_ListMonitors_EdgeCases (0.09s)
--- PASS: TestUptimeService_ListMonitors_EdgeCases/empty_database (0.04s)
--- PASS: TestUptimeService_ListMonitors_EdgeCases/monitors_with_associated_proxy_hosts (0.04s)
=== RUN TestUptimeService_UpdateMonitor
=== RUN TestUptimeService_UpdateMonitor/update_max_retries
=== RUN TestUptimeService_UpdateMonitor/update_interval
=== RUN TestUptimeService_UpdateMonitor/update_non-existent_monitor
2025/12/03 13:12:03 /projects/Charon/backend/internal/services/uptime_service.go:833 record not found
[0.319ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent" ORDER BY `uptime_monitors`.`id` LIMIT 1
=== RUN TestUptimeService_UpdateMonitor/update_multiple_fields
--- PASS: TestUptimeService_UpdateMonitor (0.16s)
--- PASS: TestUptimeService_UpdateMonitor/update_max_retries (0.04s)
--- PASS: TestUptimeService_UpdateMonitor/update_interval (0.03s)
--- PASS: TestUptimeService_UpdateMonitor/update_non-existent_monitor (0.05s)
--- PASS: TestUptimeService_UpdateMonitor/update_multiple_fields (0.04s)
=== RUN TestUptimeService_NotificationBatching
=== RUN TestUptimeService_NotificationBatching/batches_multiple_service_failures_on_same_host
time="2025-12-03T13:12:03Z" level=info msg="Created pending notification batch" host="Test Server" monitor="Service A"
time="2025-12-03T13:12:03Z" level=info msg="Added to pending notification batch" count=2 host="Test Server" monitor="Service B"
time="2025-12-03T13:12:03Z" level=info msg="Added to pending notification batch" count=3 host="Test Server" monitor="Service C"
time="2025-12-03T13:12:03Z" level=info msg="Sent batched DOWN notification" count=3 host="Test Server"
=== RUN TestUptimeService_NotificationBatching/single_service_down_gets_individual_notification
time="2025-12-03T13:12:03Z" level=info msg="Created pending notification batch" host="Single Service Host" monitor="Lonely Service"
time="2025-12-03T13:12:03Z" level=info msg="Sent batched DOWN notification" count=1 host="Single Service Host"
--- PASS: TestUptimeService_NotificationBatching (0.08s)
--- PASS: TestUptimeService_NotificationBatching/batches_multiple_service_failures_on_same_host (0.04s)
--- PASS: TestUptimeService_NotificationBatching/single_service_down_gets_individual_notification (0.04s)
=== RUN TestUptimeService_HostLevelCheck
=== RUN TestUptimeService_HostLevelCheck/creates_uptime_host_during_sync
2025/12/03 13:12:03 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.192ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:12:03 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.134ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.50" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:12:03Z" level=info msg="Created UptimeHost" host=10.0.0.50 host_id=9da3b524-3df6-4ed8-9094-cee6ee4c3432
=== RUN TestUptimeService_HostLevelCheck/groups_multiple_services_on_same_host
2025/12/03 13:12:03 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.120ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:12:03 /projects/Charon/backend/internal/services/uptime_service.go:284 record not found
[0.090ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.100" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-03T13:12:03Z" level=info msg="Created UptimeHost" host=10.0.0.100 host_id=42f967ec-1f0d-43bb-b251-b0de76a08ff5
2025/12/03 13:12:03 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.120ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 2 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/03 13:12:03 /projects/Charon/backend/internal/services/uptime_service.go:110 record not found
[0.115ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 3 ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestUptimeService_HostLevelCheck (0.09s)
--- PASS: TestUptimeService_HostLevelCheck/creates_uptime_host_during_sync (0.04s)
--- PASS: TestUptimeService_HostLevelCheck/groups_multiple_services_on_same_host (0.05s)
=== RUN TestFormatDuration
--- PASS: TestFormatDuration (0.00s)
=== RUN TestUpdateMonitorEnabled_Unit
--- PASS: TestUpdateMonitorEnabled_Unit (0.01s)
=== RUN TestDeleteMonitorDeletesHeartbeats_Unit
2025/12/03 13:12:03 /projects/Charon/backend/internal/services/uptime_service_unit_test.go:52 record not found
[0.105ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "992d32f7-13ee-45ad-afa2-5eae99660191" ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestDeleteMonitorDeletesHeartbeats_Unit (0.02s)
PASS
coverage: 80.7% of statements
ok github.com/Wikid82/charon/backend/internal/services 44.295s coverage: 80.7% of statements
? github.com/Wikid82/charon/backend/internal/trace [no test files]
=== RUN TestFull
--- PASS: TestFull (0.00s)
PASS
coverage: 100.0% of statements
ok github.com/Wikid82/charon/backend/internal/version 1.022s coverage: 100.0% of statements