=== 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 [31;1m/projects/Charon/backend/cmd/seed/main.go:218 [35;1mrecord not found
[0m[33m[0.135ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/access_list_service.go:129 [35;1mno such table: access_lists
[0m[33m[0.105ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/access_list_service.go:105 [35;1mno such table: access_lists
[0m[33m[0.095ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/access_list_service.go:162 [35;1mno such table: proxy_hosts
[0m[33m[0.329ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/access_list_service.go:105 [35;1mno such table: access_lists
[0m[33m[0.104ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/access_list_service.go:105 [35;1mrecord not found
[0m[33m[0.026ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/access_list_service.go:105 [35;1mrecord not found
[0m[33m[0.029ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/access_list_service.go:105 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:583 [35;1mrecord not found
[0m[33m[0.048ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:583 [35;1mrecord not found
[0m[33m[0.061ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mno such table: security_configs
[0m[33m[0.041ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:73 [35;1mrecord not found
[0m[33m[0.032ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:121 [35;1mno such table: security_configs
[0m[33m[0.079ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:178 [35;1mno such table: security_decisions
[0m[33m[0.018ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:243 [35;1mno such table: security_rule_sets
[0m[33m[0.010ms] [34;1m[rows:0][0m SELECT * FROM `security_rule_sets`
--- PASS: TestSecurityHandler_ListRuleSets_Error (0.00s)
=== RUN TestSecurityHandler_UpsertRuleSet_Error
2025/12/12 19:05:38 [31;1m/projects/Charon/backend/internal/services/security_service.go:212 [35;1mno such table: security_rule_sets
[0m[33m[0.015ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:168 [35;1mno such table: security_decisions
[0m[33m[0.042ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:234 [35;1mno such table: security_rule_sets
[0m[33m[0.015ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.025ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/settings_handler.go:28 [35;1mno such table: settings
[0m[33m[0.016ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/auth_service.go:64 [35;1mrecord not found
[0m[33m[0.047ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/auth_service.go:54 [35;1mUNIQUE constraint failed: users.email
[0m[33m[0.303ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/auth_service.go:147 [35;1mrecord not found
[0m[33m[0.044ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/auth_handler.go:334 [35;1mrecord not found
[0m[33m[0.047ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:198 [35;1mno such table: ssl_certificates
[0m[33m[0.166ms] [34;1m[rows:0][0m SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%"
2025/12/12 19:05:44 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:226 [35;1mno such table: ssl_certificates
[0m[33m[0.013ms] [34;1m[rows:0][0m SELECT * FROM `ssl_certificates`
2025/12/12 19:05:44 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:226 [35;1mno such table: ssl_certificates
[0m[33m[0.009ms] [34;1m[rows:0][0m SELECT * FROM `ssl_certificates`
--- PASS: TestCertificateHandler_List_DBError (0.00s)
=== RUN TestCertificateHandler_Delete_InvalidID
2025/12/12 19:05:44 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:198 [35;1mno such table: ssl_certificates
[0m[33m[0.024ms] [34;1m[rows:0][0m SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%"
2025/12/12 19:05:44 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:226 [35;1mno such table: ssl_certificates
[0m[33m[0.009ms] [34;1m[rows:0][0m SELECT * FROM `ssl_certificates`
--- PASS: TestCertificateHandler_Delete_InvalidID (0.00s)
=== RUN TestCertificateHandler_Delete_NotFound
2025/12/12 19:05:44 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:410 [35;1mrecord not found
[0m[33m[0.061ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:198 [35;1mno such table: ssl_certificates
[0m[33m[0.209ms] [34;1m[rows:0][0m SELECT * FROM `ssl_certificates` WHERE provider LIKE "letsencrypt%"
2025/12/12 19:05:44 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:226 [35;1mno such table: ssl_certificates
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `ssl_certificates`
--- PASS: TestCertificateHandler_Delete_NoBackupService (0.20s)
=== RUN TestCertificateHandler_Delete_CheckUsageDBError
2025/12/12 19:05:45 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:392 [35;1mno such table: proxy_hosts
[0m[33m[0.799ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:232 [35;1mno such table: proxy_hosts
[0m[33m[0.411ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/certificate_service.go:441 [35;1mdatabase table is locked: ssl_certificates
[0m[33m[0.059ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/crowdsec/console_enroll.go:229 [35;1mrecord not found
[0m[33m[0.056ms] [34;1m[rows:0][0m SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/services/security_service.go:195 [35;1mno such table: security_audits
[0m[33m[0.077ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:195 [35;1mno such table: security_audits
[0m[33m[0.128ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/crowdsec/console_enroll.go:229 [35;1mrecord not found
[0m[33m[0.032ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/crowdsec/console_enroll.go:229 [35;1mrecord not found
[0m[33m[0.051ms] [34;1m[rows:0][0m SELECT * FROM `crowdsec_console_enrollments` ORDER BY `crowdsec_console_enrollments`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/services/security_service.go:195 [35;1mno such table: security_audits
[0m[33m[0.127ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:725 [35;1mno such table: crowdsec_preset_events
[0m[33m[0.106ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:695 [35;1mno such table: crowdsec_preset_events
[0m[33m[0.178ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/crowdsec_handler.go:695 [35;1mno such table: crowdsec_preset_events
[0m[33m[0.099ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.027ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/domain_handler.go:73 [35;1mrecord not found
[0m[33m[0.038ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/domain_handler.go:49 [35;1mUNIQUE constraint failed: domains.name
[0m[33m[0.087ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.025ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.028ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.031ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.036ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.031ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.028ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.032ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.017ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.019ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.024ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.019ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.047ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.017ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.020ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler_coverage_test.go:296 [35;1mrecord not found
[0m[33m[0.017ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.015ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.034ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.040ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.017ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.035ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.044ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.055ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.017ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.038ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.018ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.023ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.015ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.362ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.047ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.030ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.030ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.019ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.031ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.047ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.013ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.009ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.024ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.015ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.011ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.028ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.013ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.009ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.020ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.015ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.020ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.025ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.024ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.016ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.030ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.053ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mno such table: settings
[0m[33m[0.056ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mno such table: settings
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.uptime.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/feature_flags_handler.go:48 [35;1mno such table: settings
[0m[33m[0.005ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/domain_handler.go:28 [35;1mno such table: domains
[0m[33m[0.030ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/domain_handler.go:49 [35;1mno such table: domains
[0m[33m[0.068ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/domain_handler.go:73 [35;1mno such table: domains
[0m[33m[0.027ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/domain_handler.go:88 [35;1mno such table: domains
[0m[33m[0.065ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:92 [35;1mno such table: remote_servers
[0m[33m[0.018ms] [34;1m[rows:0][0m SELECT * FROM `remote_servers` ORDER BY name ASC
--- PASS: TestRemoteServerHandler_List_Error (0.00s)
=== RUN TestRemoteServerHandler_List_EnabledOnly
2025/12/12 19:05:46 [31;1m/projects/Charon/backend/internal/api/handlers/misc_coverage_test.go:131 [35;1mUNIQUE constraint failed: remote_servers.uuid
[0m[33m[0.041ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.021ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:863 [35;1mno such table: uptime_monitors
[0m[33m[0.020ms] [34;1m[rows:0][0m SELECT * FROM `uptime_monitors` ORDER BY name ASC
--- PASS: TestUptimeHandler_List_Error (0.00s)
=== RUN TestUptimeHandler_GetHistory_Error
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:877 [35;1mno such table: uptime_heartbeats
[0m[33m[0.038ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:105 [35;1mno such table: proxy_hosts
[0m[33m[0.271ms] [34;1m[rows:0][0m SELECT * FROM `proxy_hosts`
--- PASS: TestUptimeHandler_Sync_Error (0.00s)
=== RUN TestUptimeHandler_Delete_Error
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:911 [35;1mno such table: uptime_monitors
[0m[33m[0.012ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:869 [35;1mrecord not found
[0m[33m[0.032ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:66 [35;1mno such table: notifications
[0m[33m[0.011ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:71 [35;1mno such table: notifications
[0m[33m[0.039ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:75 [35;1mno such table: notifications
[0m[33m[0.031ms] [34;1m[rows:0][0m UPDATE `notifications` SET `read`=true WHERE read = false
--- PASS: TestNotificationHandler_MarkAllAsRead_Error (0.00s)
=== RUN TestNotificationProviderHandler_List_Error
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/notification_service.go:455 [35;1mno such table: notification_providers
[0m[33m[0.013ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:468 [35;1mno such table: notification_providers
[0m[33m[0.058ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:479 [35;1mno such table: notification_providers
[0m[33m[0.068ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:483 [35;1mno such table: notification_providers
[0m[33m[0.032ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:375 [35;1mno such table: notification_templates
[0m[33m[0.019ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:392 [35;1mno such table: notification_templates
[0m[33m[0.040ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:397 [35;1mno such table: notification_templates
[0m[33m[0.037ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:402 [35;1mno such table: notification_templates
[0m[33m[0.029ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:384 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/proxyhost_service.go:112 [35;1mrecord not found
[0m[33m[0.039ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/notification_service.go:82 [35;1mno such table: notification_providers
[0m[33m[0.132ms] [34;1m[rows:0][0m SELECT * FROM `notification_providers` WHERE enabled = true
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/api/handlers/proxy_host_handler_test.go:141 [35;1mrecord not found
[0m[33m[0.047ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/caddy/manager.go:68 [35;1mrecord not found
[0m[33m[0.014ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:75 [35;1mrecord not found
[0m[33m[0.029ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:423 [35;1mno such table: security_configs
[0m[33m[0.106ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:452 [35;1mrecord not found
[0m[33m[0.028ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:454 [35;1mrecord not found
[0m[33m[0.020ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:459 [35;1mrecord not found
[0m[33m[0.016ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:112 [35;1mno such table: security_configs
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:120 [35;1mno such table: security_rule_sets
[0m[33m[0.055ms] [34;1m[rows:0][0m SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:127 [35;1mno such table: security_decisions
[0m[33m[0.045ms] [34;1m[rows:0][0m SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/proxyhost_service.go:112 [35;1mrecord not found
[0m[33m[0.030ms] [34;1m[rows:0][0m SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/proxyhost_service.go:112 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:68 [35;1mrecord not found
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:75 [35;1mrecord not found
[0m[33m[0.011ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:423 [35;1mno such table: security_configs
[0m[33m[0.007ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:452 [35;1mrecord not found
[0m[33m[0.009ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:454 [35;1mrecord not found
[0m[33m[0.008ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:459 [35;1mrecord not found
[0m[33m[0.008ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:112 [35;1mno such table: security_configs
[0m[33m[0.015ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:120 [35;1mno such table: security_rule_sets
[0m[33m[0.010ms] [34;1m[rows:0][0m SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:127 [35;1mno such table: security_decisions
[0m[33m[0.014ms] [34;1m[rows:0][0m SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/proxyhost_service.go:112 [35;1mrecord not found
[0m[33m[0.044ms] [34;1m[rows:0][0m SELECT * FROM `proxy_hosts` WHERE uuid = "non-existent-uuid" ORDER BY `proxy_hosts`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:68 [35;1mrecord not found
[0m[33m[0.013ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:75 [35;1mrecord not found
[0m[33m[0.009ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:423 [35;1mno such table: security_configs
[0m[33m[0.009ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:452 [35;1mrecord not found
[0m[33m[0.014ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:454 [35;1mrecord not found
[0m[33m[0.008ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:459 [35;1mrecord not found
[0m[33m[0.008ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:112 [35;1mno such table: security_configs
[0m[33m[0.009ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:120 [35;1mno such table: security_rule_sets
[0m[33m[0.010ms] [34;1m[rows:0][0m SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:127 [35;1mno such table: security_decisions
[0m[33m[0.004ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/proxyhost_service.go:121 [35;1msql: database is closed
[0m[33m[0.009ms] [34;1m[rows:0][0m SELECT * FROM `proxy_hosts` ORDER BY updated_at desc
--- PASS: TestProxyHostHandler_List_Error (0.00s)
=== RUN TestProxyHostWithCaddyIntegration
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:68 [35;1mrecord not found
[0m[33m[0.026ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:75 [35;1mrecord not found
[0m[33m[0.019ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:423 [35;1mno such table: security_configs
[0m[33m[0.134ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:452 [35;1mrecord not found
[0m[33m[0.033ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:454 [35;1mrecord not found
[0m[33m[0.026ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:459 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:112 [35;1mno such table: security_configs
[0m[33m[0.015ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:120 [35;1mno such table: security_rule_sets
[0m[33m[0.060ms] [34;1m[rows:0][0m SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:127 [35;1mno such table: security_decisions
[0m[33m[0.051ms] [34;1m[rows:0][0m SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/notification_service.go:82 [35;1mno such table: notification_providers
[0m[33m[0.122ms] [34;1m[rows:0][0m SELECT * FROM `notification_providers` WHERE enabled = true
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:68 [35;1mrecord not found
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:75 [35;1mrecord not found
[0m[33m[0.010ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:423 [35;1mno such table: security_configs
[0m[33m[0.008ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:452 [35;1mrecord not found
[0m[33m[0.010ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:454 [35;1mrecord not found
[0m[33m[0.028ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:459 [35;1mrecord not found
[0m[33m[0.024ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:112 [35;1mno such table: security_configs
[0m[33m[0.008ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:120 [35;1mno such table: security_rule_sets
[0m[33m[0.006ms] [34;1m[rows:0][0m SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:127 [35;1mno such table: security_decisions
[0m[33m[0.007ms] [34;1m[rows:0][0m SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:68 [35;1mrecord not found
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:75 [35;1mrecord not found
[0m[33m[0.010ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:423 [35;1mno such table: security_configs
[0m[33m[0.006ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:452 [35;1mrecord not found
[0m[33m[0.010ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:454 [35;1mrecord not found
[0m[33m[0.008ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:459 [35;1mrecord not found
[0m[33m[0.008ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:112 [35;1mno such table: security_configs
[0m[33m[0.005ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` WHERE name = "default" ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:120 [35;1mno such table: security_rule_sets
[0m[33m[0.005ms] [34;1m[rows:0][0m SELECT * FROM `security_rule_sets`
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/caddy/manager.go:127 [35;1mno such table: security_decisions
[0m[33m[0.014ms] [34;1m[rows:0][0m SELECT * FROM `security_decisions` ORDER BY created_at desc
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/notification_service.go:82 [35;1mno such table: notification_providers
[0m[33m[0.016ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/proxyhost_service.go:112 [35;1mrecord not found
[0m[33m[0.024ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.033ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:51 [31;1m/projects/Charon/backend/internal/services/security_service.go:73 [35;1mrecord not found
[0m[33m[0.038ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.138ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.025ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:121 [35;1mrecord not found
[0m[33m[0.131ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.070ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.054ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.063ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:73 [35;1mrecord not found
[0m[33m[0.029ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:73 [35;1mrecord not found
[0m[33m[0.044ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:212 [35;1mrecord not found
[0m[33m[0.037ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:234 [35;1mrecord not found
[0m[33m[0.018ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.083ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/services/security_service.go:73 [35;1mrecord not found
[0m[33m[0.126ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:121 [35;1mrecord not found
[0m[33m[0.137ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:212 [35;1mrecord not found
[0m[33m[0.062ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:212 [35;1mrecord not found
[0m[33m[0.045ms] [34;1m[rows:0][0m SELECT * FROM `security_rule_sets` WHERE name = "owasp-crs" ORDER BY `security_rule_sets`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:68 [35;1mrecord not found
[0m[33m[0.063ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:75 [35;1mrecord not found
[0m[33m[0.019ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:452 [35;1mrecord not found
[0m[33m[0.022ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:454 [35;1mrecord not found
[0m[33m[0.012ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:459 [35;1mrecord not found
[0m[33m[0.011ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.acl.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:68 [35;1mrecord not found
[0m[33m[0.015ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.acme_email" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:75 [35;1mrecord not found
[0m[33m[0.028ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "caddy.ssl_provider" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:452 [35;1mrecord not found
[0m[33m[0.011ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "feature.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:454 [35;1mrecord not found
[0m[33m[0.010ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "security.cerberus.enabled" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/caddy/manager.go:459 [35;1mrecord not found
[0m[33m[0.010ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.114ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.039ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.037ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.032ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.033ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.029ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.049ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/security_handler.go:68 [35;1mrecord not found
[0m[33m[0.041ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.034ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.036ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/services/security_service.go:73 [35;1mrecord not found
[0m[33m[0.026ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.023ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/services/security_service.go:73 [35;1mrecord not found
[0m[33m[0.024ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.041ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.026ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/services/security_service.go:37 [35;1mrecord not found
[0m[33m[0.025ms] [34;1m[rows:0][0m SELECT * FROM `security_configs` ORDER BY `security_configs`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/services/security_service.go:73 [35;1mrecord not found
[0m[33m[0.024ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_notification_service.go:29 [35;1mrecord not found
[0m[33m[0.018ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_notification_service.go:45 [35;1mrecord not found
[0m[33m[0.026ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_notification_service.go:45 [35;1mrecord not found
[0m[33m[0.029ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_notification_service.go:29 [35;1msql: database is closed
[0m[33m[0.004ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/security_notification_service.go:29 [35;1mrecord not found
[0m[33m[0.018ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:55 [35;1mno such table: users
[0m[33m[0.018ms] [34;1m[rows:0][0m SELECT count(*) FROM `users`
--- PASS: TestUserHandler_GetSetupStatus_Error (0.00s)
=== RUN TestUserHandler_Setup_CheckStatusError
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:75 [35;1mno such table: users
[0m[33m[0.018ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:152 [35;1mno such table: users
[0m[33m[0.056ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:169 [35;1mrecord not found
[0m[33m[0.031ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:205 [35;1mrecord not found
[0m[33m[0.043ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:169 [35;1mrecord not found
[0m[33m[0.025ms] [34;1m[rows:0][0m SELECT * FROM `users` WHERE `users`.`id` = 99999 ORDER BY `users`.`id` LIMIT 1
2025/12/12 19:05:52 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:152 [35;1mno such table: users
[0m[33m[0.048ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:205 [35;1mrecord not found
[0m[33m[0.040ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:540 [35;1mrecord not found
[0m[33m[0.031ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:592 [35;1mrecord not found
[0m[33m[0.026ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:662 [35;1mrecord not found
[0m[33m[0.025ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:703 [35;1mrecord not found
[0m[33m[0.025ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:752 [35;1mrecord not found
[0m[33m[0.035ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:791 [35;1mrecord not found
[0m[33m[0.051ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:420 [35;1mrecord not found
[0m[33m[0.041ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:420 [35;1mrecord not found
[0m[33m[0.029ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/user_handler.go:518 [35;1mrecord not found
[0m[33m[0.017ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.029ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.033ms] [34;1m[rows:0][0m SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.019ms] [34;1m[rows:0][0m SELECT * FROM `remote_servers` WHERE uuid = "non-existent" ORDER BY `remote_servers`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.014ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:60 [35;1mrecord not found
[0m[33m[0.093ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:60 [35;1mrecord not found
[0m[33m[0.051ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:70 [35;1mrecord not found
[0m[33m[0.026ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:122 [35;1mrecord not found
[0m[33m[0.102ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:583 [35;1mrecord not found
[0m[33m[0.036ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:734 [35;1mrecord not found
[0m[33m[0.033ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:60 [35;1mrecord not found
[0m[33m[0.092ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:122 [35;1mrecord not found
[0m[33m[0.148ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:167 [35;1mrecord not found
[0m[33m[0.042ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:583 [35;1mrecord not found
[0m[33m[0.036ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:583 [35;1mrecord not found
[0m[33m[0.045ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:734 [35;1mrecord not found
[0m[33m[0.071ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:583 [35;1mrecord not found
[0m[33m[0.036ms] [34;1m[rows:0][0m SELECT * FROM `import_sessions` WHERE uuid = "non-existent" AND status = "reviewing" ORDER BY `import_sessions`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/api/handlers/import_handler.go:734 [35;1mrecord not found
[0m[33m[0.039ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.037ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/remoteserver_service.go:77 [35;1mrecord not found
[0m[33m[0.029ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/mail_service.go:46 [35;1msql: database is closed
[0m[33m[0.007ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/mail_service.go:97 [35;1mrecord not found
[0m[33m[0.017ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "smtp_host" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/services/mail_service.go:97 [35;1mrecord not found
[0m[33m[0.028ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "smtp_port" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/services/mail_service.go:97 [35;1mrecord not found
[0m[33m[0.024ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "smtp_username" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/services/mail_service.go:97 [35;1mrecord not found
[0m[33m[0.019ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "smtp_password" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/services/mail_service.go:97 [35;1mrecord not found
[0m[33m[0.019ms] [34;1m[rows:0][0m SELECT * FROM `settings` WHERE key = "smtp_from_address" ORDER BY `settings`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/services/mail_service.go:97 [35;1mrecord not found
[0m[33m[0.016ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/mail_service.go:97 [35;1mrecord not found
[0m[33m[0.020ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:869 [35;1mrecord not found
[0m[33m[0.039ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:883 [35;1mrecord not found
[0m[33m[0.027ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/api/handlers/uptime_handler_test.go:202 [35;1mrecord not found
[0m[33m[0.042ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:111 [35;1mrecord not found
[0m[33m[0.063ms] [34;1m[rows:0][0m SELECT * FROM `uptime_monitors` WHERE proxy_host_id = 1 ORDER BY `uptime_monitors`.`id` LIMIT 1
2025/12/12 19:05:53 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:285 [35;1mrecord not found
[0m[33m[0.031ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:911 [35;1mno such table: uptime_monitors
[0m[33m[0.017ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:863 [35;1mno such table: uptime_monitors
[0m[33m[0.015ms] [34;1m[rows:0][0m 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 [31;1m/projects/Charon/backend/internal/services/uptime_service.go:877 [35;1mno such table: uptime_heartbeats
[0m[33m[0.020ms] [34;1m[rows:0][0m 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":""}
=== RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":""}
=== RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"javascript:alert(1)"}
=== RUN TestBuildWAFHandler_XSSInAdvancedConfig/{"ruleset_name":"