Files
Charon/backend/test-output.txt
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
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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