$ /nix/store/9ypz3flqsrl5xl495mm8h645gadjsxi1-coreutils-9.11/bin/timeout --kill-after=15s 7200s /nix/store/23zk8sgzamrbmj1fday15szf7f2279s8-nix-2.34.7/bin/nix --extra-experimental-features nix-command --extra-experimental-features flakes --log-format internal-json build --no-link --print-out-paths git+https://codeberg.org/mtlynch/little-moments?ref=idea-8-operational-tests&rev=9163dbcbbc1e94a732198da5c46a3ac45323d6bf&shallow=1#packages.x86_64-linux.go-tests --print-build-logs error (ignored): SQLite database '/var/cache/nix-ci-worker/eval-cache-v6/1275312c80fa8216d55ff37dbac9fcfd2d3372f8ef6e043e55bb8567fb1aac53.sqlite' is busy  Building /nix/store/1qpcqixxlfqbx557ivj200llnbnaz2ah-go-tests-0.0.0.drv [go-tests] Phase: unpackPhase [go-tests] unpacking source archive /nix/store/81bp69vphw1m7dg85d6qlaqhv1ja85fg-source [go-tests] source root is source [go-tests] Phase: patchPhase [go-tests] Phase: updateAutotoolsGnuConfigScriptsPhase [go-tests] Phase: configurePhase [go-tests] no configure script, doing nothing [go-tests] Phase: buildPhase [go-tests] patching script interpreter paths in ./dev-scripts [go-tests] ./dev-scripts/reset-db: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/upload-prod-db: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/upload-to-nixci-cache: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/lint-sql: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/check-go-test-packages: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/download-prod-db: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/build-all-flake-targets: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/run-js-tests: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/check-trailing-whitespace: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/git-hooks/pre-commit: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/render-design-doc: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/check-frontend: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/serve: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/run-e2e-tests: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/build-backend: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/run-go-tests: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/check-trailing-newline: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/run-integration-tests: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/check-go-formatting: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/check-bash: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/populate-db: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/package-binaries: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] ./dev-scripts/enable-git-hooks: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash" [go-tests] + set -o pipefail [go-tests] + full_test= [go-tests] + go_test_flags=("-tags=netgo,osusergo") [go-tests] + go_test_flags+=("-fullpath") [go-tests] + readonly COVERAGE_FILE_RAW=.coverage.out [go-tests] + COVERAGE_FILE_RAW=.coverage.out [go-tests] + readonly COVERAGE_FILE_HTML=.coverage.html [go-tests] + COVERAGE_FILE_HTML=.coverage.html [go-tests] + case "${1:-}" in [go-tests] + full_test=1 [go-tests] + go_test_flags+=("-v") [go-tests] + go_test_flags+=("-race") [go-tests] + go_test_flags+=("--coverprofile=${COVERAGE_FILE_RAW}") [go-tests] + [[ 1 -gt 1 ]] [go-tests] + set -u [go-tests] +++ dirname ./dev-scripts/run-go-tests [go-tests] ++ cd ./dev-scripts [go-tests] ++ pwd [go-tests] + SCRIPT_DIR=/build/source/dev-scripts [go-tests] + readonly SCRIPT_DIR [go-tests] + cd /build/source/dev-scripts/.. [go-tests] + go test -tags=netgo,osusergo -fullpath -v -race --coverprofile=.coverage.out ./... [go-tests]  codeberg.org/mtlynch/little-moments/build coverage: 0.0% of statements [go-tests]  codeberg.org/mtlynch/little-moments/cmd/app coverage: 0.0% of statements [go-tests]  codeberg.org/mtlynch/little-moments/cmd/import-from-tinybeans coverage: 0.0% of statements [go-tests]  codeberg.org/mtlynch/little-moments/convert coverage: 0.0% of statements [go-tests] === RUN TestAboutPageIncludesVersionMetadata [go-tests] 2026/08/03 16:40:45 reading DB from file:/TestAboutPageIncludesVersionMetadata_0xc00011a488?vfs=memdb [go-tests] 2026/08/03 16:40:52 CSP media origin: "" [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestAboutPageIncludesVersionMetadata (6.26s) [go-tests] === RUN TestAuthServiceRequireAuth [go-tests] === RUN TestAuthServiceRequireAuth/valid_session_calls_next_handler [go-tests] === RUN TestAuthServiceRequireAuth/unexpected_session_lookup_error_returns_error [go-tests] 2026/08/03 16:40:52 failed to read auth session from context: session backend unavailable [go-tests] === RUN TestAuthServiceRequireAuth/missing_session_redirects_to_login [go-tests] --- PASS: TestAuthServiceRequireAuth (0.00s) [go-tests]  --- PASS: TestAuthServiceRequireAuth/valid_session_calls_next_handler (0.00s) [go-tests]  --- PASS: TestAuthServiceRequireAuth/unexpected_session_lookup_error_returns_error (0.00s) [go-tests]  --- PASS: TestAuthServiceRequireAuth/missing_session_redirects_to_login (0.00s) [go-tests] === RUN TestAuthFlow [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestAuthFlow_0xc00399d8c8?vfs=memdb [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 login confirm: consumed token for user 11111111-1111-4111-8111-111111111111 [go-tests] --- PASS: TestAuthFlow (0.01s) [go-tests] === RUN TestLoginPostRejectsOpenRedirectNextURL [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsOpenRedirectNextURL_0xc003bfe008?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestLoginPostRejectsOpenRedirectNextURL (0.01s) [go-tests] === RUN TestLoginConfirmPost [go-tests] === RUN TestLoginConfirmPost/missing_token_returns_400 [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/missing_token_returns_400_0xc003bfe488?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestLoginConfirmPost/malformed_token_returns_400 [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/malformed_token_returns_400_0xc003bfe6c8?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 login confirm: invalid token format: invalid login token: must be 32 alphanumeric characters [go-tests] === RUN TestLoginConfirmPost/well-formed_token_that's_not_in_store_returns_401 [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/well-formed_token_that%27s_not_in_store_returns_401_0xc003bfe908?vfs=memdb [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 login confirm: invalid token attempt [go-tests] === RUN TestLoginConfirmPost/valid_token_that's_expired_returns_401 [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/valid_token_that%27s_expired_returns_401_0xc003c90008?vfs=memdb [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 login confirm: expired token attempt [go-tests] === RUN TestLoginConfirmPost/valid_token_that's_already_used_returns_401 [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/valid_token_that%27s_already_used_returns_401_0xc003c90248?vfs=memdb [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 login confirm: already-used token attempt [go-tests] === RUN TestLoginConfirmPost/used_token_for_signed-in_user_redirects_root [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/used_token_for_signed-in_user_redirects_root_0xc003c90488?vfs=memdb [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestLoginConfirmPost/valid_token_with_session_creation_failure_returns_500 [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/valid_token_with_session_creation_failure_returns_500_0xc003c90908?vfs=memdb [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 login confirm: consumed token for user 11111111-1111-4111-8111-111111111111 [go-tests] 2026/08/03 16:40:52 login confirm: failed to confirm login: create auth session: session broken [go-tests] === RUN TestLoginConfirmPost/valid_token_with_successful_session_creation_redirects_to_stored_next_path [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/valid_token_with_successful_session_creation_redirects_to_stored_next_path_0xc003c90b48?vfs=memdb [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 login confirm: consumed token for user 11111111-1111-4111-8111-111111111111 [go-tests] --- PASS: TestLoginConfirmPost (0.05s) [go-tests]  --- PASS: TestLoginConfirmPost/missing_token_returns_400 (0.01s) [go-tests]  --- PASS: TestLoginConfirmPost/malformed_token_returns_400 (0.01s) [go-tests]  --- PASS: TestLoginConfirmPost/well-formed_token_that's_not_in_store_returns_401 (0.01s) [go-tests]  --- PASS: TestLoginConfirmPost/valid_token_that's_expired_returns_401 (0.01s) [go-tests]  --- PASS: TestLoginConfirmPost/valid_token_that's_already_used_returns_401 (0.01s) [go-tests]  --- PASS: TestLoginConfirmPost/used_token_for_signed-in_user_redirects_root (0.01s) [go-tests]  --- PASS: TestLoginConfirmPost/valid_token_with_session_creation_failure_returns_500 (0.01s) [go-tests]  --- PASS: TestLoginConfirmPost/valid_token_with_successful_session_creation_redirects_to_stored_next_path (0.01s) [go-tests] === RUN TestConfirmLoginPreservesUsedTokenErrorWhenSessionReadFails [go-tests] --- PASS: TestConfirmLoginPreservesUsedTokenErrorWhenSessionReadFails (0.00s) [go-tests] === RUN TestLoginPostRejectsMalformedFormBody [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsMalformedFormBody_0xc003c90fc8?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestLoginPostRejectsMalformedFormBody (0.01s) [go-tests] === RUN TestLoginPostRendersCheckEmailPageRegardlessOfRegistration [go-tests] === RUN TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/registered_email_shows_check-email_page [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/registered_email_shows_check-email_page_0xc003c91448?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] === RUN TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/unregistered_email_shows_check-email_page [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/unregistered_email_shows_check-email_page_0xc003c91b08?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 login attempt from unregistered email: unregistered@example.com [go-tests] --- PASS: TestLoginPostRendersCheckEmailPageRegardlessOfRegistration (0.01s) [go-tests]  --- PASS: TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/registered_email_shows_check-email_page (0.01s) [go-tests]  --- PASS: TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/unregistered_email_shows_check-email_page (0.01s) [go-tests] === RUN TestLoginPostDoesNotLeakTokenInProdMode [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostDoesNotLeakTokenInProdMode_0xc004776248?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111 [go-tests] --- PASS: TestLoginPostDoesNotLeakTokenInProdMode (0.01s) [go-tests] === RUN TestLoginPostRejectsInvalidNextPath [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/protocol-relative_next_path_is_invalid [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/protocol-relative_next_path_is_invalid_0xc004776b48?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/next_path_without_leading_slash_is_invalid [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/next_path_without_leading_slash_is_invalid_0xc004776008?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/malformed_next_path_is_invalid [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/malformed_next_path_is_invalid_0xc004776248?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/http_next_path_is_invalid [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/http_next_path_is_invalid_0xc004776488?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/https_next_path_is_invalid [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/https_next_path_is_invalid_0xc0047766c8?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/non-http_absolute_next_path_is_invalid [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/non-http_absolute_next_path_is_invalid_0xc004776d88?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestLoginPostRejectsInvalidNextPath (0.03s) [go-tests]  --- PASS: TestLoginPostRejectsInvalidNextPath/protocol-relative_next_path_is_invalid (0.01s) [go-tests]  --- PASS: TestLoginPostRejectsInvalidNextPath/next_path_without_leading_slash_is_invalid (0.01s) [go-tests]  --- PASS: TestLoginPostRejectsInvalidNextPath/malformed_next_path_is_invalid (0.01s) [go-tests]  --- PASS: TestLoginPostRejectsInvalidNextPath/http_next_path_is_invalid (0.00s) [go-tests]  --- PASS: TestLoginPostRejectsInvalidNextPath/https_next_path_is_invalid (0.00s) [go-tests]  --- PASS: TestLoginPostRejectsInvalidNextPath/non-http_absolute_next_path_is_invalid (0.00s) [go-tests] === RUN TestLoginPostRejectsInvalidEmail [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidEmail_0xc004776fc8?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestLoginPostRejectsInvalidEmail (0.00s) [go-tests] === RUN TestLoginPostReturnsTooManyRequestsAfterIPv4Limit [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostReturnsTooManyRequestsAfterIPv4Limit_0xc004777208?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestLoginPostReturnsTooManyRequestsAfterIPv4Limit (0.00s) [go-tests] === RUN TestLoginPostDoesNotApplyIPv4LimitToIPv6 [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostDoesNotApplyIPv4LimitToIPv6_0xc0047778c8?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestLoginPostDoesNotApplyIPv4LimitToIPv6 (0.00s) [go-tests] === RUN TestLoginPostReturnsTooManyRequestsWhenRateLimited [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostReturnsTooManyRequestsWhenRateLimited_0xc00011a488?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestLoginPostReturnsTooManyRequestsWhenRateLimited (0.00s) [go-tests] === RUN TestLoginPostReturnsErrorWhenTokenCreationFails [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostReturnsErrorWhenTokenCreationFails_0xc00011a6c8?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:52 failed to create login token: database unavailable [go-tests] --- PASS: TestLoginPostReturnsErrorWhenTokenCreationFails (0.00s) [go-tests] === RUN TestMediaCaptionGetRequiresOwner [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestMediaCaptionGetRequiresOwner_0xc00011a908?vfs=memdb [go-tests] === RUN TestMediaCaptionGetRequiresOwner/owner_can_view_the_caption [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestMediaCaptionGetRequiresOwner/subscriber_is_forbidden_from_viewing_the_caption [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestMediaCaptionGetRequiresOwner (0.01s) [go-tests]  --- PASS: TestMediaCaptionGetRequiresOwner/owner_can_view_the_caption (0.00s) [go-tests]  --- PASS: TestMediaCaptionGetRequiresOwner/subscriber_is_forbidden_from_viewing_the_caption (0.00s) [go-tests] === RUN TestMediaCaptionEditGetRequiresOwner [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestMediaCaptionEditGetRequiresOwner_0xc00011ad88?vfs=memdb [go-tests] === RUN TestMediaCaptionEditGetRequiresOwner/owner_can_view_the_caption_editor [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestMediaCaptionEditGetRequiresOwner/subscriber_is_forbidden_from_viewing_the_caption_editor [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestMediaCaptionEditGetRequiresOwner (0.01s) [go-tests]  --- PASS: TestMediaCaptionEditGetRequiresOwner/owner_can_view_the_caption_editor (0.00s) [go-tests]  --- PASS: TestMediaCaptionEditGetRequiresOwner/subscriber_is_forbidden_from_viewing_the_caption_editor (0.00s) [go-tests] === RUN TestMediaCaptionPutRequiresOwner [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestMediaCaptionPutRequiresOwner_0xc00011b448?vfs=memdb [go-tests] === RUN TestMediaCaptionPutRequiresOwner/owner_reaches_the_caption_update_handler [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestMediaCaptionPutRequiresOwner/subscriber_is_forbidden_from_updating_the_caption [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestMediaCaptionPutRequiresOwner (0.01s) [go-tests]  --- PASS: TestMediaCaptionPutRequiresOwner/owner_reaches_the_caption_update_handler (0.00s) [go-tests]  --- PASS: TestMediaCaptionPutRequiresOwner/subscriber_is_forbidden_from_updating_the_caption (0.00s) [go-tests] === RUN TestStaticFilesUseCacheControlAndETag [go-tests] --- PASS: TestStaticFilesUseCacheControlAndETag (0.01s) [go-tests] === RUN TestStaticFilesReturnNotModifiedForMatchingETag [go-tests] --- PASS: TestStaticFilesReturnNotModifiedForMatchingETag (0.00s) [go-tests] === RUN TestStaticFilesServeAssetRanges [go-tests] --- PASS: TestStaticFilesServeAssetRanges (0.00s) [go-tests] === RUN TestRelativeTime [go-tests] === RUN TestRelativeTime/30_seconds_ago_is_just_now [go-tests] === RUN TestRelativeTime/just_under_2_minutes_is_just_now [go-tests] === RUN TestRelativeTime/45_minutes_ago [go-tests] === RUN TestRelativeTime/5_hours_ago [go-tests] === RUN TestRelativeTime/3_days_ago [go-tests] === RUN TestRelativeTime/3_weeks_ago [go-tests] === RUN TestRelativeTime/60_days_ago_is_2_months_ago [go-tests] === RUN TestRelativeTime/800_days_ago_is_2_years_ago [go-tests] --- PASS: TestRelativeTime (0.00s) [go-tests]  --- PASS: TestRelativeTime/30_seconds_ago_is_just_now (0.00s) [go-tests]  --- PASS: TestRelativeTime/just_under_2_minutes_is_just_now (0.00s) [go-tests]  --- PASS: TestRelativeTime/45_minutes_ago (0.00s) [go-tests]  --- PASS: TestRelativeTime/5_hours_ago (0.00s) [go-tests]  --- PASS: TestRelativeTime/3_days_ago (0.00s) [go-tests]  --- PASS: TestRelativeTime/3_weeks_ago (0.00s) [go-tests]  --- PASS: TestRelativeTime/60_days_ago_is_2_months_ago (0.00s) [go-tests]  --- PASS: TestRelativeTime/800_days_ago_is_2_years_ago (0.00s) [go-tests] === RUN TestUploadGetRequiresOwner [go-tests] === RUN TestUploadGetRequiresOwner/unauthenticated_user_is_redirected_to_login [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadGetRequiresOwner/unauthenticated_user_is_redirected_to_login_0xc00096fb08?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestUploadGetRequiresOwner/subscriber_is_forbidden [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadGetRequiresOwner/subscriber_is_forbidden_0xc00096fd48?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestUploadGetRequiresOwner/owner_sees_the_upload_form [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadGetRequiresOwner/owner_sees_the_upload_form_0xc000bd8008?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadGetRequiresOwner (0.02s) [go-tests]  --- PASS: TestUploadGetRequiresOwner/unauthenticated_user_is_redirected_to_login (0.01s) [go-tests]  --- PASS: TestUploadGetRequiresOwner/subscriber_is_forbidden (0.00s) [go-tests]  --- PASS: TestUploadGetRequiresOwner/owner_sees_the_upload_form (0.00s) [go-tests] === RUN TestUploadImageCreatesItemAndWritesFiles [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadImageCreatesItemAndWritesFiles_0xc000bd86c8?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadImageCreatesItemAndWritesFiles (0.31s) [go-tests] === RUN TestUploadAnimatedImageCreatesItem [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadAnimatedImageCreatesItem_0xc000bd8008?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadAnimatedImageCreatesItem (0.04s) [go-tests] === RUN TestUploadAnimatedImageRejectsUnreadableImage [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadAnimatedImageRejectsUnreadableImage_0xc000bd8248?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadAnimatedImageRejectsUnreadableImage (0.01s) [go-tests] === RUN TestUploadImageRouteRejectsOversizedFile [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadImageRouteRejectsOversizedFile_0xc000bd8488?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadImageRouteRejectsOversizedFile (1.84s) [go-tests] === RUN TestUploadImageRouteRejectsUnsupportedFile [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadImageRouteRejectsUnsupportedFile_0xc000bd8008?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadImageRouteRejectsUnsupportedFile (0.00s) [go-tests] === RUN TestUploadVideoRouteRejectsUnsupportedFileBeforeReadingBody [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsUnsupportedFileBeforeReadingBody_0xc000bd8248?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadVideoRouteRejectsUnsupportedFileBeforeReadingBody (0.00s) [go-tests] === RUN TestUploadVideoRouteRejectsOversizedFile [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsOversizedFile_0xc000bd86c8?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadVideoRouteRejectsOversizedFile (0.00s) [go-tests] === RUN TestUploadVideoRouteRejectsVideoOverDurationLimit [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsVideoOverDurationLimit_0xc000bd8908?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadVideoRouteRejectsVideoOverDurationLimit (0.00s) [go-tests] === RUN TestUploadVideoRouteRejectsZeroDurationVideo [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsZeroDurationVideo_0xc000bd8b48?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:54 failed to read video: unreadable video: invalid video duration: must be greater than zero [go-tests] --- PASS: TestUploadVideoRouteRejectsZeroDurationVideo (0.00s) [go-tests] === RUN TestUploadVideoRouteRejectsInvalidCaption [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsInvalidCaption_0xc000bd8d88?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadVideoRouteRejectsInvalidCaption (0.00s) [go-tests] === RUN TestUploadVideoRouteCreatesItem [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteCreatesItem_0xc000bd8fc8?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadVideoRouteCreatesItem (0.01s) [go-tests] === RUN TestUploadVideoTranscodeErrorCreatesNoItem [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoTranscodeErrorCreatesNoItem_0xc000bd9208?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] 2026/08/03 16:40:54 failed to process video: unexpected EOF [go-tests] --- PASS: TestUploadVideoTranscodeErrorCreatesNoItem (0.00s) [go-tests] === RUN TestUploadPostRejectsSubscriber [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadPostRejectsSubscriber_0xc000bd9448?vfs=memdb [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store [go-tests] --- PASS: TestUploadPostRejectsSubscriber (0.00s) [go-tests] PASS [go-tests] coverage: 62.2% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/handlers 9.810s coverage: 62.2% of statements [go-tests] === RUN TestGenerateSquareThumbnail [go-tests] === RUN TestGenerateSquareThumbnail/landscape_image_produces_square_thumbnail [go-tests] === RUN TestGenerateSquareThumbnail/portrait_image_produces_square_thumbnail [go-tests] === RUN TestGenerateSquareThumbnail/square_image_produces_square_thumbnail [go-tests] === RUN TestGenerateSquareThumbnail/returns_error_when_source_contains_invalid_image_data [go-tests] --- PASS: TestGenerateSquareThumbnail (0.06s) [go-tests]  --- PASS: TestGenerateSquareThumbnail/landscape_image_produces_square_thumbnail (0.01s) [go-tests]  --- PASS: TestGenerateSquareThumbnail/portrait_image_produces_square_thumbnail (0.01s) [go-tests]  --- PASS: TestGenerateSquareThumbnail/square_image_produces_square_thumbnail (0.01s) [go-tests]  --- PASS: TestGenerateSquareThumbnail/returns_error_when_source_contains_invalid_image_data (0.00s) [go-tests] === RUN TestDimensionsReportsImageSize [go-tests] --- PASS: TestDimensionsReportsImageSize (0.05s) [go-tests] === RUN TestStripMetadataPreservesDimensions [go-tests] --- PASS: TestStripMetadataPreservesDimensions (0.03s) [go-tests] === RUN TestStripMetadataStripsExif [go-tests] --- PASS: TestStripMetadataStripsExif (0.04s) [go-tests] === RUN TestResizeToWidth [go-tests] === RUN TestResizeToWidth/landscape_image_resized_to_target_width [go-tests] === RUN TestResizeToWidth/portrait_image_resized_to_target_width [go-tests] === RUN TestResizeToWidth/returns_error_when_source_contains_invalid_image_data [go-tests] --- PASS: TestResizeToWidth (0.04s) [go-tests]  --- PASS: TestResizeToWidth/landscape_image_resized_to_target_width (0.02s) [go-tests]  --- PASS: TestResizeToWidth/portrait_image_resized_to_target_width (0.02s) [go-tests]  --- PASS: TestResizeToWidth/returns_error_when_source_contains_invalid_image_data (0.00s) [go-tests] PASS [go-tests] coverage: 90.9% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/images 1.247s coverage: 90.9% of statements [go-tests] === RUN TestImportMedia [go-tests] === RUN TestImportMedia/copies_image_file_verbatim_to_destination [go-tests] === RUN TestImportMedia/converts_video_using_injected_converter [go-tests] === RUN TestImportMedia/returns_error_when_video_converter_fails [go-tests] === RUN TestImportMedia/converts_animated_GIF_using_injected_converter [go-tests] === RUN TestImportMedia/returns_error_when_GIF_converter_fails [go-tests] --- PASS: TestImportMedia (0.02s) [go-tests]  --- PASS: TestImportMedia/copies_image_file_verbatim_to_destination (0.02s) [go-tests]  --- PASS: TestImportMedia/converts_video_using_injected_converter (0.00s) [go-tests]  --- PASS: TestImportMedia/returns_error_when_video_converter_fails (0.00s) [go-tests]  --- PASS: TestImportMedia/converts_animated_GIF_using_injected_converter (0.00s) [go-tests]  --- PASS: TestImportMedia/returns_error_when_GIF_converter_fails (0.00s) [go-tests] PASS [go-tests] coverage: 100.0% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/importers 1.049s coverage: 100.0% of statements [go-tests] === RUN TestConvert [go-tests] === RUN TestConvert/translates_Tinybeans_reactions_into_little_moments_reactions [go-tests] === RUN TestConvert/fails_on_unsupported_Tinybeans_reactions [go-tests] === RUN TestConvert/flattens_threaded_comments_without_duplicating_the_root_comment [go-tests] === RUN TestConvert/skips_comments_and_reactions_from_users_not_in_followers [go-tests] 2026/08/03 16:40:45 dropping comment by user 999999 on entry 22222222-2222-4222-8222-222222222222: user is not a follower [go-tests] --- PASS: TestConvert (0.00s) [go-tests]  --- PASS: TestConvert/translates_Tinybeans_reactions_into_little_moments_reactions (0.00s) [go-tests]  --- PASS: TestConvert/fails_on_unsupported_Tinybeans_reactions (0.00s) [go-tests]  --- PASS: TestConvert/flattens_threaded_comments_without_duplicating_the_root_comment (0.00s) [go-tests]  --- PASS: TestConvert/skips_comments_and_reactions_from_users_not_in_followers (0.00s) [go-tests] === RUN TestConverterPreservesMediaDataAndDuplicateFollowerIDs [go-tests] --- PASS: TestConverterPreservesMediaDataAndDuplicateFollowerIDs (0.00s) [go-tests] === RUN TestConverterRejectsUnknownUploader [go-tests] --- PASS: TestConverterRejectsUnknownUploader (0.00s) [go-tests] === RUN TestImportWritesMediaAndMetadata [go-tests] 2026/08/03 16:40:45 reading DB from file:/TestImportWritesMediaAndMetadata_0xc000237208?vfs=memdb [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-full.jpg [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-850px.jpg [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-250px.jpg [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-150px.jpg [go-tests] --- PASS: TestImportWritesMediaAndMetadata (7.12s) [go-tests] === RUN TestImportRetainsCompletedEntriesWhenLaterEntryFails [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestImportRetainsCompletedEntriesWhenLaterEntryFails_0xc0036d7b08?vfs=memdb [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-full.jpg [go-tests] 2026/08/03 16:40:53 copied 00000000-0000-4000-8000-000000000001-850px.jpg [go-tests] 2026/08/03 16:40:53 copied 00000000-0000-4000-8000-000000000001-250px.jpg [go-tests] 2026/08/03 16:40:53 copied 00000000-0000-4000-8000-000000000001-150px.jpg [go-tests] --- PASS: TestImportRetainsCompletedEntriesWhenLaterEntryFails (0.18s) [go-tests] === RUN TestSourceForEachEntryReadsRealisticExport [go-tests] 2026/08/03 16:40:53 warning: entry 44444444-4444-4444-8444-444444444444 comment by "Grampa Simpson" (user 800001) missing from followers [go-tests] 2026/08/03 16:40:53 warning: entry 44444444-4444-4444-8444-444444444444 comment by "Marge Simpson" (user 800002) missing from followers [go-tests] 2026/08/03 16:40:53 warning: entry 44444444-4444-4444-8444-444444444444 comment by "Patty Bouvier" (user 800003) missing from followers [go-tests] 2026/08/03 16:40:53 warning: entry 33333333-3333-4333-8333-333333333333 comment by "Grampa Simpson" (user 800001) missing from followers [go-tests] 2026/08/03 16:40:53 warning: entry 11111111-1111-4111-8111-111111111111 comment by "Grampa Simpson" (user 800001) missing from followers [go-tests] --- PASS: TestSourceForEachEntryReadsRealisticExport (0.00s) [go-tests] === RUN TestSourceReturnsExportErrors [go-tests] === RUN TestSourceReturnsExportErrors/missing_journal_file [go-tests] === RUN TestSourceReturnsExportErrors/missing_followers_file [go-tests] === RUN TestSourceReturnsExportErrors/subdirectory_missing_metadata_file [go-tests] === RUN TestSourceReturnsExportErrors/missing_media_file [go-tests] === RUN TestSourceReturnsExportErrors/missing_blobs_field [go-tests] --- PASS: TestSourceReturnsExportErrors (0.00s) [go-tests]  --- PASS: TestSourceReturnsExportErrors/missing_journal_file (0.00s) [go-tests]  --- PASS: TestSourceReturnsExportErrors/missing_followers_file (0.00s) [go-tests]  --- PASS: TestSourceReturnsExportErrors/subdirectory_missing_metadata_file (0.00s) [go-tests]  --- PASS: TestSourceReturnsExportErrors/missing_media_file (0.00s) [go-tests]  --- PASS: TestSourceReturnsExportErrors/missing_blobs_field (0.00s) [go-tests] === RUN TestSourceForEachEntryOrdersByCreationThenPublishTime [go-tests] --- PASS: TestSourceForEachEntryOrdersByCreationThenPublishTime (0.00s) [go-tests] === RUN TestSourceForEachEntryReturnsVisitorError [go-tests] --- PASS: TestSourceForEachEntryReturnsVisitorError (0.00s) [go-tests] PASS [go-tests] coverage: 82.6% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/importers/tinybeans 8.369s coverage: 82.6% of statements [go-tests] === RUN TestParseCommentThread [go-tests] --- PASS: TestParseCommentThread (0.00s) [go-tests] === RUN TestParseFollowers [go-tests] === RUN TestParseFollowers/FATHER_relationship_is_an_admin [go-tests] === RUN TestParseFollowers/MOTHER_relationship_is_an_admin [go-tests] === RUN TestParseFollowers/non-parent_relationship_is_not_an_admin [go-tests] === RUN TestParseFollowers/emailOptOut=true_means_receivesEmails=false [go-tests] === RUN TestParseFollowers/all_email_frequencies_NONE_implies_opt-out [go-tests] === RUN TestParseFollowers/parser_rejects_duplicate_follower_IDs [go-tests] --- PASS: TestParseFollowers (0.00s) [go-tests]  --- PASS: TestParseFollowers/FATHER_relationship_is_an_admin (0.00s) [go-tests]  --- PASS: TestParseFollowers/MOTHER_relationship_is_an_admin (0.00s) [go-tests]  --- PASS: TestParseFollowers/non-parent_relationship_is_not_an_admin (0.00s) [go-tests]  --- PASS: TestParseFollowers/emailOptOut=true_means_receivesEmails=false (0.00s) [go-tests]  --- PASS: TestParseFollowers/all_email_frequencies_NONE_implies_opt-out (0.00s) [go-tests]  --- PASS: TestParseFollowers/parser_rejects_duplicate_follower_IDs (0.00s) [go-tests] === RUN TestParseJournal [go-tests] === RUN TestParseJournal/parses_journal_title [go-tests] --- PASS: TestParseJournal (0.00s) [go-tests]  --- PASS: TestParseJournal/parses_journal_title (0.00s) [go-tests] === RUN TestParseEntry [go-tests] === RUN TestParseEntry/image_entry_with_one_comment_[11111111-1111-4111-8111-111111111111] [go-tests] === RUN TestParseEntry/video_entry_with_no_comments_[33333333-3333-4333-8333-333333333333] [go-tests] === RUN TestParseEntry/image_entry_with_multiple_comments_[22222222-2222-4222-8222-222222222222] [go-tests] === RUN TestParseEntry/video_entry_with_multiple_comments_[44444444-4444-4444-8444-444444444444] [go-tests] === RUN TestParseEntry/blob_UUID_differs_from_entry_UUID_[55555555-5555-4555-8555-555555555555] [go-tests] === RUN TestParseEntry/image_entry_with_multiple_emoji_reactions_[66666666-6666-4666-8666-666666666666] [go-tests] --- PASS: TestParseEntry (0.00s) [go-tests]  --- PASS: TestParseEntry/image_entry_with_one_comment_[11111111-1111-4111-8111-111111111111] (0.00s) [go-tests]  --- PASS: TestParseEntry/video_entry_with_no_comments_[33333333-3333-4333-8333-333333333333] (0.00s) [go-tests]  --- PASS: TestParseEntry/image_entry_with_multiple_comments_[22222222-2222-4222-8222-222222222222] (0.00s) [go-tests]  --- PASS: TestParseEntry/video_entry_with_multiple_comments_[44444444-4444-4444-8444-444444444444] (0.00s) [go-tests]  --- PASS: TestParseEntry/blob_UUID_differs_from_entry_UUID_[55555555-5555-4555-8555-555555555555] (0.00s) [go-tests]  --- PASS: TestParseEntry/image_entry_with_multiple_emoji_reactions_[66666666-6666-4666-8666-666666666666] (0.00s) [go-tests] PASS [go-tests] coverage: 82.5% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/importers/tinybeans/parse 1.041s coverage: 82.5% of statements [go-tests] === RUN TestNewCommentText [go-tests] === RUN TestNewCommentText/plain_text_comment_is_valid_[Hello,_world!] [go-tests] === RUN TestNewCommentText/leading_and_trailing_spaces_are_stripped_[__Hello,_world!__] [go-tests] === RUN TestNewCommentText/leading_spaces_are_stripped_[___Hello] [go-tests] === RUN TestNewCommentText/trailing_spaces_are_stripped_[Hello___] [go-tests] === RUN TestNewCommentText/plain_text_angle_brackets_are_valid_[i_<3_this_image_--->!] [go-tests] === RUN TestNewCommentText/text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___script_>] [go-tests] === RUN TestNewCommentText/image_text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___img_>] [go-tests] === RUN TestNewCommentText/comment_with_script_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/comment_with_uppercase_SCRIPT_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/comment_with_mixed-case_Script_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/script_tag_with_attributes_is_rejected_[] [go-tests] === RUN TestNewCommentText/script_tag_embedded_in_text_is_rejected_[click_here__thanks] [go-tests] === RUN TestNewCommentText/script_tag_with_whitespace_before_the_close_bracket_is_rejected_[alert(1)] [go-tests] === RUN TestNewCommentText/split-looking_script_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/image_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/uppercase_image_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/mixed-case_image_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/self-closing_image_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/image_tag_with_whitespace_before_the_close_bracket_is_rejected_[] [go-tests] === RUN TestNewCommentText/split-looking_image_tag_is_rejected_[] [go-tests] === RUN TestNewCommentText/empty_string_is_rejected_[] [go-tests] === RUN TestNewCommentText/whitespace-only_string_is_rejected_[___] [go-tests] --- PASS: TestNewCommentText (0.00s) [go-tests]  --- PASS: TestNewCommentText/plain_text_comment_is_valid_[Hello,_world!] (0.00s) [go-tests]  --- PASS: TestNewCommentText/leading_and_trailing_spaces_are_stripped_[__Hello,_world!__] (0.00s) [go-tests]  --- PASS: TestNewCommentText/leading_spaces_are_stripped_[___Hello] (0.00s) [go-tests]  --- PASS: TestNewCommentText/trailing_spaces_are_stripped_[Hello___] (0.00s) [go-tests]  --- PASS: TestNewCommentText/plain_text_angle_brackets_are_valid_[i_<3_this_image_--->!] (0.00s) [go-tests]  --- PASS: TestNewCommentText/text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___script_>] (0.00s) [go-tests]  --- PASS: TestNewCommentText/image_text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___img_>] (0.00s) [go-tests]  --- PASS: TestNewCommentText/comment_with_script_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/comment_with_uppercase_SCRIPT_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/comment_with_mixed-case_Script_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/script_tag_with_attributes_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/script_tag_embedded_in_text_is_rejected_[click_here__thanks] (0.00s) [go-tests]  --- PASS: TestNewCommentText/script_tag_with_whitespace_before_the_close_bracket_is_rejected_[alert(1)] (0.00s) [go-tests]  --- PASS: TestNewCommentText/split-looking_script_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/uppercase_image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/mixed-case_image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/self-closing_image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/image_tag_with_whitespace_before_the_close_bracket_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/split-looking_image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/empty_string_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCommentText/whitespace-only_string_is_rejected_[___] (0.00s) [go-tests] === RUN TestNewEmailAddress [go-tests] === RUN TestNewEmailAddress/plain_email_address_is_valid_[user@example.com] [go-tests] === RUN TestNewEmailAddress/empty_string_is_rejected_[] [go-tests] === RUN TestNewEmailAddress/address_without_domain_is_rejected_[notanemail] [go-tests] === RUN TestNewEmailAddress/display_name_with_angle_brackets_is_rejected_[John_Doe_] [go-tests] === RUN TestNewEmailAddress/bare_angle_brackets_are_rejected_[] [go-tests] === RUN TestNewEmailAddress/address_with_no_@_sign_is_rejected_[joe] [go-tests] === RUN TestNewEmailAddress/address_with_no_local_part_is_rejected_[@example.com] [go-tests] === RUN TestNewEmailAddress/address_with_empty_domain_label_is_rejected_[joe@.com] [go-tests] === RUN TestNewEmailAddress/address_with_no_local_part_and_empty_domain_label_is_rejected_[@.com] [go-tests] === RUN TestNewEmailAddress/address_with_no_TLD_is_rejected_[joe@example] [go-tests] === RUN TestNewEmailAddress/address_with_no_domain_is_rejected_[joe@] [go-tests] --- PASS: TestNewEmailAddress (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/plain_email_address_is_valid_[user@example.com] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/empty_string_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/address_without_domain_is_rejected_[notanemail] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/display_name_with_angle_brackets_is_rejected_[John_Doe_] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/bare_angle_brackets_are_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/address_with_no_@_sign_is_rejected_[joe] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/address_with_no_local_part_is_rejected_[@example.com] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/address_with_empty_domain_label_is_rejected_[joe@.com] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/address_with_no_local_part_and_empty_domain_label_is_rejected_[@.com] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/address_with_no_TLD_is_rejected_[joe@example] (0.00s) [go-tests]  --- PASS: TestNewEmailAddress/address_with_no_domain_is_rejected_[joe@] (0.00s) [go-tests] === RUN TestEmailIsEmpty [go-tests] === RUN TestEmailIsEmpty/zero_value_is_empty [go-tests] === RUN TestEmailIsEmpty/valid_email_is_not_empty [go-tests] --- PASS: TestEmailIsEmpty (0.00s) [go-tests]  --- PASS: TestEmailIsEmpty/zero_value_is_empty (0.00s) [go-tests]  --- PASS: TestEmailIsEmpty/valid_email_is_not_empty (0.00s) [go-tests] === RUN TestMediaItemFilenames [go-tests] === RUN TestMediaItemFilenames/image [go-tests] === RUN TestMediaItemFilenames/animated-image [go-tests] === RUN TestMediaItemFilenames/video_has_no_display-size_variant [go-tests] --- PASS: TestMediaItemFilenames (0.00s) [go-tests]  --- PASS: TestMediaItemFilenames/image (0.00s) [go-tests]  --- PASS: TestMediaItemFilenames/animated-image (0.00s) [go-tests]  --- PASS: TestMediaItemFilenames/video_has_no_display-size_variant (0.00s) [go-tests] === RUN TestMediaItemFilenamesPanicsOnUnknownType [go-tests] --- PASS: TestMediaItemFilenamesPanicsOnUnknownType (0.00s) [go-tests] === RUN TestNewMediaID [go-tests] === RUN TestNewMediaID/minimum_valid_ID_is_accepted_[1] [go-tests] === RUN TestNewMediaID/SQLite's_first_generated_ID_is_accepted_[1] [go-tests] === RUN TestNewMediaID/zero_is_rejected_[0] [go-tests] --- PASS: TestNewMediaID (0.00s) [go-tests]  --- PASS: TestNewMediaID/minimum_valid_ID_is_accepted_[1] (0.00s) [go-tests]  --- PASS: TestNewMediaID/SQLite's_first_generated_ID_is_accepted_[1] (0.00s) [go-tests]  --- PASS: TestNewMediaID/zero_is_rejected_[0] (0.00s) [go-tests] === RUN TestNewImageWidth [go-tests] === RUN TestNewImageWidth/one_pixel_is_accepted_[1] [go-tests] === RUN TestNewImageWidth/maximum_width_is_accepted_[65535] [go-tests] === RUN TestNewImageWidth/zero_is_rejected_[0] [go-tests] === RUN TestNewImageWidth/width_exceeding_the_maximum_is_rejected_[65536] [go-tests] === RUN TestNewImageWidth/five_million_pixels_is_rejected_[5000000] [go-tests] --- PASS: TestNewImageWidth (0.00s) [go-tests]  --- PASS: TestNewImageWidth/one_pixel_is_accepted_[1] (0.00s) [go-tests]  --- PASS: TestNewImageWidth/maximum_width_is_accepted_[65535] (0.00s) [go-tests]  --- PASS: TestNewImageWidth/zero_is_rejected_[0] (0.00s) [go-tests]  --- PASS: TestNewImageWidth/width_exceeding_the_maximum_is_rejected_[65536] (0.00s) [go-tests]  --- PASS: TestNewImageWidth/five_million_pixels_is_rejected_[5000000] (0.00s) [go-tests] === RUN TestNewImageHeight [go-tests] === RUN TestNewImageHeight/one_pixel_is_accepted_[1] [go-tests] === RUN TestNewImageHeight/maximum_height_is_accepted_[65535] [go-tests] === RUN TestNewImageHeight/zero_is_rejected_[0] [go-tests] === RUN TestNewImageHeight/height_exceeding_the_maximum_is_rejected_[65536] [go-tests] === RUN TestNewImageHeight/five_million_pixels_is_rejected_[5000000] [go-tests] --- PASS: TestNewImageHeight (0.00s) [go-tests]  --- PASS: TestNewImageHeight/one_pixel_is_accepted_[1] (0.00s) [go-tests]  --- PASS: TestNewImageHeight/maximum_height_is_accepted_[65535] (0.00s) [go-tests]  --- PASS: TestNewImageHeight/zero_is_rejected_[0] (0.00s) [go-tests]  --- PASS: TestNewImageHeight/height_exceeding_the_maximum_is_rejected_[65536] (0.00s) [go-tests]  --- PASS: TestNewImageHeight/five_million_pixels_is_rejected_[5000000] (0.00s) [go-tests] === RUN TestNewCaption [go-tests] === RUN TestNewCaption/plain_text_caption_is_valid_[A_day_at_the_park] [go-tests] === RUN TestNewCaption/leading_and_trailing_spaces_are_stripped_[__A_day_at_the_park__] [go-tests] === RUN TestNewCaption/empty_caption_is_valid_[] [go-tests] === RUN TestNewCaption/whitespace-only_caption_is_stripped_to_empty_[___] [go-tests] === RUN TestNewCaption/plain_text_angle_brackets_are_valid_[i_<3_this_image_--->!] [go-tests] === RUN TestNewCaption/text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___script_>] [go-tests] === RUN TestNewCaption/image_text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___img_>] [go-tests] === RUN TestNewCaption/caption_with_script_tag_is_rejected_[] [go-tests] === RUN TestNewCaption/caption_with_uppercase_SCRIPT_tag_is_rejected_[] [go-tests] === RUN TestNewCaption/caption_with_mixed-case_script_tag_is_rejected_[before__after] [go-tests] === RUN TestNewCaption/script_tag_with_attributes_is_rejected_[] [go-tests] === RUN TestNewCaption/script_tag_with_whitespace_before_the_close_bracket_is_rejected_[alert(1)] [go-tests] === RUN TestNewCaption/split-looking_script_tag_is_rejected_[] [go-tests] === RUN TestNewCaption/image_tag_is_rejected_[] [go-tests] === RUN TestNewCaption/uppercase_image_tag_is_rejected_[] [go-tests] === RUN TestNewCaption/mixed-case_image_tag_is_rejected_[] [go-tests] === RUN TestNewCaption/self-closing_image_tag_is_rejected_[] [go-tests] === RUN TestNewCaption/image_tag_with_whitespace_before_the_close_bracket_is_rejected_[] [go-tests] === RUN TestNewCaption/split-looking_image_tag_is_rejected_[] [go-tests] --- PASS: TestNewCaption (0.00s) [go-tests]  --- PASS: TestNewCaption/plain_text_caption_is_valid_[A_day_at_the_park] (0.00s) [go-tests]  --- PASS: TestNewCaption/leading_and_trailing_spaces_are_stripped_[__A_day_at_the_park__] (0.00s) [go-tests]  --- PASS: TestNewCaption/empty_caption_is_valid_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/whitespace-only_caption_is_stripped_to_empty_[___] (0.00s) [go-tests]  --- PASS: TestNewCaption/plain_text_angle_brackets_are_valid_[i_<3_this_image_--->!] (0.00s) [go-tests]  --- PASS: TestNewCaption/text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___script_>] (0.00s) [go-tests]  --- PASS: TestNewCaption/image_text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___img_>] (0.00s) [go-tests]  --- PASS: TestNewCaption/caption_with_script_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/caption_with_uppercase_SCRIPT_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/caption_with_mixed-case_script_tag_is_rejected_[before__after] (0.00s) [go-tests]  --- PASS: TestNewCaption/script_tag_with_attributes_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/script_tag_with_whitespace_before_the_close_bracket_is_rejected_[alert(1)] (0.00s) [go-tests]  --- PASS: TestNewCaption/split-looking_script_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/uppercase_image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/mixed-case_image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/self-closing_image_tag_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/image_tag_with_whitespace_before_the_close_bracket_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewCaption/split-looking_image_tag_is_rejected_[] (0.00s) [go-tests] === RUN TestNewFilename [go-tests] === RUN TestNewFilename/filename_with_extension_is_valid_[vacation.jpg] [go-tests] === RUN TestNewFilename/filename_without_extension_is_valid_[upload] [go-tests] === RUN TestNewFilename/leading_and_trailing_spaces_are_stripped_[__vacation.jpg__] [go-tests] === RUN TestNewFilename/empty_filename_is_rejected_[] [go-tests] === RUN TestNewFilename/whitespace-only_filename_is_rejected_[___] [go-tests] --- PASS: TestNewFilename (0.00s) [go-tests]  --- PASS: TestNewFilename/filename_with_extension_is_valid_[vacation.jpg] (0.00s) [go-tests]  --- PASS: TestNewFilename/filename_without_extension_is_valid_[upload] (0.00s) [go-tests]  --- PASS: TestNewFilename/leading_and_trailing_spaces_are_stripped_[__vacation.jpg__] (0.00s) [go-tests]  --- PASS: TestNewFilename/empty_filename_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewFilename/whitespace-only_filename_is_rejected_[___] (0.00s) [go-tests] === RUN TestNewReactionEmoji [go-tests] === RUN TestNewReactionEmoji/heart_emoji_is_valid_[โ™ฅ๏ธ] [go-tests] === RUN TestNewReactionEmoji/laughing_emoji_is_valid_[๐Ÿ˜‚] [go-tests] === RUN TestNewReactionEmoji/party_popper_emoji_is_valid_[๐ŸŽ‰] [go-tests] === RUN TestNewReactionEmoji/shocked_cat_emoji_is_valid_[๐Ÿ™€] [go-tests] === RUN TestNewReactionEmoji/raised_eyebrow_emoji_is_valid_[๐Ÿคจ] [go-tests] === RUN TestNewReactionEmoji/empty_string_is_rejected_[] [go-tests] === RUN TestNewReactionEmoji/arbitrary_text_is_rejected_[love] [go-tests] === RUN TestNewReactionEmoji/unlisted_emoji_is_rejected_[๐Ÿ‘] [go-tests] --- PASS: TestNewReactionEmoji (0.01s) [go-tests]  --- PASS: TestNewReactionEmoji/heart_emoji_is_valid_[โ™ฅ๏ธ] (0.00s) [go-tests]  --- PASS: TestNewReactionEmoji/laughing_emoji_is_valid_[๐Ÿ˜‚] (0.00s) [go-tests]  --- PASS: TestNewReactionEmoji/party_popper_emoji_is_valid_[๐ŸŽ‰] (0.00s) [go-tests]  --- PASS: TestNewReactionEmoji/shocked_cat_emoji_is_valid_[๐Ÿ™€] (0.00s) [go-tests]  --- PASS: TestNewReactionEmoji/raised_eyebrow_emoji_is_valid_[๐Ÿคจ] (0.00s) [go-tests]  --- PASS: TestNewReactionEmoji/empty_string_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewReactionEmoji/arbitrary_text_is_rejected_[love] (0.00s) [go-tests]  --- PASS: TestNewReactionEmoji/unlisted_emoji_is_rejected_[๐Ÿ‘] (0.00s) [go-tests] === RUN TestNewRedirectPath [go-tests] === RUN TestNewRedirectPath/empty_path_defaults_to_root_[] [go-tests] === RUN TestNewRedirectPath/root-relative_path_is_accepted_[/about] [go-tests] === RUN TestNewRedirectPath/absolute_path_with_query_is_accepted_[/media?page=2] [go-tests] === RUN TestNewRedirectPath/login_redirect_with_next_path_is_accepted_[/login?next=%2Fabout] [go-tests] === RUN TestNewRedirectPath/login_redirect_with_next_query_string_is_accepted_[/login?next=%2Fmedia%3Fpage%3D2] [go-tests] === RUN TestNewRedirectPath/protocol-relative_URL_is_rejected_[//example.com/evil] [go-tests] === RUN TestNewRedirectPath/path_without_leading_slash_is_rejected_[browse] [go-tests] === RUN TestNewRedirectPath/malformed_path_is_rejected_[://example.com/evil] [go-tests] === RUN TestNewRedirectPath/absolute_http_URL_is_rejected_[http://example.com/evil] [go-tests] === RUN TestNewRedirectPath/absolute_https_URL_is_rejected_[https://example.com/evil] [go-tests] === RUN TestNewRedirectPath/non-http_absolute_URL_is_rejected_[ftp://example.com/evil] [go-tests] --- PASS: TestNewRedirectPath (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/empty_path_defaults_to_root_[] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/root-relative_path_is_accepted_[/about] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/absolute_path_with_query_is_accepted_[/media?page=2] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/login_redirect_with_next_path_is_accepted_[/login?next=%2Fabout] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/login_redirect_with_next_query_string_is_accepted_[/login?next=%2Fmedia%3Fpage%3D2] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/protocol-relative_URL_is_rejected_[//example.com/evil] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/path_without_leading_slash_is_rejected_[browse] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/malformed_path_is_rejected_[://example.com/evil] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/absolute_http_URL_is_rejected_[http://example.com/evil] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/absolute_https_URL_is_rejected_[https://example.com/evil] (0.00s) [go-tests]  --- PASS: TestNewRedirectPath/non-http_absolute_URL_is_rejected_[ftp://example.com/evil] (0.00s) [go-tests] === RUN TestUserIDFromString [go-tests] === RUN TestUserIDFromString/lowercase_UUIDv4_is_valid_[11111111-1111-4111-8111-111111111111] [go-tests] === RUN TestUserIDFromString/empty_string_is_invalid_[] [go-tests] === RUN TestUserIDFromString/non-UUID_string_is_invalid_[not-a-uuid] [go-tests] === RUN TestUserIDFromString/UUIDv1_is_invalid_[11111111-1111-1111-8111-111111111111] [go-tests] === RUN TestUserIDFromString/uppercase_UUID_is_invalid_[11111111-1111-4111-8111-AAAAAAAAAAAA] [go-tests] --- PASS: TestUserIDFromString (0.00s) [go-tests]  --- PASS: TestUserIDFromString/lowercase_UUIDv4_is_valid_[11111111-1111-4111-8111-111111111111] (0.00s) [go-tests]  --- PASS: TestUserIDFromString/empty_string_is_invalid_[] (0.00s) [go-tests]  --- PASS: TestUserIDFromString/non-UUID_string_is_invalid_[not-a-uuid] (0.00s) [go-tests]  --- PASS: TestUserIDFromString/UUIDv1_is_invalid_[11111111-1111-1111-8111-111111111111] (0.00s) [go-tests]  --- PASS: TestUserIDFromString/uppercase_UUID_is_invalid_[11111111-1111-4111-8111-AAAAAAAAAAAA] (0.00s) [go-tests] === RUN TestNewVideoDuration [go-tests] === RUN TestNewVideoDuration/one_second_is_valid_[1s] [go-tests] === RUN TestNewVideoDuration/minimum_duration_is_valid_[1ns] [go-tests] === RUN TestNewVideoDuration/duration_limit_is_valid_[30m0s] [go-tests] === RUN TestNewVideoDuration/zero_is_rejected_[0s] [go-tests] === RUN TestNewVideoDuration/negative_duration_is_rejected_[-1s] [go-tests] === RUN TestNewVideoDuration/duration_over_limit_is_rejected_[30m0.000000001s] [go-tests] --- PASS: TestNewVideoDuration (0.00s) [go-tests]  --- PASS: TestNewVideoDuration/one_second_is_valid_[1s] (0.00s) [go-tests]  --- PASS: TestNewVideoDuration/minimum_duration_is_valid_[1ns] (0.00s) [go-tests]  --- PASS: TestNewVideoDuration/duration_limit_is_valid_[30m0s] (0.00s) [go-tests]  --- PASS: TestNewVideoDuration/zero_is_rejected_[0s] (0.00s) [go-tests]  --- PASS: TestNewVideoDuration/negative_duration_is_rejected_[-1s] (0.00s) [go-tests]  --- PASS: TestNewVideoDuration/duration_over_limit_is_rejected_[30m0.000000001s] (0.00s) [go-tests] PASS [go-tests] coverage: 86.7% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/little_moments 1.040s coverage: 86.7% of statements [go-tests] === RUN TestFromString [go-tests] === RUN TestFromString/valid_token_with_required_length_is_accepted_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] [go-tests] === RUN TestFromString/valid_token_with_uppercase_letters_is_accepted_[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] [go-tests] === RUN TestFromString/valid_token_with_digits_is_accepted_[11111111111111111111111111111111] [go-tests] === RUN TestFromString/token_with_ambiguous_characters_Il0O_is_accepted_[Il0Oaaaaaaaaaaaaaaaaaaaaaaaaaaaa] [go-tests] === RUN TestFromString/empty_string_is_rejected_[] [go-tests] === RUN TestFromString/token_one_character_too_short_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] [go-tests] === RUN TestFromString/token_one_character_too_long_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] [go-tests] === RUN TestFromString/token_containing_a_space_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_] [go-tests] === RUN TestFromString/token_containing_a_special_character_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!] [go-tests] === RUN TestFromString/invalid_token_error_does_not_reveal_submitted_token_[sssssssssssssssssssssssssssssss!] [go-tests] --- PASS: TestFromString (0.00s) [go-tests]  --- PASS: TestFromString/valid_token_with_required_length_is_accepted_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] (0.00s) [go-tests]  --- PASS: TestFromString/valid_token_with_uppercase_letters_is_accepted_[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] (0.00s) [go-tests]  --- PASS: TestFromString/valid_token_with_digits_is_accepted_[11111111111111111111111111111111] (0.00s) [go-tests]  --- PASS: TestFromString/token_with_ambiguous_characters_Il0O_is_accepted_[Il0Oaaaaaaaaaaaaaaaaaaaaaaaaaaaa] (0.00s) [go-tests]  --- PASS: TestFromString/empty_string_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestFromString/token_one_character_too_short_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] (0.00s) [go-tests]  --- PASS: TestFromString/token_one_character_too_long_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] (0.00s) [go-tests]  --- PASS: TestFromString/token_containing_a_space_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_] (0.00s) [go-tests]  --- PASS: TestFromString/token_containing_a_special_character_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!] (0.00s) [go-tests]  --- PASS: TestFromString/invalid_token_error_does_not_reveal_submitted_token_[sssssssssssssssssssssssssssssss!] (0.00s) [go-tests] === RUN TestGeneratorCreate [go-tests] --- PASS: TestGeneratorCreate (0.00s) [go-tests] PASS [go-tests] coverage: 66.7% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/little_moments/login_token 1.036s coverage: 66.7% of statements [go-tests] === RUN TestSendLoginEmail [go-tests] === RUN TestSendLoginEmail/succeeds_for_registered_user_with_default_redirect_path [go-tests] === RUN TestSendLoginEmail/succeeds_for_registered_user_with_non-default_redirect_path [go-tests] === RUN TestSendLoginEmail/returns_ErrUnregisteredEmail_for_unregistered_email [go-tests] === RUN TestSendLoginEmail/returns_error_on_store_lookup_failure [go-tests] === RUN TestSendLoginEmail/returns_error_on_token_insert_failure [go-tests] === RUN TestSendLoginEmail/returns_error_on_email_send_failure [go-tests] --- PASS: TestSendLoginEmail (0.00s) [go-tests]  --- PASS: TestSendLoginEmail/succeeds_for_registered_user_with_default_redirect_path (0.00s) [go-tests]  --- PASS: TestSendLoginEmail/succeeds_for_registered_user_with_non-default_redirect_path (0.00s) [go-tests]  --- PASS: TestSendLoginEmail/returns_ErrUnregisteredEmail_for_unregistered_email (0.00s) [go-tests]  --- PASS: TestSendLoginEmail/returns_error_on_store_lookup_failure (0.00s) [go-tests]  --- PASS: TestSendLoginEmail/returns_error_on_token_insert_failure (0.00s) [go-tests]  --- PASS: TestSendLoginEmail/returns_error_on_email_send_failure (0.00s) [go-tests] PASS [go-tests] coverage: 100.0% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/magiclogin 1.021s coverage: 100.0% of statements [go-tests] === RUN TestSenderSend [go-tests] 2026/08/03 16:40:45 sent login email for user 11111111-1111-4111-8111-111111111111 [go-tests] --- PASS: TestSenderSend (0.00s) [go-tests] PASS [go-tests] coverage: 77.8% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/magiclogin/loginmail 1.027s coverage: 77.8% of statements [go-tests] === RUN TestNewHost [go-tests] === RUN TestNewHost/hostname_is_valid_[smtp.example.com] [go-tests] === RUN TestNewHost/leading_and_trailing_spaces_are_stripped_[__smtp.example.com__] [go-tests] === RUN TestNewHost/empty_string_is_rejected_[] [go-tests] === RUN TestNewHost/whitespace-only_string_is_rejected_[___] [go-tests] --- PASS: TestNewHost (0.00s) [go-tests]  --- PASS: TestNewHost/hostname_is_valid_[smtp.example.com] (0.00s) [go-tests]  --- PASS: TestNewHost/leading_and_trailing_spaces_are_stripped_[__smtp.example.com__] (0.00s) [go-tests]  --- PASS: TestNewHost/empty_string_is_rejected_[] (0.00s) [go-tests]  --- PASS: TestNewHost/whitespace-only_string_is_rejected_[___] (0.00s) [go-tests] === RUN TestNewPort [go-tests] === RUN TestNewPort/standard_SMTP_port_is_valid_[587] [go-tests] === RUN TestNewPort/lowest_TCP_port_is_valid_[1] [go-tests] === RUN TestNewPort/highest_TCP_port_is_valid_[65535] [go-tests] === RUN TestNewPort/zero_is_rejected_[0] [go-tests] === RUN TestNewPort/negative_port_is_rejected_[-1] [go-tests] === RUN TestNewPort/port_beyond_TCP_range_is_rejected_[65536] [go-tests] --- PASS: TestNewPort (0.00s) [go-tests]  --- PASS: TestNewPort/standard_SMTP_port_is_valid_[587] (0.00s) [go-tests]  --- PASS: TestNewPort/lowest_TCP_port_is_valid_[1] (0.00s) [go-tests]  --- PASS: TestNewPort/highest_TCP_port_is_valid_[65535] (0.00s) [go-tests]  --- PASS: TestNewPort/zero_is_rejected_[0] (0.00s) [go-tests]  --- PASS: TestNewPort/negative_port_is_rejected_[-1] (0.00s) [go-tests]  --- PASS: TestNewPort/port_beyond_TCP_range_is_rejected_[65536] (0.00s) [go-tests] === RUN TestNewUsername [go-tests] === RUN TestNewUsername/username_is_valid_[smtp-user] [go-tests] === RUN TestNewUsername/surrounding_spaces_are_preserved_[_smtp-user_] [go-tests] === RUN TestNewUsername/empty_string_is_rejected_[] [go-tests] --- PASS: TestNewUsername (0.00s) [go-tests]  --- PASS: TestNewUsername/username_is_valid_[smtp-user] (0.00s) [go-tests]  --- PASS: TestNewUsername/surrounding_spaces_are_preserved_[_smtp-user_] (0.00s) [go-tests]  --- PASS: TestNewUsername/empty_string_is_rejected_[] (0.00s) [go-tests] === RUN TestNewPassword [go-tests] === RUN TestNewPassword/password_is_valid_[secret] [go-tests] === RUN TestNewPassword/surrounding_spaces_are_preserved_[_secret_] [go-tests] === RUN TestNewPassword/empty_string_is_rejected_[] [go-tests] --- PASS: TestNewPassword (0.00s) [go-tests]  --- PASS: TestNewPassword/password_is_valid_[secret] (0.00s) [go-tests]  --- PASS: TestNewPassword/surrounding_spaces_are_preserved_[_secret_] (0.00s) [go-tests]  --- PASS: TestNewPassword/empty_string_is_rejected_[] (0.00s) [go-tests] PASS [go-tests] coverage: 27.4% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/magiclogin/loginmail/smtp 1.026s coverage: 27.4% of statements [go-tests] === RUN TestWriteConverted [go-tests] --- PASS: TestWriteConverted (0.02s) [go-tests] === RUN TestWriteConvertedPropagatesConvError [go-tests] --- PASS: TestWriteConvertedPropagatesConvError (0.00s) [go-tests] === RUN TestNewRelativePath [go-tests] === RUN TestNewRelativePath/filename_is_valid_[abc123.jpg] [go-tests] === RUN TestNewRelativePath/path_with_subfolder_is_valid_[imports/abc123.jpg] [go-tests] === RUN TestNewRelativePath/surrounding_spaces_are_trimmed_[__imports/abc123.jpg__] [go-tests] === RUN TestNewRelativePath/empty_path_is_invalid_[] [go-tests] === RUN TestNewRelativePath/whitespace-only_path_is_invalid_[___] [go-tests] === RUN TestNewRelativePath/trailing_slash_is_invalid_[imports/] [go-tests] === RUN TestNewRelativePath/leading_slash_is_invalid_[/imports/abc123.jpg] [go-tests] === RUN TestNewRelativePath/single_parent_directory_traversal_is_invalid_[../abc123.jpg] [go-tests] === RUN TestNewRelativePath/leading_whitespace_before_traversal_is_invalid_[__../abc123.jpg] [go-tests] === RUN TestNewRelativePath/nested_parent_directory_traversal_is_invalid_[../../abc123.jpg] [go-tests] === RUN TestNewRelativePath/subfolder_parent_directory_traversal_is_invalid_[foo/../../abc123.jpg] [go-tests] === RUN TestNewRelativePath/directory-only_path_is_invalid_[.] [go-tests] --- PASS: TestNewRelativePath (0.00s) [go-tests]  --- PASS: TestNewRelativePath/filename_is_valid_[abc123.jpg] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/path_with_subfolder_is_valid_[imports/abc123.jpg] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/surrounding_spaces_are_trimmed_[__imports/abc123.jpg__] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/empty_path_is_invalid_[] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/whitespace-only_path_is_invalid_[___] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/trailing_slash_is_invalid_[imports/] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/leading_slash_is_invalid_[/imports/abc123.jpg] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/single_parent_directory_traversal_is_invalid_[../abc123.jpg] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/leading_whitespace_before_traversal_is_invalid_[__../abc123.jpg] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/nested_parent_directory_traversal_is_invalid_[../../abc123.jpg] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/subfolder_parent_directory_traversal_is_invalid_[foo/../../abc123.jpg] (0.00s) [go-tests]  --- PASS: TestNewRelativePath/directory-only_path_is_invalid_[.] (0.00s) [go-tests] === RUN TestNewSubfolder [go-tests] === RUN TestNewSubfolder/subfolder_is_valid_[imports] [go-tests] === RUN TestNewSubfolder/nested_subfolder_is_valid_[media/uploads] [go-tests] === RUN TestNewSubfolder/surrounding_spaces_are_trimmed_[__media/uploads__] [go-tests] === RUN TestNewSubfolder/empty_subfolder_is_invalid_[] [go-tests] === RUN TestNewSubfolder/whitespace-only_subfolder_is_invalid_[___] [go-tests] === RUN TestNewSubfolder/current_directory_subfolder_is_invalid_[.] [go-tests] === RUN TestNewSubfolder/current_directory_subfolder_with_slash_is_invalid_[./] [go-tests] === RUN TestNewSubfolder/leading_slash_is_invalid_[/imports] [go-tests] === RUN TestNewSubfolder/single_parent_directory_traversal_is_invalid_[../imports] [go-tests] === RUN TestNewSubfolder/leading_whitespace_before_traversal_is_invalid_[__../imports] [go-tests] === RUN TestNewSubfolder/nested_parent_directory_traversal_is_invalid_[../../imports] [go-tests] === RUN TestNewSubfolder/subfolder_parent_directory_traversal_is_invalid_[foo/../../imports] [go-tests] --- PASS: TestNewSubfolder (0.00s) [go-tests]  --- PASS: TestNewSubfolder/subfolder_is_valid_[imports] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/nested_subfolder_is_valid_[media/uploads] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/surrounding_spaces_are_trimmed_[__media/uploads__] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/empty_subfolder_is_invalid_[] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/whitespace-only_subfolder_is_invalid_[___] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/current_directory_subfolder_is_invalid_[.] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/current_directory_subfolder_with_slash_is_invalid_[./] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/leading_slash_is_invalid_[/imports] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/single_parent_directory_traversal_is_invalid_[../imports] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/leading_whitespace_before_traversal_is_invalid_[__../imports] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/nested_parent_directory_traversal_is_invalid_[../../imports] (0.00s) [go-tests]  --- PASS: TestNewSubfolder/subfolder_parent_directory_traversal_is_invalid_[foo/../../imports] (0.00s) [go-tests] === RUN TestSubfolderJoin [go-tests] === RUN TestSubfolderJoin/empty_prefix_returns_child [go-tests] === RUN TestSubfolderJoin/prefix_joins_with_child [go-tests] === RUN TestSubfolderJoin/nested_prefix_joins_with_child [go-tests] --- PASS: TestSubfolderJoin (0.00s) [go-tests]  --- PASS: TestSubfolderJoin/empty_prefix_returns_child (0.00s) [go-tests]  --- PASS: TestSubfolderJoin/prefix_joins_with_child (0.00s) [go-tests]  --- PASS: TestSubfolderJoin/nested_prefix_joins_with_child (0.00s) [go-tests] === RUN TestSubfolderEmpty [go-tests] === RUN TestSubfolderEmpty/zero_value_is_empty [go-tests] === RUN TestSubfolderEmpty/non-empty_subfolder_is_not_empty [go-tests] --- PASS: TestSubfolderEmpty (0.00s) [go-tests]  --- PASS: TestSubfolderEmpty/zero_value_is_empty (0.00s) [go-tests]  --- PASS: TestSubfolderEmpty/non-empty_subfolder_is_not_empty (0.00s) [go-tests] === RUN TestNewContentType [go-tests] === RUN TestNewContentType/JPEG_content_type_is_valid_[image/jpeg] [go-tests] === RUN TestNewContentType/AVIF_content_type_is_valid_[image/avif] [go-tests] === RUN TestNewContentType/WebM_content_type_is_valid_[video/webm] [go-tests] === RUN TestNewContentType/surrounding_spaces_are_ignored_[__image/jpeg__] [go-tests] === RUN TestNewContentType/empty_content_type_is_invalid_[] [go-tests] === RUN TestNewContentType/PNG_content_type_is_invalid_[image/png] [go-tests] === RUN TestNewContentType/generic_binary_content_type_is_invalid_[application/octet-stream] [go-tests] === RUN TestNewContentType/JPEG_with_parameters_is_invalid_[image/jpeg;_charset=utf-8] [go-tests] --- PASS: TestNewContentType (0.00s) [go-tests]  --- PASS: TestNewContentType/JPEG_content_type_is_valid_[image/jpeg] (0.00s) [go-tests]  --- PASS: TestNewContentType/AVIF_content_type_is_valid_[image/avif] (0.00s) [go-tests]  --- PASS: TestNewContentType/WebM_content_type_is_valid_[video/webm] (0.00s) [go-tests]  --- PASS: TestNewContentType/surrounding_spaces_are_ignored_[__image/jpeg__] (0.00s) [go-tests]  --- PASS: TestNewContentType/empty_content_type_is_invalid_[] (0.00s) [go-tests]  --- PASS: TestNewContentType/PNG_content_type_is_invalid_[image/png] (0.00s) [go-tests]  --- PASS: TestNewContentType/generic_binary_content_type_is_invalid_[application/octet-stream] (0.00s) [go-tests]  --- PASS: TestNewContentType/JPEG_with_parameters_is_invalid_[image/jpeg;_charset=utf-8] (0.00s) [go-tests] === RUN TestNewMediaRootDir [go-tests] === RUN TestNewMediaRootDir/absolute_path_is_valid_[/srv/media] [go-tests] === RUN TestNewMediaRootDir/relative_path_is_valid_[data/media] [go-tests] === RUN TestNewMediaRootDir/surrounding_spaces_are_trimmed_[__data/media__] [go-tests] === RUN TestNewMediaRootDir/empty_path_is_invalid_[] [go-tests] === RUN TestNewMediaRootDir/whitespace-only_path_is_invalid_[___] [go-tests] --- PASS: TestNewMediaRootDir (0.00s) [go-tests]  --- PASS: TestNewMediaRootDir/absolute_path_is_valid_[/srv/media] (0.00s) [go-tests]  --- PASS: TestNewMediaRootDir/relative_path_is_valid_[data/media] (0.00s) [go-tests]  --- PASS: TestNewMediaRootDir/surrounding_spaces_are_trimmed_[__data/media__] (0.00s) [go-tests]  --- PASS: TestNewMediaRootDir/empty_path_is_invalid_[] (0.00s) [go-tests]  --- PASS: TestNewMediaRootDir/whitespace-only_path_is_invalid_[___] (0.00s) [go-tests] === RUN TestMediaRootDirJoin [go-tests] === RUN TestMediaRootDirJoin/joins_filename_to_root [go-tests] === RUN TestMediaRootDirJoin/joins_nested_output_path_to_root [go-tests] --- PASS: TestMediaRootDirJoin (0.00s) [go-tests]  --- PASS: TestMediaRootDirJoin/joins_filename_to_root (0.00s) [go-tests]  --- PASS: TestMediaRootDirJoin/joins_nested_output_path_to_root (0.00s) [go-tests] PASS [go-tests] coverage: 79.3% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/mediastore 1.060s coverage: 79.3% of statements [go-tests]  codeberg.org/mtlynch/little-moments/random coverage: 0.0% of statements [go-tests] === RUN TestNewLimiterRejectsZeroLimits [go-tests] === RUN TestNewLimiterRejectsZeroLimits/rejects_zero_max_attempts_per_email [go-tests] === RUN TestNewLimiterRejectsZeroLimits/rejects_zero_max_attempts_per_IPv4 [go-tests] --- PASS: TestNewLimiterRejectsZeroLimits (0.00s) [go-tests]  --- PASS: TestNewLimiterRejectsZeroLimits/rejects_zero_max_attempts_per_email (0.00s) [go-tests]  --- PASS: TestNewLimiterRejectsZeroLimits/rejects_zero_max_attempts_per_IPv4 (0.00s) [go-tests] === RUN TestLimiter [go-tests] === RUN TestLimiter/new_limiter_allows_first_attempt [go-tests] === RUN TestLimiter/allows_attempts_after_unrelated_login_volume [go-tests] === RUN TestLimiter/allows_the_max-th_attempt_for_the_same_email [go-tests] === RUN TestLimiter/blocks_attempts_after_the_email_limit_is_reached [go-tests] === RUN TestLimiter/allows_attempts_for_a_different_email [go-tests] === RUN TestLimiter/allows_two_attempts_from_the_same_IPv4_address [go-tests] === RUN TestLimiter/blocks_the_third_attempt_from_the_same_IPv4_address [go-tests] === RUN TestLimiter/allows_attempts_from_a_different_IPv4_address [go-tests] === RUN TestLimiter/does_not_apply_IPv4_limit_to_IPv6_addresses [go-tests] === RUN TestLimiter/treats_IPv4-mapped_addresses_as_the_same_IPv4_address [go-tests] === RUN TestLimiter/allows_attempts_after_the_window_expires [go-tests] --- PASS: TestLimiter (0.00s) [go-tests]  --- PASS: TestLimiter/new_limiter_allows_first_attempt (0.00s) [go-tests]  --- PASS: TestLimiter/allows_attempts_after_unrelated_login_volume (0.00s) [go-tests]  --- PASS: TestLimiter/allows_the_max-th_attempt_for_the_same_email (0.00s) [go-tests]  --- PASS: TestLimiter/blocks_attempts_after_the_email_limit_is_reached (0.00s) [go-tests]  --- PASS: TestLimiter/allows_attempts_for_a_different_email (0.00s) [go-tests]  --- PASS: TestLimiter/allows_two_attempts_from_the_same_IPv4_address (0.00s) [go-tests]  --- PASS: TestLimiter/blocks_the_third_attempt_from_the_same_IPv4_address (0.00s) [go-tests]  --- PASS: TestLimiter/allows_attempts_from_a_different_IPv4_address (0.00s) [go-tests]  --- PASS: TestLimiter/does_not_apply_IPv4_limit_to_IPv6_addresses (0.00s) [go-tests]  --- PASS: TestLimiter/treats_IPv4-mapped_addresses_as_the_same_IPv4_address (0.00s) [go-tests]  --- PASS: TestLimiter/allows_attempts_after_the_window_expires (0.00s) [go-tests] PASS [go-tests] coverage: 100.0% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/ratelimit 1.033s coverage: 100.0% of statements [go-tests]  codeberg.org/mtlynch/little-moments/s3 coverage: 0.0% of statements [go-tests] === RUN TestReadEnv [go-tests] === RUN TestReadEnv/all_fields [go-tests] === RUN TestReadEnv/optional_fields_omitted [go-tests] === RUN TestReadEnv/values_are_trimmed [go-tests] === RUN TestReadEnv/required_field_omitted [go-tests] === RUN TestReadEnv/empty_subfolder_is_valid_because_subfolder_is_optional [go-tests] --- PASS: TestReadEnv (0.00s) [go-tests]  --- PASS: TestReadEnv/all_fields (0.00s) [go-tests]  --- PASS: TestReadEnv/optional_fields_omitted (0.00s) [go-tests]  --- PASS: TestReadEnv/values_are_trimmed (0.00s) [go-tests]  --- PASS: TestReadEnv/required_field_omitted (0.00s) [go-tests]  --- PASS: TestReadEnv/empty_subfolder_is_valid_because_subfolder_is_optional (0.00s) [go-tests] === RUN TestReadServingBaseURL [go-tests] === RUN TestReadServingBaseURL/value_is_set [go-tests] === RUN TestReadServingBaseURL/value_is_trimmed [go-tests] === RUN TestReadServingBaseURL/required_field_omitted [go-tests] --- PASS: TestReadServingBaseURL (0.00s) [go-tests]  --- PASS: TestReadServingBaseURL/value_is_set (0.00s) [go-tests]  --- PASS: TestReadServingBaseURL/value_is_trimmed (0.00s) [go-tests]  --- PASS: TestReadServingBaseURL/required_field_omitted (0.00s) [go-tests] === RUN TestMediaBaseURL [go-tests] === RUN TestMediaBaseURL/uses_serving_base_URL [go-tests] === RUN TestMediaBaseURL/uses_serving_base_URL_with_subfolder [go-tests] --- PASS: TestMediaBaseURL (0.00s) [go-tests]  --- PASS: TestMediaBaseURL/uses_serving_base_URL (0.00s) [go-tests]  --- PASS: TestMediaBaseURL/uses_serving_base_URL_with_subfolder (0.00s) [go-tests] PASS [go-tests] coverage: 84.4% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/s3config 1.020s coverage: 84.4% of statements [go-tests] ? codeberg.org/mtlynch/little-moments/store [no test files] [go-tests] === RUN TestAuthSessionLifecycle [go-tests] 2026/08/03 16:40:45 reading DB from file:/TestAuthSessionLifecycle_0xc0001a6248?vfs=memdb [go-tests] --- PASS: TestAuthSessionLifecycle (6.94s) [go-tests] === RUN TestReadSessionReturnsNoSessionForExpiredSession [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestReadSessionReturnsNoSessionForExpiredSession_0xc002f37688?vfs=memdb [go-tests] --- PASS: TestReadSessionReturnsNoSessionForExpiredSession (0.00s) [go-tests] === RUN TestDeleteExpiredSessions [go-tests] === RUN TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expired_before_now [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expired_before_now_0xc002f37b08?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expires_at_now [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expires_at_now_0xc002f37d48?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] === RUN TestDeleteExpiredSessions/cleanup_preserves_a_session_that_expires_after_now [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestDeleteExpiredSessions/cleanup_preserves_a_session_that_expires_after_now_0xc002f06008?vfs=memdb [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store [go-tests] --- PASS: TestDeleteExpiredSessions (0.01s) [go-tests]  --- PASS: TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expired_before_now (0.00s) [go-tests]  --- PASS: TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expires_at_now (0.00s) [go-tests]  --- PASS: TestDeleteExpiredSessions/cleanup_preserves_a_session_that_expires_after_now (0.00s) [go-tests] === RUN TestReadUserByEmail [go-tests] === RUN TestReadUserByEmail/returns_a_non-admin_user_with_all_fields [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestReadUserByEmail/returns_a_non-admin_user_with_all_fields_0xc002f06488?vfs=memdb [go-tests] === RUN TestReadUserByEmail/returns_an_admin_user [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestReadUserByEmail/returns_an_admin_user_0xc002f066c8?vfs=memdb [go-tests] === RUN TestReadUserByEmail/returns_ErrUserNotFound_for_unknown_email [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestReadUserByEmail/returns_ErrUserNotFound_for_unknown_email_0xc002f06908?vfs=memdb [go-tests] --- PASS: TestReadUserByEmail (0.01s) [go-tests]  --- PASS: TestReadUserByEmail/returns_a_non-admin_user_with_all_fields (0.00s) [go-tests]  --- PASS: TestReadUserByEmail/returns_an_admin_user (0.00s) [go-tests]  --- PASS: TestReadUserByEmail/returns_ErrUserNotFound_for_unknown_email (0.00s) [go-tests] === RUN TestInsertDuplicateUserFails [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestInsertDuplicateUserFails_0xc002f06b48?vfs=memdb [go-tests] --- PASS: TestInsertDuplicateUserFails (0.00s) [go-tests] PASS [go-tests] coverage: 23.9% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/store/sqlite 8.006s coverage: 23.9% of statements [go-tests]  codeberg.org/mtlynch/little-moments/store/test_sqlite coverage: 0.0% of statements [go-tests] === RUN TestNewProcessableImageRejectsPixelOverflowDimensions [go-tests] --- PASS: TestNewProcessableImageRejectsPixelOverflowDimensions (0.00s) [go-tests] === RUN TestNewProcessableImageAcceptsSmallImage [go-tests] --- PASS: TestNewProcessableImageAcceptsSmallImage (0.00s) [go-tests] === RUN TestNewProcessableImageRejectsUnreadableGIF [go-tests] --- PASS: TestNewProcessableImageRejectsUnreadableGIF (0.00s) [go-tests] === RUN TestNewProcessableImageRejectsPixelOverflowGIFDimensions [go-tests] --- PASS: TestNewProcessableImageRejectsPixelOverflowGIFDimensions (0.00s) [go-tests] === RUN TestNewProcessableImageAcceptsSmallGIF [go-tests] --- PASS: TestNewProcessableImageAcceptsSmallGIF (0.00s) [go-tests] === RUN TestNewProcessableVideo [go-tests] === RUN TestNewProcessableVideo/duration_over_limit_is_invalid [go-tests] === RUN TestNewProcessableVideo/zero_duration_is_invalid [go-tests] === RUN TestNewProcessableVideo/duration_at_limit_is_valid [go-tests] === RUN TestNewProcessableVideo/unreadable_video_is_invalid [go-tests] --- PASS: TestNewProcessableVideo (0.00s) [go-tests]  --- PASS: TestNewProcessableVideo/duration_over_limit_is_invalid (0.00s) [go-tests]  --- PASS: TestNewProcessableVideo/zero_duration_is_invalid (0.00s) [go-tests]  --- PASS: TestNewProcessableVideo/duration_at_limit_is_valid (0.00s) [go-tests]  --- PASS: TestNewProcessableVideo/unreadable_video_is_invalid (0.00s) [go-tests] === RUN TestNewProcessableVideoDerivesDurationFromPath [go-tests] --- PASS: TestNewProcessableVideoDerivesDurationFromPath (0.00s) [go-tests] === RUN TestNewProcessableVideoStoresUploadPathAndDuration [go-tests] --- PASS: TestNewProcessableVideoStoresUploadPathAndDuration (0.00s) [go-tests] PASS [go-tests] coverage: 33.3% of statements [go-tests] ok codeberg.org/mtlynch/little-moments/uploads 1.020s coverage: 33.3% of statements [go-tests] + [[ -n 1 ]] [go-tests] + go tool cover -html .coverage.out -o .coverage.html [go-tests] + go vet ./... [go-tests] + go_package_dirs=() [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] ++ go list -f '{{.Dir}}' ./... [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + go_package_dirs+=("${go_package_dir}") [go-tests] + IFS= [go-tests] + read -r go_package_dir [go-tests] + readonly go_package_dirs [go-tests] ++ go env GOBIN [go-tests] + GCI_PATH=/build/home/go/bin/gci [go-tests] + readonly GCI_PATH [go-tests] + readonly GCI_VERSION=v0.14.0 [go-tests] + GCI_VERSION=v0.14.0 [go-tests] + [[ -f /build/home/go/bin/gci ]] [go-tests] ++ /build/home/go/bin/gci --version [go-tests] + gci_version_output='gci version 0.14.0' [go-tests] + [[ gci version 0.14.0 != gci version 0\.14\.0 ]] [go-tests] + gci_sections=("--section=standard" "--section=default" "--section=localmodule") [go-tests] + readonly gci_sections [go-tests] ++ /build/home/go/bin/gci list --skip-generated --skip-vendor --section=standard --section=default --section=localmodule /build/source/build /build/source/cmd/app /build/source/cmd/import-from-tinybeans /build/source/convert /build/source/handlers /build/source/images /build/source/importers /build/source/importers/tinybeans /build/source/importers/tinybeans/parse /build/source/little_moments /build/source/little_moments/login_token /build/source/magiclogin /build/source/magiclogin/loginmail /build/source/magiclogin/loginmail/smtp /build/source/mediastore /build/source/random /build/source/ratelimit /build/source/s3 /build/source/s3config /build/source/store /build/source/store/sqlite /build/source/store/test_sqlite /build/source/uploads [go-tests] + gci_output= [go-tests] + [[ -n '' ]] [go-tests] ++ go env GOBIN [go-tests] + GOCRITIC_PATH=/build/home/go/bin/go-critic [go-tests] + readonly GOCRITIC_PATH [go-tests] + readonly GOCRITIC_VERSION=v0.14.3 [go-tests] + GOCRITIC_VERSION=v0.14.3 [go-tests] + [[ ! -f /build/home/go/bin/go-critic ]] [go-tests] + /build/home/go/bin/go-critic check ./... [go-tests] + /build/home/go/bin/go-critic check -enable=returnAfterHttpError ./... [go-tests] ++ go env GOBIN [go-tests] + STATICCHECK_PATH=/build/home/go/bin/staticcheck [go-tests] + readonly STATICCHECK_PATH [go-tests] + readonly STATICCHECK_VERSION=v0.6.1 [go-tests] + STATICCHECK_VERSION=v0.6.1 [go-tests] + [[ ! -f /build/home/go/bin/staticcheck ]] [go-tests] + /build/home/go/bin/staticcheck ./... [go-tests] ++ go env GOBIN [go-tests] + ERRCHECK_PATH=/build/home/go/bin/errcheck [go-tests] + readonly ERRCHECK_PATH [go-tests] + readonly ERRCHECK_VERSION=v1.10.0 [go-tests] + ERRCHECK_VERSION=v1.10.0 [go-tests] + [[ ! -f /build/home/go/bin/errcheck ]] [go-tests] + /build/home/go/bin/errcheck -ignoretests ./... [go-tests] buildPhase completed in 48 seconds [go-tests] Phase: installPhase [go-tests] Phase: fixupPhase [go-tests] shrinking RPATHs of ELF executables and libraries in /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0 [go-tests] checking for references to /build/ in /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0... [go-tests] patching script interpreter paths in /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0 [go-tests:post-build] Uploading to the NixCI cache: /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0 [go-tests:post-build] warning: 'warn-short-path-literals' is deprecated, use 'lint-short-path-literals = ignore' instead [go-tests:post-build] copying 1 paths... [go-tests:post-build] copying path '/nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0' to 'https://cache.nix-ci.com'... [go-tests:post-build] warning: 'warn-short-path-literals' is deprecated, use 'lint-short-path-literals = ignore' instead [go-tests:post-build] copying 1 paths... [go-tests:post-build] copying path '/nix/store/1qpcqixxlfqbx557ivj200llnbnaz2ah-go-tests-0.0.0.drv' to 'https://cache.nix-ci.com'... Uploaded go-tests in 710ms Progress: 1 of 2 built Built go-tests in 49.5s Progress: 2 of 2 built /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0 Build succeeded.