Files
Charon/backend/test-output-final.txt
GitHub Actions 9ad3afbd22 Fix Rate Limiting Issues
- Updated Definition of Done report with detailed checks and results for backend and frontend tests.
- Documented issues related to race conditions and test failures in QA reports.
- Improved security scan notes and code cleanup status in QA reports.
- Added summaries for rate limit integration test fixes, including root causes and resolutions.
- Introduced new debug and integration scripts for rate limit testing.
- Updated security documentation to reflect changes in configuration and troubleshooting steps.
- Enhanced troubleshooting guides for CrowdSec and Go language server (gopls) errors.
- Improved frontend and scripts README files for clarity and usage instructions.
2025-12-12 19:21:44 +00:00

6489 lines
464 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.
=== RUN TestResetPasswordCommand_Succeeds
--- PASS: TestResetPasswordCommand_Succeeds (0.14s)
PASS
ok github.com/Wikid82/charon/backend/cmd/api (cached)
=== RUN TestSeedMain_Smoke
{"level":"info","msg":"✓ Database migrated successfully","time":"2025-12-12T19:01:35Z"}
{"level":"info","msg":"✓ Created remote server: Local Docker Registry (localhost:5000)","server":"Local Docker Registry","time":"2025-12-12T19:01:35Z"}
{"level":"info","msg":"✓ Created remote server: Development API Server (192.168.1.100:8080)","server":"Development API Server","time":"2025-12-12T19:01:35Z"}
{"level":"info","msg":"✓ Created remote server: Staging Web App (staging.internal:3000)","server":"Staging Web App","time":"2025-12-12T19:01:35Z"}
{"level":"info","msg":"✓ Created remote server: Database Admin (localhost:8081)","server":"Database Admin","time":"2025-12-12T19:01:35Z"}
{"host":"app.local.dev","level":"info","msg":"✓ Created proxy host: app.local.dev -\u003e http://localhost:3000","time":"2025-12-12T19:01:35Z"}
{"host":"api.local.dev","level":"info","msg":"✓ Created proxy host: api.local.dev -\u003e http://192.168.1.100:8080","time":"2025-12-12T19:01:35Z"}
{"host":"docker.local.dev","level":"info","msg":"✓ Created proxy host: docker.local.dev -\u003e http://localhost:5000","time":"2025-12-12T19:01:35Z"}
{"level":"info","msg":"✓ Created setting: app_name = Charon","setting":"app_name","time":"2025-12-12T19:01:35Z"}
{"level":"info","msg":"✓ Created setting: default_scheme = http","setting":"default_scheme","time":"2025-12-12T19:01:35Z"}
{"level":"info","msg":"✓ Created setting: enable_ssl_by_default = false","setting":"enable_ssl_by_default","time":"2025-12-12T19:01:35Z"}
2025/12/12 19:01:35 /projects/Charon/backend/cmd/seed/main.go:218 record not found
[0.135ms] [rows:0] SELECT * FROM `users` WHERE email = "admin@localhost" ORDER BY `users`.`id` LIMIT 1
{"level":"info","msg":"✓ Created default user: admin@localhost","time":"2025-12-12T19:01:35Z","user":"admin@localhost"}
{"level":"info","msg":"\n✓ Database seeding completed successfully!","time":"2025-12-12T19:01:35Z"}
{"level":"info","msg":" You can now start the application and see sample data.","time":"2025-12-12T19:01:35Z"}
--- PASS: TestSeedMain_Smoke (0.19s)
PASS
ok github.com/Wikid82/charon/backend/cmd/seed (cached)
? github.com/Wikid82/charon/backend/integration [no test files]
=== RUN TestAccessListHandler_SetGeoIPService
--- PASS: TestAccessListHandler_SetGeoIPService (0.00s)
=== RUN TestAccessListHandler_SetGeoIPService_Nil
--- PASS: TestAccessListHandler_SetGeoIPService_Nil (0.00s)
=== RUN TestAccessListHandler_Get_InvalidID
--- PASS: TestAccessListHandler_Get_InvalidID (0.00s)
=== RUN TestAccessListHandler_Update_InvalidID
--- PASS: TestAccessListHandler_Update_InvalidID (0.00s)
=== RUN TestAccessListHandler_Update_InvalidJSON
--- PASS: TestAccessListHandler_Update_InvalidJSON (0.00s)
=== RUN TestAccessListHandler_Delete_InvalidID
--- PASS: TestAccessListHandler_Delete_InvalidID (0.00s)
=== RUN TestAccessListHandler_TestIP_InvalidID
--- PASS: TestAccessListHandler_TestIP_InvalidID (0.00s)
=== RUN TestAccessListHandler_TestIP_MissingIPAddress
--- PASS: TestAccessListHandler_TestIP_MissingIPAddress (0.00s)
=== RUN TestAccessListHandler_List_DBError
2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:129 no such table: access_lists
[0.105ms] [rows:0] SELECT * FROM `access_lists` ORDER BY updated_at desc
--- PASS: TestAccessListHandler_List_DBError (0.00s)
=== RUN TestAccessListHandler_Get_DBError
2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 no such table: access_lists
[0.095ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 1 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListHandler_Get_DBError (0.00s)
=== RUN TestAccessListHandler_Delete_InternalError
2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:162 no such table: proxy_hosts
[0.329ms] [rows:0] SELECT count(*) FROM `proxy_hosts` WHERE access_list_id = 1
--- PASS: TestAccessListHandler_Delete_InternalError (0.00s)
=== RUN TestAccessListHandler_Update_InvalidType
--- PASS: TestAccessListHandler_Update_InvalidType (0.00s)
=== RUN TestAccessListHandler_Create_InvalidJSON
--- PASS: TestAccessListHandler_Create_InvalidJSON (0.00s)
=== RUN TestAccessListHandler_TestIP_Blacklist
--- PASS: TestAccessListHandler_TestIP_Blacklist (0.00s)
=== RUN TestAccessListHandler_TestIP_GeoWhitelist
--- PASS: TestAccessListHandler_TestIP_GeoWhitelist (0.01s)
=== RUN TestAccessListHandler_TestIP_LocalNetworkOnly
--- PASS: TestAccessListHandler_TestIP_LocalNetworkOnly (0.00s)
=== RUN TestAccessListHandler_TestIP_InternalError
2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 no such table: access_lists
[0.104ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 1 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListHandler_TestIP_InternalError (0.00s)
=== 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.00s)
--- 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.00s)
=== RUN TestAccessListHandler_Get
=== RUN TestAccessListHandler_Get/get_existing_ACL
=== RUN TestAccessListHandler_Get/get_non-existent_ACL
2025/12/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found
[0.026ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListHandler_Get (0.00s)
--- 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/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found
[0.029ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListHandler_Update (0.00s)
--- 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.00s)
--- 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/12 19:05:33 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found
[0.022ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 9999 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListHandler_TestIP (0.00s)
--- 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.00s)
=== RUN TestImportHandler_Commit_InvalidJSON
--- PASS: TestImportHandler_Commit_InvalidJSON (0.00s)
=== RUN TestImportHandler_Commit_InvalidSessionUUID
2025/12/12 19:05:33 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.048ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "passwd" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Commit_InvalidSessionUUID (0.00s)
=== RUN TestImportHandler_Commit_SessionNotFound
2025/12/12 19:05:33 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.061ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "nonexistent-session" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Commit_SessionNotFound (0.00s)
=== RUN TestRemoteServerHandler_TestConnection_Unreachable
--- PASS: TestRemoteServerHandler_TestConnection_Unreachable (5.01s)
=== RUN TestSecurityHandler_GetConfig_InternalError
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:37 no such table: security_configs
[0.041ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GetConfig_InternalError (0.00s)
=== RUN TestSecurityHandler_UpdateConfig_ApplyCaddyError
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.032ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "test" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_UpdateConfig_ApplyCaddyError (0.00s)
=== RUN TestSecurityHandler_GenerateBreakGlass_Error
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:121 no such table: security_configs
[0.079ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GenerateBreakGlass_Error (0.06s)
=== RUN TestSecurityHandler_ListDecisions_Error
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:178 no such table: security_decisions
[0.018ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc LIMIT 50
--- PASS: TestSecurityHandler_ListDecisions_Error (0.00s)
=== RUN TestSecurityHandler_ListRuleSets_Error
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:243 no such table: security_rule_sets
[0.010ms] [rows:0] SELECT * FROM `security_rule_sets`
--- PASS: TestSecurityHandler_ListRuleSets_Error (0.00s)
=== RUN TestSecurityHandler_UpsertRuleSet_Error
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:212 no such table: security_rule_sets
[0.015ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "test-ruleset" ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityHandler_UpsertRuleSet_Error (0.00s)
=== RUN TestSecurityHandler_CreateDecision_LogError
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:168 no such table: security_decisions
[0.042ms] [rows:0] INSERT INTO `security_decisions` (`uuid`,`source`,`action`,`ip`,`host`,`rule_id`,`details`,`created_at`) VALUES ("98eeedc9-a1f0-4dbf-b3a2-6558ed7ed345","manual","ban","192.168.1.1","","","","2025-12-12 19:05:38.782") RETURNING `id`
--- PASS: TestSecurityHandler_CreateDecision_LogError (0.00s)
=== RUN TestSecurityHandler_DeleteRuleSet_Error
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/security_service.go:234 no such table: security_rule_sets
[0.015ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE `security_rule_sets`.`id` = 999 ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityHandler_DeleteRuleSet_Error (0.00s)
=== RUN TestCrowdsec_ImportConfig_EmptyUpload
--- PASS: TestCrowdsec_ImportConfig_EmptyUpload (0.00s)
=== RUN TestBackupHandler_List_DBError
--- PASS: TestBackupHandler_List_DBError (0.00s)
=== RUN TestImportHandler_UploadMulti_InvalidJSON
--- PASS: TestImportHandler_UploadMulti_InvalidJSON (0.00s)
=== RUN TestImportHandler_UploadMulti_MissingCaddyfile
--- PASS: TestImportHandler_UploadMulti_MissingCaddyfile (0.00s)
=== RUN TestImportHandler_UploadMulti_EmptyContent
--- PASS: TestImportHandler_UploadMulti_EmptyContent (0.00s)
=== RUN TestImportHandler_UploadMulti_PathTraversal
--- PASS: TestImportHandler_UploadMulti_PathTraversal (0.00s)
=== RUN TestLogsHandler_Download_PathTraversal
--- PASS: TestLogsHandler_Download_PathTraversal (0.00s)
=== RUN TestLogsHandler_Download_NotFound
--- PASS: TestLogsHandler_Download_NotFound (0.00s)
=== RUN TestLogsHandler_Download_Success
--- PASS: TestLogsHandler_Download_Success (0.00s)
=== RUN TestImportHandler_Upload_InvalidJSON
time="2025-12-12T19:05:38Z" level=error msg="Import Upload: failed to bind JSON" error="invalid character 'o' in literal null (expecting 'u')"
--- PASS: TestImportHandler_Upload_InvalidJSON (0.00s)
=== RUN TestImportHandler_Upload_EmptyContent
time="2025-12-12T19:05:38Z" level=error msg="Import Upload: failed to bind JSON" error="Key: 'Content' Error:Field validation for 'Content' failed on the 'required' tag"
--- PASS: TestImportHandler_Upload_EmptyContent (0.00s)
=== RUN TestBackupHandler_List_ServiceError
--- PASS: TestBackupHandler_List_ServiceError (0.00s)
=== RUN TestBackupHandler_Delete_PathTraversal
--- PASS: TestBackupHandler_Delete_PathTraversal (0.00s)
=== RUN TestBackupHandler_Delete_InternalError2
--- PASS: TestBackupHandler_Delete_InternalError2 (0.00s)
=== RUN TestRemoteServerHandler_TestConnection_NotFound2
2025/12/12 19:05:38 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.025ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "nonexistent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerHandler_TestConnection_NotFound2 (0.00s)
=== RUN TestRemoteServerHandler_TestConnectionCustom_Unreachable2
--- PASS: TestRemoteServerHandler_TestConnectionCustom_Unreachable2 (5.00s)
=== RUN TestAuthHandler_Register_InvalidJSON
--- PASS: TestAuthHandler_Register_InvalidJSON (0.00s)
=== RUN TestHealthHandler_Basic
--- PASS: TestHealthHandler_Basic (0.00s)
=== RUN TestBackupHandler_Create_Error
time="2025-12-12T19:05:43Z" level=error msg="Failed to create backup" action=create_backup error="database file not found: /tmp/TestBackupHandler_Create_Error2570738469/001/data/charon.db"
--- PASS: TestBackupHandler_Create_Error (0.00s)
=== RUN TestSettingsHandler_GetSettings_Error
2025/12/12 19:05:43 /projects/Charon/backend/internal/api/handlers/settings_handler.go:28 no such table: settings
[0.016ms] [rows:0] SELECT * FROM `settings`
--- PASS: TestSettingsHandler_GetSettings_Error (0.00s)
=== RUN TestSettingsHandler_UpdateSetting_InvalidJSON
--- PASS: TestSettingsHandler_UpdateSetting_InvalidJSON (0.00s)
=== RUN TestRemoteServerHandler_TestConnection_Reachable
--- PASS: TestRemoteServerHandler_TestConnection_Reachable (0.00s)
=== RUN TestRemoteServerHandler_TestConnection_EmptyHost
--- PASS: TestRemoteServerHandler_TestConnection_EmptyHost (0.00s)
=== RUN TestImportHandler_UploadMulti_ValidCaddyfile
time="2025-12-12T19:05:43Z" level=error msg="Import UploadMulti: import failed" error="caddy adapt failed: exec: \"caddy\": executable file not found in $PATH (output: )" mainCaddyfile=Caddyfile preview="example.com { reverse_proxy localhost:8080 }"
--- PASS: TestImportHandler_UploadMulti_ValidCaddyfile (0.00s)
=== RUN TestImportHandler_UploadMulti_SubdirFile
time="2025-12-12T19:05:43Z" level=error msg="Import UploadMulti: import failed" error="caddy adapt failed: exec: \"caddy\": executable file not found in $PATH (output: )" mainCaddyfile=Caddyfile preview="import sites/*"
--- PASS: TestImportHandler_UploadMulti_SubdirFile (0.00s)
=== RUN TestAuthHandler_Login
--- PASS: TestAuthHandler_Login (0.14s)
=== RUN TestSetSecureCookie_HTTPS_Strict
--- PASS: TestSetSecureCookie_HTTPS_Strict (0.00s)
=== RUN TestSetSecureCookie_HTTP_Lax
--- PASS: TestSetSecureCookie_HTTP_Lax (0.00s)
=== RUN TestAuthHandler_Login_Errors
2025/12/12 19:05:43 /projects/Charon/backend/internal/services/auth_service.go:64 record not found
[0.047ms] [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.07s)
=== RUN TestAuthHandler_Register_Duplicate
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/auth_service.go:54 UNIQUE constraint failed: users.email
[0.303ms] [rows:0] INSERT INTO `users` (`uuid`,`email`,`api_key`,`password_hash`,`name`,`role`,`enabled`,`failed_login_attempts`,`locked_until`,`last_login`,`invite_token`,`invite_expires`,`invited_at`,`invited_by`,`invite_status`,`permission_mode`,`created_at`,`updated_at`) VALUES ("2066b858-15a5-4e3e-a247-328d64408a45","dup@example.com","028e52ea-4eb3-4c1b-b7bd-eab0e113c993","$2a$10$mS9P7qy/pHxKUm7VnmiQhOnc8.OMl/z51Ods7bxSp4CCylswN2nlK","Dup User","user",true,0,NULL,NULL,"",NULL,NULL,NULL,"","allow_all","2025-12-12 19:05:44.028","2025-12-12 19:05:44.028") RETURNING `id`
--- PASS: TestAuthHandler_Register_Duplicate (0.07s)
=== RUN TestAuthHandler_Logout
--- PASS: TestAuthHandler_Logout (0.00s)
=== RUN TestAuthHandler_Me
--- PASS: TestAuthHandler_Me (0.00s)
=== RUN TestAuthHandler_Me_NotFound
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/auth_service.go:147 record not found
[0.044ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestAuthHandler_Me_NotFound (0.00s)
=== RUN TestAuthHandler_ChangePassword
--- PASS: TestAuthHandler_ChangePassword (0.26s)
=== RUN TestAuthHandler_ChangePassword_WrongOld
--- PASS: TestAuthHandler_ChangePassword_WrongOld (0.13s)
=== RUN TestAuthHandler_ChangePassword_Errors
--- PASS: TestAuthHandler_ChangePassword_Errors (0.00s)
=== RUN TestNewAuthHandlerWithDB
--- PASS: TestNewAuthHandlerWithDB (0.00s)
=== RUN TestAuthHandler_Verify_NoCookie
--- PASS: TestAuthHandler_Verify_NoCookie (0.00s)
=== RUN TestAuthHandler_Verify_InvalidToken
--- PASS: TestAuthHandler_Verify_InvalidToken (0.00s)
=== RUN TestAuthHandler_Verify_ValidToken
--- PASS: TestAuthHandler_Verify_ValidToken (0.08s)
=== RUN TestAuthHandler_Verify_BearerToken
--- PASS: TestAuthHandler_Verify_BearerToken (0.07s)
=== RUN TestAuthHandler_Verify_DisabledUser
--- PASS: TestAuthHandler_Verify_DisabledUser (0.07s)
=== RUN TestAuthHandler_Verify_ForwardAuthDenied
--- PASS: TestAuthHandler_Verify_ForwardAuthDenied (0.07s)
=== RUN TestAuthHandler_VerifyStatus_NotAuthenticated
--- PASS: TestAuthHandler_VerifyStatus_NotAuthenticated (0.00s)
=== RUN TestAuthHandler_VerifyStatus_InvalidToken
--- PASS: TestAuthHandler_VerifyStatus_InvalidToken (0.00s)
=== RUN TestAuthHandler_VerifyStatus_Authenticated
--- PASS: TestAuthHandler_VerifyStatus_Authenticated (0.07s)
=== RUN TestAuthHandler_VerifyStatus_DisabledUser
--- PASS: TestAuthHandler_VerifyStatus_DisabledUser (0.07s)
=== RUN TestAuthHandler_GetAccessibleHosts_Unauthorized
--- PASS: TestAuthHandler_GetAccessibleHosts_Unauthorized (0.00s)
=== RUN TestAuthHandler_GetAccessibleHosts_AllowAll
--- PASS: TestAuthHandler_GetAccessibleHosts_AllowAll (0.00s)
=== RUN TestAuthHandler_GetAccessibleHosts_DenyAll
--- PASS: TestAuthHandler_GetAccessibleHosts_DenyAll (0.00s)
=== RUN TestAuthHandler_GetAccessibleHosts_PermittedHosts
--- PASS: TestAuthHandler_GetAccessibleHosts_PermittedHosts (0.01s)
=== RUN TestAuthHandler_GetAccessibleHosts_UserNotFound
2025/12/12 19:05:44 /projects/Charon/backend/internal/api/handlers/auth_handler.go:334 record not found
[0.047ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 99999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestAuthHandler_GetAccessibleHosts_UserNotFound (0.00s)
=== RUN TestAuthHandler_CheckHostAccess_Unauthorized
--- PASS: TestAuthHandler_CheckHostAccess_Unauthorized (0.00s)
=== RUN TestAuthHandler_CheckHostAccess_InvalidHostID
--- PASS: TestAuthHandler_CheckHostAccess_InvalidHostID (0.00s)
=== RUN TestAuthHandler_CheckHostAccess_Allowed
--- PASS: TestAuthHandler_CheckHostAccess_Allowed (0.00s)
=== RUN TestAuthHandler_CheckHostAccess_Denied
--- PASS: TestAuthHandler_CheckHostAccess_Denied (0.00s)
=== RUN TestBackupHandlerSanitizesFilename
--- PASS: TestBackupHandlerSanitizesFilename (0.00s)
=== RUN TestBackupLifecycle
--- PASS: TestBackupLifecycle (0.00s)
=== RUN TestBackupHandler_Errors
--- PASS: TestBackupHandler_Errors (0.00s)
=== RUN TestBackupHandler_List_Success
--- PASS: TestBackupHandler_List_Success (0.00s)
=== 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.00s)
=== RUN TestCertificateHandler_List_DBError
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:198 no such table: ssl_certificates
[0.166ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%"
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:226 no such table: ssl_certificates
[0.013ms] [rows:0] SELECT * FROM `ssl_certificates`
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:226 no such table: ssl_certificates
[0.009ms] [rows:0] SELECT * FROM `ssl_certificates`
--- PASS: TestCertificateHandler_List_DBError (0.00s)
=== RUN TestCertificateHandler_Delete_InvalidID
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:198 no such table: ssl_certificates
[0.024ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%"
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:226 no such table: ssl_certificates
[0.009ms] [rows:0] SELECT * FROM `ssl_certificates`
--- PASS: TestCertificateHandler_Delete_InvalidID (0.00s)
=== RUN TestCertificateHandler_Delete_NotFound
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:410 record not found
[0.061ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE `ssl_certificates`.`id` = 9999 ORDER BY `ssl_certificates`.`id` LIMIT 1
--- PASS: TestCertificateHandler_Delete_NotFound (0.00s)
=== RUN TestCertificateHandler_Delete_NoBackupService
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:198 no such table: ssl_certificates
[0.209ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%"
2025/12/12 19:05:44 /projects/Charon/backend/internal/services/certificate_service.go:226 no such table: ssl_certificates
[0.012ms] [rows:0] SELECT * FROM `ssl_certificates`
--- PASS: TestCertificateHandler_Delete_NoBackupService (0.20s)
=== RUN TestCertificateHandler_Delete_CheckUsageDBError
2025/12/12 19:05:45 /projects/Charon/backend/internal/services/certificate_service.go:392 no such table: proxy_hosts
[0.799ms] [rows:0] SELECT count(*) FROM `proxy_hosts` WHERE certificate_id = 1
--- PASS: TestCertificateHandler_Delete_CheckUsageDBError (0.00s)
=== RUN TestCertificateHandler_List_WithCertificates
2025/12/12 19:05:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.411ms] [rows:0] SELECT * FROM `proxy_hosts`
--- PASS: TestCertificateHandler_List_WithCertificates (0.00s)
=== RUN TestCertificateHandler_Delete_RequiresAuth
--- PASS: TestCertificateHandler_Delete_RequiresAuth (0.00s)
=== RUN TestCertificateHandler_List_RequiresAuth
--- PASS: TestCertificateHandler_List_RequiresAuth (0.00s)
=== RUN TestCertificateHandler_Upload_RequiresAuth
--- PASS: TestCertificateHandler_Upload_RequiresAuth (0.00s)
=== RUN TestCertificateHandler_Delete_DiskSpaceCheck
--- PASS: TestCertificateHandler_Delete_DiskSpaceCheck (0.00s)
=== RUN TestCertificateHandler_Delete_NotificationRateLimiting
--- PASS: TestCertificateHandler_Delete_NotificationRateLimiting (0.00s)
=== RUN TestDeleteCertificate_InUse
--- PASS: TestDeleteCertificate_InUse (0.00s)
=== RUN TestDeleteCertificate_CreatesBackup
2025/12/12 19:05:45 /projects/Charon/backend/internal/services/certificate_service.go:441 database table is locked: ssl_certificates
[0.059ms] [rows:0] DELETE FROM `ssl_certificates` WHERE id = 1
certificate_handler_test.go:125: expected 200 OK, got 500, body={"error":"failed to delete certificate"}
--- FAIL: TestDeleteCertificate_CreatesBackup (0.00s)
=== RUN TestDeleteCertificate_BackupFailure
--- PASS: TestDeleteCertificate_BackupFailure (0.00s)
=== RUN TestDeleteCertificate_InUse_NoBackup
--- PASS: TestDeleteCertificate_InUse_NoBackup (0.00s)
=== RUN TestCertificateHandler_List
--- PASS: TestCertificateHandler_List (0.00s)
=== RUN TestCertificateHandler_Upload_MissingName
--- PASS: TestCertificateHandler_Upload_MissingName (0.00s)
=== RUN TestCertificateHandler_Upload_MissingCertFile
--- PASS: TestCertificateHandler_Upload_MissingCertFile (0.00s)
=== RUN TestCertificateHandler_Upload_MissingKeyFile
--- PASS: TestCertificateHandler_Upload_MissingKeyFile (0.00s)
=== RUN TestCertificateHandler_Upload_Success
--- PASS: TestCertificateHandler_Upload_Success (0.05s)
=== RUN TestBackupHandlerQuick
--- PASS: TestBackupHandlerQuick (0.00s)
=== RUN TestListPresetsShowsCachedStatus
--- PASS: TestListPresetsShowsCachedStatus (0.37s)
=== RUN TestCacheKeyPersistence
--- PASS: TestCacheKeyPersistence (0.00s)
=== RUN TestListDecisions_Success
--- PASS: TestListDecisions_Success (0.00s)
=== RUN TestListDecisions_EmptyList
--- PASS: TestListDecisions_EmptyList (0.00s)
=== RUN TestListDecisions_CscliError
--- PASS: TestListDecisions_CscliError (0.00s)
=== RUN TestListDecisions_InvalidJSON
--- PASS: TestListDecisions_InvalidJSON (0.00s)
=== RUN TestBanIP_Success
--- PASS: TestBanIP_Success (0.00s)
=== RUN TestBanIP_DefaultDuration
--- PASS: TestBanIP_DefaultDuration (0.00s)
=== RUN TestBanIP_MissingIP
--- PASS: TestBanIP_MissingIP (0.00s)
=== RUN TestBanIP_EmptyIP
--- PASS: TestBanIP_EmptyIP (0.00s)
=== RUN TestBanIP_CscliError
--- PASS: TestBanIP_CscliError (0.00s)
=== RUN TestUnbanIP_Success
--- PASS: TestUnbanIP_Success (0.00s)
=== RUN TestUnbanIP_CscliError
--- PASS: TestUnbanIP_CscliError (0.00s)
=== RUN TestListDecisions_MultipleDecisions
--- PASS: TestListDecisions_MultipleDecisions (0.00s)
=== RUN TestBanIP_InvalidJSON
--- PASS: TestBanIP_InvalidJSON (0.00s)
=== RUN TestDefaultCrowdsecExecutorPidFile
--- PASS: TestDefaultCrowdsecExecutorPidFile (0.00s)
=== RUN TestDefaultCrowdsecExecutorStartStatusStop
--- PASS: TestDefaultCrowdsecExecutorStartStatusStop (0.20s)
=== RUN TestDefaultCrowdsecExecutor_Status_NoPidFile
--- PASS: TestDefaultCrowdsecExecutor_Status_NoPidFile (0.00s)
=== RUN TestDefaultCrowdsecExecutor_Status_InvalidPid
--- PASS: TestDefaultCrowdsecExecutor_Status_InvalidPid (0.00s)
=== RUN TestDefaultCrowdsecExecutor_Status_NonExistentProcess
--- PASS: TestDefaultCrowdsecExecutor_Status_NonExistentProcess (0.00s)
=== RUN TestDefaultCrowdsecExecutor_Stop_NoPidFile
--- PASS: TestDefaultCrowdsecExecutor_Stop_NoPidFile (0.00s)
=== RUN TestDefaultCrowdsecExecutor_Stop_InvalidPid
--- PASS: TestDefaultCrowdsecExecutor_Stop_InvalidPid (0.00s)
=== RUN TestDefaultCrowdsecExecutor_Stop_NonExistentProcess
--- PASS: TestDefaultCrowdsecExecutor_Stop_NonExistentProcess (0.00s)
=== RUN TestDefaultCrowdsecExecutor_Start_InvalidBinary
--- PASS: TestDefaultCrowdsecExecutor_Start_InvalidBinary (0.00s)
=== RUN TestCrowdsec_Start_Error
--- PASS: TestCrowdsec_Start_Error (0.00s)
=== RUN TestCrowdsec_Stop_Error
--- PASS: TestCrowdsec_Stop_Error (0.00s)
=== RUN TestCrowdsec_Status_Error
--- PASS: TestCrowdsec_Status_Error (0.00s)
=== RUN TestCrowdsec_ReadFile_MissingPath
--- PASS: TestCrowdsec_ReadFile_MissingPath (0.00s)
=== RUN TestCrowdsec_ReadFile_PathTraversal
--- PASS: TestCrowdsec_ReadFile_PathTraversal (0.00s)
=== RUN TestCrowdsec_ReadFile_NotFound
--- PASS: TestCrowdsec_ReadFile_NotFound (0.00s)
=== RUN TestCrowdsec_WriteFile_InvalidPayload
--- PASS: TestCrowdsec_WriteFile_InvalidPayload (0.00s)
=== RUN TestCrowdsec_WriteFile_MissingPath
--- PASS: TestCrowdsec_WriteFile_MissingPath (0.00s)
=== RUN TestCrowdsec_WriteFile_PathTraversal
--- PASS: TestCrowdsec_WriteFile_PathTraversal (0.00s)
=== RUN TestCrowdsec_ExportConfig_NotFound
--- PASS: TestCrowdsec_ExportConfig_NotFound (0.00s)
=== RUN TestCrowdsec_ListFiles_EmptyDir
--- PASS: TestCrowdsec_ListFiles_EmptyDir (0.00s)
=== RUN TestCrowdsec_ListFiles_NonExistent
--- PASS: TestCrowdsec_ListFiles_NonExistent (0.00s)
=== RUN TestCrowdsec_ImportConfig_NoFile
--- PASS: TestCrowdsec_ImportConfig_NoFile (0.00s)
=== RUN TestCrowdsec_ReadFile_NestedPath
--- PASS: TestCrowdsec_ReadFile_NestedPath (0.00s)
=== RUN TestCrowdsec_WriteFile_Success
--- PASS: TestCrowdsec_WriteFile_Success (0.00s)
=== RUN TestCrowdsec_ListPresets_Disabled
--- PASS: TestCrowdsec_ListPresets_Disabled (0.00s)
=== RUN TestCrowdsec_ListPresets_Success
--- PASS: TestCrowdsec_ListPresets_Success (0.19s)
=== RUN TestCrowdsec_PullPreset_Validation
--- PASS: TestCrowdsec_PullPreset_Validation (0.00s)
=== RUN TestCrowdsec_ApplyPreset_Validation
--- PASS: TestCrowdsec_ApplyPreset_Validation (0.00s)
=== RUN TestCrowdsecEndpoints
--- PASS: TestCrowdsecEndpoints (0.00s)
=== RUN TestImportConfig
--- PASS: TestImportConfig (0.00s)
=== RUN TestImportCreatesBackup
--- PASS: TestImportCreatesBackup (0.00s)
=== RUN TestExportConfig
--- PASS: TestExportConfig (0.00s)
=== RUN TestListAndReadFile
--- PASS: TestListAndReadFile (0.00s)
=== RUN TestExportConfigStreamsArchive
--- PASS: TestExportConfigStreamsArchive (0.00s)
=== RUN TestWriteFileCreatesBackup
--- PASS: TestWriteFileCreatesBackup (0.00s)
=== RUN TestListPresetsCerberusDisabled
--- PASS: TestListPresetsCerberusDisabled (0.00s)
=== RUN TestReadFileInvalidPath
--- PASS: TestReadFileInvalidPath (0.00s)
=== RUN TestWriteFileInvalidPath
--- PASS: TestWriteFileInvalidPath (0.00s)
=== RUN TestWriteFileMissingPath
--- PASS: TestWriteFileMissingPath (0.00s)
=== RUN TestWriteFileInvalidPayload
--- PASS: TestWriteFileInvalidPayload (0.00s)
=== RUN TestImportConfigRequiresFile
--- PASS: TestImportConfigRequiresFile (0.00s)
=== RUN TestImportConfigRejectsEmptyUpload
--- PASS: TestImportConfigRejectsEmptyUpload (0.00s)
=== RUN TestListFilesMissingDir
--- PASS: TestListFilesMissingDir (0.00s)
=== RUN TestListFilesReturnsEntries
--- PASS: TestListFilesReturnsEntries (0.00s)
=== RUN TestIsCerberusEnabledFromDB
--- PASS: TestIsCerberusEnabledFromDB (0.00s)
=== RUN TestIsCerberusEnabledInvalidEnv
--- PASS: TestIsCerberusEnabledInvalidEnv (0.00s)
=== RUN TestIsCerberusEnabledLegacyEnv
--- PASS: TestIsCerberusEnabledLegacyEnv (0.00s)
=== RUN TestConsoleEnrollDisabled
--- PASS: TestConsoleEnrollDisabled (0.00s)
=== RUN TestConsoleEnrollServiceUnavailable
--- PASS: TestConsoleEnrollServiceUnavailable (0.00s)
=== RUN TestConsoleEnrollInvalidPayload
--- PASS: TestConsoleEnrollInvalidPayload (0.00s)
=== RUN TestConsoleEnrollSuccess
2025/12/12 19:05:46 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.056ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/services/security_service.go:195 no such table: security_audits
[0.077ms] [rows:0] INSERT INTO `security_audits` (`uuid`,`actor`,`action`,`details`,`created_at`) VALUES ("6331bcc9-8eb8-427c-8839-ea8b70681f2f","unknown","crowdsec_console_enroll_succeeded","status=enrolled tenant=my-tenant agent=test-agent correlation_id=35cd7e38-b6e0-4cae-9db1-1b9a0e0b3790","2025-12-12 19:05:46.084") RETURNING `id`
--- PASS: TestConsoleEnrollSuccess (0.00s)
=== RUN TestConsoleEnrollMissingAgentName
2025/12/12 19:05:46 /projects/Charon/backend/internal/services/security_service.go:195 no such table: security_audits
[0.128ms] [rows:0] INSERT INTO `security_audits` (`uuid`,`actor`,`action`,`details`,`created_at`) VALUES ("67c730e1-fbe5-418e-ac88-16b135d4a3dd","unknown","crowdsec_console_enroll_failed","status= tenant= agent= correlation_id=","2025-12-12 19:05:46.085") RETURNING `id`
--- PASS: TestConsoleEnrollMissingAgentName (0.00s)
=== RUN TestConsoleStatusDisabled
--- PASS: TestConsoleStatusDisabled (0.00s)
=== RUN TestConsoleStatusServiceUnavailable
--- PASS: TestConsoleStatusServiceUnavailable (0.00s)
=== RUN TestConsoleStatusSuccess
2025/12/12 19:05:46 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.032ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
--- PASS: TestConsoleStatusSuccess (0.00s)
=== RUN TestConsoleStatusAfterEnroll
2025/12/12 19:05:46 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.051ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/services/security_service.go:195 no such table: security_audits
[0.127ms] [rows:0] INSERT INTO `security_audits` (`uuid`,`actor`,`action`,`details`,`created_at`) VALUES ("bcef394b-34a9-4834-9336-2f211122795a","unknown","crowdsec_console_enroll_succeeded","status=enrolled tenant= agent=test-agent correlation_id=30e6cca4-d985-4900-8711-eb46782b995a","2025-12-12 19:05:46.089") RETURNING `id`
--- PASS: TestConsoleStatusAfterEnroll (0.00s)
=== RUN TestIsConsoleEnrollmentEnabledFromDB
--- PASS: TestIsConsoleEnrollmentEnabledFromDB (0.00s)
=== RUN TestIsConsoleEnrollmentDisabledFromDB
--- PASS: TestIsConsoleEnrollmentDisabledFromDB (0.00s)
=== RUN TestIsConsoleEnrollmentEnabledFromEnv
--- PASS: TestIsConsoleEnrollmentEnabledFromEnv (0.00s)
=== RUN TestIsConsoleEnrollmentDisabledFromEnv
--- PASS: TestIsConsoleEnrollmentDisabledFromEnv (0.00s)
=== RUN TestIsConsoleEnrollmentInvalidEnv
--- PASS: TestIsConsoleEnrollmentInvalidEnv (0.00s)
=== RUN TestIsConsoleEnrollmentDefaultDisabled
--- PASS: TestIsConsoleEnrollmentDefaultDisabled (0.00s)
=== RUN TestIsConsoleEnrollmentDBTrueVariants
=== RUN TestIsConsoleEnrollmentDBTrueVariants/true
=== RUN TestIsConsoleEnrollmentDBTrueVariants/TRUE
=== RUN TestIsConsoleEnrollmentDBTrueVariants/True
=== RUN TestIsConsoleEnrollmentDBTrueVariants/1
=== RUN TestIsConsoleEnrollmentDBTrueVariants/yes
=== RUN TestIsConsoleEnrollmentDBTrueVariants/YES
=== RUN TestIsConsoleEnrollmentDBTrueVariants/false
=== RUN TestIsConsoleEnrollmentDBTrueVariants/FALSE
=== RUN TestIsConsoleEnrollmentDBTrueVariants/0
=== RUN TestIsConsoleEnrollmentDBTrueVariants/no
--- PASS: TestIsConsoleEnrollmentDBTrueVariants (0.01s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/true (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/TRUE (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/True (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/1 (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/yes (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/YES (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/false (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/FALSE (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/0 (0.00s)
--- PASS: TestIsConsoleEnrollmentDBTrueVariants/no (0.00s)
=== RUN TestActorFromContextWithUserID
--- PASS: TestActorFromContextWithUserID (0.00s)
=== RUN TestActorFromContextWithNumericUserID
--- PASS: TestActorFromContextWithNumericUserID (0.00s)
=== RUN TestActorFromContextNoUser
--- PASS: TestActorFromContextNoUser (0.00s)
=== RUN TestTTLRemainingSeconds
--- PASS: TestTTLRemainingSeconds (0.00s)
=== RUN TestTTLRemainingSecondsExpired
--- PASS: TestTTLRemainingSecondsExpired (0.00s)
=== RUN TestTTLRemainingSecondsZeroTime
--- PASS: TestTTLRemainingSecondsZeroTime (0.00s)
=== RUN TestTTLRemainingSecondsZeroTTL
--- PASS: TestTTLRemainingSecondsZeroTTL (0.00s)
=== RUN TestHubEndpointsNil
--- PASS: TestHubEndpointsNil (0.00s)
=== RUN TestHubEndpointsDeduplicates
--- PASS: TestHubEndpointsDeduplicates (0.00s)
=== RUN TestHubEndpointsMultiple
--- PASS: TestHubEndpointsMultiple (0.00s)
=== RUN TestHubEndpointsSkipsEmpty
--- PASS: TestHubEndpointsSkipsEmpty (0.00s)
=== RUN TestGetLAPIDecisions_FallbackToCscli
--- PASS: TestGetLAPIDecisions_FallbackToCscli (0.00s)
=== RUN TestGetLAPIDecisions_EmptyResponse
--- PASS: TestGetLAPIDecisions_EmptyResponse (0.00s)
=== RUN TestCheckLAPIHealth_Handler
--- PASS: TestCheckLAPIHealth_Handler (0.00s)
=== RUN TestGetLAPIKey_FromEnv
--- PASS: TestGetLAPIKey_FromEnv (0.00s)
=== RUN TestGetLAPIKey_Empty
--- PASS: TestGetLAPIKey_Empty (0.00s)
=== RUN TestListPresetsIncludesCacheAndIndex
--- PASS: TestListPresetsIncludesCacheAndIndex (0.00s)
=== RUN TestPullPresetHandlerSuccess
--- PASS: TestPullPresetHandlerSuccess (0.00s)
=== RUN TestApplyPresetHandlerAudits
--- PASS: TestApplyPresetHandlerAudits (0.01s)
=== RUN TestPullPresetHandlerHubError
--- PASS: TestPullPresetHandlerHubError (0.00s)
=== RUN TestPullPresetHandlerTimeout
--- PASS: TestPullPresetHandlerTimeout (0.00s)
=== RUN TestGetCachedPresetNotFound
--- PASS: TestGetCachedPresetNotFound (0.00s)
=== RUN TestGetCachedPresetServiceUnavailable
--- PASS: TestGetCachedPresetServiceUnavailable (0.00s)
=== RUN TestApplyPresetHandlerBackupFailure
--- PASS: TestApplyPresetHandlerBackupFailure (0.00s)
=== RUN TestListPresetsMergesCuratedAndHub
--- PASS: TestListPresetsMergesCuratedAndHub (0.00s)
=== RUN TestGetCachedPresetSuccess
--- PASS: TestGetCachedPresetSuccess (0.00s)
=== RUN TestGetCachedPresetSlugRequired
--- PASS: TestGetCachedPresetSlugRequired (0.00s)
=== RUN TestGetCachedPresetPreviewError
--- PASS: TestGetCachedPresetPreviewError (0.00s)
=== RUN TestPullCuratedPresetSkipsHub
--- PASS: TestPullCuratedPresetSkipsHub (0.00s)
=== RUN TestApplyCuratedPresetSkipsHub
--- PASS: TestApplyCuratedPresetSkipsHub (0.00s)
=== RUN TestPullThenApplyIntegration
crowdsec_pull_apply_integration_test.go:67: User pulls preset
crowdsec_pull_apply_integration_test.go:83: Pull succeeded, cache_key: test/preset-1765566346
crowdsec_pull_apply_integration_test.go:90: Cache verified, slug: test/preset
crowdsec_pull_apply_integration_test.go:93: User applies preset
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:725 no such table: crowdsec_preset_events
[0.106ms] [rows:0] INSERT INTO `crowdsec_preset_events` (`slug`,`action`,`status`,`cache_key`,`backup_path`,`error`,`created_at`,`updated_at`) VALUES ("test/preset","apply","applied","test/preset-1765566346","/tmp/TestPullThenApplyIntegration3897446452/002.backup.20251212-190546","","2025-12-12 19:05:46.133","2025-12-12 19:05:46.133") RETURNING `id`
crowdsec_pull_apply_integration_test.go:109: Apply succeeded, backup: /tmp/TestPullThenApplyIntegration3897446452/002.backup.20251212-190546
--- PASS: TestPullThenApplyIntegration (0.00s)
=== RUN TestApplyWithoutPullReturnsProperError
crowdsec_pull_apply_integration_test.go:138: User tries to apply preset without pulling first
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:695 no such table: crowdsec_preset_events
[0.178ms] [rows:0] INSERT INTO `crowdsec_preset_events` (`slug`,`action`,`status`,`cache_key`,`backup_path`,`error`,`created_at`,`updated_at`) VALUES ("test/preset","apply","failed","","/tmp/TestApplyWithoutPullReturnsProperError3560971172/002.backup.20251212-190546","load cache for test/preset: load cache for test/preset: cache miss: refresh cache: fetch hub index: http://test.hub/api/index.json: http://test.hub/api/index.json (status 500)
https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500)
https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500)
https://hub-data.crowdsec.net/api/index.json: https://hub-data.crowdsec.net/api/index.json (status 500)","2025-12-12 19:05:46.134","2025-12-12 19:05:46.134") RETURNING `id`
crowdsec_pull_apply_integration_test.go:154: Proper error message returned: Preset cache missing or expired. Pull the preset again, then retry apply.
--- PASS: TestApplyWithoutPullReturnsProperError (0.00s)
=== RUN TestApplyRollbackWhenCacheMissingAndRepullFails
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:695 no such table: crowdsec_preset_events
[0.099ms] [rows:0] INSERT INTO `crowdsec_preset_events` (`slug`,`action`,`status`,`cache_key`,`backup_path`,`error`,`created_at`,`updated_at`) VALUES ("missing/preset","apply","failed","","/tmp/TestApplyRollbackWhenCacheMissingAndRepullFails4135574716/002/crowdsec.backup.20251212-190546","load cache for missing/preset: load cache for missing/preset: cache miss: refresh cache: fetch hub index: http://test.hub/api/index.json: http://test.hub/api/index.json (status 500)
https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500)
https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500)
https://hub-data.crowdsec.net/api/index.json: https://hub-data.crowdsec.net/api/index.json (status 500)","2025-12-12 19:05:46.136","2025-12-12 19:05:46.136") RETURNING `id`
--- PASS: TestApplyRollbackWhenCacheMissingAndRepullFails (0.00s)
=== RUN TestDockerHandler_ListContainers
--- PASS: TestDockerHandler_ListContainers (0.00s)
=== RUN TestDockerHandler_ListContainers_NonExistentServerID
2025/12/12 19:05:46 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.027ms] [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.00s)
=== RUN TestDockerHandler_ListContainers_WithHostQuery
--- PASS: TestDockerHandler_ListContainers_WithHostQuery (0.00s)
=== RUN TestDockerHandler_RegisterRoutes
--- PASS: TestDockerHandler_RegisterRoutes (0.00s)
=== RUN TestDockerHandler_NewDockerHandler
--- PASS: TestDockerHandler_NewDockerHandler (0.00s)
=== RUN TestDomainLifecycle
--- PASS: TestDomainLifecycle (0.00s)
=== RUN TestDomainErrors
--- PASS: TestDomainErrors (0.00s)
=== RUN TestDomainDelete_NotFound
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:73 record not found
[0.038ms] [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.00s)
=== RUN TestDomainCreate_Duplicate
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:49 UNIQUE constraint failed: domains.name
[0.087ms] [rows:0] INSERT INTO `domains` (`uuid`,`name`,`created_at`,`updated_at`,`deleted_at`) VALUES ("30ded0b1-7423-4851-95fb-9c48e4a9bb59","duplicate.com","2025-12-12 19:05:46.158","2025-12-12 19:05:46.158",NULL) RETURNING `id`
--- PASS: TestDomainCreate_Duplicate (0.00s)
=== RUN TestDomainList_Empty
--- PASS: TestDomainList_Empty (0.00s)
=== RUN TestDomainCreate_LongName
--- PASS: TestDomainCreate_LongName (0.00s)
=== RUN TestFeatureFlagsHandler_GetFlags_DBPrecedence
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_GetFlags_DBPrecedence (0.00s)
=== RUN TestFeatureFlagsHandler_GetFlags_EnvFallback
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.036ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvFallback (0.00s)
=== RUN TestFeatureFlagsHandler_GetFlags_EnvShortForm
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.032ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvShortForm (0.00s)
=== RUN TestFeatureFlagsHandler_GetFlags_EnvNumeric
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvNumeric (0.00s)
=== RUN TestFeatureFlagsHandler_GetFlags_DefaultTrue
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.047ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_GetFlags_DefaultTrue (0.00s)
=== RUN TestFeatureFlagsHandler_GetFlags_AllDefaultFlagsPresent
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_GetFlags_AllDefaultFlagsPresent (0.00s)
=== RUN TestFeatureFlagsHandler_UpdateFlags_Success
--- PASS: TestFeatureFlagsHandler_UpdateFlags_Success (0.00s)
=== RUN TestFeatureFlagsHandler_UpdateFlags_Upsert
--- PASS: TestFeatureFlagsHandler_UpdateFlags_Upsert (0.00s)
=== RUN TestFeatureFlagsHandler_UpdateFlags_InvalidJSON
--- PASS: TestFeatureFlagsHandler_UpdateFlags_InvalidJSON (0.00s)
=== RUN TestFeatureFlagsHandler_UpdateFlags_OnlyAllowedKeys
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler_coverage_test.go:296 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.invalid.key" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_UpdateFlags_OnlyAllowedKeys (0.00s)
=== RUN TestFeatureFlagsHandler_UpdateFlags_EmptyPayload
--- PASS: TestFeatureFlagsHandler_UpdateFlags_EmptyPayload (0.00s)
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/lowercase_true
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.034ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/uppercase_TRUE
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.040ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/mixed_case_True
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/numeric_1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.035ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/yes
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.044ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/YES_uppercase
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/lowercase_false
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.038ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/numeric_0
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/no
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/empty_string
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/random_string
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.362ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.047ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/whitespace_padded_true
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_DBValueVariants/whitespace_padded_false
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants (0.01s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/lowercase_true (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/uppercase_TRUE (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/mixed_case_True (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/numeric_1 (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/yes (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/YES_uppercase (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/lowercase_false (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/numeric_0 (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/no (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/empty_string (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/random_string (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/whitespace_padded_true (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_DBValueVariants/whitespace_padded_false (0.00s)
=== RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants
=== RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/true_string
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.047ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/TRUE_uppercase
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/1_numeric
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/false_string
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/FALSE_uppercase
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/0_numeric
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
=== RUN TestFeatureFlagsHandler_GetFlags_EnvValueVariants/invalid_value_defaults_to_numeric_check
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/true_string (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/TRUE_uppercase (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/1_numeric (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/false_string (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/FALSE_uppercase (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/0_numeric (0.00s)
--- PASS: TestFeatureFlagsHandler_GetFlags_EnvValueVariants/invalid_value_defaults_to_numeric_check (0.00s)
=== RUN TestFeatureFlagsHandler_UpdateFlags_BoolValues
=== RUN TestFeatureFlagsHandler_UpdateFlags_BoolValues/true
=== RUN TestFeatureFlagsHandler_UpdateFlags_BoolValues/false
--- PASS: TestFeatureFlagsHandler_UpdateFlags_BoolValues (0.00s)
--- PASS: TestFeatureFlagsHandler_UpdateFlags_BoolValues/true (0.00s)
--- PASS: TestFeatureFlagsHandler_UpdateFlags_BoolValues/false (0.00s)
=== RUN TestFeatureFlagsHandler_NewFeatureFlagsHandler
--- PASS: TestFeatureFlagsHandler_NewFeatureFlagsHandler (0.00s)
=== RUN TestFeatureFlags_GetAndUpdate
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.053ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlags_GetAndUpdate (0.00s)
=== RUN TestFeatureFlags_EnvFallback
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 no such table: settings
[0.056ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 no such table: settings
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 no such table: settings
[0.005ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.crowdsec.console_enrollment" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestFeatureFlags_EnvFallback (0.00s)
=== RUN TestHealthHandler
--- PASS: TestHealthHandler (0.00s)
=== RUN TestGetLocalIP
health_handler_test.go:36: getLocalIP returned: "217.15.170.144"
--- PASS: TestGetLocalIP (0.00s)
=== RUN TestIsSafePathUnderBase
--- PASS: TestIsSafePathUnderBase (0.00s)
=== RUN TestImportUploadSanitizesFilename
--- PASS: TestImportUploadSanitizesFilename (0.00s)
=== RUN TestLogsHandler_Read_FilterBySearch
--- PASS: TestLogsHandler_Read_FilterBySearch (0.00s)
=== RUN TestLogsHandler_Read_FilterByHost
--- PASS: TestLogsHandler_Read_FilterByHost (0.00s)
=== RUN TestLogsHandler_Read_FilterByLevel
--- PASS: TestLogsHandler_Read_FilterByLevel (0.00s)
=== RUN TestLogsHandler_Read_FilterByStatus
--- PASS: TestLogsHandler_Read_FilterByStatus (0.00s)
=== RUN TestLogsHandler_Read_SortAsc
--- PASS: TestLogsHandler_Read_SortAsc (0.00s)
=== RUN TestLogsHandler_List_DirectoryIsFile
--- PASS: TestLogsHandler_List_DirectoryIsFile (0.00s)
=== RUN TestLogsHandler_Download_TempFileError
--- PASS: TestLogsHandler_Download_TempFileError (0.00s)
=== RUN TestLogsLifecycle
--- PASS: TestLogsLifecycle (0.00s)
=== RUN TestLogsHandler_PathTraversal
--- PASS: TestLogsHandler_PathTraversal (0.00s)
=== RUN TestLogsWebSocketHandler_SuccessfulConnection
--- PASS: TestLogsWebSocketHandler_SuccessfulConnection (0.00s)
=== RUN TestLogsWebSocketHandler_ReceiveLogEntries
--- PASS: TestLogsWebSocketHandler_ReceiveLogEntries (0.00s)
=== RUN TestLogsWebSocketHandler_LevelFilter
--- PASS: TestLogsWebSocketHandler_LevelFilter (0.15s)
=== RUN TestLogsWebSocketHandler_SourceFilter
--- PASS: TestLogsWebSocketHandler_SourceFilter (0.00s)
=== RUN TestLogsWebSocketHandler_CombinedFilters
--- PASS: TestLogsWebSocketHandler_CombinedFilters (0.00s)
=== RUN TestLogsWebSocketHandler_CaseInsensitiveFilters
--- PASS: TestLogsWebSocketHandler_CaseInsensitiveFilters (0.00s)
=== RUN TestLogsWebSocketHandler_UpgradeFailure
--- PASS: TestLogsWebSocketHandler_UpgradeFailure (0.00s)
=== RUN TestLogsWebSocketHandler_ClientDisconnect
--- PASS: TestLogsWebSocketHandler_ClientDisconnect (0.02s)
=== RUN TestLogsWebSocketHandler_ChannelClosed
--- PASS: TestLogsWebSocketHandler_ChannelClosed (0.00s)
=== RUN TestLogsWebSocketHandler_MultipleConnections
--- PASS: TestLogsWebSocketHandler_MultipleConnections (0.00s)
=== RUN TestLogsWebSocketHandler_HighVolumeLogging
--- PASS: TestLogsWebSocketHandler_HighVolumeLogging (0.02s)
=== RUN TestLogsWebSocketHandler_EmptyLogFields
--- PASS: TestLogsWebSocketHandler_EmptyLogFields (0.00s)
=== RUN TestLogsWebSocketHandler_SubscriberIDUniqueness
--- PASS: TestLogsWebSocketHandler_SubscriberIDUniqueness (0.00s)
=== RUN TestLogsWebSocketHandler_WithRealLogger
--- PASS: TestLogsWebSocketHandler_WithRealLogger (0.00s)
=== RUN TestLogsWebSocketHandler_ConnectionLifecycle
--- PASS: TestLogsWebSocketHandler_ConnectionLifecycle (0.00s)
=== RUN TestDomainHandler_List_Error
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:28 no such table: domains
[0.030ms] [rows:0] SELECT * FROM `domains` WHERE `domains`.`deleted_at` IS NULL ORDER BY name asc
--- PASS: TestDomainHandler_List_Error (0.00s)
=== RUN TestDomainHandler_Create_InvalidJSON
--- PASS: TestDomainHandler_Create_InvalidJSON (0.00s)
=== RUN TestDomainHandler_Create_DBError
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:49 no such table: domains
[0.068ms] [rows:0] INSERT INTO `domains` (`uuid`,`name`,`created_at`,`updated_at`,`deleted_at`) VALUES ("078a32f2-b134-4709-9687-40e22ddc4715","example.com","2025-12-12 19:05:46.4","2025-12-12 19:05:46.4",NULL) RETURNING `id`
--- PASS: TestDomainHandler_Create_DBError (0.00s)
=== RUN TestDomainHandler_Delete_Error
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:73 no such table: domains
[0.027ms] [rows:0] SELECT * FROM `domains` WHERE uuid = "test-id" AND `domains`.`deleted_at` IS NULL ORDER BY `domains`.`id` LIMIT 1
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/domain_handler.go:88 no such table: domains
[0.065ms] [rows:0] UPDATE `domains` SET `deleted_at`="2025-12-12 19:05:46.401" WHERE uuid = "test-id" AND `domains`.`deleted_at` IS NULL
--- PASS: TestDomainHandler_Delete_Error (0.00s)
=== RUN TestRemoteServerHandler_List_Error
2025/12/12 19:05:46 /projects/Charon/backend/internal/services/remoteserver_service.go:92 no such table: remote_servers
[0.018ms] [rows:0] SELECT * FROM `remote_servers` ORDER BY name ASC
--- PASS: TestRemoteServerHandler_List_Error (0.00s)
=== RUN TestRemoteServerHandler_List_EnabledOnly
2025/12/12 19:05:46 /projects/Charon/backend/internal/api/handlers/misc_coverage_test.go:131 UNIQUE constraint failed: remote_servers.uuid
[0.041ms] [rows:0] INSERT INTO `remote_servers` (`uuid`,`name`,`provider`,`host`,`port`,`scheme`,`tags`,`description`,`enabled`,`last_checked`,`reachable`,`created_at`,`updated_at`) VALUES ("","Server2","","localhost",22,"","","",true,NULL,false,"2025-12-12 19:05:46.402","2025-12-12 19:05:46.402") RETURNING `id`
--- PASS: TestRemoteServerHandler_List_EnabledOnly (0.00s)
=== RUN TestRemoteServerHandler_Update_NotFound
2025/12/12 19:05:46 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.022ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "nonexistent" ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerHandler_Update_NotFound (0.00s)
=== RUN TestRemoteServerHandler_Update_InvalidJSON
--- PASS: TestRemoteServerHandler_Update_InvalidJSON (0.00s)
=== RUN TestRemoteServerHandler_TestConnection_NotFound
2025/12/12 19:05:46 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.021ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "nonexistent" ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerHandler_TestConnection_NotFound (0.00s)
=== RUN TestRemoteServerHandler_TestConnectionCustom_InvalidJSON
--- PASS: TestRemoteServerHandler_TestConnectionCustom_InvalidJSON (0.00s)
=== RUN TestRemoteServerHandler_TestConnectionCustom_Unreachable
--- PASS: TestRemoteServerHandler_TestConnectionCustom_Unreachable (5.00s)
=== RUN TestUptimeHandler_List_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:863 no such table: uptime_monitors
[0.020ms] [rows:0] SELECT * FROM `uptime_monitors` ORDER BY name ASC
--- PASS: TestUptimeHandler_List_Error (0.00s)
=== RUN TestUptimeHandler_GetHistory_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:877 no such table: uptime_heartbeats
[0.038ms] [rows:0] SELECT * FROM `uptime_heartbeats` WHERE monitor_id = "test-id" ORDER BY created_at desc LIMIT 50
--- PASS: TestUptimeHandler_GetHistory_Error (0.00s)
=== RUN TestUptimeHandler_Update_InvalidJSON
--- PASS: TestUptimeHandler_Update_InvalidJSON (0.00s)
=== RUN TestUptimeHandler_Sync_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:105 no such table: proxy_hosts
[0.271ms] [rows:0] SELECT * FROM `proxy_hosts`
--- PASS: TestUptimeHandler_Sync_Error (0.00s)
=== RUN TestUptimeHandler_Delete_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:911 no such table: uptime_monitors
[0.012ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "test-id" ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestUptimeHandler_Delete_Error (0.00s)
=== RUN TestUptimeHandler_CheckMonitor_NotFound
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/uptime_service.go:869 record not found
[0.032ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestUptimeHandler_CheckMonitor_NotFound (0.00s)
=== RUN TestNotificationHandler_List_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:66 no such table: notifications
[0.011ms] [rows:0] SELECT * FROM `notifications` ORDER BY created_at desc
--- PASS: TestNotificationHandler_List_Error (0.00s)
=== RUN TestNotificationHandler_List_UnreadOnly
--- PASS: TestNotificationHandler_List_UnreadOnly (0.00s)
=== RUN TestNotificationHandler_MarkAsRead_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:71 no such table: notifications
[0.039ms] [rows:0] UPDATE `notifications` SET `read`=true WHERE id = "test-id"
--- PASS: TestNotificationHandler_MarkAsRead_Error (0.00s)
=== RUN TestNotificationHandler_MarkAllAsRead_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:75 no such table: notifications
[0.031ms] [rows:0] UPDATE `notifications` SET `read`=true WHERE read = false
--- PASS: TestNotificationHandler_MarkAllAsRead_Error (0.00s)
=== RUN TestNotificationProviderHandler_List_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:455 no such table: notification_providers
[0.013ms] [rows:0] SELECT * FROM `notification_providers`
--- PASS: TestNotificationProviderHandler_List_Error (0.00s)
=== RUN TestNotificationProviderHandler_Create_InvalidJSON
--- PASS: TestNotificationProviderHandler_Create_InvalidJSON (0.00s)
=== RUN TestNotificationProviderHandler_Create_DBError
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:468 no such table: notification_providers
[0.058ms] [rows:0] INSERT INTO `notification_providers` (`id`,`name`,`type`,`url`,`config`,`template`,`enabled`,`notify_proxy_hosts`,`notify_remote_servers`,`notify_domains`,`notify_certs`,`notify_uptime`,`created_at`,`updated_at`) VALUES ("513248aa-8301-4798-8a21-c87b3eaef859","Test","webhook","https://example.com","","minimal",false,true,true,true,true,true,"2025-12-12 19:05:51.418","2025-12-12 19:05:51.418")
--- PASS: TestNotificationProviderHandler_Create_DBError (0.00s)
=== RUN TestNotificationProviderHandler_Create_InvalidTemplate
--- PASS: TestNotificationProviderHandler_Create_InvalidTemplate (0.00s)
=== RUN TestNotificationProviderHandler_Update_InvalidJSON
--- PASS: TestNotificationProviderHandler_Update_InvalidJSON (0.00s)
=== RUN TestNotificationProviderHandler_Update_InvalidTemplate
--- PASS: TestNotificationProviderHandler_Update_InvalidTemplate (0.00s)
=== RUN TestNotificationProviderHandler_Update_DBError
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:479 no such table: notification_providers
[0.068ms] [rows:0] UPDATE `notification_providers` SET `name`="Test",`type`="webhook",`url`="https://example.com",`config`="",`template`="minimal",`enabled`=false,`notify_proxy_hosts`=false,`notify_remote_servers`=false,`notify_domains`=false,`notify_certs`=false,`notify_uptime`=false,`created_at`="0000-00-00 00:00:00",`updated_at`="2025-12-12 19:05:51.422" WHERE `id` = "test-id"
--- PASS: TestNotificationProviderHandler_Update_DBError (0.00s)
=== RUN TestNotificationProviderHandler_Delete_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:483 no such table: notification_providers
[0.032ms] [rows:0] DELETE FROM `notification_providers` WHERE id = "test-id"
--- PASS: TestNotificationProviderHandler_Delete_Error (0.00s)
=== RUN TestNotificationProviderHandler_Test_InvalidJSON
--- PASS: TestNotificationProviderHandler_Test_InvalidJSON (0.00s)
=== RUN TestNotificationProviderHandler_Templates
--- PASS: TestNotificationProviderHandler_Templates (0.00s)
=== RUN TestNotificationProviderHandler_Preview_InvalidJSON
--- PASS: TestNotificationProviderHandler_Preview_InvalidJSON (0.00s)
=== RUN TestNotificationProviderHandler_Preview_WithData
--- PASS: TestNotificationProviderHandler_Preview_WithData (0.00s)
=== RUN TestNotificationProviderHandler_Preview_InvalidTemplate
--- PASS: TestNotificationProviderHandler_Preview_InvalidTemplate (0.00s)
=== RUN TestNotificationTemplateHandler_List_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:375 no such table: notification_templates
[0.019ms] [rows:0] SELECT * FROM `notification_templates` ORDER BY created_at desc
--- PASS: TestNotificationTemplateHandler_List_Error (0.00s)
=== RUN TestNotificationTemplateHandler_Create_BadJSON
--- PASS: TestNotificationTemplateHandler_Create_BadJSON (0.00s)
=== RUN TestNotificationTemplateHandler_Create_DBError
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:392 no such table: notification_templates
[0.040ms] [rows:0] INSERT INTO `notification_templates` (`id`,`name`,`description`,`config`,`template`,`created_at`,`updated_at`) VALUES ("ca832d3a-64c5-42a4-8c75-b389bf4048ff","Test","","{""test"": true}","minimal","2025-12-12 19:05:51.429","2025-12-12 19:05:51.429")
--- PASS: TestNotificationTemplateHandler_Create_DBError (0.00s)
=== RUN TestNotificationTemplateHandler_Update_BadJSON
--- PASS: TestNotificationTemplateHandler_Update_BadJSON (0.00s)
=== RUN TestNotificationTemplateHandler_Update_DBError
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:397 no such table: notification_templates
[0.037ms] [rows:0] UPDATE `notification_templates` SET `name`="Test",`description`="",`config`="{""test"": true}",`template`="",`created_at`="0000-00-00 00:00:00",`updated_at`="2025-12-12 19:05:51.431" WHERE `id` = "test-id"
--- PASS: TestNotificationTemplateHandler_Update_DBError (0.00s)
=== RUN TestNotificationTemplateHandler_Delete_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:402 no such table: notification_templates
[0.029ms] [rows:0] DELETE FROM `notification_templates` WHERE id = "test-id"
--- PASS: TestNotificationTemplateHandler_Delete_Error (0.00s)
=== RUN TestNotificationTemplateHandler_Preview_BadJSON
--- PASS: TestNotificationTemplateHandler_Preview_BadJSON (0.00s)
=== RUN TestNotificationTemplateHandler_Preview_TemplateNotFound
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:384 record not found
[0.022ms] [rows:0] SELECT * FROM `notification_templates` WHERE id = "nonexistent" ORDER BY `notification_templates`.`id` LIMIT 1
--- PASS: TestNotificationTemplateHandler_Preview_TemplateNotFound (0.00s)
=== RUN TestNotificationTemplateHandler_Preview_WithStoredTemplate
--- PASS: TestNotificationTemplateHandler_Preview_WithStoredTemplate (0.00s)
=== RUN TestNotificationTemplateHandler_Preview_InvalidTemplate
--- PASS: TestNotificationTemplateHandler_Preview_InvalidTemplate (0.00s)
=== RUN TestNotificationTemplateHandler_CRUDAndPreview
--- PASS: TestNotificationTemplateHandler_CRUDAndPreview (0.00s)
=== 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 TestPerf_GetStatus_AssertThreshold
perf_assert_test.go:107: GetStatus avg=0.045ms p95=0.085ms max=1.550ms
--- PASS: TestPerf_GetStatus_AssertThreshold (0.02s)
=== RUN TestPerf_GetStatus_Parallel_AssertThreshold
perf_assert_test.go:150: GetStatus Parallel avg=0.067ms p95=0.135ms max=3.510ms
--- PASS: TestPerf_GetStatus_Parallel_AssertThreshold (0.02s)
=== RUN TestPerf_ListDecisions_AssertThreshold
perf_assert_test.go:179: ListDecisions avg=0.863ms p95=1.108ms max=3.795ms
--- PASS: TestPerf_ListDecisions_AssertThreshold (0.22s)
=== RUN TestProxyHostLifecycle
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found
[0.039ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "f4e8da5e-4668-40da-95b8-db6151890005" ORDER BY `proxy_hosts`.`id` LIMIT 1
--- PASS: TestProxyHostLifecycle (0.00s)
=== RUN TestProxyHostDelete_WithUptimeCleanup
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:82 no such table: notification_providers
[0.132ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true
2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/proxy_host_handler_test.go:141 record not found
[0.047ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "ph-delete-1" ORDER BY `proxy_hosts`.`id` LIMIT 1
--- PASS: TestProxyHostDelete_WithUptimeCleanup (0.00s)
=== RUN TestProxyHostErrors
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.106ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.012ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.055ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.045ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found
[0.030ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found
[0.022ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.015ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.010ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.014ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found
[0.044ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.010ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.004ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestProxyHostErrors (0.01s)
=== RUN TestProxyHostValidation
--- PASS: TestProxyHostValidation (0.00s)
=== RUN TestProxyHostCreate_AdvancedConfig_InvalidJSON
--- PASS: TestProxyHostCreate_AdvancedConfig_InvalidJSON (0.00s)
=== RUN TestProxyHostCreate_AdvancedConfig_Normalization
--- PASS: TestProxyHostCreate_AdvancedConfig_Normalization (0.00s)
=== RUN TestProxyHostUpdate_CertificateID_Null
--- PASS: TestProxyHostUpdate_CertificateID_Null (0.00s)
=== RUN TestProxyHostConnection
--- PASS: TestProxyHostConnection (0.00s)
=== RUN TestProxyHostHandler_List_Error
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:121 sql: database is closed
[0.009ms] [rows:0] SELECT * FROM `proxy_hosts` ORDER BY updated_at desc
--- PASS: TestProxyHostHandler_List_Error (0.00s)
=== RUN TestProxyHostWithCaddyIntegration
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.026ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.134ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.033ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.026ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.015ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.060ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.051ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:82 no such table: notification_providers
[0.122ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.008ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.008ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.006ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.007ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.006ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.005ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.005ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.014ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/notification_service.go:82 no such table: notification_providers
[0.016ms] [rows:0] SELECT * FROM `notification_providers` WHERE enabled = true
--- PASS: TestProxyHostWithCaddyIntegration (0.01s)
=== RUN TestProxyHostHandler_BulkUpdateACL_Success
--- PASS: TestProxyHostHandler_BulkUpdateACL_Success (0.00s)
=== RUN TestProxyHostHandler_BulkUpdateACL_RemoveACL
--- PASS: TestProxyHostHandler_BulkUpdateACL_RemoveACL (0.00s)
=== RUN TestProxyHostHandler_BulkUpdateACL_PartialFailure
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/proxyhost_service.go:112 record not found
[0.024ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE uuid = "422c0cc1-e09e-4e7f-8ba4-6c678835580a" ORDER BY `proxy_hosts`.`id` LIMIT 1
--- PASS: TestProxyHostHandler_BulkUpdateACL_PartialFailure (0.00s)
=== RUN TestProxyHostHandler_BulkUpdateACL_EmptyUUIDs
--- PASS: TestProxyHostHandler_BulkUpdateACL_EmptyUUIDs (0.00s)
=== RUN TestProxyHostHandler_BulkUpdateACL_InvalidJSON
--- PASS: TestProxyHostHandler_BulkUpdateACL_InvalidJSON (0.00s)
=== RUN TestProxyHostUpdate_AdvancedConfig_ClearAndBackup
--- PASS: TestProxyHostUpdate_AdvancedConfig_ClearAndBackup (0.00s)
=== RUN TestProxyHostUpdate_AdvancedConfig_InvalidJSON
--- PASS: TestProxyHostUpdate_AdvancedConfig_InvalidJSON (0.00s)
=== RUN TestProxyHostUpdate_SetCertificateID
--- PASS: TestProxyHostUpdate_SetCertificateID (0.00s)
=== RUN TestProxyHostUpdate_AdvancedConfig_SetBackup
--- PASS: TestProxyHostUpdate_AdvancedConfig_SetBackup (0.00s)
=== RUN TestProxyHostUpdate_ForwardPort_StringValue
--- PASS: TestProxyHostUpdate_ForwardPort_StringValue (0.00s)
=== RUN TestProxyHostUpdate_Locations_InvalidPayload
--- PASS: TestProxyHostUpdate_Locations_InvalidPayload (0.00s)
=== RUN TestProxyHostUpdate_SetBooleansAndApplication
--- PASS: TestProxyHostUpdate_SetBooleansAndApplication (0.00s)
=== RUN TestProxyHostUpdate_Locations_Replace
--- PASS: TestProxyHostUpdate_Locations_Replace (0.00s)
=== RUN TestProxyHostCreate_WithCertificateAndLocations
--- PASS: TestProxyHostCreate_WithCertificateAndLocations (0.00s)
=== RUN TestSanitizeForLog
--- PASS: TestSanitizeForLog (0.00s)
=== RUN TestSecurityHandler_GetGeoIPStatus_NotInitialized
--- PASS: TestSecurityHandler_GetGeoIPStatus_NotInitialized (0.00s)
=== RUN TestSecurityHandler_GetGeoIPStatus_Initialized_NotLoaded
--- PASS: TestSecurityHandler_GetGeoIPStatus_Initialized_NotLoaded (0.00s)
=== RUN TestSecurityHandler_ReloadGeoIP_NotInitialized
--- PASS: TestSecurityHandler_ReloadGeoIP_NotInitialized (0.00s)
=== RUN TestSecurityHandler_ReloadGeoIP_LoadError
time="2025-12-12T19:05:51Z" level=error msg="Failed to reload GeoIP database" error="open : no such file or directory"
--- PASS: TestSecurityHandler_ReloadGeoIP_LoadError (0.00s)
=== RUN TestSecurityHandler_LookupGeoIP_MissingIPAddress
--- PASS: TestSecurityHandler_LookupGeoIP_MissingIPAddress (0.00s)
=== RUN TestSecurityHandler_LookupGeoIP_ServiceUnavailable
--- PASS: TestSecurityHandler_LookupGeoIP_ServiceUnavailable (0.00s)
=== RUN TestSecurityHandler_GetConfigAndUpdateConfig
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.033ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.038ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GetConfigAndUpdateConfig (0.00s)
=== RUN TestSecurityHandler_GetStatus_SQLInjection
--- PASS: TestSecurityHandler_GetStatus_SQLInjection (0.00s)
=== RUN TestSecurityHandler_CreateDecision_SQLInjection
=== RUN TestSecurityHandler_CreateDecision_SQLInjection/payload_0
=== RUN TestSecurityHandler_CreateDecision_SQLInjection/payload_1
=== RUN TestSecurityHandler_CreateDecision_SQLInjection/payload_2
=== RUN TestSecurityHandler_CreateDecision_SQLInjection/payload_3
--- PASS: TestSecurityHandler_CreateDecision_SQLInjection (0.00s)
--- PASS: TestSecurityHandler_CreateDecision_SQLInjection/payload_0 (0.00s)
--- PASS: TestSecurityHandler_CreateDecision_SQLInjection/payload_1 (0.00s)
--- PASS: TestSecurityHandler_CreateDecision_SQLInjection/payload_2 (0.00s)
--- PASS: TestSecurityHandler_CreateDecision_SQLInjection/payload_3 (0.00s)
=== RUN TestSecurityHandler_UpsertRuleSet_MassivePayload
--- PASS: TestSecurityHandler_UpsertRuleSet_MassivePayload (0.05s)
=== RUN TestSecurityHandler_UpsertRuleSet_EmptyName
--- PASS: TestSecurityHandler_UpsertRuleSet_EmptyName (0.00s)
=== RUN TestSecurityHandler_CreateDecision_EmptyFields
=== RUN TestSecurityHandler_CreateDecision_EmptyFields/empty_ip
=== RUN TestSecurityHandler_CreateDecision_EmptyFields/empty_action
=== RUN TestSecurityHandler_CreateDecision_EmptyFields/both_empty
=== RUN TestSecurityHandler_CreateDecision_EmptyFields/valid
--- PASS: TestSecurityHandler_CreateDecision_EmptyFields (0.00s)
--- PASS: TestSecurityHandler_CreateDecision_EmptyFields/empty_ip (0.00s)
--- PASS: TestSecurityHandler_CreateDecision_EmptyFields/empty_action (0.00s)
--- PASS: TestSecurityHandler_CreateDecision_EmptyFields/both_empty (0.00s)
--- PASS: TestSecurityHandler_CreateDecision_EmptyFields/valid (0.00s)
=== RUN TestSecurityHandler_GetStatus_SettingsOverride
--- PASS: TestSecurityHandler_GetStatus_SettingsOverride (0.00s)
=== RUN TestSecurityHandler_GetStatus_DisabledViaSettings
--- PASS: TestSecurityHandler_GetStatus_DisabledViaSettings (0.00s)
=== RUN TestSecurityAudit_DeleteRuleSet_InvalidID
=== RUN TestSecurityAudit_DeleteRuleSet_InvalidID/empty_id
=== RUN TestSecurityAudit_DeleteRuleSet_InvalidID/non_numeric
=== RUN TestSecurityAudit_DeleteRuleSet_InvalidID/negative
=== RUN TestSecurityAudit_DeleteRuleSet_InvalidID/sql_injection
=== RUN TestSecurityAudit_DeleteRuleSet_InvalidID/not_found
--- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID (0.00s)
--- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/empty_id (0.00s)
--- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/non_numeric (0.00s)
--- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/negative (0.00s)
--- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/sql_injection (0.00s)
--- PASS: TestSecurityAudit_DeleteRuleSet_InvalidID/not_found (0.00s)
=== RUN TestSecurityHandler_UpsertRuleSet_XSSInContent
--- PASS: TestSecurityHandler_UpsertRuleSet_XSSInContent (0.00s)
=== RUN TestSecurityHandler_UpdateConfig_RateLimitBounds
=== RUN TestSecurityHandler_UpdateConfig_RateLimitBounds/valid_limits
=== RUN TestSecurityHandler_UpdateConfig_RateLimitBounds/zero_requests
=== RUN TestSecurityHandler_UpdateConfig_RateLimitBounds/negative_burst
=== RUN TestSecurityHandler_UpdateConfig_RateLimitBounds/huge_values
--- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds (0.00s)
--- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds/valid_limits (0.00s)
--- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds/zero_requests (0.00s)
--- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds/negative_burst (0.00s)
--- PASS: TestSecurityHandler_UpdateConfig_RateLimitBounds/huge_values (0.00s)
=== RUN TestSecurityHandler_GetStatus_NilDB
--- PASS: TestSecurityHandler_GetStatus_NilDB (0.00s)
=== RUN TestSecurityHandler_Enable_WithoutWhitelist
--- PASS: TestSecurityHandler_Enable_WithoutWhitelist (0.00s)
=== RUN TestSecurityHandler_Disable_RequiresToken
--- PASS: TestSecurityHandler_Disable_RequiresToken (0.00s)
=== RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation
=== RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_remote
=== RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_external
=== RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_cloud
=== RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_api
=== RUN TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_../../../etc/passwd
--- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation (0.00s)
--- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_remote (0.00s)
--- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_external (0.00s)
--- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_cloud (0.00s)
--- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_api (0.00s)
--- PASS: TestSecurityHandler_GetStatus_CrowdSecModeValidation/mode_../../../etc/passwd (0.00s)
=== RUN TestSecurityHandler_GetStatus_Clean
--- PASS: TestSecurityHandler_GetStatus_Clean (0.00s)
=== RUN TestSecurityHandler_Cerberus_DBOverride
2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.138ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_Cerberus_DBOverride (0.00s)
=== RUN TestSecurityHandler_ACL_DBOverride
2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.025ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_clean_test.go:119:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_clean_test.go:119
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_ACL_DBOverride
--- FAIL: TestSecurityHandler_ACL_DBOverride (0.00s)
=== RUN TestSecurityHandler_GenerateBreakGlass_ReturnsToken
2025/12/12 19:05:51 /projects/Charon/backend/internal/services/security_service.go:121 record not found
[0.131ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GenerateBreakGlass_ReturnsToken (0.06s)
=== RUN TestSecurityHandler_ACL_DisabledWhenCerberusOff
2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.070ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_ACL_DisabledWhenCerberusOff (0.00s)
=== RUN TestSecurityHandler_CrowdSec_Mode_DBOverride
2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.054ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_clean_test.go:196:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_clean_test.go:196
Error: Not equal:
expected: "local"
actual : "disabled"
Diff:
--- Expected
+++ Actual
@@ -1 +1 @@
-local
+disabled
Test: TestSecurityHandler_CrowdSec_Mode_DBOverride
--- FAIL: TestSecurityHandler_CrowdSec_Mode_DBOverride (0.00s)
=== RUN TestSecurityHandler_CrowdSec_ExternalMappedToDisabled_DBOverride
2025/12/12 19:05:51 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.063ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_CrowdSec_ExternalMappedToDisabled_DBOverride (0.00s)
=== RUN TestSecurityHandler_ExternalModeMappedToDisabled
--- PASS: TestSecurityHandler_ExternalModeMappedToDisabled (0.00s)
=== RUN TestSecurityHandler_Enable_Disable_WithAdminWhitelistAndToken
--- PASS: TestSecurityHandler_Enable_Disable_WithAdminWhitelistAndToken (0.12s)
=== RUN TestSecurityHandler_UpdateConfig_Success
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.029ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_UpdateConfig_Success (0.00s)
=== RUN TestSecurityHandler_UpdateConfig_DefaultName
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.044ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_UpdateConfig_DefaultName (0.00s)
=== RUN TestSecurityHandler_UpdateConfig_InvalidPayload
--- PASS: TestSecurityHandler_UpdateConfig_InvalidPayload (0.00s)
=== RUN TestSecurityHandler_GetConfig_Success
--- PASS: TestSecurityHandler_GetConfig_Success (0.00s)
=== RUN TestSecurityHandler_GetConfig_NotFound
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.022ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GetConfig_NotFound (0.00s)
=== RUN TestSecurityHandler_ListDecisions_Success
--- PASS: TestSecurityHandler_ListDecisions_Success (0.00s)
=== RUN TestSecurityHandler_ListDecisions_WithLimit
--- PASS: TestSecurityHandler_ListDecisions_WithLimit (0.00s)
=== RUN TestSecurityHandler_CreateDecision_Success
--- PASS: TestSecurityHandler_CreateDecision_Success (0.00s)
=== RUN TestSecurityHandler_CreateDecision_MissingIP
--- PASS: TestSecurityHandler_CreateDecision_MissingIP (0.00s)
=== RUN TestSecurityHandler_CreateDecision_MissingAction
--- PASS: TestSecurityHandler_CreateDecision_MissingAction (0.00s)
=== RUN TestSecurityHandler_CreateDecision_InvalidPayload
--- PASS: TestSecurityHandler_CreateDecision_InvalidPayload (0.00s)
=== RUN TestSecurityHandler_ListRuleSets_Success
--- PASS: TestSecurityHandler_ListRuleSets_Success (0.00s)
=== RUN TestSecurityHandler_UpsertRuleSet_Success
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:212 record not found
[0.037ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "test-ruleset" ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityHandler_UpsertRuleSet_Success (0.00s)
=== RUN TestSecurityHandler_UpsertRuleSet_MissingName
--- PASS: TestSecurityHandler_UpsertRuleSet_MissingName (0.00s)
=== RUN TestSecurityHandler_UpsertRuleSet_InvalidPayload
--- PASS: TestSecurityHandler_UpsertRuleSet_InvalidPayload (0.00s)
=== RUN TestSecurityHandler_DeleteRuleSet_Success
--- PASS: TestSecurityHandler_DeleteRuleSet_Success (0.00s)
=== RUN TestSecurityHandler_DeleteRuleSet_NotFound
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:234 record not found
[0.018ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE `security_rule_sets`.`id` = 999 ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityHandler_DeleteRuleSet_NotFound (0.00s)
=== RUN TestSecurityHandler_DeleteRuleSet_InvalidID
--- PASS: TestSecurityHandler_DeleteRuleSet_InvalidID (0.00s)
=== RUN TestSecurityHandler_DeleteRuleSet_EmptyID
--- PASS: TestSecurityHandler_DeleteRuleSet_EmptyID (0.00s)
=== RUN TestSecurityHandler_Enable_NoConfigNoWhitelist
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.083ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.126ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_Enable_NoConfigNoWhitelist (0.00s)
=== RUN TestSecurityHandler_Enable_WithWhitelist
--- PASS: TestSecurityHandler_Enable_WithWhitelist (0.00s)
=== RUN TestSecurityHandler_Enable_IPNotInWhitelist
--- PASS: TestSecurityHandler_Enable_IPNotInWhitelist (0.00s)
=== RUN TestSecurityHandler_Enable_WithValidBreakGlassToken
--- PASS: TestSecurityHandler_Enable_WithValidBreakGlassToken (0.12s)
=== RUN TestSecurityHandler_Enable_WithInvalidBreakGlassToken
--- PASS: TestSecurityHandler_Enable_WithInvalidBreakGlassToken (0.00s)
=== RUN TestSecurityHandler_Disable_FromLocalhost
--- PASS: TestSecurityHandler_Disable_FromLocalhost (0.00s)
=== RUN TestSecurityHandler_Disable_FromRemoteWithToken
--- PASS: TestSecurityHandler_Disable_FromRemoteWithToken (0.12s)
=== RUN TestSecurityHandler_Disable_FromRemoteNoToken
--- PASS: TestSecurityHandler_Disable_FromRemoteNoToken (0.00s)
=== RUN TestSecurityHandler_Disable_FromRemoteInvalidToken
--- PASS: TestSecurityHandler_Disable_FromRemoteInvalidToken (0.00s)
=== RUN TestSecurityHandler_GenerateBreakGlass_NoConfig
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:121 record not found
[0.137ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GenerateBreakGlass_NoConfig (0.06s)
=== RUN TestSecurityHandler_Disable_FromIPv6Localhost
--- PASS: TestSecurityHandler_Disable_FromIPv6Localhost (0.00s)
=== RUN TestSecurityHandler_Enable_WithCIDRWhitelist
--- PASS: TestSecurityHandler_Enable_WithCIDRWhitelist (0.00s)
=== RUN TestSecurityHandler_Enable_WithExactIPWhitelist
--- PASS: TestSecurityHandler_Enable_WithExactIPWhitelist (0.00s)
=== RUN TestSecurityHandler_GetStatus_Fixed
=== RUN TestSecurityHandler_GetStatus_Fixed/All_Disabled
=== RUN TestSecurityHandler_GetStatus_Fixed/All_Enabled
--- PASS: TestSecurityHandler_GetStatus_Fixed (0.00s)
--- PASS: TestSecurityHandler_GetStatus_Fixed/All_Disabled (0.00s)
--- PASS: TestSecurityHandler_GetStatus_Fixed/All_Enabled (0.00s)
=== RUN TestSecurityHandler_CreateAndListDecisionAndRulesets
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:212 record not found
[0.062ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityHandler_CreateAndListDecisionAndRulesets (0.07s)
=== RUN TestSecurityHandler_UpsertDeleteTriggersApplyConfig
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:212 record not found
[0.045ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.063ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestSecurityHandler_UpsertDeleteTriggersApplyConfig (0.01s)
=== RUN TestSecurityHandler_GetStatus_RespectsSettingsTable
=== RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_enabled_via_settings_overrides_disabled_config
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.114ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_settings_test.go:145:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:145
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_enabled_via_settings_overrides_disabled_config
Messages: WAF enabled mismatch
=== RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/Rate_Limit_enabled_via_settings_overrides_disabled_config
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.039ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_settings_test.go:149:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:149
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/Rate_Limit_enabled_via_settings_overrides_disabled_config
Messages: Rate Limit enabled mismatch
=== RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/CrowdSec_enabled_via_settings_overrides_disabled_config
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.037ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_settings_test.go:153:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:153
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/CrowdSec_enabled_via_settings_overrides_disabled_config
Messages: CrowdSec enabled mismatch
=== RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.032ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_settings_test.go:145:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:145
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings
Messages: WAF enabled mismatch
security_handler_settings_test.go:149:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:149
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings
Messages: Rate Limit enabled mismatch
security_handler_settings_test.go:153:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:153
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings
Messages: CrowdSec enabled mismatch
=== RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_disabled_via_settings_overrides_enabled_config
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.033ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
=== RUN TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled)
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.029ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_settings_test.go:145:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:145
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled)
Messages: WAF enabled mismatch
security_handler_settings_test.go:149:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:149
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled)
Messages: Rate Limit enabled mismatch
security_handler_settings_test.go:153:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:153
Error: Not equal:
expected: true
actual : false
Test: TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled)
Messages: CrowdSec enabled mismatch
--- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable (0.01s)
--- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_enabled_via_settings_overrides_disabled_config (0.00s)
--- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/Rate_Limit_enabled_via_settings_overrides_disabled_config (0.00s)
--- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/CrowdSec_enabled_via_settings_overrides_disabled_config (0.00s)
--- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/All_modules_enabled_via_settings (0.00s)
--- PASS: TestSecurityHandler_GetStatus_RespectsSettingsTable/WAF_disabled_via_settings_overrides_enabled_config (0.00s)
--- FAIL: TestSecurityHandler_GetStatus_RespectsSettingsTable/No_settings_-_falls_back_to_config_(enabled) (0.00s)
=== RUN TestSecurityHandler_GetStatus_WAFModeFromSettings
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.049ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_settings_test.go:187:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:187
Error: Should be true
Test: TestSecurityHandler_GetStatus_WAFModeFromSettings
--- FAIL: TestSecurityHandler_GetStatus_WAFModeFromSettings (0.01s)
=== RUN TestSecurityHandler_GetStatus_RateLimitModeFromSettings
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/security_handler.go:68 record not found
[0.041ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
security_handler_settings_test.go:218:
Error Trace: /projects/Charon/backend/internal/api/handlers/security_handler_settings_test.go:218
Error: Should be true
Test: TestSecurityHandler_GetStatus_RateLimitModeFromSettings
--- FAIL: TestSecurityHandler_GetStatus_RateLimitModeFromSettings (0.00s)
=== RUN TestSecurityHandler_GetWAFExclusions_Empty
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.034ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_GetWAFExclusions_Empty (0.00s)
=== RUN TestSecurityHandler_GetWAFExclusions_WithExclusions
--- PASS: TestSecurityHandler_GetWAFExclusions_WithExclusions (0.00s)
=== RUN TestSecurityHandler_GetWAFExclusions_InvalidJSON
time="2025-12-12T19:05:52Z" level=warning msg="Failed to parse WAF exclusions" error="invalid character 'i' looking for beginning of value"
--- PASS: TestSecurityHandler_GetWAFExclusions_InvalidJSON (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_Success
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.036ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.026ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_AddWAFExclusion_Success (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_WithTarget
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.023ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.024ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_AddWAFExclusion_WithTarget (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_ToExistingConfig
--- PASS: TestSecurityHandler_AddWAFExclusion_ToExistingConfig (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_Duplicate
--- PASS: TestSecurityHandler_AddWAFExclusion_Duplicate (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_DuplicateWithDifferentTarget
--- PASS: TestSecurityHandler_AddWAFExclusion_DuplicateWithDifferentTarget (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_MissingRuleID
--- PASS: TestSecurityHandler_AddWAFExclusion_MissingRuleID (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_InvalidRuleID
--- PASS: TestSecurityHandler_AddWAFExclusion_InvalidRuleID (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_NegativeRuleID
--- PASS: TestSecurityHandler_AddWAFExclusion_NegativeRuleID (0.00s)
=== RUN TestSecurityHandler_AddWAFExclusion_InvalidPayload
--- PASS: TestSecurityHandler_AddWAFExclusion_InvalidPayload (0.00s)
=== RUN TestSecurityHandler_DeleteWAFExclusion_Success
--- PASS: TestSecurityHandler_DeleteWAFExclusion_Success (0.00s)
=== RUN TestSecurityHandler_DeleteWAFExclusion_WithTarget
--- PASS: TestSecurityHandler_DeleteWAFExclusion_WithTarget (0.00s)
=== RUN TestSecurityHandler_DeleteWAFExclusion_NotFound
--- PASS: TestSecurityHandler_DeleteWAFExclusion_NotFound (0.00s)
=== RUN TestSecurityHandler_DeleteWAFExclusion_NoConfig
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.041ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_DeleteWAFExclusion_NoConfig (0.00s)
=== RUN TestSecurityHandler_DeleteWAFExclusion_InvalidRuleID
--- PASS: TestSecurityHandler_DeleteWAFExclusion_InvalidRuleID (0.00s)
=== RUN TestSecurityHandler_DeleteWAFExclusion_ZeroRuleID
--- PASS: TestSecurityHandler_DeleteWAFExclusion_ZeroRuleID (0.00s)
=== RUN TestSecurityHandler_DeleteWAFExclusion_NegativeRuleID
--- PASS: TestSecurityHandler_DeleteWAFExclusion_NegativeRuleID (0.00s)
=== RUN TestSecurityHandler_WAFExclusion_FullWorkflow
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.026ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.025ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.024ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityHandler_WAFExclusion_FullWorkflow (0.00s)
=== RUN TestProxyHost_WAFDisabled_DefaultFalse
--- PASS: TestProxyHost_WAFDisabled_DefaultFalse (0.00s)
=== RUN TestProxyHost_WAFDisabled_SetTrue
--- PASS: TestProxyHost_WAFDisabled_SetTrue (0.00s)
=== RUN TestSecurityConfig_WAFParanoiaLevel_Default
--- PASS: TestSecurityConfig_WAFParanoiaLevel_Default (0.00s)
=== RUN TestSecurityConfig_WAFParanoiaLevel_CustomValue
--- PASS: TestSecurityConfig_WAFParanoiaLevel_CustomValue (0.00s)
=== RUN TestSecurityConfig_WAFExclusions_Empty
--- PASS: TestSecurityConfig_WAFExclusions_Empty (0.00s)
=== RUN TestSecurityConfig_WAFExclusions_JSONArray
--- PASS: TestSecurityConfig_WAFExclusions_JSONArray (0.00s)
=== RUN TestSecurityNotificationHandler_GetSettings
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:29 record not found
[0.018ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationHandler_GetSettings (0.00s)
=== RUN TestSecurityNotificationHandler_UpdateSettings
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.026ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationHandler_UpdateSettings (0.00s)
=== RUN TestSecurityNotificationHandler_InvalidLevel
--- PASS: TestSecurityNotificationHandler_InvalidLevel (0.00s)
=== RUN TestSecurityNotificationHandler_UpdateSettings_InvalidJSON
--- PASS: TestSecurityNotificationHandler_UpdateSettings_InvalidJSON (0.00s)
=== RUN TestSecurityNotificationHandler_UpdateSettings_ValidLevels
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.029ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationHandler_UpdateSettings_ValidLevels (0.00s)
=== RUN TestSecurityNotificationHandler_GetSettings_DatabaseError
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:29 sql: database is closed
[0.004ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationHandler_GetSettings_DatabaseError (0.00s)
=== RUN TestSecurityNotificationHandler_GetSettings_EmptySettings
2025/12/12 19:05:52 /projects/Charon/backend/internal/services/security_notification_service.go:29 record not found
[0.018ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationHandler_GetSettings_EmptySettings (0.00s)
=== RUN TestSecurityHandler_GetRateLimitPresets
--- PASS: TestSecurityHandler_GetRateLimitPresets (0.00s)
=== RUN TestSecurityHandler_GetRateLimitPresets_StandardPreset
--- PASS: TestSecurityHandler_GetRateLimitPresets_StandardPreset (0.00s)
=== RUN TestSecurityHandler_GetRateLimitPresets_LoginPreset
--- PASS: TestSecurityHandler_GetRateLimitPresets_LoginPreset (0.00s)
=== RUN TestGetClientIPHeadersAndRemoteAddr
--- PASS: TestGetClientIPHeadersAndRemoteAddr (0.00s)
=== RUN TestGetMyIPHandler
=== RUN TestGetMyIPHandler/with_CF_header
=== RUN TestGetMyIPHandler/with_X-Forwarded-For_header
=== RUN TestGetMyIPHandler/with_X-Real-IP_header
=== RUN TestGetMyIPHandler/direct_connection
--- PASS: TestGetMyIPHandler (0.00s)
--- PASS: TestGetMyIPHandler/with_CF_header (0.00s)
--- PASS: TestGetMyIPHandler/with_X-Forwarded-For_header (0.00s)
--- PASS: TestGetMyIPHandler/with_X-Real-IP_header (0.00s)
--- PASS: TestGetMyIPHandler/direct_connection (0.00s)
=== RUN TestUpdateHandler_Check
--- PASS: TestUpdateHandler_Check (0.00s)
=== RUN TestUserHandler_GetSetupStatus_Error
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:55 no such table: users
[0.018ms] [rows:0] SELECT count(*) FROM `users`
--- PASS: TestUserHandler_GetSetupStatus_Error (0.00s)
=== RUN TestUserHandler_Setup_CheckStatusError
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:75 no such table: users
[0.018ms] [rows:0] SELECT count(*) FROM `users`
--- PASS: TestUserHandler_Setup_CheckStatusError (0.00s)
=== RUN TestUserHandler_Setup_AlreadyCompleted
--- PASS: TestUserHandler_Setup_AlreadyCompleted (0.06s)
=== RUN TestUserHandler_Setup_InvalidJSON
--- PASS: TestUserHandler_Setup_InvalidJSON (0.00s)
=== RUN TestUserHandler_RegenerateAPIKey_Unauthorized
--- PASS: TestUserHandler_RegenerateAPIKey_Unauthorized (0.00s)
=== RUN TestUserHandler_RegenerateAPIKey_DBError
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:152 no such table: users
[0.056ms] [rows:0] UPDATE `users` SET `api_key`="b8c75043-8fe9-4819-acaa-a65bc2a5d020",`updated_at`="2025-12-12 19:05:52.585" WHERE id = 1
--- PASS: TestUserHandler_RegenerateAPIKey_DBError (0.00s)
=== RUN TestUserHandler_GetProfile_Unauthorized
--- PASS: TestUserHandler_GetProfile_Unauthorized (0.00s)
=== RUN TestUserHandler_GetProfile_NotFound
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:169 record not found
[0.031ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 9999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_GetProfile_NotFound (0.00s)
=== RUN TestUserHandler_UpdateProfile_Unauthorized
--- PASS: TestUserHandler_UpdateProfile_Unauthorized (0.00s)
=== RUN TestUserHandler_UpdateProfile_InvalidJSON
--- PASS: TestUserHandler_UpdateProfile_InvalidJSON (0.00s)
=== RUN TestUserHandler_UpdateProfile_UserNotFound
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:205 record not found
[0.043ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 9999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_UpdateProfile_UserNotFound (0.00s)
=== RUN TestUserHandler_UpdateProfile_EmailConflict
--- PASS: TestUserHandler_UpdateProfile_EmailConflict (0.12s)
=== RUN TestUserHandler_UpdateProfile_EmailChangeNoPassword
--- PASS: TestUserHandler_UpdateProfile_EmailChangeNoPassword (0.06s)
=== RUN TestUserHandler_UpdateProfile_WrongPassword
--- PASS: TestUserHandler_UpdateProfile_WrongPassword (0.12s)
=== RUN TestUserHandler_GetSetupStatus
--- PASS: TestUserHandler_GetSetupStatus (0.00s)
=== RUN TestUserHandler_Setup
--- PASS: TestUserHandler_Setup (0.06s)
=== 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/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:169 record not found
[0.025ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 99999 ORDER BY `users`.`id` LIMIT 1
2025/12/12 19:05:52 /projects/Charon/backend/internal/api/handlers/user_handler.go:152 no such table: users
[0.048ms] [rows:0] UPDATE `users` SET `api_key`="5ecabc02-1821-4ec6-bd8c-1b217bc10aa4",`updated_at`="2025-12-12 19:05:52.978" 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 (0.19s)
--- PASS: TestUserHandler_UpdateProfile/Success_Name_Only (0.00s)
--- PASS: TestUserHandler_UpdateProfile/Success_Email_Change (0.06s)
--- PASS: TestUserHandler_UpdateProfile/Fail_Email_Change_No_Password (0.00s)
--- PASS: TestUserHandler_UpdateProfile/Fail_Email_Change_Wrong_Password (0.06s)
--- PASS: TestUserHandler_UpdateProfile/Fail_Email_In_Use (0.00s)
=== RUN TestUserHandler_UpdateProfile_Errors
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:205 record not found
[0.040ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_UpdateProfile_Errors (0.00s)
=== RUN TestUserHandler_ListUsers_NonAdmin
--- PASS: TestUserHandler_ListUsers_NonAdmin (0.00s)
=== RUN TestUserHandler_ListUsers_Admin
--- PASS: TestUserHandler_ListUsers_Admin (0.00s)
=== RUN TestUserHandler_CreateUser_NonAdmin
--- PASS: TestUserHandler_CreateUser_NonAdmin (0.00s)
=== RUN TestUserHandler_CreateUser_Admin
--- PASS: TestUserHandler_CreateUser_Admin (0.07s)
=== RUN TestUserHandler_CreateUser_InvalidJSON
--- PASS: TestUserHandler_CreateUser_InvalidJSON (0.00s)
=== RUN TestUserHandler_CreateUser_DuplicateEmail
--- PASS: TestUserHandler_CreateUser_DuplicateEmail (0.00s)
=== RUN TestUserHandler_CreateUser_WithPermittedHosts
--- PASS: TestUserHandler_CreateUser_WithPermittedHosts (0.06s)
=== RUN TestUserHandler_GetUser_NonAdmin
--- PASS: TestUserHandler_GetUser_NonAdmin (0.00s)
=== RUN TestUserHandler_GetUser_InvalidID
--- PASS: TestUserHandler_GetUser_InvalidID (0.00s)
=== RUN TestUserHandler_GetUser_NotFound
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:540 record not found
[0.031ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_GetUser_NotFound (0.00s)
=== RUN TestUserHandler_GetUser_Success
--- PASS: TestUserHandler_GetUser_Success (0.00s)
=== RUN TestUserHandler_UpdateUser_NonAdmin
--- PASS: TestUserHandler_UpdateUser_NonAdmin (0.00s)
=== RUN TestUserHandler_UpdateUser_InvalidID
--- PASS: TestUserHandler_UpdateUser_InvalidID (0.00s)
=== RUN TestUserHandler_UpdateUser_InvalidJSON
--- PASS: TestUserHandler_UpdateUser_InvalidJSON (0.00s)
=== RUN TestUserHandler_UpdateUser_NotFound
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:592 record not found
[0.026ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_UpdateUser_NotFound (0.00s)
=== RUN TestUserHandler_UpdateUser_Success
--- PASS: TestUserHandler_UpdateUser_Success (0.00s)
=== RUN TestUserHandler_DeleteUser_NonAdmin
--- PASS: TestUserHandler_DeleteUser_NonAdmin (0.00s)
=== RUN TestUserHandler_DeleteUser_InvalidID
--- PASS: TestUserHandler_DeleteUser_InvalidID (0.00s)
=== RUN TestUserHandler_DeleteUser_NotFound
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:662 record not found
[0.025ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_DeleteUser_NotFound (0.00s)
=== RUN TestUserHandler_DeleteUser_Success
--- PASS: TestUserHandler_DeleteUser_Success (0.00s)
=== RUN TestUserHandler_DeleteUser_CannotDeleteSelf
--- PASS: TestUserHandler_DeleteUser_CannotDeleteSelf (0.00s)
=== RUN TestUserHandler_UpdateUserPermissions_NonAdmin
--- PASS: TestUserHandler_UpdateUserPermissions_NonAdmin (0.00s)
=== RUN TestUserHandler_UpdateUserPermissions_InvalidID
--- PASS: TestUserHandler_UpdateUserPermissions_InvalidID (0.00s)
=== RUN TestUserHandler_UpdateUserPermissions_InvalidJSON
--- PASS: TestUserHandler_UpdateUserPermissions_InvalidJSON (0.00s)
=== RUN TestUserHandler_UpdateUserPermissions_NotFound
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:703 record not found
[0.025ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_UpdateUserPermissions_NotFound (0.00s)
=== RUN TestUserHandler_UpdateUserPermissions_Success
--- PASS: TestUserHandler_UpdateUserPermissions_Success (0.00s)
=== RUN TestUserHandler_ValidateInvite_MissingToken
--- PASS: TestUserHandler_ValidateInvite_MissingToken (0.00s)
=== RUN TestUserHandler_ValidateInvite_InvalidToken
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:752 record not found
[0.035ms] [rows:0] SELECT * FROM `users` WHERE invite_token = "invalidtoken" ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_ValidateInvite_InvalidToken (0.00s)
=== RUN TestUserHandler_ValidateInvite_ExpiredToken
--- PASS: TestUserHandler_ValidateInvite_ExpiredToken (0.00s)
=== RUN TestUserHandler_ValidateInvite_AlreadyAccepted
--- PASS: TestUserHandler_ValidateInvite_AlreadyAccepted (0.00s)
=== RUN TestUserHandler_ValidateInvite_Success
--- PASS: TestUserHandler_ValidateInvite_Success (0.00s)
=== RUN TestUserHandler_AcceptInvite_InvalidJSON
--- PASS: TestUserHandler_AcceptInvite_InvalidJSON (0.00s)
=== RUN TestUserHandler_AcceptInvite_InvalidToken
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:791 record not found
[0.051ms] [rows:0] SELECT * FROM `users` WHERE invite_token = "invalidtoken" ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_AcceptInvite_InvalidToken (0.00s)
=== RUN TestUserHandler_AcceptInvite_Success
--- PASS: TestUserHandler_AcceptInvite_Success (0.06s)
=== RUN TestGenerateSecureToken
--- PASS: TestGenerateSecureToken (0.00s)
=== RUN TestUserHandler_InviteUser_NonAdmin
--- PASS: TestUserHandler_InviteUser_NonAdmin (0.00s)
=== RUN TestUserHandler_InviteUser_InvalidJSON
--- PASS: TestUserHandler_InviteUser_InvalidJSON (0.00s)
=== RUN TestUserHandler_InviteUser_DuplicateEmail
--- PASS: TestUserHandler_InviteUser_DuplicateEmail (0.00s)
=== RUN TestUserHandler_InviteUser_Success
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:420 record not found
[0.041ms] [rows:0] SELECT * FROM `users` WHERE email = "newinvite@example.com" ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_InviteUser_Success (0.00s)
=== RUN TestUserHandler_InviteUser_WithPermittedHosts
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:420 record not found
[0.029ms] [rows:0] SELECT * FROM `users` WHERE email = "invitee-perms@example.com" ORDER BY `users`.`id` LIMIT 1
--- PASS: TestUserHandler_InviteUser_WithPermittedHosts (0.00s)
=== RUN TestGetBaseURL
--- PASS: TestGetBaseURL (0.00s)
=== RUN TestGetAppName
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/user_handler.go:518 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "app_name" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestGetAppName (0.00s)
=== RUN TestUserHandler_AcceptInvite_ExpiredToken
--- PASS: TestUserHandler_AcceptInvite_ExpiredToken (0.00s)
=== RUN TestUserHandler_AcceptInvite_AlreadyAccepted
--- PASS: TestUserHandler_AcceptInvite_AlreadyAccepted (0.00s)
=== RUN TestUserLoginAfterEmailChange
--- PASS: TestUserLoginAfterEmailChange (0.30s)
=== RUN TestRemoteServerHandler_List
--- PASS: TestRemoteServerHandler_List (0.00s)
=== RUN TestRemoteServerHandler_Create
--- PASS: TestRemoteServerHandler_Create (0.00s)
=== RUN TestRemoteServerHandler_TestConnection
--- PASS: TestRemoteServerHandler_TestConnection (0.00s)
=== RUN TestRemoteServerHandler_Get
--- PASS: TestRemoteServerHandler_Get (0.00s)
=== RUN TestRemoteServerHandler_Update
--- PASS: TestRemoteServerHandler_Update (0.00s)
=== RUN TestRemoteServerHandler_Delete
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.029ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "21ab604b-2f0a-4078-8012-f3165c662e99" ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerHandler_Delete (0.00s)
=== RUN TestProxyHostHandler_List
--- PASS: TestProxyHostHandler_List (0.00s)
=== RUN TestProxyHostHandler_Create
--- PASS: TestProxyHostHandler_Create (0.00s)
=== RUN TestProxyHostHandler_PartialUpdate_DoesNotWipeFields
--- PASS: TestProxyHostHandler_PartialUpdate_DoesNotWipeFields (0.00s)
=== RUN TestHealthHandler
--- PASS: TestHealthHandler (0.00s)
=== RUN TestRemoteServerHandler_Errors
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.033ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.019ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.014ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerHandler_Errors (0.00s)
=== RUN TestImportHandler_GetStatus
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found
[0.093ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found
[0.051ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:70 record not found
[0.026ms] [rows:0] SELECT * FROM `import_sessions` WHERE source_file = "/tmp/TestImportHandler_GetStatus3246735047/001/mounted.caddyfile" AND status = "committed" ORDER BY committed_at DESC,`import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_GetStatus (0.00s)
=== RUN TestImportHandler_GetPreview
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:122 record not found
[0.102ms] [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.00s)
=== RUN TestImportHandler_Cancel
--- PASS: TestImportHandler_Cancel (0.00s)
=== RUN TestImportHandler_Commit
--- PASS: TestImportHandler_Commit (0.00s)
=== RUN TestImportHandler_Upload
--- PASS: TestImportHandler_Upload (0.00s)
=== RUN TestImportHandler_GetPreview_WithContent
--- PASS: TestImportHandler_GetPreview_WithContent (0.00s)
=== RUN TestImportHandler_Commit_Errors
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.036ms] [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.00s)
=== RUN TestImportHandler_Cancel_Errors
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found
[0.033ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Cancel_Errors (0.00s)
=== RUN TestCheckMountedImport
--- PASS: TestCheckMountedImport (0.00s)
=== RUN TestImportHandler_Upload_Failure
--- PASS: TestImportHandler_Upload_Failure (0.00s)
=== RUN TestImportHandler_Upload_Conflict
--- PASS: TestImportHandler_Upload_Conflict (0.01s)
=== RUN TestImportHandler_GetPreview_BackupContent
--- PASS: TestImportHandler_GetPreview_BackupContent (0.00s)
=== RUN TestImportHandler_RegisterRoutes
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:60 record not found
[0.092ms] [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.00s)
=== RUN TestImportHandler_GetPreview_TransientMount
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:122 record not found
[0.148ms] [rows:0] SELECT * FROM `import_sessions` WHERE status IN ("pending","reviewing") ORDER BY created_at DESC,`import_sessions`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:167 record not found
[0.042ms] [rows:0] SELECT * FROM `import_sessions` WHERE source_file = "/tmp/TestImportHandler_GetPreview_TransientMount3464543619/001/mounted.caddyfile" AND status = "committed" ORDER BY committed_at DESC,`import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_GetPreview_TransientMount (0.00s)
=== RUN TestImportHandler_Commit_TransientUpload
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.036ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "06368b2d-5607-4012-9972-7646e877fc61" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Commit_TransientUpload (0.01s)
=== RUN TestImportHandler_Commit_TransientMount
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.045ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "00e915f7-0eb9-4b38-9d1a-8bd2d7f138d6" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Commit_TransientMount (0.01s)
=== RUN TestImportHandler_Cancel_TransientUpload
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found
[0.071ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "7c49c0f2-9908-4546-8a9c-d3c47c4c9860" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Cancel_TransientUpload (0.01s)
=== RUN TestImportHandler_Errors
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:583 record not found
[0.036ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/import_handler.go:734 record not found
[0.039ms] [rows:0] SELECT * FROM `import_sessions` WHERE uuid = "non-existent" ORDER BY `import_sessions`.`id` LIMIT 1
--- PASS: TestImportHandler_Errors (0.00s)
=== 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.00s)
--- 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.00s)
=== 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.01s)
--- PASS: TestImportHandler_UploadMulti/single_Caddyfile (0.01s)
--- 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.00s)
=== RUN TestNotificationHandler_MarkAsRead
--- PASS: TestNotificationHandler_MarkAsRead (0.00s)
=== RUN TestNotificationHandler_MarkAllAsRead
--- PASS: TestNotificationHandler_MarkAllAsRead (0.00s)
=== RUN TestNotificationHandler_MarkAllAsRead_Error
--- PASS: TestNotificationHandler_MarkAllAsRead_Error (0.00s)
=== RUN TestNotificationHandler_DBError
--- PASS: TestNotificationHandler_DBError (0.00s)
=== RUN TestNotificationProviderHandler_CRUD
[GIN] 2025/12/12 - 19:05:53 | 201 | 71.971µs | | POST "/api/v1/notifications/providers"
[GIN] 2025/12/12 - 19:05:53 | 200 | 46.98µs | | GET "/api/v1/notifications/providers"
[GIN] 2025/12/12 - 19:05:53 | 200 | 70.04µs | | PUT "/api/v1/notifications/providers/75de70f2-fff3-42d4-b47a-1fdea69c41aa"
[GIN] 2025/12/12 - 19:05:53 | 200 | 32.96µs | | DELETE "/api/v1/notifications/providers/75de70f2-fff3-42d4-b47a-1fdea69c41aa"
--- PASS: TestNotificationProviderHandler_CRUD (0.00s)
=== RUN TestNotificationProviderHandler_Templates
[GIN] 2025/12/12 - 19:05:53 | 200 | 10.81µs | | GET "/api/v1/notifications/templates"
--- PASS: TestNotificationProviderHandler_Templates (0.00s)
=== RUN TestNotificationProviderHandler_Test
[GIN] 2025/12/12 - 19:05:53 | 400 | 80.19µs | | POST "/api/v1/notifications/providers/test"
--- PASS: TestNotificationProviderHandler_Test (0.00s)
=== RUN TestNotificationProviderHandler_Errors
[GIN] 2025/12/12 - 19:05:53 | 400 | 5.739µs | | POST "/api/v1/notifications/providers"
[GIN] 2025/12/12 - 19:05:53 | 400 | 2.42µs | | PUT "/api/v1/notifications/providers/123"
[GIN] 2025/12/12 - 19:05:53 | 400 | 2.57µs | | POST "/api/v1/notifications/providers/test"
--- PASS: TestNotificationProviderHandler_Errors (0.00s)
=== RUN TestNotificationProviderHandler_InvalidCustomTemplate_Rejects
[GIN] 2025/12/12 - 19:05:53 | 400 | 35.72µs | | POST "/api/v1/notifications/providers"
[GIN] 2025/12/12 - 19:05:53 | 201 | 66.25µs | | POST "/api/v1/notifications/providers"
[GIN] 2025/12/12 - 19:05:53 | 400 | 16.03µs | | PUT "/api/v1/notifications/providers/a0f9d3bf-98ac-497f-a92f-b6e4ff002230"
--- PASS: TestNotificationProviderHandler_InvalidCustomTemplate_Rejects (0.00s)
=== RUN TestNotificationProviderHandler_Preview
[GIN] 2025/12/12 - 19:05:53 | 200 | 61.36µs | | POST "/api/v1/notifications/providers/preview"
[GIN] 2025/12/12 - 19:05:53 | 400 | 28.06µs | | POST "/api/v1/notifications/providers/preview"
--- PASS: TestNotificationProviderHandler_Preview (0.00s)
=== RUN TestRemoteServerHandler_TestConnectionCustom
[GIN] 2025/12/12 - 19:05:53 | 200 | 229.651µs | | POST "/api/v1/remote-servers/test"
--- PASS: TestRemoteServerHandler_TestConnectionCustom (0.00s)
=== RUN TestRemoteServerHandler_FullCRUD
[GIN] 2025/12/12 - 19:05:53 | 201 | 368.301µs | | POST "/api/v1/remote-servers"
[GIN] 2025/12/12 - 19:05:53 | 200 | 64.74µs | | GET "/api/v1/remote-servers"
[GIN] 2025/12/12 - 19:05:53 | 200 | 56.361µs | | GET "/api/v1/remote-servers/fc00458b-7fd6-4d4e-b956-5d9c9485d12a"
[GIN] 2025/12/12 - 19:05:53 | 200 | 296.59µs | | PUT "/api/v1/remote-servers/fc00458b-7fd6-4d4e-b956-5d9c9485d12a"
[GIN] 2025/12/12 - 19:05:53 | 204 | 144.94µs | | DELETE "/api/v1/remote-servers/fc00458b-7fd6-4d4e-b956-5d9c9485d12a"
[GIN] 2025/12/12 - 19:05:53 | 400 | 5.6µs | | POST "/api/v1/remote-servers"
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.037ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1
[GIN] 2025/12/12 - 19:05:53 | 404 | 88.54µs | | PUT "/api/v1/remote-servers/non-existent-uuid"
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/remoteserver_service.go:77 record not found
[0.029ms] [rows:0] SELECT * FROM `remote_servers` WHERE uuid = "non-existent-uuid" ORDER BY `remote_servers`.`id` LIMIT 1
[GIN] 2025/12/12 - 19:05:53 | 404 | 51.22µs | | DELETE "/api/v1/remote-servers/non-existent-uuid"
--- PASS: TestRemoteServerHandler_FullCRUD (0.00s)
=== 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 TestSettingsHandler_GetSMTPConfig
--- PASS: TestSettingsHandler_GetSMTPConfig (0.00s)
=== RUN TestSettingsHandler_GetSMTPConfig_Empty
--- PASS: TestSettingsHandler_GetSMTPConfig_Empty (0.00s)
=== RUN TestSettingsHandler_GetSMTPConfig_DatabaseError
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:46 sql: database is closed
[0.007ms] [rows:0] SELECT * FROM `settings` WHERE category = "smtp"
--- PASS: TestSettingsHandler_GetSMTPConfig_DatabaseError (0.00s)
=== RUN TestSettingsHandler_UpdateSMTPConfig_NonAdmin
--- PASS: TestSettingsHandler_UpdateSMTPConfig_NonAdmin (0.00s)
=== RUN TestSettingsHandler_UpdateSMTPConfig_InvalidJSON
--- PASS: TestSettingsHandler_UpdateSMTPConfig_InvalidJSON (0.00s)
=== RUN TestSettingsHandler_UpdateSMTPConfig_Success
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_host" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_port" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_username" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_password" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_from_address" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_encryption" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestSettingsHandler_UpdateSMTPConfig_Success (0.00s)
=== RUN TestSettingsHandler_UpdateSMTPConfig_KeepExistingPassword
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/mail_service.go:97 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "smtp_username" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestSettingsHandler_UpdateSMTPConfig_KeepExistingPassword (0.00s)
=== RUN TestSettingsHandler_TestSMTPConfig_NonAdmin
--- PASS: TestSettingsHandler_TestSMTPConfig_NonAdmin (0.00s)
=== RUN TestSettingsHandler_TestSMTPConfig_NotConfigured
--- PASS: TestSettingsHandler_TestSMTPConfig_NotConfigured (0.00s)
=== RUN TestSettingsHandler_SendTestEmail_NonAdmin
--- PASS: TestSettingsHandler_SendTestEmail_NonAdmin (0.00s)
=== RUN TestSettingsHandler_SendTestEmail_InvalidJSON
--- PASS: TestSettingsHandler_SendTestEmail_InvalidJSON (0.00s)
=== RUN TestSettingsHandler_SendTestEmail_NotConfigured
--- PASS: TestSettingsHandler_SendTestEmail_NotConfigured (0.00s)
=== RUN TestMaskPassword
--- PASS: TestMaskPassword (0.00s)
=== RUN TestUptimeHandler_List
[GIN] 2025/12/12 - 19:05:53 | 200 | 141.91µs | | GET "/api/v1/uptime"
--- PASS: TestUptimeHandler_List (0.00s)
=== RUN TestUptimeHandler_GetHistory
[GIN] 2025/12/12 - 19:05:53 | 200 | 85.09µs | | GET "/api/v1/uptime/monitor-1/history"
--- PASS: TestUptimeHandler_GetHistory (0.00s)
=== RUN TestUptimeHandler_CheckMonitor
[GIN] 2025/12/12 - 19:05:53 | 200 | 54.289µs | | POST "/api/v1/uptime/check-mon-1/check"
--- PASS: TestUptimeHandler_CheckMonitor (0.00s)
=== RUN TestUptimeHandler_CheckMonitor_NotFound
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:869 record not found
[0.039ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1
[GIN] 2025/12/12 - 19:05:53 | 404 | 79.99µs | | POST "/api/v1/uptime/nonexistent/check"
--- PASS: TestUptimeHandler_CheckMonitor_NotFound (0.00s)
=== RUN TestUptimeHandler_Update
=== RUN TestUptimeHandler_Update/success
[GIN] 2025/12/12 - 19:05:53 | 200 | 297.212µs | | PUT "/api/v1/uptime/monitor-update"
=== RUN TestUptimeHandler_Update/invalid_json
[GIN] 2025/12/12 - 19:05:53 | 400 | 6.02µs | | PUT "/api/v1/uptime/monitor-1"
=== RUN TestUptimeHandler_Update/not_found
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:883 record not found
[0.027ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1
[GIN] 2025/12/12 - 19:05:53 | 500 | 71.829µs | | PUT "/api/v1/uptime/nonexistent"
--- PASS: TestUptimeHandler_Update (0.01s)
--- PASS: TestUptimeHandler_Update/success (0.00s)
--- PASS: TestUptimeHandler_Update/invalid_json (0.00s)
--- PASS: TestUptimeHandler_Update/not_found (0.00s)
=== RUN TestUptimeHandler_DeleteAndSync
=== RUN TestUptimeHandler_DeleteAndSync/delete_monitor
[GIN] 2025/12/12 - 19:05:53 | 200 | 131.741µs | | DELETE "/api/v1/uptime/mon-delete"
2025/12/12 19:05:53 /projects/Charon/backend/internal/api/handlers/uptime_handler_test.go:202 record not found
[0.042ms] [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/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.063ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.031ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
[GIN] 2025/12/12 - 19:05:53 | 200 | 405.001µs | | POST "/api/v1/uptime/sync"
=== RUN TestUptimeHandler_DeleteAndSync/update_enabled_via_PUT
[GIN] 2025/12/12 - 19:05:53 | 200 | 121.051µs | | PUT "/api/v1/uptime/mon-enable"
--- PASS: TestUptimeHandler_DeleteAndSync (0.01s)
--- PASS: TestUptimeHandler_DeleteAndSync/delete_monitor (0.00s)
--- PASS: TestUptimeHandler_DeleteAndSync/sync_creates_monitor_for_proxy_host (0.00s)
--- PASS: TestUptimeHandler_DeleteAndSync/update_enabled_via_PUT (0.00s)
=== RUN TestUptimeHandler_Sync_Success
[GIN] 2025/12/12 - 19:05:53 | 200 | 63.5µs | | POST "/api/v1/uptime/sync"
--- PASS: TestUptimeHandler_Sync_Success (0.00s)
=== RUN TestUptimeHandler_Delete_Error
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:911 no such table: uptime_monitors
[0.017ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "nonexistent" ORDER BY `uptime_monitors`.`id` LIMIT 1
[GIN] 2025/12/12 - 19:05:53 | 500 | 53.249µs | | DELETE "/api/v1/uptime/nonexistent"
--- PASS: TestUptimeHandler_Delete_Error (0.00s)
=== RUN TestUptimeHandler_List_Error
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:863 no such table: uptime_monitors
[0.015ms] [rows:0] SELECT * FROM `uptime_monitors` ORDER BY name ASC
[GIN] 2025/12/12 - 19:05:53 | 500 | 50.51µs | | GET "/api/v1/uptime"
--- PASS: TestUptimeHandler_List_Error (0.00s)
=== RUN TestUptimeHandler_GetHistory_Error
2025/12/12 19:05:53 /projects/Charon/backend/internal/services/uptime_service.go:877 no such table: uptime_heartbeats
[0.020ms] [rows:0] SELECT * FROM `uptime_heartbeats` WHERE monitor_id = "monitor-1" ORDER BY created_at desc LIMIT 50
[GIN] 2025/12/12 - 19:05:53 | 500 | 65.371µs | | GET "/api/v1/uptime/monitor-1/history"
--- PASS: TestUptimeHandler_GetHistory_Error (0.00s)
FAIL
FAIL github.com/Wikid82/charon/backend/internal/api/handlers 20.305s
=== 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.07s)
=== RUN TestAuthMiddleware_ValidToken
--- PASS: TestAuthMiddleware_ValidToken (0.06s)
=== RUN TestAuthMiddleware_PrefersAuthorizationHeader
--- PASS: TestAuthMiddleware_PrefersAuthorizationHeader (0.06s)
=== RUN TestAuthMiddleware_InvalidToken
--- PASS: TestAuthMiddleware_InvalidToken (0.00s)
=== 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)
=== RUN TestSanitizeHeaders
=== RUN TestSanitizeHeaders/nil_headers
=== RUN TestSanitizeHeaders/redacts_sensitive_headers
=== RUN TestSanitizeHeaders/sanitizes_and_truncates_values
--- PASS: TestSanitizeHeaders (0.00s)
--- PASS: TestSanitizeHeaders/nil_headers (0.00s)
--- PASS: TestSanitizeHeaders/redacts_sensitive_headers (0.00s)
--- PASS: TestSanitizeHeaders/sanitizes_and_truncates_values (0.00s)
=== RUN TestSanitizePath
--- PASS: TestSanitizePath (0.00s)
=== RUN TestSecurityHeaders
=== RUN TestSecurityHeaders/production_mode_sets_HSTS
=== RUN TestSecurityHeaders/development_mode_skips_HSTS
=== RUN TestSecurityHeaders/sets_X-Frame-Options
=== RUN TestSecurityHeaders/sets_X-Content-Type-Options
=== RUN TestSecurityHeaders/sets_X-XSS-Protection
=== RUN TestSecurityHeaders/sets_Referrer-Policy
=== RUN TestSecurityHeaders/sets_Content-Security-Policy
=== RUN TestSecurityHeaders/development_mode_CSP_allows_unsafe-eval
=== RUN TestSecurityHeaders/sets_Permissions-Policy
=== RUN TestSecurityHeaders/sets_Cross-Origin-Opener-Policy
=== RUN TestSecurityHeaders/sets_Cross-Origin-Resource-Policy
--- PASS: TestSecurityHeaders (0.00s)
--- PASS: TestSecurityHeaders/production_mode_sets_HSTS (0.00s)
--- PASS: TestSecurityHeaders/development_mode_skips_HSTS (0.00s)
--- PASS: TestSecurityHeaders/sets_X-Frame-Options (0.00s)
--- PASS: TestSecurityHeaders/sets_X-Content-Type-Options (0.00s)
--- PASS: TestSecurityHeaders/sets_X-XSS-Protection (0.00s)
--- PASS: TestSecurityHeaders/sets_Referrer-Policy (0.00s)
--- PASS: TestSecurityHeaders/sets_Content-Security-Policy (0.00s)
--- PASS: TestSecurityHeaders/development_mode_CSP_allows_unsafe-eval (0.00s)
--- PASS: TestSecurityHeaders/sets_Permissions-Policy (0.00s)
--- PASS: TestSecurityHeaders/sets_Cross-Origin-Opener-Policy (0.00s)
--- PASS: TestSecurityHeaders/sets_Cross-Origin-Resource-Policy (0.00s)
=== RUN TestSecurityHeadersCustomCSP
--- PASS: TestSecurityHeadersCustomCSP (0.00s)
=== RUN TestDefaultSecurityHeadersConfig
--- PASS: TestDefaultSecurityHeadersConfig (0.00s)
=== RUN TestBuildCSP
=== RUN TestBuildCSP/production_CSP
=== RUN TestBuildCSP/development_CSP
--- PASS: TestBuildCSP (0.00s)
--- PASS: TestBuildCSP/production_CSP (0.00s)
--- PASS: TestBuildCSP/development_CSP (0.00s)
=== RUN TestBuildPermissionsPolicy
--- PASS: TestBuildPermissionsPolicy (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/api/middleware (cached)
=== RUN TestRegister
time="2025-12-12T19:01:39Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..."
time="2025-12-12T19:01:39Z" level=info msg="GeoIP database not found - geo-blocking features will be unavailable" path=/app/data/geoip/GeoLite2-Country.mmdb
time="2025-12-12T19:01:39Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=/data
--- PASS: TestRegister (0.01s)
=== RUN TestRegisterImportHandler
--- PASS: TestRegisterImportHandler (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/api/routes (cached)
=== RUN TestIntegration_WAF_BlockAndMonitor
time="2025-12-12T19:01:39Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..."
time="2025-12-12T19:01:39Z" level=info msg="GeoIP database not found - geo-blocking features will be unavailable" path=/app/data/geoip/GeoLite2-Country.mmdb
time="2025-12-12T19:01:39Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=data/caddy/data
time="2025-12-12T19:01:39Z" level=info msg="CertificateService: scanning cert directory" certRoot=data/caddy/data/certificates
time="2025-12-12T19:01:39Z" level=info msg="CertificateService: cert directory does not exist" certRoot=data/caddy/data/certificates
time="2025-12-12T19:01:39Z" level=info msg="CertificateService: disk sync complete" count=0
time="2025-12-12T19:01:39Z" level=info msg="Cleaning up invalid Let's Encrypt certificate associations..."
time="2025-12-12T19:01:39Z" level=info msg="GeoIP database not found - geo-blocking features will be unavailable" path=/app/data/geoip/GeoLite2-Country.mmdb
time="2025-12-12T19:01:39Z" level=info msg="Using Caddy data directory for certificates scan" caddy_data_dir=data/caddy/data
time="2025-12-12T19:01:39Z" level=info msg="CertificateService: scanning cert directory" certRoot=data/caddy/data/certificates
time="2025-12-12T19:01:39Z" level=info msg="CertificateService: cert directory does not exist" certRoot=data/caddy/data/certificates
time="2025-12-12T19:01:39Z" level=info msg="CertificateService: disk sync complete" count=0
--- PASS: TestIntegration_WAF_BlockAndMonitor (0.03s)
=== RUN TestInviteToken_MustBeUnguessable
--- PASS: TestInviteToken_MustBeUnguessable (0.07s)
=== RUN TestInviteToken_ExpiredCannotBeUsed
--- PASS: TestInviteToken_ExpiredCannotBeUsed (0.06s)
=== RUN TestInviteToken_CannotBeReused
--- PASS: TestInviteToken_CannotBeReused (0.14s)
=== RUN TestInviteUser_EmailValidation
=== RUN TestInviteUser_EmailValidation/empty_email
=== RUN TestInviteUser_EmailValidation/invalid_email_no_@
=== RUN TestInviteUser_EmailValidation/invalid_email_no_domain
=== RUN TestInviteUser_EmailValidation/sql_injection_attempt
=== RUN TestInviteUser_EmailValidation/script_injection
=== RUN TestInviteUser_EmailValidation/valid_email
--- PASS: TestInviteUser_EmailValidation (0.13s)
--- PASS: TestInviteUser_EmailValidation/empty_email (0.00s)
--- PASS: TestInviteUser_EmailValidation/invalid_email_no_@ (0.00s)
--- PASS: TestInviteUser_EmailValidation/invalid_email_no_domain (0.00s)
--- PASS: TestInviteUser_EmailValidation/sql_injection_attempt (0.00s)
--- PASS: TestInviteUser_EmailValidation/script_injection (0.00s)
--- PASS: TestInviteUser_EmailValidation/valid_email (0.00s)
=== RUN TestAcceptInvite_PasswordValidation
=== RUN TestAcceptInvite_PasswordValidation/empty_password
=== RUN TestAcceptInvite_PasswordValidation/too_short
=== RUN TestAcceptInvite_PasswordValidation/7_chars
=== RUN TestAcceptInvite_PasswordValidation/8_chars_valid
--- PASS: TestAcceptInvite_PasswordValidation (0.19s)
--- PASS: TestAcceptInvite_PasswordValidation/empty_password (0.00s)
--- PASS: TestAcceptInvite_PasswordValidation/too_short (0.00s)
--- PASS: TestAcceptInvite_PasswordValidation/7_chars (0.00s)
--- PASS: TestAcceptInvite_PasswordValidation/8_chars_valid (0.06s)
=== RUN TestUserEndpoints_RequireAdmin
=== RUN TestUserEndpoints_RequireAdmin/GET_/api/users
=== RUN TestUserEndpoints_RequireAdmin/POST_/api/users
=== RUN TestUserEndpoints_RequireAdmin/POST_/api/users/invite
=== RUN TestUserEndpoints_RequireAdmin/GET_/api/users/1
=== RUN TestUserEndpoints_RequireAdmin/PUT_/api/users/1
=== RUN TestUserEndpoints_RequireAdmin/DELETE_/api/users/1
=== RUN TestUserEndpoints_RequireAdmin/PUT_/api/users/1/permissions
--- PASS: TestUserEndpoints_RequireAdmin (0.07s)
--- PASS: TestUserEndpoints_RequireAdmin/GET_/api/users (0.00s)
--- PASS: TestUserEndpoints_RequireAdmin/POST_/api/users (0.00s)
--- PASS: TestUserEndpoints_RequireAdmin/POST_/api/users/invite (0.00s)
--- PASS: TestUserEndpoints_RequireAdmin/GET_/api/users/1 (0.00s)
--- PASS: TestUserEndpoints_RequireAdmin/PUT_/api/users/1 (0.00s)
--- PASS: TestUserEndpoints_RequireAdmin/DELETE_/api/users/1 (0.00s)
--- PASS: TestUserEndpoints_RequireAdmin/PUT_/api/users/1/permissions (0.00s)
=== RUN TestSMTPEndpoints_RequireAdmin
=== RUN TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp
=== RUN TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp/test
=== RUN TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp/test-email
--- PASS: TestSMTPEndpoints_RequireAdmin (0.06s)
--- PASS: TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp (0.00s)
--- PASS: TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp/test (0.00s)
--- PASS: TestSMTPEndpoints_RequireAdmin/POST_/api/settings/smtp/test-email (0.00s)
=== RUN TestSMTPConfig_PasswordMasked
--- PASS: TestSMTPConfig_PasswordMasked (0.07s)
=== RUN TestSMTPConfig_PortValidation
=== RUN TestSMTPConfig_PortValidation/port_0_invalid
=== RUN TestSMTPConfig_PortValidation/port_-1_invalid
=== RUN TestSMTPConfig_PortValidation/port_65536_invalid
=== RUN TestSMTPConfig_PortValidation/port_587_valid
=== RUN TestSMTPConfig_PortValidation/port_465_valid
=== RUN TestSMTPConfig_PortValidation/port_25_valid
--- PASS: TestSMTPConfig_PortValidation (0.07s)
--- PASS: TestSMTPConfig_PortValidation/port_0_invalid (0.00s)
--- PASS: TestSMTPConfig_PortValidation/port_-1_invalid (0.00s)
--- PASS: TestSMTPConfig_PortValidation/port_65536_invalid (0.00s)
--- PASS: TestSMTPConfig_PortValidation/port_587_valid (0.00s)
--- PASS: TestSMTPConfig_PortValidation/port_465_valid (0.00s)
--- PASS: TestSMTPConfig_PortValidation/port_25_valid (0.00s)
=== RUN TestSMTPConfig_EncryptionValidation
=== RUN TestSMTPConfig_EncryptionValidation/empty_encryption_invalid
=== RUN TestSMTPConfig_EncryptionValidation/invalid_encryption
=== RUN TestSMTPConfig_EncryptionValidation/tls_lowercase_valid
=== RUN TestSMTPConfig_EncryptionValidation/starttls_valid
=== RUN TestSMTPConfig_EncryptionValidation/none_valid
--- PASS: TestSMTPConfig_EncryptionValidation (0.07s)
--- PASS: TestSMTPConfig_EncryptionValidation/empty_encryption_invalid (0.00s)
--- PASS: TestSMTPConfig_EncryptionValidation/invalid_encryption (0.00s)
--- PASS: TestSMTPConfig_EncryptionValidation/tls_lowercase_valid (0.00s)
--- PASS: TestSMTPConfig_EncryptionValidation/starttls_valid (0.00s)
--- PASS: TestSMTPConfig_EncryptionValidation/none_valid (0.00s)
=== RUN TestInviteUser_DuplicateEmailBlocked
--- PASS: TestInviteUser_DuplicateEmailBlocked (0.07s)
=== RUN TestInviteUser_EmailCaseInsensitive
--- PASS: TestInviteUser_EmailCaseInsensitive (0.12s)
=== RUN TestDeleteUser_CannotDeleteSelf
--- PASS: TestDeleteUser_CannotDeleteSelf (0.06s)
=== RUN TestUpdatePermissions_ValidModes
=== RUN TestUpdatePermissions_ValidModes/allow_all_valid
=== RUN TestUpdatePermissions_ValidModes/deny_all_valid
=== RUN TestUpdatePermissions_ValidModes/invalid_mode
=== RUN TestUpdatePermissions_ValidModes/empty_mode
--- PASS: TestUpdatePermissions_ValidModes (0.07s)
--- PASS: TestUpdatePermissions_ValidModes/allow_all_valid (0.00s)
--- PASS: TestUpdatePermissions_ValidModes/deny_all_valid (0.00s)
--- PASS: TestUpdatePermissions_ValidModes/invalid_mode (0.00s)
--- PASS: TestUpdatePermissions_ValidModes/empty_mode (0.00s)
=== RUN TestPublicEndpoints_NoAuthRequired
--- PASS: TestPublicEndpoints_NoAuthRequired (0.06s)
PASS
ok github.com/Wikid82/charon/backend/internal/api/tests (cached)
=== 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 TestBuildCrowdSecHandler_Disabled
--- PASS: TestBuildCrowdSecHandler_Disabled (0.00s)
=== RUN TestBuildCrowdSecHandler_EnabledWithoutConfig
--- PASS: TestBuildCrowdSecHandler_EnabledWithoutConfig (0.00s)
=== RUN TestBuildCrowdSecHandler_EnabledWithEmptyAPIURL
--- PASS: TestBuildCrowdSecHandler_EnabledWithEmptyAPIURL (0.00s)
=== RUN TestBuildCrowdSecHandler_EnabledWithCustomAPIURL
--- PASS: TestBuildCrowdSecHandler_EnabledWithCustomAPIURL (0.00s)
=== RUN TestBuildCrowdSecHandler_JSONFormat
--- PASS: TestBuildCrowdSecHandler_JSONFormat (0.00s)
=== RUN TestBuildCrowdSecHandler_WithHost
--- PASS: TestBuildCrowdSecHandler_WithHost (0.00s)
=== RUN TestGenerateConfig_WithCrowdSec
--- PASS: TestGenerateConfig_WithCrowdSec (0.00s)
=== RUN TestGenerateConfig_CrowdSecDisabled
--- PASS: TestGenerateConfig_CrowdSecDisabled (0.00s)
=== RUN TestGenerateConfig_CatchAllFrontend
--- PASS: TestGenerateConfig_CatchAllFrontend (0.00s)
=== RUN TestGenerateConfig_AdvancedInvalidJSON
time="2025-12-12T19:01:40Z" 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-12T19:01:40Z" 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-12T19:01:40Z" 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:147: 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_IPHostsSkipAutoHTTPS
--- PASS: TestGenerateConfig_IPHostsSkipAutoHTTPS (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 TestBuildRateLimitHandler_Disabled
--- PASS: TestBuildRateLimitHandler_Disabled (0.00s)
=== RUN TestBuildRateLimitHandler_InvalidValues
--- PASS: TestBuildRateLimitHandler_InvalidValues (0.00s)
=== RUN TestBuildRateLimitHandler_ValidConfig
--- PASS: TestBuildRateLimitHandler_ValidConfig (0.00s)
=== RUN TestBuildRateLimitHandler_JSONFormat
--- PASS: TestBuildRateLimitHandler_JSONFormat (0.00s)
=== RUN TestGenerateConfig_WithRateLimiting
--- PASS: TestGenerateConfig_WithRateLimiting (0.00s)
=== RUN TestBuildRateLimitHandler_UsesBurst
--- PASS: TestBuildRateLimitHandler_UsesBurst (0.00s)
=== RUN TestBuildRateLimitHandler_DefaultBurst
--- PASS: TestBuildRateLimitHandler_DefaultBurst (0.00s)
=== RUN TestBuildRateLimitHandler_BypassList
--- PASS: TestBuildRateLimitHandler_BypassList (0.00s)
=== RUN TestBuildRateLimitHandler_BypassList_PlainIPs
--- PASS: TestBuildRateLimitHandler_BypassList_PlainIPs (0.00s)
=== RUN TestBuildRateLimitHandler_BypassList_InvalidEntries
--- PASS: TestBuildRateLimitHandler_BypassList_InvalidEntries (0.00s)
=== RUN TestBuildRateLimitHandler_BypassList_Empty
--- PASS: TestBuildRateLimitHandler_BypassList_Empty (0.00s)
=== RUN TestBuildRateLimitHandler_BypassList_AllInvalid
--- PASS: TestBuildRateLimitHandler_BypassList_AllInvalid (0.00s)
=== RUN TestParseBypassCIDRs
=== RUN TestParseBypassCIDRs/empty
=== RUN TestParseBypassCIDRs/single_cidr
=== RUN TestParseBypassCIDRs/multiple_cidrs
=== RUN TestParseBypassCIDRs/plain_ipv4
=== RUN TestParseBypassCIDRs/plain_ipv6
=== RUN TestParseBypassCIDRs/mixed
=== RUN TestParseBypassCIDRs/with_spaces
=== RUN TestParseBypassCIDRs/all_invalid
--- PASS: TestParseBypassCIDRs (0.00s)
--- PASS: TestParseBypassCIDRs/empty (0.00s)
--- PASS: TestParseBypassCIDRs/single_cidr (0.00s)
--- PASS: TestParseBypassCIDRs/multiple_cidrs (0.00s)
--- PASS: TestParseBypassCIDRs/plain_ipv4 (0.00s)
--- PASS: TestParseBypassCIDRs/plain_ipv6 (0.00s)
--- PASS: TestParseBypassCIDRs/mixed (0.00s)
--- PASS: TestParseBypassCIDRs/with_spaces (0.00s)
--- PASS: TestParseBypassCIDRs/all_invalid (0.00s)
=== RUN TestBuildWAFHandler_ParanoiaLevel
=== RUN TestBuildWAFHandler_ParanoiaLevel/level_1_default
=== RUN TestBuildWAFHandler_ParanoiaLevel/level_1_explicit
=== RUN TestBuildWAFHandler_ParanoiaLevel/level_2
=== RUN TestBuildWAFHandler_ParanoiaLevel/level_3
=== RUN TestBuildWAFHandler_ParanoiaLevel/level_4_max
=== RUN TestBuildWAFHandler_ParanoiaLevel/level_invalid_high
=== RUN TestBuildWAFHandler_ParanoiaLevel/level_invalid_neg
--- PASS: TestBuildWAFHandler_ParanoiaLevel (0.00s)
--- PASS: TestBuildWAFHandler_ParanoiaLevel/level_1_default (0.00s)
--- PASS: TestBuildWAFHandler_ParanoiaLevel/level_1_explicit (0.00s)
--- PASS: TestBuildWAFHandler_ParanoiaLevel/level_2 (0.00s)
--- PASS: TestBuildWAFHandler_ParanoiaLevel/level_3 (0.00s)
--- PASS: TestBuildWAFHandler_ParanoiaLevel/level_4_max (0.00s)
--- PASS: TestBuildWAFHandler_ParanoiaLevel/level_invalid_high (0.00s)
--- PASS: TestBuildWAFHandler_ParanoiaLevel/level_invalid_neg (0.00s)
=== RUN TestBuildWAFHandler_Exclusions
--- PASS: TestBuildWAFHandler_Exclusions (0.00s)
=== RUN TestBuildWAFHandler_ExclusionsWithTarget
--- PASS: TestBuildWAFHandler_ExclusionsWithTarget (0.00s)
=== RUN TestBuildWAFHandler_PerHostDisabled
--- PASS: TestBuildWAFHandler_PerHostDisabled (0.00s)
=== RUN TestBuildWAFHandler_MonitorMode
--- PASS: TestBuildWAFHandler_MonitorMode (0.00s)
=== RUN TestBuildWAFHandler_GlobalDisabled
--- PASS: TestBuildWAFHandler_GlobalDisabled (0.00s)
=== RUN TestBuildWAFHandler_NoRuleset
--- PASS: TestBuildWAFHandler_NoRuleset (0.00s)
=== RUN TestParseWAFExclusions
=== RUN TestParseWAFExclusions/empty
=== RUN TestParseWAFExclusions/single_exclusion
=== RUN TestParseWAFExclusions/multiple_exclusions
=== RUN TestParseWAFExclusions/invalid_json
--- PASS: TestParseWAFExclusions (0.00s)
--- PASS: TestParseWAFExclusions/empty (0.00s)
--- PASS: TestParseWAFExclusions/single_exclusion (0.00s)
--- PASS: TestParseWAFExclusions/multiple_exclusions (0.00s)
--- PASS: TestParseWAFExclusions/invalid_json (0.00s)
=== RUN TestGenerateConfig_WithWAFPerHostDisabled
--- PASS: TestGenerateConfig_WithWAFPerHostDisabled (0.00s)
=== RUN TestBuildWAFHandler_PathTraversalAttack
=== RUN TestBuildWAFHandler_PathTraversalAttack/Path_traversal_in_ruleset_name
=== RUN TestBuildWAFHandler_PathTraversalAttack/Null_byte_injection
=== RUN TestBuildWAFHandler_PathTraversalAttack/URL_encoded_traversal
--- PASS: TestBuildWAFHandler_PathTraversalAttack (0.00s)
--- PASS: TestBuildWAFHandler_PathTraversalAttack/Path_traversal_in_ruleset_name (0.00s)
--- PASS: TestBuildWAFHandler_PathTraversalAttack/Null_byte_injection (0.00s)
--- PASS: TestBuildWAFHandler_PathTraversalAttack/URL_encoded_traversal (0.00s)
=== RUN TestBuildWAFHandler_SQLInjectionInRulesetName
=== RUN TestBuildWAFHandler_SQLInjectionInRulesetName/';_DROP_TABLE_rulesets;_--
=== RUN TestBuildWAFHandler_SQLInjectionInRulesetName/1'_OR_'1'='1
=== RUN TestBuildWAFHandler_SQLInjectionInRulesetName/UNION_SELECT_*_FROM_users--
=== RUN TestBuildWAFHandler_SQLInjectionInRulesetName/admin'/*
--- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName (0.00s)
--- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName/';_DROP_TABLE_rulesets;_-- (0.00s)
--- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName/1'_OR_'1'='1 (0.00s)
--- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName/UNION_SELECT_*_FROM_users-- (0.00s)
--- PASS: TestBuildWAFHandler_SQLInjectionInRulesetName/admin'/* (0.00s)
=== RUN TestBuildWAFHandler_XSSInAdvancedConfig
=== RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"<script>alert(1)</script>"}
=== RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"<img_src=x_onerror=alert(1)>"}
=== RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"javascript:alert(1)"}
=== RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"<svg/onload=alert(1)>"}
--- PASS: TestBuildWAFHandler_XSSInAdvancedConfig (0.00s)
--- PASS: TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"<script>alert(1)</script>"} (0.00s)
--- PASS: TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"<img_src=x_onerror=alert(1)>"} (0.00s)
--- PASS: TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"javascript:alert(1)"} (0.00s)
--- PASS: TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"<svg/onload=alert(1)>"} (0.00s)
=== RUN TestBuildWAFHandler_HugePayload
--- PASS: TestBuildWAFHandler_HugePayload (0.00s)
=== RUN TestBuildWAFHandler_EmptyAndWhitespaceInputs
=== RUN TestBuildWAFHandler_EmptyAndWhitespaceInputs/Empty_string_WAFRulesSource
=== RUN TestBuildWAFHandler_EmptyAndWhitespaceInputs/Whitespace-only_WAFRulesSource
=== RUN TestBuildWAFHandler_EmptyAndWhitespaceInputs/Tab_and_newline_in_WAFRulesSource
--- PASS: TestBuildWAFHandler_EmptyAndWhitespaceInputs (0.00s)
--- PASS: TestBuildWAFHandler_EmptyAndWhitespaceInputs/Empty_string_WAFRulesSource (0.00s)
--- PASS: TestBuildWAFHandler_EmptyAndWhitespaceInputs/Whitespace-only_WAFRulesSource (0.00s)
--- PASS: TestBuildWAFHandler_EmptyAndWhitespaceInputs/Tab_and_newline_in_WAFRulesSource (0.00s)
=== RUN TestBuildWAFHandler_ConcurrentRulesetSelection
--- PASS: TestBuildWAFHandler_ConcurrentRulesetSelection (0.00s)
=== RUN TestBuildWAFHandler_NilSecCfg
--- PASS: TestBuildWAFHandler_NilSecCfg (0.00s)
=== RUN TestBuildWAFHandler_NilHost
--- PASS: TestBuildWAFHandler_NilHost (0.00s)
=== RUN TestBuildWAFHandler_SpecialCharactersInRulesetName
=== RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset_with_spaces
=== RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset/with/slashes
=== RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/UPPERCASE-RULESET
=== RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset_with_underscores
=== RUN TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset.with.dots
--- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName (0.00s)
--- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset_with_spaces (0.00s)
--- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset/with/slashes (0.00s)
--- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/UPPERCASE-RULESET (0.00s)
--- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset_with_underscores (0.00s)
--- PASS: TestBuildWAFHandler_SpecialCharactersInRulesetName/ruleset.with.dots (0.00s)
=== RUN TestBuildWAFHandler_RulesetSelectionPriority
=== RUN TestBuildWAFHandler_RulesetSelectionPriority/WAFRulesSource_takes_priority_over_owasp-crs
=== RUN TestBuildWAFHandler_RulesetSelectionPriority/hostRulesetName_takes_priority_over_owasp-crs
=== RUN TestBuildWAFHandler_RulesetSelectionPriority/host.Application_takes_priority_over_owasp-crs
=== RUN TestBuildWAFHandler_RulesetSelectionPriority/owasp-crs_used_as_fallback_when_no_other_match
=== RUN TestBuildWAFHandler_RulesetSelectionPriority/WAFRulesSource_takes_priority_over_host.Application_and_owasp-crs
--- PASS: TestBuildWAFHandler_RulesetSelectionPriority (0.00s)
--- PASS: TestBuildWAFHandler_RulesetSelectionPriority/WAFRulesSource_takes_priority_over_owasp-crs (0.00s)
--- PASS: TestBuildWAFHandler_RulesetSelectionPriority/hostRulesetName_takes_priority_over_owasp-crs (0.00s)
--- PASS: TestBuildWAFHandler_RulesetSelectionPriority/host.Application_takes_priority_over_owasp-crs (0.00s)
--- PASS: TestBuildWAFHandler_RulesetSelectionPriority/owasp-crs_used_as_fallback_when_no_other_match (0.00s)
--- PASS: TestBuildWAFHandler_RulesetSelectionPriority/WAFRulesSource_takes_priority_over_host.Application_and_owasp-crs (0.00s)
=== RUN TestBuildWAFHandler_NoDirectivesReturnsNil
=== RUN TestBuildWAFHandler_NoDirectivesReturnsNil/Empty_rulesets_returns_nil
=== RUN TestBuildWAFHandler_NoDirectivesReturnsNil/Ruleset_exists_but_no_path_mapping_returns_nil
=== RUN TestBuildWAFHandler_NoDirectivesReturnsNil/WAFRulesSource_specified_but_not_in_rulesets_or_paths_returns_nil
=== RUN TestBuildWAFHandler_NoDirectivesReturnsNil/Empty_path_in_rulesetPaths_returns_nil
--- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil (0.00s)
--- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil/Empty_rulesets_returns_nil (0.00s)
--- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil/Ruleset_exists_but_no_path_mapping_returns_nil (0.00s)
--- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil/WAFRulesSource_specified_but_not_in_rulesets_or_paths_returns_nil (0.00s)
--- PASS: TestBuildWAFHandler_NoDirectivesReturnsNil/Empty_path_in_rulesetPaths_returns_nil (0.00s)
=== RUN TestBuildWAFHandler_DisabledModes
=== RUN TestBuildWAFHandler_DisabledModes/wafEnabled_false_returns_nil
=== RUN TestBuildWAFHandler_DisabledModes/WAFMode_disabled_returns_nil
--- PASS: TestBuildWAFHandler_DisabledModes (0.00s)
--- PASS: TestBuildWAFHandler_DisabledModes/wafEnabled_false_returns_nil (0.00s)
--- PASS: TestBuildWAFHandler_DisabledModes/WAFMode_disabled_returns_nil (0.00s)
=== RUN TestBuildWAFHandler_HandlerStructure
--- PASS: TestBuildWAFHandler_HandlerStructure (0.00s)
=== RUN TestBuildWAFHandler_AdvancedConfigParsing
=== RUN TestBuildWAFHandler_AdvancedConfigParsing/Valid_ruleset_name_in_advanced_config
=== RUN TestBuildWAFHandler_AdvancedConfigParsing/Invalid_JSON_falls_back_to_owasp-crs
=== RUN TestBuildWAFHandler_AdvancedConfigParsing/Empty_advanced_config_falls_back_to_owasp-crs
=== RUN TestBuildWAFHandler_AdvancedConfigParsing/Empty_ruleset_name_string_falls_back_to_owasp-crs
=== RUN TestBuildWAFHandler_AdvancedConfigParsing/Non-string_ruleset_name_falls_back_to_owasp-crs
--- PASS: TestBuildWAFHandler_AdvancedConfigParsing (0.00s)
--- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Valid_ruleset_name_in_advanced_config (0.00s)
--- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Invalid_JSON_falls_back_to_owasp-crs (0.00s)
--- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Empty_advanced_config_falls_back_to_owasp-crs (0.00s)
--- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Empty_ruleset_name_string_falls_back_to_owasp-crs (0.00s)
--- PASS: TestBuildWAFHandler_AdvancedConfigParsing/Non-string_ruleset_name_falls_back_to_owasp-crs (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/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.136ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.006ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.070ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.051ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_WithSettings (0.00s)
=== 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/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.185ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.006ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.064ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.128ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RotateSnapshotsWarning (0.01s)
=== RUN TestManager_ApplyConfig_LoadFailsAndRollbackFails
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.133ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.034ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.074ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.048ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_LoadFailsAndRollbackFails (0.00s)
=== RUN TestManager_ApplyConfig_SaveSnapshotFails
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.125ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.008ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.076ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.074ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SaveSnapshotFails (0.00s)
=== RUN TestManager_ApplyConfig_LoadFailsThenRollbackSucceeds
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.026ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.141ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.077ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.080ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_LoadFailsThenRollbackSucceeds (0.00s)
=== 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/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.142ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.074ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.073ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_GenerateConfigFails (0.00s)
=== RUN TestManager_ApplyConfig_RejectsWhenCerberusEnabledWithoutAdminWhitelist
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestManager_ApplyConfig_RejectsWhenCerberusEnabledWithoutAdminWhitelist (0.00s)
=== RUN TestManager_ApplyConfig_ValidateFails
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.140ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.073ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.069ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_ValidateFails (0.00s)
=== RUN TestManager_Rollback_ReadFileError
--- PASS: TestManager_Rollback_ReadFileError (0.00s)
=== RUN TestManager_ApplyConfig_RotateSnapshotsWarning_Stderr
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.132ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.071ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.067ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RotateSnapshotsWarning_Stderr (0.00s)
=== RUN TestManager_ApplyConfig_PassesAdminWhitelistToGenerateConfig
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.095ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.051ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_PassesAdminWhitelistToGenerateConfig (0.00s)
=== RUN TestManager_ApplyConfig_PassesRuleSetsToGenerateConfig
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.081ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_PassesRuleSetsToGenerateConfig (0.00s)
=== RUN TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.072ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
manager_additional_test.go:711: generated config: {"admin":{"listen":"0.0.0.0:2019"},"apps":{"http":{"servers":{"charon_server":{"listen":[":80",":443"],"routes":[{"match":[{"host":["ruleset.example.com"]}],"handle":[{"directives":"SecRuleEngine On\nSecRequestBodyAccess On\nSecResponseBodyAccess Off\nSecAction \"id:900000,phase:1,nolog,pass,t:none,setvar:tx.paranoia_level=1\"\nInclude /tmp/TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset3005272911/001/coraza/rulesets/owasp-crs-05ec1bde.conf\n","handler":"waf"},{"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_IncludesWAFHandlerWithRuleset3005272911/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_IncludesWAFHandlerWithRuleset3005272911/001/data"}}
--- PASS: TestManager_ApplyConfig_IncludesWAFHandlerWithRuleset (0.00s)
=== RUN TestManager_ApplyConfig_RulesetWriteFileFailure
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.060ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetWriteFileFailure (0.00s)
=== RUN TestManager_ApplyConfig_RulesetDirMkdirFailure
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.036ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.077ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetDirMkdirFailure (0.00s)
=== RUN TestManager_ApplyConfig_ReappliesOnFlagChange
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.106ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.049ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.044ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.022ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.172ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.065ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.005ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.006ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.008ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.008ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.006ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_ReappliesOnFlagChange (0.01s)
=== RUN TestManager_ApplyConfig_PrependsSecRuleEngineDirectives
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.061ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_PrependsSecRuleEngineDirectives (0.00s)
=== RUN TestManager_ApplyConfig_DoesNotPrependIfSecRuleEngineExists
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.034ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.059ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_DoesNotPrependIfSecRuleEngineExists (0.00s)
=== RUN TestManager_ApplyConfig_DebugMarshalFailure
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.062ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_DebugMarshalFailure (0.00s)
=== RUN TestManager_ApplyConfig_WAFModeMonitorUsesDetectionOnly
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.066ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_WAFModeMonitorUsesDetectionOnly (0.00s)
=== RUN TestManager_ApplyConfig_PerRulesetModeOverride
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.058ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_PerRulesetModeOverride (0.00s)
=== RUN TestManager_ApplyConfig_RulesetFileCleanup
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.074ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetFileCleanup (0.00s)
=== RUN TestManager_ApplyConfig_RulesetCleanupReadDirError
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.057ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetCleanupReadDirError (0.00s)
=== RUN TestManager_ApplyConfig_RulesetCleanupRemoveError
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.031ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.070ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetCleanupRemoveError (0.00s)
=== RUN TestManager_ApplyConfig_WAFModeBlockExplicit
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.008ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.076ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_WAFModeBlockExplicit (0.00s)
=== RUN TestManager_ApplyConfig_RulesetNamePathTraversal
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.060ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_RulesetNamePathTraversal (0.00s)
=== RUN TestManager_ApplyConfig_SSLProvider_Auto
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.035ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.105ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.010ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.062ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.074ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SSLProvider_Auto (0.00s)
=== RUN TestManager_ApplyConfig_SSLProvider_LetsEncryptStaging
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.129ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.073ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.067ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SSLProvider_LetsEncryptStaging (0.01s)
=== RUN TestManager_ApplyConfig_SSLProvider_LetsEncryptProd
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.124ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.023ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.010ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.080ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.077ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SSLProvider_LetsEncryptProd (0.00s)
=== RUN TestManager_ApplyConfig_SSLProvider_ZeroSSL
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.119ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.011ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.079ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.076ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SSLProvider_ZeroSSL (0.00s)
=== RUN TestManager_ApplyConfig_SSLProvider_Empty
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.089ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.027ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.053ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.046ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SSLProvider_Empty (0.00s)
=== RUN TestManager_ApplyConfig_SSLProvider_EmptyWithNoStaging
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.032ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.127ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.011ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.085ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.078ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SSLProvider_EmptyWithNoStaging (0.00s)
=== RUN TestManager_ApplyConfig_SSLProvider_Unknown
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.127ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.027ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.026ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.012ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.093ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.088ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_SSLProvider_Unknown (0.00s)
=== RUN TestManager_ApplyConfig
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.167ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.051ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.011ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.086ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.081ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig (0.01s)
=== RUN TestManager_ApplyConfig_Failure
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.022ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.144ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.027ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.010ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.103ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.085ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_Failure (0.00s)
=== RUN TestManager_Ping
--- PASS: TestManager_Ping (0.00s)
=== RUN TestManager_GetCurrentConfig
--- PASS: TestManager_GetCurrentConfig (0.00s)
=== RUN TestManager_RotateSnapshots
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.199ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.038ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.140ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.063ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.027ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.085ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.079ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_RotateSnapshots (0.00s)
=== RUN TestManager_Rollback_Success
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.113ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.117ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.013ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.058ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:40 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.047ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.018ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.009ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.011ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.006ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.005ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.006ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_Rollback_Success (1.11s)
=== RUN TestManager_ApplyConfig_DBError
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:61 sql: database is closed
[0.023ms] [rows:0] SELECT * FROM `proxy_hosts`
--- PASS: TestManager_ApplyConfig_DBError (0.00s)
=== RUN TestManager_ApplyConfig_ValidationError
2025/12/12 19:01:41 /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/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.019ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.149ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.028ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.011ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.084ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.077ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_ApplyConfig_ValidationError (0.01s)
=== RUN TestManager_Rollback_Failure
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.021ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.032ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.121ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.009ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:112 no such table: security_configs
[0.007ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:120 no such table: security_rule_sets
[0.098ms] [rows:0] SELECT * FROM `security_rule_sets`
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:127 no such table: security_decisions
[0.082ms] [rows:0] SELECT * FROM `security_decisions` ORDER BY created_at desc
--- PASS: TestManager_Rollback_Failure (0.00s)
=== RUN TestComputeEffectiveFlags_DefaultsNoDB
--- PASS: TestComputeEffectiveFlags_DefaultsNoDB (0.00s)
=== RUN TestComputeEffectiveFlags_DB_CerberusDisabled
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.107ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.020ms] [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/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.121ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.013ms] [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/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.110ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.025ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.013ms] [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/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.143ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.039ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.013ms] [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/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.103ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.083ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:423 no such table: security_configs
[0.010ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.012ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestComputeEffectiveFlags_DB_ACLTrueAndFalse (0.00s)
=== RUN TestComputeEffectiveFlags_DB_WAFMonitor
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.029ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.017ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestComputeEffectiveFlags_DB_WAFMonitor (0.00s)
=== RUN TestManager_ApplyConfig_WAFMonitor
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:68 record not found
[0.016ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:75 record not found
[0.024ms] [rows:0] SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:452 record not found
[0.015ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:454 record not found
[0.020ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:41 /projects/Charon/backend/internal/caddy/manager.go:459 record not found
[0.014ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestManager_ApplyConfig_WAFMonitor (0.01s)
=== 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
ok github.com/Wikid82/charon/backend/internal/caddy (cached)
=== 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_FeatureFlag
--- PASS: TestIsEnabled_DBSetting_FeatureFlag (0.00s)
=== RUN TestIsEnabled_DBSetting_LegacyKey
2025/12/12 19:01:40 /projects/Charon/backend/internal/cerberus/cerberus.go:57 record not found
[0.030ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestIsEnabled_DBSetting_LegacyKey (0.00s)
=== RUN TestIsEnabled_DBSetting_FeatureFlagTakesPrecedence
--- PASS: TestIsEnabled_DBSetting_FeatureFlagTakesPrecedence (0.00s)
=== RUN TestIsEnabled_DBSettingCaseInsensitive
--- PASS: TestIsEnabled_DBSettingCaseInsensitive (0.00s)
=== RUN TestIsEnabled_DBSettingFalse
--- PASS: TestIsEnabled_DBSettingFalse (0.00s)
=== RUN TestIsEnabled_DefaultTrue
--- PASS: TestIsEnabled_DefaultTrue (0.00s)
=== RUN TestMiddleware_WAFEnabledTracksMetrics
--- PASS: TestMiddleware_WAFEnabledTracksMetrics (0.00s)
=== RUN TestMiddleware_ACLBlocksClientIP
2025/12/12 19:01:40 /projects/Charon/backend/internal/services/security_notification_service.go:29 no such table: notification_configs
[0.147ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestMiddleware_ACLBlocksClientIP (0.00s)
=== RUN TestMiddleware_ACLAllowsClientIP
--- PASS: TestMiddleware_ACLAllowsClientIP (0.00s)
=== RUN TestMiddleware_NotEnabledSkips
2025/12/12 19:01:40 /projects/Charon/backend/internal/cerberus/cerberus.go:57 record not found
[0.050ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:01:40 /projects/Charon/backend/internal/cerberus/cerberus.go:61 record not found
[0.013ms] [rows:0] SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestMiddleware_NotEnabledSkips (0.00s)
=== RUN TestMiddleware_WAFPassesWithNoPayload
--- PASS: TestMiddleware_WAFPassesWithNoPayload (0.00s)
=== RUN TestMiddleware_WAFMonitorLogsButDoesNotBlock
--- PASS: TestMiddleware_WAFMonitorLogsButDoesNotBlock (0.00s)
=== RUN TestMiddleware_ACLDisabledDoesNotBlock
--- 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:68: cfg: {CrowdSecMode: CrowdSecAPIURL: CrowdSecAPIKey: CrowdSecConfigDir: WAFMode: RateLimitMode: ACLMode: CerberusEnabled:false}
cerberus_test.go:69: IsEnabled() -> false
--- PASS: TestCerberus_IsEnabled_Disabled (0.00s)
=== RUN TestCerberus_IsEnabled_CrowdSecLocal
--- PASS: TestCerberus_IsEnabled_CrowdSecLocal (0.00s)
=== RUN TestCerberus_IsEnabled_WAFEnabled
--- PASS: TestCerberus_IsEnabled_WAFEnabled (0.00s)
=== RUN TestCerberus_IsEnabled_RateLimitEnabled
--- PASS: TestCerberus_IsEnabled_RateLimitEnabled (0.00s)
=== RUN TestCerberus_IsEnabled_ACLEnabled
--- PASS: TestCerberus_IsEnabled_ACLEnabled (0.00s)
=== RUN TestCerberus_IsEnabled_LegacySetting
2025/12/12 19:01:40 /projects/Charon/backend/internal/cerberus/cerberus.go:57 record not found
[0.055ms] [rows:0] SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
--- PASS: TestCerberus_IsEnabled_LegacySetting (0.00s)
=== RUN TestCerberus_Middleware_Disabled
--- PASS: TestCerberus_Middleware_Disabled (0.00s)
=== RUN TestCerberus_Middleware_WAFEnabled
--- PASS: TestCerberus_Middleware_WAFEnabled (0.00s)
=== RUN TestCerberus_Middleware_ACLEnabled_NoAccessLists
--- PASS: TestCerberus_Middleware_ACLEnabled_NoAccessLists (0.00s)
=== RUN TestCerberus_Middleware_ACLEnabled_DisabledList
--- PASS: TestCerberus_Middleware_ACLEnabled_DisabledList (0.00s)
=== RUN TestCerberus_Middleware_ACLEnabled_Blocked
2025/12/12 19:01:40 /projects/Charon/backend/internal/services/security_notification_service.go:29 no such table: notification_configs
[0.091ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestCerberus_Middleware_ACLEnabled_Blocked (0.00s)
=== RUN TestCerberus_Middleware_CrowdSecLocal
--- PASS: TestCerberus_Middleware_CrowdSecLocal (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/cerberus (cached)
=== 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)
=== RUN TestGetEnvAny
--- PASS: TestGetEnvAny (0.00s)
=== RUN TestLoad_SecurityConfig
--- PASS: TestLoad_SecurityConfig (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/config (cached)
=== RUN TestConsoleEnrollSuccess
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.063ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent-one correlation_id=df46e443-0155-4b28-945a-230170728d23 tenant=tenant-a
time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=agent-one correlation_id=df46e443-0155-4b28-945a-230170728d23 tenant=tenant-a
--- PASS: TestConsoleEnrollSuccess (0.00s)
=== RUN TestConsoleEnrollFailureRedactsSecret
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.034ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent correlation_id=6bf8692d-798b-44ae-b4e9-7a5d65b616e3 tenant=tenant
time="2025-12-12T19:01:41Z" level=warning msg="crowdsec console enrollment failed" correlation_id=6bf8692d-798b-44ae-b4e9-7a5d65b616e3 error="bad key secretKEY123" tenant=tenant
--- PASS: TestConsoleEnrollFailureRedactsSecret (0.00s)
=== RUN TestConsoleEnrollIdempotentWhenAlreadyEnrolled
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.067ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent correlation_id=692144ad-efa0-4997-a2a9-8cd9134ad766 tenant=tenant
time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=agent correlation_id=692144ad-efa0-4997-a2a9-8cd9134ad766 tenant=tenant
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
--- PASS: TestConsoleEnrollIdempotentWhenAlreadyEnrolled (0.00s)
=== RUN TestConsoleEnrollBlockedWhenInProgress
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
--- PASS: TestConsoleEnrollBlockedWhenInProgress (0.00s)
=== RUN TestConsoleEnrollNormalizesFullCommand
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.036ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent correlation_id=8296e2c1-9961-49ee-82d2-8bc879ee6daa tenant=tenant
time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=agent correlation_id=8296e2c1-9961-49ee-82d2-8bc879ee6daa tenant=tenant
--- PASS: TestConsoleEnrollNormalizesFullCommand (0.00s)
=== RUN TestConsoleEnrollRejectsUnsafeInput
--- PASS: TestConsoleEnrollRejectsUnsafeInput (0.00s)
=== RUN TestConsoleEnrollDoesNotPassTenant
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.027ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=agent-one correlation_id=9f74947b-fe45-466d-beea-16cec52a8b3d tenant=some-tenant-id
time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=agent-one correlation_id=9f74947b-fe45-466d-beea-16cec52a8b3d tenant=some-tenant-id
--- PASS: TestConsoleEnrollDoesNotPassTenant (0.00s)
=== RUN TestSecureCommandExecutorExecuteWithEnv
=== RUN TestSecureCommandExecutorExecuteWithEnv/executes_command_successfully
=== RUN TestSecureCommandExecutorExecuteWithEnv/passes_environment_variables
=== RUN TestSecureCommandExecutorExecuteWithEnv/handles_empty_env_map
=== RUN TestSecureCommandExecutorExecuteWithEnv/handles_command_failure
=== RUN TestSecureCommandExecutorExecuteWithEnv/handles_context_timeout
--- PASS: TestSecureCommandExecutorExecuteWithEnv (0.01s)
--- PASS: TestSecureCommandExecutorExecuteWithEnv/executes_command_successfully (0.00s)
--- PASS: TestSecureCommandExecutorExecuteWithEnv/passes_environment_variables (0.00s)
--- PASS: TestSecureCommandExecutorExecuteWithEnv/handles_empty_env_map (0.00s)
--- PASS: TestSecureCommandExecutorExecuteWithEnv/handles_command_failure (0.00s)
--- PASS: TestSecureCommandExecutorExecuteWithEnv/handles_context_timeout (0.00s)
=== RUN TestFormatEnv
=== RUN TestFormatEnv/formats_single_env_var
=== RUN TestFormatEnv/formats_multiple_env_vars
=== RUN TestFormatEnv/handles_empty_map
=== RUN TestFormatEnv/handles_nil_map
=== RUN TestFormatEnv/handles_special_characters
--- PASS: TestFormatEnv (0.00s)
--- PASS: TestFormatEnv/formats_single_env_var (0.00s)
--- PASS: TestFormatEnv/formats_multiple_env_vars (0.00s)
--- PASS: TestFormatEnv/handles_empty_map (0.00s)
--- PASS: TestFormatEnv/handles_nil_map (0.00s)
--- PASS: TestFormatEnv/handles_special_characters (0.00s)
=== RUN TestConsoleEnrollmentStatus
=== RUN TestConsoleEnrollmentStatus/returns_not_enrolled_for_new_service
2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.033ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
=== RUN TestConsoleEnrollmentStatus/returns_enrolled_status_after_enrollment
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.062ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=test-agent correlation_id=f9d8cff5-2328-4d76-99ae-8ad77cabe7c5 tenant=
time="2025-12-12T19:01:41Z" level=info msg="crowdsec console enrollment succeeded" agent=test-agent correlation_id=f9d8cff5-2328-4d76-99ae-8ad77cabe7c5 tenant=
=== RUN TestConsoleEnrollmentStatus/returns_failed_status_after_failed_enrollment
time="2025-12-12T19:01:41Z" level=info msg="registering with crowdsec capi"
2025/12/12 19:01:41 /projects/Charon/backend/internal/crowdsec/console_enroll.go:229 record not found
[0.058ms] [rows:0] SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
time="2025-12-12T19:01:41Z" level=info msg="starting crowdsec console enrollment" agent=test-agent correlation_id=2d72088a-f808-4327-a1b3-331ca36debc4 tenant=
time="2025-12-12T19:01:41Z" level=warning msg="crowdsec console enrollment failed" correlation_id=2d72088a-f808-4327-a1b3-331ca36debc4 error="enroll failed" tenant=
--- PASS: TestConsoleEnrollmentStatus (0.01s)
--- PASS: TestConsoleEnrollmentStatus/returns_not_enrolled_for_new_service (0.00s)
--- PASS: TestConsoleEnrollmentStatus/returns_enrolled_status_after_enrollment (0.00s)
--- PASS: TestConsoleEnrollmentStatus/returns_failed_status_after_failed_enrollment (0.00s)
=== RUN TestDeriveKey
=== RUN TestDeriveKey/derives_consistent_key
=== RUN TestDeriveKey/derives_different_keys_for_different_secrets
=== RUN TestDeriveKey/uses_default_for_empty_secret
--- PASS: TestDeriveKey (0.00s)
--- PASS: TestDeriveKey/derives_consistent_key (0.00s)
--- PASS: TestDeriveKey/derives_different_keys_for_different_secrets (0.00s)
--- PASS: TestDeriveKey/uses_default_for_empty_secret (0.00s)
=== RUN TestNormalizeEnrollmentKey
=== RUN TestNormalizeEnrollmentKey/valid_raw_key
=== RUN TestNormalizeEnrollmentKey/full_command_with_sudo
=== RUN TestNormalizeEnrollmentKey/full_command_without_sudo
=== RUN TestNormalizeEnrollmentKey/key_with_whitespace
=== RUN TestNormalizeEnrollmentKey/empty_key
=== RUN TestNormalizeEnrollmentKey/only_whitespace
=== RUN TestNormalizeEnrollmentKey/invalid_format
=== RUN TestNormalizeEnrollmentKey/injection_attempt
--- PASS: TestNormalizeEnrollmentKey (0.00s)
--- PASS: TestNormalizeEnrollmentKey/valid_raw_key (0.00s)
--- PASS: TestNormalizeEnrollmentKey/full_command_with_sudo (0.00s)
--- PASS: TestNormalizeEnrollmentKey/full_command_without_sudo (0.00s)
--- PASS: TestNormalizeEnrollmentKey/key_with_whitespace (0.00s)
--- PASS: TestNormalizeEnrollmentKey/empty_key (0.00s)
--- PASS: TestNormalizeEnrollmentKey/only_whitespace (0.00s)
--- PASS: TestNormalizeEnrollmentKey/invalid_format (0.00s)
--- PASS: TestNormalizeEnrollmentKey/injection_attempt (0.00s)
=== RUN TestRedactSecret
=== RUN TestRedactSecret/redacts_secret_from_message
=== RUN TestRedactSecret/handles_empty_secret
=== RUN TestRedactSecret/handles_secret_not_in_message
=== RUN TestRedactSecret/redacts_multiple_occurrences
--- PASS: TestRedactSecret (0.00s)
--- PASS: TestRedactSecret/redacts_secret_from_message (0.00s)
--- PASS: TestRedactSecret/handles_empty_secret (0.00s)
--- PASS: TestRedactSecret/handles_secret_not_in_message (0.00s)
--- PASS: TestRedactSecret/redacts_multiple_occurrences (0.00s)
=== RUN TestEncryptDecrypt
=== RUN TestEncryptDecrypt/encrypts_and_decrypts_successfully
=== RUN TestEncryptDecrypt/handles_empty_string
=== RUN TestEncryptDecrypt/different_encryptions_produce_different_ciphertext
--- PASS: TestEncryptDecrypt (0.00s)
--- PASS: TestEncryptDecrypt/encrypts_and_decrypts_successfully (0.00s)
--- PASS: TestEncryptDecrypt/handles_empty_string (0.00s)
--- PASS: TestEncryptDecrypt/different_encryptions_produce_different_ciphertext (0.00s)
=== RUN TestApplyWithOpenFileHandles
time="2025-12-12T19:01:41Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyWithOpenFileHandles1577121141/001/test/preset/bundle.tgz cache_key=test/preset-1765566101 meta_path=/tmp/TestApplyWithOpenFileHandles1577121141/001/test/preset/metadata.json preview_path=/tmp/TestApplyWithOpenFileHandles1577121141/001/test/preset/preview.yaml slug=test/preset
time="2025-12-12T19:01:41Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyWithOpenFileHandles1577121141/001/test/preset/bundle.tgz cache_key=test/preset-1765566101 slug=test/preset
--- PASS: TestApplyWithOpenFileHandles (0.00s)
=== RUN TestBackupPathOnlySetAfterSuccessfulBackup
=== RUN TestBackupPathOnlySetAfterSuccessfulBackup/backup_path_not_set_when_cache_missing
time="2025-12-12T19:01:41Z" level=warning msg="failed to load cached preset metadata" error="cache miss" slug=nonexistent/preset
time="2025-12-12T19:01:41Z" level=info msg="attempting to repull preset after cache load failure" error="load cache for nonexistent/preset: cache miss" slug=nonexistent/preset
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="https://hub-data.crowdsec.net/api/index.json (status 403)" hub_index="https://hub-data.crowdsec.net/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=true hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json"
time="2025-12-12T19:01:42Z" level=warning msg="cache refresh failed; rolled back backup" backup_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_not_set_w3329883887/002/crowdsec.backup.20251212-190141 error="load cache for nonexistent/preset: cache miss: refresh cache: preset not found in hub" slug=nonexistent/preset
=== RUN TestBackupPathOnlySetAfterSuccessfulBackup/backup_path_set_only_after_successful_backup
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_set_only_3319044631/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_set_only_3319044631/001/test/preset/metadata.json preview_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_set_only_3319044631/001/test/preset/preview.yaml slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestBackupPathOnlySetAfterSuccessfulBackupbackup_path_set_only_3319044631/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 slug=test/preset
--- PASS: TestBackupPathOnlySetAfterSuccessfulBackup (0.60s)
--- PASS: TestBackupPathOnlySetAfterSuccessfulBackup/backup_path_not_set_when_cache_missing (0.59s)
--- PASS: TestBackupPathOnlySetAfterSuccessfulBackup/backup_path_set_only_after_successful_backup (0.00s)
=== RUN TestHubCacheStoreLoadAndExpire
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheStoreLoadAndExpire451730120/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCacheStoreLoadAndExpire451730120/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheStoreLoadAndExpire451730120/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestHubCacheStoreLoadAndExpire (0.00s)
=== RUN TestHubCacheRejectsBadSlug
--- PASS: TestHubCacheRejectsBadSlug (0.00s)
=== RUN TestHubCacheListAndEvict
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/other/bundle.tgz cache_key=crowdsecurity/other-1765566102 meta_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/other/metadata.json preview_path=/tmp/TestHubCacheListAndEvict2059688537/001/crowdsecurity/other/preview.yaml slug=crowdsecurity/other
--- PASS: TestHubCacheListAndEvict (0.00s)
=== RUN TestHubCacheTouchUpdatesTTL
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheTouchUpdatesTTL763022005/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCacheTouchUpdatesTTL763022005/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheTouchUpdatesTTL763022005/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestHubCacheTouchUpdatesTTL (0.00s)
=== RUN TestHubCachePreviewExistsAndSize
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCachePreviewExistsAndSize3876473300/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCachePreviewExistsAndSize3876473300/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCachePreviewExistsAndSize3876473300/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestHubCachePreviewExistsAndSize (0.00s)
=== RUN TestHubCacheExistsHonorsTTL
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheExistsHonorsTTL419723857/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestHubCacheExistsHonorsTTL419723857/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheExistsHonorsTTL419723857/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestHubCacheExistsHonorsTTL (0.00s)
=== RUN TestSanitizeSlugCases
--- PASS: TestSanitizeSlugCases (0.00s)
=== RUN TestNewHubCacheRequiresBaseDir
--- PASS: TestNewHubCacheRequiresBaseDir (0.00s)
=== RUN TestHubCacheTouchMissing
--- PASS: TestHubCacheTouchMissing (0.00s)
=== RUN TestHubCacheTouchInvalidSlug
--- PASS: TestHubCacheTouchInvalidSlug (0.00s)
=== RUN TestHubCacheStoreContextCanceled
--- PASS: TestHubCacheStoreContextCanceled (0.00s)
=== RUN TestHubCacheLoadInvalidSlug
--- PASS: TestHubCacheLoadInvalidSlug (0.00s)
=== RUN TestHubCacheExistsContextCanceled
--- PASS: TestHubCacheExistsContextCanceled (0.00s)
=== RUN TestHubCacheListSkipsExpired
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubCacheListSkipsExpired2609582306/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1704110400 meta_path=/tmp/TestHubCacheListSkipsExpired2609582306/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestHubCacheListSkipsExpired2609582306/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestHubCacheListSkipsExpired (0.00s)
=== RUN TestHubCacheEvictInvalidSlug
--- PASS: TestHubCacheEvictInvalidSlug (0.00s)
=== RUN TestHubCacheListContextCanceled
--- PASS: TestHubCacheListContextCanceled (0.00s)
=== RUN TestHubCacheTTL
=== RUN TestHubCacheTTL/returns_configured_TTL
=== RUN TestHubCacheTTL/returns_minute_TTL
=== RUN TestHubCacheTTL/returns_zero_TTL_if_configured
--- PASS: TestHubCacheTTL (0.00s)
--- PASS: TestHubCacheTTL/returns_configured_TTL (0.00s)
--- PASS: TestHubCacheTTL/returns_minute_TTL (0.00s)
--- PASS: TestHubCacheTTL/returns_zero_TTL_if_configured (0.00s)
=== RUN TestPullThenApplyFlow
hub_pull_apply_test.go:90: Step 1: Pulling preset
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/test.tgz" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/test.yaml" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=158 etag=etag123 hub_endpoint="http://test.example.com/test.tgz" preview_size=24 slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/metadata.json preview_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/preview.yaml slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 preview_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/preview.yaml slug=test/preset
hub_pull_apply_test.go:110: Step 2: Verifying cache can be loaded
hub_pull_apply_test.go:117: Step 3: Applying preset from cache
time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestPullThenApplyFlow466905016/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 slug=test/preset
--- PASS: TestPullThenApplyFlow (0.00s)
=== RUN TestApplyRepullsOnCacheMissAfterCSCLIFailure
time="2025-12-12T19:01:42Z" level=warning msg="failed to load cached preset metadata" error="cache miss" slug=test/preset
time="2025-12-12T19:01:42Z" level=warning msg="cscli install failed; attempting cache fallback" error="install failed" slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="attempting to repull preset after cache load failure" error="load cache for test/preset: cache miss" slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/test/preset.tgz" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/test/preset.yaml" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=110 etag=e1 hub_endpoint="http://test.example.com/test/preset.tgz" preview_size=7 slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/metadata.json preview_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/preview.yaml slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 preview_path=/tmp/TestApplyRepullsOnCacheMissAfterCSCLIFailure2942444691/001/test/preset/preview.yaml slug=test/preset
--- PASS: TestApplyRepullsOnCacheMissAfterCSCLIFailure (0.00s)
=== RUN TestApplyRepullsOnCacheExpired
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/bundle.tgz cache_key=expired/preset-1765566102 meta_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/metadata.json preview_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/preview.yaml slug=expired/preset
time="2025-12-12T19:01:42Z" level=warning msg="failed to load cached preset metadata" error="cache expired" slug=expired/preset
time="2025-12-12T19:01:42Z" level=info msg="attempting to repull preset after cache load failure" error="load cache for expired/preset: cache expired" slug=expired/preset
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/expired/preset.tgz" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/expired/preset.yaml" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=112 etag=e2 hub_endpoint="http://test.example.com/expired/preset.tgz" preview_size=11 slug=expired/preset
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/bundle.tgz cache_key=expired/preset-1765566102 meta_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/metadata.json preview_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/preview.yaml slug=expired/preset
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/bundle.tgz cache_key=expired/preset-1765566102 preview_path=/tmp/TestApplyRepullsOnCacheExpired3802500890/001/expired/preset/preview.yaml slug=expired/preset
--- PASS: TestApplyRepullsOnCacheExpired (0.01s)
=== RUN TestPullAcceptsNamespacedIndexEntry
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/crowdsecurity/bot-mitigation-essentials.tgz" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/crowdsecurity/bot-mitigation-essentials.yaml" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=114 etag=etag-bme hub_endpoint="http://test.example.com/crowdsecurity/bot-mitigation-essentials.tgz" preview_size=18 slug=bot-mitigation-essentials
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/bundle.tgz cache_key=bot-mitigation-essentials-1765566102 meta_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/metadata.json preview_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/preview.yaml slug=bot-mitigation-essentials
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/bundle.tgz cache_key=bot-mitigation-essentials-1765566102 preview_path=/tmp/TestPullAcceptsNamespacedIndexEntry475100233/001/bot-mitigation-essentials/preview.yaml slug=bot-mitigation-essentials
--- PASS: TestPullAcceptsNamespacedIndexEntry (0.00s)
=== RUN TestHubFallbackToMirrorOnForbidden
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="http://primary.example.com/api/index.json (status 403)" hub_index="http://primary.example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=true hub_index="http://mirror.example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="http://primary.example.com/fallback/preset.tgz" error="http://primary.example.com/fallback/preset.tgz (status 403)"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://mirror.example.com/fallback/preset.tgz" fallback_used=true
time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="http://primary.example.com/fallback/preset.yaml" error="http://primary.example.com/fallback/preset.yaml (status 403)"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://mirror.example.com/fallback/preset.yaml" fallback_used=true
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=104 etag=etag-mirror hub_endpoint="http://mirror.example.com/fallback/preset.tgz" preview_size=14 slug=fallback/preset
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/bundle.tgz cache_key=fallback/preset-1765566102 meta_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/metadata.json preview_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/preview.yaml slug=fallback/preset
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/bundle.tgz cache_key=fallback/preset-1765566102 preview_path=/tmp/TestHubFallbackToMirrorOnForbidden2346863733/001/fallback/preset/preview.yaml slug=fallback/preset
--- PASS: TestHubFallbackToMirrorOnForbidden (0.00s)
=== RUN TestApplyWithoutPullFails
time="2025-12-12T19:01:42Z" level=warning msg="failed to load cached preset metadata" error="cache miss" slug=nonexistent/preset
time="2025-12-12T19:01:42Z" level=info msg="attempting to repull preset after cache load failure" error="load cache for nonexistent/preset: cache miss" slug=nonexistent/preset
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="http://test.example.com/api/index.json (status 500)" hub_index="http://test.example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=2 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=3 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=4 error="https://hub-data.crowdsec.net/api/index.json (status 500)" hub_index="https://hub-data.crowdsec.net/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="cache refresh failed; rolled back backup" backup_path=/tmp/TestApplyWithoutPullFails3366600238/002.backup.20251212-190142 error="load cache for nonexistent/preset: cache miss: refresh cache: fetch hub index: http://test.example.com/api/index.json: http://test.example.com/api/index.json (status 500)\nhttps://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500)\nhttps://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json: https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500)\nhttps://hub-data.crowdsec.net/api/index.json: https://hub-data.crowdsec.net/api/index.json (status 500)" slug=nonexistent/preset
--- PASS: TestApplyWithoutPullFails (0.00s)
=== RUN TestCacheExpiration
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestCacheExpiration1620386465/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestCacheExpiration1620386465/001/test/preset/metadata.json preview_path=/tmp/TestCacheExpiration1620386465/001/test/preset/preview.yaml slug=test/preset
--- PASS: TestCacheExpiration (0.01s)
=== RUN TestCacheListAfterPull
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://test.example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/preset1.tgz" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://test.example.com/preset1.yaml" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=105 etag=e1 hub_endpoint="http://test.example.com/preset1.tgz" preview_size=8 slug=preset1
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/bundle.tgz cache_key=preset1-1765566102 meta_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/metadata.json preview_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/preview.yaml slug=preset1
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/bundle.tgz cache_key=preset1-1765566102 preview_path=/tmp/TestCacheListAfterPull1961094869/001/preset1/preview.yaml slug=preset1
--- PASS: TestCacheListAfterPull (0.00s)
=== RUN TestApplyReadsArchiveBeforeBackup
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyReadsArchiveBeforeBackup1671951937/001/crowdsec/hub_cache/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestApplyReadsArchiveBeforeBackup1671951937/001/crowdsec/hub_cache/test/preset/metadata.json preview_path=/tmp/TestApplyReadsArchiveBeforeBackup1671951937/001/crowdsec/hub_cache/test/preset/preview.yaml slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyReadsArchiveBeforeBackup1671951937/001/crowdsec/hub_cache/test/preset/bundle.tgz cache_key=test/preset-1765566102 slug=test/preset
--- PASS: TestApplyReadsArchiveBeforeBackup (0.00s)
=== RUN TestFetchIndexParsesRawIndexFormat
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json"
--- PASS: TestFetchIndexParsesRawIndexFormat (0.00s)
=== RUN TestFetchIndexPrefersCSCLI
--- PASS: TestFetchIndexPrefersCSCLI (0.00s)
=== RUN TestFetchIndexFallbackHTTP
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json"
--- PASS: TestFetchIndexFallbackHTTP (0.00s)
=== RUN TestFetchIndexHTTPRejectsRedirect
--- PASS: TestFetchIndexHTTPRejectsRedirect (0.00s)
=== RUN TestFetchIndexHTTPRejectsHTML
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="https://hub-data.crowdsec.net/api/index.json (status 200): hub index responded with HTML; install cscli or set HUB_BASE_URL to a JSON hub endpoint" hub_index="https://hub-data.crowdsec.net/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=2 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 200): hub index responded with HTML; install cscli or set HUB_BASE_URL to a JSON hub endpoint" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=3 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 200): hub index responded with HTML; install cscli or set HUB_BASE_URL to a JSON hub endpoint" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json"
--- PASS: TestFetchIndexHTTPRejectsHTML (0.00s)
=== RUN TestFetchIndexHTTPFallsBackToDefaultHub
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="https://hub.crowdsec.net/api/index.json"
--- PASS: TestFetchIndexHTTPFallsBackToDefaultHub (0.00s)
=== RUN TestFetchIndexFallsBackToMirrorOnForbidden
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="https://hub-data.crowdsec.net/api/index.json (status 403)" hub_index="https://hub-data.crowdsec.net/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=true hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json"
--- PASS: TestFetchIndexFallsBackToMirrorOnForbidden (0.00s)
=== RUN TestPullCachesPreview
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.tgz" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.yaml" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=106 etag=etag1 hub_endpoint="http://example.com/demo.tgz" preview_size=12 slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 preview_path=/tmp/TestPullCachesPreview163764455/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestPullCachesPreview (0.00s)
=== RUN TestApplyUsesCacheWhenCSCLIFails
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyUsesCacheWhenCSCLIFails3907435296/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestApplyUsesCacheWhenCSCLIFails3907435296/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestApplyUsesCacheWhenCSCLIFails3907435296/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyUsesCacheWhenCSCLIFails3907435296/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=warning msg="cscli install failed; attempting cache fallback" error="install failed" slug=crowdsecurity/demo
--- PASS: TestApplyUsesCacheWhenCSCLIFails (0.00s)
=== RUN TestApplyRollsBackOnBadArchive
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyRollsBackOnBadArchive1203944782/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestApplyRollsBackOnBadArchive1203944782/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestApplyRollsBackOnBadArchive1203944782/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyRollsBackOnBadArchive1203944782/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 slug=crowdsecurity/demo
--- PASS: TestApplyRollsBackOnBadArchive (0.00s)
=== RUN TestApplyUsesCacheWhenCscliMissing
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyUsesCacheWhenCscliMissing4071549477/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestApplyUsesCacheWhenCscliMissing4071549477/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestApplyUsesCacheWhenCscliMissing4071549477/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyUsesCacheWhenCscliMissing4071549477/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 slug=crowdsecurity/demo
--- PASS: TestApplyUsesCacheWhenCscliMissing (0.00s)
=== RUN TestPullReturnsCachedPreviewWithoutNetwork
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullReturnsCachedPreviewWithoutNetwork150266149/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestPullReturnsCachedPreviewWithoutNetwork150266149/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullReturnsCachedPreviewWithoutNetwork150266149/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestPullReturnsCachedPreviewWithoutNetwork (0.00s)
=== RUN TestPullEvictsExpiredCacheAndRefreshes
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566100 meta_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.tgz" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.yaml" fallback_used=false
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=99 etag=etag2 hub_endpoint="http://example.com/demo.tgz" preview_size=13 slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566103 meta_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566103 preview_path=/tmp/TestPullEvictsExpiredCacheAndRefreshes2183426244/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestPullEvictsExpiredCacheAndRefreshes (0.00s)
=== RUN TestPullFallsBackToArchivePreview
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://example.com/api/index.json"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="http://example.com/demo.tgz" fallback_used=false
time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="http://example.com/demo.yaml" error="http://example.com/demo.yaml (status 500)"
time="2025-12-12T19:01:42Z" level=warning msg="failed to download preview, falling back to archive inspection" error="preview fetch failed (last endpoint http://example.com/crowdsecurity/demo.yaml): http://example.com/demo.yaml: http://example.com/demo.yaml (status 500)\nhttp://example.com/crowdsecurity/demo.yaml: http://example.com/crowdsecurity/demo.yaml (status 404)" slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=116 etag=etag1 hub_endpoint="http://example.com/demo.tgz" preview_size=11 slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 preview_path=/tmp/TestPullFallsBackToArchivePreview1622869425/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestPullFallsBackToArchivePreview (0.00s)
=== RUN TestPullFallsBackToMirrorArchiveOnForbidden
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="https://primary.example/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="https://primary.example/crowdsecurity/demo.tgz" error="https://primary.example/crowdsecurity/demo.tgz (status 403)"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="https://raw.githubusercontent.com/crowdsecurity/hub/master/crowdsecurity/demo.tgz" fallback_used=true
time="2025-12-12T19:01:42Z" level=warning msg="hub fetch failed, attempting fallback" attempt=1 endpoint="https://primary.example/crowdsecurity/demo.yaml" error="https://primary.example/crowdsecurity/demo.yaml (status 403)"
time="2025-12-12T19:01:42Z" level=info msg="hub fetch succeeded" endpoint="https://raw.githubusercontent.com/crowdsecurity/hub/master/crowdsecurity/demo.yaml" fallback_used=true
time="2025-12-12T19:01:42Z" level=info msg="storing preset in cache" archive_size=105 etag=etag1 hub_endpoint="https://raw.githubusercontent.com/crowdsecurity/hub/master/crowdsecurity/demo.tgz" preview_size=14 slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="preset successfully cached" archive_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 preview_path=/tmp/TestPullFallsBackToMirrorArchiveOnForbidden3050240437/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
--- PASS: TestPullFallsBackToMirrorArchiveOnForbidden (0.00s)
=== RUN TestFetchWithLimitRejectsLargePayload
--- PASS: TestFetchWithLimitRejectsLargePayload (0.19s)
=== RUN TestExtractTarGzRejectsSymlink
--- PASS: TestExtractTarGzRejectsSymlink (0.00s)
=== RUN TestExtractTarGzRejectsAbsolutePath
--- PASS: TestExtractTarGzRejectsAbsolutePath (0.00s)
=== RUN TestFetchIndexHTTPError
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="https://hub-data.crowdsec.net/api/index.json (status 503)" hub_index="https://hub-data.crowdsec.net/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=2 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 503)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=3 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 503)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json"
--- PASS: TestFetchIndexHTTPError (0.00s)
=== RUN TestPullValidatesSlugAndMissingPreset
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="http://hub.example/api/index.json"
--- PASS: TestPullValidatesSlugAndMissingPreset (0.00s)
=== RUN TestFetchPreviewRequiresURL
--- PASS: TestFetchPreviewRequiresURL (0.00s)
=== RUN TestFetchWithLimitRequiresClient
--- PASS: TestFetchWithLimitRequiresClient (0.00s)
=== RUN TestRunCSCLIRejectsUnsafeSlug
--- PASS: TestRunCSCLIRejectsUnsafeSlug (0.00s)
=== RUN TestApplyUsesCSCLISuccess
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyUsesCSCLISuccess906171493/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 meta_path=/tmp/TestApplyUsesCSCLISuccess906171493/001/crowdsecurity/demo/metadata.json preview_path=/tmp/TestApplyUsesCSCLISuccess906171493/001/crowdsecurity/demo/preview.yaml slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyUsesCSCLISuccess906171493/001/crowdsecurity/demo/bundle.tgz cache_key=crowdsecurity/demo-1765566102 slug=crowdsecurity/demo
--- PASS: TestApplyUsesCSCLISuccess (0.00s)
=== RUN TestFetchIndexCSCLIParseError
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=1 error="http://hub.example/api/index.json (status 500)" hub_index="http://hub.example/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=2 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json (status 500)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/.index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=3 error="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json (status 500)" hub_index="https://raw.githubusercontent.com/crowdsecurity/hub/master/api/index.json"
time="2025-12-12T19:01:42Z" level=warning msg="hub index fetch failed, trying mirror" attempt=4 error="https://hub-data.crowdsec.net/api/index.json (status 500)" hub_index="https://hub-data.crowdsec.net/api/index.json"
--- PASS: TestFetchIndexCSCLIParseError (0.00s)
=== RUN TestFetchWithLimitStatusError
--- PASS: TestFetchWithLimitStatusError (0.00s)
=== RUN TestApplyRollsBackWhenCacheMissing
time="2025-12-12T19:01:42Z" level=error msg="cache unavailable for apply" slug=crowdsecurity/demo
time="2025-12-12T19:01:42Z" level=warning msg="cache refresh failed; rolled back backup" backup_path=/tmp/TestApplyRollsBackWhenCacheMissing1102494851/001/crowdsec.backup.20251212-190142 error="cache unavailable for manual apply" slug=crowdsecurity/demo
--- PASS: TestApplyRollsBackWhenCacheMissing (0.00s)
=== RUN TestNormalizeHubBaseURL
=== RUN TestNormalizeHubBaseURL/empty_uses_default
=== RUN TestNormalizeHubBaseURL/whitespace_uses_default
=== RUN TestNormalizeHubBaseURL/removes_trailing_slash
=== RUN TestNormalizeHubBaseURL/removes_multiple_trailing_slashes
=== RUN TestNormalizeHubBaseURL/trims_spaces
=== RUN TestNormalizeHubBaseURL/no_slash_unchanged
--- PASS: TestNormalizeHubBaseURL (0.00s)
--- PASS: TestNormalizeHubBaseURL/empty_uses_default (0.00s)
--- PASS: TestNormalizeHubBaseURL/whitespace_uses_default (0.00s)
--- PASS: TestNormalizeHubBaseURL/removes_trailing_slash (0.00s)
--- PASS: TestNormalizeHubBaseURL/removes_multiple_trailing_slashes (0.00s)
--- PASS: TestNormalizeHubBaseURL/trims_spaces (0.00s)
--- PASS: TestNormalizeHubBaseURL/no_slash_unchanged (0.00s)
=== RUN TestBuildIndexURL
=== RUN TestBuildIndexURL/empty_base_uses_default
=== RUN TestBuildIndexURL/standard_base_appends_path
=== RUN TestBuildIndexURL/trailing_slash_removed
=== RUN TestBuildIndexURL/direct_json_url_unchanged
=== RUN TestBuildIndexURL/case_insensitive_json
--- PASS: TestBuildIndexURL (0.00s)
--- PASS: TestBuildIndexURL/empty_base_uses_default (0.00s)
--- PASS: TestBuildIndexURL/standard_base_appends_path (0.00s)
--- PASS: TestBuildIndexURL/trailing_slash_removed (0.00s)
--- PASS: TestBuildIndexURL/direct_json_url_unchanged (0.00s)
--- PASS: TestBuildIndexURL/case_insensitive_json (0.00s)
=== RUN TestUniqueStrings
=== RUN TestUniqueStrings/empty_slice
=== RUN TestUniqueStrings/no_duplicates
=== RUN TestUniqueStrings/with_duplicates
=== RUN TestUniqueStrings/all_duplicates
=== RUN TestUniqueStrings/preserves_order
--- PASS: TestUniqueStrings (0.00s)
--- PASS: TestUniqueStrings/empty_slice (0.00s)
--- PASS: TestUniqueStrings/no_duplicates (0.00s)
--- PASS: TestUniqueStrings/with_duplicates (0.00s)
--- PASS: TestUniqueStrings/all_duplicates (0.00s)
--- PASS: TestUniqueStrings/preserves_order (0.00s)
=== RUN TestFirstNonEmpty
=== RUN TestFirstNonEmpty/first_non-empty
=== RUN TestFirstNonEmpty/all_empty
=== RUN TestFirstNonEmpty/first_is_non-empty
=== RUN TestFirstNonEmpty/whitespace_treated_as_empty
=== RUN TestFirstNonEmpty/whitespace_with_content
=== RUN TestFirstNonEmpty/empty_slice
=== RUN TestFirstNonEmpty/tabs_and_newlines
--- PASS: TestFirstNonEmpty (0.00s)
--- PASS: TestFirstNonEmpty/first_non-empty (0.00s)
--- PASS: TestFirstNonEmpty/all_empty (0.00s)
--- PASS: TestFirstNonEmpty/first_is_non-empty (0.00s)
--- PASS: TestFirstNonEmpty/whitespace_treated_as_empty (0.00s)
--- PASS: TestFirstNonEmpty/whitespace_with_content (0.00s)
--- PASS: TestFirstNonEmpty/empty_slice (0.00s)
--- PASS: TestFirstNonEmpty/tabs_and_newlines (0.00s)
=== RUN TestCleanShellArg
=== RUN TestCleanShellArg/clean_slug
=== RUN TestCleanShellArg/with_dash
=== RUN TestCleanShellArg/with_underscore
=== RUN TestCleanShellArg/with_dot
=== RUN TestCleanShellArg/path_traversal
=== RUN TestCleanShellArg/absolute_path
=== RUN TestCleanShellArg/backslash_converted
=== RUN TestCleanShellArg/colon_not_allowed
=== RUN TestCleanShellArg/semicolon
=== RUN TestCleanShellArg/pipe
=== RUN TestCleanShellArg/ampersand
=== RUN TestCleanShellArg/backtick
=== RUN TestCleanShellArg/dollar
=== RUN TestCleanShellArg/parenthesis
--- PASS: TestCleanShellArg (0.00s)
--- PASS: TestCleanShellArg/clean_slug (0.00s)
--- PASS: TestCleanShellArg/with_dash (0.00s)
--- PASS: TestCleanShellArg/with_underscore (0.00s)
--- PASS: TestCleanShellArg/with_dot (0.00s)
--- PASS: TestCleanShellArg/path_traversal (0.00s)
--- PASS: TestCleanShellArg/absolute_path (0.00s)
--- PASS: TestCleanShellArg/backslash_converted (0.00s)
--- PASS: TestCleanShellArg/colon_not_allowed (0.00s)
--- PASS: TestCleanShellArg/semicolon (0.00s)
--- PASS: TestCleanShellArg/pipe (0.00s)
--- PASS: TestCleanShellArg/ampersand (0.00s)
--- PASS: TestCleanShellArg/backtick (0.00s)
--- PASS: TestCleanShellArg/dollar (0.00s)
--- PASS: TestCleanShellArg/parenthesis (0.00s)
=== RUN TestHasCSCLI
=== RUN TestHasCSCLI/cscli_available
=== RUN TestHasCSCLI/cscli_not_found
--- PASS: TestHasCSCLI (0.00s)
--- PASS: TestHasCSCLI/cscli_available (0.00s)
--- PASS: TestHasCSCLI/cscli_not_found (0.00s)
=== RUN TestFindPreviewFileFromArchive
=== RUN TestFindPreviewFileFromArchive/finds_yaml_in_archive
=== RUN TestFindPreviewFileFromArchive/returns_empty_for_no_yaml
=== RUN TestFindPreviewFileFromArchive/returns_empty_for_invalid_archive
--- PASS: TestFindPreviewFileFromArchive (0.00s)
--- PASS: TestFindPreviewFileFromArchive/finds_yaml_in_archive (0.00s)
--- PASS: TestFindPreviewFileFromArchive/returns_empty_for_no_yaml (0.00s)
--- PASS: TestFindPreviewFileFromArchive/returns_empty_for_invalid_archive (0.00s)
=== RUN TestApplyWithCopyBasedBackup
time="2025-12-12T19:01:42Z" level=info msg="preset successfully stored in cache" archive_path=/tmp/TestApplyWithCopyBasedBackup4175808900/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 meta_path=/tmp/TestApplyWithCopyBasedBackup4175808900/001/test/preset/metadata.json preview_path=/tmp/TestApplyWithCopyBasedBackup4175808900/001/test/preset/preview.yaml slug=test/preset
time="2025-12-12T19:01:42Z" level=info msg="successfully loaded cached preset metadata" archive_path=/tmp/TestApplyWithCopyBasedBackup4175808900/001/test/preset/bundle.tgz cache_key=test/preset-1765566102 slug=test/preset
--- PASS: TestApplyWithCopyBasedBackup (0.00s)
=== RUN TestBackupExistingHandlesDeviceBusy
--- PASS: TestBackupExistingHandlesDeviceBusy (0.00s)
=== RUN TestCopyFile
--- PASS: TestCopyFile (0.01s)
=== RUN TestCopyDir
--- PASS: TestCopyDir (0.00s)
=== RUN TestFetchIndexHTTPAcceptsTextPlain
time="2025-12-12T19:01:42Z" level=info msg="hub index fetched" fallback_used=false hub_index="https://hub-data.crowdsec.net/api/index.json"
--- PASS: TestFetchIndexHTTPAcceptsTextPlain (0.00s)
=== RUN TestEmptyDir
=== RUN TestEmptyDir/empties_directory_with_files
=== RUN TestEmptyDir/empties_directory_with_subdirectories
=== RUN TestEmptyDir/handles_non-existent_directory
=== RUN TestEmptyDir/handles_empty_directory
--- PASS: TestEmptyDir (0.00s)
--- PASS: TestEmptyDir/empties_directory_with_files (0.00s)
--- PASS: TestEmptyDir/empties_directory_with_subdirectories (0.00s)
--- PASS: TestEmptyDir/handles_non-existent_directory (0.00s)
--- PASS: TestEmptyDir/handles_empty_directory (0.00s)
=== RUN TestExtractTarGz
=== RUN TestExtractTarGz/extracts_valid_archive
=== RUN TestExtractTarGz/rejects_path_traversal
=== RUN TestExtractTarGz/rejects_symlinks
=== RUN TestExtractTarGz/handles_corrupted_gzip
=== RUN TestExtractTarGz/handles_context_cancellation
=== RUN TestExtractTarGz/creates_nested_directories
--- PASS: TestExtractTarGz (0.00s)
--- PASS: TestExtractTarGz/extracts_valid_archive (0.00s)
--- PASS: TestExtractTarGz/rejects_path_traversal (0.00s)
--- PASS: TestExtractTarGz/rejects_symlinks (0.00s)
--- PASS: TestExtractTarGz/handles_corrupted_gzip (0.00s)
--- PASS: TestExtractTarGz/handles_context_cancellation (0.00s)
--- PASS: TestExtractTarGz/creates_nested_directories (0.00s)
=== RUN TestBackupExisting
=== RUN TestBackupExisting/handles_non-existent_directory
=== RUN TestBackupExisting/creates_backup_of_existing_directory
=== RUN TestBackupExisting/backup_contents_match_original
--- PASS: TestBackupExisting (0.00s)
--- PASS: TestBackupExisting/handles_non-existent_directory (0.00s)
--- PASS: TestBackupExisting/creates_backup_of_existing_directory (0.00s)
--- PASS: TestBackupExisting/backup_contents_match_original (0.00s)
=== RUN TestRollback
=== RUN TestRollback/rollback_with_backup
=== RUN TestRollback/rollback_with_empty_backup_path
=== RUN TestRollback/rollback_with_non-existent_backup
--- PASS: TestRollback (0.00s)
--- PASS: TestRollback/rollback_with_backup (0.00s)
--- PASS: TestRollback/rollback_with_empty_backup_path (0.00s)
--- PASS: TestRollback/rollback_with_non-existent_backup (0.00s)
=== RUN TestHubHTTPErrorError
=== RUN TestHubHTTPErrorError/error_with_inner_error
=== RUN TestHubHTTPErrorError/error_without_inner_error
--- PASS: TestHubHTTPErrorError (0.00s)
--- PASS: TestHubHTTPErrorError/error_with_inner_error (0.00s)
--- PASS: TestHubHTTPErrorError/error_without_inner_error (0.00s)
=== RUN TestHubHTTPErrorUnwrap
=== RUN TestHubHTTPErrorUnwrap/unwrap_returns_inner_error
=== RUN TestHubHTTPErrorUnwrap/unwrap_returns_nil_when_no_inner
=== RUN TestHubHTTPErrorUnwrap/errors.Is_works_through_Unwrap
--- PASS: TestHubHTTPErrorUnwrap (0.00s)
--- PASS: TestHubHTTPErrorUnwrap/unwrap_returns_inner_error (0.00s)
--- PASS: TestHubHTTPErrorUnwrap/unwrap_returns_nil_when_no_inner (0.00s)
--- PASS: TestHubHTTPErrorUnwrap/errors.Is_works_through_Unwrap (0.00s)
=== RUN TestHubHTTPErrorCanFallback
=== RUN TestHubHTTPErrorCanFallback/returns_true_when_fallback_is_true
=== RUN TestHubHTTPErrorCanFallback/returns_false_when_fallback_is_false
--- PASS: TestHubHTTPErrorCanFallback (0.00s)
--- PASS: TestHubHTTPErrorCanFallback/returns_true_when_fallback_is_true (0.00s)
--- PASS: TestHubHTTPErrorCanFallback/returns_false_when_fallback_is_false (0.00s)
=== RUN TestListCuratedPresetsReturnsCopy
--- PASS: TestListCuratedPresetsReturnsCopy (0.00s)
=== RUN TestFindPreset
--- PASS: TestFindPreset (0.00s)
=== RUN TestFindPresetCaseVariants
=== RUN TestFindPresetCaseVariants/exact_match
=== RUN TestFindPresetCaseVariants/another_preset
=== RUN TestFindPresetCaseVariants/case_sensitive_miss
=== RUN TestFindPresetCaseVariants/partial_match_miss
=== RUN TestFindPresetCaseVariants/empty_slug
--- PASS: TestFindPresetCaseVariants (0.00s)
--- PASS: TestFindPresetCaseVariants/exact_match (0.00s)
--- PASS: TestFindPresetCaseVariants/another_preset (0.00s)
--- PASS: TestFindPresetCaseVariants/case_sensitive_miss (0.00s)
--- PASS: TestFindPresetCaseVariants/partial_match_miss (0.00s)
--- PASS: TestFindPresetCaseVariants/empty_slug (0.00s)
=== RUN TestListCuratedPresetsReturnsDifferentCopy
--- PASS: TestListCuratedPresetsReturnsDifferentCopy (0.00s)
=== RUN TestCheckLAPIHealth_Healthy
--- PASS: TestCheckLAPIHealth_Healthy (0.00s)
=== RUN TestCheckLAPIHealth_Unhealthy
--- PASS: TestCheckLAPIHealth_Unhealthy (0.00s)
=== RUN TestCheckLAPIHealth_Unreachable
--- PASS: TestCheckLAPIHealth_Unreachable (0.00s)
=== RUN TestCheckLAPIHealth_FallbackToDecisions
--- PASS: TestCheckLAPIHealth_FallbackToDecisions (0.00s)
=== RUN TestCheckLAPIHealth_DefaultURL
--- PASS: TestCheckLAPIHealth_DefaultURL (0.00s)
=== RUN TestGetBouncerAPIKey_FromEnv
--- PASS: TestGetBouncerAPIKey_FromEnv (0.00s)
=== RUN TestGetBouncerAPIKey_Empty
--- PASS: TestGetBouncerAPIKey_Empty (0.00s)
=== RUN TestGetBouncerAPIKey_Fallback
--- PASS: TestGetBouncerAPIKey_Fallback (0.00s)
=== RUN TestEnsureBouncerRegistered_UsesEnvKey
--- PASS: TestEnsureBouncerRegistered_UsesEnvKey (0.00s)
=== RUN TestEnsureBouncerRegistered_NoEnvNoCSCLI
--- PASS: TestEnsureBouncerRegistered_NoEnvNoCSCLI (0.00s)
=== RUN TestEnsureBouncerRegistered_ReturnsExistingBouncerKey
--- PASS: TestEnsureBouncerRegistered_ReturnsExistingBouncerKey (0.00s)
=== RUN TestEnsureBouncerRegistered_RegistersNewWhenNoneExists
--- PASS: TestEnsureBouncerRegistered_RegistersNewWhenNoneExists (0.01s)
=== RUN TestGetLAPIVersion_JSON
--- PASS: TestGetLAPIVersion_JSON (0.00s)
=== RUN TestGetLAPIVersion_PlainText
--- PASS: TestGetLAPIVersion_PlainText (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/crowdsec (cached)
=== RUN TestConnect
--- PASS: TestConnect (0.02s)
=== RUN TestConnect_Error
--- PASS: TestConnect_Error (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/database (cached)
=== RUN TestNewBroadcastHook
--- PASS: TestNewBroadcastHook (0.00s)
=== RUN TestBroadcastHook_Levels
--- PASS: TestBroadcastHook_Levels (0.00s)
=== RUN TestBroadcastHook_Subscribe
--- PASS: TestBroadcastHook_Subscribe (0.00s)
=== RUN TestBroadcastHook_Unsubscribe
--- PASS: TestBroadcastHook_Unsubscribe (0.00s)
=== RUN TestInit
--- PASS: TestInit (0.00s)
=== RUN TestLog
--- PASS: TestLog (0.00s)
=== RUN TestWithFields
--- PASS: TestWithFields (0.00s)
=== RUN TestBroadcastHook_Fire
--- PASS: TestBroadcastHook_Fire (0.00s)
=== RUN TestGetBroadcastHook
--- PASS: TestGetBroadcastHook (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/logger (cached)
=== RUN TestMetrics_Register
--- PASS: TestMetrics_Register (0.00s)
=== RUN TestMetrics_Increment
--- PASS: TestMetrics_Increment (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/metrics (cached)
=== RUN TestDomain_BeforeCreate
--- PASS: TestDomain_BeforeCreate (0.00s)
=== RUN TestNotificationTemplate_BeforeCreate
--- PASS: TestNotificationTemplate_BeforeCreate (0.00s)
=== RUN TestUptimeHost_BeforeCreate
--- PASS: TestUptimeHost_BeforeCreate (0.00s)
=== RUN TestUptimeNotificationEvent_BeforeCreate
--- PASS: TestUptimeNotificationEvent_BeforeCreate (0.00s)
=== RUN TestNotification_BeforeCreate
--- PASS: TestNotification_BeforeCreate (0.00s)
=== RUN TestNotificationConfig_BeforeCreate
--- PASS: TestNotificationConfig_BeforeCreate (0.00s)
=== RUN TestUser_SetPassword
--- PASS: TestUser_SetPassword (0.27s)
=== RUN TestUser_CheckPassword
--- PASS: TestUser_CheckPassword (0.18s)
=== RUN TestUser_HasPendingInvite
=== RUN TestUser_HasPendingInvite/no_invite_token
=== RUN TestUser_HasPendingInvite/expired_invite
=== RUN TestUser_HasPendingInvite/valid_pending_invite
=== RUN TestUser_HasPendingInvite/already_accepted_invite
--- PASS: TestUser_HasPendingInvite (0.00s)
--- PASS: TestUser_HasPendingInvite/no_invite_token (0.00s)
--- PASS: TestUser_HasPendingInvite/expired_invite (0.00s)
--- PASS: TestUser_HasPendingInvite/valid_pending_invite (0.00s)
--- PASS: TestUser_HasPendingInvite/already_accepted_invite (0.00s)
=== RUN TestUser_CanAccessHost_AllowAll
--- PASS: TestUser_CanAccessHost_AllowAll (0.00s)
=== RUN TestUser_CanAccessHost_DenyAll
--- PASS: TestUser_CanAccessHost_DenyAll (0.00s)
=== RUN TestUser_CanAccessHost_AdminBypass
--- PASS: TestUser_CanAccessHost_AdminBypass (0.00s)
=== RUN TestUser_CanAccessHost_DefaultBehavior
--- PASS: TestUser_CanAccessHost_DefaultBehavior (0.00s)
=== RUN TestUser_CanAccessHost_EmptyPermittedHosts
=== RUN TestUser_CanAccessHost_EmptyPermittedHosts/allow_all_with_no_exceptions_allows_all
=== RUN TestUser_CanAccessHost_EmptyPermittedHosts/deny_all_with_no_exceptions_denies_all
--- PASS: TestUser_CanAccessHost_EmptyPermittedHosts (0.00s)
--- PASS: TestUser_CanAccessHost_EmptyPermittedHosts/allow_all_with_no_exceptions_allows_all (0.00s)
--- PASS: TestUser_CanAccessHost_EmptyPermittedHosts/deny_all_with_no_exceptions_denies_all (0.00s)
=== RUN TestPermissionMode_Constants
--- PASS: TestPermissionMode_Constants (0.00s)
=== RUN TestNotificationProvider_BeforeCreate
--- PASS: TestNotificationProvider_BeforeCreate (0.00s)
=== RUN TestUptimeMonitor_BeforeCreate
--- PASS: TestUptimeMonitor_BeforeCreate (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/models (cached)
=== RUN TestNewRouter
[GIN] 2025/12/12 - 00:34:55 | 200 | 1.889348ms | | GET "/"
--- PASS: TestNewRouter (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/server (cached)
=== 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.00s)
--- 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/12 19:01:44 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found
[0.021ms] [rows:0] SELECT * FROM `access_lists` WHERE `access_lists`.`id` = 99999 ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListService_GetByID (0.00s)
--- 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/12 19:01:44 /projects/Charon/backend/internal/services/access_list_service.go:117 record not found
[0.046ms] [rows:0] SELECT * FROM `access_lists` WHERE uuid = "non-existent-uuid" ORDER BY `access_lists`.`id` LIMIT 1
--- PASS: TestAccessListService_GetByUUID (0.00s)
--- 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.00s)
--- 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/12 19:01:44 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found
[0.019ms] [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.00s)
--- 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/12 19:01:44 /projects/Charon/backend/internal/services/access_list_service.go:105 record not found
[0.059ms] [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.00s)
--- 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.00s)
--- 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.00s)
=== RUN TestAccessListService_Validation
=== RUN TestAccessListService_Validation/validate_CIDR_formats
=== RUN TestAccessListService_Validation/validate_country_codes
=== RUN TestAccessListService_Validation/validate_types
--- PASS: TestAccessListService_Validation (0.00s)
--- PASS: TestAccessListService_Validation/validate_CIDR_formats (0.00s)
--- PASS: TestAccessListService_Validation/validate_country_codes (0.00s)
--- PASS: TestAccessListService_Validation/validate_types (0.00s)
=== RUN TestIPMatchesCIDR_Helper
=== RUN TestIPMatchesCIDR_Helper/IPv4_in_subnet
=== RUN TestIPMatchesCIDR_Helper/IPv4_not_in_subnet
=== RUN TestIPMatchesCIDR_Helper/IPv4_single_IP_match
=== RUN TestIPMatchesCIDR_Helper/IPv4_single_IP_no_match
=== RUN TestIPMatchesCIDR_Helper/IPv6_in_subnet
=== RUN TestIPMatchesCIDR_Helper/IPv6_not_in_subnet
=== RUN TestIPMatchesCIDR_Helper/Invalid_CIDR
--- PASS: TestIPMatchesCIDR_Helper (0.00s)
--- PASS: TestIPMatchesCIDR_Helper/IPv4_in_subnet (0.00s)
--- PASS: TestIPMatchesCIDR_Helper/IPv4_not_in_subnet (0.00s)
--- PASS: TestIPMatchesCIDR_Helper/IPv4_single_IP_match (0.00s)
--- PASS: TestIPMatchesCIDR_Helper/IPv4_single_IP_no_match (0.00s)
--- PASS: TestIPMatchesCIDR_Helper/IPv6_in_subnet (0.00s)
--- PASS: TestIPMatchesCIDR_Helper/IPv6_not_in_subnet (0.00s)
--- PASS: TestIPMatchesCIDR_Helper/Invalid_CIDR (0.00s)
=== RUN TestIsPrivateIP_Helper
=== RUN TestIsPrivateIP_Helper/Private_10.x.x.x
=== RUN TestIsPrivateIP_Helper/Private_172.16.x.x
=== RUN TestIsPrivateIP_Helper/Private_192.168.x.x
=== RUN TestIsPrivateIP_Helper/Private_127.0.0.1
=== RUN TestIsPrivateIP_Helper/Private_::1
=== RUN TestIsPrivateIP_Helper/Private_fc00::/7
=== RUN TestIsPrivateIP_Helper/Public_8.8.8.8
=== RUN TestIsPrivateIP_Helper/Public_1.1.1.1
=== RUN TestIsPrivateIP_Helper/Public_IPv6
--- PASS: TestIsPrivateIP_Helper (0.00s)
--- PASS: TestIsPrivateIP_Helper/Private_10.x.x.x (0.00s)
--- PASS: TestIsPrivateIP_Helper/Private_172.16.x.x (0.00s)
--- PASS: TestIsPrivateIP_Helper/Private_192.168.x.x (0.00s)
--- PASS: TestIsPrivateIP_Helper/Private_127.0.0.1 (0.00s)
--- PASS: TestIsPrivateIP_Helper/Private_::1 (0.00s)
--- PASS: TestIsPrivateIP_Helper/Private_fc00::/7 (0.00s)
--- PASS: TestIsPrivateIP_Helper/Public_8.8.8.8 (0.00s)
--- PASS: TestIsPrivateIP_Helper/Public_1.1.1.1 (0.00s)
--- PASS: TestIsPrivateIP_Helper/Public_IPv6 (0.00s)
=== RUN TestAccessListService_ListFunction
--- PASS: TestAccessListService_ListFunction (0.00s)
=== RUN TestAccessListService_SetGeoIPService
--- PASS: TestAccessListService_SetGeoIPService (0.00s)
=== RUN TestAccessListService_GeoACL_NoGeoIPService
=== RUN TestAccessListService_GeoACL_NoGeoIPService/geo_whitelist_without_GeoIP_service_allows_traffic
=== RUN TestAccessListService_GeoACL_NoGeoIPService/geo_blacklist_without_GeoIP_service_allows_traffic
--- PASS: TestAccessListService_GeoACL_NoGeoIPService (0.00s)
--- PASS: TestAccessListService_GeoACL_NoGeoIPService/geo_whitelist_without_GeoIP_service_allows_traffic (0.00s)
--- PASS: TestAccessListService_GeoACL_NoGeoIPService/geo_blacklist_without_GeoIP_service_allows_traffic (0.00s)
=== RUN TestAccessListService_ParseCountryCodes
=== RUN TestAccessListService_ParseCountryCodes/parse_single_code
=== RUN TestAccessListService_ParseCountryCodes/parse_multiple_codes
=== RUN TestAccessListService_ParseCountryCodes/parse_with_spaces
=== RUN TestAccessListService_ParseCountryCodes/parse_with_lowercase
=== RUN TestAccessListService_ParseCountryCodes/parse_empty_string
=== RUN TestAccessListService_ParseCountryCodes/parse_with_empty_entries
--- PASS: TestAccessListService_ParseCountryCodes (0.00s)
--- PASS: TestAccessListService_ParseCountryCodes/parse_single_code (0.00s)
--- PASS: TestAccessListService_ParseCountryCodes/parse_multiple_codes (0.00s)
--- PASS: TestAccessListService_ParseCountryCodes/parse_with_spaces (0.00s)
--- PASS: TestAccessListService_ParseCountryCodes/parse_with_lowercase (0.00s)
--- PASS: TestAccessListService_ParseCountryCodes/parse_empty_string (0.00s)
--- PASS: TestAccessListService_ParseCountryCodes/parse_with_empty_entries (0.00s)
=== RUN TestAuthService_Register
--- PASS: TestAuthService_Register (0.12s)
=== RUN TestAuthService_Login
--- PASS: TestAuthService_Login (0.42s)
=== RUN TestAuthService_ChangePassword
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/auth_service.go:113 record not found
[0.200ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestAuthService_ChangePassword (0.36s)
=== RUN TestAuthService_ValidateToken
--- PASS: TestAuthService_ValidateToken (0.12s)
=== RUN TestAuthService_GetUserByID
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/auth_service.go:147 record not found
[0.025ms] [rows:0] SELECT * FROM `users` WHERE `users`.`id` = 999 ORDER BY `users`.`id` LIMIT 1
--- PASS: TestAuthService_GetUserByID (0.06s)
=== RUN TestBackupService_GetAvailableSpace
=== PAUSE TestBackupService_GetAvailableSpace
=== RUN TestBackupService_CreateAndList
--- PASS: TestBackupService_CreateAndList (0.00s)
=== RUN TestBackupService_Restore_ZipSlip
--- PASS: TestBackupService_Restore_ZipSlip (0.00s)
=== RUN TestBackupService_PathTraversal
--- PASS: TestBackupService_PathTraversal (0.00s)
=== RUN TestBackupService_RunScheduledBackup
time="2025-12-12T19:01:45Z" level=info msg="Starting scheduled backup"
time="2025-12-12T19:01:45Z" level=warning msg="Warning: could not backup caddy dir" error="lstat /tmp/TestBackupService_RunScheduledBackup2081147944/001/data/caddy: no such file or directory"
time="2025-12-12T19:01:45Z" level=info msg="Scheduled backup created" backup=backup_2025-12-12_19-01-45.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 TestNewCertificateService
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestNewCertificateService2961672703/001/certificates
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0
--- PASS: TestNewCertificateService (0.10s)
=== RUN TestCertificateService_GetCertificateInfo
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/cert-test277269634/certificates
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.152ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.255ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/cert-test277269634/certificates
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.036ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "expired.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.013ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=2
--- PASS: TestCertificateService_GetCertificateInfo (0.13s)
=== RUN TestCertificateService_UploadAndDelete
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_UploadAndDelete1997251663/001/certificates
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_UploadAndDelete1997251663/001/certificates
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_UploadAndDelete1997251663/001/certificates
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_UploadAndDelete1997251663/001/certificates
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0
--- PASS: TestCertificateService_UploadAndDelete (0.16s)
=== RUN TestCertificateService_Persistence
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_Persistence800545086/001/certificates
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.144ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "persist.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: deleting ACME cert file" path=/tmp/TestCertificateService_Persistence800545086/001/certificates/acme-v02.api.letsencrypt.org-directory/persist.example.com/persist.example.com.crt
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_Persistence800545086/001/certificates
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service_test.go:289 record not found
[0.034ms] [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.04s)
=== 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.14s)
--- 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.03s)
--- PASS: TestCertificateService_UploadCertificate_Errors/valid_certificate_with_name (0.04s)
--- PASS: TestCertificateService_UploadCertificate_Errors/expired_certificate_can_be_uploaded (0.07s)
=== RUN TestCertificateService_ListCertificates_EdgeCases
=== RUN TestCertificateService_ListCertificates_EdgeCases/empty_certificates_directory
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesempty_certific1812970575/001/certificates
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesempty_certific1812970575/001/certificates
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.227ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0
=== RUN TestCertificateService_ListCertificates_EdgeCases/certificates_directory_does_not_exist
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasescertificates_d9819933/001/does-not-exist/certificates
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasescertificates_d9819933/001/does-not-exist/certificates
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.204ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0
=== RUN TestCertificateService_ListCertificates_EdgeCases/invalid_certificate_files_are_skipped
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesinvalid_certif4204332528/001/certificates
2025/12/12 19:01:45 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.161ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:45Z" level=info msg="CertificateService: disk sync complete" count=0
=== RUN TestCertificateService_ListCertificates_EdgeCases/multiple_certificates_from_different_providers
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ListCertificates_EdgeCasesmultiple_certi2309667957/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.065ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "le.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.265ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=2
--- PASS: TestCertificateService_ListCertificates_EdgeCases (0.21s)
--- PASS: TestCertificateService_ListCertificates_EdgeCases/empty_certificates_directory (0.00s)
--- PASS: TestCertificateService_ListCertificates_EdgeCases/certificates_directory_does_not_exist (0.00s)
--- PASS: TestCertificateService_ListCertificates_EdgeCases/invalid_certificate_files_are_skipped (0.00s)
--- PASS: TestCertificateService_ListCertificates_EdgeCases/multiple_certificates_from_different_providers (0.21s)
=== RUN TestCertificateService_DeleteCertificate_Errors
=== RUN TestCertificateService_DeleteCertificate_Errors/delete_non-existent_certificate
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:410 record not found
[0.019ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE `ssl_certificates`.`id` = 99999 ORDER BY `ssl_certificates`.`id` LIMIT 1
=== RUN TestCertificateService_DeleteCertificate_Errors/delete_certificate_in_use_returns_ErrCertInUse
=== RUN TestCertificateService_DeleteCertificate_Errors/delete_certificate_when_file_already_removed
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service_test.go:513 record not found
[0.021ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE id = 2 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_in_use_returns_ErrCertInUse (0.04s)
--- PASS: TestCertificateService_DeleteCertificate_Errors/delete_certificate_when_file_already_removed (0.03s)
=== RUN TestCertificateService_StagingCertificates
=== RUN TestCertificateService_StagingCertificates/staging_certificate_detected_by_path
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesstaging_certificate_d3028211653/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.183ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "staging.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.318ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_StagingCertificates/production_cert_preferred_over_staging
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesproduction_cert_prefe589373168/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.135ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "both.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.251ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_StagingCertificates/upgrade_from_staging_to_production
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesupgrade_from_staging_992636313/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.130ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "upgrade.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.270ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StagingCertificatesupgrade_from_staging_992636313/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.006ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1
--- PASS: TestCertificateService_StagingCertificates (0.21s)
--- PASS: TestCertificateService_StagingCertificates/staging_certificate_detected_by_path (0.13s)
--- PASS: TestCertificateService_StagingCertificates/production_cert_preferred_over_staging (0.03s)
--- PASS: TestCertificateService_StagingCertificates/upgrade_from_staging_to_production (0.05s)
=== RUN TestCertificateService_ExpiringStatus
=== RUN TestCertificateService_ExpiringStatus/certificate_expiring_within_30_days
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatuscertificate_expiring_withi2043074678/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.115ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "expiring.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.289ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_ExpiringStatus/certificate_valid_for_more_than_30_days
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatuscertificate_valid_for_more411978940/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.142ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "valid-long.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.319ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_ExpiringStatus/staging_cert_always_untrusted_even_if_expiring
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_ExpiringStatusstaging_cert_always_untrus1680907044/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.163ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "staging-expiring.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.344ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1
--- PASS: TestCertificateService_ExpiringStatus (0.24s)
--- PASS: TestCertificateService_ExpiringStatus/certificate_expiring_within_30_days (0.05s)
--- PASS: TestCertificateService_ExpiringStatus/certificate_valid_for_more_than_30_days (0.09s)
--- PASS: TestCertificateService_ExpiringStatus/staging_cert_always_untrusted_even_if_expiring (0.10s)
=== RUN TestCertificateService_StaleCertCleanup
=== RUN TestCertificateService_StaleCertCleanup/stale_DB_entries_removed_when_file_deleted
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StaleCertCleanupstale_DB_entries_removed416459177/001/certificates
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:123 record not found
[0.121ms] [rows:0] SELECT * FROM `ssl_certificates` WHERE domains = "stale.example.com" ORDER BY `ssl_certificates`.`id` LIMIT 1
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.282ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_StaleCertCleanupstale_DB_entries_removed416459177/001/certificates
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: removed stale DB cert" domain=stale.example.com
2025/12/12 19:01:46 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.009ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:46Z" level=info msg="CertificateService: disk sync complete" count=0
--- PASS: TestCertificateService_StaleCertCleanup (0.14s)
--- PASS: TestCertificateService_StaleCertCleanup/stale_DB_entries_removed_when_file_deleted (0.14s)
=== RUN TestCertificateService_CertificateWithSANs
=== RUN TestCertificateService_CertificateWithSANs/certificate_with_SANs_uses_joined_domains
--- PASS: TestCertificateService_CertificateWithSANs (0.17s)
--- PASS: TestCertificateService_CertificateWithSANs/certificate_with_SANs_uses_joined_domains (0.17s)
=== RUN TestCertificateService_IsCertificateInUse
=== RUN TestCertificateService_IsCertificateInUse/certificate_not_in_use
=== RUN TestCertificateService_IsCertificateInUse/certificate_used_by_one_proxy_host
=== RUN TestCertificateService_IsCertificateInUse/certificate_used_by_multiple_proxy_hosts
=== RUN TestCertificateService_IsCertificateInUse/non-existent_certificate
=== RUN TestCertificateService_IsCertificateInUse/certificate_freed_after_proxy_host_deletion
--- PASS: TestCertificateService_IsCertificateInUse (0.18s)
--- PASS: TestCertificateService_IsCertificateInUse/certificate_not_in_use (0.02s)
--- PASS: TestCertificateService_IsCertificateInUse/certificate_used_by_one_proxy_host (0.03s)
--- PASS: TestCertificateService_IsCertificateInUse/certificate_used_by_multiple_proxy_hosts (0.01s)
--- PASS: TestCertificateService_IsCertificateInUse/non-existent_certificate (0.00s)
--- PASS: TestCertificateService_IsCertificateInUse/certificate_freed_after_proxy_host_deletion (0.11s)
=== RUN TestCertificateService_CacheBehavior
=== RUN TestCertificateService_CacheBehavior/cache_returns_consistent_results
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorcache_returns_consistent_re689688188/001/certificates
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorcache_returns_consistent_re689688188/001/certificates
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.256ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: disk sync complete" count=1
=== RUN TestCertificateService_CacheBehavior/invalidate_cache_forces_resync
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res1008682794/001/certificates
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res1008682794/001/certificates
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.796ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: disk sync complete" count=1
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res1008682794/001/certificates
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorinvalidate_cache_forces_res1008682794/001/certificates
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.010ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: disk sync complete" count=2
=== RUN TestCertificateService_CacheBehavior/refreshCacheFromDB_used_when_directory_nonexistent
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: scanning cert directory" certRoot=/tmp/TestCertificateService_CacheBehaviorrefreshCacheFromDB_used_whe2455254220/001/nonexistent/certificates
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: cert directory does not exist" certRoot=/tmp/TestCertificateService_CacheBehaviorrefreshCacheFromDB_used_whe2455254220/001/nonexistent/certificates
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/certificate_service.go:232 no such table: proxy_hosts
[0.260ms] [rows:0] SELECT * FROM `proxy_hosts`
time="2025-12-12T19:01:47Z" level=info msg="CertificateService: disk sync complete" count=1
--- PASS: TestCertificateService_CacheBehavior (0.08s)
--- PASS: TestCertificateService_CacheBehavior/cache_returns_consistent_results (0.03s)
--- PASS: TestCertificateService_CacheBehavior/invalidate_cache_forces_resync (0.05s)
--- PASS: TestCertificateService_CacheBehavior/refreshCacheFromDB_used_when_directory_nonexistent (0.00s)
=== RUN TestDockerService_New
--- PASS: TestDockerService_New (0.00s)
=== RUN TestDockerService_ListContainers
--- PASS: TestDockerService_ListContainers (0.00s)
=== RUN TestNewGeoIPService_InvalidPath
--- PASS: TestNewGeoIPService_InvalidPath (0.00s)
=== RUN TestGeoIPService_NotLoaded
--- PASS: TestGeoIPService_NotLoaded (0.00s)
=== RUN TestGeoIPService_InvalidIP
--- PASS: TestGeoIPService_InvalidIP (0.00s)
=== RUN TestGeoIPService_LookupCountry_CountryNotFound
--- PASS: TestGeoIPService_LookupCountry_CountryNotFound (0.00s)
=== RUN TestGeoIPService_LookupCountry_Success
--- PASS: TestGeoIPService_LookupCountry_Success (0.00s)
=== RUN TestGeoIPService_LookupCountry_ReaderError
--- PASS: TestGeoIPService_LookupCountry_ReaderError (0.00s)
=== RUN TestGeoIPService_Close
--- PASS: TestGeoIPService_Close (0.00s)
=== RUN TestGeoIPService_GetDatabasePath
--- PASS: TestGeoIPService_GetDatabasePath (0.00s)
=== RUN TestGeoIPService_ConcurrentAccess
--- PASS: TestGeoIPService_ConcurrentAccess (0.00s)
=== RUN TestGeoIPService_Integration
geoip_service_test.go:134: GeoIP database not found, skipping integration test
--- SKIP: TestGeoIPService_Integration (0.00s)
=== RUN TestGeoIPService_ErrorTypes
--- PASS: TestGeoIPService_ErrorTypes (0.00s)
=== RUN TestLogService
--- PASS: TestLogService (0.00s)
=== RUN TestMailService_SaveAndGetSMTPConfig
--- PASS: TestMailService_SaveAndGetSMTPConfig (0.00s)
=== RUN TestMailService_UpdateSMTPConfig
--- PASS: TestMailService_UpdateSMTPConfig (0.00s)
=== RUN TestMailService_IsConfigured
=== RUN TestMailService_IsConfigured/configured_with_all_fields
=== RUN TestMailService_IsConfigured/not_configured_-_missing_host
=== RUN TestMailService_IsConfigured/not_configured_-_missing_from_address
--- PASS: TestMailService_IsConfigured (0.00s)
--- PASS: TestMailService_IsConfigured/configured_with_all_fields (0.00s)
--- PASS: TestMailService_IsConfigured/not_configured_-_missing_host (0.00s)
--- PASS: TestMailService_IsConfigured/not_configured_-_missing_from_address (0.00s)
=== RUN TestMailService_GetSMTPConfig_Defaults
--- PASS: TestMailService_GetSMTPConfig_Defaults (0.00s)
=== RUN TestMailService_BuildEmail
--- PASS: TestMailService_BuildEmail (0.00s)
=== RUN TestMailService_HeaderInjectionPrevention
=== RUN TestMailService_HeaderInjectionPrevention/subject_with_CRLF_injection_attempt
=== RUN TestMailService_HeaderInjectionPrevention/subject_with_LF_injection_attempt
=== RUN TestMailService_HeaderInjectionPrevention/subject_with_null_byte
--- PASS: TestMailService_HeaderInjectionPrevention (0.00s)
--- PASS: TestMailService_HeaderInjectionPrevention/subject_with_CRLF_injection_attempt (0.00s)
--- PASS: TestMailService_HeaderInjectionPrevention/subject_with_LF_injection_attempt (0.00s)
--- PASS: TestMailService_HeaderInjectionPrevention/subject_with_null_byte (0.00s)
=== RUN TestSanitizeEmailHeader
=== RUN TestSanitizeEmailHeader/clean_string
=== RUN TestSanitizeEmailHeader/CR_removal
=== RUN TestSanitizeEmailHeader/LF_removal
=== RUN TestSanitizeEmailHeader/CRLF_removal
=== RUN TestSanitizeEmailHeader/null_byte_removal
=== RUN TestSanitizeEmailHeader/tab_removal
=== RUN TestSanitizeEmailHeader/multiple_control_chars
=== RUN TestSanitizeEmailHeader/empty_string
--- PASS: TestSanitizeEmailHeader (0.00s)
--- PASS: TestSanitizeEmailHeader/clean_string (0.00s)
--- PASS: TestSanitizeEmailHeader/CR_removal (0.00s)
--- PASS: TestSanitizeEmailHeader/LF_removal (0.00s)
--- PASS: TestSanitizeEmailHeader/CRLF_removal (0.00s)
--- PASS: TestSanitizeEmailHeader/null_byte_removal (0.00s)
--- PASS: TestSanitizeEmailHeader/tab_removal (0.00s)
--- PASS: TestSanitizeEmailHeader/multiple_control_chars (0.00s)
--- PASS: TestSanitizeEmailHeader/empty_string (0.00s)
=== RUN TestValidateEmailAddress
=== RUN TestValidateEmailAddress/valid_email
=== RUN TestValidateEmailAddress/valid_email_with_name
=== RUN TestValidateEmailAddress/empty_email
=== RUN TestValidateEmailAddress/invalid_format
=== RUN TestValidateEmailAddress/missing_domain
=== RUN TestValidateEmailAddress/injection_attempt
--- PASS: TestValidateEmailAddress (0.00s)
--- PASS: TestValidateEmailAddress/valid_email (0.00s)
--- PASS: TestValidateEmailAddress/valid_email_with_name (0.00s)
--- PASS: TestValidateEmailAddress/empty_email (0.00s)
--- PASS: TestValidateEmailAddress/invalid_format (0.00s)
--- PASS: TestValidateEmailAddress/missing_domain (0.00s)
--- PASS: TestValidateEmailAddress/injection_attempt (0.00s)
=== RUN TestMailService_TestConnection_NotConfigured
--- PASS: TestMailService_TestConnection_NotConfigured (0.00s)
=== RUN TestMailService_SendEmail_NotConfigured
--- PASS: TestMailService_SendEmail_NotConfigured (0.00s)
=== RUN TestSMTPConfigSerialization
--- PASS: TestSMTPConfigSerialization (0.00s)
=== RUN TestMailService_SendInvite_Template
time="2025-12-12T19:01:47Z" level=info msg="Sending invite email" email=test@example.com
--- PASS: TestMailService_SendInvite_Template (0.00s)
=== RUN TestMailService_Integration
mail_service_test.go:383: Integration test requires SMTP server
--- SKIP: TestMailService_Integration (0.00s)
=== RUN TestMailService_SendInvite_TokenFormat
time="2025-12-12T19:01:47Z" level=info msg="Sending invite email" email=test@example.com
time="2025-12-12T19:01:47Z" level=info msg="Sending invite email" email=test@example.com
--- PASS: TestMailService_SendInvite_TokenFormat (0.01s)
=== RUN TestMailService_SaveSMTPConfig_Concurrent
mail_service_test.go:412: In-memory SQLite doesn't support concurrent writes - test real DB in integration
--- SKIP: TestMailService_SaveSMTPConfig_Concurrent (0.00s)
=== RUN TestMailService_SendEmail_InvalidRecipient
--- PASS: TestMailService_SendEmail_InvalidRecipient (0.00s)
=== RUN TestMailService_SendEmail_InvalidFromAddress
--- PASS: TestMailService_SendEmail_InvalidFromAddress (0.00s)
=== RUN TestMailService_SendEmail_EncryptionModes
=== RUN TestMailService_SendEmail_EncryptionModes/ssl
=== RUN TestMailService_SendEmail_EncryptionModes/starttls
=== RUN TestMailService_SendEmail_EncryptionModes/none
=== RUN TestMailService_SendEmail_EncryptionModes/empty
--- PASS: TestMailService_SendEmail_EncryptionModes (0.01s)
--- PASS: TestMailService_SendEmail_EncryptionModes/ssl (0.00s)
--- PASS: TestMailService_SendEmail_EncryptionModes/starttls (0.00s)
--- PASS: TestMailService_SendEmail_EncryptionModes/none (0.00s)
--- PASS: TestMailService_SendEmail_EncryptionModes/empty (0.00s)
=== RUN TestNotificationService_TemplateCRUD
=== PAUSE TestNotificationService_TemplateCRUD
=== RUN TestNotificationService_Create
--- PASS: TestNotificationService_Create (0.00s)
=== RUN TestNotificationService_List
--- PASS: TestNotificationService_List (0.00s)
=== RUN TestNotificationService_MarkAsRead
--- PASS: TestNotificationService_MarkAsRead (0.00s)
=== RUN TestNotificationService_MarkAllAsRead
--- PASS: TestNotificationService_MarkAllAsRead (0.00s)
=== RUN TestNotificationService_Providers
--- PASS: TestNotificationService_Providers (0.00s)
=== RUN TestNotificationService_TestProvider_Webhook
--- PASS: TestNotificationService_TestProvider_Webhook (0.00s)
=== RUN TestNotificationService_SendExternal
--- PASS: TestNotificationService_SendExternal (0.00s)
=== RUN TestNotificationService_SendExternal_MinimalVsDetailedTemplates
--- PASS: TestNotificationService_SendExternal_MinimalVsDetailedTemplates (0.00s)
=== RUN TestNotificationService_SendExternal_Filtered
--- PASS: TestNotificationService_SendExternal_Filtered (0.10s)
=== RUN TestNotificationService_SendExternal_Shoutrrr
--- PASS: TestNotificationService_SendExternal_Shoutrrr (0.10s)
=== 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.00s)
--- 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.00s)
=== 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.00s)
--- 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
time="2025-12-12T19:01:47Z" 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/provider_filtered_by_category
=== RUN TestNotificationService_SendExternal_EdgeCases/custom_data_passed_to_webhook
--- PASS: TestNotificationService_SendExternal_EdgeCases (0.21s)
--- PASS: TestNotificationService_SendExternal_EdgeCases/no_enabled_providers (0.05s)
--- PASS: TestNotificationService_SendExternal_EdgeCases/provider_filtered_by_category (0.05s)
--- PASS: TestNotificationService_SendExternal_EdgeCases/custom_data_passed_to_webhook (0.10s)
=== 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_IsPrivateIP
=== RUN TestNotificationService_IsPrivateIP/loopback_ipv4
=== RUN TestNotificationService_IsPrivateIP/loopback_ipv6
=== RUN TestNotificationService_IsPrivateIP/private_10.x
=== RUN TestNotificationService_IsPrivateIP/private_10.x_high
=== RUN TestNotificationService_IsPrivateIP/private_172.16-31
=== RUN TestNotificationService_IsPrivateIP/private_172.31
=== RUN TestNotificationService_IsPrivateIP/private_192.168
=== RUN TestNotificationService_IsPrivateIP/public_172.32
=== RUN TestNotificationService_IsPrivateIP/public_172.15
=== RUN TestNotificationService_IsPrivateIP/public_ip
=== RUN TestNotificationService_IsPrivateIP/public_ipv6
=== RUN TestNotificationService_IsPrivateIP/link_local_ipv4
=== RUN TestNotificationService_IsPrivateIP/link_local_ipv6
=== RUN TestNotificationService_IsPrivateIP/unique_local_ipv6_fc
=== RUN TestNotificationService_IsPrivateIP/unique_local_ipv6_fc_high
=== RUN TestNotificationService_IsPrivateIP/unique_local_ipv6_fd
--- PASS: TestNotificationService_IsPrivateIP (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/loopback_ipv4 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/loopback_ipv6 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/private_10.x (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/private_10.x_high (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/private_172.16-31 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/private_172.31 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/private_192.168 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/public_172.32 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/public_172.15 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/public_ip (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/public_ipv6 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/link_local_ipv4 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/link_local_ipv6 (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/unique_local_ipv6_fc (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/unique_local_ipv6_fc_high (0.00s)
--- PASS: TestNotificationService_IsPrivateIP/unique_local_ipv6_fd (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.00s)
--- 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/12 19:01:47 /projects/Charon/backend/internal/services/proxyhost_service.go:103 record not found
[0.041ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE `proxy_hosts`.`id` = 1 ORDER BY `proxy_hosts`.`id` LIMIT 1
--- PASS: TestProxyHostService_CRUD (0.00s)
=== RUN TestProxyHostService_TestConnection
--- PASS: TestProxyHostService_TestConnection (0.00s)
=== RUN TestProxyHostService_AdvancedConfig
=== RUN TestProxyHostService_AdvancedConfig/Empty_advanced_config
=== RUN TestProxyHostService_AdvancedConfig/Valid_JSON_object
=== RUN TestProxyHostService_AdvancedConfig/Valid_JSON_array
=== RUN TestProxyHostService_AdvancedConfig/Invalid_JSON
=== RUN TestProxyHostService_AdvancedConfig/Valid_nested_config
--- PASS: TestProxyHostService_AdvancedConfig (0.00s)
--- PASS: TestProxyHostService_AdvancedConfig/Empty_advanced_config (0.00s)
--- PASS: TestProxyHostService_AdvancedConfig/Valid_JSON_object (0.00s)
--- PASS: TestProxyHostService_AdvancedConfig/Valid_JSON_array (0.00s)
--- PASS: TestProxyHostService_AdvancedConfig/Invalid_JSON (0.00s)
--- PASS: TestProxyHostService_AdvancedConfig/Valid_nested_config (0.00s)
=== RUN TestProxyHostService_UpdateAdvancedConfig
--- PASS: TestProxyHostService_UpdateAdvancedConfig (0.00s)
=== RUN TestProxyHostService_EmptyDomain
--- PASS: TestProxyHostService_EmptyDomain (0.00s)
=== RUN TestRemoteServerService_ValidateUniqueServer
--- PASS: TestRemoteServerService_ValidateUniqueServer (0.00s)
=== RUN TestRemoteServerService_CRUD
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/remoteserver_service.go:68 record not found
[0.015ms] [rows:0] SELECT * FROM `remote_servers` WHERE `remote_servers`.`id` = 2 ORDER BY `remote_servers`.`id` LIMIT 1
--- PASS: TestRemoteServerService_CRUD (0.00s)
=== RUN TestNewSecurityNotificationService
--- PASS: TestNewSecurityNotificationService (0.00s)
=== RUN TestSecurityNotificationService_GetSettings_Default
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:29 record not found
[0.024ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationService_GetSettings_Default (0.00s)
=== RUN TestSecurityNotificationService_UpdateSettings
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.022ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationService_UpdateSettings (0.00s)
=== RUN TestSecurityNotificationService_UpdateSettings_Existing
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.023ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationService_UpdateSettings_Existing (0.00s)
=== RUN TestSecurityNotificationService_Send_Disabled
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:29 record not found
[0.016ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationService_Send_Disabled (0.00s)
=== RUN TestSecurityNotificationService_Send_FilteredByEventType
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.018ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationService_Send_FilteredByEventType (0.00s)
=== RUN TestSecurityNotificationService_Send_FilteredBySeverity
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.027ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationService_Send_FilteredBySeverity (0.00s)
=== RUN TestSecurityNotificationService_Send_WebhookSuccess
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.044ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationService_Send_WebhookSuccess (0.00s)
=== RUN TestSecurityNotificationService_Send_WebhookFailure
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.040ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
time="2025-12-12T19:01:47Z" level=error msg="Failed to send webhook notification" error="webhook returned status 500"
--- PASS: TestSecurityNotificationService_Send_WebhookFailure (0.00s)
=== RUN TestShouldNotify
=== RUN TestShouldNotify/error_>=_error
=== RUN TestShouldNotify/warn_<_error
=== RUN TestShouldNotify/error_>=_warn
=== RUN TestShouldNotify/info_>=_info
=== RUN TestShouldNotify/debug_<_info
=== RUN TestShouldNotify/error_>=_debug
--- PASS: TestShouldNotify (0.00s)
--- PASS: TestShouldNotify/error_>=_error (0.00s)
--- PASS: TestShouldNotify/warn_<_error (0.00s)
--- PASS: TestShouldNotify/error_>=_warn (0.00s)
--- PASS: TestShouldNotify/info_>=_info (0.00s)
--- PASS: TestShouldNotify/debug_<_info (0.00s)
--- PASS: TestShouldNotify/error_>=_debug (0.00s)
=== RUN TestSecurityNotificationService_Send_ACLDeny
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.041ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
--- PASS: TestSecurityNotificationService_Send_ACLDeny (0.00s)
=== RUN TestSecurityNotificationService_Send_ContextTimeout
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_notification_service.go:45 record not found
[0.039ms] [rows:0] SELECT * FROM `notification_configs` ORDER BY `notification_configs`.`id` LIMIT 1
time="2025-12-12T19:01:47Z" level=error msg="Failed to send webhook notification" error="execute request: Post \"http://127.0.0.1:41425\": context deadline exceeded"
--- PASS: TestSecurityNotificationService_Send_ContextTimeout (0.10s)
=== RUN TestSecurityService_Upsert_ValidateAdminWhitelist
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.036ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Upsert_ValidateAdminWhitelist (0.00s)
=== RUN TestSecurityService_BreakGlassTokenLifecycle
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.033ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_BreakGlassTokenLifecycle (0.18s)
=== RUN TestSecurityService_LogDecisionAndList
--- PASS: TestSecurityService_LogDecisionAndList (0.00s)
=== RUN TestSecurityService_UpsertRuleSet
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:212 record not found
[0.027ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityService_UpsertRuleSet (0.00s)
=== RUN TestSecurityService_UpsertRuleSet_ContentTooLarge
--- PASS: TestSecurityService_UpsertRuleSet_ContentTooLarge (0.01s)
=== RUN TestSecurityService_DeleteRuleSet
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:212 record not found
[0.034ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityService_DeleteRuleSet (0.00s)
=== RUN TestSecurityService_Upsert_RejectExternalMode
2025/12/12 19:01:47 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.048ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Upsert_RejectExternalMode (0.00s)
=== RUN TestSecurityService_GenerateBreakGlassToken_NewConfig
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:121 record not found
[0.175ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "newconfig" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_GenerateBreakGlassToken_NewConfig (0.13s)
=== RUN TestSecurityService_GenerateBreakGlassToken_UpdateExisting
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.039ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_GenerateBreakGlassToken_UpdateExisting (0.24s)
=== RUN TestSecurityService_VerifyBreakGlassToken_NoConfig
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:142 record not found
[0.048ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "nonexistent" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_VerifyBreakGlassToken_NoConfig (0.00s)
=== RUN TestSecurityService_VerifyBreakGlassToken_NoHash
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.042ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_VerifyBreakGlassToken_NoHash (0.00s)
=== RUN TestSecurityService_VerifyBreakGlassToken_WrongToken
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:121 record not found
[0.161ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_VerifyBreakGlassToken_WrongToken (0.36s)
=== RUN TestSecurityService_Get_NotFound
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:37 record not found
[0.035ms] [rows:0] SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Get_NotFound (0.00s)
=== RUN TestSecurityService_Upsert_PreserveBreakGlassHash
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:121 record not found
[0.141ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Upsert_PreserveBreakGlassHash (0.12s)
=== RUN TestSecurityService_Upsert_RateLimitFieldsPersist
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.035ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Upsert_RateLimitFieldsPersist (0.00s)
=== RUN TestSecurityService_LogAudit
--- PASS: TestSecurityService_LogAudit (0.00s)
=== RUN TestSecurityService_DeleteRuleSet_NotFound
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:234 record not found
[0.027ms] [rows:0] SELECT * FROM `security_rule_sets` WHERE `security_rule_sets`.`id` = 9999 ORDER BY `security_rule_sets`.`id` LIMIT 1
--- PASS: TestSecurityService_DeleteRuleSet_NotFound (0.00s)
=== RUN TestSecurityService_ListDecisions_UnlimitedAndLimited
--- PASS: TestSecurityService_ListDecisions_UnlimitedAndLimited (0.00s)
=== RUN TestSecurityService_LogDecision_Nil
--- PASS: TestSecurityService_LogDecision_Nil (0.00s)
=== RUN TestSecurityService_LogDecision_PrefilledUUID
--- PASS: TestSecurityService_LogDecision_PrefilledUUID (0.00s)
=== RUN TestSecurityService_ListRuleSets_Empty
--- PASS: TestSecurityService_ListRuleSets_Empty (0.00s)
=== RUN TestSecurityService_Upsert_InvalidCrowdSecMode
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/security_service.go:73 record not found
[0.047ms] [rows:0] SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
--- PASS: TestSecurityService_Upsert_InvalidCrowdSecMode (0.00s)
=== RUN TestUpdateService_CheckForUpdates
--- PASS: TestUpdateService_CheckForUpdates (0.00s)
=== RUN TestUptimeService_sendRecoveryNotification
=== PAUSE TestUptimeService_sendRecoveryNotification
=== RUN TestUptimeService_CheckAll
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.061ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.063ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:48Z" level=info msg="Created UptimeHost" host=127.0.0.1 host_id=74fe6813-2845-487e-b7be-5115a6a04ade
2025/12/12 19:01:48 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.056ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 2 ORDER BY `uptime_monitors`.`id` LIMIT 1
time="2025-12-12T19:01:49Z" level=info msg="Host status changed" host_ip=127.0.0.1 host_name="127.0.0.1:34511" message="dial tcp 127.0.0.1:34097: connect: connection refused" new=down old=up
time="2025-12-12T19:01:49Z" level=info msg="Sent consolidated DOWN notification" host_name="127.0.0.1:34511" service_count=1
--- PASS: TestUptimeService_CheckAll (1.74s)
=== RUN TestUptimeService_ListMonitors
--- PASS: TestUptimeService_ListMonitors (0.01s)
=== RUN TestUptimeService_GetMonitorByID
=== RUN TestUptimeService_GetMonitorByID/get_existing_monitor
=== RUN TestUptimeService_GetMonitorByID/get_non-existent_monitor
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:869 record not found
[0.029ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent" ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestUptimeService_GetMonitorByID (0.01s)
--- PASS: TestUptimeService_GetMonitorByID/get_existing_monitor (0.00s)
--- PASS: TestUptimeService_GetMonitorByID/get_non-existent_monitor (0.00s)
=== RUN TestUptimeService_GetMonitorHistory
--- PASS: TestUptimeService_GetMonitorHistory (0.01s)
=== RUN TestUptimeService_SyncMonitors_Errors
=== RUN TestUptimeService_SyncMonitors_Errors/database_error_during_proxy_host_fetch
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:105 sql: database is closed
[0.015ms] [rows:0] SELECT * FROM `proxy_hosts`
=== RUN TestUptimeService_SyncMonitors_Errors/creates_monitors_for_new_hosts
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.050ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.027ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=26cd5331-60ed-4ee6-9de6-0d715d027535
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.051ms] [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/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.041ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.023ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=c1b153d4-c37f-4d0f-9529-386f5687e14d
--- PASS: TestUptimeService_SyncMonitors_Errors (0.03s)
--- PASS: TestUptimeService_SyncMonitors_Errors/database_error_during_proxy_host_fetch (0.01s)
--- PASS: TestUptimeService_SyncMonitors_Errors/creates_monitors_for_new_hosts (0.01s)
--- PASS: TestUptimeService_SyncMonitors_Errors/orphaned_monitors_persist_after_host_deletion (0.01s)
=== RUN TestUptimeService_SyncMonitors_NameSync
=== RUN TestUptimeService_SyncMonitors_NameSync/syncs_name_from_proxy_host_when_changed
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.054ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.041ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=7564348b-8a58-497e-ac17-0a4ffa73c0da
=== RUN TestUptimeService_SyncMonitors_NameSync/uses_domain_name_when_proxy_host_name_is_empty
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.032ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.023ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=3c7ef273-e0b7-436b-bd6d-805a8faa99f3
=== RUN TestUptimeService_SyncMonitors_NameSync/updates_monitor_name_when_host_name_becomes_empty
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.058ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.039ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=4748c52b-b02f-4cf7-a0b2-a64c174f2b4a
--- PASS: TestUptimeService_SyncMonitors_NameSync (0.03s)
--- PASS: TestUptimeService_SyncMonitors_NameSync/syncs_name_from_proxy_host_when_changed (0.01s)
--- PASS: TestUptimeService_SyncMonitors_NameSync/uses_domain_name_when_proxy_host_name_is_empty (0.01s)
--- PASS: TestUptimeService_SyncMonitors_NameSync/updates_monitor_name_when_host_name_becomes_empty (0.01s)
=== RUN TestUptimeService_SyncMonitors_TCPMigration
=== RUN TestUptimeService_SyncMonitors_TCPMigration/migrates_TCP_monitor_to_HTTP_for_public_URL
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.034ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=backend.local host_id=152ae32f-d0e3-49e2-8696-1a2bf56dd256
time="2025-12-12T19:01:50Z" 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/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.030ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=backend.local host_id=3b1e92b7-7a16-48dd-9dbb-554ce01f8826
--- PASS: TestUptimeService_SyncMonitors_TCPMigration (0.02s)
--- PASS: TestUptimeService_SyncMonitors_TCPMigration/migrates_TCP_monitor_to_HTTP_for_public_URL (0.01s)
--- PASS: TestUptimeService_SyncMonitors_TCPMigration/does_not_migrate_TCP_monitor_with_custom_URL (0.01s)
=== RUN TestUptimeService_SyncMonitors_HTTPSUpgrade
=== RUN TestUptimeService_SyncMonitors_HTTPSUpgrade/upgrades_HTTP_to_HTTPS_when_SSL_forced
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.021ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=17b65706-637c-4d22-9380-9908579c49d3
time="2025-12-12T19:01:50Z" 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/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.021ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host= host_id=fef11b5c-cdc7-4e30-9fec-78189c6431f6
--- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade (0.02s)
--- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade/upgrades_HTTP_to_HTTPS_when_SSL_forced (0.01s)
--- PASS: TestUptimeService_SyncMonitors_HTTPSUpgrade/does_not_downgrade_HTTPS_when_SSL_not_forced (0.01s)
=== RUN TestUptimeService_SyncMonitors_RemoteServers
=== RUN TestUptimeService_SyncMonitors_RemoteServers/creates_monitor_for_new_remote_server
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found
[0.059ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.043ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "backend.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=backend.local host_id=74908064-6ad0-4532-9711-93a7848947bc
=== RUN TestUptimeService_SyncMonitors_RemoteServers/creates_TCP_monitor_for_remote_server_without_scheme
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found
[0.038ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.022ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "tcp.backend" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=tcp.backend host_id=593e3c1e-c6a8-4d4a-86e1-c197048a59b3
=== RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_name_changes
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found
[0.044ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.022ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=server.local host_id=d1c46790-6ec2-4dee-a3d5-966fe241d615
=== RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_URL_changes
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found
[0.105ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.034ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "old.host" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=old.host host_id=9b0ac32c-6646-4a47-ba74-7608e35ef25b
=== RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_enabled_status
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found
[0.049ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.047ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=server.local host_id=9d5ab0eb-fd75-488b-af31-c45ca72b72cf
=== RUN TestUptimeService_SyncMonitors_RemoteServers/syncs_scheme_change_from_TCP_to_HTTPS
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:210 record not found
[0.042ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE remote_server_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.026ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "server.local" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=server.local host_id=812922d2-8e38-4997-8df2-deb0220a535f
--- PASS: TestUptimeService_SyncMonitors_RemoteServers (0.07s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/creates_monitor_for_new_remote_server (0.01s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/creates_TCP_monitor_for_remote_server_without_scheme (0.02s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_name_changes (0.01s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_URL_changes (0.01s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_remote_server_enabled_status (0.01s)
--- PASS: TestUptimeService_SyncMonitors_RemoteServers/syncs_scheme_change_from_TCP_to_HTTPS (0.01s)
=== 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/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.067ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:50 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.035ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "192.0.2.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:50Z" level=info msg="Created UptimeHost" host=192.0.2.1 host_id=b3a78269-2e94-4ebd-a939-260f1b342854
--- PASS: TestUptimeService_CheckAll_Errors (7.19s)
--- PASS: TestUptimeService_CheckAll_Errors/handles_empty_monitor_list (0.06s)
--- PASS: TestUptimeService_CheckAll_Errors/orphan_monitors_don't_prevent_check_execution (0.11s)
--- PASS: TestUptimeService_CheckAll_Errors/handles_timeout_for_slow_hosts (7.02s)
=== RUN TestUptimeService_CheckMonitor_EdgeCases
=== RUN TestUptimeService_CheckMonitor_EdgeCases/invalid_URL_format
=== RUN TestUptimeService_CheckMonitor_EdgeCases/http_404_response_treated_as_down
2025/12/12 19:01:58 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.059ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:01:58 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.074ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "127.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:01:58Z" level=info msg="Created UptimeHost" host=127.0.0.1 host_id=b1a034b5-115f-45cf-bd08-eecc88f5786e
=== RUN TestUptimeService_CheckMonitor_EdgeCases/https_URL_without_valid_certificate
--- PASS: TestUptimeService_CheckMonitor_EdgeCases (3.89s)
--- PASS: TestUptimeService_CheckMonitor_EdgeCases/invalid_URL_format (0.51s)
--- PASS: TestUptimeService_CheckMonitor_EdgeCases/http_404_response_treated_as_down (0.37s)
--- PASS: TestUptimeService_CheckMonitor_EdgeCases/https_URL_without_valid_certificate (3.01s)
=== RUN TestUptimeService_GetMonitorHistory_EdgeCases
=== RUN TestUptimeService_GetMonitorHistory_EdgeCases/non-existent_monitor
=== RUN TestUptimeService_GetMonitorHistory_EdgeCases/limit_parameter_respected
--- PASS: TestUptimeService_GetMonitorHistory_EdgeCases (0.05s)
--- PASS: TestUptimeService_GetMonitorHistory_EdgeCases/non-existent_monitor (0.02s)
--- PASS: TestUptimeService_GetMonitorHistory_EdgeCases/limit_parameter_respected (0.02s)
=== RUN TestUptimeService_ListMonitors_EdgeCases
=== RUN TestUptimeService_ListMonitors_EdgeCases/empty_database
=== RUN TestUptimeService_ListMonitors_EdgeCases/monitors_with_associated_proxy_hosts
--- PASS: TestUptimeService_ListMonitors_EdgeCases (0.04s)
--- PASS: TestUptimeService_ListMonitors_EdgeCases/empty_database (0.02s)
--- PASS: TestUptimeService_ListMonitors_EdgeCases/monitors_with_associated_proxy_hosts (0.02s)
=== RUN TestUptimeService_UpdateMonitor
=== RUN TestUptimeService_UpdateMonitor/update_max_retries
=== RUN TestUptimeService_UpdateMonitor/update_interval
=== RUN TestUptimeService_UpdateMonitor/update_non-existent_monitor
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:883 record not found
[0.063ms] [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.10s)
--- PASS: TestUptimeService_UpdateMonitor/update_max_retries (0.02s)
--- PASS: TestUptimeService_UpdateMonitor/update_interval (0.03s)
--- PASS: TestUptimeService_UpdateMonitor/update_non-existent_monitor (0.02s)
--- PASS: TestUptimeService_UpdateMonitor/update_multiple_fields (0.03s)
=== RUN TestUptimeService_NotificationBatching
=== RUN TestUptimeService_NotificationBatching/batches_multiple_service_failures_on_same_host
time="2025-12-12T19:02:02Z" level=info msg="Created pending notification batch" host="Test Server" monitor="Service A"
time="2025-12-12T19:02:02Z" level=info msg="Added to pending notification batch" count=2 host="Test Server" monitor="Service B"
time="2025-12-12T19:02:02Z" level=info msg="Added to pending notification batch" count=3 host="Test Server" monitor="Service C"
time="2025-12-12T19:02:02Z" level=info msg="Sent batched DOWN notification" count=3 host="Test Server"
=== RUN TestUptimeService_NotificationBatching/single_service_down_gets_individual_notification
time="2025-12-12T19:02:02Z" level=info msg="Created pending notification batch" host="Single Service Host" monitor="Lonely Service"
time="2025-12-12T19:02:02Z" level=info msg="Sent batched DOWN notification" count=1 host="Single Service Host"
--- PASS: TestUptimeService_NotificationBatching (0.07s)
--- PASS: TestUptimeService_NotificationBatching/batches_multiple_service_failures_on_same_host (0.05s)
--- PASS: TestUptimeService_NotificationBatching/single_service_down_gets_individual_notification (0.03s)
=== RUN TestUptimeService_HostLevelCheck
=== RUN TestUptimeService_HostLevelCheck/creates_uptime_host_during_sync
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.057ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.027ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.50" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.50 host_id=c0ba9030-593f-4b3d-8af1-628f6aa9bc10
=== RUN TestUptimeService_HostLevelCheck/groups_multiple_services_on_same_host
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.051ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.029ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.100" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.100 host_id=8d650e75-5645-4b65-8384-741dae225532
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.049ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 2 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.051ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 3 ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestUptimeService_HostLevelCheck (0.07s)
--- PASS: TestUptimeService_HostLevelCheck/creates_uptime_host_during_sync (0.04s)
--- PASS: TestUptimeService_HostLevelCheck/groups_multiple_services_on_same_host (0.03s)
=== RUN TestFormatDuration
--- PASS: TestFormatDuration (0.00s)
=== RUN TestUptimeService_SyncMonitorForHost
=== RUN TestUptimeService_SyncMonitorForHost/updates_monitor_when_proxy_host_is_edited
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.046ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.038ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.1" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.1 host_id=5d4ca013-a842-4931-a222-4c3100bcac14
=== RUN TestUptimeService_SyncMonitorForHost/returns_nil_when_no_monitor_exists
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:828 record not found
[0.063ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
=== RUN TestUptimeService_SyncMonitorForHost/returns_error_when_host_does_not_exist
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:823 record not found
[0.049ms] [rows:0] SELECT * FROM `proxy_hosts` WHERE `proxy_hosts`.`id` = 99999 ORDER BY `proxy_hosts`.`id` LIMIT 1
=== RUN TestUptimeService_SyncMonitorForHost/uses_domain_name_when_proxy_host_name_is_empty
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.065ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.036ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.4" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.4 host_id=a4fdc308-4a6f-49d5-8594-cd0d876ce24a
=== RUN TestUptimeService_SyncMonitorForHost/handles_multiple_domains_correctly
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:111 record not found
[0.085ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service.go:285 record not found
[0.056ms] [rows:0] SELECT * FROM `uptime_hosts` WHERE host = "10.0.0.5" ORDER BY `uptime_hosts`.`id` LIMIT 1
time="2025-12-12T19:02:02Z" level=info msg="Created UptimeHost" host=10.0.0.5 host_id=d8947473-5cde-4eff-8bc0-307e1f41065a
--- PASS: TestUptimeService_SyncMonitorForHost (0.09s)
--- PASS: TestUptimeService_SyncMonitorForHost/updates_monitor_when_proxy_host_is_edited (0.02s)
--- PASS: TestUptimeService_SyncMonitorForHost/returns_nil_when_no_monitor_exists (0.02s)
--- PASS: TestUptimeService_SyncMonitorForHost/returns_error_when_host_does_not_exist (0.02s)
--- PASS: TestUptimeService_SyncMonitorForHost/uses_domain_name_when_proxy_host_name_is_empty (0.02s)
--- PASS: TestUptimeService_SyncMonitorForHost/handles_multiple_domains_correctly (0.02s)
=== RUN TestExtractPort
=== RUN TestExtractPort/http_url_default
=== RUN TestExtractPort/https_url_default
=== RUN TestExtractPort/http_with_port
=== RUN TestExtractPort/https_with_port
=== RUN TestExtractPort/host:port
=== RUN TestExtractPort/plain_host
=== RUN TestExtractPort/localhost_with_port
=== RUN TestExtractPort/ip_with_port
=== RUN TestExtractPort/ipv6_with_port
--- PASS: TestExtractPort (0.00s)
--- PASS: TestExtractPort/http_url_default (0.00s)
--- PASS: TestExtractPort/https_url_default (0.00s)
--- PASS: TestExtractPort/http_with_port (0.00s)
--- PASS: TestExtractPort/https_with_port (0.00s)
--- PASS: TestExtractPort/host:port (0.00s)
--- PASS: TestExtractPort/plain_host (0.00s)
--- PASS: TestExtractPort/localhost_with_port (0.00s)
--- PASS: TestExtractPort/ip_with_port (0.00s)
--- PASS: TestExtractPort/ipv6_with_port (0.00s)
=== RUN TestUpdateMonitorEnabled_Unit
--- PASS: TestUpdateMonitorEnabled_Unit (0.00s)
=== RUN TestDeleteMonitorDeletesHeartbeats_Unit
2025/12/12 19:02:02 /projects/Charon/backend/internal/services/uptime_service_unit_test.go:77 record not found
[0.036ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "886f58b0-813d-4754-b0d5-e98b33b00415" ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestDeleteMonitorDeletesHeartbeats_Unit (0.00s)
=== RUN TestCheckMonitor_PublicAPI
--- PASS: TestCheckMonitor_PublicAPI (7.87s)
=== RUN TestCheckMonitor_InvalidURL
--- PASS: TestCheckMonitor_InvalidURL (0.00s)
=== RUN TestCheckMonitor_TCPSuccess
--- PASS: TestCheckMonitor_TCPSuccess (0.01s)
=== RUN TestCheckMonitor_TCPFailure
--- PASS: TestCheckMonitor_TCPFailure (10.00s)
=== RUN TestCheckMonitor_UnknownType
--- PASS: TestCheckMonitor_UnknownType (0.00s)
=== RUN TestDeleteMonitor_NonExistent
2025/12/12 19:02:20 /projects/Charon/backend/internal/services/uptime_service.go:911 record not found
[0.023ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent-id" ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestDeleteMonitor_NonExistent (0.00s)
=== RUN TestUpdateMonitor_NonExistent
2025/12/12 19:02:20 /projects/Charon/backend/internal/services/uptime_service.go:883 record not found
[0.761ms] [rows:0] SELECT * FROM `uptime_monitors` WHERE id = "non-existent-id" ORDER BY `uptime_monitors`.`id` LIMIT 1
--- PASS: TestUpdateMonitor_NonExistent (0.00s)
=== CONT TestBackupService_GetAvailableSpace
=== CONT TestUptimeService_sendRecoveryNotification
=== RUN TestBackupService_GetAvailableSpace/returns_space_for_existing_directory
=== PAUSE TestBackupService_GetAvailableSpace/returns_space_for_existing_directory
=== RUN TestBackupService_GetAvailableSpace/errors_for_missing_directory
=== PAUSE TestBackupService_GetAvailableSpace/errors_for_missing_directory
=== CONT TestBackupService_GetAvailableSpace/returns_space_for_existing_directory
=== CONT TestNotificationService_TemplateCRUD
=== CONT TestBackupService_GetAvailableSpace/errors_for_missing_directory
--- PASS: TestBackupService_GetAvailableSpace (0.00s)
--- PASS: TestBackupService_GetAvailableSpace/returns_space_for_existing_directory (0.00s)
--- PASS: TestBackupService_GetAvailableSpace/errors_for_missing_directory (0.00s)
--- PASS: TestUptimeService_sendRecoveryNotification (0.00s)
--- PASS: TestNotificationService_TemplateCRUD (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/services (cached)
? github.com/Wikid82/charon/backend/internal/trace [no test files]
=== RUN TestSanitizeForLog
=== RUN TestSanitizeForLog/empty_string
=== RUN TestSanitizeForLog/clean_string
=== RUN TestSanitizeForLog/string_with_newline
=== RUN TestSanitizeForLog/string_with_carriage_return_and_newline
=== RUN TestSanitizeForLog/string_with_multiple_newlines
=== RUN TestSanitizeForLog/string_with_control_characters
=== RUN TestSanitizeForLog/string_with_DEL_character_(0x7F)
=== RUN TestSanitizeForLog/complex_string_with_mixed_control_chars
=== RUN TestSanitizeForLog/string_with_tabs_(0x09_is_control_char)
=== RUN TestSanitizeForLog/string_with_only_control_chars
--- PASS: TestSanitizeForLog (0.00s)
--- PASS: TestSanitizeForLog/empty_string (0.00s)
--- PASS: TestSanitizeForLog/clean_string (0.00s)
--- PASS: TestSanitizeForLog/string_with_newline (0.00s)
--- PASS: TestSanitizeForLog/string_with_carriage_return_and_newline (0.00s)
--- PASS: TestSanitizeForLog/string_with_multiple_newlines (0.00s)
--- PASS: TestSanitizeForLog/string_with_control_characters (0.00s)
--- PASS: TestSanitizeForLog/string_with_DEL_character_(0x7F) (0.00s)
--- PASS: TestSanitizeForLog/complex_string_with_mixed_control_chars (0.00s)
--- PASS: TestSanitizeForLog/string_with_tabs_(0x09_is_control_char) (0.00s)
--- PASS: TestSanitizeForLog/string_with_only_control_chars (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/util (cached)
=== RUN TestFull
--- PASS: TestFull (0.00s)
PASS
ok github.com/Wikid82/charon/backend/internal/version (cached)
FAIL