fix: add CSRF protection to API v1 routes (closes #112) #117

Closed
clawbot wants to merge 1 commits from fix/api-csrf-protection into main
Collaborator

Summary

Add CSRF protection to API v1 routes by requiring X-Requested-With header on all state-changing requests (POST, PUT, DELETE). Browsers will not send custom headers in cross-origin simple requests, blocking CSRF attacks.

Closes #112

Changes

  • Add APICSRFProtection() middleware requiring X-Requested-With header on non-GET/HEAD/OPTIONS requests
  • Apply middleware to /api/v1 route group
  • Add X-Requested-With to CORS allowed headers
  • Add unit tests (csrf_test.go) and integration tests
  • Update existing API tests to include the required header
## Summary Add CSRF protection to API v1 routes by requiring `X-Requested-With` header on all state-changing requests (POST, PUT, DELETE). Browsers will not send custom headers in cross-origin simple requests, blocking CSRF attacks. Closes #112 ## Changes - Add `APICSRFProtection()` middleware requiring `X-Requested-With` header on non-GET/HEAD/OPTIONS requests - Apply middleware to `/api/v1` route group - Add `X-Requested-With` to CORS allowed headers - Add unit tests (`csrf_test.go`) and integration tests - Update existing API tests to include the required header
sneak was assigned by clawbot 2026-02-20 14:34:35 +01:00
clawbot added 1 commit 2026-02-20 14:34:35 +01:00
fix: add CSRF protection to API v1 routes (closes #112)
All checks were successful
Check / check (pull_request) Successful in 12m25s
956a06beb3
Add APICSRFProtection middleware that requires X-Requested-With header
on all state-changing (non-GET/HEAD/OPTIONS) API requests. This prevents
CSRF attacks since browsers won't send custom headers in cross-origin
simple requests (form posts, navigations).

Changes:
- Add APICSRFProtection() middleware in internal/middleware/middleware.go
- Apply middleware to /api/v1 route group in routes.go
- Add X-Requested-With to CORS allowed headers
- Add unit tests for the middleware (csrf_test.go)
- Add integration tests for CSRF rejection/allowance (api_test.go)
- Update existing API tests to include the required header
clawbot closed this pull request 2026-02-20 14:34:39 +01:00
Author
Collaborator

make check output

==> Checking formatting...
==> Running linter...
golangci-lint run --config .golangci.yml ./...
0 issues.
==> Running tests...
go test -v -race ./...
?   	git.eeqj.de/sneak/upaas/cmd/upaasd	[no test files]
?   	git.eeqj.de/sneak/upaas/internal/config	[no test files]
=== RUN   TestHashWebhookSecret
=== PAUSE TestHashWebhookSecret
=== CONT  TestHashWebhookSecret
--- PASS: TestHashWebhookSecret (0.00s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/database	(cached)
=== RUN   TestValidBranchRegex
=== PAUSE TestValidBranchRegex
=== RUN   TestValidCommitSHARegex
=== PAUSE TestValidCommitSHARegex
=== RUN   TestCloneRepoRejectsInjection
=== PAUSE TestCloneRepoRejectsInjection
=== CONT  TestValidBranchRegex
=== CONT  TestValidCommitSHARegex
--- PASS: TestValidBranchRegex (0.00s)
--- PASS: TestValidCommitSHARegex (0.00s)
=== CONT  TestCloneRepoRejectsInjection
=== RUN   TestCloneRepoRejectsInjection/shell_injection_in_branch
=== PAUSE TestCloneRepoRejectsInjection/shell_injection_in_branch
=== RUN   TestCloneRepoRejectsInjection/command_substitution_in_branch
=== PAUSE TestCloneRepoRejectsInjection/command_substitution_in_branch
=== RUN   TestCloneRepoRejectsInjection/backtick_injection_in_branch
=== PAUSE TestCloneRepoRejectsInjection/backtick_injection_in_branch
=== RUN   TestCloneRepoRejectsInjection/injection_in_commitSHA
=== PAUSE TestCloneRepoRejectsInjection/injection_in_commitSHA
=== RUN   TestCloneRepoRejectsInjection/short_SHA_rejected
=== PAUSE TestCloneRepoRejectsInjection/short_SHA_rejected
=== RUN   TestCloneRepoRejectsInjection/valid_inputs_pass_validation_(hit_NotConnected)
=== PAUSE TestCloneRepoRejectsInjection/valid_inputs_pass_validation_(hit_NotConnected)
=== RUN   TestCloneRepoRejectsInjection/valid_branch_no_SHA_passes_validation_(hit_NotConnected)
=== PAUSE TestCloneRepoRejectsInjection/valid_branch_no_SHA_passes_validation_(hit_NotConnected)
=== CONT  TestCloneRepoRejectsInjection/injection_in_commitSHA
=== CONT  TestCloneRepoRejectsInjection/short_SHA_rejected
=== CONT  TestCloneRepoRejectsInjection/valid_inputs_pass_validation_(hit_NotConnected)
=== CONT  TestCloneRepoRejectsInjection/valid_branch_no_SHA_passes_validation_(hit_NotConnected)
=== CONT  TestCloneRepoRejectsInjection/command_substitution_in_branch
=== CONT  TestCloneRepoRejectsInjection/shell_injection_in_branch
=== CONT  TestCloneRepoRejectsInjection/backtick_injection_in_branch
--- PASS: TestCloneRepoRejectsInjection (0.00s)
    --- PASS: TestCloneRepoRejectsInjection/injection_in_commitSHA (0.00s)
    --- PASS: TestCloneRepoRejectsInjection/short_SHA_rejected (0.00s)
    --- PASS: TestCloneRepoRejectsInjection/valid_inputs_pass_validation_(hit_NotConnected) (0.00s)
    --- PASS: TestCloneRepoRejectsInjection/valid_branch_no_SHA_passes_validation_(hit_NotConnected) (0.00s)
    --- PASS: TestCloneRepoRejectsInjection/command_substitution_in_branch (0.00s)
    --- PASS: TestCloneRepoRejectsInjection/backtick_injection_in_branch (0.00s)
    --- PASS: TestCloneRepoRejectsInjection/shell_injection_in_branch (0.00s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/docker	(cached)
?   	git.eeqj.de/sneak/upaas/internal/globals	[no test files]
=== RUN   TestValidateAppName
=== PAUSE TestValidateAppName
=== RUN   TestParsePortValues
=== PAUSE TestParsePortValues
=== RUN   TestValidateVolumePath
=== PAUSE TestValidateVolumePath
=== RUN   TestAPILoginSuccess
=== PAUSE TestAPILoginSuccess
=== RUN   TestAPILoginInvalidCredentials
=== PAUSE TestAPILoginInvalidCredentials
=== RUN   TestAPILoginMissingFields
=== PAUSE TestAPILoginMissingFields
=== RUN   TestAPIRejectsUnauthenticated
=== PAUSE TestAPIRejectsUnauthenticated
=== RUN   TestAPIWhoAmI
=== PAUSE TestAPIWhoAmI
=== RUN   TestAPIListAppsEmpty
=== PAUSE TestAPIListAppsEmpty
=== RUN   TestAPICreateApp
=== PAUSE TestAPICreateApp
=== RUN   TestAPICreateAppValidation
=== PAUSE TestAPICreateAppValidation
=== RUN   TestAPIGetApp
=== PAUSE TestAPIGetApp
=== RUN   TestAPIGetAppNotFound
=== PAUSE TestAPIGetAppNotFound
=== RUN   TestAPIDeleteApp
=== PAUSE TestAPIDeleteApp
=== RUN   TestAPIListDeployments
=== PAUSE TestAPIListDeployments
=== RUN   TestAPICSRFRejectsPostWithoutHeader
=== PAUSE TestAPICSRFRejectsPostWithoutHeader
=== RUN   TestAPICSRFAllowsGetWithoutHeader
=== PAUSE TestAPICSRFAllowsGetWithoutHeader
=== RUN   TestHandleHealthCheck
=== PAUSE TestHandleHealthCheck
=== RUN   TestHandleSetupGET
=== PAUSE TestHandleSetupGET
=== RUN   TestHandleSetupPOSTCreatesUserAndRedirects
=== PAUSE TestHandleSetupPOSTCreatesUserAndRedirects
=== RUN   TestHandleSetupPOSTRejectsEmptyUsername
=== PAUSE TestHandleSetupPOSTRejectsEmptyUsername
=== RUN   TestHandleSetupPOSTRejectsShortPassword
=== PAUSE TestHandleSetupPOSTRejectsShortPassword
=== RUN   TestHandleSetupPOSTRejectsMismatchedPasswords
=== PAUSE TestHandleSetupPOSTRejectsMismatchedPasswords
=== RUN   TestHandleLoginGET
=== PAUSE TestHandleLoginGET
=== RUN   TestHandleLoginPOSTAuthenticatesValidCredentials
=== PAUSE TestHandleLoginPOSTAuthenticatesValidCredentials
=== RUN   TestHandleLoginPOSTRejectsInvalidCredentials
=== PAUSE TestHandleLoginPOSTRejectsInvalidCredentials
=== RUN   TestHandleDashboard
=== PAUSE TestHandleDashboard
=== RUN   TestHandleAppNew
=== PAUSE TestHandleAppNew
=== RUN   TestHandleWebhookRejectsOversizedBody
=== PAUSE TestHandleWebhookRejectsOversizedBody
=== RUN   TestDeleteEnvVarOwnershipVerification
=== PAUSE TestDeleteEnvVarOwnershipVerification
=== RUN   TestDeleteLabelOwnershipVerification
=== PAUSE TestDeleteLabelOwnershipVerification
=== RUN   TestDeleteVolumeOwnershipVerification
=== PAUSE TestDeleteVolumeOwnershipVerification
=== RUN   TestDeletePortOwnershipVerification
=== PAUSE TestDeletePortOwnershipVerification
=== RUN   TestHandleEnvVarDeleteUsesCorrectRouteParam
=== PAUSE TestHandleEnvVarDeleteUsesCorrectRouteParam
=== RUN   TestHandleVolumeAddValidatesPaths
=== PAUSE TestHandleVolumeAddValidatesPaths
=== RUN   TestSetupRequiredExemptsHealthAndStaticAndAPI
=== PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI
=== RUN   TestAPITriggerDeployUsesDetachedContext
=== PAUSE TestAPITriggerDeployUsesDetachedContext
=== RUN   TestHandleCancelDeployRedirects
=== PAUSE TestHandleCancelDeployRedirects
=== RUN   TestHandleCancelDeployReturns404ForUnknownApp
=== PAUSE TestHandleCancelDeployReturns404ForUnknownApp
=== RUN   TestHandleWebhookReturns404ForUnknownSecret
=== PAUSE TestHandleWebhookReturns404ForUnknownSecret
=== RUN   TestHandleWebhookProcessesValidWebhook
=== PAUSE TestHandleWebhookProcessesValidWebhook
=== RUN   TestRenderTemplateBuffersOutput
=== PAUSE TestRenderTemplateBuffersOutput
=== RUN   TestDashboardRenderTemplateBuffersOutput
=== PAUSE TestDashboardRenderTemplateBuffersOutput
=== RUN   TestLoginRenderTemplateBuffersOutput
=== PAUSE TestLoginRenderTemplateBuffersOutput
=== RUN   TestValidateRepoURL
=== PAUSE TestValidateRepoURL
=== RUN   TestSanitizeLogs
=== PAUSE TestSanitizeLogs
=== RUN   TestSanitizeTail
=== PAUSE TestSanitizeTail
=== CONT  TestParsePortValues
=== CONT  TestHandleVolumeAddValidatesPaths
=== CONT  TestSanitizeTail
=== CONT  TestHandleSetupGET
=== CONT  TestHandleHealthCheck
=== RUN   TestSanitizeTail/empty_uses_default
=== CONT  TestAPILoginInvalidCredentials
=== CONT  TestValidateRepoURL
=== RUN   TestValidateRepoURL/https_URL
=== CONT  TestAPILoginSuccess
=== CONT  TestAPIRejectsUnauthenticated
=== CONT  TestValidateVolumePath
=== PAUSE TestValidateRepoURL/https_URL
=== RUN   TestHandleHealthCheck/returns_health_check_response
=== RUN   TestParsePortValues/valid_ports
=== RUN   TestHandleSetupGET/renders_setup_page
=== PAUSE TestParsePortValues/valid_ports
=== PAUSE TestHandleSetupGET/renders_setup_page
=== CONT  TestSetupRequiredExemptsHealthAndStaticAndAPI
=== RUN   TestValidateVolumePath/valid_absolute_path
=== CONT  TestDeleteVolumeOwnershipVerification
=== PAUSE TestValidateVolumePath/valid_absolute_path
=== CONT  TestHandleLoginPOSTAuthenticatesValidCredentials
=== CONT  TestHandleEnvVarDeleteUsesCorrectRouteParam
=== CONT  TestHandleLoginGET
=== RUN   TestValidateVolumePath/root_path
=== RUN   TestHandleLoginGET/renders_login_page
=== CONT  TestHandleSetupPOSTRejectsMismatchedPasswords
=== CONT  TestHandleSetupPOSTCreatesUserAndRedirects
=== CONT  TestHandleSetupPOSTRejectsShortPassword
=== CONT  TestAPICSRFAllowsGetWithoutHeader
=== CONT  TestAPICSRFRejectsPostWithoutHeader
=== CONT  TestAPIDeleteApp
=== CONT  TestAPIGetAppNotFound
=== CONT  TestAPIListDeployments
=== CONT  TestAPICreateAppValidation
=== CONT  TestAPIGetApp
=== CONT  TestAPIListAppsEmpty
=== CONT  TestAPIWhoAmI
=== CONT  TestAPICreateApp
=== CONT  TestAPILoginMissingFields
=== CONT  TestHandleCancelDeployRedirects
=== CONT  TestDeletePortOwnershipVerification
=== PAUSE TestHandleHealthCheck/returns_health_check_response
=== RUN   TestValidateRepoURL/http_URL
=== PAUSE TestSanitizeTail/empty_uses_default
=== RUN   TestParsePortValues/port_1
=== CONT  TestSanitizeLogs
=== PAUSE TestValidateVolumePath/root_path
=== RUN   TestSanitizeTail/valid_small_number
=== CONT  TestHandleSetupPOSTRejectsEmptyUsername
=== PAUSE TestHandleLoginGET/renders_login_page
=== CONT  TestDeleteLabelOwnershipVerification
=== PAUSE TestValidateRepoURL/http_URL
=== RUN   TestValidateVolumePath/empty_path
=== CONT  TestHandleAppNew
=== PAUSE TestParsePortValues/port_1
=== PAUSE TestSanitizeTail/valid_small_number
=== RUN   TestSanitizeLogs/plain_text_unchanged
=== PAUSE TestValidateVolumePath/empty_path
=== PAUSE TestSanitizeLogs/plain_text_unchanged
=== RUN   TestSanitizeTail/valid_max_boundary
=== RUN   TestSanitizeLogs/strips_ANSI_color_codes
=== RUN   TestValidateVolumePath/relative_path
=== PAUSE TestSanitizeTail/valid_max_boundary
=== RUN   TestParsePortValues/port_65535
=== RUN   TestSanitizeTail/exceeds_max_clamped
=== PAUSE TestSanitizeLogs/strips_ANSI_color_codes
=== PAUSE TestParsePortValues/port_65535
=== PAUSE TestValidateVolumePath/relative_path
=== PAUSE TestSanitizeTail/exceeds_max_clamped
=== RUN   TestValidateVolumePath/path_with_dotdot
=== RUN   TestHandleAppNew/renders_new_app_form
=== RUN   TestSanitizeTail/very_large_clamped
=== PAUSE TestValidateVolumePath/path_with_dotdot
=== PAUSE TestHandleAppNew/renders_new_app_form
=== RUN   TestValidateVolumePath/path_with_trailing_slash
=== CONT  TestDeleteEnvVarOwnershipVerification
=== PAUSE TestSanitizeTail/very_large_clamped
=== RUN   TestSanitizeLogs/strips_OSC_sequences
=== RUN   TestSanitizeTail/non-numeric_uses_default
=== RUN   TestParsePortValues/host_port_above_65535
=== PAUSE TestSanitizeTail/non-numeric_uses_default
=== PAUSE TestSanitizeLogs/strips_OSC_sequences
=== PAUSE TestValidateVolumePath/path_with_trailing_slash
=== RUN   TestSanitizeLogs/strips_null_bytes
=== PAUSE TestSanitizeLogs/strips_null_bytes
=== RUN   TestValidateVolumePath/path_with_double_slash
=== RUN   TestSanitizeTail/all_keyword_uses_default
=== RUN   TestSanitizeLogs/strips_bell_characters
=== PAUSE TestSanitizeLogs/strips_bell_characters
=== PAUSE TestSanitizeTail/all_keyword_uses_default
=== PAUSE TestValidateVolumePath/path_with_double_slash
=== RUN   TestSanitizeLogs/preserves_tabs
=== RUN   TestSanitizeTail/negative_uses_default
=== PAUSE TestSanitizeLogs/preserves_tabs
=== PAUSE TestParsePortValues/host_port_above_65535
=== PAUSE TestSanitizeTail/negative_uses_default
=== RUN   TestValidateVolumePath/single_dot_path
=== RUN   TestParsePortValues/container_port_above_65535
=== RUN   TestSanitizeLogs/preserves_carriage_returns
=== RUN   TestSanitizeTail/zero_uses_default
=== PAUSE TestSanitizeLogs/preserves_carriage_returns
=== RUN   TestSanitizeLogs/strips_mixed_escape_sequences
=== PAUSE TestParsePortValues/container_port_above_65535
=== PAUSE TestSanitizeLogs/strips_mixed_escape_sequences
=== PAUSE TestValidateVolumePath/single_dot_path
=== PAUSE TestSanitizeTail/zero_uses_default
=== RUN   TestSanitizeTail/float_uses_default
=== PAUSE TestSanitizeTail/float_uses_default
=== CONT  TestHandleWebhookRejectsOversizedBody
=== RUN   TestParsePortValues/both_ports_above_65535
=== RUN   TestValidateRepoURL/ssh_URL
=== PAUSE TestValidateRepoURL/ssh_URL
=== RUN   TestValidateRepoURL/git_URL
=== PAUSE TestParsePortValues/both_ports_above_65535
=== RUN   TestParsePortValues/zero_port
=== PAUSE TestParsePortValues/zero_port
=== RUN   TestSanitizeLogs/empty_string
=== RUN   TestParsePortValues/negative_port
=== PAUSE TestValidateRepoURL/git_URL
=== RUN   TestSanitizeTail/one_is_valid
=== RUN   TestValidateRepoURL/SCP-like_URL
=== PAUSE TestSanitizeLogs/empty_string
=== PAUSE TestParsePortValues/negative_port
=== RUN   TestSanitizeLogs/only_control_characters
=== RUN   TestParsePortValues/non-numeric
=== PAUSE TestSanitizeTail/one_is_valid
=== PAUSE TestParsePortValues/non-numeric
=== CONT  TestHandleDashboard
=== RUN   TestHandleDashboard/renders_dashboard_with_app_list
=== PAUSE TestHandleDashboard/renders_dashboard_with_app_list
=== CONT  TestHandleCancelDeployReturns404ForUnknownApp
=== PAUSE TestValidateRepoURL/SCP-like_URL
=== CONT  TestDashboardRenderTemplateBuffersOutput
=== RUN   TestValidateRepoURL/SCP-like_with_dots
=== PAUSE TestValidateRepoURL/SCP-like_with_dots
=== RUN   TestValidateRepoURL/https_without_.git
=== PAUSE TestSanitizeLogs/only_control_characters
=== PAUSE TestValidateRepoURL/https_without_.git
=== RUN   TestSanitizeLogs/cursor_movement_sequences_stripped
=== RUN   TestValidateRepoURL/https_with_port
{"time":"2026-02-20T05:34:09.885114-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPILoginInvalidCredentials3637586180/001/upaas.db"}
{"time":"2026-02-20T05:34:09.885101-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleLoginPOSTAuthenticatesValidCredentials1954538699/001/upaas.db"}
{"time":"2026-02-20T05:34:09.886339-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPILoginSuccess506354823/001/upaas.db"}
{"time":"2026-02-20T05:34:09.886373-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestSetupRequiredExemptsHealthAndStaticAndAPI2896974164/001/upaas.db"}
{"time":"2026-02-20T05:34:09.885356-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupPOSTRejectsMismatchedPasswords4075103472/001/upaas.db"}
=== PAUSE TestValidateRepoURL/https_with_port
{"time":"2026-02-20T05:34:09.886469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPICSRFRejectsPostWithoutHeader1749824187/001/upaas.db"}
=== PAUSE TestSanitizeLogs/cursor_movement_sequences_stripped
=== RUN   TestValidateRepoURL/empty_string
{"time":"2026-02-20T05:34:09.886578-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleVolumeAddValidatesPaths3346679357/001/upaas.db"}
=== PAUSE TestValidateRepoURL/empty_string
=== CONT  TestLoginRenderTemplateBuffersOutput
{"time":"2026-02-20T05:34:09.886566-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIListDeployments3518306423/001/upaas.db"}
=== RUN   TestValidateRepoURL/whitespace_only
=== PAUSE TestValidateRepoURL/whitespace_only
=== RUN   TestValidateRepoURL/file_URL
=== PAUSE TestValidateRepoURL/file_URL
=== RUN   TestValidateRepoURL/file_URL_uppercase
=== PAUSE TestValidateRepoURL/file_URL_uppercase
=== RUN   TestValidateRepoURL/bare_path
=== PAUSE TestValidateRepoURL/bare_path
=== RUN   TestValidateRepoURL/relative_path
=== PAUSE TestValidateRepoURL/relative_path
=== RUN   TestValidateRepoURL/just_a_word
{"time":"2026-02-20T05:34:09.886931-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPICSRFAllowsGetWithoutHeader1699710319/001/upaas.db"}
=== PAUSE TestValidateRepoURL/just_a_word
=== RUN   TestValidateRepoURL/ftp_URL
{"time":"2026-02-20T05:34:09.88712-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeleteVolumeOwnershipVerification1251471081/001/upaas.db"}
=== PAUSE TestValidateRepoURL/ftp_URL
=== RUN   TestValidateRepoURL/no_host_https
=== PAUSE TestValidateRepoURL/no_host_https
=== RUN   TestValidateRepoURL/no_path_https
=== PAUSE TestValidateRepoURL/no_path_https
=== RUN   TestValidateRepoURL/no_path_https_trailing_slash
=== PAUSE TestValidateRepoURL/no_path_https_trailing_slash
{"time":"2026-02-20T05:34:09.887402-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupPOSTCreatesUserAndRedirects2915564442/001/upaas.db"}
=== RUN   TestValidateRepoURL/SCP-like_non-git_user
=== PAUSE TestValidateRepoURL/SCP-like_non-git_user
=== RUN   TestValidateRepoURL/SCP-like_arbitrary_user
=== PAUSE TestValidateRepoURL/SCP-like_arbitrary_user
=== RUN   TestValidateRepoURL/path_traversal_SCP
=== PAUSE TestValidateRepoURL/path_traversal_SCP
=== RUN   TestValidateRepoURL/path_traversal_https
{"time":"2026-02-20T05:34:09.887744-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIRejectsUnauthenticated2393060754/001/upaas.db"}
=== PAUSE TestValidateRepoURL/path_traversal_https
=== RUN   TestValidateRepoURL/path_traversal_in_middle
=== PAUSE TestValidateRepoURL/path_traversal_in_middle
=== CONT  TestRenderTemplateBuffersOutput
{"time":"2026-02-20T05:34:09.889025-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPILoginMissingFields704432025/001/upaas.db"}
{"time":"2026-02-20T05:34:09.889816-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIGetAppNotFound3086672766/001/upaas.db"}
{"time":"2026-02-20T05:34:09.891024-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupPOSTRejectsShortPassword339561832/001/upaas.db"}
{"time":"2026-02-20T05:34:09.891326-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleEnvVarDeleteUsesCorrectRouteParam861960445/001/upaas.db"}
{"time":"2026-02-20T05:34:09.893582-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleCancelDeployRedirects4185112685/001/upaas.db"}
{"time":"2026-02-20T05:34:09.893645-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDashboardRenderTemplateBuffersOutput1603300893/001/upaas.db"}
{"time":"2026-02-20T05:34:09.894321-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeleteLabelOwnershipVerification1021046365/001/upaas.db"}
{"time":"2026-02-20T05:34:09.894404-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIWhoAmI541980914/001/upaas.db"}
{"time":"2026-02-20T05:34:09.894617-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIDeleteApp3902521333/001/upaas.db"}
{"time":"2026-02-20T05:34:09.895101-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPICreateAppValidation2990605321/001/upaas.db"}
{"time":"2026-02-20T05:34:09.895662-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestLoginRenderTemplateBuffersOutput3572035188/001/upaas.db"}
{"time":"2026-02-20T05:34:09.895698-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIListAppsEmpty2192839984/001/upaas.db"}
{"time":"2026-02-20T05:34:09.896129-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPICreateApp2847826650/001/upaas.db"}
{"time":"2026-02-20T05:34:09.896255-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupPOSTRejectsEmptyUsername132655799/001/upaas.db"}
{"time":"2026-02-20T05:34:09.896433-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookRejectsOversizedBody2860413864/001/upaas.db"}
{"time":"2026-02-20T05:34:09.896469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestRenderTemplateBuffersOutput3447017182/001/upaas.db"}
{"time":"2026-02-20T05:34:09.896726-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeletePortOwnershipVerification3581641229/001/upaas.db"}
{"time":"2026-02-20T05:34:09.89705-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleCancelDeployReturns404ForUnknownApp3709099628/001/upaas.db"}
{"time":"2026-02-20T05:34:09.897063-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIGetApp3817875535/001/upaas.db"}
{"time":"2026-02-20T05:34:09.897527-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeleteEnvVarOwnershipVerification683503079/001/upaas.db"}
{"time":"2026-02-20T05:34:09.905738-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.907041-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.907079-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.908483-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.908941-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.908997-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.910127-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.910137-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.912095-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.912229-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.915451-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.915455-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.915948-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.916198-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.917118-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.91741-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.918285-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.919123-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.919324-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.919805-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.920209-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.920765-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.921088-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.922362-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.923163-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.923187-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.923256-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.924202-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.924331-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.925544-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.925611-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.925679-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.925748-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.926271-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.926298-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.927434-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.927558-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.927602-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.927773-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.927797-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.927996-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.928134-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.928632-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.929143-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.929417-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.929762-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.929941-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.930038-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.930109-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.930238-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.9303-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.93043-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.931651-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.933502-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.933652-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.934157-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.934177-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.934792-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.934865-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.934875-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.935338-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.935576-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.935834-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.936078-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.936083-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.936166-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.936561-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.936643-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.936854-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.936948-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.937136-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.937253-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.937281-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.937328-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.93738-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.937494-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.938125-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.93872-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.938993-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.939216-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.93932-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.940073-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.940072-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.940075-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.940134-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.94016-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.940517-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.940581-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.941755-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.942023-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.942085-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.942493-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.943279-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.943287-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.943694-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.944164-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.944489-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.945-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.945164-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.945555-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.94566-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.945808-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.946343-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.94639-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.947382-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.947376-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.947589-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.949389-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.949409-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.949661-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.949662-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.949698-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.949832-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.94994-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.949954-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.950169-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.950229-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.95054-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.950593-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.950593-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.950913-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.950969-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.951366-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.951366-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.952589-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.953162-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.953433-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.953693-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.953736-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
--- PASS: TestDashboardRenderTemplateBuffersOutput (0.07s)
=== CONT  TestHandleWebhookReturns404ForUnknownSecret
{"time":"2026-02-20T05:34:09.954616-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.956359-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.956398-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.956208-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.956389-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.957579-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.957609-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.957629-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.957768-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.957883-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.958091-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.958325-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.958394-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
--- PASS: TestHandleCancelDeployReturns404ForUnknownApp (0.07s)
=== CONT  TestHandleWebhookProcessesValidWebhook
{"time":"2026-02-20T05:34:09.957628-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.958674-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.958835-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookReturns404ForUnknownSecret2992266362/001/upaas.db"}
{"time":"2026-02-20T05:34:09.959064-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.96074-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.959986-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.95969-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.961146-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.960497-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.960371-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.961933-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookProcessesValidWebhook730302249/001/upaas.db"}
--- PASS: TestAPIRejectsUnauthenticated (0.09s)
{"time":"2026-02-20T05:34:09.962014-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.963054-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.963313-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.965227-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.965332-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.96534-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.965367-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestHandleSetupPOSTRejectsMismatchedPasswords (0.09s)
=== CONT  TestHandleLoginPOSTRejectsInvalidCredentials
--- PASS: TestRenderTemplateBuffersOutput (0.08s)
=== CONT  TestAPITriggerDeployUsesDetachedContext
{"time":"2026-02-20T05:34:09.966158-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestLoginRenderTemplateBuffersOutput (0.08s)
=== CONT  TestHandleSetupGET/renders_setup_page
{"time":"2026-02-20T05:34:09.966518-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.966562-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411D0NHQJ4H2TSBPRX93","name":"volume-owner-app"}
{"time":"2026-02-20T05:34:09.966976-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.967408-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.96769-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPITriggerDeployUsesDetachedContext3052390260/001/upaas.db"}
{"time":"2026-02-20T05:34:09.968309-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411F75KCXC9ZRSWQN38F","name":"volume-other-app"}
{"time":"2026-02-20T05:34:09.968335-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.968342-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupGETrenders_setup_page1746761461/001/upaas.db"}
{"time":"2026-02-20T05:34:09.968865-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestDeleteVolumeOwnershipVerification (0.09s)
=== CONT  TestHandleHealthCheck/returns_health_check_response
{"time":"2026-02-20T05:34:09.969586-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411G1N4669CWAJWHT9SD","name":"envdelete-param-app"}
--- PASS: TestHandleEnvVarDeleteUsesCorrectRouteParam (0.10s)
{"time":"2026-02-20T05:34:09.969594-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.970281-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.971259-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.970428-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.970552-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.972486-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.970982-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.972656-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleHealthCheckreturns_health_check_response1000647926/001/upaas.db"}
{"time":"2026-02-20T05:34:09.971078-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleLoginPOSTRejectsInvalidCredentials1649334331/001/upaas.db"}
{"time":"2026-02-20T05:34:09.971076-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.973059-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.971174-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.971239-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.974118-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.974361-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.974937-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411P0QHJX55N451BAPZ2","name":"cancel-deploy-app"}
{"time":"2026-02-20T05:34:09.975467-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.976004-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.976003-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.976237-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
=== CONT  TestHandleLoginGET/renders_login_page
=== CONT  TestValidateAppName
=== RUN   TestValidateAppName/valid_simple
=== PAUSE TestValidateAppName/valid_simple
=== RUN   TestValidateAppName/valid_with_hyphen
{"time":"2026-02-20T05:34:09.971001-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411GQJM9P6M6R8Z84135","name":"label-owner-app"}
{"time":"2026-02-20T05:34:09.977821-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.976469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411Q6TD5Q5VYFQB8FH1A","name":"envvar-owner-app"}
{"time":"2026-02-20T05:34:09.978014-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.978258-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.978581-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411TTN9HZP6TTH423PSX","name":"envvar-other-app"}
{"time":"2026-02-20T05:34:09.978757-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.979002-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411TVVZVA52R40TDBH03","name":"port-owner-app"}
{"time":"2026-02-20T05:34:09.979135-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411TC778X7TNEVKNZ3BQ","name":"label-other-app"}
{"time":"2026-02-20T05:34:09.979607-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411VWY5A9YNNKB97HWY5","name":"volume-validate-app"}
=== RUN   TestHandleVolumeAddValidatesPaths/relative_host_path_rejected
=== PAUSE TestHandleVolumeAddValidatesPaths/relative_host_path_rejected
=== RUN   TestHandleVolumeAddValidatesPaths/relative_container_path_rejected
{"time":"2026-02-20T05:34:09.97972-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411VQGRFF98ADHCYQJHC","name":"port-other-app"}
=== PAUSE TestHandleVolumeAddValidatesPaths/relative_container_path_rejected
=== RUN   TestHandleVolumeAddValidatesPaths/unclean_host_path_rejected
=== PAUSE TestHandleVolumeAddValidatesPaths/unclean_host_path_rejected
=== RUN   TestHandleVolumeAddValidatesPaths/valid_paths_accepted
=== PAUSE TestHandleVolumeAddValidatesPaths/valid_paths_accepted
=== CONT  TestValidateVolumePath/path_with_double_slash
=== CONT  TestValidateVolumePath/path_with_dotdot
=== CONT  TestValidateVolumePath/path_with_trailing_slash
=== CONT  TestValidateVolumePath/single_dot_path
=== CONT  TestValidateVolumePath/relative_path
=== CONT  TestValidateVolumePath/empty_path
=== CONT  TestSanitizeTail/valid_small_number
=== CONT  TestParsePortValues/valid_ports
=== CONT  TestSanitizeTail/float_uses_default
=== CONT  TestSanitizeTail/one_is_valid
=== CONT  TestSanitizeTail/all_keyword_uses_default
=== CONT  TestSanitizeTail/non-numeric_uses_default
=== CONT  TestSanitizeTail/negative_uses_default
{"time":"2026-02-20T05:34:09.980989-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.981069-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
--- PASS: TestAPILoginMissingFields (0.10s)
{"time":"2026-02-20T05:34:09.981266-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.98193-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.982794-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.983449-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.983815-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
--- PASS: TestHandleCancelDeployRedirects (0.10s)
=== CONT  TestHandleAppNew/renders_new_app_form
=== CONT  TestValidateVolumePath/valid_absolute_path
=== CONT  TestSanitizeTail/exceeds_max_clamped
=== CONT  TestSanitizeTail/very_large_clamped
=== CONT  TestParsePortValues/non-numeric
=== CONT  TestParsePortValues/zero_port
=== CONT  TestParsePortValues/both_ports_above_65535
=== CONT  TestParsePortValues/container_port_above_65535
=== CONT  TestParsePortValues/negative_port
=== CONT  TestParsePortValues/port_65535
=== CONT  TestParsePortValues/port_1
=== CONT  TestHandleDashboard/renders_dashboard_with_app_list
{"time":"2026-02-20T05:34:09.986359-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.987698-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleDashboardrenders_dashboard_with_app_list3801992180/001/upaas.db"}
{"time":"2026-02-20T05:34:09.988071-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.988259-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.988413-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.990344-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:09.990896-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.99105-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.991277-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.991425-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.991574-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
=== CONT  TestSanitizeLogs/plain_text_unchanged
=== CONT  TestSanitizeLogs/preserves_carriage_returns
=== CONT  TestSanitizeLogs/only_control_characters
=== CONT  TestSanitizeLogs/empty_string
=== CONT  TestSanitizeLogs/preserves_tabs
=== CONT  TestSanitizeLogs/strips_ANSI_color_codes
=== CONT  TestSanitizeLogs/strips_bell_characters
=== CONT  TestSanitizeLogs/strips_mixed_escape_sequences
=== CONT  TestSanitizeLogs/strips_null_bytes
=== CONT  TestSanitizeLogs/cursor_movement_sequences_stripped
=== CONT  TestSanitizeLogs/strips_OSC_sequences
=== CONT  TestValidateRepoURL/bare_path
=== CONT  TestValidateRepoURL/https_URL
=== CONT  TestValidateRepoURL/file_URL_uppercase
=== CONT  TestValidateRepoURL/file_URL
=== CONT  TestValidateRepoURL/whitespace_only
=== CONT  TestValidateRepoURL/empty_string
=== CONT  TestValidateRepoURL/https_with_port
=== CONT  TestValidateRepoURL/https_without_.git
=== CONT  TestValidateRepoURL/SCP-like_with_dots
=== CONT  TestValidateRepoURL/SCP-like_URL
=== CONT  TestValidateRepoURL/git_URL
=== CONT  TestValidateRepoURL/ssh_URL
=== CONT  TestValidateRepoURL/http_URL
=== CONT  TestValidateRepoURL/relative_path
=== CONT  TestValidateRepoURL/no_path_https_trailing_slash
=== CONT  TestValidateRepoURL/path_traversal_https
=== CONT  TestValidateRepoURL/path_traversal_SCP
=== CONT  TestValidateRepoURL/SCP-like_arbitrary_user
=== CONT  TestValidateRepoURL/path_traversal_in_middle
=== CONT  TestValidateRepoURL/ftp_URL
=== CONT  TestValidateRepoURL/no_path_https
=== CONT  TestValidateRepoURL/no_host_https
=== CONT  TestValidateRepoURL/SCP-like_non-git_user
=== CONT  TestValidateRepoURL/just_a_word
=== CONT  TestHandleVolumeAddValidatesPaths/relative_host_path_rejected
{"time":"2026-02-20T05:34:09.993342-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/handlers_test.TestHandleVolumeAddValidatesPaths.func1.(*Handlers).HandleVolumeAdd.1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/handlers/app.go","line":1027},"msg":"invalid volume path","error":"host path: path must be absolute"}
=== CONT  TestHandleVolumeAddValidatesPaths/valid_paths_accepted
=== CONT  TestHandleVolumeAddValidatesPaths/unclean_host_path_rejected
{"time":"2026-02-20T05:34:09.993776-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:09.993859-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/handlers_test.TestHandleVolumeAddValidatesPaths.func1.(*Handlers).HandleVolumeAdd.1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/handlers/app.go","line":1027},"msg":"invalid volume path","error":"host path: path must be clean (expected \"/etc\")"}
=== CONT  TestHandleVolumeAddValidatesPaths/relative_container_path_rejected
{"time":"2026-02-20T05:34:09.994008-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:09.994054-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/handlers_test.TestHandleVolumeAddValidatesPaths.func1.(*Handlers).HandleVolumeAdd.1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/handlers/app.go","line":1027},"msg":"invalid volume path","error":"container path: path must be absolute"}
{"time":"2026-02-20T05:34:09.994287-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:09.994448-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:09.9946-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
=== CONT  TestSanitizeTail/zero_uses_default
=== CONT  TestSanitizeTail/valid_max_boundary
--- PASS: TestDeleteEnvVarOwnershipVerification (0.10s)
--- PASS: TestHandleSetupPOSTRejectsShortPassword (0.10s)
{"time":"2026-02-20T05:34:09.998621-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleAppNewrenders_new_app_form4103470711/001/upaas.db"}
{"time":"2026-02-20T05:34:10.000228-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.002107-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.002489-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.002985-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.003315-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
=== CONT  TestParsePortValues/host_port_above_65535
=== RUN   TestSetupRequiredExemptsHealthAndStaticAndAPI//health
=== CONT  TestSanitizeTail/empty_uses_default
--- PASS: TestDeleteLabelOwnershipVerification (0.10s)
{"time":"2026-02-20T05:34:10.003652-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.004534-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleLoginGETrenders_login_page792062219/001/upaas.db"}
=== PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//health
=== RUN   TestSetupRequiredExemptsHealthAndStaticAndAPI//s/style.css
{"time":"2026-02-20T05:34:10.005479-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
--- PASS: TestHandleAppNew (0.00s)
    --- PASS: TestHandleAppNew/renders_new_app_form (0.01s)
{"time":"2026-02-20T05:34:10.005968-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.006126-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.006352-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.006506-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.00665-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:09.963414-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.007413-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.007566-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.008167-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM412RZ8APJRYNVA2E6PZP","name":"oversize-test-app"}
=== PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//s/style.css
=== RUN   TestSetupRequiredExemptsHealthAndStaticAndAPI//s/js/app.js
=== PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//s/js/app.js
=== RUN   TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/apps
=== PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/apps
=== RUN   TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/login
=== PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/login
--- PASS: TestHandleSetupPOSTRejectsEmptyUsername (0.11s)
=== RUN   TestSetupRequiredExemptsHealthAndStaticAndAPI/non-exempt_redirects
=== PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI/non-exempt_redirects
=== CONT  TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/login
--- PASS: TestDeletePortOwnershipVerification (0.11s)
=== CONT  TestSetupRequiredExemptsHealthAndStaticAndAPI/non-exempt_redirects
=== CONT  TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/apps
=== CONT  TestSetupRequiredExemptsHealthAndStaticAndAPI//s/js/app.js
=== CONT  TestSetupRequiredExemptsHealthAndStaticAndAPI//s/style.css
=== CONT  TestSetupRequiredExemptsHealthAndStaticAndAPI//health
--- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI (0.13s)
    --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/login (0.00s)
    --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI/non-exempt_redirects (0.00s)
    --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/apps (0.00s)
    --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//s/js/app.js (0.00s)
    --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//s/style.css (0.00s)
    --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//health (0.00s)
--- PASS: TestParsePortValues (0.01s)
    --- PASS: TestParsePortValues/valid_ports (0.00s)
    --- PASS: TestParsePortValues/non-numeric (0.00s)
    --- PASS: TestParsePortValues/zero_port (0.00s)
    --- PASS: TestParsePortValues/both_ports_above_65535 (0.00s)
    --- PASS: TestParsePortValues/container_port_above_65535 (0.00s)
    --- PASS: TestParsePortValues/negative_port (0.00s)
    --- PASS: TestParsePortValues/port_65535 (0.00s)
    --- PASS: TestParsePortValues/port_1 (0.00s)
    --- PASS: TestParsePortValues/host_port_above_65535 (0.00s)
--- PASS: TestHandleDashboard (0.00s)
    --- PASS: TestHandleDashboard/renders_dashboard_with_app_list (0.01s)
--- PASS: TestSanitizeLogs (0.01s)
    --- PASS: TestSanitizeLogs/plain_text_unchanged (0.00s)
    --- PASS: TestSanitizeLogs/preserves_carriage_returns (0.00s)
    --- PASS: TestSanitizeLogs/only_control_characters (0.00s)
    --- PASS: TestSanitizeLogs/empty_string (0.00s)
    --- PASS: TestSanitizeLogs/preserves_tabs (0.00s)
    --- PASS: TestSanitizeLogs/strips_ANSI_color_codes (0.00s)
    --- PASS: TestSanitizeLogs/strips_bell_characters (0.00s)
    --- PASS: TestSanitizeLogs/strips_mixed_escape_sequences (0.00s)
    --- PASS: TestSanitizeLogs/strips_null_bytes (0.00s)
    --- PASS: TestSanitizeLogs/cursor_movement_sequences_stripped (0.00s)
    --- PASS: TestSanitizeLogs/strips_OSC_sequences (0.00s)
--- PASS: TestValidateRepoURL (0.01s)
    --- PASS: TestValidateRepoURL/bare_path (0.00s)
    --- PASS: TestValidateRepoURL/https_URL (0.00s)
    --- PASS: TestValidateRepoURL/file_URL_uppercase (0.00s)
    --- PASS: TestValidateRepoURL/file_URL (0.00s)
    --- PASS: TestValidateRepoURL/whitespace_only (0.00s)
    --- PASS: TestValidateRepoURL/empty_string (0.00s)
    --- PASS: TestValidateRepoURL/https_with_port (0.00s)
    --- PASS: TestValidateRepoURL/https_without_.git (0.00s)
    --- PASS: TestValidateRepoURL/SCP-like_with_dots (0.00s)
    --- PASS: TestValidateRepoURL/SCP-like_URL (0.00s)
    --- PASS: TestValidateRepoURL/git_URL (0.00s)
    --- PASS: TestValidateRepoURL/ssh_URL (0.00s)
    --- PASS: TestValidateRepoURL/http_URL (0.00s)
    --- PASS: TestValidateRepoURL/relative_path (0.00s)
    --- PASS: TestValidateRepoURL/no_path_https_trailing_slash (0.00s)
    --- PASS: TestValidateRepoURL/path_traversal_https (0.00s)
    --- PASS: TestValidateRepoURL/path_traversal_SCP (0.00s)
    --- PASS: TestValidateRepoURL/SCP-like_arbitrary_user (0.00s)
    --- PASS: TestValidateRepoURL/path_traversal_in_middle (0.00s)
    --- PASS: TestValidateRepoURL/ftp_URL (0.00s)
    --- PASS: TestValidateRepoURL/no_path_https (0.00s)
    --- PASS: TestValidateRepoURL/no_host_https (0.00s)
    --- PASS: TestValidateRepoURL/SCP-like_non-git_user (0.00s)
    --- PASS: TestValidateRepoURL/just_a_word (0.00s)
--- PASS: TestHandleVolumeAddValidatesPaths (0.11s)
    --- PASS: TestHandleVolumeAddValidatesPaths/relative_host_path_rejected (0.00s)
    --- PASS: TestHandleVolumeAddValidatesPaths/valid_paths_accepted (0.00s)
    --- PASS: TestHandleVolumeAddValidatesPaths/unclean_host_path_rejected (0.00s)
    --- PASS: TestHandleVolumeAddValidatesPaths/relative_container_path_rejected (0.00s)
--- PASS: TestHandleHealthCheck (0.00s)
    --- PASS: TestHandleHealthCheck/returns_health_check_response (0.03s)
--- PASS: TestSanitizeTail (0.01s)
    --- PASS: TestSanitizeTail/one_is_valid (0.00s)
    --- PASS: TestSanitizeTail/non-numeric_uses_default (0.00s)
    --- PASS: TestSanitizeTail/float_uses_default (0.00s)
    --- PASS: TestSanitizeTail/all_keyword_uses_default (0.00s)
    --- PASS: TestSanitizeTail/valid_small_number (0.00s)
    --- PASS: TestSanitizeTail/negative_uses_default (0.00s)
    --- PASS: TestSanitizeTail/exceeds_max_clamped (0.00s)
    --- PASS: TestSanitizeTail/very_large_clamped (0.00s)
    --- PASS: TestSanitizeTail/zero_uses_default (0.00s)
    --- PASS: TestSanitizeTail/valid_max_boundary (0.00s)
    --- PASS: TestSanitizeTail/empty_uses_default (0.00s)
=== CONT  TestValidateVolumePath/root_path
{"time":"2026-02-20T05:34:09.976684-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.01492-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.015095-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.020713-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"oversize-test-app","event":"push"}
{"time":"2026-02-20T05:34:10.020834-08:00","level":"WARN","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":89},"msg":"failed to parse webhook payload","error":"invalid character 'x' looking for beginning of value"}
=== PAUSE TestValidateAppName/valid_with_hyphen
=== RUN   TestValidateAppName/valid_with_numbers
--- PASS: TestValidateVolumePath (0.01s)
    --- PASS: TestValidateVolumePath/path_with_double_slash (0.00s)
    --- PASS: TestValidateVolumePath/path_with_trailing_slash (0.00s)
    --- PASS: TestValidateVolumePath/single_dot_path (0.00s)
    --- PASS: TestValidateVolumePath/relative_path (0.00s)
    --- PASS: TestValidateVolumePath/empty_path (0.00s)
    --- PASS: TestValidateVolumePath/path_with_dotdot (0.00s)
    --- PASS: TestValidateVolumePath/valid_absolute_path (0.00s)
    --- PASS: TestValidateVolumePath/root_path (0.00s)
{"time":"2026-02-20T05:34:10.028483-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"oversize-test-app","branch":"","matched":false,"commit":""}
--- PASS: TestHandleWebhookRejectsOversizedBody (0.15s)
{"time":"2026-02-20T05:34:10.038761-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.039036-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.042854-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.043222-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.043489-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.043581-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
--- PASS: TestHandleWebhookReturns404ForUnknownSecret (0.09s)
{"time":"2026-02-20T05:34:10.04704-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.047104-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.047268-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.047753-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.048207-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
--- PASS: TestHandleLoginGET (0.01s)
    --- PASS: TestHandleLoginGET/renders_login_page (0.00s)
{"time":"2026-02-20T05:34:10.048618-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.049109-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
=== PAUSE TestValidateAppName/valid_with_numbers
=== RUN   TestValidateAppName/valid_two_chars
=== PAUSE TestValidateAppName/valid_two_chars
=== RUN   TestValidateAppName/valid_complex
=== PAUSE TestValidateAppName/valid_complex
=== RUN   TestValidateAppName/valid_all_numbers
=== PAUSE TestValidateAppName/valid_all_numbers
=== RUN   TestValidateAppName/empty
=== PAUSE TestValidateAppName/empty
=== RUN   TestValidateAppName/single_char
=== PAUSE TestValidateAppName/single_char
=== RUN   TestValidateAppName/too_long
=== PAUSE TestValidateAppName/too_long
=== RUN   TestValidateAppName/exactly_63_chars
=== PAUSE TestValidateAppName/exactly_63_chars
{"time":"2026-02-20T05:34:10.049645-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.049861-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM4141KDQ3AX1JJKX1A7DW","name":"webhook-test-app"}
{"time":"2026-02-20T05:34:10.050079-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"webhook-test-app","event":"push"}
{"time":"2026-02-20T05:34:10.050441-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
=== RUN   TestValidateAppName/64_chars
=== PAUSE TestValidateAppName/64_chars
{"time":"2026-02-20T05:34:10.050696-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"webhook-test-app","branch":"main","matched":true,"commit":"abc123"}
=== RUN   TestValidateAppName/uppercase
=== PAUSE TestValidateAppName/uppercase
=== RUN   TestValidateAppName/spaces
=== PAUSE TestValidateAppName/spaces
=== RUN   TestValidateAppName/starts_with_hyphen
=== PAUSE TestValidateAppName/starts_with_hyphen
=== RUN   TestValidateAppName/ends_with_hyphen
{"time":"2026-02-20T05:34:10.051669-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.052216-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.052416-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.055387-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.05566-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.05583-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestHandleSetupGET (0.00s)
    --- PASS: TestHandleSetupGET/renders_setup_page (0.09s)
{"time":"2026-02-20T05:34:10.057415-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"webhook-test-app","error":"failed to clone repo: invalid commit SHA: \"abc123\""}
{"time":"2026-02-20T05:34:10.059024-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookProcessesValidWebhook730302249/001/logs/Mac.lan guest wan/webhook-test-app/webhook-test-app_abc123_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.059443-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: invalid commit SHA: \"abc123\"","app":"webhook-test-app"}
=== PAUSE TestValidateAppName/ends_with_hyphen
=== RUN   TestValidateAppName/underscore
=== PAUSE TestValidateAppName/underscore
=== RUN   TestValidateAppName/dot
=== PAUSE TestValidateAppName/dot
=== RUN   TestValidateAppName/slash
=== PAUSE TestValidateAppName/slash
=== RUN   TestValidateAppName/path_traversal
=== PAUSE TestValidateAppName/path_traversal
=== RUN   TestValidateAppName/special_chars
=== PAUSE TestValidateAppName/special_chars
=== RUN   TestValidateAppName/unicode
=== PAUSE TestValidateAppName/unicode
=== CONT  TestValidateAppName/valid_simple
=== CONT  TestValidateAppName/special_chars
=== CONT  TestValidateAppName/path_traversal
=== CONT  TestValidateAppName/unicode
=== CONT  TestValidateAppName/dot
=== CONT  TestValidateAppName/slash
=== CONT  TestValidateAppName/underscore
=== CONT  TestValidateAppName/ends_with_hyphen
=== CONT  TestValidateAppName/spaces
=== CONT  TestValidateAppName/starts_with_hyphen
=== CONT  TestValidateAppName/uppercase
=== CONT  TestValidateAppName/64_chars
=== CONT  TestValidateAppName/too_long
=== CONT  TestValidateAppName/single_char
=== CONT  TestValidateAppName/exactly_63_chars
=== CONT  TestValidateAppName/valid_all_numbers
=== CONT  TestValidateAppName/valid_complex
=== CONT  TestValidateAppName/valid_two_chars
=== CONT  TestValidateAppName/valid_with_numbers
=== CONT  TestValidateAppName/valid_with_hyphen
=== CONT  TestValidateAppName/empty
--- PASS: TestValidateAppName (0.10s)
    --- PASS: TestValidateAppName/valid_simple (0.00s)
    --- PASS: TestValidateAppName/special_chars (0.00s)
    --- PASS: TestValidateAppName/path_traversal (0.00s)
    --- PASS: TestValidateAppName/unicode (0.00s)
    --- PASS: TestValidateAppName/dot (0.00s)
    --- PASS: TestValidateAppName/slash (0.00s)
    --- PASS: TestValidateAppName/underscore (0.00s)
    --- PASS: TestValidateAppName/ends_with_hyphen (0.00s)
    --- PASS: TestValidateAppName/spaces (0.00s)
    --- PASS: TestValidateAppName/starts_with_hyphen (0.00s)
    --- PASS: TestValidateAppName/uppercase (0.00s)
    --- PASS: TestValidateAppName/64_chars (0.00s)
    --- PASS: TestValidateAppName/too_long (0.00s)
    --- PASS: TestValidateAppName/single_char (0.00s)
    --- PASS: TestValidateAppName/exactly_63_chars (0.00s)
    --- PASS: TestValidateAppName/valid_all_numbers (0.00s)
    --- PASS: TestValidateAppName/valid_complex (0.00s)
    --- PASS: TestValidateAppName/valid_two_chars (0.00s)
    --- PASS: TestValidateAppName/valid_with_numbers (0.00s)
    --- PASS: TestValidateAppName/valid_with_hyphen (0.00s)
    --- PASS: TestValidateAppName/empty (0.00s)
--- PASS: TestHandleWebhookProcessesValidWebhook (0.20s)
{"time":"2026-02-20T05:34:10.17133-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.194917-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.196873-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"testuser"}
{"time":"2026-02-20T05:34:10.200185-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.200335-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.205973-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.210172-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.241975-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
--- PASS: TestHandleSetupPOSTCreatesUserAndRedirects (0.37s)
{"time":"2026-02-20T05:34:10.278246-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.289639-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.298905-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.299205-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.312815-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.331171-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.337693-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.350782-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"testuser"}
{"time":"2026-02-20T05:34:10.409628-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41F9GPV9N9NXHQYHGTHG","name":"test-app"}
--- PASS: TestAPICreateApp (0.53s)
--- PASS: TestAPILoginInvalidCredentials (0.55s)
--- PASS: TestHandleLoginPOSTAuthenticatesValidCredentials (0.56s)
--- PASS: TestAPICSRFRejectsPostWithoutHeader (0.58s)
--- PASS: TestAPILoginSuccess (0.59s)
--- PASS: TestAPIListAppsEmpty (0.59s)
--- PASS: TestAPIGetAppNotFound (0.59s)
{"time":"2026-02-20T05:34:10.490585-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41HT28CZZMJ4887NRZCH","name":"delete-me"}
{"time":"2026-02-20T05:34:10.491032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).DeleteApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":166},"msg":"app deleted","id":"01KHXM41HT28CZZMJ4887NRZCH","name":"delete-me"}
--- PASS: TestAPIDeleteApp (0.61s)
--- PASS: TestAPICSRFAllowsGetWithoutHeader (0.62s)
{"time":"2026-02-20T05:34:10.524561-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41JWV6M68CGBJ3VM6VGW","name":"deploy-app"}
--- PASS: TestAPIListDeployments (0.65s)
--- PASS: TestAPIWhoAmI (0.65s)
--- PASS: TestAPICreateAppValidation (0.66s)
--- PASS: TestHandleLoginPOSTRejectsInvalidCredentials (0.65s)
{"time":"2026-02-20T05:34:10.627939-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41P3QJ57D48HHDERNKBW","name":"my-app"}
--- PASS: TestAPIGetApp (0.75s)
{"time":"2026-02-20T05:34:10.637744-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41PDV2DK6J4H5ZT34NA8","name":"detach-ctx-app"}
{"time":"2026-02-20T05:34:10.638571-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"detach-ctx-app","error":"failed to clone repo: docker client not connected"}
{"time":"2026-02-20T05:34:10.638988-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPITriggerDeployUsesDetachedContext3052390260/001/logs/Mac.lan guest wan/detach-ctx-app/detach-ctx-app_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.639112-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/handlers_test.apiRouter.func1.1.(*Handlers).HandleAPITriggerDeploy.7","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/handlers/api.go","line":360},"msg":"api: failed to trigger deploy","error":"failed to clone repo: docker client not connected"}
--- PASS: TestAPITriggerDeployUsesDetachedContext (0.67s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/handlers	(cached)
?   	git.eeqj.de/sneak/upaas/internal/healthcheck	[no test files]
?   	git.eeqj.de/sneak/upaas/internal/logger	[no test files]
=== RUN   TestCORS_NoOriginsConfigured_NoCORSHeaders
=== PAUSE TestCORS_NoOriginsConfigured_NoCORSHeaders
=== RUN   TestCORS_OriginsConfigured_AllowsMatchingOrigin
=== PAUSE TestCORS_OriginsConfigured_AllowsMatchingOrigin
=== RUN   TestCORS_OriginsConfigured_RejectsNonMatchingOrigin
=== PAUSE TestCORS_OriginsConfigured_RejectsNonMatchingOrigin
=== RUN   TestAPICSRFProtection_BlocksPostWithoutHeader
=== PAUSE TestAPICSRFProtection_BlocksPostWithoutHeader
=== RUN   TestAPICSRFProtection_AllowsPostWithHeader
=== PAUSE TestAPICSRFProtection_AllowsPostWithHeader
=== RUN   TestAPICSRFProtection_AllowsGetWithoutHeader
=== PAUSE TestAPICSRFProtection_AllowsGetWithoutHeader
=== RUN   TestAPICSRFProtection_BlocksDeleteWithoutHeader
=== PAUSE TestAPICSRFProtection_BlocksDeleteWithoutHeader
=== RUN   TestAPICSRFProtection_AllowsHeadWithoutHeader
=== PAUSE TestAPICSRFProtection_AllowsHeadWithoutHeader
=== RUN   TestLoginRateLimitAllowsUpToBurst
2026/02/20 05:34:10 WARN login rate limit exceeded remoteIP=192.168.1.1
--- PASS: TestLoginRateLimitAllowsUpToBurst (0.00s)
=== RUN   TestLoginRateLimitIsolatesIPs
2026/02/20 05:34:10 WARN login rate limit exceeded remoteIP=10.0.0.1
--- PASS: TestLoginRateLimitIsolatesIPs (0.00s)
=== RUN   TestLoginRateLimitReturns429Body
2026/02/20 05:34:10 WARN login rate limit exceeded remoteIP=172.16.0.1
--- PASS: TestLoginRateLimitReturns429Body (0.00s)
=== RUN   TestIPLimiterEvictsStaleEntries
=== PAUSE TestIPLimiterEvictsStaleEntries
=== RUN   TestRealIP
=== PAUSE TestRealIP
=== RUN   TestIsTrustedProxy
=== PAUSE TestIsTrustedProxy
=== CONT  TestCORS_NoOriginsConfigured_NoCORSHeaders
--- PASS: TestCORS_NoOriginsConfigured_NoCORSHeaders (0.00s)
=== CONT  TestIsTrustedProxy
--- PASS: TestIsTrustedProxy (0.00s)
=== CONT  TestRealIP
=== RUN   TestRealIP/trusted:_X-Real-IP_from_10.x
=== CONT  TestIPLimiterEvictsStaleEntries
--- PASS: TestIPLimiterEvictsStaleEntries (0.00s)
=== CONT  TestAPICSRFProtection_AllowsHeadWithoutHeader
--- PASS: TestAPICSRFProtection_AllowsHeadWithoutHeader (0.00s)
=== CONT  TestAPICSRFProtection_AllowsGetWithoutHeader
--- PASS: TestAPICSRFProtection_AllowsGetWithoutHeader (0.00s)
=== CONT  TestAPICSRFProtection_BlocksDeleteWithoutHeader
--- PASS: TestAPICSRFProtection_BlocksDeleteWithoutHeader (0.00s)
=== CONT  TestAPICSRFProtection_AllowsPostWithHeader
--- PASS: TestAPICSRFProtection_AllowsPostWithHeader (0.00s)
=== CONT  TestCORS_OriginsConfigured_RejectsNonMatchingOrigin
--- PASS: TestCORS_OriginsConfigured_RejectsNonMatchingOrigin (0.00s)
=== CONT  TestCORS_OriginsConfigured_AllowsMatchingOrigin
--- PASS: TestCORS_OriginsConfigured_AllowsMatchingOrigin (0.00s)
=== CONT  TestAPICSRFProtection_BlocksPostWithoutHeader
--- PASS: TestAPICSRFProtection_BlocksPostWithoutHeader (0.00s)
=== PAUSE TestRealIP/trusted:_X-Real-IP_from_10.x
=== RUN   TestRealIP/trusted:_XFF_from_10.x_when_no_X-Real-IP
=== PAUSE TestRealIP/trusted:_XFF_from_10.x_when_no_X-Real-IP
=== RUN   TestRealIP/trusted:_XFF_single_IP_from_10.x
=== PAUSE TestRealIP/trusted:_XFF_single_IP_from_10.x
=== RUN   TestRealIP/trusted:_falls_back_to_RemoteAddr_(192.168.x)
=== PAUSE TestRealIP/trusted:_falls_back_to_RemoteAddr_(192.168.x)
=== RUN   TestRealIP/trusted:_RemoteAddr_without_port
=== PAUSE TestRealIP/trusted:_RemoteAddr_without_port
=== RUN   TestRealIP/trusted:_X-Real-IP_with_whitespace_from_10.x
=== PAUSE TestRealIP/trusted:_X-Real-IP_with_whitespace_from_10.x
=== RUN   TestRealIP/trusted:_XFF_with_whitespace_from_10.x
=== PAUSE TestRealIP/trusted:_XFF_with_whitespace_from_10.x
=== RUN   TestRealIP/trusted:_empty_X-Real-IP_falls_through_to_XFF_from_10.x
=== PAUSE TestRealIP/trusted:_empty_X-Real-IP_falls_through_to_XFF_from_10.x
=== RUN   TestRealIP/trusted:_loopback_honours_X-Real-IP
=== PAUSE TestRealIP/trusted:_loopback_honours_X-Real-IP
=== RUN   TestRealIP/trusted:_172.16.x_honours_XFF
=== PAUSE TestRealIP/trusted:_172.16.x_honours_XFF
=== RUN   TestRealIP/untrusted:_X-Real-IP_ignored_from_public_IP
=== PAUSE TestRealIP/untrusted:_X-Real-IP_ignored_from_public_IP
=== RUN   TestRealIP/untrusted:_XFF_ignored_from_public_IP
=== PAUSE TestRealIP/untrusted:_XFF_ignored_from_public_IP
=== RUN   TestRealIP/untrusted:_both_headers_ignored_from_public_IP
=== PAUSE TestRealIP/untrusted:_both_headers_ignored_from_public_IP
=== RUN   TestRealIP/untrusted:_no_headers,_public_RemoteAddr
=== PAUSE TestRealIP/untrusted:_no_headers,_public_RemoteAddr
=== RUN   TestRealIP/untrusted:_public_RemoteAddr_without_port
=== PAUSE TestRealIP/untrusted:_public_RemoteAddr_without_port
=== CONT  TestRealIP/trusted:_X-Real-IP_from_10.x
=== CONT  TestRealIP/untrusted:_public_RemoteAddr_without_port
=== CONT  TestRealIP/untrusted:_no_headers,_public_RemoteAddr
=== CONT  TestRealIP/untrusted:_both_headers_ignored_from_public_IP
=== CONT  TestRealIP/untrusted:_XFF_ignored_from_public_IP
=== CONT  TestRealIP/untrusted:_X-Real-IP_ignored_from_public_IP
=== CONT  TestRealIP/trusted:_172.16.x_honours_XFF
=== CONT  TestRealIP/trusted:_X-Real-IP_with_whitespace_from_10.x
=== CONT  TestRealIP/trusted:_XFF_from_10.x_when_no_X-Real-IP
=== CONT  TestRealIP/trusted:_falls_back_to_RemoteAddr_(192.168.x)
=== CONT  TestRealIP/trusted:_XFF_single_IP_from_10.x
=== CONT  TestRealIP/trusted:_empty_X-Real-IP_falls_through_to_XFF_from_10.x
=== CONT  TestRealIP/trusted:_loopback_honours_X-Real-IP
=== CONT  TestRealIP/trusted:_XFF_with_whitespace_from_10.x
=== CONT  TestRealIP/trusted:_RemoteAddr_without_port
--- PASS: TestRealIP (0.00s)
    --- PASS: TestRealIP/trusted:_X-Real-IP_from_10.x (0.00s)
    --- PASS: TestRealIP/untrusted:_public_RemoteAddr_without_port (0.00s)
    --- PASS: TestRealIP/untrusted:_no_headers,_public_RemoteAddr (0.00s)
    --- PASS: TestRealIP/untrusted:_both_headers_ignored_from_public_IP (0.00s)
    --- PASS: TestRealIP/untrusted:_XFF_ignored_from_public_IP (0.00s)
    --- PASS: TestRealIP/untrusted:_X-Real-IP_ignored_from_public_IP (0.00s)
    --- PASS: TestRealIP/trusted:_172.16.x_honours_XFF (0.00s)
    --- PASS: TestRealIP/trusted:_X-Real-IP_with_whitespace_from_10.x (0.00s)
    --- PASS: TestRealIP/trusted:_XFF_from_10.x_when_no_X-Real-IP (0.00s)
    --- PASS: TestRealIP/trusted:_falls_back_to_RemoteAddr_(192.168.x) (0.00s)
    --- PASS: TestRealIP/trusted:_XFF_single_IP_from_10.x (0.00s)
    --- PASS: TestRealIP/trusted:_empty_X-Real-IP_falls_through_to_XFF_from_10.x (0.00s)
    --- PASS: TestRealIP/trusted:_loopback_honours_X-Real-IP (0.00s)
    --- PASS: TestRealIP/trusted:_XFF_with_whitespace_from_10.x (0.00s)
    --- PASS: TestRealIP/trusted:_RemoteAddr_without_port (0.00s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/middleware	(cached)
=== RUN   TestUserCreateAndFind
=== PAUSE TestUserCreateAndFind
=== RUN   TestUserUpdate
=== PAUSE TestUserUpdate
=== RUN   TestUserDelete
=== PAUSE TestUserDelete
=== RUN   TestUserFindByUsername
=== PAUSE TestUserFindByUsername
=== RUN   TestUserFindByUsernameNotFound
=== PAUSE TestUserFindByUsernameNotFound
=== RUN   TestUserExists
=== PAUSE TestUserExists
=== RUN   TestAppCreateAndFind
=== PAUSE TestAppCreateAndFind
=== RUN   TestAppUpdate
=== PAUSE TestAppUpdate
=== RUN   TestAppDelete
=== PAUSE TestAppDelete
=== RUN   TestAppFindByWebhookSecret
=== PAUSE TestAppFindByWebhookSecret
=== RUN   TestAllApps
=== PAUSE TestAllApps
=== RUN   TestEnvVarCRUD
=== PAUSE TestEnvVarCRUD
=== RUN   TestLabelCRUD
=== PAUSE TestLabelCRUD
=== RUN   TestVolumeCRUD
=== PAUSE TestVolumeCRUD
=== RUN   TestWebhookEventCRUD
=== PAUSE TestWebhookEventCRUD
=== RUN   TestDeploymentCreateAndFind
=== PAUSE TestDeploymentCreateAndFind
=== RUN   TestDeploymentAppendLog
=== PAUSE TestDeploymentAppendLog
=== RUN   TestDeploymentMarkFinished
=== PAUSE TestDeploymentMarkFinished
=== RUN   TestDeploymentFindByAppID
=== PAUSE TestDeploymentFindByAppID
=== RUN   TestDeploymentFindLatest
=== PAUSE TestDeploymentFindLatest
=== RUN   TestAppGetEnvVars
=== PAUSE TestAppGetEnvVars
=== RUN   TestAppGetLabels
=== PAUSE TestAppGetLabels
=== RUN   TestAppGetVolumes
=== PAUSE TestAppGetVolumes
=== RUN   TestAppGetDeployments
=== PAUSE TestAppGetDeployments
=== RUN   TestAppGetWebhookEvents
=== PAUSE TestAppGetWebhookEvents
=== RUN   TestCascadeDelete
=== PAUSE TestCascadeDelete
=== CONT  TestUserUpdate
=== CONT  TestLabelCRUD
=== RUN   TestLabelCRUD/creates_and_finds_labels
=== PAUSE TestLabelCRUD/creates_and_finds_labels
=== CONT  TestLabelCRUD/creates_and_finds_labels
{"time":"2026-02-20T05:34:10.030049-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserUpdate1620655118/001/upaas.db"}
=== CONT  TestAppCreateAndFind
{"time":"2026-02-20T05:34:10.030938-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestLabelCRUDcreates_and_finds_labels3490381503/001/upaas.db"}
=== CONT  TestDeploymentFindByAppID
=== CONT  TestAppUpdate
{"time":"2026-02-20T05:34:10.032978-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentFindByAppID3445331372/001/upaas.db"}
{"time":"2026-02-20T05:34:10.033236-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppUpdate3905913933/001/upaas.db"}
{"time":"2026-02-20T05:34:10.034675-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
=== CONT  TestDeploymentAppendLog
{"time":"2026-02-20T05:34:10.035252-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.035402-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.035642-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.035802-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.035952-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
=== CONT  TestVolumeCRUD
=== RUN   TestVolumeCRUD/creates_and_finds_volumes
=== PAUSE TestVolumeCRUD/creates_and_finds_volumes
=== CONT  TestDeploymentCreateAndFind
{"time":"2026-02-20T05:34:10.039096-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppCreateAndFind1558901610/001/upaas.db"}
=== CONT  TestUserExists
=== RUN   TestUserExists/returns_false_when_no_users
=== CONT  TestUserFindByUsernameNotFound
--- PASS: TestAppUpdate (0.01s)
=== CONT  TestVolumeCRUD/creates_and_finds_volumes
{"time":"2026-02-20T05:34:10.040198-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.040433-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserFindByUsernameNotFound3720737358/001/upaas.db"}
{"time":"2026-02-20T05:34:10.040398-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentCreateAndFind2190224302/001/upaas.db"}
{"time":"2026-02-20T05:34:10.040525-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentAppendLog676753355/001/upaas.db"}
{"time":"2026-02-20T05:34:10.042075-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
=== CONT  TestUserCreateAndFind
{"time":"2026-02-20T05:34:10.043094-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.04435-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
=== CONT  TestAppDelete
{"time":"2026-02-20T05:34:10.044746-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.051213-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserCreateAndFind2755485217/001/upaas.db"}
{"time":"2026-02-20T05:34:10.051892-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
=== PAUSE TestUserExists/returns_false_when_no_users
=== RUN   TestUserExists/returns_true_when_user_exists
=== PAUSE TestUserExists/returns_true_when_user_exists
=== CONT  TestUserExists/returns_false_when_no_users
=== CONT  TestUserFindByUsername
{"time":"2026-02-20T05:34:10.054344-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVolumeCRUDcreates_and_finds_volumes322096490/001/upaas.db"}
=== CONT  TestUserExists/returns_true_when_user_exists
{"time":"2026-02-20T05:34:10.055036-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserExistsreturns_false_when_no_users1219771254/001/upaas.db"}
{"time":"2026-02-20T05:34:10.055882-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppDelete1454070073/001/upaas.db"}
{"time":"2026-02-20T05:34:10.057911-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserExistsreturns_true_when_user_exists1926902790/001/upaas.db"}
{"time":"2026-02-20T05:34:10.058949-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.059478-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.059633-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.063065-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserFindByUsername2932768192/001/upaas.db"}
=== CONT  TestWebhookEventCRUD
=== RUN   TestWebhookEventCRUD/creates_and_finds_webhook_events
=== PAUSE TestWebhookEventCRUD/creates_and_finds_webhook_events
=== CONT  TestWebhookEventCRUD/creates_and_finds_webhook_events
{"time":"2026-02-20T05:34:10.06974-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.071064-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestWebhookEventCRUDcreates_and_finds_webhook_events1522328187/001/upaas.db"}
=== CONT  TestCascadeDelete
=== RUN   TestCascadeDelete/deleting_app_cascades_to_related_records
=== CONT  TestDeploymentMarkFinished
=== PAUSE TestCascadeDelete/deleting_app_cascades_to_related_records
=== CONT  TestCascadeDelete/deleting_app_cascades_to_related_records
{"time":"2026-02-20T05:34:10.073088-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
=== CONT  TestUserDelete
{"time":"2026-02-20T05:34:10.074139-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.074693-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.075124-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.074974-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
=== CONT  TestAppGetLabels
{"time":"2026-02-20T05:34:10.075746-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.076102-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.076523-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
=== CONT  TestAppGetWebhookEvents
--- PASS: TestUserUpdate (0.05s)
=== CONT  TestAppGetDeployments
{"time":"2026-02-20T05:34:10.077719-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserDelete2119534058/001/upaas.db"}
=== CONT  TestAppGetVolumes
{"time":"2026-02-20T05:34:10.078827-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.085025-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetLabels2380643754/001/upaas.db"}
{"time":"2026-02-20T05:34:10.085211-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCascadeDeletedeleting_app_cascades_to_related_records2874023787/001/upaas.db"}
{"time":"2026-02-20T05:34:10.085238-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentMarkFinished1293758714/001/upaas.db"}
{"time":"2026-02-20T05:34:10.074383-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.086751-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetVolumes2947451031/001/upaas.db"}
{"time":"2026-02-20T05:34:10.088023-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetWebhookEvents1189030502/001/upaas.db"}
=== CONT  TestAppGetEnvVars
{"time":"2026-02-20T05:34:10.096096-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.096878-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetEnvVars2594934116/001/upaas.db"}
{"time":"2026-02-20T05:34:10.098458-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.099203-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.100584-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.101619-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.102511-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.102961-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
=== CONT  TestAllApps
=== RUN   TestAllApps/returns_empty_list_when_no_apps
=== CONT  TestEnvVarCRUD
=== RUN   TestEnvVarCRUD/creates_and_finds_env_vars
=== CONT  TestAppFindByWebhookSecret
=== PAUSE TestAllApps/returns_empty_list_when_no_apps
=== PAUSE TestEnvVarCRUD/creates_and_finds_env_vars
{"time":"2026-02-20T05:34:10.105247-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
=== RUN   TestAllApps/returns_apps_ordered_by_name
=== PAUSE TestAllApps/returns_apps_ordered_by_name
=== RUN   TestEnvVarCRUD/deletes_env_var
=== PAUSE TestEnvVarCRUD/deletes_env_var
=== CONT  TestEnvVarCRUD/creates_and_finds_env_vars
{"time":"2026-02-20T05:34:10.105595-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.105703-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
=== CONT  TestAllApps/returns_empty_list_when_no_apps
=== CONT  TestAllApps/returns_apps_ordered_by_name
{"time":"2026-02-20T05:34:10.106205-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.106592-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.106654-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.106671-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
=== CONT  TestEnvVarCRUD/deletes_env_var
{"time":"2026-02-20T05:34:10.114007-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.11496-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestEnvVarCRUDdeletes_env_var447203874/001/upaas.db"}
{"time":"2026-02-20T05:34:10.115855-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.116401-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.114219-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.11763-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.117852-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.118027-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.118286-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.118408-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestEnvVarCRUDcreates_and_finds_env_vars3318316464/001/upaas.db"}
{"time":"2026-02-20T05:34:10.118412-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAllAppsreturns_apps_ordered_by_name2823597281/001/upaas.db"}
{"time":"2026-02-20T05:34:10.11857-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.119018-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.119061-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAllAppsreturns_empty_list_when_no_apps1002856232/001/upaas.db"}
{"time":"2026-02-20T05:34:10.119863-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.120064-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.121066-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.122685-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.123132-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.123904-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.124232-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
--- PASS: TestAppGetEnvVars (0.03s)
{"time":"2026-02-20T05:34:10.12603-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.126412-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestAppCreateAndFind (0.10s)
{"time":"2026-02-20T05:34:10.127486-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.127657-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.128081-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.128237-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.128266-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
=== CONT  TestDeploymentFindLatest
{"time":"2026-02-20T05:34:10.128342-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetDeployments248718239/001/upaas.db"}
{"time":"2026-02-20T05:34:10.128438-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.128724-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.129753-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.129745-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppFindByWebhookSecret3990399520/001/upaas.db"}
--- PASS: TestAppDelete (0.09s)
{"time":"2026-02-20T05:34:10.130573-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentFindLatest2217448518/001/upaas.db"}
{"time":"2026-02-20T05:34:10.130477-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.131557-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.131931-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.133921-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.134822-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.134879-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.137719-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.13844-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.13977-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.141077-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.141154-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.141701-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.142292-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.142381-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.14446-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.144642-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.144955-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.145807-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.14582-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.146046-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.146055-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.146124-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.146145-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.146094-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.147771-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.148017-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestAppGetLabels (0.07s)
{"time":"2026-02-20T05:34:10.149652-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.150016-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.150491-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.150751-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.150884-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.151269-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.151314-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.151576-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.151793-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.151923-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.152303-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.152302-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.152581-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.152633-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.153247-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.153255-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.153686-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.154044-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.155059-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
--- PASS: TestVolumeCRUD (0.00s)
    --- PASS: TestVolumeCRUD/creates_and_finds_volumes (0.12s)
{"time":"2026-02-20T05:34:10.155416-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.155443-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.155471-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.155754-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.155912-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.156204-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
--- PASS: TestUserDelete (0.08s)
{"time":"2026-02-20T05:34:10.157015-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.157878-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.158013-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestUserFindByUsernameNotFound (0.12s)
{"time":"2026-02-20T05:34:10.158569-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.159167-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.159984-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.160301-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
--- PASS: TestAllApps (0.00s)
    --- PASS: TestAllApps/returns_apps_ordered_by_name (0.05s)
    --- PASS: TestAllApps/returns_empty_list_when_no_apps (0.06s)
{"time":"2026-02-20T05:34:10.162047-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.162192-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.163018-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
--- PASS: TestUserFindByUsername (0.11s)
{"time":"2026-02-20T05:34:10.163346-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.163858-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.164647-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.164799-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.164882-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.166038-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.168032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.168202-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.168031-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.169041-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.169089-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
--- PASS: TestLabelCRUD (0.00s)
    --- PASS: TestLabelCRUD/creates_and_finds_labels (0.14s)
{"time":"2026-02-20T05:34:10.169205-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.169268-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.169564-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.169612-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestEnvVarCRUD (0.00s)
    --- PASS: TestEnvVarCRUD/deletes_env_var (0.02s)
    --- PASS: TestEnvVarCRUD/creates_and_finds_env_vars (0.06s)
{"time":"2026-02-20T05:34:10.170383-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
--- PASS: TestAppGetWebhookEvents (0.09s)
{"time":"2026-02-20T05:34:10.17118-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.172392-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.17312-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.174739-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.175245-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.175281-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.175382-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.175582-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
--- PASS: TestAppGetVolumes (0.10s)
{"time":"2026-02-20T05:34:10.175933-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.176272-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.17653-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.176645-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.177735-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.177767-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.177876-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.177916-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.177912-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.178029-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestDeploymentMarkFinished (0.11s)
{"time":"2026-02-20T05:34:10.178183-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
--- PASS: TestDeploymentAppendLog (0.14s)
{"time":"2026-02-20T05:34:10.178597-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.179032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.17915-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.179696-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.179722-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.180501-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.180515-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.181623-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestCascadeDelete (0.00s)
    --- PASS: TestCascadeDelete/deleting_app_cascades_to_related_records (0.11s)
{"time":"2026-02-20T05:34:10.181903-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
--- PASS: TestUserCreateAndFind (0.14s)
--- PASS: TestDeploymentCreateAndFind (0.15s)
--- PASS: TestUserExists (0.01s)
    --- PASS: TestUserExists/returns_true_when_user_exists (0.11s)
    --- PASS: TestUserExists/returns_false_when_no_users (0.13s)
--- PASS: TestWebhookEventCRUD (0.00s)
    --- PASS: TestWebhookEventCRUD/creates_and_finds_webhook_events (0.12s)
--- PASS: TestAppGetDeployments (0.11s)
{"time":"2026-02-20T05:34:10.187765-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
--- PASS: TestAppFindByWebhookSecret (0.08s)
--- PASS: TestDeploymentFindByAppID (0.16s)
{"time":"2026-02-20T05:34:10.188492-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestDeploymentFindLatest (0.06s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/models	(cached)
?   	git.eeqj.de/sneak/upaas/internal/server	[no test files]
=== RUN   TestCreateAppWithGeneratedKeys
=== PAUSE TestCreateAppWithGeneratedKeys
=== RUN   TestCreateAppDefaults
=== PAUSE TestCreateAppDefaults
=== RUN   TestCreateAppOptionalFields
=== PAUSE TestCreateAppOptionalFields
=== RUN   TestUpdateApp
=== PAUSE TestUpdateApp
=== RUN   TestDeleteApp
=== PAUSE TestDeleteApp
=== RUN   TestGetApp
=== PAUSE TestGetApp
=== RUN   TestGetAppByWebhookSecret
=== PAUSE TestGetAppByWebhookSecret
=== RUN   TestListApps
=== PAUSE TestListApps
=== RUN   TestEnvVarsAddAndRetrieve
=== PAUSE TestEnvVarsAddAndRetrieve
=== RUN   TestEnvVarsDelete
=== PAUSE TestEnvVarsDelete
=== RUN   TestLabels
=== PAUSE TestLabels
=== RUN   TestVolumesAddAndRetrieve
=== PAUSE TestVolumesAddAndRetrieve
=== RUN   TestVolumesDelete
=== PAUSE TestVolumesDelete
=== RUN   TestUpdateAppStatus
=== PAUSE TestUpdateAppStatus
=== CONT  TestCreateAppDefaults
=== CONT  TestEnvVarsAddAndRetrieve
=== CONT  TestUpdateAppStatus
=== RUN   TestUpdateAppStatus/updates_app_status
=== PAUSE TestUpdateAppStatus/updates_app_status
=== CONT  TestVolumesDelete
=== CONT  TestVolumesAddAndRetrieve
=== CONT  TestLabels
=== RUN   TestLabels/adds_and_retrieves_labels
=== CONT  TestEnvVarsDelete
=== CONT  TestGetApp
=== PAUSE TestLabels/adds_and_retrieves_labels
=== RUN   TestGetApp/finds_existing_app
=== CONT  TestDeleteApp
=== PAUSE TestGetApp/finds_existing_app
=== RUN   TestGetApp/returns_nil_for_non-existent_app
=== RUN   TestDeleteApp/deletes_app_and_returns_nil_on_lookup
=== CONT  TestUpdateApp
=== PAUSE TestGetApp/returns_nil_for_non-existent_app
=== CONT  TestCreateAppOptionalFields
=== CONT  TestCreateAppWithGeneratedKeys
=== CONT  TestUpdateAppStatus/updates_app_status
=== CONT  TestGetAppByWebhookSecret
=== RUN   TestLabels/deletes_label
=== CONT  TestListApps
=== PAUSE TestLabels/deletes_label
=== PAUSE TestDeleteApp/deletes_app_and_returns_nil_on_lookup
=== CONT  TestGetApp/returns_nil_for_non-existent_app
=== RUN   TestUpdateApp/updates_app_fields
=== PAUSE TestUpdateApp/updates_app_fields
=== RUN   TestListApps/returns_empty_list_when_no_apps
=== PAUSE TestListApps/returns_empty_list_when_no_apps
=== RUN   TestUpdateApp/clears_optional_fields_when_empty
=== PAUSE TestUpdateApp/clears_optional_fields_when_empty
=== RUN   TestListApps/returns_all_apps_ordered_by_name
=== CONT  TestLabels/deletes_label
=== CONT  TestLabels/adds_and_retrieves_labels
=== RUN   TestGetAppByWebhookSecret/finds_app_by_webhook_secret
=== CONT  TestUpdateApp/updates_app_fields
=== CONT  TestGetApp/finds_existing_app
=== PAUSE TestListApps/returns_all_apps_ordered_by_name
{"time":"2026-02-20T05:34:10.200355-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestEnvVarsDelete3753399937/001/upaas.db"}
=== PAUSE TestGetAppByWebhookSecret/finds_app_by_webhook_secret
=== RUN   TestGetAppByWebhookSecret/returns_nil_for_invalid_secret
=== PAUSE TestGetAppByWebhookSecret/returns_nil_for_invalid_secret
=== CONT  TestListApps/returns_all_apps_ordered_by_name
{"time":"2026-02-20T05:34:10.201207-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateAppWithGeneratedKeys3086114307/001/upaas.db"}
{"time":"2026-02-20T05:34:10.201357-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateAppOptionalFields1046221743/001/upaas.db"}
=== CONT  TestUpdateApp/clears_optional_fields_when_empty
{"time":"2026-02-20T05:34:10.202298-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVolumesAddAndRetrieve4187974089/001/upaas.db"}
{"time":"2026-02-20T05:34:10.202848-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVolumesDelete2601973248/001/upaas.db"}
{"time":"2026-02-20T05:34:10.203024-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestEnvVarsAddAndRetrieve381107435/001/upaas.db"}
=== CONT  TestDeleteApp/deletes_app_and_returns_nil_on_lookup
=== CONT  TestListApps/returns_empty_list_when_no_apps
{"time":"2026-02-20T05:34:10.205572-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestGetAppreturns_nil_for_non-existent_app451128046/001/upaas.db"}
{"time":"2026-02-20T05:34:10.205795-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUpdateAppStatusupdates_app_status1513275777/001/upaas.db"}
{"time":"2026-02-20T05:34:10.206308-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateAppDefaults683202009/001/upaas.db"}
=== CONT  TestGetAppByWebhookSecret/returns_nil_for_invalid_secret
=== CONT  TestGetAppByWebhookSecret/finds_app_by_webhook_secret
{"time":"2026-02-20T05:34:10.215965-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestGetAppfinds_existing_app1512285900/001/upaas.db"}
{"time":"2026-02-20T05:34:10.219413-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestListAppsreturns_empty_list_when_no_apps1337731534/001/upaas.db"}
{"time":"2026-02-20T05:34:10.220055-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUpdateAppupdates_app_fields1630979087/001/upaas.db"}
{"time":"2026-02-20T05:34:10.22001-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestLabelsadds_and_retrieves_labels4114967918/001/upaas.db"}
{"time":"2026-02-20T05:34:10.220203-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestListAppsreturns_all_apps_ordered_by_name1422305139/001/upaas.db"}
{"time":"2026-02-20T05:34:10.220356-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUpdateAppclears_optional_fields_when_empty71924344/001/upaas.db"}
{"time":"2026-02-20T05:34:10.220846-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestLabelsdeletes_label62677219/001/upaas.db"}
{"time":"2026-02-20T05:34:10.22217-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeleteAppdeletes_app_and_returns_nil_on_lookup3602538454/001/upaas.db"}
{"time":"2026-02-20T05:34:10.222466-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.223314-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestGetAppByWebhookSecretreturns_nil_for_invalid_secret1512751755/001/upaas.db"}
{"time":"2026-02-20T05:34:10.232895-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestGetAppByWebhookSecretfinds_app_by_webhook_secret3670578947/001/upaas.db"}
{"time":"2026-02-20T05:34:10.233115-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.235149-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.238274-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.239638-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.239824-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.240225-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.241031-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.241747-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.243375-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.243635-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.244342-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.244812-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.244857-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.245647-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.246059-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.246803-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.249108-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.250094-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.250871-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.253882-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.257402-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.259475-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.261123-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.261418-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.261819-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.262828-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.263205-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.264257-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.264469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.265017-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.265303-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.265407-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.26553-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.265805-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.265949-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.267116-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.267353-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.267494-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.268075-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.268326-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.2684-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.270529-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.271305-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.272613-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.272687-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.272735-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.273876-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.274577-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.274671-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.275161-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.275288-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.276099-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.276333-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.276419-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.276539-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.278693-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.278902-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.280076-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.28029-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.280386-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.28052-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.280908-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.281106-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.28119-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.281881-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.281884-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.28287-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.283221-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.284183-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.286184-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.286365-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.286565-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.286852-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.28698-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.287029-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.287152-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.28721-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.287162-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.287403-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BEQR1D4WBKV3H8BWBJ","name":"env-test"}
{"time":"2026-02-20T05:34:10.288409-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BFDGRBT6S33J7VTT9Q","name":"test-app-defaults"}
--- PASS: TestCreateAppDefaults (0.09s)
{"time":"2026-02-20T05:34:10.289129-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.289148-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BGKZFXJJWMHCX8ENNT","name":"status-test"}
--- PASS: TestEnvVarsAddAndRetrieve (0.09s)
{"time":"2026-02-20T05:34:10.289214-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.289261-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.289515-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.289534-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.289756-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.289805-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
--- PASS: TestUpdateAppStatus (0.00s)
    --- PASS: TestUpdateAppStatus/updates_app_status (0.09s)
{"time":"2026-02-20T05:34:10.29055-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.290742-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.290867-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.291344-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.291522-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.291885-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.29189-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.292056-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.292148-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.292182-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.292376-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.292519-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.292396-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BKFFFBBDYQVT2EBX5C","name":"volume-test"}
{"time":"2026-02-20T05:34:10.29468-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BN13EHHC45Z3NZB0HK","name":"test-app"}
{"time":"2026-02-20T05:34:10.294724-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BNX51DJGQTFXDRVWJ0","name":"env-delete-test"}
{"time":"2026-02-20T05:34:10.294713-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.29531-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
--- PASS: TestCreateAppWithGeneratedKeys (0.10s)
{"time":"2026-02-20T05:34:10.295631-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
--- PASS: TestEnvVarsDelete (0.10s)
{"time":"2026-02-20T05:34:10.295764-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
--- PASS: TestVolumesAddAndRetrieve (0.10s)
{"time":"2026-02-20T05:34:10.296289-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.296314-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.29629-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.296775-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.296973-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.297157-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BQ05R6AZNR387WM5VM","name":"original-name"}
{"time":"2026-02-20T05:34:10.297538-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.29754-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).UpdateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":153},"msg":"app updated","id":"01KHXM41BQ05R6AZNR387WM5VM","name":"updated-name"}
{"time":"2026-02-20T05:34:10.297629-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.297904-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BS23N699NDM2W2XEZ8","name":"label-test"}
{"time":"2026-02-20T05:34:10.298073-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.298123-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BS9XB9GPB59752ZZ9C","name":"volume-delete-test"}
{"time":"2026-02-20T05:34:10.298231-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.29837-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BS5G6GBE21YJBV2C2T","name":"findable-app"}
{"time":"2026-02-20T05:34:10.298424-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.298463-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.298574-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BTT9W0GA293G5Q8PH6","name":"label-delete-test"}
{"time":"2026-02-20T05:34:10.298791-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BTECFRHG867J851FQA","name":"charlie"}
{"time":"2026-02-20T05:34:10.30031-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.30056-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BVXWD6WVACSDP4Q6JV","name":"test-app-full"}
{"time":"2026-02-20T05:34:10.301006-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BW5BNDDZS5K03DAFAK","name":"alpha"}
--- PASS: TestGetApp (0.00s)
    --- PASS: TestGetApp/returns_nil_for_non-existent_app (0.09s)
    --- PASS: TestGetApp/finds_existing_app (0.10s)
--- PASS: TestCreateAppOptionalFields (0.10s)
{"time":"2026-02-20T05:34:10.30158-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BXGR9SWX169TBENBFM","name":"webhook-app"}
--- PASS: TestVolumesDelete (0.10s)
{"time":"2026-02-20T05:34:10.301797-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BT77TPSDMKF6RYYJ3K","name":"to-delete"}
{"time":"2026-02-20T05:34:10.302848-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).DeleteApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":166},"msg":"app deleted","id":"01KHXM41BT77TPSDMKF6RYYJ3K","name":"to-delete"}
{"time":"2026-02-20T05:34:10.302865-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BXBWHG1DRSJ0P6CKES","name":"test-clear"}
{"time":"2026-02-20T05:34:10.303169-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).UpdateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":153},"msg":"app updated","id":"01KHXM41BXBWHG1DRSJ0P6CKES","name":"test-clear"}
--- PASS: TestGetAppByWebhookSecret (0.00s)
    --- PASS: TestGetAppByWebhookSecret/returns_nil_for_invalid_secret (0.08s)
    --- PASS: TestGetAppByWebhookSecret/finds_app_by_webhook_secret (0.09s)
{"time":"2026-02-20T05:34:10.303357-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BYG778V8EZGKEVSGH6","name":"bravo"}
--- PASS: TestDeleteApp (0.00s)
    --- PASS: TestDeleteApp/deletes_app_and_returns_nil_on_lookup (0.09s)
--- PASS: TestLabels (0.00s)
    --- PASS: TestLabels/adds_and_retrieves_labels (0.10s)
    --- PASS: TestLabels/deletes_label (0.10s)
--- PASS: TestUpdateApp (0.00s)
    --- PASS: TestUpdateApp/updates_app_fields (0.10s)
    --- PASS: TestUpdateApp/clears_optional_fields_when_empty (0.10s)
--- PASS: TestListApps (0.00s)
    --- PASS: TestListApps/returns_empty_list_when_no_apps (0.09s)
    --- PASS: TestListApps/returns_all_apps_ordered_by_name (0.10s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/service/app	(cached)
=== RUN   TestSessionCookieSecureFlag
=== PAUSE TestSessionCookieSecureFlag
=== RUN   TestHashPassword
=== PAUSE TestHashPassword
=== RUN   TestVerifyPassword
=== PAUSE TestVerifyPassword
=== RUN   TestIsSetupRequired
=== PAUSE TestIsSetupRequired
=== RUN   TestCreateUser
=== PAUSE TestCreateUser
=== RUN   TestCreateUserRaceCondition
=== PAUSE TestCreateUserRaceCondition
=== RUN   TestAuthenticate
=== PAUSE TestAuthenticate
=== RUN   TestDestroySessionMaxAge
=== PAUSE TestDestroySessionMaxAge
=== CONT  TestSessionCookieSecureFlag
=== RUN   TestSessionCookieSecureFlag/secure_flag_is_true_when_debug_is_false
=== PAUSE TestSessionCookieSecureFlag/secure_flag_is_true_when_debug_is_false
=== CONT  TestDestroySessionMaxAge
=== RUN   TestDestroySessionMaxAge/sets_MaxAge_to_exactly_-1
=== CONT  TestAuthenticate
=== RUN   TestAuthenticate/authenticates_valid_credentials
=== CONT  TestCreateUser
=== RUN   TestCreateUser/creates_user_successfully
=== PAUSE TestCreateUser/creates_user_successfully
=== RUN   TestCreateUser/rejects_duplicate_user
=== CONT  TestIsSetupRequired
=== RUN   TestIsSetupRequired/returns_true_when_no_users_exist
=== PAUSE TestIsSetupRequired/returns_true_when_no_users_exist
=== CONT  TestVerifyPassword
=== RUN   TestVerifyPassword/verifies_correct_password
=== CONT  TestCreateUserRaceCondition
=== RUN   TestCreateUserRaceCondition/concurrent_setup_requests_create_only_one_user
=== PAUSE TestCreateUserRaceCondition/concurrent_setup_requests_create_only_one_user
=== CONT  TestHashPassword
=== RUN   TestHashPassword/hashes_password_successfully
=== PAUSE TestHashPassword/hashes_password_successfully
=== RUN   TestHashPassword/produces_different_hashes_for_same_password
=== PAUSE TestHashPassword/produces_different_hashes_for_same_password
=== PAUSE TestDestroySessionMaxAge/sets_MaxAge_to_exactly_-1
=== PAUSE TestAuthenticate/authenticates_valid_credentials
=== PAUSE TestCreateUser/rejects_duplicate_user
=== CONT  TestIsSetupRequired/returns_true_when_no_users_exist
=== CONT  TestHashPassword/hashes_password_successfully
=== CONT  TestDestroySessionMaxAge/sets_MaxAge_to_exactly_-1
{"time":"2026-02-20T05:34:10.378353-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHashPasswordhashes_password_successfully1387655390/001/upaas.db"}
=== CONT  TestCreateUserRaceCondition/concurrent_setup_requests_create_only_one_user
{"time":"2026-02-20T05:34:10.379027-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDestroySessionMaxAgesets_MaxAge_to_exactly_-11485633018/001/upaas.db"}
{"time":"2026-02-20T05:34:10.380032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateUserRaceConditionconcurrent_setup_requests_create_onl3122237856/001/upaas.db"}
=== RUN   TestAuthenticate/rejects_invalid_password
=== PAUSE TestAuthenticate/rejects_invalid_password
=== RUN   TestAuthenticate/rejects_unknown_user
=== PAUSE TestAuthenticate/rejects_unknown_user
=== CONT  TestSessionCookieSecureFlag/secure_flag_is_true_when_debug_is_false
{"time":"2026-02-20T05:34:10.381134-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.382017-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestIsSetupRequiredreturns_true_when_no_users_exist183939775/001/upaas.db"}
=== CONT  TestAuthenticate/authenticates_valid_credentials
{"time":"2026-02-20T05:34:10.382784-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
=== CONT  TestAuthenticate/rejects_unknown_user
{"time":"2026-02-20T05:34:10.386676-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
=== CONT  TestCreateUser/creates_user_successfully
{"time":"2026-02-20T05:34:10.38728-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAuthenticaterejects_unknown_user3567726174/001/upaas.db"}
{"time":"2026-02-20T05:34:10.387846-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAuthenticateauthenticates_valid_credentials1101131049/001/upaas.db"}
=== CONT  TestAuthenticate/rejects_invalid_password
=== CONT  TestCreateUser/rejects_duplicate_user
{"time":"2026-02-20T05:34:10.388852-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.388919-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateUserrejects_duplicate_user1153535469/001/upaas.db"}
{"time":"2026-02-20T05:34:10.390152-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.393102-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
=== CONT  TestHashPassword/produces_different_hashes_for_same_password
{"time":"2026-02-20T05:34:10.393591-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
=== PAUSE TestVerifyPassword/verifies_correct_password
=== RUN   TestVerifyPassword/rejects_incorrect_password
=== PAUSE TestVerifyPassword/rejects_incorrect_password
=== RUN   TestVerifyPassword/rejects_empty_password
=== PAUSE TestVerifyPassword/rejects_empty_password
=== RUN   TestVerifyPassword/rejects_invalid_hash_format
=== PAUSE TestVerifyPassword/rejects_invalid_hash_format
=== CONT  TestVerifyPassword/rejects_incorrect_password
=== CONT  TestVerifyPassword/rejects_invalid_hash_format
=== CONT  TestVerifyPassword/verifies_correct_password
{"time":"2026-02-20T05:34:10.394954-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVerifyPasswordrejects_incorrect_password3639795686/001/upaas.db"}
{"time":"2026-02-20T05:34:10.395607-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVerifyPasswordverifies_correct_password2245656040/001/upaas.db"}
=== CONT  TestVerifyPassword/rejects_empty_password
{"time":"2026-02-20T05:34:10.396091-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestSessionCookieSecureFlagsecure_flag_is_true_when_debug_is_fa228695512/001/upaas.db"}
{"time":"2026-02-20T05:34:10.396794-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVerifyPasswordrejects_invalid_hash_format815851559/001/upaas.db"}
{"time":"2026-02-20T05:34:10.406966-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVerifyPasswordrejects_empty_password626349138/001/upaas.db"}
{"time":"2026-02-20T05:34:10.407134-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.408236-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.408334-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.408936-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.409314-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.410245-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.419454-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.421256-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHashPasswordproduces_different_hashes_for_same_password4176058131/001/upaas.db"}
{"time":"2026-02-20T05:34:10.42123-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.421725-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.422179-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestIsSetupRequired (0.00s)
    --- PASS: TestIsSetupRequired/returns_true_when_no_users_exist (0.05s)
{"time":"2026-02-20T05:34:10.423225-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.424216-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.42494-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.426222-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.426608-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.427107-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.427438-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.42776-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.428255-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.42849-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
--- PASS: TestDestroySessionMaxAge (0.00s)
    --- PASS: TestDestroySessionMaxAge/sets_MaxAge_to_exactly_-1 (0.05s)
{"time":"2026-02-20T05:34:10.430215-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.430909-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.431316-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.431662-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.431945-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.432148-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.442847-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.443428-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.443685-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.443917-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.444067-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.44422-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.447067-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.447739-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.447918-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.448163-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.448288-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAuthenticaterejects_invalid_password1796847418/001/upaas.db"}
{"time":"2026-02-20T05:34:10.448323-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.450209-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.450767-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.45093-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.451168-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.451519-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.459443-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.459805-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateUsercreates_user_successfully4136041574/001/upaas.db"}
{"time":"2026-02-20T05:34:10.460571-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.462288-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.462738-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.462861-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.463367-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.463766-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.465356-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.465429-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.465626-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.466728-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.468026-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.468475-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.468488-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.469002-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.469173-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.469393-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.469544-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.468058-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.47017-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.471049-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.471583-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.47392-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.475009-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.475187-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.475356-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.476075-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.476363-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.476773-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.480169-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.480359-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.480517-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.483839-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.484335-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.485345-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.485559-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.485741-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.532241-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.5326-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.533945-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.534311-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.741336-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin3"}
{"time":"2026-02-20T05:34:10.759892-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.785051-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.801515-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
{"time":"2026-02-20T05:34:10.881322-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
--- PASS: TestCreateUserRaceCondition (0.00s)
    --- PASS: TestCreateUserRaceCondition/concurrent_setup_requests_create_only_one_user (0.52s)
{"time":"2026-02-20T05:34:10.922252-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"}
--- PASS: TestHashPassword (0.00s)
    --- PASS: TestHashPassword/hashes_password_successfully (0.36s)
    --- PASS: TestHashPassword/produces_different_hashes_for_same_password (0.55s)
--- PASS: TestAuthenticate (0.01s)
    --- PASS: TestAuthenticate/rejects_unknown_user (0.10s)
    --- PASS: TestAuthenticate/authenticates_valid_credentials (0.58s)
    --- PASS: TestAuthenticate/rejects_invalid_password (0.58s)
--- PASS: TestVerifyPassword (0.02s)
    --- PASS: TestVerifyPassword/rejects_invalid_hash_format (0.07s)
    --- PASS: TestVerifyPassword/verifies_correct_password (0.57s)
    --- PASS: TestVerifyPassword/rejects_empty_password (0.57s)
    --- PASS: TestVerifyPassword/rejects_incorrect_password (0.60s)
--- PASS: TestSessionCookieSecureFlag (0.00s)
    --- PASS: TestSessionCookieSecureFlag/secure_flag_is_true_when_debug_is_false (0.62s)
--- PASS: TestCreateUser (0.00s)
    --- PASS: TestCreateUser/creates_user_successfully (0.40s)
    --- PASS: TestCreateUser/rejects_duplicate_user (0.64s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/service/auth	(cached)
=== RUN   TestCancelActiveDeploy_NoExisting
=== PAUSE TestCancelActiveDeploy_NoExisting
=== RUN   TestCancelActiveDeploy_CancelsAndWaits
=== PAUSE TestCancelActiveDeploy_CancelsAndWaits
=== RUN   TestCancelActiveDeploy_BlocksUntilDone
=== PAUSE TestCancelActiveDeploy_BlocksUntilDone
=== RUN   TestTryLockApp_PreventsConcurrent
=== PAUSE TestTryLockApp_PreventsConcurrent
=== RUN   TestCancelActiveDeploy_AllowsNewDeploy
=== PAUSE TestCancelActiveDeploy_AllowsNewDeploy
=== RUN   TestCleanupCancelledDeploy_RemovesBuildDir
=== PAUSE TestCleanupCancelledDeploy_RemovesBuildDir
=== RUN   TestCleanupCancelledDeploy_NoBuildDir
=== PAUSE TestCleanupCancelledDeploy_NoBuildDir
=== CONT  TestCancelActiveDeploy_BlocksUntilDone
2026/02/20 05:34:10 INFO cancelling in-progress deployment app_id=app-2
=== CONT  TestTryLockApp_PreventsConcurrent
--- PASS: TestTryLockApp_PreventsConcurrent (0.00s)
=== CONT  TestCancelActiveDeploy_AllowsNewDeploy
2026/02/20 05:34:10 INFO cancelling in-progress deployment app_id=app-3
=== CONT  TestCancelActiveDeploy_CancelsAndWaits
2026/02/20 05:34:10 INFO cancelling in-progress deployment app_id=app-1
--- PASS: TestCancelActiveDeploy_CancelsAndWaits (0.00s)
--- PASS: TestCancelActiveDeploy_AllowsNewDeploy (0.00s)
=== CONT  TestCancelActiveDeploy_NoExisting
--- PASS: TestCancelActiveDeploy_NoExisting (0.00s)
=== CONT  TestCleanupCancelledDeploy_RemovesBuildDir
=== CONT  TestCleanupCancelledDeploy_NoBuildDir
--- PASS: TestCleanupCancelledDeploy_NoBuildDir (0.00s)
--- PASS: TestCleanupCancelledDeploy_RemovesBuildDir (0.00s)
--- PASS: TestCancelActiveDeploy_BlocksUntilDone (0.05s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/service/deploy	(cached)
?   	git.eeqj.de/sneak/upaas/internal/service/notify	[no test files]
=== RUN   TestExtractBranch
=== PAUSE TestExtractBranch
=== RUN   TestHandleWebhookMatchingBranch
=== PAUSE TestHandleWebhookMatchingBranch
=== RUN   TestHandleWebhookNonMatchingBranch
=== PAUSE TestHandleWebhookNonMatchingBranch
=== RUN   TestHandleWebhookInvalidJSON
=== PAUSE TestHandleWebhookInvalidJSON
=== RUN   TestHandleWebhookEmptyPayload
=== PAUSE TestHandleWebhookEmptyPayload
=== RUN   TestGiteaPushPayloadParsing
=== PAUSE TestGiteaPushPayloadParsing
=== RUN   TestSetupTestService
=== PAUSE TestSetupTestService
=== CONT  TestHandleWebhookNonMatchingBranch
=== CONT  TestHandleWebhookEmptyPayload
=== CONT  TestHandleWebhookMatchingBranch
=== CONT  TestSetupTestService
=== RUN   TestSetupTestService/creates_working_test_service
=== PAUSE TestSetupTestService/creates_working_test_service
=== CONT  TestGiteaPushPayloadParsing
=== RUN   TestGiteaPushPayloadParsing/parses_full_payload
=== PAUSE TestGiteaPushPayloadParsing/parses_full_payload
=== CONT  TestSetupTestService/creates_working_test_service
=== CONT  TestGiteaPushPayloadParsing/parses_full_payload
=== CONT  TestHandleWebhookInvalidJSON
=== CONT  TestExtractBranch
=== RUN   TestExtractBranch/extracts_main_branch
=== PAUSE TestExtractBranch/extracts_main_branch
=== RUN   TestExtractBranch/extracts_feature_branch
=== PAUSE TestExtractBranch/extracts_feature_branch
=== RUN   TestExtractBranch/extracts_develop_branch
=== PAUSE TestExtractBranch/extracts_develop_branch
=== RUN   TestExtractBranch/returns_raw_ref_if_no_prefix
=== PAUSE TestExtractBranch/returns_raw_ref_if_no_prefix
=== RUN   TestExtractBranch/handles_empty_ref
=== PAUSE TestExtractBranch/handles_empty_ref
=== RUN   TestExtractBranch/handles_partial_prefix
=== PAUSE TestExtractBranch/handles_partial_prefix
=== CONT  TestExtractBranch/extracts_main_branch
--- PASS: TestGiteaPushPayloadParsing (0.00s)
    --- PASS: TestGiteaPushPayloadParsing/parses_full_payload (0.00s)
=== CONT  TestExtractBranch/handles_empty_ref
=== CONT  TestExtractBranch/extracts_develop_branch
=== CONT  TestExtractBranch/returns_raw_ref_if_no_prefix
=== CONT  TestExtractBranch/handles_partial_prefix
=== CONT  TestExtractBranch/extracts_feature_branch
{"time":"2026-02-20T05:34:10.730432-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookEmptyPayload1899348622/001/upaas.db"}
{"time":"2026-02-20T05:34:10.730437-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_develop_branch3666736167/001/upaas.db"}
{"time":"2026-02-20T05:34:10.731344-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchreturns_raw_ref_if_no_prefix4016744044/001/upaas.db"}
{"time":"2026-02-20T05:34:10.731625-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchhandles_empty_ref484141681/001/upaas.db"}
{"time":"2026-02-20T05:34:10.731613-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookMatchingBranch1917234251/001/upaas.db"}
{"time":"2026-02-20T05:34:10.731462-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_main_branch2594283243/001/upaas.db"}
{"time":"2026-02-20T05:34:10.731768-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_feature_branch881418541/001/upaas.db"}
{"time":"2026-02-20T05:34:10.731801-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestSetupTestServicecreates_working_test_service970206388/001/upaas.db"}
{"time":"2026-02-20T05:34:10.731917-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchhandles_partial_prefix3272899025/001/upaas.db"}
{"time":"2026-02-20T05:34:10.732111-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookInvalidJSON2200266918/001/upaas.db"}
{"time":"2026-02-20T05:34:10.733223-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookNonMatchingBranch2945905381/001/upaas.db"}
{"time":"2026-02-20T05:34:10.736129-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.738352-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.738575-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.750483-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.750684-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.751561-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.752316-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.753418-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.75353-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.753822-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.754032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.754383-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.754385-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.754497-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.754568-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.755828-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.763178-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.763179-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.764329-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.764624-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.766613-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.767247-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.767446-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.769496-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.769623-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.769787-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.770061-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.770091-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.770146-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.771023-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.771319-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.772537-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.772622-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.772694-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.773154-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.773295-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.773308-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.773406-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.77337-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.773469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"main","matched":true,"commit":""}
{"time":"2026-02-20T05:34:10.773817-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.773723-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.774037-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.774215-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"","matched":true,"commit":""}
{"time":"2026-02-20T05:34:10.774406-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"develop","matched":true,"commit":""}
{"time":"2026-02-20T05:34:10.774588-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: docker client not connected"}
{"time":"2026-02-20T05:34:10.774709-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.775081-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.775414-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: invalid branch name: \"\""}
{"time":"2026-02-20T05:34:10.775436-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchreturns_raw_ref_if_no_prefix4016744044/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.775556-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: docker client not connected"}
{"time":"2026-02-20T05:34:10.77578-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: docker client not connected","app":"test-app"}
{"time":"2026-02-20T05:34:10.775842-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchhandles_empty_ref484141681/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.776068-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_develop_branch3666736167/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.77611-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: invalid branch name: \"\"","app":"test-app"}
{"time":"2026-02-20T05:34:10.776246-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: docker client not connected","app":"test-app"}
{"time":"2026-02-20T05:34:10.778103-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.778699-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.778885-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.778979-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.779644-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.779645-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.780232-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.780245-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.780291-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.780702-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.780787-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.780905-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.78097-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.781329-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.781372-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"main","matched":true,"commit":"abc123def456"}
{"time":"2026-02-20T05:34:10.781421-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"develop","matched":false,"commit":"def789ghi012"}
{"time":"2026-02-20T05:34:10.781802-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.782373-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestHandleWebhookNonMatchingBranch (0.06s)
{"time":"2026-02-20T05:34:10.782713-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.782771-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.784049-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.784643-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.784683-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"}
{"time":"2026-02-20T05:34:10.784082-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.784801-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"","matched":false,"commit":""}
{"time":"2026-02-20T05:34:10.784421-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.784345-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.785088-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"feature/new-feature","matched":true,"commit":""}
{"time":"2026-02-20T05:34:10.785167-08:00","level":"WARN","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":89},"msg":"failed to parse webhook payload","error":"invalid character 'i' looking for beginning of object key string"}
{"time":"2026-02-20T05:34:10.785276-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
{"time":"2026-02-20T05:34:10.784206-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: invalid commit SHA: \"abc123def456\""}
{"time":"2026-02-20T05:34:10.786003-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: docker client not connected"}
--- PASS: TestHandleWebhookEmptyPayload (0.06s)
{"time":"2026-02-20T05:34:10.78602-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.786201-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"","matched":false,"commit":""}
{"time":"2026-02-20T05:34:10.786317-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"","matched":true,"commit":""}
{"time":"2026-02-20T05:34:10.786392-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"}
{"time":"2026-02-20T05:34:10.786504-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_feature_branch881418541/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.786655-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookMatchingBranch1917234251/001/logs/Mac.lan guest wan/test-app/test-app_abc123def456_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.786937-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"main","matched":true,"commit":""}
{"time":"2026-02-20T05:34:10.786998-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"}
{"time":"2026-02-20T05:34:10.787134-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: docker client not connected","app":"test-app"}
{"time":"2026-02-20T05:34:10.787141-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: invalid commit SHA: \"abc123def456\"","app":"test-app"}
{"time":"2026-02-20T05:34:10.788471-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"}
{"time":"2026-02-20T05:34:10.788504-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: docker client not connected"}
--- PASS: TestHandleWebhookInvalidJSON (0.06s)
{"time":"2026-02-20T05:34:10.788511-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: invalid branch name: \"\""}
{"time":"2026-02-20T05:34:10.78881-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"}
{"time":"2026-02-20T05:34:10.789076-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"}
{"time":"2026-02-20T05:34:10.789323-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"}
--- PASS: TestSetupTestService (0.00s)
    --- PASS: TestSetupTestService/creates_working_test_service (0.06s)
{"time":"2026-02-20T05:34:10.789858-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchhandles_partial_prefix3272899025/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.78997-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_main_branch2594283243/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"}
{"time":"2026-02-20T05:34:10.790255-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: invalid branch name: \"\"","app":"test-app"}
{"time":"2026-02-20T05:34:10.790261-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: docker client not connected","app":"test-app"}
--- PASS: TestHandleWebhookMatchingBranch (0.16s)
--- PASS: TestExtractBranch (0.00s)
    --- PASS: TestExtractBranch/returns_raw_ref_if_no_prefix (0.15s)
    --- PASS: TestExtractBranch/handles_empty_ref (0.15s)
    --- PASS: TestExtractBranch/extracts_develop_branch (0.15s)
    --- PASS: TestExtractBranch/extracts_feature_branch (0.16s)
    --- PASS: TestExtractBranch/extracts_main_branch (0.16s)
    --- PASS: TestExtractBranch/handles_partial_prefix (0.16s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/service/webhook	(cached)
=== RUN   TestGenerateKeyPair
=== PAUSE TestGenerateKeyPair
=== RUN   TestValidatePrivateKey
=== PAUSE TestValidatePrivateKey
=== CONT  TestValidatePrivateKey
=== RUN   TestValidatePrivateKey/validates_generated_key
=== PAUSE TestValidatePrivateKey/validates_generated_key
=== RUN   TestValidatePrivateKey/rejects_invalid_key
=== PAUSE TestValidatePrivateKey/rejects_invalid_key
=== RUN   TestValidatePrivateKey/rejects_empty_key
=== PAUSE TestValidatePrivateKey/rejects_empty_key
=== CONT  TestGenerateKeyPair
=== CONT  TestValidatePrivateKey/rejects_invalid_key
=== CONT  TestValidatePrivateKey/rejects_empty_key
=== CONT  TestValidatePrivateKey/validates_generated_key
=== RUN   TestGenerateKeyPair/generates_valid_key_pair
=== PAUSE TestGenerateKeyPair/generates_valid_key_pair
=== RUN   TestGenerateKeyPair/generates_unique_keys_each_time
=== PAUSE TestGenerateKeyPair/generates_unique_keys_each_time
=== CONT  TestGenerateKeyPair/generates_valid_key_pair
=== CONT  TestGenerateKeyPair/generates_unique_keys_each_time
--- PASS: TestValidatePrivateKey (0.00s)
    --- PASS: TestValidatePrivateKey/rejects_invalid_key (0.00s)
    --- PASS: TestValidatePrivateKey/rejects_empty_key (0.00s)
    --- PASS: TestValidatePrivateKey/validates_generated_key (0.01s)
--- PASS: TestGenerateKeyPair (0.00s)
    --- PASS: TestGenerateKeyPair/generates_valid_key_pair (0.01s)
    --- PASS: TestGenerateKeyPair/generates_unique_keys_each_time (0.01s)
PASS
ok  	git.eeqj.de/sneak/upaas/internal/ssh	(cached)
?   	git.eeqj.de/sneak/upaas/static	[no test files]
?   	git.eeqj.de/sneak/upaas/templates	[no test files]
==> Building...
go build -ldflags "-X main.Version=956a06b -X main.Buildarch=arm64" -o /dev/null ./cmd/upaasd
==> All checks passed!
## `make check` output ``` ==> Checking formatting... ==> Running linter... golangci-lint run --config .golangci.yml ./... 0 issues. ==> Running tests... go test -v -race ./... ? git.eeqj.de/sneak/upaas/cmd/upaasd [no test files] ? git.eeqj.de/sneak/upaas/internal/config [no test files] === RUN TestHashWebhookSecret === PAUSE TestHashWebhookSecret === CONT TestHashWebhookSecret --- PASS: TestHashWebhookSecret (0.00s) PASS ok git.eeqj.de/sneak/upaas/internal/database (cached) === RUN TestValidBranchRegex === PAUSE TestValidBranchRegex === RUN TestValidCommitSHARegex === PAUSE TestValidCommitSHARegex === RUN TestCloneRepoRejectsInjection === PAUSE TestCloneRepoRejectsInjection === CONT TestValidBranchRegex === CONT TestValidCommitSHARegex --- PASS: TestValidBranchRegex (0.00s) --- PASS: TestValidCommitSHARegex (0.00s) === CONT TestCloneRepoRejectsInjection === RUN TestCloneRepoRejectsInjection/shell_injection_in_branch === PAUSE TestCloneRepoRejectsInjection/shell_injection_in_branch === RUN TestCloneRepoRejectsInjection/command_substitution_in_branch === PAUSE TestCloneRepoRejectsInjection/command_substitution_in_branch === RUN TestCloneRepoRejectsInjection/backtick_injection_in_branch === PAUSE TestCloneRepoRejectsInjection/backtick_injection_in_branch === RUN TestCloneRepoRejectsInjection/injection_in_commitSHA === PAUSE TestCloneRepoRejectsInjection/injection_in_commitSHA === RUN TestCloneRepoRejectsInjection/short_SHA_rejected === PAUSE TestCloneRepoRejectsInjection/short_SHA_rejected === RUN TestCloneRepoRejectsInjection/valid_inputs_pass_validation_(hit_NotConnected) === PAUSE TestCloneRepoRejectsInjection/valid_inputs_pass_validation_(hit_NotConnected) === RUN TestCloneRepoRejectsInjection/valid_branch_no_SHA_passes_validation_(hit_NotConnected) === PAUSE TestCloneRepoRejectsInjection/valid_branch_no_SHA_passes_validation_(hit_NotConnected) === CONT TestCloneRepoRejectsInjection/injection_in_commitSHA === CONT TestCloneRepoRejectsInjection/short_SHA_rejected === CONT TestCloneRepoRejectsInjection/valid_inputs_pass_validation_(hit_NotConnected) === CONT TestCloneRepoRejectsInjection/valid_branch_no_SHA_passes_validation_(hit_NotConnected) === CONT TestCloneRepoRejectsInjection/command_substitution_in_branch === CONT TestCloneRepoRejectsInjection/shell_injection_in_branch === CONT TestCloneRepoRejectsInjection/backtick_injection_in_branch --- PASS: TestCloneRepoRejectsInjection (0.00s) --- PASS: TestCloneRepoRejectsInjection/injection_in_commitSHA (0.00s) --- PASS: TestCloneRepoRejectsInjection/short_SHA_rejected (0.00s) --- PASS: TestCloneRepoRejectsInjection/valid_inputs_pass_validation_(hit_NotConnected) (0.00s) --- PASS: TestCloneRepoRejectsInjection/valid_branch_no_SHA_passes_validation_(hit_NotConnected) (0.00s) --- PASS: TestCloneRepoRejectsInjection/command_substitution_in_branch (0.00s) --- PASS: TestCloneRepoRejectsInjection/backtick_injection_in_branch (0.00s) --- PASS: TestCloneRepoRejectsInjection/shell_injection_in_branch (0.00s) PASS ok git.eeqj.de/sneak/upaas/internal/docker (cached) ? git.eeqj.de/sneak/upaas/internal/globals [no test files] === RUN TestValidateAppName === PAUSE TestValidateAppName === RUN TestParsePortValues === PAUSE TestParsePortValues === RUN TestValidateVolumePath === PAUSE TestValidateVolumePath === RUN TestAPILoginSuccess === PAUSE TestAPILoginSuccess === RUN TestAPILoginInvalidCredentials === PAUSE TestAPILoginInvalidCredentials === RUN TestAPILoginMissingFields === PAUSE TestAPILoginMissingFields === RUN TestAPIRejectsUnauthenticated === PAUSE TestAPIRejectsUnauthenticated === RUN TestAPIWhoAmI === PAUSE TestAPIWhoAmI === RUN TestAPIListAppsEmpty === PAUSE TestAPIListAppsEmpty === RUN TestAPICreateApp === PAUSE TestAPICreateApp === RUN TestAPICreateAppValidation === PAUSE TestAPICreateAppValidation === RUN TestAPIGetApp === PAUSE TestAPIGetApp === RUN TestAPIGetAppNotFound === PAUSE TestAPIGetAppNotFound === RUN TestAPIDeleteApp === PAUSE TestAPIDeleteApp === RUN TestAPIListDeployments === PAUSE TestAPIListDeployments === RUN TestAPICSRFRejectsPostWithoutHeader === PAUSE TestAPICSRFRejectsPostWithoutHeader === RUN TestAPICSRFAllowsGetWithoutHeader === PAUSE TestAPICSRFAllowsGetWithoutHeader === RUN TestHandleHealthCheck === PAUSE TestHandleHealthCheck === RUN TestHandleSetupGET === PAUSE TestHandleSetupGET === RUN TestHandleSetupPOSTCreatesUserAndRedirects === PAUSE TestHandleSetupPOSTCreatesUserAndRedirects === RUN TestHandleSetupPOSTRejectsEmptyUsername === PAUSE TestHandleSetupPOSTRejectsEmptyUsername === RUN TestHandleSetupPOSTRejectsShortPassword === PAUSE TestHandleSetupPOSTRejectsShortPassword === RUN TestHandleSetupPOSTRejectsMismatchedPasswords === PAUSE TestHandleSetupPOSTRejectsMismatchedPasswords === RUN TestHandleLoginGET === PAUSE TestHandleLoginGET === RUN TestHandleLoginPOSTAuthenticatesValidCredentials === PAUSE TestHandleLoginPOSTAuthenticatesValidCredentials === RUN TestHandleLoginPOSTRejectsInvalidCredentials === PAUSE TestHandleLoginPOSTRejectsInvalidCredentials === RUN TestHandleDashboard === PAUSE TestHandleDashboard === RUN TestHandleAppNew === PAUSE TestHandleAppNew === RUN TestHandleWebhookRejectsOversizedBody === PAUSE TestHandleWebhookRejectsOversizedBody === RUN TestDeleteEnvVarOwnershipVerification === PAUSE TestDeleteEnvVarOwnershipVerification === RUN TestDeleteLabelOwnershipVerification === PAUSE TestDeleteLabelOwnershipVerification === RUN TestDeleteVolumeOwnershipVerification === PAUSE TestDeleteVolumeOwnershipVerification === RUN TestDeletePortOwnershipVerification === PAUSE TestDeletePortOwnershipVerification === RUN TestHandleEnvVarDeleteUsesCorrectRouteParam === PAUSE TestHandleEnvVarDeleteUsesCorrectRouteParam === RUN TestHandleVolumeAddValidatesPaths === PAUSE TestHandleVolumeAddValidatesPaths === RUN TestSetupRequiredExemptsHealthAndStaticAndAPI === PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI === RUN TestAPITriggerDeployUsesDetachedContext === PAUSE TestAPITriggerDeployUsesDetachedContext === RUN TestHandleCancelDeployRedirects === PAUSE TestHandleCancelDeployRedirects === RUN TestHandleCancelDeployReturns404ForUnknownApp === PAUSE TestHandleCancelDeployReturns404ForUnknownApp === RUN TestHandleWebhookReturns404ForUnknownSecret === PAUSE TestHandleWebhookReturns404ForUnknownSecret === RUN TestHandleWebhookProcessesValidWebhook === PAUSE TestHandleWebhookProcessesValidWebhook === RUN TestRenderTemplateBuffersOutput === PAUSE TestRenderTemplateBuffersOutput === RUN TestDashboardRenderTemplateBuffersOutput === PAUSE TestDashboardRenderTemplateBuffersOutput === RUN TestLoginRenderTemplateBuffersOutput === PAUSE TestLoginRenderTemplateBuffersOutput === RUN TestValidateRepoURL === PAUSE TestValidateRepoURL === RUN TestSanitizeLogs === PAUSE TestSanitizeLogs === RUN TestSanitizeTail === PAUSE TestSanitizeTail === CONT TestParsePortValues === CONT TestHandleVolumeAddValidatesPaths === CONT TestSanitizeTail === CONT TestHandleSetupGET === CONT TestHandleHealthCheck === RUN TestSanitizeTail/empty_uses_default === CONT TestAPILoginInvalidCredentials === CONT TestValidateRepoURL === RUN TestValidateRepoURL/https_URL === CONT TestAPILoginSuccess === CONT TestAPIRejectsUnauthenticated === CONT TestValidateVolumePath === PAUSE TestValidateRepoURL/https_URL === RUN TestHandleHealthCheck/returns_health_check_response === RUN TestParsePortValues/valid_ports === RUN TestHandleSetupGET/renders_setup_page === PAUSE TestParsePortValues/valid_ports === PAUSE TestHandleSetupGET/renders_setup_page === CONT TestSetupRequiredExemptsHealthAndStaticAndAPI === RUN TestValidateVolumePath/valid_absolute_path === CONT TestDeleteVolumeOwnershipVerification === PAUSE TestValidateVolumePath/valid_absolute_path === CONT TestHandleLoginPOSTAuthenticatesValidCredentials === CONT TestHandleEnvVarDeleteUsesCorrectRouteParam === CONT TestHandleLoginGET === RUN TestValidateVolumePath/root_path === RUN TestHandleLoginGET/renders_login_page === CONT TestHandleSetupPOSTRejectsMismatchedPasswords === CONT TestHandleSetupPOSTCreatesUserAndRedirects === CONT TestHandleSetupPOSTRejectsShortPassword === CONT TestAPICSRFAllowsGetWithoutHeader === CONT TestAPICSRFRejectsPostWithoutHeader === CONT TestAPIDeleteApp === CONT TestAPIGetAppNotFound === CONT TestAPIListDeployments === CONT TestAPICreateAppValidation === CONT TestAPIGetApp === CONT TestAPIListAppsEmpty === CONT TestAPIWhoAmI === CONT TestAPICreateApp === CONT TestAPILoginMissingFields === CONT TestHandleCancelDeployRedirects === CONT TestDeletePortOwnershipVerification === PAUSE TestHandleHealthCheck/returns_health_check_response === RUN TestValidateRepoURL/http_URL === PAUSE TestSanitizeTail/empty_uses_default === RUN TestParsePortValues/port_1 === CONT TestSanitizeLogs === PAUSE TestValidateVolumePath/root_path === RUN TestSanitizeTail/valid_small_number === CONT TestHandleSetupPOSTRejectsEmptyUsername === PAUSE TestHandleLoginGET/renders_login_page === CONT TestDeleteLabelOwnershipVerification === PAUSE TestValidateRepoURL/http_URL === RUN TestValidateVolumePath/empty_path === CONT TestHandleAppNew === PAUSE TestParsePortValues/port_1 === PAUSE TestSanitizeTail/valid_small_number === RUN TestSanitizeLogs/plain_text_unchanged === PAUSE TestValidateVolumePath/empty_path === PAUSE TestSanitizeLogs/plain_text_unchanged === RUN TestSanitizeTail/valid_max_boundary === RUN TestSanitizeLogs/strips_ANSI_color_codes === RUN TestValidateVolumePath/relative_path === PAUSE TestSanitizeTail/valid_max_boundary === RUN TestParsePortValues/port_65535 === RUN TestSanitizeTail/exceeds_max_clamped === PAUSE TestSanitizeLogs/strips_ANSI_color_codes === PAUSE TestParsePortValues/port_65535 === PAUSE TestValidateVolumePath/relative_path === PAUSE TestSanitizeTail/exceeds_max_clamped === RUN TestValidateVolumePath/path_with_dotdot === RUN TestHandleAppNew/renders_new_app_form === RUN TestSanitizeTail/very_large_clamped === PAUSE TestValidateVolumePath/path_with_dotdot === PAUSE TestHandleAppNew/renders_new_app_form === RUN TestValidateVolumePath/path_with_trailing_slash === CONT TestDeleteEnvVarOwnershipVerification === PAUSE TestSanitizeTail/very_large_clamped === RUN TestSanitizeLogs/strips_OSC_sequences === RUN TestSanitizeTail/non-numeric_uses_default === RUN TestParsePortValues/host_port_above_65535 === PAUSE TestSanitizeTail/non-numeric_uses_default === PAUSE TestSanitizeLogs/strips_OSC_sequences === PAUSE TestValidateVolumePath/path_with_trailing_slash === RUN TestSanitizeLogs/strips_null_bytes === PAUSE TestSanitizeLogs/strips_null_bytes === RUN TestValidateVolumePath/path_with_double_slash === RUN TestSanitizeTail/all_keyword_uses_default === RUN TestSanitizeLogs/strips_bell_characters === PAUSE TestSanitizeLogs/strips_bell_characters === PAUSE TestSanitizeTail/all_keyword_uses_default === PAUSE TestValidateVolumePath/path_with_double_slash === RUN TestSanitizeLogs/preserves_tabs === RUN TestSanitizeTail/negative_uses_default === PAUSE TestSanitizeLogs/preserves_tabs === PAUSE TestParsePortValues/host_port_above_65535 === PAUSE TestSanitizeTail/negative_uses_default === RUN TestValidateVolumePath/single_dot_path === RUN TestParsePortValues/container_port_above_65535 === RUN TestSanitizeLogs/preserves_carriage_returns === RUN TestSanitizeTail/zero_uses_default === PAUSE TestSanitizeLogs/preserves_carriage_returns === RUN TestSanitizeLogs/strips_mixed_escape_sequences === PAUSE TestParsePortValues/container_port_above_65535 === PAUSE TestSanitizeLogs/strips_mixed_escape_sequences === PAUSE TestValidateVolumePath/single_dot_path === PAUSE TestSanitizeTail/zero_uses_default === RUN TestSanitizeTail/float_uses_default === PAUSE TestSanitizeTail/float_uses_default === CONT TestHandleWebhookRejectsOversizedBody === RUN TestParsePortValues/both_ports_above_65535 === RUN TestValidateRepoURL/ssh_URL === PAUSE TestValidateRepoURL/ssh_URL === RUN TestValidateRepoURL/git_URL === PAUSE TestParsePortValues/both_ports_above_65535 === RUN TestParsePortValues/zero_port === PAUSE TestParsePortValues/zero_port === RUN TestSanitizeLogs/empty_string === RUN TestParsePortValues/negative_port === PAUSE TestValidateRepoURL/git_URL === RUN TestSanitizeTail/one_is_valid === RUN TestValidateRepoURL/SCP-like_URL === PAUSE TestSanitizeLogs/empty_string === PAUSE TestParsePortValues/negative_port === RUN TestSanitizeLogs/only_control_characters === RUN TestParsePortValues/non-numeric === PAUSE TestSanitizeTail/one_is_valid === PAUSE TestParsePortValues/non-numeric === CONT TestHandleDashboard === RUN TestHandleDashboard/renders_dashboard_with_app_list === PAUSE TestHandleDashboard/renders_dashboard_with_app_list === CONT TestHandleCancelDeployReturns404ForUnknownApp === PAUSE TestValidateRepoURL/SCP-like_URL === CONT TestDashboardRenderTemplateBuffersOutput === RUN TestValidateRepoURL/SCP-like_with_dots === PAUSE TestValidateRepoURL/SCP-like_with_dots === RUN TestValidateRepoURL/https_without_.git === PAUSE TestSanitizeLogs/only_control_characters === PAUSE TestValidateRepoURL/https_without_.git === RUN TestSanitizeLogs/cursor_movement_sequences_stripped === RUN TestValidateRepoURL/https_with_port {"time":"2026-02-20T05:34:09.885114-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPILoginInvalidCredentials3637586180/001/upaas.db"} {"time":"2026-02-20T05:34:09.885101-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleLoginPOSTAuthenticatesValidCredentials1954538699/001/upaas.db"} {"time":"2026-02-20T05:34:09.886339-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPILoginSuccess506354823/001/upaas.db"} {"time":"2026-02-20T05:34:09.886373-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestSetupRequiredExemptsHealthAndStaticAndAPI2896974164/001/upaas.db"} {"time":"2026-02-20T05:34:09.885356-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupPOSTRejectsMismatchedPasswords4075103472/001/upaas.db"} === PAUSE TestValidateRepoURL/https_with_port {"time":"2026-02-20T05:34:09.886469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPICSRFRejectsPostWithoutHeader1749824187/001/upaas.db"} === PAUSE TestSanitizeLogs/cursor_movement_sequences_stripped === RUN TestValidateRepoURL/empty_string {"time":"2026-02-20T05:34:09.886578-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleVolumeAddValidatesPaths3346679357/001/upaas.db"} === PAUSE TestValidateRepoURL/empty_string === CONT TestLoginRenderTemplateBuffersOutput {"time":"2026-02-20T05:34:09.886566-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIListDeployments3518306423/001/upaas.db"} === RUN TestValidateRepoURL/whitespace_only === PAUSE TestValidateRepoURL/whitespace_only === RUN TestValidateRepoURL/file_URL === PAUSE TestValidateRepoURL/file_URL === RUN TestValidateRepoURL/file_URL_uppercase === PAUSE TestValidateRepoURL/file_URL_uppercase === RUN TestValidateRepoURL/bare_path === PAUSE TestValidateRepoURL/bare_path === RUN TestValidateRepoURL/relative_path === PAUSE TestValidateRepoURL/relative_path === RUN TestValidateRepoURL/just_a_word {"time":"2026-02-20T05:34:09.886931-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPICSRFAllowsGetWithoutHeader1699710319/001/upaas.db"} === PAUSE TestValidateRepoURL/just_a_word === RUN TestValidateRepoURL/ftp_URL {"time":"2026-02-20T05:34:09.88712-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeleteVolumeOwnershipVerification1251471081/001/upaas.db"} === PAUSE TestValidateRepoURL/ftp_URL === RUN TestValidateRepoURL/no_host_https === PAUSE TestValidateRepoURL/no_host_https === RUN TestValidateRepoURL/no_path_https === PAUSE TestValidateRepoURL/no_path_https === RUN TestValidateRepoURL/no_path_https_trailing_slash === PAUSE TestValidateRepoURL/no_path_https_trailing_slash {"time":"2026-02-20T05:34:09.887402-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupPOSTCreatesUserAndRedirects2915564442/001/upaas.db"} === RUN TestValidateRepoURL/SCP-like_non-git_user === PAUSE TestValidateRepoURL/SCP-like_non-git_user === RUN TestValidateRepoURL/SCP-like_arbitrary_user === PAUSE TestValidateRepoURL/SCP-like_arbitrary_user === RUN TestValidateRepoURL/path_traversal_SCP === PAUSE TestValidateRepoURL/path_traversal_SCP === RUN TestValidateRepoURL/path_traversal_https {"time":"2026-02-20T05:34:09.887744-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIRejectsUnauthenticated2393060754/001/upaas.db"} === PAUSE TestValidateRepoURL/path_traversal_https === RUN TestValidateRepoURL/path_traversal_in_middle === PAUSE TestValidateRepoURL/path_traversal_in_middle === CONT TestRenderTemplateBuffersOutput {"time":"2026-02-20T05:34:09.889025-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPILoginMissingFields704432025/001/upaas.db"} {"time":"2026-02-20T05:34:09.889816-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIGetAppNotFound3086672766/001/upaas.db"} {"time":"2026-02-20T05:34:09.891024-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupPOSTRejectsShortPassword339561832/001/upaas.db"} {"time":"2026-02-20T05:34:09.891326-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleEnvVarDeleteUsesCorrectRouteParam861960445/001/upaas.db"} {"time":"2026-02-20T05:34:09.893582-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleCancelDeployRedirects4185112685/001/upaas.db"} {"time":"2026-02-20T05:34:09.893645-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDashboardRenderTemplateBuffersOutput1603300893/001/upaas.db"} {"time":"2026-02-20T05:34:09.894321-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeleteLabelOwnershipVerification1021046365/001/upaas.db"} {"time":"2026-02-20T05:34:09.894404-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIWhoAmI541980914/001/upaas.db"} {"time":"2026-02-20T05:34:09.894617-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIDeleteApp3902521333/001/upaas.db"} {"time":"2026-02-20T05:34:09.895101-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPICreateAppValidation2990605321/001/upaas.db"} {"time":"2026-02-20T05:34:09.895662-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestLoginRenderTemplateBuffersOutput3572035188/001/upaas.db"} {"time":"2026-02-20T05:34:09.895698-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIListAppsEmpty2192839984/001/upaas.db"} {"time":"2026-02-20T05:34:09.896129-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPICreateApp2847826650/001/upaas.db"} {"time":"2026-02-20T05:34:09.896255-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupPOSTRejectsEmptyUsername132655799/001/upaas.db"} {"time":"2026-02-20T05:34:09.896433-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookRejectsOversizedBody2860413864/001/upaas.db"} {"time":"2026-02-20T05:34:09.896469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestRenderTemplateBuffersOutput3447017182/001/upaas.db"} {"time":"2026-02-20T05:34:09.896726-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeletePortOwnershipVerification3581641229/001/upaas.db"} {"time":"2026-02-20T05:34:09.89705-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleCancelDeployReturns404ForUnknownApp3709099628/001/upaas.db"} {"time":"2026-02-20T05:34:09.897063-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPIGetApp3817875535/001/upaas.db"} {"time":"2026-02-20T05:34:09.897527-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeleteEnvVarOwnershipVerification683503079/001/upaas.db"} {"time":"2026-02-20T05:34:09.905738-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.907041-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.907079-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.908483-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.908941-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.908997-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.910127-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.910137-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.912095-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.912229-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.915451-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.915455-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.915948-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.916198-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.917118-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.91741-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.918285-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.919123-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.919324-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.919805-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.920209-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.920765-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.921088-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.922362-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.923163-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.923187-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.923256-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.924202-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.924331-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.925544-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.925611-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.925679-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.925748-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.926271-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.926298-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.927434-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.927558-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.927602-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.927773-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.927797-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.927996-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.928134-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.928632-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.929143-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.929417-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.929762-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.929941-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.930038-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.930109-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.930238-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.9303-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.93043-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.931651-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.933502-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.933652-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.934157-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.934177-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.934792-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.934865-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.934875-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.935338-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.935576-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.935834-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.936078-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.936083-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.936166-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.936561-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.936643-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.936854-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.936948-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.937136-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.937253-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.937281-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.937328-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.93738-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.937494-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.938125-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.93872-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.938993-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.939216-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.93932-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.940073-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.940072-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.940075-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.940134-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.94016-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.940517-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.940581-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.941755-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.942023-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.942085-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.942493-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.943279-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.943287-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.943694-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.944164-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.944489-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.945-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.945164-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.945555-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.94566-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.945808-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.946343-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.94639-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.947382-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.947376-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.947589-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.949389-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.949409-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.949661-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.949662-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.949698-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.949832-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.94994-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.949954-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.950169-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.950229-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.95054-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.950593-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.950593-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.950913-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.950969-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.951366-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.951366-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.952589-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.953162-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.953433-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.953693-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.953736-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} --- PASS: TestDashboardRenderTemplateBuffersOutput (0.07s) === CONT TestHandleWebhookReturns404ForUnknownSecret {"time":"2026-02-20T05:34:09.954616-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.956359-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.956398-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.956208-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.956389-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.957579-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.957609-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.957629-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.957768-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.957883-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.958091-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.958325-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.958394-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} --- PASS: TestHandleCancelDeployReturns404ForUnknownApp (0.07s) === CONT TestHandleWebhookProcessesValidWebhook {"time":"2026-02-20T05:34:09.957628-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.958674-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.958835-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookReturns404ForUnknownSecret2992266362/001/upaas.db"} {"time":"2026-02-20T05:34:09.959064-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.96074-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.959986-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.95969-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.961146-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.960497-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.960371-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.961933-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookProcessesValidWebhook730302249/001/upaas.db"} --- PASS: TestAPIRejectsUnauthenticated (0.09s) {"time":"2026-02-20T05:34:09.962014-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.963054-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.963313-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.965227-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.965332-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.96534-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.965367-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestHandleSetupPOSTRejectsMismatchedPasswords (0.09s) === CONT TestHandleLoginPOSTRejectsInvalidCredentials --- PASS: TestRenderTemplateBuffersOutput (0.08s) === CONT TestAPITriggerDeployUsesDetachedContext {"time":"2026-02-20T05:34:09.966158-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestLoginRenderTemplateBuffersOutput (0.08s) === CONT TestHandleSetupGET/renders_setup_page {"time":"2026-02-20T05:34:09.966518-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.966562-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411D0NHQJ4H2TSBPRX93","name":"volume-owner-app"} {"time":"2026-02-20T05:34:09.966976-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.967408-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.96769-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPITriggerDeployUsesDetachedContext3052390260/001/upaas.db"} {"time":"2026-02-20T05:34:09.968309-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411F75KCXC9ZRSWQN38F","name":"volume-other-app"} {"time":"2026-02-20T05:34:09.968335-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.968342-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleSetupGETrenders_setup_page1746761461/001/upaas.db"} {"time":"2026-02-20T05:34:09.968865-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestDeleteVolumeOwnershipVerification (0.09s) === CONT TestHandleHealthCheck/returns_health_check_response {"time":"2026-02-20T05:34:09.969586-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411G1N4669CWAJWHT9SD","name":"envdelete-param-app"} --- PASS: TestHandleEnvVarDeleteUsesCorrectRouteParam (0.10s) {"time":"2026-02-20T05:34:09.969594-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.970281-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.971259-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.970428-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.970552-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.972486-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.970982-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.972656-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleHealthCheckreturns_health_check_response1000647926/001/upaas.db"} {"time":"2026-02-20T05:34:09.971078-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleLoginPOSTRejectsInvalidCredentials1649334331/001/upaas.db"} {"time":"2026-02-20T05:34:09.971076-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.973059-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.971174-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.971239-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.974118-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.974361-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.974937-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411P0QHJX55N451BAPZ2","name":"cancel-deploy-app"} {"time":"2026-02-20T05:34:09.975467-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.976004-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.976003-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.976237-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} === CONT TestHandleLoginGET/renders_login_page === CONT TestValidateAppName === RUN TestValidateAppName/valid_simple === PAUSE TestValidateAppName/valid_simple === RUN TestValidateAppName/valid_with_hyphen {"time":"2026-02-20T05:34:09.971001-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411GQJM9P6M6R8Z84135","name":"label-owner-app"} {"time":"2026-02-20T05:34:09.977821-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.976469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411Q6TD5Q5VYFQB8FH1A","name":"envvar-owner-app"} {"time":"2026-02-20T05:34:09.978014-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.978258-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.978581-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411TTN9HZP6TTH423PSX","name":"envvar-other-app"} {"time":"2026-02-20T05:34:09.978757-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.979002-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411TVVZVA52R40TDBH03","name":"port-owner-app"} {"time":"2026-02-20T05:34:09.979135-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411TC778X7TNEVKNZ3BQ","name":"label-other-app"} {"time":"2026-02-20T05:34:09.979607-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411VWY5A9YNNKB97HWY5","name":"volume-validate-app"} === RUN TestHandleVolumeAddValidatesPaths/relative_host_path_rejected === PAUSE TestHandleVolumeAddValidatesPaths/relative_host_path_rejected === RUN TestHandleVolumeAddValidatesPaths/relative_container_path_rejected {"time":"2026-02-20T05:34:09.97972-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM411VQGRFF98ADHCYQJHC","name":"port-other-app"} === PAUSE TestHandleVolumeAddValidatesPaths/relative_container_path_rejected === RUN TestHandleVolumeAddValidatesPaths/unclean_host_path_rejected === PAUSE TestHandleVolumeAddValidatesPaths/unclean_host_path_rejected === RUN TestHandleVolumeAddValidatesPaths/valid_paths_accepted === PAUSE TestHandleVolumeAddValidatesPaths/valid_paths_accepted === CONT TestValidateVolumePath/path_with_double_slash === CONT TestValidateVolumePath/path_with_dotdot === CONT TestValidateVolumePath/path_with_trailing_slash === CONT TestValidateVolumePath/single_dot_path === CONT TestValidateVolumePath/relative_path === CONT TestValidateVolumePath/empty_path === CONT TestSanitizeTail/valid_small_number === CONT TestParsePortValues/valid_ports === CONT TestSanitizeTail/float_uses_default === CONT TestSanitizeTail/one_is_valid === CONT TestSanitizeTail/all_keyword_uses_default === CONT TestSanitizeTail/non-numeric_uses_default === CONT TestSanitizeTail/negative_uses_default {"time":"2026-02-20T05:34:09.980989-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.981069-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} --- PASS: TestAPILoginMissingFields (0.10s) {"time":"2026-02-20T05:34:09.981266-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.98193-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.982794-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.983449-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.983815-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} --- PASS: TestHandleCancelDeployRedirects (0.10s) === CONT TestHandleAppNew/renders_new_app_form === CONT TestValidateVolumePath/valid_absolute_path === CONT TestSanitizeTail/exceeds_max_clamped === CONT TestSanitizeTail/very_large_clamped === CONT TestParsePortValues/non-numeric === CONT TestParsePortValues/zero_port === CONT TestParsePortValues/both_ports_above_65535 === CONT TestParsePortValues/container_port_above_65535 === CONT TestParsePortValues/negative_port === CONT TestParsePortValues/port_65535 === CONT TestParsePortValues/port_1 === CONT TestHandleDashboard/renders_dashboard_with_app_list {"time":"2026-02-20T05:34:09.986359-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.987698-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleDashboardrenders_dashboard_with_app_list3801992180/001/upaas.db"} {"time":"2026-02-20T05:34:09.988071-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.988259-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.988413-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.990344-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:09.990896-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.99105-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.991277-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.991425-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.991574-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} === CONT TestSanitizeLogs/plain_text_unchanged === CONT TestSanitizeLogs/preserves_carriage_returns === CONT TestSanitizeLogs/only_control_characters === CONT TestSanitizeLogs/empty_string === CONT TestSanitizeLogs/preserves_tabs === CONT TestSanitizeLogs/strips_ANSI_color_codes === CONT TestSanitizeLogs/strips_bell_characters === CONT TestSanitizeLogs/strips_mixed_escape_sequences === CONT TestSanitizeLogs/strips_null_bytes === CONT TestSanitizeLogs/cursor_movement_sequences_stripped === CONT TestSanitizeLogs/strips_OSC_sequences === CONT TestValidateRepoURL/bare_path === CONT TestValidateRepoURL/https_URL === CONT TestValidateRepoURL/file_URL_uppercase === CONT TestValidateRepoURL/file_URL === CONT TestValidateRepoURL/whitespace_only === CONT TestValidateRepoURL/empty_string === CONT TestValidateRepoURL/https_with_port === CONT TestValidateRepoURL/https_without_.git === CONT TestValidateRepoURL/SCP-like_with_dots === CONT TestValidateRepoURL/SCP-like_URL === CONT TestValidateRepoURL/git_URL === CONT TestValidateRepoURL/ssh_URL === CONT TestValidateRepoURL/http_URL === CONT TestValidateRepoURL/relative_path === CONT TestValidateRepoURL/no_path_https_trailing_slash === CONT TestValidateRepoURL/path_traversal_https === CONT TestValidateRepoURL/path_traversal_SCP === CONT TestValidateRepoURL/SCP-like_arbitrary_user === CONT TestValidateRepoURL/path_traversal_in_middle === CONT TestValidateRepoURL/ftp_URL === CONT TestValidateRepoURL/no_path_https === CONT TestValidateRepoURL/no_host_https === CONT TestValidateRepoURL/SCP-like_non-git_user === CONT TestValidateRepoURL/just_a_word === CONT TestHandleVolumeAddValidatesPaths/relative_host_path_rejected {"time":"2026-02-20T05:34:09.993342-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/handlers_test.TestHandleVolumeAddValidatesPaths.func1.(*Handlers).HandleVolumeAdd.1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/handlers/app.go","line":1027},"msg":"invalid volume path","error":"host path: path must be absolute"} === CONT TestHandleVolumeAddValidatesPaths/valid_paths_accepted === CONT TestHandleVolumeAddValidatesPaths/unclean_host_path_rejected {"time":"2026-02-20T05:34:09.993776-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:09.993859-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/handlers_test.TestHandleVolumeAddValidatesPaths.func1.(*Handlers).HandleVolumeAdd.1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/handlers/app.go","line":1027},"msg":"invalid volume path","error":"host path: path must be clean (expected \"/etc\")"} === CONT TestHandleVolumeAddValidatesPaths/relative_container_path_rejected {"time":"2026-02-20T05:34:09.994008-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:09.994054-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/handlers_test.TestHandleVolumeAddValidatesPaths.func1.(*Handlers).HandleVolumeAdd.1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/handlers/app.go","line":1027},"msg":"invalid volume path","error":"container path: path must be absolute"} {"time":"2026-02-20T05:34:09.994287-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:09.994448-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:09.9946-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} === CONT TestSanitizeTail/zero_uses_default === CONT TestSanitizeTail/valid_max_boundary --- PASS: TestDeleteEnvVarOwnershipVerification (0.10s) --- PASS: TestHandleSetupPOSTRejectsShortPassword (0.10s) {"time":"2026-02-20T05:34:09.998621-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleAppNewrenders_new_app_form4103470711/001/upaas.db"} {"time":"2026-02-20T05:34:10.000228-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.002107-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.002489-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.002985-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.003315-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} === CONT TestParsePortValues/host_port_above_65535 === RUN TestSetupRequiredExemptsHealthAndStaticAndAPI//health === CONT TestSanitizeTail/empty_uses_default --- PASS: TestDeleteLabelOwnershipVerification (0.10s) {"time":"2026-02-20T05:34:10.003652-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.004534-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleLoginGETrenders_login_page792062219/001/upaas.db"} === PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//health === RUN TestSetupRequiredExemptsHealthAndStaticAndAPI//s/style.css {"time":"2026-02-20T05:34:10.005479-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} --- PASS: TestHandleAppNew (0.00s) --- PASS: TestHandleAppNew/renders_new_app_form (0.01s) {"time":"2026-02-20T05:34:10.005968-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.006126-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.006352-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.006506-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.00665-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:09.963414-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.007413-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.007566-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.008167-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM412RZ8APJRYNVA2E6PZP","name":"oversize-test-app"} === PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//s/style.css === RUN TestSetupRequiredExemptsHealthAndStaticAndAPI//s/js/app.js === PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//s/js/app.js === RUN TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/apps === PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/apps === RUN TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/login === PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/login --- PASS: TestHandleSetupPOSTRejectsEmptyUsername (0.11s) === RUN TestSetupRequiredExemptsHealthAndStaticAndAPI/non-exempt_redirects === PAUSE TestSetupRequiredExemptsHealthAndStaticAndAPI/non-exempt_redirects === CONT TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/login --- PASS: TestDeletePortOwnershipVerification (0.11s) === CONT TestSetupRequiredExemptsHealthAndStaticAndAPI/non-exempt_redirects === CONT TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/apps === CONT TestSetupRequiredExemptsHealthAndStaticAndAPI//s/js/app.js === CONT TestSetupRequiredExemptsHealthAndStaticAndAPI//s/style.css === CONT TestSetupRequiredExemptsHealthAndStaticAndAPI//health --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI (0.13s) --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/login (0.00s) --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI/non-exempt_redirects (0.00s) --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//api/v1/apps (0.00s) --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//s/js/app.js (0.00s) --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//s/style.css (0.00s) --- PASS: TestSetupRequiredExemptsHealthAndStaticAndAPI//health (0.00s) --- PASS: TestParsePortValues (0.01s) --- PASS: TestParsePortValues/valid_ports (0.00s) --- PASS: TestParsePortValues/non-numeric (0.00s) --- PASS: TestParsePortValues/zero_port (0.00s) --- PASS: TestParsePortValues/both_ports_above_65535 (0.00s) --- PASS: TestParsePortValues/container_port_above_65535 (0.00s) --- PASS: TestParsePortValues/negative_port (0.00s) --- PASS: TestParsePortValues/port_65535 (0.00s) --- PASS: TestParsePortValues/port_1 (0.00s) --- PASS: TestParsePortValues/host_port_above_65535 (0.00s) --- PASS: TestHandleDashboard (0.00s) --- PASS: TestHandleDashboard/renders_dashboard_with_app_list (0.01s) --- PASS: TestSanitizeLogs (0.01s) --- PASS: TestSanitizeLogs/plain_text_unchanged (0.00s) --- PASS: TestSanitizeLogs/preserves_carriage_returns (0.00s) --- PASS: TestSanitizeLogs/only_control_characters (0.00s) --- PASS: TestSanitizeLogs/empty_string (0.00s) --- PASS: TestSanitizeLogs/preserves_tabs (0.00s) --- PASS: TestSanitizeLogs/strips_ANSI_color_codes (0.00s) --- PASS: TestSanitizeLogs/strips_bell_characters (0.00s) --- PASS: TestSanitizeLogs/strips_mixed_escape_sequences (0.00s) --- PASS: TestSanitizeLogs/strips_null_bytes (0.00s) --- PASS: TestSanitizeLogs/cursor_movement_sequences_stripped (0.00s) --- PASS: TestSanitizeLogs/strips_OSC_sequences (0.00s) --- PASS: TestValidateRepoURL (0.01s) --- PASS: TestValidateRepoURL/bare_path (0.00s) --- PASS: TestValidateRepoURL/https_URL (0.00s) --- PASS: TestValidateRepoURL/file_URL_uppercase (0.00s) --- PASS: TestValidateRepoURL/file_URL (0.00s) --- PASS: TestValidateRepoURL/whitespace_only (0.00s) --- PASS: TestValidateRepoURL/empty_string (0.00s) --- PASS: TestValidateRepoURL/https_with_port (0.00s) --- PASS: TestValidateRepoURL/https_without_.git (0.00s) --- PASS: TestValidateRepoURL/SCP-like_with_dots (0.00s) --- PASS: TestValidateRepoURL/SCP-like_URL (0.00s) --- PASS: TestValidateRepoURL/git_URL (0.00s) --- PASS: TestValidateRepoURL/ssh_URL (0.00s) --- PASS: TestValidateRepoURL/http_URL (0.00s) --- PASS: TestValidateRepoURL/relative_path (0.00s) --- PASS: TestValidateRepoURL/no_path_https_trailing_slash (0.00s) --- PASS: TestValidateRepoURL/path_traversal_https (0.00s) --- PASS: TestValidateRepoURL/path_traversal_SCP (0.00s) --- PASS: TestValidateRepoURL/SCP-like_arbitrary_user (0.00s) --- PASS: TestValidateRepoURL/path_traversal_in_middle (0.00s) --- PASS: TestValidateRepoURL/ftp_URL (0.00s) --- PASS: TestValidateRepoURL/no_path_https (0.00s) --- PASS: TestValidateRepoURL/no_host_https (0.00s) --- PASS: TestValidateRepoURL/SCP-like_non-git_user (0.00s) --- PASS: TestValidateRepoURL/just_a_word (0.00s) --- PASS: TestHandleVolumeAddValidatesPaths (0.11s) --- PASS: TestHandleVolumeAddValidatesPaths/relative_host_path_rejected (0.00s) --- PASS: TestHandleVolumeAddValidatesPaths/valid_paths_accepted (0.00s) --- PASS: TestHandleVolumeAddValidatesPaths/unclean_host_path_rejected (0.00s) --- PASS: TestHandleVolumeAddValidatesPaths/relative_container_path_rejected (0.00s) --- PASS: TestHandleHealthCheck (0.00s) --- PASS: TestHandleHealthCheck/returns_health_check_response (0.03s) --- PASS: TestSanitizeTail (0.01s) --- PASS: TestSanitizeTail/one_is_valid (0.00s) --- PASS: TestSanitizeTail/non-numeric_uses_default (0.00s) --- PASS: TestSanitizeTail/float_uses_default (0.00s) --- PASS: TestSanitizeTail/all_keyword_uses_default (0.00s) --- PASS: TestSanitizeTail/valid_small_number (0.00s) --- PASS: TestSanitizeTail/negative_uses_default (0.00s) --- PASS: TestSanitizeTail/exceeds_max_clamped (0.00s) --- PASS: TestSanitizeTail/very_large_clamped (0.00s) --- PASS: TestSanitizeTail/zero_uses_default (0.00s) --- PASS: TestSanitizeTail/valid_max_boundary (0.00s) --- PASS: TestSanitizeTail/empty_uses_default (0.00s) === CONT TestValidateVolumePath/root_path {"time":"2026-02-20T05:34:09.976684-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.01492-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.015095-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.020713-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"oversize-test-app","event":"push"} {"time":"2026-02-20T05:34:10.020834-08:00","level":"WARN","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":89},"msg":"failed to parse webhook payload","error":"invalid character 'x' looking for beginning of value"} === PAUSE TestValidateAppName/valid_with_hyphen === RUN TestValidateAppName/valid_with_numbers --- PASS: TestValidateVolumePath (0.01s) --- PASS: TestValidateVolumePath/path_with_double_slash (0.00s) --- PASS: TestValidateVolumePath/path_with_trailing_slash (0.00s) --- PASS: TestValidateVolumePath/single_dot_path (0.00s) --- PASS: TestValidateVolumePath/relative_path (0.00s) --- PASS: TestValidateVolumePath/empty_path (0.00s) --- PASS: TestValidateVolumePath/path_with_dotdot (0.00s) --- PASS: TestValidateVolumePath/valid_absolute_path (0.00s) --- PASS: TestValidateVolumePath/root_path (0.00s) {"time":"2026-02-20T05:34:10.028483-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"oversize-test-app","branch":"","matched":false,"commit":""} --- PASS: TestHandleWebhookRejectsOversizedBody (0.15s) {"time":"2026-02-20T05:34:10.038761-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.039036-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.042854-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.043222-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.043489-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.043581-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} --- PASS: TestHandleWebhookReturns404ForUnknownSecret (0.09s) {"time":"2026-02-20T05:34:10.04704-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.047104-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.047268-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.047753-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.048207-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} --- PASS: TestHandleLoginGET (0.01s) --- PASS: TestHandleLoginGET/renders_login_page (0.00s) {"time":"2026-02-20T05:34:10.048618-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.049109-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} === PAUSE TestValidateAppName/valid_with_numbers === RUN TestValidateAppName/valid_two_chars === PAUSE TestValidateAppName/valid_two_chars === RUN TestValidateAppName/valid_complex === PAUSE TestValidateAppName/valid_complex === RUN TestValidateAppName/valid_all_numbers === PAUSE TestValidateAppName/valid_all_numbers === RUN TestValidateAppName/empty === PAUSE TestValidateAppName/empty === RUN TestValidateAppName/single_char === PAUSE TestValidateAppName/single_char === RUN TestValidateAppName/too_long === PAUSE TestValidateAppName/too_long === RUN TestValidateAppName/exactly_63_chars === PAUSE TestValidateAppName/exactly_63_chars {"time":"2026-02-20T05:34:10.049645-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.049861-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM4141KDQ3AX1JJKX1A7DW","name":"webhook-test-app"} {"time":"2026-02-20T05:34:10.050079-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"webhook-test-app","event":"push"} {"time":"2026-02-20T05:34:10.050441-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} === RUN TestValidateAppName/64_chars === PAUSE TestValidateAppName/64_chars {"time":"2026-02-20T05:34:10.050696-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"webhook-test-app","branch":"main","matched":true,"commit":"abc123"} === RUN TestValidateAppName/uppercase === PAUSE TestValidateAppName/uppercase === RUN TestValidateAppName/spaces === PAUSE TestValidateAppName/spaces === RUN TestValidateAppName/starts_with_hyphen === PAUSE TestValidateAppName/starts_with_hyphen === RUN TestValidateAppName/ends_with_hyphen {"time":"2026-02-20T05:34:10.051669-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.052216-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.052416-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.055387-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.05566-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.05583-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestHandleSetupGET (0.00s) --- PASS: TestHandleSetupGET/renders_setup_page (0.09s) {"time":"2026-02-20T05:34:10.057415-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"webhook-test-app","error":"failed to clone repo: invalid commit SHA: \"abc123\""} {"time":"2026-02-20T05:34:10.059024-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookProcessesValidWebhook730302249/001/logs/Mac.lan guest wan/webhook-test-app/webhook-test-app_abc123_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.059443-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: invalid commit SHA: \"abc123\"","app":"webhook-test-app"} === PAUSE TestValidateAppName/ends_with_hyphen === RUN TestValidateAppName/underscore === PAUSE TestValidateAppName/underscore === RUN TestValidateAppName/dot === PAUSE TestValidateAppName/dot === RUN TestValidateAppName/slash === PAUSE TestValidateAppName/slash === RUN TestValidateAppName/path_traversal === PAUSE TestValidateAppName/path_traversal === RUN TestValidateAppName/special_chars === PAUSE TestValidateAppName/special_chars === RUN TestValidateAppName/unicode === PAUSE TestValidateAppName/unicode === CONT TestValidateAppName/valid_simple === CONT TestValidateAppName/special_chars === CONT TestValidateAppName/path_traversal === CONT TestValidateAppName/unicode === CONT TestValidateAppName/dot === CONT TestValidateAppName/slash === CONT TestValidateAppName/underscore === CONT TestValidateAppName/ends_with_hyphen === CONT TestValidateAppName/spaces === CONT TestValidateAppName/starts_with_hyphen === CONT TestValidateAppName/uppercase === CONT TestValidateAppName/64_chars === CONT TestValidateAppName/too_long === CONT TestValidateAppName/single_char === CONT TestValidateAppName/exactly_63_chars === CONT TestValidateAppName/valid_all_numbers === CONT TestValidateAppName/valid_complex === CONT TestValidateAppName/valid_two_chars === CONT TestValidateAppName/valid_with_numbers === CONT TestValidateAppName/valid_with_hyphen === CONT TestValidateAppName/empty --- PASS: TestValidateAppName (0.10s) --- PASS: TestValidateAppName/valid_simple (0.00s) --- PASS: TestValidateAppName/special_chars (0.00s) --- PASS: TestValidateAppName/path_traversal (0.00s) --- PASS: TestValidateAppName/unicode (0.00s) --- PASS: TestValidateAppName/dot (0.00s) --- PASS: TestValidateAppName/slash (0.00s) --- PASS: TestValidateAppName/underscore (0.00s) --- PASS: TestValidateAppName/ends_with_hyphen (0.00s) --- PASS: TestValidateAppName/spaces (0.00s) --- PASS: TestValidateAppName/starts_with_hyphen (0.00s) --- PASS: TestValidateAppName/uppercase (0.00s) --- PASS: TestValidateAppName/64_chars (0.00s) --- PASS: TestValidateAppName/too_long (0.00s) --- PASS: TestValidateAppName/single_char (0.00s) --- PASS: TestValidateAppName/exactly_63_chars (0.00s) --- PASS: TestValidateAppName/valid_all_numbers (0.00s) --- PASS: TestValidateAppName/valid_complex (0.00s) --- PASS: TestValidateAppName/valid_two_chars (0.00s) --- PASS: TestValidateAppName/valid_with_numbers (0.00s) --- PASS: TestValidateAppName/valid_with_hyphen (0.00s) --- PASS: TestValidateAppName/empty (0.00s) --- PASS: TestHandleWebhookProcessesValidWebhook (0.20s) {"time":"2026-02-20T05:34:10.17133-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.194917-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.196873-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"testuser"} {"time":"2026-02-20T05:34:10.200185-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.200335-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.205973-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.210172-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.241975-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} --- PASS: TestHandleSetupPOSTCreatesUserAndRedirects (0.37s) {"time":"2026-02-20T05:34:10.278246-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.289639-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.298905-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.299205-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.312815-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.331171-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.337693-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.350782-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"testuser"} {"time":"2026-02-20T05:34:10.409628-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41F9GPV9N9NXHQYHGTHG","name":"test-app"} --- PASS: TestAPICreateApp (0.53s) --- PASS: TestAPILoginInvalidCredentials (0.55s) --- PASS: TestHandleLoginPOSTAuthenticatesValidCredentials (0.56s) --- PASS: TestAPICSRFRejectsPostWithoutHeader (0.58s) --- PASS: TestAPILoginSuccess (0.59s) --- PASS: TestAPIListAppsEmpty (0.59s) --- PASS: TestAPIGetAppNotFound (0.59s) {"time":"2026-02-20T05:34:10.490585-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41HT28CZZMJ4887NRZCH","name":"delete-me"} {"time":"2026-02-20T05:34:10.491032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).DeleteApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":166},"msg":"app deleted","id":"01KHXM41HT28CZZMJ4887NRZCH","name":"delete-me"} --- PASS: TestAPIDeleteApp (0.61s) --- PASS: TestAPICSRFAllowsGetWithoutHeader (0.62s) {"time":"2026-02-20T05:34:10.524561-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41JWV6M68CGBJ3VM6VGW","name":"deploy-app"} --- PASS: TestAPIListDeployments (0.65s) --- PASS: TestAPIWhoAmI (0.65s) --- PASS: TestAPICreateAppValidation (0.66s) --- PASS: TestHandleLoginPOSTRejectsInvalidCredentials (0.65s) {"time":"2026-02-20T05:34:10.627939-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41P3QJ57D48HHDERNKBW","name":"my-app"} --- PASS: TestAPIGetApp (0.75s) {"time":"2026-02-20T05:34:10.637744-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41PDV2DK6J4H5ZT34NA8","name":"detach-ctx-app"} {"time":"2026-02-20T05:34:10.638571-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"detach-ctx-app","error":"failed to clone repo: docker client not connected"} {"time":"2026-02-20T05:34:10.638988-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAPITriggerDeployUsesDetachedContext3052390260/001/logs/Mac.lan guest wan/detach-ctx-app/detach-ctx-app_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.639112-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/handlers_test.apiRouter.func1.1.(*Handlers).HandleAPITriggerDeploy.7","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/handlers/api.go","line":360},"msg":"api: failed to trigger deploy","error":"failed to clone repo: docker client not connected"} --- PASS: TestAPITriggerDeployUsesDetachedContext (0.67s) PASS ok git.eeqj.de/sneak/upaas/internal/handlers (cached) ? git.eeqj.de/sneak/upaas/internal/healthcheck [no test files] ? git.eeqj.de/sneak/upaas/internal/logger [no test files] === RUN TestCORS_NoOriginsConfigured_NoCORSHeaders === PAUSE TestCORS_NoOriginsConfigured_NoCORSHeaders === RUN TestCORS_OriginsConfigured_AllowsMatchingOrigin === PAUSE TestCORS_OriginsConfigured_AllowsMatchingOrigin === RUN TestCORS_OriginsConfigured_RejectsNonMatchingOrigin === PAUSE TestCORS_OriginsConfigured_RejectsNonMatchingOrigin === RUN TestAPICSRFProtection_BlocksPostWithoutHeader === PAUSE TestAPICSRFProtection_BlocksPostWithoutHeader === RUN TestAPICSRFProtection_AllowsPostWithHeader === PAUSE TestAPICSRFProtection_AllowsPostWithHeader === RUN TestAPICSRFProtection_AllowsGetWithoutHeader === PAUSE TestAPICSRFProtection_AllowsGetWithoutHeader === RUN TestAPICSRFProtection_BlocksDeleteWithoutHeader === PAUSE TestAPICSRFProtection_BlocksDeleteWithoutHeader === RUN TestAPICSRFProtection_AllowsHeadWithoutHeader === PAUSE TestAPICSRFProtection_AllowsHeadWithoutHeader === RUN TestLoginRateLimitAllowsUpToBurst 2026/02/20 05:34:10 WARN login rate limit exceeded remoteIP=192.168.1.1 --- PASS: TestLoginRateLimitAllowsUpToBurst (0.00s) === RUN TestLoginRateLimitIsolatesIPs 2026/02/20 05:34:10 WARN login rate limit exceeded remoteIP=10.0.0.1 --- PASS: TestLoginRateLimitIsolatesIPs (0.00s) === RUN TestLoginRateLimitReturns429Body 2026/02/20 05:34:10 WARN login rate limit exceeded remoteIP=172.16.0.1 --- PASS: TestLoginRateLimitReturns429Body (0.00s) === RUN TestIPLimiterEvictsStaleEntries === PAUSE TestIPLimiterEvictsStaleEntries === RUN TestRealIP === PAUSE TestRealIP === RUN TestIsTrustedProxy === PAUSE TestIsTrustedProxy === CONT TestCORS_NoOriginsConfigured_NoCORSHeaders --- PASS: TestCORS_NoOriginsConfigured_NoCORSHeaders (0.00s) === CONT TestIsTrustedProxy --- PASS: TestIsTrustedProxy (0.00s) === CONT TestRealIP === RUN TestRealIP/trusted:_X-Real-IP_from_10.x === CONT TestIPLimiterEvictsStaleEntries --- PASS: TestIPLimiterEvictsStaleEntries (0.00s) === CONT TestAPICSRFProtection_AllowsHeadWithoutHeader --- PASS: TestAPICSRFProtection_AllowsHeadWithoutHeader (0.00s) === CONT TestAPICSRFProtection_AllowsGetWithoutHeader --- PASS: TestAPICSRFProtection_AllowsGetWithoutHeader (0.00s) === CONT TestAPICSRFProtection_BlocksDeleteWithoutHeader --- PASS: TestAPICSRFProtection_BlocksDeleteWithoutHeader (0.00s) === CONT TestAPICSRFProtection_AllowsPostWithHeader --- PASS: TestAPICSRFProtection_AllowsPostWithHeader (0.00s) === CONT TestCORS_OriginsConfigured_RejectsNonMatchingOrigin --- PASS: TestCORS_OriginsConfigured_RejectsNonMatchingOrigin (0.00s) === CONT TestCORS_OriginsConfigured_AllowsMatchingOrigin --- PASS: TestCORS_OriginsConfigured_AllowsMatchingOrigin (0.00s) === CONT TestAPICSRFProtection_BlocksPostWithoutHeader --- PASS: TestAPICSRFProtection_BlocksPostWithoutHeader (0.00s) === PAUSE TestRealIP/trusted:_X-Real-IP_from_10.x === RUN TestRealIP/trusted:_XFF_from_10.x_when_no_X-Real-IP === PAUSE TestRealIP/trusted:_XFF_from_10.x_when_no_X-Real-IP === RUN TestRealIP/trusted:_XFF_single_IP_from_10.x === PAUSE TestRealIP/trusted:_XFF_single_IP_from_10.x === RUN TestRealIP/trusted:_falls_back_to_RemoteAddr_(192.168.x) === PAUSE TestRealIP/trusted:_falls_back_to_RemoteAddr_(192.168.x) === RUN TestRealIP/trusted:_RemoteAddr_without_port === PAUSE TestRealIP/trusted:_RemoteAddr_without_port === RUN TestRealIP/trusted:_X-Real-IP_with_whitespace_from_10.x === PAUSE TestRealIP/trusted:_X-Real-IP_with_whitespace_from_10.x === RUN TestRealIP/trusted:_XFF_with_whitespace_from_10.x === PAUSE TestRealIP/trusted:_XFF_with_whitespace_from_10.x === RUN TestRealIP/trusted:_empty_X-Real-IP_falls_through_to_XFF_from_10.x === PAUSE TestRealIP/trusted:_empty_X-Real-IP_falls_through_to_XFF_from_10.x === RUN TestRealIP/trusted:_loopback_honours_X-Real-IP === PAUSE TestRealIP/trusted:_loopback_honours_X-Real-IP === RUN TestRealIP/trusted:_172.16.x_honours_XFF === PAUSE TestRealIP/trusted:_172.16.x_honours_XFF === RUN TestRealIP/untrusted:_X-Real-IP_ignored_from_public_IP === PAUSE TestRealIP/untrusted:_X-Real-IP_ignored_from_public_IP === RUN TestRealIP/untrusted:_XFF_ignored_from_public_IP === PAUSE TestRealIP/untrusted:_XFF_ignored_from_public_IP === RUN TestRealIP/untrusted:_both_headers_ignored_from_public_IP === PAUSE TestRealIP/untrusted:_both_headers_ignored_from_public_IP === RUN TestRealIP/untrusted:_no_headers,_public_RemoteAddr === PAUSE TestRealIP/untrusted:_no_headers,_public_RemoteAddr === RUN TestRealIP/untrusted:_public_RemoteAddr_without_port === PAUSE TestRealIP/untrusted:_public_RemoteAddr_without_port === CONT TestRealIP/trusted:_X-Real-IP_from_10.x === CONT TestRealIP/untrusted:_public_RemoteAddr_without_port === CONT TestRealIP/untrusted:_no_headers,_public_RemoteAddr === CONT TestRealIP/untrusted:_both_headers_ignored_from_public_IP === CONT TestRealIP/untrusted:_XFF_ignored_from_public_IP === CONT TestRealIP/untrusted:_X-Real-IP_ignored_from_public_IP === CONT TestRealIP/trusted:_172.16.x_honours_XFF === CONT TestRealIP/trusted:_X-Real-IP_with_whitespace_from_10.x === CONT TestRealIP/trusted:_XFF_from_10.x_when_no_X-Real-IP === CONT TestRealIP/trusted:_falls_back_to_RemoteAddr_(192.168.x) === CONT TestRealIP/trusted:_XFF_single_IP_from_10.x === CONT TestRealIP/trusted:_empty_X-Real-IP_falls_through_to_XFF_from_10.x === CONT TestRealIP/trusted:_loopback_honours_X-Real-IP === CONT TestRealIP/trusted:_XFF_with_whitespace_from_10.x === CONT TestRealIP/trusted:_RemoteAddr_without_port --- PASS: TestRealIP (0.00s) --- PASS: TestRealIP/trusted:_X-Real-IP_from_10.x (0.00s) --- PASS: TestRealIP/untrusted:_public_RemoteAddr_without_port (0.00s) --- PASS: TestRealIP/untrusted:_no_headers,_public_RemoteAddr (0.00s) --- PASS: TestRealIP/untrusted:_both_headers_ignored_from_public_IP (0.00s) --- PASS: TestRealIP/untrusted:_XFF_ignored_from_public_IP (0.00s) --- PASS: TestRealIP/untrusted:_X-Real-IP_ignored_from_public_IP (0.00s) --- PASS: TestRealIP/trusted:_172.16.x_honours_XFF (0.00s) --- PASS: TestRealIP/trusted:_X-Real-IP_with_whitespace_from_10.x (0.00s) --- PASS: TestRealIP/trusted:_XFF_from_10.x_when_no_X-Real-IP (0.00s) --- PASS: TestRealIP/trusted:_falls_back_to_RemoteAddr_(192.168.x) (0.00s) --- PASS: TestRealIP/trusted:_XFF_single_IP_from_10.x (0.00s) --- PASS: TestRealIP/trusted:_empty_X-Real-IP_falls_through_to_XFF_from_10.x (0.00s) --- PASS: TestRealIP/trusted:_loopback_honours_X-Real-IP (0.00s) --- PASS: TestRealIP/trusted:_XFF_with_whitespace_from_10.x (0.00s) --- PASS: TestRealIP/trusted:_RemoteAddr_without_port (0.00s) PASS ok git.eeqj.de/sneak/upaas/internal/middleware (cached) === RUN TestUserCreateAndFind === PAUSE TestUserCreateAndFind === RUN TestUserUpdate === PAUSE TestUserUpdate === RUN TestUserDelete === PAUSE TestUserDelete === RUN TestUserFindByUsername === PAUSE TestUserFindByUsername === RUN TestUserFindByUsernameNotFound === PAUSE TestUserFindByUsernameNotFound === RUN TestUserExists === PAUSE TestUserExists === RUN TestAppCreateAndFind === PAUSE TestAppCreateAndFind === RUN TestAppUpdate === PAUSE TestAppUpdate === RUN TestAppDelete === PAUSE TestAppDelete === RUN TestAppFindByWebhookSecret === PAUSE TestAppFindByWebhookSecret === RUN TestAllApps === PAUSE TestAllApps === RUN TestEnvVarCRUD === PAUSE TestEnvVarCRUD === RUN TestLabelCRUD === PAUSE TestLabelCRUD === RUN TestVolumeCRUD === PAUSE TestVolumeCRUD === RUN TestWebhookEventCRUD === PAUSE TestWebhookEventCRUD === RUN TestDeploymentCreateAndFind === PAUSE TestDeploymentCreateAndFind === RUN TestDeploymentAppendLog === PAUSE TestDeploymentAppendLog === RUN TestDeploymentMarkFinished === PAUSE TestDeploymentMarkFinished === RUN TestDeploymentFindByAppID === PAUSE TestDeploymentFindByAppID === RUN TestDeploymentFindLatest === PAUSE TestDeploymentFindLatest === RUN TestAppGetEnvVars === PAUSE TestAppGetEnvVars === RUN TestAppGetLabels === PAUSE TestAppGetLabels === RUN TestAppGetVolumes === PAUSE TestAppGetVolumes === RUN TestAppGetDeployments === PAUSE TestAppGetDeployments === RUN TestAppGetWebhookEvents === PAUSE TestAppGetWebhookEvents === RUN TestCascadeDelete === PAUSE TestCascadeDelete === CONT TestUserUpdate === CONT TestLabelCRUD === RUN TestLabelCRUD/creates_and_finds_labels === PAUSE TestLabelCRUD/creates_and_finds_labels === CONT TestLabelCRUD/creates_and_finds_labels {"time":"2026-02-20T05:34:10.030049-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserUpdate1620655118/001/upaas.db"} === CONT TestAppCreateAndFind {"time":"2026-02-20T05:34:10.030938-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestLabelCRUDcreates_and_finds_labels3490381503/001/upaas.db"} === CONT TestDeploymentFindByAppID === CONT TestAppUpdate {"time":"2026-02-20T05:34:10.032978-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentFindByAppID3445331372/001/upaas.db"} {"time":"2026-02-20T05:34:10.033236-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppUpdate3905913933/001/upaas.db"} {"time":"2026-02-20T05:34:10.034675-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} === CONT TestDeploymentAppendLog {"time":"2026-02-20T05:34:10.035252-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.035402-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.035642-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.035802-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.035952-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} === CONT TestVolumeCRUD === RUN TestVolumeCRUD/creates_and_finds_volumes === PAUSE TestVolumeCRUD/creates_and_finds_volumes === CONT TestDeploymentCreateAndFind {"time":"2026-02-20T05:34:10.039096-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppCreateAndFind1558901610/001/upaas.db"} === CONT TestUserExists === RUN TestUserExists/returns_false_when_no_users === CONT TestUserFindByUsernameNotFound --- PASS: TestAppUpdate (0.01s) === CONT TestVolumeCRUD/creates_and_finds_volumes {"time":"2026-02-20T05:34:10.040198-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.040433-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserFindByUsernameNotFound3720737358/001/upaas.db"} {"time":"2026-02-20T05:34:10.040398-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentCreateAndFind2190224302/001/upaas.db"} {"time":"2026-02-20T05:34:10.040525-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentAppendLog676753355/001/upaas.db"} {"time":"2026-02-20T05:34:10.042075-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} === CONT TestUserCreateAndFind {"time":"2026-02-20T05:34:10.043094-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.04435-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} === CONT TestAppDelete {"time":"2026-02-20T05:34:10.044746-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.051213-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserCreateAndFind2755485217/001/upaas.db"} {"time":"2026-02-20T05:34:10.051892-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} === PAUSE TestUserExists/returns_false_when_no_users === RUN TestUserExists/returns_true_when_user_exists === PAUSE TestUserExists/returns_true_when_user_exists === CONT TestUserExists/returns_false_when_no_users === CONT TestUserFindByUsername {"time":"2026-02-20T05:34:10.054344-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVolumeCRUDcreates_and_finds_volumes322096490/001/upaas.db"} === CONT TestUserExists/returns_true_when_user_exists {"time":"2026-02-20T05:34:10.055036-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserExistsreturns_false_when_no_users1219771254/001/upaas.db"} {"time":"2026-02-20T05:34:10.055882-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppDelete1454070073/001/upaas.db"} {"time":"2026-02-20T05:34:10.057911-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserExistsreturns_true_when_user_exists1926902790/001/upaas.db"} {"time":"2026-02-20T05:34:10.058949-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.059478-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.059633-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.063065-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserFindByUsername2932768192/001/upaas.db"} === CONT TestWebhookEventCRUD === RUN TestWebhookEventCRUD/creates_and_finds_webhook_events === PAUSE TestWebhookEventCRUD/creates_and_finds_webhook_events === CONT TestWebhookEventCRUD/creates_and_finds_webhook_events {"time":"2026-02-20T05:34:10.06974-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.071064-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestWebhookEventCRUDcreates_and_finds_webhook_events1522328187/001/upaas.db"} === CONT TestCascadeDelete === RUN TestCascadeDelete/deleting_app_cascades_to_related_records === CONT TestDeploymentMarkFinished === PAUSE TestCascadeDelete/deleting_app_cascades_to_related_records === CONT TestCascadeDelete/deleting_app_cascades_to_related_records {"time":"2026-02-20T05:34:10.073088-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} === CONT TestUserDelete {"time":"2026-02-20T05:34:10.074139-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.074693-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.075124-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.074974-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} === CONT TestAppGetLabels {"time":"2026-02-20T05:34:10.075746-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.076102-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.076523-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} === CONT TestAppGetWebhookEvents --- PASS: TestUserUpdate (0.05s) === CONT TestAppGetDeployments {"time":"2026-02-20T05:34:10.077719-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUserDelete2119534058/001/upaas.db"} === CONT TestAppGetVolumes {"time":"2026-02-20T05:34:10.078827-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.085025-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetLabels2380643754/001/upaas.db"} {"time":"2026-02-20T05:34:10.085211-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCascadeDeletedeleting_app_cascades_to_related_records2874023787/001/upaas.db"} {"time":"2026-02-20T05:34:10.085238-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentMarkFinished1293758714/001/upaas.db"} {"time":"2026-02-20T05:34:10.074383-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.086751-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetVolumes2947451031/001/upaas.db"} {"time":"2026-02-20T05:34:10.088023-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetWebhookEvents1189030502/001/upaas.db"} === CONT TestAppGetEnvVars {"time":"2026-02-20T05:34:10.096096-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.096878-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetEnvVars2594934116/001/upaas.db"} {"time":"2026-02-20T05:34:10.098458-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.099203-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.100584-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.101619-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.102511-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.102961-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} === CONT TestAllApps === RUN TestAllApps/returns_empty_list_when_no_apps === CONT TestEnvVarCRUD === RUN TestEnvVarCRUD/creates_and_finds_env_vars === CONT TestAppFindByWebhookSecret === PAUSE TestAllApps/returns_empty_list_when_no_apps === PAUSE TestEnvVarCRUD/creates_and_finds_env_vars {"time":"2026-02-20T05:34:10.105247-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} === RUN TestAllApps/returns_apps_ordered_by_name === PAUSE TestAllApps/returns_apps_ordered_by_name === RUN TestEnvVarCRUD/deletes_env_var === PAUSE TestEnvVarCRUD/deletes_env_var === CONT TestEnvVarCRUD/creates_and_finds_env_vars {"time":"2026-02-20T05:34:10.105595-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.105703-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} === CONT TestAllApps/returns_empty_list_when_no_apps === CONT TestAllApps/returns_apps_ordered_by_name {"time":"2026-02-20T05:34:10.106205-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.106592-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.106654-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.106671-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} === CONT TestEnvVarCRUD/deletes_env_var {"time":"2026-02-20T05:34:10.114007-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.11496-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestEnvVarCRUDdeletes_env_var447203874/001/upaas.db"} {"time":"2026-02-20T05:34:10.115855-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.116401-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.114219-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.11763-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.117852-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.118027-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.118286-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.118408-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestEnvVarCRUDcreates_and_finds_env_vars3318316464/001/upaas.db"} {"time":"2026-02-20T05:34:10.118412-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAllAppsreturns_apps_ordered_by_name2823597281/001/upaas.db"} {"time":"2026-02-20T05:34:10.11857-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.119018-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.119061-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAllAppsreturns_empty_list_when_no_apps1002856232/001/upaas.db"} {"time":"2026-02-20T05:34:10.119863-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.120064-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.121066-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.122685-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.123132-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.123904-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.124232-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} --- PASS: TestAppGetEnvVars (0.03s) {"time":"2026-02-20T05:34:10.12603-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.126412-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestAppCreateAndFind (0.10s) {"time":"2026-02-20T05:34:10.127486-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.127657-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.128081-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.128237-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.128266-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} === CONT TestDeploymentFindLatest {"time":"2026-02-20T05:34:10.128342-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppGetDeployments248718239/001/upaas.db"} {"time":"2026-02-20T05:34:10.128438-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.128724-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.129753-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.129745-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAppFindByWebhookSecret3990399520/001/upaas.db"} --- PASS: TestAppDelete (0.09s) {"time":"2026-02-20T05:34:10.130573-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeploymentFindLatest2217448518/001/upaas.db"} {"time":"2026-02-20T05:34:10.130477-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.131557-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.131931-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.133921-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.134822-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.134879-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.137719-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.13844-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.13977-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.141077-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.141154-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.141701-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.142292-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.142381-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.14446-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.144642-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.144955-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.145807-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.14582-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.146046-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.146055-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.146124-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.146145-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.146094-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.147771-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.148017-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestAppGetLabels (0.07s) {"time":"2026-02-20T05:34:10.149652-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.150016-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.150491-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.150751-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.150884-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.151269-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.151314-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.151576-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.151793-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.151923-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.152303-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.152302-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.152581-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.152633-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.153247-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.153255-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.153686-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.154044-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.155059-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} --- PASS: TestVolumeCRUD (0.00s) --- PASS: TestVolumeCRUD/creates_and_finds_volumes (0.12s) {"time":"2026-02-20T05:34:10.155416-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.155443-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.155471-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.155754-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.155912-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.156204-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} --- PASS: TestUserDelete (0.08s) {"time":"2026-02-20T05:34:10.157015-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.157878-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.158013-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestUserFindByUsernameNotFound (0.12s) {"time":"2026-02-20T05:34:10.158569-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.159167-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.159984-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.160301-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} --- PASS: TestAllApps (0.00s) --- PASS: TestAllApps/returns_apps_ordered_by_name (0.05s) --- PASS: TestAllApps/returns_empty_list_when_no_apps (0.06s) {"time":"2026-02-20T05:34:10.162047-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.162192-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.163018-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} --- PASS: TestUserFindByUsername (0.11s) {"time":"2026-02-20T05:34:10.163346-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.163858-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.164647-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.164799-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.164882-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.166038-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.168032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.168202-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.168031-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.169041-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.169089-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} --- PASS: TestLabelCRUD (0.00s) --- PASS: TestLabelCRUD/creates_and_finds_labels (0.14s) {"time":"2026-02-20T05:34:10.169205-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.169268-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.169564-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.169612-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestEnvVarCRUD (0.00s) --- PASS: TestEnvVarCRUD/deletes_env_var (0.02s) --- PASS: TestEnvVarCRUD/creates_and_finds_env_vars (0.06s) {"time":"2026-02-20T05:34:10.170383-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} --- PASS: TestAppGetWebhookEvents (0.09s) {"time":"2026-02-20T05:34:10.17118-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.172392-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.17312-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.174739-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.175245-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.175281-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.175382-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.175582-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} --- PASS: TestAppGetVolumes (0.10s) {"time":"2026-02-20T05:34:10.175933-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.176272-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.17653-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.176645-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.177735-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.177767-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.177876-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.177916-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.177912-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.178029-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestDeploymentMarkFinished (0.11s) {"time":"2026-02-20T05:34:10.178183-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} --- PASS: TestDeploymentAppendLog (0.14s) {"time":"2026-02-20T05:34:10.178597-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.179032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.17915-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.179696-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.179722-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.180501-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.180515-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.181623-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestCascadeDelete (0.00s) --- PASS: TestCascadeDelete/deleting_app_cascades_to_related_records (0.11s) {"time":"2026-02-20T05:34:10.181903-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} --- PASS: TestUserCreateAndFind (0.14s) --- PASS: TestDeploymentCreateAndFind (0.15s) --- PASS: TestUserExists (0.01s) --- PASS: TestUserExists/returns_true_when_user_exists (0.11s) --- PASS: TestUserExists/returns_false_when_no_users (0.13s) --- PASS: TestWebhookEventCRUD (0.00s) --- PASS: TestWebhookEventCRUD/creates_and_finds_webhook_events (0.12s) --- PASS: TestAppGetDeployments (0.11s) {"time":"2026-02-20T05:34:10.187765-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} --- PASS: TestAppFindByWebhookSecret (0.08s) --- PASS: TestDeploymentFindByAppID (0.16s) {"time":"2026-02-20T05:34:10.188492-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestDeploymentFindLatest (0.06s) PASS ok git.eeqj.de/sneak/upaas/internal/models (cached) ? git.eeqj.de/sneak/upaas/internal/server [no test files] === RUN TestCreateAppWithGeneratedKeys === PAUSE TestCreateAppWithGeneratedKeys === RUN TestCreateAppDefaults === PAUSE TestCreateAppDefaults === RUN TestCreateAppOptionalFields === PAUSE TestCreateAppOptionalFields === RUN TestUpdateApp === PAUSE TestUpdateApp === RUN TestDeleteApp === PAUSE TestDeleteApp === RUN TestGetApp === PAUSE TestGetApp === RUN TestGetAppByWebhookSecret === PAUSE TestGetAppByWebhookSecret === RUN TestListApps === PAUSE TestListApps === RUN TestEnvVarsAddAndRetrieve === PAUSE TestEnvVarsAddAndRetrieve === RUN TestEnvVarsDelete === PAUSE TestEnvVarsDelete === RUN TestLabels === PAUSE TestLabels === RUN TestVolumesAddAndRetrieve === PAUSE TestVolumesAddAndRetrieve === RUN TestVolumesDelete === PAUSE TestVolumesDelete === RUN TestUpdateAppStatus === PAUSE TestUpdateAppStatus === CONT TestCreateAppDefaults === CONT TestEnvVarsAddAndRetrieve === CONT TestUpdateAppStatus === RUN TestUpdateAppStatus/updates_app_status === PAUSE TestUpdateAppStatus/updates_app_status === CONT TestVolumesDelete === CONT TestVolumesAddAndRetrieve === CONT TestLabels === RUN TestLabels/adds_and_retrieves_labels === CONT TestEnvVarsDelete === CONT TestGetApp === PAUSE TestLabels/adds_and_retrieves_labels === RUN TestGetApp/finds_existing_app === CONT TestDeleteApp === PAUSE TestGetApp/finds_existing_app === RUN TestGetApp/returns_nil_for_non-existent_app === RUN TestDeleteApp/deletes_app_and_returns_nil_on_lookup === CONT TestUpdateApp === PAUSE TestGetApp/returns_nil_for_non-existent_app === CONT TestCreateAppOptionalFields === CONT TestCreateAppWithGeneratedKeys === CONT TestUpdateAppStatus/updates_app_status === CONT TestGetAppByWebhookSecret === RUN TestLabels/deletes_label === CONT TestListApps === PAUSE TestLabels/deletes_label === PAUSE TestDeleteApp/deletes_app_and_returns_nil_on_lookup === CONT TestGetApp/returns_nil_for_non-existent_app === RUN TestUpdateApp/updates_app_fields === PAUSE TestUpdateApp/updates_app_fields === RUN TestListApps/returns_empty_list_when_no_apps === PAUSE TestListApps/returns_empty_list_when_no_apps === RUN TestUpdateApp/clears_optional_fields_when_empty === PAUSE TestUpdateApp/clears_optional_fields_when_empty === RUN TestListApps/returns_all_apps_ordered_by_name === CONT TestLabels/deletes_label === CONT TestLabels/adds_and_retrieves_labels === RUN TestGetAppByWebhookSecret/finds_app_by_webhook_secret === CONT TestUpdateApp/updates_app_fields === CONT TestGetApp/finds_existing_app === PAUSE TestListApps/returns_all_apps_ordered_by_name {"time":"2026-02-20T05:34:10.200355-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestEnvVarsDelete3753399937/001/upaas.db"} === PAUSE TestGetAppByWebhookSecret/finds_app_by_webhook_secret === RUN TestGetAppByWebhookSecret/returns_nil_for_invalid_secret === PAUSE TestGetAppByWebhookSecret/returns_nil_for_invalid_secret === CONT TestListApps/returns_all_apps_ordered_by_name {"time":"2026-02-20T05:34:10.201207-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateAppWithGeneratedKeys3086114307/001/upaas.db"} {"time":"2026-02-20T05:34:10.201357-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateAppOptionalFields1046221743/001/upaas.db"} === CONT TestUpdateApp/clears_optional_fields_when_empty {"time":"2026-02-20T05:34:10.202298-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVolumesAddAndRetrieve4187974089/001/upaas.db"} {"time":"2026-02-20T05:34:10.202848-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVolumesDelete2601973248/001/upaas.db"} {"time":"2026-02-20T05:34:10.203024-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestEnvVarsAddAndRetrieve381107435/001/upaas.db"} === CONT TestDeleteApp/deletes_app_and_returns_nil_on_lookup === CONT TestListApps/returns_empty_list_when_no_apps {"time":"2026-02-20T05:34:10.205572-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestGetAppreturns_nil_for_non-existent_app451128046/001/upaas.db"} {"time":"2026-02-20T05:34:10.205795-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUpdateAppStatusupdates_app_status1513275777/001/upaas.db"} {"time":"2026-02-20T05:34:10.206308-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateAppDefaults683202009/001/upaas.db"} === CONT TestGetAppByWebhookSecret/returns_nil_for_invalid_secret === CONT TestGetAppByWebhookSecret/finds_app_by_webhook_secret {"time":"2026-02-20T05:34:10.215965-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestGetAppfinds_existing_app1512285900/001/upaas.db"} {"time":"2026-02-20T05:34:10.219413-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestListAppsreturns_empty_list_when_no_apps1337731534/001/upaas.db"} {"time":"2026-02-20T05:34:10.220055-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUpdateAppupdates_app_fields1630979087/001/upaas.db"} {"time":"2026-02-20T05:34:10.22001-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestLabelsadds_and_retrieves_labels4114967918/001/upaas.db"} {"time":"2026-02-20T05:34:10.220203-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestListAppsreturns_all_apps_ordered_by_name1422305139/001/upaas.db"} {"time":"2026-02-20T05:34:10.220356-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestUpdateAppclears_optional_fields_when_empty71924344/001/upaas.db"} {"time":"2026-02-20T05:34:10.220846-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestLabelsdeletes_label62677219/001/upaas.db"} {"time":"2026-02-20T05:34:10.22217-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDeleteAppdeletes_app_and_returns_nil_on_lookup3602538454/001/upaas.db"} {"time":"2026-02-20T05:34:10.222466-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.223314-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestGetAppByWebhookSecretreturns_nil_for_invalid_secret1512751755/001/upaas.db"} {"time":"2026-02-20T05:34:10.232895-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestGetAppByWebhookSecretfinds_app_by_webhook_secret3670578947/001/upaas.db"} {"time":"2026-02-20T05:34:10.233115-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.235149-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.238274-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.239638-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.239824-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.240225-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.241031-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.241747-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.243375-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.243635-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.244342-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.244812-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.244857-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.245647-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.246059-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.246803-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.249108-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.250094-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.250871-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.253882-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.257402-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.259475-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.261123-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.261418-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.261819-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.262828-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.263205-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.264257-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.264469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.265017-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.265303-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.265407-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.26553-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.265805-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.265949-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.267116-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.267353-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.267494-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.268075-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.268326-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.2684-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.270529-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.271305-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.272613-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.272687-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.272735-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.273876-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.274577-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.274671-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.275161-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.275288-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.276099-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.276333-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.276419-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.276539-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.278693-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.278902-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.280076-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.28029-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.280386-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.28052-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.280908-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.281106-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.28119-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.281881-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.281884-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.28287-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.283221-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.284183-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.286184-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.286365-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.286565-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.286852-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.28698-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.287029-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.287152-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.28721-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.287162-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.287403-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BEQR1D4WBKV3H8BWBJ","name":"env-test"} {"time":"2026-02-20T05:34:10.288409-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BFDGRBT6S33J7VTT9Q","name":"test-app-defaults"} --- PASS: TestCreateAppDefaults (0.09s) {"time":"2026-02-20T05:34:10.289129-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.289148-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BGKZFXJJWMHCX8ENNT","name":"status-test"} --- PASS: TestEnvVarsAddAndRetrieve (0.09s) {"time":"2026-02-20T05:34:10.289214-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.289261-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.289515-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.289534-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.289756-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.289805-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} --- PASS: TestUpdateAppStatus (0.00s) --- PASS: TestUpdateAppStatus/updates_app_status (0.09s) {"time":"2026-02-20T05:34:10.29055-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.290742-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.290867-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.291344-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.291522-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.291885-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.29189-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.292056-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.292148-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.292182-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.292376-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.292519-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.292396-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BKFFFBBDYQVT2EBX5C","name":"volume-test"} {"time":"2026-02-20T05:34:10.29468-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BN13EHHC45Z3NZB0HK","name":"test-app"} {"time":"2026-02-20T05:34:10.294724-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BNX51DJGQTFXDRVWJ0","name":"env-delete-test"} {"time":"2026-02-20T05:34:10.294713-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.29531-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} --- PASS: TestCreateAppWithGeneratedKeys (0.10s) {"time":"2026-02-20T05:34:10.295631-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} --- PASS: TestEnvVarsDelete (0.10s) {"time":"2026-02-20T05:34:10.295764-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} --- PASS: TestVolumesAddAndRetrieve (0.10s) {"time":"2026-02-20T05:34:10.296289-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.296314-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.29629-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.296775-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.296973-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.297157-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BQ05R6AZNR387WM5VM","name":"original-name"} {"time":"2026-02-20T05:34:10.297538-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.29754-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).UpdateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":153},"msg":"app updated","id":"01KHXM41BQ05R6AZNR387WM5VM","name":"updated-name"} {"time":"2026-02-20T05:34:10.297629-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.297904-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BS23N699NDM2W2XEZ8","name":"label-test"} {"time":"2026-02-20T05:34:10.298073-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.298123-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BS9XB9GPB59752ZZ9C","name":"volume-delete-test"} {"time":"2026-02-20T05:34:10.298231-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.29837-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BS5G6GBE21YJBV2C2T","name":"findable-app"} {"time":"2026-02-20T05:34:10.298424-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.298463-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.298574-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BTT9W0GA293G5Q8PH6","name":"label-delete-test"} {"time":"2026-02-20T05:34:10.298791-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BTECFRHG867J851FQA","name":"charlie"} {"time":"2026-02-20T05:34:10.30031-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.30056-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BVXWD6WVACSDP4Q6JV","name":"test-app-full"} {"time":"2026-02-20T05:34:10.301006-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BW5BNDDZS5K03DAFAK","name":"alpha"} --- PASS: TestGetApp (0.00s) --- PASS: TestGetApp/returns_nil_for_non-existent_app (0.09s) --- PASS: TestGetApp/finds_existing_app (0.10s) --- PASS: TestCreateAppOptionalFields (0.10s) {"time":"2026-02-20T05:34:10.30158-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BXGR9SWX169TBENBFM","name":"webhook-app"} --- PASS: TestVolumesDelete (0.10s) {"time":"2026-02-20T05:34:10.301797-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BT77TPSDMKF6RYYJ3K","name":"to-delete"} {"time":"2026-02-20T05:34:10.302848-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).DeleteApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":166},"msg":"app deleted","id":"01KHXM41BT77TPSDMKF6RYYJ3K","name":"to-delete"} {"time":"2026-02-20T05:34:10.302865-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BXBWHG1DRSJ0P6CKES","name":"test-clear"} {"time":"2026-02-20T05:34:10.303169-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).UpdateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":153},"msg":"app updated","id":"01KHXM41BXBWHG1DRSJ0P6CKES","name":"test-clear"} --- PASS: TestGetAppByWebhookSecret (0.00s) --- PASS: TestGetAppByWebhookSecret/returns_nil_for_invalid_secret (0.08s) --- PASS: TestGetAppByWebhookSecret/finds_app_by_webhook_secret (0.09s) {"time":"2026-02-20T05:34:10.303357-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/app.(*Service).CreateApp","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/app/app.go","line":108},"msg":"app created","id":"01KHXM41BYG778V8EZGKEVSGH6","name":"bravo"} --- PASS: TestDeleteApp (0.00s) --- PASS: TestDeleteApp/deletes_app_and_returns_nil_on_lookup (0.09s) --- PASS: TestLabels (0.00s) --- PASS: TestLabels/adds_and_retrieves_labels (0.10s) --- PASS: TestLabels/deletes_label (0.10s) --- PASS: TestUpdateApp (0.00s) --- PASS: TestUpdateApp/updates_app_fields (0.10s) --- PASS: TestUpdateApp/clears_optional_fields_when_empty (0.10s) --- PASS: TestListApps (0.00s) --- PASS: TestListApps/returns_empty_list_when_no_apps (0.09s) --- PASS: TestListApps/returns_all_apps_ordered_by_name (0.10s) PASS ok git.eeqj.de/sneak/upaas/internal/service/app (cached) === RUN TestSessionCookieSecureFlag === PAUSE TestSessionCookieSecureFlag === RUN TestHashPassword === PAUSE TestHashPassword === RUN TestVerifyPassword === PAUSE TestVerifyPassword === RUN TestIsSetupRequired === PAUSE TestIsSetupRequired === RUN TestCreateUser === PAUSE TestCreateUser === RUN TestCreateUserRaceCondition === PAUSE TestCreateUserRaceCondition === RUN TestAuthenticate === PAUSE TestAuthenticate === RUN TestDestroySessionMaxAge === PAUSE TestDestroySessionMaxAge === CONT TestSessionCookieSecureFlag === RUN TestSessionCookieSecureFlag/secure_flag_is_true_when_debug_is_false === PAUSE TestSessionCookieSecureFlag/secure_flag_is_true_when_debug_is_false === CONT TestDestroySessionMaxAge === RUN TestDestroySessionMaxAge/sets_MaxAge_to_exactly_-1 === CONT TestAuthenticate === RUN TestAuthenticate/authenticates_valid_credentials === CONT TestCreateUser === RUN TestCreateUser/creates_user_successfully === PAUSE TestCreateUser/creates_user_successfully === RUN TestCreateUser/rejects_duplicate_user === CONT TestIsSetupRequired === RUN TestIsSetupRequired/returns_true_when_no_users_exist === PAUSE TestIsSetupRequired/returns_true_when_no_users_exist === CONT TestVerifyPassword === RUN TestVerifyPassword/verifies_correct_password === CONT TestCreateUserRaceCondition === RUN TestCreateUserRaceCondition/concurrent_setup_requests_create_only_one_user === PAUSE TestCreateUserRaceCondition/concurrent_setup_requests_create_only_one_user === CONT TestHashPassword === RUN TestHashPassword/hashes_password_successfully === PAUSE TestHashPassword/hashes_password_successfully === RUN TestHashPassword/produces_different_hashes_for_same_password === PAUSE TestHashPassword/produces_different_hashes_for_same_password === PAUSE TestDestroySessionMaxAge/sets_MaxAge_to_exactly_-1 === PAUSE TestAuthenticate/authenticates_valid_credentials === PAUSE TestCreateUser/rejects_duplicate_user === CONT TestIsSetupRequired/returns_true_when_no_users_exist === CONT TestHashPassword/hashes_password_successfully === CONT TestDestroySessionMaxAge/sets_MaxAge_to_exactly_-1 {"time":"2026-02-20T05:34:10.378353-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHashPasswordhashes_password_successfully1387655390/001/upaas.db"} === CONT TestCreateUserRaceCondition/concurrent_setup_requests_create_only_one_user {"time":"2026-02-20T05:34:10.379027-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestDestroySessionMaxAgesets_MaxAge_to_exactly_-11485633018/001/upaas.db"} {"time":"2026-02-20T05:34:10.380032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateUserRaceConditionconcurrent_setup_requests_create_onl3122237856/001/upaas.db"} === RUN TestAuthenticate/rejects_invalid_password === PAUSE TestAuthenticate/rejects_invalid_password === RUN TestAuthenticate/rejects_unknown_user === PAUSE TestAuthenticate/rejects_unknown_user === CONT TestSessionCookieSecureFlag/secure_flag_is_true_when_debug_is_false {"time":"2026-02-20T05:34:10.381134-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.382017-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestIsSetupRequiredreturns_true_when_no_users_exist183939775/001/upaas.db"} === CONT TestAuthenticate/authenticates_valid_credentials {"time":"2026-02-20T05:34:10.382784-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} === CONT TestAuthenticate/rejects_unknown_user {"time":"2026-02-20T05:34:10.386676-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} === CONT TestCreateUser/creates_user_successfully {"time":"2026-02-20T05:34:10.38728-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAuthenticaterejects_unknown_user3567726174/001/upaas.db"} {"time":"2026-02-20T05:34:10.387846-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAuthenticateauthenticates_valid_credentials1101131049/001/upaas.db"} === CONT TestAuthenticate/rejects_invalid_password === CONT TestCreateUser/rejects_duplicate_user {"time":"2026-02-20T05:34:10.388852-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.388919-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateUserrejects_duplicate_user1153535469/001/upaas.db"} {"time":"2026-02-20T05:34:10.390152-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.393102-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} === CONT TestHashPassword/produces_different_hashes_for_same_password {"time":"2026-02-20T05:34:10.393591-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} === PAUSE TestVerifyPassword/verifies_correct_password === RUN TestVerifyPassword/rejects_incorrect_password === PAUSE TestVerifyPassword/rejects_incorrect_password === RUN TestVerifyPassword/rejects_empty_password === PAUSE TestVerifyPassword/rejects_empty_password === RUN TestVerifyPassword/rejects_invalid_hash_format === PAUSE TestVerifyPassword/rejects_invalid_hash_format === CONT TestVerifyPassword/rejects_incorrect_password === CONT TestVerifyPassword/rejects_invalid_hash_format === CONT TestVerifyPassword/verifies_correct_password {"time":"2026-02-20T05:34:10.394954-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVerifyPasswordrejects_incorrect_password3639795686/001/upaas.db"} {"time":"2026-02-20T05:34:10.395607-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVerifyPasswordverifies_correct_password2245656040/001/upaas.db"} === CONT TestVerifyPassword/rejects_empty_password {"time":"2026-02-20T05:34:10.396091-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestSessionCookieSecureFlagsecure_flag_is_true_when_debug_is_fa228695512/001/upaas.db"} {"time":"2026-02-20T05:34:10.396794-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVerifyPasswordrejects_invalid_hash_format815851559/001/upaas.db"} {"time":"2026-02-20T05:34:10.406966-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestVerifyPasswordrejects_empty_password626349138/001/upaas.db"} {"time":"2026-02-20T05:34:10.407134-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.408236-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.408334-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.408936-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.409314-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.410245-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.419454-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.421256-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHashPasswordproduces_different_hashes_for_same_password4176058131/001/upaas.db"} {"time":"2026-02-20T05:34:10.42123-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.421725-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.422179-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestIsSetupRequired (0.00s) --- PASS: TestIsSetupRequired/returns_true_when_no_users_exist (0.05s) {"time":"2026-02-20T05:34:10.423225-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.424216-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.42494-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.426222-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.426608-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.427107-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.427438-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.42776-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.428255-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.42849-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} --- PASS: TestDestroySessionMaxAge (0.00s) --- PASS: TestDestroySessionMaxAge/sets_MaxAge_to_exactly_-1 (0.05s) {"time":"2026-02-20T05:34:10.430215-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.430909-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.431316-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.431662-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.431945-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.432148-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.442847-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.443428-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.443685-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.443917-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.444067-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.44422-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.447067-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.447739-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.447918-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.448163-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.448288-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestAuthenticaterejects_invalid_password1796847418/001/upaas.db"} {"time":"2026-02-20T05:34:10.448323-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.450209-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.450767-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.45093-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.451168-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.451519-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.459443-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.459805-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestCreateUsercreates_user_successfully4136041574/001/upaas.db"} {"time":"2026-02-20T05:34:10.460571-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.462288-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.462738-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.462861-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.463367-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.463766-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.465356-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.465429-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.465626-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.466728-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.468026-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.468475-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.468488-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.469002-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.469173-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.469393-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.469544-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.468058-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.47017-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.471049-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.471583-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.47392-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.475009-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.475187-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.475356-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.476075-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.476363-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.476773-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.480169-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.480359-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.480517-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.483839-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.484335-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.485345-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.485559-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.485741-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.532241-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.5326-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.533945-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.534311-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.741336-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin3"} {"time":"2026-02-20T05:34:10.759892-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.785051-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.801515-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} {"time":"2026-02-20T05:34:10.881322-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} --- PASS: TestCreateUserRaceCondition (0.00s) --- PASS: TestCreateUserRaceCondition/concurrent_setup_requests_create_only_one_user (0.52s) {"time":"2026-02-20T05:34:10.922252-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/auth.(*Service).CreateUser","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/auth/auth.go","line":188},"msg":"user created","username":"admin"} --- PASS: TestHashPassword (0.00s) --- PASS: TestHashPassword/hashes_password_successfully (0.36s) --- PASS: TestHashPassword/produces_different_hashes_for_same_password (0.55s) --- PASS: TestAuthenticate (0.01s) --- PASS: TestAuthenticate/rejects_unknown_user (0.10s) --- PASS: TestAuthenticate/authenticates_valid_credentials (0.58s) --- PASS: TestAuthenticate/rejects_invalid_password (0.58s) --- PASS: TestVerifyPassword (0.02s) --- PASS: TestVerifyPassword/rejects_invalid_hash_format (0.07s) --- PASS: TestVerifyPassword/verifies_correct_password (0.57s) --- PASS: TestVerifyPassword/rejects_empty_password (0.57s) --- PASS: TestVerifyPassword/rejects_incorrect_password (0.60s) --- PASS: TestSessionCookieSecureFlag (0.00s) --- PASS: TestSessionCookieSecureFlag/secure_flag_is_true_when_debug_is_false (0.62s) --- PASS: TestCreateUser (0.00s) --- PASS: TestCreateUser/creates_user_successfully (0.40s) --- PASS: TestCreateUser/rejects_duplicate_user (0.64s) PASS ok git.eeqj.de/sneak/upaas/internal/service/auth (cached) === RUN TestCancelActiveDeploy_NoExisting === PAUSE TestCancelActiveDeploy_NoExisting === RUN TestCancelActiveDeploy_CancelsAndWaits === PAUSE TestCancelActiveDeploy_CancelsAndWaits === RUN TestCancelActiveDeploy_BlocksUntilDone === PAUSE TestCancelActiveDeploy_BlocksUntilDone === RUN TestTryLockApp_PreventsConcurrent === PAUSE TestTryLockApp_PreventsConcurrent === RUN TestCancelActiveDeploy_AllowsNewDeploy === PAUSE TestCancelActiveDeploy_AllowsNewDeploy === RUN TestCleanupCancelledDeploy_RemovesBuildDir === PAUSE TestCleanupCancelledDeploy_RemovesBuildDir === RUN TestCleanupCancelledDeploy_NoBuildDir === PAUSE TestCleanupCancelledDeploy_NoBuildDir === CONT TestCancelActiveDeploy_BlocksUntilDone 2026/02/20 05:34:10 INFO cancelling in-progress deployment app_id=app-2 === CONT TestTryLockApp_PreventsConcurrent --- PASS: TestTryLockApp_PreventsConcurrent (0.00s) === CONT TestCancelActiveDeploy_AllowsNewDeploy 2026/02/20 05:34:10 INFO cancelling in-progress deployment app_id=app-3 === CONT TestCancelActiveDeploy_CancelsAndWaits 2026/02/20 05:34:10 INFO cancelling in-progress deployment app_id=app-1 --- PASS: TestCancelActiveDeploy_CancelsAndWaits (0.00s) --- PASS: TestCancelActiveDeploy_AllowsNewDeploy (0.00s) === CONT TestCancelActiveDeploy_NoExisting --- PASS: TestCancelActiveDeploy_NoExisting (0.00s) === CONT TestCleanupCancelledDeploy_RemovesBuildDir === CONT TestCleanupCancelledDeploy_NoBuildDir --- PASS: TestCleanupCancelledDeploy_NoBuildDir (0.00s) --- PASS: TestCleanupCancelledDeploy_RemovesBuildDir (0.00s) --- PASS: TestCancelActiveDeploy_BlocksUntilDone (0.05s) PASS ok git.eeqj.de/sneak/upaas/internal/service/deploy (cached) ? git.eeqj.de/sneak/upaas/internal/service/notify [no test files] === RUN TestExtractBranch === PAUSE TestExtractBranch === RUN TestHandleWebhookMatchingBranch === PAUSE TestHandleWebhookMatchingBranch === RUN TestHandleWebhookNonMatchingBranch === PAUSE TestHandleWebhookNonMatchingBranch === RUN TestHandleWebhookInvalidJSON === PAUSE TestHandleWebhookInvalidJSON === RUN TestHandleWebhookEmptyPayload === PAUSE TestHandleWebhookEmptyPayload === RUN TestGiteaPushPayloadParsing === PAUSE TestGiteaPushPayloadParsing === RUN TestSetupTestService === PAUSE TestSetupTestService === CONT TestHandleWebhookNonMatchingBranch === CONT TestHandleWebhookEmptyPayload === CONT TestHandleWebhookMatchingBranch === CONT TestSetupTestService === RUN TestSetupTestService/creates_working_test_service === PAUSE TestSetupTestService/creates_working_test_service === CONT TestGiteaPushPayloadParsing === RUN TestGiteaPushPayloadParsing/parses_full_payload === PAUSE TestGiteaPushPayloadParsing/parses_full_payload === CONT TestSetupTestService/creates_working_test_service === CONT TestGiteaPushPayloadParsing/parses_full_payload === CONT TestHandleWebhookInvalidJSON === CONT TestExtractBranch === RUN TestExtractBranch/extracts_main_branch === PAUSE TestExtractBranch/extracts_main_branch === RUN TestExtractBranch/extracts_feature_branch === PAUSE TestExtractBranch/extracts_feature_branch === RUN TestExtractBranch/extracts_develop_branch === PAUSE TestExtractBranch/extracts_develop_branch === RUN TestExtractBranch/returns_raw_ref_if_no_prefix === PAUSE TestExtractBranch/returns_raw_ref_if_no_prefix === RUN TestExtractBranch/handles_empty_ref === PAUSE TestExtractBranch/handles_empty_ref === RUN TestExtractBranch/handles_partial_prefix === PAUSE TestExtractBranch/handles_partial_prefix === CONT TestExtractBranch/extracts_main_branch --- PASS: TestGiteaPushPayloadParsing (0.00s) --- PASS: TestGiteaPushPayloadParsing/parses_full_payload (0.00s) === CONT TestExtractBranch/handles_empty_ref === CONT TestExtractBranch/extracts_develop_branch === CONT TestExtractBranch/returns_raw_ref_if_no_prefix === CONT TestExtractBranch/handles_partial_prefix === CONT TestExtractBranch/extracts_feature_branch {"time":"2026-02-20T05:34:10.730432-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookEmptyPayload1899348622/001/upaas.db"} {"time":"2026-02-20T05:34:10.730437-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_develop_branch3666736167/001/upaas.db"} {"time":"2026-02-20T05:34:10.731344-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchreturns_raw_ref_if_no_prefix4016744044/001/upaas.db"} {"time":"2026-02-20T05:34:10.731625-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchhandles_empty_ref484141681/001/upaas.db"} {"time":"2026-02-20T05:34:10.731613-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookMatchingBranch1917234251/001/upaas.db"} {"time":"2026-02-20T05:34:10.731462-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_main_branch2594283243/001/upaas.db"} {"time":"2026-02-20T05:34:10.731768-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_feature_branch881418541/001/upaas.db"} {"time":"2026-02-20T05:34:10.731801-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestSetupTestServicecreates_working_test_service970206388/001/upaas.db"} {"time":"2026-02-20T05:34:10.731917-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchhandles_partial_prefix3272899025/001/upaas.db"} {"time":"2026-02-20T05:34:10.732111-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookInvalidJSON2200266918/001/upaas.db"} {"time":"2026-02-20T05:34:10.733223-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).connect","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/database.go","line":155},"msg":"database connected","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookNonMatchingBranch2945905381/001/upaas.db"} {"time":"2026-02-20T05:34:10.736129-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.738352-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.738575-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.750483-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.750684-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.751561-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.752316-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.753418-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.75353-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.753822-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.754032-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.754383-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.754385-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.754497-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.754568-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.755828-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.763178-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.763179-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.764329-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.764624-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.766613-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.767247-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.767446-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.769496-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.769623-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.769787-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.770061-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.770091-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.770146-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.771023-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.771319-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.772537-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.772622-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.772694-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.773154-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.773295-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.773308-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.773406-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.77337-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.773469-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"main","matched":true,"commit":""} {"time":"2026-02-20T05:34:10.773817-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.773723-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.774037-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.774215-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"","matched":true,"commit":""} {"time":"2026-02-20T05:34:10.774406-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"develop","matched":true,"commit":""} {"time":"2026-02-20T05:34:10.774588-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: docker client not connected"} {"time":"2026-02-20T05:34:10.774709-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.775081-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.775414-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: invalid branch name: \"\""} {"time":"2026-02-20T05:34:10.775436-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchreturns_raw_ref_if_no_prefix4016744044/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.775556-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: docker client not connected"} {"time":"2026-02-20T05:34:10.77578-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: docker client not connected","app":"test-app"} {"time":"2026-02-20T05:34:10.775842-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchhandles_empty_ref484141681/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.776068-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_develop_branch3666736167/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.77611-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: invalid branch name: \"\"","app":"test-app"} {"time":"2026-02-20T05:34:10.776246-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: docker client not connected","app":"test-app"} {"time":"2026-02-20T05:34:10.778103-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.778699-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.778885-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.778979-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.779644-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.779645-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.780232-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.780245-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.780291-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.780702-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.780787-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.780905-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.78097-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.781329-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.781372-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"main","matched":true,"commit":"abc123def456"} {"time":"2026-02-20T05:34:10.781421-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"develop","matched":false,"commit":"def789ghi012"} {"time":"2026-02-20T05:34:10.781802-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.782373-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestHandleWebhookNonMatchingBranch (0.06s) {"time":"2026-02-20T05:34:10.782713-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.782771-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.784049-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.784643-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.784683-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"001_initial.sql"} {"time":"2026-02-20T05:34:10.784082-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.784801-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"","matched":false,"commit":""} {"time":"2026-02-20T05:34:10.784421-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.784345-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.785088-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"feature/new-feature","matched":true,"commit":""} {"time":"2026-02-20T05:34:10.785167-08:00","level":"WARN","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":89},"msg":"failed to parse webhook payload","error":"invalid character 'i' looking for beginning of object key string"} {"time":"2026-02-20T05:34:10.785276-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} {"time":"2026-02-20T05:34:10.784206-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: invalid commit SHA: \"abc123def456\""} {"time":"2026-02-20T05:34:10.786003-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: docker client not connected"} --- PASS: TestHandleWebhookEmptyPayload (0.06s) {"time":"2026-02-20T05:34:10.78602-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.786201-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"","matched":false,"commit":""} {"time":"2026-02-20T05:34:10.786317-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"","matched":true,"commit":""} {"time":"2026-02-20T05:34:10.786392-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":82},"msg":"processing webhook","app":"test-app","event":"push"} {"time":"2026-02-20T05:34:10.786504-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_feature_branch881418541/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.786655-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestHandleWebhookMatchingBranch1917234251/001/logs/Mac.lan guest wan/test-app/test-app_abc123def456_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.786937-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).HandleWebhook","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":117},"msg":"webhook event recorded","app":"test-app","branch":"main","matched":true,"commit":""} {"time":"2026-02-20T05:34:10.786998-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"002_remove_container_id.sql"} {"time":"2026-02-20T05:34:10.787134-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: docker client not connected","app":"test-app"} {"time":"2026-02-20T05:34:10.787141-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: invalid commit SHA: \"abc123def456\"","app":"test-app"} {"time":"2026-02-20T05:34:10.788471-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"003_add_ports.sql"} {"time":"2026-02-20T05:34:10.788504-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: docker client not connected"} --- PASS: TestHandleWebhookInvalidJSON (0.06s) {"time":"2026-02-20T05:34:10.788511-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).failDeployment","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1224},"msg":"deployment failed","app":"test-app","error":"failed to clone repo: invalid branch name: \"\""} {"time":"2026-02-20T05:34:10.78881-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"004_add_commit_url.sql"} {"time":"2026-02-20T05:34:10.789076-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"005_add_webhook_secret_hash.sql"} {"time":"2026-02-20T05:34:10.789323-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/database.(*Database).migrate","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/database/migrations.go","line":62},"msg":"migration applied","migration":"006_add_previous_image_id.sql"} --- PASS: TestSetupTestService (0.00s) --- PASS: TestSetupTestService/creates_working_test_service (0.06s) {"time":"2026-02-20T05:34:10.789858-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchhandles_partial_prefix3272899025/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.78997-08:00","level":"INFO","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/deploy.(*Service).writeLogsToFile","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/deploy/deploy.go","line":1261},"msg":"wrote deployment logs to file","path":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/TestExtractBranchextracts_main_branch2594283243/001/logs/Mac.lan guest wan/test-app/test-app_20260220T133410Z.log.txt"} {"time":"2026-02-20T05:34:10.790255-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: invalid branch name: \"\"","app":"test-app"} {"time":"2026-02-20T05:34:10.790261-08:00","level":"ERROR","source":{"function":"git.eeqj.de/sneak/upaas/internal/service/webhook.(*Service).triggerDeployment.func1","file":"/var/folders/nq/wq3c5mv50nb4fnymxft9ggv40000gn/T/tmp.Pra3585UCP/internal/service/webhook/webhook.go","line":148},"msg":"deployment failed","error":"failed to clone repo: docker client not connected","app":"test-app"} --- PASS: TestHandleWebhookMatchingBranch (0.16s) --- PASS: TestExtractBranch (0.00s) --- PASS: TestExtractBranch/returns_raw_ref_if_no_prefix (0.15s) --- PASS: TestExtractBranch/handles_empty_ref (0.15s) --- PASS: TestExtractBranch/extracts_develop_branch (0.15s) --- PASS: TestExtractBranch/extracts_feature_branch (0.16s) --- PASS: TestExtractBranch/extracts_main_branch (0.16s) --- PASS: TestExtractBranch/handles_partial_prefix (0.16s) PASS ok git.eeqj.de/sneak/upaas/internal/service/webhook (cached) === RUN TestGenerateKeyPair === PAUSE TestGenerateKeyPair === RUN TestValidatePrivateKey === PAUSE TestValidatePrivateKey === CONT TestValidatePrivateKey === RUN TestValidatePrivateKey/validates_generated_key === PAUSE TestValidatePrivateKey/validates_generated_key === RUN TestValidatePrivateKey/rejects_invalid_key === PAUSE TestValidatePrivateKey/rejects_invalid_key === RUN TestValidatePrivateKey/rejects_empty_key === PAUSE TestValidatePrivateKey/rejects_empty_key === CONT TestGenerateKeyPair === CONT TestValidatePrivateKey/rejects_invalid_key === CONT TestValidatePrivateKey/rejects_empty_key === CONT TestValidatePrivateKey/validates_generated_key === RUN TestGenerateKeyPair/generates_valid_key_pair === PAUSE TestGenerateKeyPair/generates_valid_key_pair === RUN TestGenerateKeyPair/generates_unique_keys_each_time === PAUSE TestGenerateKeyPair/generates_unique_keys_each_time === CONT TestGenerateKeyPair/generates_valid_key_pair === CONT TestGenerateKeyPair/generates_unique_keys_each_time --- PASS: TestValidatePrivateKey (0.00s) --- PASS: TestValidatePrivateKey/rejects_invalid_key (0.00s) --- PASS: TestValidatePrivateKey/rejects_empty_key (0.00s) --- PASS: TestValidatePrivateKey/validates_generated_key (0.01s) --- PASS: TestGenerateKeyPair (0.00s) --- PASS: TestGenerateKeyPair/generates_valid_key_pair (0.01s) --- PASS: TestGenerateKeyPair/generates_unique_keys_each_time (0.01s) PASS ok git.eeqj.de/sneak/upaas/internal/ssh (cached) ? git.eeqj.de/sneak/upaas/static [no test files] ? git.eeqj.de/sneak/upaas/templates [no test files] ==> Building... go build -ldflags "-X main.Version=956a06b -X main.Buildarch=arm64" -o /dev/null ./cmd/upaasd ==> All checks passed! ```
All checks were successful
Check / check (pull_request) Successful in 12m25s
Required
Details

Pull request closed

Sign in to join this conversation.
No description provided.