build packages.x86_64-linux.go-tests

Reproduce this run
  1. 0.16 s $ /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
  2. 0.20 s error (ignored): SQLite database '/var/cache/nix-ci-worker/eval-cache-v6/1275312c80fa8216d55ff37dbac9fcfd2d3372f8ef6e043e55bb8567fb1aac53.sqlite' is busy
  3. 2.33 s
  4. 2.53 s Building /nix/store/1qpcqixxlfqbx557ivj200llnbnaz2ah-go-tests-0.0.0.drv
  5. 2.60 s [go-tests] Phase: unpackPhase
  6. 2.61 s [go-tests] unpacking source archive /nix/store/81bp69vphw1m7dg85d6qlaqhv1ja85fg-source
  7. 2.64 s [go-tests] source root is source
  8. 2.69 s [go-tests] Phase: patchPhase
  9. 2.71 s [go-tests] Phase: updateAutotoolsGnuConfigScriptsPhase
  10. 2.75 s [go-tests] Phase: configurePhase
  11. 2.78 s [go-tests] no configure script, doing nothing
  12. 2.79 s [go-tests] Phase: buildPhase
  13. 2.81 s [go-tests] patching script interpreter paths in ./dev-scripts
  14. 2.82 s [go-tests] ./dev-scripts/reset-db: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash"
  15. 2.87 s [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"
  16. 2.89 s [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"
  17. 2.94 s [go-tests] ./dev-scripts/lint-sql: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash"
  18. 2.97 s [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"
  19. 3.01 s [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"
  20. 3.09 s [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"
  21. 3.11 s [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"
  22. 3.13 s [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"
  23. 3.17 s [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"
  24. 3.25 s [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"
  25. 3.27 s [go-tests] ./dev-scripts/check-frontend: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash"
  26. 3.29 s [go-tests] ./dev-scripts/serve: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash"
  27. 3.32 s [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"
  28. 3.35 s [go-tests] ./dev-scripts/build-backend: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash"
  29. 3.40 s [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"
  30. 3.46 s [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"
  31. 3.50 s [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"
  32. 3.53 s [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"
  33. 3.59 s [go-tests] ./dev-scripts/check-bash: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash"
  34. 3.64 s [go-tests] ./dev-scripts/populate-db: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash"
  35. 3.74 s [go-tests] ./dev-scripts/package-binaries: interpreter directive changed from "#!/usr/bin/env bash" to "/nix/store/0550j0i8bmzxbcnzrg1g51zigj7y12ih-bash-interactive-5.3p9/bin/bash"
  36. 3.82 s [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"
  37. 4.09 s [go-tests] + set -o pipefail
  38. 4.09 s [go-tests] + full_test=
  39. 4.09 s [go-tests] + go_test_flags=("-tags=netgo,osusergo")
  40. 4.09 s [go-tests] + go_test_flags+=("-fullpath")
  41. 4.09 s [go-tests] + readonly COVERAGE_FILE_RAW=.coverage.out
  42. 4.09 s [go-tests] + COVERAGE_FILE_RAW=.coverage.out
  43. 4.09 s [go-tests] + readonly COVERAGE_FILE_HTML=.coverage.html
  44. 4.09 s [go-tests] + COVERAGE_FILE_HTML=.coverage.html
  45. 4.09 s [go-tests] + case "${1:-}" in
  46. 4.09 s [go-tests] + full_test=1
  47. 4.09 s [go-tests] + go_test_flags+=("-v")
  48. 4.09 s [go-tests] + go_test_flags+=("-race")
  49. 4.09 s [go-tests] + go_test_flags+=("--coverprofile=${COVERAGE_FILE_RAW}")
  50. 4.09 s [go-tests] + [[ 1 -gt 1 ]]
  51. 4.09 s [go-tests] + set -u
  52. 4.09 s [go-tests] +++ dirname ./dev-scripts/run-go-tests
  53. 4.10 s [go-tests] ++ cd ./dev-scripts
  54. 4.10 s [go-tests] ++ pwd
  55. 4.10 s [go-tests] + SCRIPT_DIR=/build/source/dev-scripts
  56. 4.10 s [go-tests] + readonly SCRIPT_DIR
  57. 4.10 s [go-tests] + cd /build/source/dev-scripts/..
  58. 4.10 s [go-tests] + go test -tags=netgo,osusergo -fullpath -v -race --coverprofile=.coverage.out ./...
  59. 17.28 s [go-tests] codeberg.org/mtlynch/little-moments/build coverage: 0.0% of statements
  60. 27.60 s [go-tests] codeberg.org/mtlynch/little-moments/cmd/app coverage: 0.0% of statements
  61. 27.63 s [go-tests] codeberg.org/mtlynch/little-moments/cmd/import-from-tinybeans coverage: 0.0% of statements
  62. 27.63 s [go-tests] codeberg.org/mtlynch/little-moments/convert coverage: 0.0% of statements
  63. 37.25 s [go-tests] === RUN TestAboutPageIncludesVersionMetadata
  64. 37.29 s [go-tests] 2026/08/03 16:40:45 reading DB from file:/TestAboutPageIncludesVersionMetadata_0xc00011a488?vfs=memdb
  65. 37.29 s [go-tests] 2026/08/03 16:40:52 CSP media origin: ""
  66. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  67. 37.29 s [go-tests] --- PASS: TestAboutPageIncludesVersionMetadata (6.26s)
  68. 37.29 s [go-tests] === RUN TestAuthServiceRequireAuth
  69. 37.29 s [go-tests] === RUN TestAuthServiceRequireAuth/valid_session_calls_next_handler
  70. 37.29 s [go-tests] === RUN TestAuthServiceRequireAuth/unexpected_session_lookup_error_returns_error
  71. 37.29 s [go-tests] 2026/08/03 16:40:52 failed to read auth session from context: session backend unavailable
  72. 37.29 s [go-tests] === RUN TestAuthServiceRequireAuth/missing_session_redirects_to_login
  73. 37.29 s [go-tests] --- PASS: TestAuthServiceRequireAuth (0.00s)
  74. 37.29 s [go-tests] --- PASS: TestAuthServiceRequireAuth/valid_session_calls_next_handler (0.00s)
  75. 37.29 s [go-tests] --- PASS: TestAuthServiceRequireAuth/unexpected_session_lookup_error_returns_error (0.00s)
  76. 37.29 s [go-tests] --- PASS: TestAuthServiceRequireAuth/missing_session_redirects_to_login (0.00s)
  77. 37.29 s [go-tests] === RUN TestAuthFlow
  78. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestAuthFlow_0xc00399d8c8?vfs=memdb
  79. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  80. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  81. 37.29 s [go-tests] 2026/08/03 16:40:52 login confirm: consumed token for user 11111111-1111-4111-8111-111111111111
  82. 37.29 s [go-tests] --- PASS: TestAuthFlow (0.01s)
  83. 37.29 s [go-tests] === RUN TestLoginPostRejectsOpenRedirectNextURL
  84. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsOpenRedirectNextURL_0xc003bfe008?vfs=memdb
  85. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  86. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsOpenRedirectNextURL (0.01s)
  87. 37.29 s [go-tests] === RUN TestLoginConfirmPost
  88. 37.29 s [go-tests] === RUN TestLoginConfirmPost/missing_token_returns_400
  89. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/missing_token_returns_400_0xc003bfe488?vfs=memdb
  90. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  91. 37.29 s [go-tests] === RUN TestLoginConfirmPost/malformed_token_returns_400
  92. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/malformed_token_returns_400_0xc003bfe6c8?vfs=memdb
  93. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  94. 37.29 s [go-tests] 2026/08/03 16:40:52 login confirm: invalid token format: invalid login token: must be 32 alphanumeric characters
  95. 37.29 s [go-tests] === RUN TestLoginConfirmPost/well-formed_token_that's_not_in_store_returns_401
  96. 37.29 s [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
  97. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  98. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  99. 37.29 s [go-tests] 2026/08/03 16:40:52 login confirm: invalid token attempt
  100. 37.29 s [go-tests] === RUN TestLoginConfirmPost/valid_token_that's_expired_returns_401
  101. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/valid_token_that%27s_expired_returns_401_0xc003c90008?vfs=memdb
  102. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  103. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  104. 37.29 s [go-tests] 2026/08/03 16:40:52 login confirm: expired token attempt
  105. 37.29 s [go-tests] === RUN TestLoginConfirmPost/valid_token_that's_already_used_returns_401
  106. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/valid_token_that%27s_already_used_returns_401_0xc003c90248?vfs=memdb
  107. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  108. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  109. 37.29 s [go-tests] 2026/08/03 16:40:52 login confirm: already-used token attempt
  110. 37.29 s [go-tests] === RUN TestLoginConfirmPost/used_token_for_signed-in_user_redirects_root
  111. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/used_token_for_signed-in_user_redirects_root_0xc003c90488?vfs=memdb
  112. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  113. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  114. 37.29 s [go-tests] === RUN TestLoginConfirmPost/valid_token_with_session_creation_failure_returns_500
  115. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginConfirmPost/valid_token_with_session_creation_failure_returns_500_0xc003c90908?vfs=memdb
  116. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  117. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  118. 37.29 s [go-tests] 2026/08/03 16:40:52 login confirm: consumed token for user 11111111-1111-4111-8111-111111111111
  119. 37.29 s [go-tests] 2026/08/03 16:40:52 login confirm: failed to confirm login: create auth session: session broken
  120. 37.29 s [go-tests] === RUN TestLoginConfirmPost/valid_token_with_successful_session_creation_redirects_to_stored_next_path
  121. 37.29 s [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
  122. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  123. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  124. 37.29 s [go-tests] 2026/08/03 16:40:52 login confirm: consumed token for user 11111111-1111-4111-8111-111111111111
  125. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost (0.05s)
  126. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost/missing_token_returns_400 (0.01s)
  127. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost/malformed_token_returns_400 (0.01s)
  128. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost/well-formed_token_that's_not_in_store_returns_401 (0.01s)
  129. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost/valid_token_that's_expired_returns_401 (0.01s)
  130. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost/valid_token_that's_already_used_returns_401 (0.01s)
  131. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost/used_token_for_signed-in_user_redirects_root (0.01s)
  132. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost/valid_token_with_session_creation_failure_returns_500 (0.01s)
  133. 37.29 s [go-tests] --- PASS: TestLoginConfirmPost/valid_token_with_successful_session_creation_redirects_to_stored_next_path (0.01s)
  134. 37.29 s [go-tests] === RUN TestConfirmLoginPreservesUsedTokenErrorWhenSessionReadFails
  135. 37.29 s [go-tests] --- PASS: TestConfirmLoginPreservesUsedTokenErrorWhenSessionReadFails (0.00s)
  136. 37.29 s [go-tests] === RUN TestLoginPostRejectsMalformedFormBody
  137. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsMalformedFormBody_0xc003c90fc8?vfs=memdb
  138. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  139. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsMalformedFormBody (0.01s)
  140. 37.29 s [go-tests] === RUN TestLoginPostRendersCheckEmailPageRegardlessOfRegistration
  141. 37.29 s [go-tests] === RUN TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/registered_email_shows_check-email_page
  142. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/registered_email_shows_check-email_page_0xc003c91448?vfs=memdb
  143. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  144. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  145. 37.29 s [go-tests] === RUN TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/unregistered_email_shows_check-email_page
  146. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/unregistered_email_shows_check-email_page_0xc003c91b08?vfs=memdb
  147. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  148. 37.29 s [go-tests] 2026/08/03 16:40:52 login attempt from unregistered email: unregistered@example.com
  149. 37.29 s [go-tests] --- PASS: TestLoginPostRendersCheckEmailPageRegardlessOfRegistration (0.01s)
  150. 37.29 s [go-tests] --- PASS: TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/registered_email_shows_check-email_page (0.01s)
  151. 37.29 s [go-tests] --- PASS: TestLoginPostRendersCheckEmailPageRegardlessOfRegistration/unregistered_email_shows_check-email_page (0.01s)
  152. 37.29 s [go-tests] === RUN TestLoginPostDoesNotLeakTokenInProdMode
  153. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostDoesNotLeakTokenInProdMode_0xc004776248?vfs=memdb
  154. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  155. 37.29 s [go-tests] 2026/08/03 16:40:52 inserting magic login token for user 11111111-1111-4111-8111-111111111111
  156. 37.29 s [go-tests] --- PASS: TestLoginPostDoesNotLeakTokenInProdMode (0.01s)
  157. 37.29 s [go-tests] === RUN TestLoginPostRejectsInvalidNextPath
  158. 37.29 s [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/protocol-relative_next_path_is_invalid
  159. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/protocol-relative_next_path_is_invalid_0xc004776b48?vfs=memdb
  160. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  161. 37.29 s [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/next_path_without_leading_slash_is_invalid
  162. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/next_path_without_leading_slash_is_invalid_0xc004776008?vfs=memdb
  163. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  164. 37.29 s [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/malformed_next_path_is_invalid
  165. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/malformed_next_path_is_invalid_0xc004776248?vfs=memdb
  166. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  167. 37.29 s [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/http_next_path_is_invalid
  168. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/http_next_path_is_invalid_0xc004776488?vfs=memdb
  169. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  170. 37.29 s [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/https_next_path_is_invalid
  171. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/https_next_path_is_invalid_0xc0047766c8?vfs=memdb
  172. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  173. 37.29 s [go-tests] === RUN TestLoginPostRejectsInvalidNextPath/non-http_absolute_next_path_is_invalid
  174. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidNextPath/non-http_absolute_next_path_is_invalid_0xc004776d88?vfs=memdb
  175. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  176. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsInvalidNextPath (0.03s)
  177. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsInvalidNextPath/protocol-relative_next_path_is_invalid (0.01s)
  178. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsInvalidNextPath/next_path_without_leading_slash_is_invalid (0.01s)
  179. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsInvalidNextPath/malformed_next_path_is_invalid (0.01s)
  180. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsInvalidNextPath/http_next_path_is_invalid (0.00s)
  181. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsInvalidNextPath/https_next_path_is_invalid (0.00s)
  182. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsInvalidNextPath/non-http_absolute_next_path_is_invalid (0.00s)
  183. 37.29 s [go-tests] === RUN TestLoginPostRejectsInvalidEmail
  184. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostRejectsInvalidEmail_0xc004776fc8?vfs=memdb
  185. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  186. 37.29 s [go-tests] --- PASS: TestLoginPostRejectsInvalidEmail (0.00s)
  187. 37.29 s [go-tests] === RUN TestLoginPostReturnsTooManyRequestsAfterIPv4Limit
  188. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostReturnsTooManyRequestsAfterIPv4Limit_0xc004777208?vfs=memdb
  189. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  190. 37.29 s [go-tests] --- PASS: TestLoginPostReturnsTooManyRequestsAfterIPv4Limit (0.00s)
  191. 37.29 s [go-tests] === RUN TestLoginPostDoesNotApplyIPv4LimitToIPv6
  192. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostDoesNotApplyIPv4LimitToIPv6_0xc0047778c8?vfs=memdb
  193. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  194. 37.29 s [go-tests] --- PASS: TestLoginPostDoesNotApplyIPv4LimitToIPv6 (0.00s)
  195. 37.29 s [go-tests] === RUN TestLoginPostReturnsTooManyRequestsWhenRateLimited
  196. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostReturnsTooManyRequestsWhenRateLimited_0xc00011a488?vfs=memdb
  197. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  198. 37.29 s [go-tests] --- PASS: TestLoginPostReturnsTooManyRequestsWhenRateLimited (0.00s)
  199. 37.29 s [go-tests] === RUN TestLoginPostReturnsErrorWhenTokenCreationFails
  200. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestLoginPostReturnsErrorWhenTokenCreationFails_0xc00011a6c8?vfs=memdb
  201. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  202. 37.29 s [go-tests] 2026/08/03 16:40:52 failed to create login token: database unavailable
  203. 37.29 s [go-tests] --- PASS: TestLoginPostReturnsErrorWhenTokenCreationFails (0.00s)
  204. 37.29 s [go-tests] === RUN TestMediaCaptionGetRequiresOwner
  205. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestMediaCaptionGetRequiresOwner_0xc00011a908?vfs=memdb
  206. 37.29 s [go-tests] === RUN TestMediaCaptionGetRequiresOwner/owner_can_view_the_caption
  207. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  208. 37.29 s [go-tests] === RUN TestMediaCaptionGetRequiresOwner/subscriber_is_forbidden_from_viewing_the_caption
  209. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  210. 37.29 s [go-tests] --- PASS: TestMediaCaptionGetRequiresOwner (0.01s)
  211. 37.29 s [go-tests] --- PASS: TestMediaCaptionGetRequiresOwner/owner_can_view_the_caption (0.00s)
  212. 37.29 s [go-tests] --- PASS: TestMediaCaptionGetRequiresOwner/subscriber_is_forbidden_from_viewing_the_caption (0.00s)
  213. 37.29 s [go-tests] === RUN TestMediaCaptionEditGetRequiresOwner
  214. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestMediaCaptionEditGetRequiresOwner_0xc00011ad88?vfs=memdb
  215. 37.29 s [go-tests] === RUN TestMediaCaptionEditGetRequiresOwner/owner_can_view_the_caption_editor
  216. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  217. 37.29 s [go-tests] === RUN TestMediaCaptionEditGetRequiresOwner/subscriber_is_forbidden_from_viewing_the_caption_editor
  218. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  219. 37.29 s [go-tests] --- PASS: TestMediaCaptionEditGetRequiresOwner (0.01s)
  220. 37.29 s [go-tests] --- PASS: TestMediaCaptionEditGetRequiresOwner/owner_can_view_the_caption_editor (0.00s)
  221. 37.29 s [go-tests] --- PASS: TestMediaCaptionEditGetRequiresOwner/subscriber_is_forbidden_from_viewing_the_caption_editor (0.00s)
  222. 37.29 s [go-tests] === RUN TestMediaCaptionPutRequiresOwner
  223. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestMediaCaptionPutRequiresOwner_0xc00011b448?vfs=memdb
  224. 37.29 s [go-tests] === RUN TestMediaCaptionPutRequiresOwner/owner_reaches_the_caption_update_handler
  225. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  226. 37.29 s [go-tests] === RUN TestMediaCaptionPutRequiresOwner/subscriber_is_forbidden_from_updating_the_caption
  227. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  228. 37.29 s [go-tests] --- PASS: TestMediaCaptionPutRequiresOwner (0.01s)
  229. 37.29 s [go-tests] --- PASS: TestMediaCaptionPutRequiresOwner/owner_reaches_the_caption_update_handler (0.00s)
  230. 37.29 s [go-tests] --- PASS: TestMediaCaptionPutRequiresOwner/subscriber_is_forbidden_from_updating_the_caption (0.00s)
  231. 37.29 s [go-tests] === RUN TestStaticFilesUseCacheControlAndETag
  232. 37.29 s [go-tests] --- PASS: TestStaticFilesUseCacheControlAndETag (0.01s)
  233. 37.29 s [go-tests] === RUN TestStaticFilesReturnNotModifiedForMatchingETag
  234. 37.29 s [go-tests] --- PASS: TestStaticFilesReturnNotModifiedForMatchingETag (0.00s)
  235. 37.29 s [go-tests] === RUN TestStaticFilesServeAssetRanges
  236. 37.29 s [go-tests] --- PASS: TestStaticFilesServeAssetRanges (0.00s)
  237. 37.29 s [go-tests] === RUN TestRelativeTime
  238. 37.29 s [go-tests] === RUN TestRelativeTime/30_seconds_ago_is_just_now
  239. 37.29 s [go-tests] === RUN TestRelativeTime/just_under_2_minutes_is_just_now
  240. 37.29 s [go-tests] === RUN TestRelativeTime/45_minutes_ago
  241. 37.29 s [go-tests] === RUN TestRelativeTime/5_hours_ago
  242. 37.29 s [go-tests] === RUN TestRelativeTime/3_days_ago
  243. 37.29 s [go-tests] === RUN TestRelativeTime/3_weeks_ago
  244. 37.29 s [go-tests] === RUN TestRelativeTime/60_days_ago_is_2_months_ago
  245. 37.29 s [go-tests] === RUN TestRelativeTime/800_days_ago_is_2_years_ago
  246. 37.29 s [go-tests] --- PASS: TestRelativeTime (0.00s)
  247. 37.29 s [go-tests] --- PASS: TestRelativeTime/30_seconds_ago_is_just_now (0.00s)
  248. 37.29 s [go-tests] --- PASS: TestRelativeTime/just_under_2_minutes_is_just_now (0.00s)
  249. 37.29 s [go-tests] --- PASS: TestRelativeTime/45_minutes_ago (0.00s)
  250. 37.29 s [go-tests] --- PASS: TestRelativeTime/5_hours_ago (0.00s)
  251. 37.29 s [go-tests] --- PASS: TestRelativeTime/3_days_ago (0.00s)
  252. 37.29 s [go-tests] --- PASS: TestRelativeTime/3_weeks_ago (0.00s)
  253. 37.29 s [go-tests] --- PASS: TestRelativeTime/60_days_ago_is_2_months_ago (0.00s)
  254. 37.29 s [go-tests] --- PASS: TestRelativeTime/800_days_ago_is_2_years_ago (0.00s)
  255. 37.29 s [go-tests] === RUN TestUploadGetRequiresOwner
  256. 37.29 s [go-tests] === RUN TestUploadGetRequiresOwner/unauthenticated_user_is_redirected_to_login
  257. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadGetRequiresOwner/unauthenticated_user_is_redirected_to_login_0xc00096fb08?vfs=memdb
  258. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  259. 37.29 s [go-tests] === RUN TestUploadGetRequiresOwner/subscriber_is_forbidden
  260. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadGetRequiresOwner/subscriber_is_forbidden_0xc00096fd48?vfs=memdb
  261. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  262. 37.29 s [go-tests] === RUN TestUploadGetRequiresOwner/owner_sees_the_upload_form
  263. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadGetRequiresOwner/owner_sees_the_upload_form_0xc000bd8008?vfs=memdb
  264. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  265. 37.29 s [go-tests] --- PASS: TestUploadGetRequiresOwner (0.02s)
  266. 37.29 s [go-tests] --- PASS: TestUploadGetRequiresOwner/unauthenticated_user_is_redirected_to_login (0.01s)
  267. 37.29 s [go-tests] --- PASS: TestUploadGetRequiresOwner/subscriber_is_forbidden (0.00s)
  268. 37.29 s [go-tests] --- PASS: TestUploadGetRequiresOwner/owner_sees_the_upload_form (0.00s)
  269. 37.29 s [go-tests] === RUN TestUploadImageCreatesItemAndWritesFiles
  270. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadImageCreatesItemAndWritesFiles_0xc000bd86c8?vfs=memdb
  271. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  272. 37.29 s [go-tests] --- PASS: TestUploadImageCreatesItemAndWritesFiles (0.31s)
  273. 37.29 s [go-tests] === RUN TestUploadAnimatedImageCreatesItem
  274. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadAnimatedImageCreatesItem_0xc000bd8008?vfs=memdb
  275. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  276. 37.29 s [go-tests] --- PASS: TestUploadAnimatedImageCreatesItem (0.04s)
  277. 37.29 s [go-tests] === RUN TestUploadAnimatedImageRejectsUnreadableImage
  278. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadAnimatedImageRejectsUnreadableImage_0xc000bd8248?vfs=memdb
  279. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  280. 37.29 s [go-tests] --- PASS: TestUploadAnimatedImageRejectsUnreadableImage (0.01s)
  281. 37.29 s [go-tests] === RUN TestUploadImageRouteRejectsOversizedFile
  282. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestUploadImageRouteRejectsOversizedFile_0xc000bd8488?vfs=memdb
  283. 37.29 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  284. 37.29 s [go-tests] --- PASS: TestUploadImageRouteRejectsOversizedFile (1.84s)
  285. 37.29 s [go-tests] === RUN TestUploadImageRouteRejectsUnsupportedFile
  286. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadImageRouteRejectsUnsupportedFile_0xc000bd8008?vfs=memdb
  287. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  288. 37.29 s [go-tests] --- PASS: TestUploadImageRouteRejectsUnsupportedFile (0.00s)
  289. 37.29 s [go-tests] === RUN TestUploadVideoRouteRejectsUnsupportedFileBeforeReadingBody
  290. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsUnsupportedFileBeforeReadingBody_0xc000bd8248?vfs=memdb
  291. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  292. 37.29 s [go-tests] --- PASS: TestUploadVideoRouteRejectsUnsupportedFileBeforeReadingBody (0.00s)
  293. 37.29 s [go-tests] === RUN TestUploadVideoRouteRejectsOversizedFile
  294. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsOversizedFile_0xc000bd86c8?vfs=memdb
  295. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  296. 37.29 s [go-tests] --- PASS: TestUploadVideoRouteRejectsOversizedFile (0.00s)
  297. 37.29 s [go-tests] === RUN TestUploadVideoRouteRejectsVideoOverDurationLimit
  298. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsVideoOverDurationLimit_0xc000bd8908?vfs=memdb
  299. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  300. 37.29 s [go-tests] --- PASS: TestUploadVideoRouteRejectsVideoOverDurationLimit (0.00s)
  301. 37.29 s [go-tests] === RUN TestUploadVideoRouteRejectsZeroDurationVideo
  302. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsZeroDurationVideo_0xc000bd8b48?vfs=memdb
  303. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  304. 37.29 s [go-tests] 2026/08/03 16:40:54 failed to read video: unreadable video: invalid video duration: must be greater than zero
  305. 37.29 s [go-tests] --- PASS: TestUploadVideoRouteRejectsZeroDurationVideo (0.00s)
  306. 37.29 s [go-tests] === RUN TestUploadVideoRouteRejectsInvalidCaption
  307. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteRejectsInvalidCaption_0xc000bd8d88?vfs=memdb
  308. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  309. 37.29 s [go-tests] --- PASS: TestUploadVideoRouteRejectsInvalidCaption (0.00s)
  310. 37.29 s [go-tests] === RUN TestUploadVideoRouteCreatesItem
  311. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoRouteCreatesItem_0xc000bd8fc8?vfs=memdb
  312. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  313. 37.29 s [go-tests] --- PASS: TestUploadVideoRouteCreatesItem (0.01s)
  314. 37.29 s [go-tests] === RUN TestUploadVideoTranscodeErrorCreatesNoItem
  315. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadVideoTranscodeErrorCreatesNoItem_0xc000bd9208?vfs=memdb
  316. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  317. 37.29 s [go-tests] 2026/08/03 16:40:54 failed to process video: unexpected EOF
  318. 37.29 s [go-tests] --- PASS: TestUploadVideoTranscodeErrorCreatesNoItem (0.00s)
  319. 37.29 s [go-tests] === RUN TestUploadPostRejectsSubscriber
  320. 37.29 s [go-tests] 2026/08/03 16:40:54 reading DB from file:/TestUploadPostRejectsSubscriber_0xc000bd9448?vfs=memdb
  321. 37.29 s [go-tests] 2026/08/03 16:40:54 cleaning expired auth sessions from store
  322. 37.29 s [go-tests] --- PASS: TestUploadPostRejectsSubscriber (0.00s)
  323. 37.29 s [go-tests] PASS
  324. 37.29 s [go-tests] coverage: 62.2% of statements
  325. 37.29 s [go-tests] ok codeberg.org/mtlynch/little-moments/handlers 9.810s coverage: 62.2% of statements
  326. 37.29 s [go-tests] === RUN TestGenerateSquareThumbnail
  327. 37.29 s [go-tests] === RUN TestGenerateSquareThumbnail/landscape_image_produces_square_thumbnail
  328. 37.29 s [go-tests] === RUN TestGenerateSquareThumbnail/portrait_image_produces_square_thumbnail
  329. 37.29 s [go-tests] === RUN TestGenerateSquareThumbnail/square_image_produces_square_thumbnail
  330. 37.29 s [go-tests] === RUN TestGenerateSquareThumbnail/returns_error_when_source_contains_invalid_image_data
  331. 37.29 s [go-tests] --- PASS: TestGenerateSquareThumbnail (0.06s)
  332. 37.29 s [go-tests] --- PASS: TestGenerateSquareThumbnail/landscape_image_produces_square_thumbnail (0.01s)
  333. 37.29 s [go-tests] --- PASS: TestGenerateSquareThumbnail/portrait_image_produces_square_thumbnail (0.01s)
  334. 37.29 s [go-tests] --- PASS: TestGenerateSquareThumbnail/square_image_produces_square_thumbnail (0.01s)
  335. 37.29 s [go-tests] --- PASS: TestGenerateSquareThumbnail/returns_error_when_source_contains_invalid_image_data (0.00s)
  336. 37.29 s [go-tests] === RUN TestDimensionsReportsImageSize
  337. 37.29 s [go-tests] --- PASS: TestDimensionsReportsImageSize (0.05s)
  338. 37.29 s [go-tests] === RUN TestStripMetadataPreservesDimensions
  339. 37.29 s [go-tests] --- PASS: TestStripMetadataPreservesDimensions (0.03s)
  340. 37.29 s [go-tests] === RUN TestStripMetadataStripsExif
  341. 37.29 s [go-tests] --- PASS: TestStripMetadataStripsExif (0.04s)
  342. 37.29 s [go-tests] === RUN TestResizeToWidth
  343. 37.29 s [go-tests] === RUN TestResizeToWidth/landscape_image_resized_to_target_width
  344. 37.29 s [go-tests] === RUN TestResizeToWidth/portrait_image_resized_to_target_width
  345. 37.29 s [go-tests] === RUN TestResizeToWidth/returns_error_when_source_contains_invalid_image_data
  346. 37.29 s [go-tests] --- PASS: TestResizeToWidth (0.04s)
  347. 37.29 s [go-tests] --- PASS: TestResizeToWidth/landscape_image_resized_to_target_width (0.02s)
  348. 37.29 s [go-tests] --- PASS: TestResizeToWidth/portrait_image_resized_to_target_width (0.02s)
  349. 37.29 s [go-tests] --- PASS: TestResizeToWidth/returns_error_when_source_contains_invalid_image_data (0.00s)
  350. 37.29 s [go-tests] PASS
  351. 37.29 s [go-tests] coverage: 90.9% of statements
  352. 37.29 s [go-tests] ok codeberg.org/mtlynch/little-moments/images 1.247s coverage: 90.9% of statements
  353. 37.29 s [go-tests] === RUN TestImportMedia
  354. 37.29 s [go-tests] === RUN TestImportMedia/copies_image_file_verbatim_to_destination
  355. 37.29 s [go-tests] === RUN TestImportMedia/converts_video_using_injected_converter
  356. 37.29 s [go-tests] === RUN TestImportMedia/returns_error_when_video_converter_fails
  357. 37.29 s [go-tests] === RUN TestImportMedia/converts_animated_GIF_using_injected_converter
  358. 37.29 s [go-tests] === RUN TestImportMedia/returns_error_when_GIF_converter_fails
  359. 37.29 s [go-tests] --- PASS: TestImportMedia (0.02s)
  360. 37.29 s [go-tests] --- PASS: TestImportMedia/copies_image_file_verbatim_to_destination (0.02s)
  361. 37.29 s [go-tests] --- PASS: TestImportMedia/converts_video_using_injected_converter (0.00s)
  362. 37.29 s [go-tests] --- PASS: TestImportMedia/returns_error_when_video_converter_fails (0.00s)
  363. 37.29 s [go-tests] --- PASS: TestImportMedia/converts_animated_GIF_using_injected_converter (0.00s)
  364. 37.29 s [go-tests] --- PASS: TestImportMedia/returns_error_when_GIF_converter_fails (0.00s)
  365. 37.29 s [go-tests] PASS
  366. 37.29 s [go-tests] coverage: 100.0% of statements
  367. 37.29 s [go-tests] ok codeberg.org/mtlynch/little-moments/importers 1.049s coverage: 100.0% of statements
  368. 37.29 s [go-tests] === RUN TestConvert
  369. 37.29 s [go-tests] === RUN TestConvert/translates_Tinybeans_reactions_into_little_moments_reactions
  370. 37.29 s [go-tests] === RUN TestConvert/fails_on_unsupported_Tinybeans_reactions
  371. 37.29 s [go-tests] === RUN TestConvert/flattens_threaded_comments_without_duplicating_the_root_comment
  372. 37.29 s [go-tests] === RUN TestConvert/skips_comments_and_reactions_from_users_not_in_followers
  373. 37.29 s [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
  374. 37.29 s [go-tests] --- PASS: TestConvert (0.00s)
  375. 37.29 s [go-tests] --- PASS: TestConvert/translates_Tinybeans_reactions_into_little_moments_reactions (0.00s)
  376. 37.29 s [go-tests] --- PASS: TestConvert/fails_on_unsupported_Tinybeans_reactions (0.00s)
  377. 37.29 s [go-tests] --- PASS: TestConvert/flattens_threaded_comments_without_duplicating_the_root_comment (0.00s)
  378. 37.29 s [go-tests] --- PASS: TestConvert/skips_comments_and_reactions_from_users_not_in_followers (0.00s)
  379. 37.29 s [go-tests] === RUN TestConverterPreservesMediaDataAndDuplicateFollowerIDs
  380. 37.29 s [go-tests] --- PASS: TestConverterPreservesMediaDataAndDuplicateFollowerIDs (0.00s)
  381. 37.29 s [go-tests] === RUN TestConverterRejectsUnknownUploader
  382. 37.29 s [go-tests] --- PASS: TestConverterRejectsUnknownUploader (0.00s)
  383. 37.29 s [go-tests] === RUN TestImportWritesMediaAndMetadata
  384. 37.29 s [go-tests] 2026/08/03 16:40:45 reading DB from file:/TestImportWritesMediaAndMetadata_0xc000237208?vfs=memdb
  385. 37.29 s [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-full.jpg
  386. 37.29 s [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-850px.jpg
  387. 37.29 s [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-250px.jpg
  388. 37.29 s [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-150px.jpg
  389. 37.29 s [go-tests] --- PASS: TestImportWritesMediaAndMetadata (7.12s)
  390. 37.29 s [go-tests] === RUN TestImportRetainsCompletedEntriesWhenLaterEntryFails
  391. 37.29 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestImportRetainsCompletedEntriesWhenLaterEntryFails_0xc0036d7b08?vfs=memdb
  392. 37.29 s [go-tests] 2026/08/03 16:40:52 copied 00000000-0000-4000-8000-000000000001-full.jpg
  393. 37.29 s [go-tests] 2026/08/03 16:40:53 copied 00000000-0000-4000-8000-000000000001-850px.jpg
  394. 37.29 s [go-tests] 2026/08/03 16:40:53 copied 00000000-0000-4000-8000-000000000001-250px.jpg
  395. 37.29 s [go-tests] 2026/08/03 16:40:53 copied 00000000-0000-4000-8000-000000000001-150px.jpg
  396. 37.29 s [go-tests] --- PASS: TestImportRetainsCompletedEntriesWhenLaterEntryFails (0.18s)
  397. 37.29 s [go-tests] === RUN TestSourceForEachEntryReadsRealisticExport
  398. 37.29 s [go-tests] 2026/08/03 16:40:53 warning: entry 44444444-4444-4444-8444-444444444444 comment by "Grampa Simpson" (user 800001) missing from followers
  399. 37.29 s [go-tests] 2026/08/03 16:40:53 warning: entry 44444444-4444-4444-8444-444444444444 comment by "Marge Simpson" (user 800002) missing from followers
  400. 37.29 s [go-tests] 2026/08/03 16:40:53 warning: entry 44444444-4444-4444-8444-444444444444 comment by "Patty Bouvier" (user 800003) missing from followers
  401. 37.29 s [go-tests] 2026/08/03 16:40:53 warning: entry 33333333-3333-4333-8333-333333333333 comment by "Grampa Simpson" (user 800001) missing from followers
  402. 37.29 s [go-tests] 2026/08/03 16:40:53 warning: entry 11111111-1111-4111-8111-111111111111 comment by "Grampa Simpson" (user 800001) missing from followers
  403. 37.29 s [go-tests] --- PASS: TestSourceForEachEntryReadsRealisticExport (0.00s)
  404. 37.29 s [go-tests] === RUN TestSourceReturnsExportErrors
  405. 37.29 s [go-tests] === RUN TestSourceReturnsExportErrors/missing_journal_file
  406. 37.29 s [go-tests] === RUN TestSourceReturnsExportErrors/missing_followers_file
  407. 37.29 s [go-tests] === RUN TestSourceReturnsExportErrors/subdirectory_missing_metadata_file
  408. 37.29 s [go-tests] === RUN TestSourceReturnsExportErrors/missing_media_file
  409. 37.29 s [go-tests] === RUN TestSourceReturnsExportErrors/missing_blobs_field
  410. 37.29 s [go-tests] --- PASS: TestSourceReturnsExportErrors (0.00s)
  411. 37.29 s [go-tests] --- PASS: TestSourceReturnsExportErrors/missing_journal_file (0.00s)
  412. 37.29 s [go-tests] --- PASS: TestSourceReturnsExportErrors/missing_followers_file (0.00s)
  413. 37.29 s [go-tests] --- PASS: TestSourceReturnsExportErrors/subdirectory_missing_metadata_file (0.00s)
  414. 37.29 s [go-tests] --- PASS: TestSourceReturnsExportErrors/missing_media_file (0.00s)
  415. 37.29 s [go-tests] --- PASS: TestSourceReturnsExportErrors/missing_blobs_field (0.00s)
  416. 37.29 s [go-tests] === RUN TestSourceForEachEntryOrdersByCreationThenPublishTime
  417. 37.29 s [go-tests] --- PASS: TestSourceForEachEntryOrdersByCreationThenPublishTime (0.00s)
  418. 37.29 s [go-tests] === RUN TestSourceForEachEntryReturnsVisitorError
  419. 37.29 s [go-tests] --- PASS: TestSourceForEachEntryReturnsVisitorError (0.00s)
  420. 37.29 s [go-tests] PASS
  421. 37.29 s [go-tests] coverage: 82.6% of statements
  422. 37.29 s [go-tests] ok codeberg.org/mtlynch/little-moments/importers/tinybeans 8.369s coverage: 82.6% of statements
  423. 37.29 s [go-tests] === RUN TestParseCommentThread
  424. 37.29 s [go-tests] --- PASS: TestParseCommentThread (0.00s)
  425. 37.29 s [go-tests] === RUN TestParseFollowers
  426. 37.29 s [go-tests] === RUN TestParseFollowers/FATHER_relationship_is_an_admin
  427. 37.29 s [go-tests] === RUN TestParseFollowers/MOTHER_relationship_is_an_admin
  428. 37.29 s [go-tests] === RUN TestParseFollowers/non-parent_relationship_is_not_an_admin
  429. 37.29 s [go-tests] === RUN TestParseFollowers/emailOptOut=true_means_receivesEmails=false
  430. 37.29 s [go-tests] === RUN TestParseFollowers/all_email_frequencies_NONE_implies_opt-out
  431. 37.29 s [go-tests] === RUN TestParseFollowers/parser_rejects_duplicate_follower_IDs
  432. 37.29 s [go-tests] --- PASS: TestParseFollowers (0.00s)
  433. 37.29 s [go-tests] --- PASS: TestParseFollowers/FATHER_relationship_is_an_admin (0.00s)
  434. 37.29 s [go-tests] --- PASS: TestParseFollowers/MOTHER_relationship_is_an_admin (0.00s)
  435. 37.29 s [go-tests] --- PASS: TestParseFollowers/non-parent_relationship_is_not_an_admin (0.00s)
  436. 37.29 s [go-tests] --- PASS: TestParseFollowers/emailOptOut=true_means_receivesEmails=false (0.00s)
  437. 37.29 s [go-tests] --- PASS: TestParseFollowers/all_email_frequencies_NONE_implies_opt-out (0.00s)
  438. 37.29 s [go-tests] --- PASS: TestParseFollowers/parser_rejects_duplicate_follower_IDs (0.00s)
  439. 37.30 s [go-tests] === RUN TestParseJournal
  440. 37.30 s [go-tests] === RUN TestParseJournal/parses_journal_title
  441. 37.30 s [go-tests] --- PASS: TestParseJournal (0.00s)
  442. 37.30 s [go-tests] --- PASS: TestParseJournal/parses_journal_title (0.00s)
  443. 37.30 s [go-tests] === RUN TestParseEntry
  444. 37.30 s [go-tests] === RUN TestParseEntry/image_entry_with_one_comment_[11111111-1111-4111-8111-111111111111]
  445. 37.30 s [go-tests] === RUN TestParseEntry/video_entry_with_no_comments_[33333333-3333-4333-8333-333333333333]
  446. 37.30 s [go-tests] === RUN TestParseEntry/image_entry_with_multiple_comments_[22222222-2222-4222-8222-222222222222]
  447. 37.30 s [go-tests] === RUN TestParseEntry/video_entry_with_multiple_comments_[44444444-4444-4444-8444-444444444444]
  448. 37.30 s [go-tests] === RUN TestParseEntry/blob_UUID_differs_from_entry_UUID_[55555555-5555-4555-8555-555555555555]
  449. 37.30 s [go-tests] === RUN TestParseEntry/image_entry_with_multiple_emoji_reactions_[66666666-6666-4666-8666-666666666666]
  450. 37.30 s [go-tests] --- PASS: TestParseEntry (0.00s)
  451. 37.30 s [go-tests] --- PASS: TestParseEntry/image_entry_with_one_comment_[11111111-1111-4111-8111-111111111111] (0.00s)
  452. 37.30 s [go-tests] --- PASS: TestParseEntry/video_entry_with_no_comments_[33333333-3333-4333-8333-333333333333] (0.00s)
  453. 37.30 s [go-tests] --- PASS: TestParseEntry/image_entry_with_multiple_comments_[22222222-2222-4222-8222-222222222222] (0.00s)
  454. 37.30 s [go-tests] --- PASS: TestParseEntry/video_entry_with_multiple_comments_[44444444-4444-4444-8444-444444444444] (0.00s)
  455. 37.30 s [go-tests] --- PASS: TestParseEntry/blob_UUID_differs_from_entry_UUID_[55555555-5555-4555-8555-555555555555] (0.00s)
  456. 37.30 s [go-tests] --- PASS: TestParseEntry/image_entry_with_multiple_emoji_reactions_[66666666-6666-4666-8666-666666666666] (0.00s)
  457. 37.30 s [go-tests] PASS
  458. 37.30 s [go-tests] coverage: 82.5% of statements
  459. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/importers/tinybeans/parse 1.041s coverage: 82.5% of statements
  460. 37.30 s [go-tests] === RUN TestNewCommentText
  461. 37.30 s [go-tests] === RUN TestNewCommentText/plain_text_comment_is_valid_[Hello,_world!]
  462. 37.30 s [go-tests] === RUN TestNewCommentText/leading_and_trailing_spaces_are_stripped_[__Hello,_world!__]
  463. 37.30 s [go-tests] === RUN TestNewCommentText/leading_spaces_are_stripped_[___Hello]
  464. 37.30 s [go-tests] === RUN TestNewCommentText/trailing_spaces_are_stripped_[Hello___]
  465. 37.30 s [go-tests] === RUN TestNewCommentText/plain_text_angle_brackets_are_valid_[i_<3_this_image_--->!]
  466. 37.30 s [go-tests] === RUN TestNewCommentText/text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___script_>]
  467. 37.30 s [go-tests] === RUN TestNewCommentText/image_text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___img_>]
  468. 37.30 s [go-tests] === RUN TestNewCommentText/comment_with_script_tag_is_rejected_[<script>alert('xss')</script>]
  469. 37.30 s [go-tests] === RUN TestNewCommentText/comment_with_uppercase_SCRIPT_tag_is_rejected_[<SCRIPT>alert('xss')</SCRIPT>]
  470. 37.30 s [go-tests] === RUN TestNewCommentText/comment_with_mixed-case_Script_tag_is_rejected_[<Script>alert('xss')</Script>]
  471. 37.30 s [go-tests] === RUN TestNewCommentText/script_tag_with_attributes_is_rejected_[<script_src="evil.js"></script>]
  472. 37.30 s [go-tests] === RUN TestNewCommentText/script_tag_embedded_in_text_is_rejected_[click_here_<script>evil()</script>_thanks]
  473. 37.30 s [go-tests] === RUN TestNewCommentText/script_tag_with_whitespace_before_the_close_bracket_is_rejected_[<script_>alert(1)</script_>]
  474. 37.30 s [go-tests] === RUN TestNewCommentText/split-looking_script_tag_is_rejected_[<s_cript>]
  475. 37.30 s [go-tests] === RUN TestNewCommentText/image_tag_is_rejected_[<img_src="x"_alt="x">]
  476. 37.30 s [go-tests] === RUN TestNewCommentText/uppercase_image_tag_is_rejected_[<IMG_src="x"_alt="x">]
  477. 37.30 s [go-tests] === RUN TestNewCommentText/mixed-case_image_tag_is_rejected_[<IMg_src="x"_alt="x">]
  478. 37.30 s [go-tests] === RUN TestNewCommentText/self-closing_image_tag_is_rejected_[<img_src="x"_alt="x"_/>]
  479. 37.30 s [go-tests] === RUN TestNewCommentText/image_tag_with_whitespace_before_the_close_bracket_is_rejected_[<img_src="x"_alt="x"_>]
  480. 37.30 s [go-tests] === RUN TestNewCommentText/split-looking_image_tag_is_rejected_[<i_mg>]
  481. 37.30 s [go-tests] === RUN TestNewCommentText/empty_string_is_rejected_[]
  482. 37.30 s [go-tests] === RUN TestNewCommentText/whitespace-only_string_is_rejected_[___]
  483. 37.30 s [go-tests] --- PASS: TestNewCommentText (0.00s)
  484. 37.30 s [go-tests] --- PASS: TestNewCommentText/plain_text_comment_is_valid_[Hello,_world!] (0.00s)
  485. 37.30 s [go-tests] --- PASS: TestNewCommentText/leading_and_trailing_spaces_are_stripped_[__Hello,_world!__] (0.00s)
  486. 37.30 s [go-tests] --- PASS: TestNewCommentText/leading_spaces_are_stripped_[___Hello] (0.00s)
  487. 37.30 s [go-tests] --- PASS: TestNewCommentText/trailing_spaces_are_stripped_[Hello___] (0.00s)
  488. 37.30 s [go-tests] --- PASS: TestNewCommentText/plain_text_angle_brackets_are_valid_[i_<3_this_image_--->!] (0.00s)
  489. 37.30 s [go-tests] --- PASS: TestNewCommentText/text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___script_>] (0.00s)
  490. 37.30 s [go-tests] --- PASS: TestNewCommentText/image_text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___img_>] (0.00s)
  491. 37.30 s [go-tests] --- PASS: TestNewCommentText/comment_with_script_tag_is_rejected_[<script>alert('xss')</script>] (0.00s)
  492. 37.30 s [go-tests] --- PASS: TestNewCommentText/comment_with_uppercase_SCRIPT_tag_is_rejected_[<SCRIPT>alert('xss')</SCRIPT>] (0.00s)
  493. 37.30 s [go-tests] --- PASS: TestNewCommentText/comment_with_mixed-case_Script_tag_is_rejected_[<Script>alert('xss')</Script>] (0.00s)
  494. 37.30 s [go-tests] --- PASS: TestNewCommentText/script_tag_with_attributes_is_rejected_[<script_src="evil.js"></script>] (0.00s)
  495. 37.30 s [go-tests] --- PASS: TestNewCommentText/script_tag_embedded_in_text_is_rejected_[click_here_<script>evil()</script>_thanks] (0.00s)
  496. 37.30 s [go-tests] --- PASS: TestNewCommentText/script_tag_with_whitespace_before_the_close_bracket_is_rejected_[<script_>alert(1)</script_>] (0.00s)
  497. 37.30 s [go-tests] --- PASS: TestNewCommentText/split-looking_script_tag_is_rejected_[<s_cript>] (0.00s)
  498. 37.30 s [go-tests] --- PASS: TestNewCommentText/image_tag_is_rejected_[<img_src="x"_alt="x">] (0.00s)
  499. 37.30 s [go-tests] --- PASS: TestNewCommentText/uppercase_image_tag_is_rejected_[<IMG_src="x"_alt="x">] (0.00s)
  500. 37.30 s [go-tests] --- PASS: TestNewCommentText/mixed-case_image_tag_is_rejected_[<IMg_src="x"_alt="x">] (0.00s)
  501. 37.30 s [go-tests] --- PASS: TestNewCommentText/self-closing_image_tag_is_rejected_[<img_src="x"_alt="x"_/>] (0.00s)
  502. 37.30 s [go-tests] --- PASS: TestNewCommentText/image_tag_with_whitespace_before_the_close_bracket_is_rejected_[<img_src="x"_alt="x"_>] (0.00s)
  503. 37.30 s [go-tests] --- PASS: TestNewCommentText/split-looking_image_tag_is_rejected_[<i_mg>] (0.00s)
  504. 37.30 s [go-tests] --- PASS: TestNewCommentText/empty_string_is_rejected_[] (0.00s)
  505. 37.30 s [go-tests] --- PASS: TestNewCommentText/whitespace-only_string_is_rejected_[___] (0.00s)
  506. 37.30 s [go-tests] === RUN TestNewEmailAddress
  507. 37.30 s [go-tests] === RUN TestNewEmailAddress/plain_email_address_is_valid_[user@example.com]
  508. 37.30 s [go-tests] === RUN TestNewEmailAddress/empty_string_is_rejected_[]
  509. 37.30 s [go-tests] === RUN TestNewEmailAddress/address_without_domain_is_rejected_[notanemail]
  510. 37.30 s [go-tests] === RUN TestNewEmailAddress/display_name_with_angle_brackets_is_rejected_[John_Doe_<john@example.com>]
  511. 37.30 s [go-tests] === RUN TestNewEmailAddress/bare_angle_brackets_are_rejected_[<john@example.com>]
  512. 37.30 s [go-tests] === RUN TestNewEmailAddress/address_with_no_@_sign_is_rejected_[joe]
  513. 37.30 s [go-tests] === RUN TestNewEmailAddress/address_with_no_local_part_is_rejected_[@example.com]
  514. 37.30 s [go-tests] === RUN TestNewEmailAddress/address_with_empty_domain_label_is_rejected_[joe@.com]
  515. 37.30 s [go-tests] === RUN TestNewEmailAddress/address_with_no_local_part_and_empty_domain_label_is_rejected_[@.com]
  516. 37.30 s [go-tests] === RUN TestNewEmailAddress/address_with_no_TLD_is_rejected_[joe@example]
  517. 37.30 s [go-tests] === RUN TestNewEmailAddress/address_with_no_domain_is_rejected_[joe@]
  518. 37.30 s [go-tests] --- PASS: TestNewEmailAddress (0.00s)
  519. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/plain_email_address_is_valid_[user@example.com] (0.00s)
  520. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/empty_string_is_rejected_[] (0.00s)
  521. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/address_without_domain_is_rejected_[notanemail] (0.00s)
  522. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/display_name_with_angle_brackets_is_rejected_[John_Doe_<john@example.com>] (0.00s)
  523. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/bare_angle_brackets_are_rejected_[<john@example.com>] (0.00s)
  524. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/address_with_no_@_sign_is_rejected_[joe] (0.00s)
  525. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/address_with_no_local_part_is_rejected_[@example.com] (0.00s)
  526. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/address_with_empty_domain_label_is_rejected_[joe@.com] (0.00s)
  527. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/address_with_no_local_part_and_empty_domain_label_is_rejected_[@.com] (0.00s)
  528. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/address_with_no_TLD_is_rejected_[joe@example] (0.00s)
  529. 37.30 s [go-tests] --- PASS: TestNewEmailAddress/address_with_no_domain_is_rejected_[joe@] (0.00s)
  530. 37.30 s [go-tests] === RUN TestEmailIsEmpty
  531. 37.30 s [go-tests] === RUN TestEmailIsEmpty/zero_value_is_empty
  532. 37.30 s [go-tests] === RUN TestEmailIsEmpty/valid_email_is_not_empty
  533. 37.30 s [go-tests] --- PASS: TestEmailIsEmpty (0.00s)
  534. 37.30 s [go-tests] --- PASS: TestEmailIsEmpty/zero_value_is_empty (0.00s)
  535. 37.30 s [go-tests] --- PASS: TestEmailIsEmpty/valid_email_is_not_empty (0.00s)
  536. 37.30 s [go-tests] === RUN TestMediaItemFilenames
  537. 37.30 s [go-tests] === RUN TestMediaItemFilenames/image
  538. 37.30 s [go-tests] === RUN TestMediaItemFilenames/animated-image
  539. 37.30 s [go-tests] === RUN TestMediaItemFilenames/video_has_no_display-size_variant
  540. 37.30 s [go-tests] --- PASS: TestMediaItemFilenames (0.00s)
  541. 37.30 s [go-tests] --- PASS: TestMediaItemFilenames/image (0.00s)
  542. 37.30 s [go-tests] --- PASS: TestMediaItemFilenames/animated-image (0.00s)
  543. 37.30 s [go-tests] --- PASS: TestMediaItemFilenames/video_has_no_display-size_variant (0.00s)
  544. 37.30 s [go-tests] === RUN TestMediaItemFilenamesPanicsOnUnknownType
  545. 37.30 s [go-tests] --- PASS: TestMediaItemFilenamesPanicsOnUnknownType (0.00s)
  546. 37.30 s [go-tests] === RUN TestNewMediaID
  547. 37.30 s [go-tests] === RUN TestNewMediaID/minimum_valid_ID_is_accepted_[1]
  548. 37.30 s [go-tests] === RUN TestNewMediaID/SQLite's_first_generated_ID_is_accepted_[1]
  549. 37.30 s [go-tests] === RUN TestNewMediaID/zero_is_rejected_[0]
  550. 37.30 s [go-tests] --- PASS: TestNewMediaID (0.00s)
  551. 37.30 s [go-tests] --- PASS: TestNewMediaID/minimum_valid_ID_is_accepted_[1] (0.00s)
  552. 37.30 s [go-tests] --- PASS: TestNewMediaID/SQLite's_first_generated_ID_is_accepted_[1] (0.00s)
  553. 37.30 s [go-tests] --- PASS: TestNewMediaID/zero_is_rejected_[0] (0.00s)
  554. 37.30 s [go-tests] === RUN TestNewImageWidth
  555. 37.30 s [go-tests] === RUN TestNewImageWidth/one_pixel_is_accepted_[1]
  556. 37.30 s [go-tests] === RUN TestNewImageWidth/maximum_width_is_accepted_[65535]
  557. 37.30 s [go-tests] === RUN TestNewImageWidth/zero_is_rejected_[0]
  558. 37.30 s [go-tests] === RUN TestNewImageWidth/width_exceeding_the_maximum_is_rejected_[65536]
  559. 37.30 s [go-tests] === RUN TestNewImageWidth/five_million_pixels_is_rejected_[5000000]
  560. 37.30 s [go-tests] --- PASS: TestNewImageWidth (0.00s)
  561. 37.30 s [go-tests] --- PASS: TestNewImageWidth/one_pixel_is_accepted_[1] (0.00s)
  562. 37.30 s [go-tests] --- PASS: TestNewImageWidth/maximum_width_is_accepted_[65535] (0.00s)
  563. 37.30 s [go-tests] --- PASS: TestNewImageWidth/zero_is_rejected_[0] (0.00s)
  564. 37.30 s [go-tests] --- PASS: TestNewImageWidth/width_exceeding_the_maximum_is_rejected_[65536] (0.00s)
  565. 37.30 s [go-tests] --- PASS: TestNewImageWidth/five_million_pixels_is_rejected_[5000000] (0.00s)
  566. 37.30 s [go-tests] === RUN TestNewImageHeight
  567. 37.30 s [go-tests] === RUN TestNewImageHeight/one_pixel_is_accepted_[1]
  568. 37.30 s [go-tests] === RUN TestNewImageHeight/maximum_height_is_accepted_[65535]
  569. 37.30 s [go-tests] === RUN TestNewImageHeight/zero_is_rejected_[0]
  570. 37.30 s [go-tests] === RUN TestNewImageHeight/height_exceeding_the_maximum_is_rejected_[65536]
  571. 37.30 s [go-tests] === RUN TestNewImageHeight/five_million_pixels_is_rejected_[5000000]
  572. 37.30 s [go-tests] --- PASS: TestNewImageHeight (0.00s)
  573. 37.30 s [go-tests] --- PASS: TestNewImageHeight/one_pixel_is_accepted_[1] (0.00s)
  574. 37.30 s [go-tests] --- PASS: TestNewImageHeight/maximum_height_is_accepted_[65535] (0.00s)
  575. 37.30 s [go-tests] --- PASS: TestNewImageHeight/zero_is_rejected_[0] (0.00s)
  576. 37.30 s [go-tests] --- PASS: TestNewImageHeight/height_exceeding_the_maximum_is_rejected_[65536] (0.00s)
  577. 37.30 s [go-tests] --- PASS: TestNewImageHeight/five_million_pixels_is_rejected_[5000000] (0.00s)
  578. 37.30 s [go-tests] === RUN TestNewCaption
  579. 37.30 s [go-tests] === RUN TestNewCaption/plain_text_caption_is_valid_[A_day_at_the_park]
  580. 37.30 s [go-tests] === RUN TestNewCaption/leading_and_trailing_spaces_are_stripped_[__A_day_at_the_park__]
  581. 37.30 s [go-tests] === RUN TestNewCaption/empty_caption_is_valid_[]
  582. 37.30 s [go-tests] === RUN TestNewCaption/whitespace-only_caption_is_stripped_to_empty_[___]
  583. 37.30 s [go-tests] === RUN TestNewCaption/plain_text_angle_brackets_are_valid_[i_<3_this_image_--->!]
  584. 37.30 s [go-tests] === RUN TestNewCaption/text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___script_>]
  585. 37.30 s [go-tests] === RUN TestNewCaption/image_text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___img_>]
  586. 37.30 s [go-tests] === RUN TestNewCaption/caption_with_script_tag_is_rejected_[<script>alert('xss')</script>]
  587. 37.30 s [go-tests] === RUN TestNewCaption/caption_with_uppercase_SCRIPT_tag_is_rejected_[<SCRIPT>alert('xss')</SCRIPT>]
  588. 37.30 s [go-tests] === RUN TestNewCaption/caption_with_mixed-case_script_tag_is_rejected_[before_<Script>evil()</Script>_after]
  589. 37.30 s [go-tests] === RUN TestNewCaption/script_tag_with_attributes_is_rejected_[<script_src="evil.js"></script>]
  590. 37.30 s [go-tests] === RUN TestNewCaption/script_tag_with_whitespace_before_the_close_bracket_is_rejected_[<script_>alert(1)</script_>]
  591. 37.30 s [go-tests] === RUN TestNewCaption/split-looking_script_tag_is_rejected_[<s_cript>]
  592. 37.30 s [go-tests] === RUN TestNewCaption/image_tag_is_rejected_[<img_src="x"_alt="x">]
  593. 37.30 s [go-tests] === RUN TestNewCaption/uppercase_image_tag_is_rejected_[<IMG_src="x"_alt="x">]
  594. 37.30 s [go-tests] === RUN TestNewCaption/mixed-case_image_tag_is_rejected_[<IMg_src="x"_alt="x">]
  595. 37.30 s [go-tests] === RUN TestNewCaption/self-closing_image_tag_is_rejected_[<img_src="x"_alt="x"_/>]
  596. 37.30 s [go-tests] === RUN TestNewCaption/image_tag_with_whitespace_before_the_close_bracket_is_rejected_[<img_src="x"_alt="x"_>]
  597. 37.30 s [go-tests] === RUN TestNewCaption/split-looking_image_tag_is_rejected_[<i_mg>]
  598. 37.30 s [go-tests] --- PASS: TestNewCaption (0.00s)
  599. 37.30 s [go-tests] --- PASS: TestNewCaption/plain_text_caption_is_valid_[A_day_at_the_park] (0.00s)
  600. 37.30 s [go-tests] --- PASS: TestNewCaption/leading_and_trailing_spaces_are_stripped_[__A_day_at_the_park__] (0.00s)
  601. 37.30 s [go-tests] --- PASS: TestNewCaption/empty_caption_is_valid_[] (0.00s)
  602. 37.30 s [go-tests] --- PASS: TestNewCaption/whitespace-only_caption_is_stripped_to_empty_[___] (0.00s)
  603. 37.30 s [go-tests] --- PASS: TestNewCaption/plain_text_angle_brackets_are_valid_[i_<3_this_image_--->!] (0.00s)
  604. 37.30 s [go-tests] --- PASS: TestNewCaption/text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___script_>] (0.00s)
  605. 37.30 s [go-tests] --- PASS: TestNewCaption/image_text_with_whitespace_after_the_opening_angle_bracket_is_valid_[<___img_>] (0.00s)
  606. 37.30 s [go-tests] --- PASS: TestNewCaption/caption_with_script_tag_is_rejected_[<script>alert('xss')</script>] (0.00s)
  607. 37.30 s [go-tests] --- PASS: TestNewCaption/caption_with_uppercase_SCRIPT_tag_is_rejected_[<SCRIPT>alert('xss')</SCRIPT>] (0.00s)
  608. 37.30 s [go-tests] --- PASS: TestNewCaption/caption_with_mixed-case_script_tag_is_rejected_[before_<Script>evil()</Script>_after] (0.00s)
  609. 37.30 s [go-tests] --- PASS: TestNewCaption/script_tag_with_attributes_is_rejected_[<script_src="evil.js"></script>] (0.00s)
  610. 37.30 s [go-tests] --- PASS: TestNewCaption/script_tag_with_whitespace_before_the_close_bracket_is_rejected_[<script_>alert(1)</script_>] (0.00s)
  611. 37.30 s [go-tests] --- PASS: TestNewCaption/split-looking_script_tag_is_rejected_[<s_cript>] (0.00s)
  612. 37.30 s [go-tests] --- PASS: TestNewCaption/image_tag_is_rejected_[<img_src="x"_alt="x">] (0.00s)
  613. 37.30 s [go-tests] --- PASS: TestNewCaption/uppercase_image_tag_is_rejected_[<IMG_src="x"_alt="x">] (0.00s)
  614. 37.30 s [go-tests] --- PASS: TestNewCaption/mixed-case_image_tag_is_rejected_[<IMg_src="x"_alt="x">] (0.00s)
  615. 37.30 s [go-tests] --- PASS: TestNewCaption/self-closing_image_tag_is_rejected_[<img_src="x"_alt="x"_/>] (0.00s)
  616. 37.30 s [go-tests] --- PASS: TestNewCaption/image_tag_with_whitespace_before_the_close_bracket_is_rejected_[<img_src="x"_alt="x"_>] (0.00s)
  617. 37.30 s [go-tests] --- PASS: TestNewCaption/split-looking_image_tag_is_rejected_[<i_mg>] (0.00s)
  618. 37.30 s [go-tests] === RUN TestNewFilename
  619. 37.30 s [go-tests] === RUN TestNewFilename/filename_with_extension_is_valid_[vacation.jpg]
  620. 37.30 s [go-tests] === RUN TestNewFilename/filename_without_extension_is_valid_[upload]
  621. 37.30 s [go-tests] === RUN TestNewFilename/leading_and_trailing_spaces_are_stripped_[__vacation.jpg__]
  622. 37.30 s [go-tests] === RUN TestNewFilename/empty_filename_is_rejected_[]
  623. 37.30 s [go-tests] === RUN TestNewFilename/whitespace-only_filename_is_rejected_[___]
  624. 37.30 s [go-tests] --- PASS: TestNewFilename (0.00s)
  625. 37.30 s [go-tests] --- PASS: TestNewFilename/filename_with_extension_is_valid_[vacation.jpg] (0.00s)
  626. 37.30 s [go-tests] --- PASS: TestNewFilename/filename_without_extension_is_valid_[upload] (0.00s)
  627. 37.30 s [go-tests] --- PASS: TestNewFilename/leading_and_trailing_spaces_are_stripped_[__vacation.jpg__] (0.00s)
  628. 37.30 s [go-tests] --- PASS: TestNewFilename/empty_filename_is_rejected_[] (0.00s)
  629. 37.30 s [go-tests] --- PASS: TestNewFilename/whitespace-only_filename_is_rejected_[___] (0.00s)
  630. 37.30 s [go-tests] === RUN TestNewReactionEmoji
  631. 37.30 s [go-tests] === RUN TestNewReactionEmoji/heart_emoji_is_valid_[♥️]
  632. 37.30 s [go-tests] === RUN TestNewReactionEmoji/laughing_emoji_is_valid_[😂]
  633. 37.30 s [go-tests] === RUN TestNewReactionEmoji/party_popper_emoji_is_valid_[🎉]
  634. 37.30 s [go-tests] === RUN TestNewReactionEmoji/shocked_cat_emoji_is_valid_[🙀]
  635. 37.30 s [go-tests] === RUN TestNewReactionEmoji/raised_eyebrow_emoji_is_valid_[🤨]
  636. 37.30 s [go-tests] === RUN TestNewReactionEmoji/empty_string_is_rejected_[]
  637. 37.30 s [go-tests] === RUN TestNewReactionEmoji/arbitrary_text_is_rejected_[love]
  638. 37.30 s [go-tests] === RUN TestNewReactionEmoji/unlisted_emoji_is_rejected_[👍]
  639. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji (0.01s)
  640. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji/heart_emoji_is_valid_[♥️] (0.00s)
  641. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji/laughing_emoji_is_valid_[😂] (0.00s)
  642. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji/party_popper_emoji_is_valid_[🎉] (0.00s)
  643. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji/shocked_cat_emoji_is_valid_[🙀] (0.00s)
  644. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji/raised_eyebrow_emoji_is_valid_[🤨] (0.00s)
  645. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji/empty_string_is_rejected_[] (0.00s)
  646. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji/arbitrary_text_is_rejected_[love] (0.00s)
  647. 37.30 s [go-tests] --- PASS: TestNewReactionEmoji/unlisted_emoji_is_rejected_[👍] (0.00s)
  648. 37.30 s [go-tests] === RUN TestNewRedirectPath
  649. 37.30 s [go-tests] === RUN TestNewRedirectPath/empty_path_defaults_to_root_[]
  650. 37.30 s [go-tests] === RUN TestNewRedirectPath/root-relative_path_is_accepted_[/about]
  651. 37.30 s [go-tests] === RUN TestNewRedirectPath/absolute_path_with_query_is_accepted_[/media?page=2]
  652. 37.30 s [go-tests] === RUN TestNewRedirectPath/login_redirect_with_next_path_is_accepted_[/login?next=%2Fabout]
  653. 37.30 s [go-tests] === RUN TestNewRedirectPath/login_redirect_with_next_query_string_is_accepted_[/login?next=%2Fmedia%3Fpage%3D2]
  654. 37.30 s [go-tests] === RUN TestNewRedirectPath/protocol-relative_URL_is_rejected_[//example.com/evil]
  655. 37.30 s [go-tests] === RUN TestNewRedirectPath/path_without_leading_slash_is_rejected_[browse]
  656. 37.30 s [go-tests] === RUN TestNewRedirectPath/malformed_path_is_rejected_[://example.com/evil]
  657. 37.30 s [go-tests] === RUN TestNewRedirectPath/absolute_http_URL_is_rejected_[http://example.com/evil]
  658. 37.30 s [go-tests] === RUN TestNewRedirectPath/absolute_https_URL_is_rejected_[https://example.com/evil]
  659. 37.30 s [go-tests] === RUN TestNewRedirectPath/non-http_absolute_URL_is_rejected_[ftp://example.com/evil]
  660. 37.30 s [go-tests] --- PASS: TestNewRedirectPath (0.00s)
  661. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/empty_path_defaults_to_root_[] (0.00s)
  662. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/root-relative_path_is_accepted_[/about] (0.00s)
  663. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/absolute_path_with_query_is_accepted_[/media?page=2] (0.00s)
  664. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/login_redirect_with_next_path_is_accepted_[/login?next=%2Fabout] (0.00s)
  665. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/login_redirect_with_next_query_string_is_accepted_[/login?next=%2Fmedia%3Fpage%3D2] (0.00s)
  666. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/protocol-relative_URL_is_rejected_[//example.com/evil] (0.00s)
  667. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/path_without_leading_slash_is_rejected_[browse] (0.00s)
  668. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/malformed_path_is_rejected_[://example.com/evil] (0.00s)
  669. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/absolute_http_URL_is_rejected_[http://example.com/evil] (0.00s)
  670. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/absolute_https_URL_is_rejected_[https://example.com/evil] (0.00s)
  671. 37.30 s [go-tests] --- PASS: TestNewRedirectPath/non-http_absolute_URL_is_rejected_[ftp://example.com/evil] (0.00s)
  672. 37.30 s [go-tests] === RUN TestUserIDFromString
  673. 37.30 s [go-tests] === RUN TestUserIDFromString/lowercase_UUIDv4_is_valid_[11111111-1111-4111-8111-111111111111]
  674. 37.30 s [go-tests] === RUN TestUserIDFromString/empty_string_is_invalid_[]
  675. 37.30 s [go-tests] === RUN TestUserIDFromString/non-UUID_string_is_invalid_[not-a-uuid]
  676. 37.30 s [go-tests] === RUN TestUserIDFromString/UUIDv1_is_invalid_[11111111-1111-1111-8111-111111111111]
  677. 37.30 s [go-tests] === RUN TestUserIDFromString/uppercase_UUID_is_invalid_[11111111-1111-4111-8111-AAAAAAAAAAAA]
  678. 37.30 s [go-tests] --- PASS: TestUserIDFromString (0.00s)
  679. 37.30 s [go-tests] --- PASS: TestUserIDFromString/lowercase_UUIDv4_is_valid_[11111111-1111-4111-8111-111111111111] (0.00s)
  680. 37.30 s [go-tests] --- PASS: TestUserIDFromString/empty_string_is_invalid_[] (0.00s)
  681. 37.30 s [go-tests] --- PASS: TestUserIDFromString/non-UUID_string_is_invalid_[not-a-uuid] (0.00s)
  682. 37.30 s [go-tests] --- PASS: TestUserIDFromString/UUIDv1_is_invalid_[11111111-1111-1111-8111-111111111111] (0.00s)
  683. 37.30 s [go-tests] --- PASS: TestUserIDFromString/uppercase_UUID_is_invalid_[11111111-1111-4111-8111-AAAAAAAAAAAA] (0.00s)
  684. 37.30 s [go-tests] === RUN TestNewVideoDuration
  685. 37.30 s [go-tests] === RUN TestNewVideoDuration/one_second_is_valid_[1s]
  686. 37.30 s [go-tests] === RUN TestNewVideoDuration/minimum_duration_is_valid_[1ns]
  687. 37.30 s [go-tests] === RUN TestNewVideoDuration/duration_limit_is_valid_[30m0s]
  688. 37.30 s [go-tests] === RUN TestNewVideoDuration/zero_is_rejected_[0s]
  689. 37.30 s [go-tests] === RUN TestNewVideoDuration/negative_duration_is_rejected_[-1s]
  690. 37.30 s [go-tests] === RUN TestNewVideoDuration/duration_over_limit_is_rejected_[30m0.000000001s]
  691. 37.30 s [go-tests] --- PASS: TestNewVideoDuration (0.00s)
  692. 37.30 s [go-tests] --- PASS: TestNewVideoDuration/one_second_is_valid_[1s] (0.00s)
  693. 37.30 s [go-tests] --- PASS: TestNewVideoDuration/minimum_duration_is_valid_[1ns] (0.00s)
  694. 37.30 s [go-tests] --- PASS: TestNewVideoDuration/duration_limit_is_valid_[30m0s] (0.00s)
  695. 37.30 s [go-tests] --- PASS: TestNewVideoDuration/zero_is_rejected_[0s] (0.00s)
  696. 37.30 s [go-tests] --- PASS: TestNewVideoDuration/negative_duration_is_rejected_[-1s] (0.00s)
  697. 37.30 s [go-tests] --- PASS: TestNewVideoDuration/duration_over_limit_is_rejected_[30m0.000000001s] (0.00s)
  698. 37.30 s [go-tests] PASS
  699. 37.30 s [go-tests] coverage: 86.7% of statements
  700. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/little_moments 1.040s coverage: 86.7% of statements
  701. 37.30 s [go-tests] === RUN TestFromString
  702. 37.30 s [go-tests] === RUN TestFromString/valid_token_with_required_length_is_accepted_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]
  703. 37.30 s [go-tests] === RUN TestFromString/valid_token_with_uppercase_letters_is_accepted_[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA]
  704. 37.30 s [go-tests] === RUN TestFromString/valid_token_with_digits_is_accepted_[11111111111111111111111111111111]
  705. 37.30 s [go-tests] === RUN TestFromString/token_with_ambiguous_characters_Il0O_is_accepted_[Il0Oaaaaaaaaaaaaaaaaaaaaaaaaaaaa]
  706. 37.30 s [go-tests] === RUN TestFromString/empty_string_is_rejected_[]
  707. 37.30 s [go-tests] === RUN TestFromString/token_one_character_too_short_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]
  708. 37.30 s [go-tests] === RUN TestFromString/token_one_character_too_long_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa]
  709. 37.30 s [go-tests] === RUN TestFromString/token_containing_a_space_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_]
  710. 37.30 s [go-tests] === RUN TestFromString/token_containing_a_special_character_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!]
  711. 37.30 s [go-tests] === RUN TestFromString/invalid_token_error_does_not_reveal_submitted_token_[sssssssssssssssssssssssssssssss!]
  712. 37.30 s [go-tests] --- PASS: TestFromString (0.00s)
  713. 37.30 s [go-tests] --- PASS: TestFromString/valid_token_with_required_length_is_accepted_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] (0.00s)
  714. 37.30 s [go-tests] --- PASS: TestFromString/valid_token_with_uppercase_letters_is_accepted_[AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA] (0.00s)
  715. 37.30 s [go-tests] --- PASS: TestFromString/valid_token_with_digits_is_accepted_[11111111111111111111111111111111] (0.00s)
  716. 37.30 s [go-tests] --- PASS: TestFromString/token_with_ambiguous_characters_Il0O_is_accepted_[Il0Oaaaaaaaaaaaaaaaaaaaaaaaaaaaa] (0.00s)
  717. 37.30 s [go-tests] --- PASS: TestFromString/empty_string_is_rejected_[] (0.00s)
  718. 37.30 s [go-tests] --- PASS: TestFromString/token_one_character_too_short_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] (0.00s)
  719. 37.30 s [go-tests] --- PASS: TestFromString/token_one_character_too_long_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa] (0.00s)
  720. 37.30 s [go-tests] --- PASS: TestFromString/token_containing_a_space_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa_] (0.00s)
  721. 37.30 s [go-tests] --- PASS: TestFromString/token_containing_a_special_character_is_rejected_[aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!] (0.00s)
  722. 37.30 s [go-tests] --- PASS: TestFromString/invalid_token_error_does_not_reveal_submitted_token_[sssssssssssssssssssssssssssssss!] (0.00s)
  723. 37.30 s [go-tests] === RUN TestGeneratorCreate
  724. 37.30 s [go-tests] --- PASS: TestGeneratorCreate (0.00s)
  725. 37.30 s [go-tests] PASS
  726. 37.30 s [go-tests] coverage: 66.7% of statements
  727. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/little_moments/login_token 1.036s coverage: 66.7% of statements
  728. 37.30 s [go-tests] === RUN TestSendLoginEmail
  729. 37.30 s [go-tests] === RUN TestSendLoginEmail/succeeds_for_registered_user_with_default_redirect_path
  730. 37.30 s [go-tests] === RUN TestSendLoginEmail/succeeds_for_registered_user_with_non-default_redirect_path
  731. 37.30 s [go-tests] === RUN TestSendLoginEmail/returns_ErrUnregisteredEmail_for_unregistered_email
  732. 37.30 s [go-tests] === RUN TestSendLoginEmail/returns_error_on_store_lookup_failure
  733. 37.30 s [go-tests] === RUN TestSendLoginEmail/returns_error_on_token_insert_failure
  734. 37.30 s [go-tests] === RUN TestSendLoginEmail/returns_error_on_email_send_failure
  735. 37.30 s [go-tests] --- PASS: TestSendLoginEmail (0.00s)
  736. 37.30 s [go-tests] --- PASS: TestSendLoginEmail/succeeds_for_registered_user_with_default_redirect_path (0.00s)
  737. 37.30 s [go-tests] --- PASS: TestSendLoginEmail/succeeds_for_registered_user_with_non-default_redirect_path (0.00s)
  738. 37.30 s [go-tests] --- PASS: TestSendLoginEmail/returns_ErrUnregisteredEmail_for_unregistered_email (0.00s)
  739. 37.30 s [go-tests] --- PASS: TestSendLoginEmail/returns_error_on_store_lookup_failure (0.00s)
  740. 37.30 s [go-tests] --- PASS: TestSendLoginEmail/returns_error_on_token_insert_failure (0.00s)
  741. 37.30 s [go-tests] --- PASS: TestSendLoginEmail/returns_error_on_email_send_failure (0.00s)
  742. 37.30 s [go-tests] PASS
  743. 37.30 s [go-tests] coverage: 100.0% of statements
  744. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/magiclogin 1.021s coverage: 100.0% of statements
  745. 37.30 s [go-tests] === RUN TestSenderSend
  746. 37.30 s [go-tests] 2026/08/03 16:40:45 sent login email for user 11111111-1111-4111-8111-111111111111
  747. 37.30 s [go-tests] --- PASS: TestSenderSend (0.00s)
  748. 37.30 s [go-tests] PASS
  749. 37.30 s [go-tests] coverage: 77.8% of statements
  750. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/magiclogin/loginmail 1.027s coverage: 77.8% of statements
  751. 37.30 s [go-tests] === RUN TestNewHost
  752. 37.30 s [go-tests] === RUN TestNewHost/hostname_is_valid_[smtp.example.com]
  753. 37.30 s [go-tests] === RUN TestNewHost/leading_and_trailing_spaces_are_stripped_[__smtp.example.com__]
  754. 37.30 s [go-tests] === RUN TestNewHost/empty_string_is_rejected_[]
  755. 37.30 s [go-tests] === RUN TestNewHost/whitespace-only_string_is_rejected_[___]
  756. 37.30 s [go-tests] --- PASS: TestNewHost (0.00s)
  757. 37.30 s [go-tests] --- PASS: TestNewHost/hostname_is_valid_[smtp.example.com] (0.00s)
  758. 37.30 s [go-tests] --- PASS: TestNewHost/leading_and_trailing_spaces_are_stripped_[__smtp.example.com__] (0.00s)
  759. 37.30 s [go-tests] --- PASS: TestNewHost/empty_string_is_rejected_[] (0.00s)
  760. 37.30 s [go-tests] --- PASS: TestNewHost/whitespace-only_string_is_rejected_[___] (0.00s)
  761. 37.30 s [go-tests] === RUN TestNewPort
  762. 37.30 s [go-tests] === RUN TestNewPort/standard_SMTP_port_is_valid_[587]
  763. 37.30 s [go-tests] === RUN TestNewPort/lowest_TCP_port_is_valid_[1]
  764. 37.30 s [go-tests] === RUN TestNewPort/highest_TCP_port_is_valid_[65535]
  765. 37.30 s [go-tests] === RUN TestNewPort/zero_is_rejected_[0]
  766. 37.30 s [go-tests] === RUN TestNewPort/negative_port_is_rejected_[-1]
  767. 37.30 s [go-tests] === RUN TestNewPort/port_beyond_TCP_range_is_rejected_[65536]
  768. 37.30 s [go-tests] --- PASS: TestNewPort (0.00s)
  769. 37.30 s [go-tests] --- PASS: TestNewPort/standard_SMTP_port_is_valid_[587] (0.00s)
  770. 37.30 s [go-tests] --- PASS: TestNewPort/lowest_TCP_port_is_valid_[1] (0.00s)
  771. 37.30 s [go-tests] --- PASS: TestNewPort/highest_TCP_port_is_valid_[65535] (0.00s)
  772. 37.30 s [go-tests] --- PASS: TestNewPort/zero_is_rejected_[0] (0.00s)
  773. 37.30 s [go-tests] --- PASS: TestNewPort/negative_port_is_rejected_[-1] (0.00s)
  774. 37.30 s [go-tests] --- PASS: TestNewPort/port_beyond_TCP_range_is_rejected_[65536] (0.00s)
  775. 37.30 s [go-tests] === RUN TestNewUsername
  776. 37.30 s [go-tests] === RUN TestNewUsername/username_is_valid_[smtp-user]
  777. 37.30 s [go-tests] === RUN TestNewUsername/surrounding_spaces_are_preserved_[_smtp-user_]
  778. 37.30 s [go-tests] === RUN TestNewUsername/empty_string_is_rejected_[]
  779. 37.30 s [go-tests] --- PASS: TestNewUsername (0.00s)
  780. 37.30 s [go-tests] --- PASS: TestNewUsername/username_is_valid_[smtp-user] (0.00s)
  781. 37.30 s [go-tests] --- PASS: TestNewUsername/surrounding_spaces_are_preserved_[_smtp-user_] (0.00s)
  782. 37.30 s [go-tests] --- PASS: TestNewUsername/empty_string_is_rejected_[] (0.00s)
  783. 37.30 s [go-tests] === RUN TestNewPassword
  784. 37.30 s [go-tests] === RUN TestNewPassword/password_is_valid_[secret]
  785. 37.30 s [go-tests] === RUN TestNewPassword/surrounding_spaces_are_preserved_[_secret_]
  786. 37.30 s [go-tests] === RUN TestNewPassword/empty_string_is_rejected_[]
  787. 37.30 s [go-tests] --- PASS: TestNewPassword (0.00s)
  788. 37.30 s [go-tests] --- PASS: TestNewPassword/password_is_valid_[secret] (0.00s)
  789. 37.30 s [go-tests] --- PASS: TestNewPassword/surrounding_spaces_are_preserved_[_secret_] (0.00s)
  790. 37.30 s [go-tests] --- PASS: TestNewPassword/empty_string_is_rejected_[] (0.00s)
  791. 37.30 s [go-tests] PASS
  792. 37.30 s [go-tests] coverage: 27.4% of statements
  793. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/magiclogin/loginmail/smtp 1.026s coverage: 27.4% of statements
  794. 37.30 s [go-tests] === RUN TestWriteConverted
  795. 37.30 s [go-tests] --- PASS: TestWriteConverted (0.02s)
  796. 37.30 s [go-tests] === RUN TestWriteConvertedPropagatesConvError
  797. 37.30 s [go-tests] --- PASS: TestWriteConvertedPropagatesConvError (0.00s)
  798. 37.30 s [go-tests] === RUN TestNewRelativePath
  799. 37.30 s [go-tests] === RUN TestNewRelativePath/filename_is_valid_[abc123.jpg]
  800. 37.30 s [go-tests] === RUN TestNewRelativePath/path_with_subfolder_is_valid_[imports/abc123.jpg]
  801. 37.30 s [go-tests] === RUN TestNewRelativePath/surrounding_spaces_are_trimmed_[__imports/abc123.jpg__]
  802. 37.30 s [go-tests] === RUN TestNewRelativePath/empty_path_is_invalid_[]
  803. 37.30 s [go-tests] === RUN TestNewRelativePath/whitespace-only_path_is_invalid_[___]
  804. 37.30 s [go-tests] === RUN TestNewRelativePath/trailing_slash_is_invalid_[imports/]
  805. 37.30 s [go-tests] === RUN TestNewRelativePath/leading_slash_is_invalid_[/imports/abc123.jpg]
  806. 37.30 s [go-tests] === RUN TestNewRelativePath/single_parent_directory_traversal_is_invalid_[../abc123.jpg]
  807. 37.30 s [go-tests] === RUN TestNewRelativePath/leading_whitespace_before_traversal_is_invalid_[__../abc123.jpg]
  808. 37.30 s [go-tests] === RUN TestNewRelativePath/nested_parent_directory_traversal_is_invalid_[../../abc123.jpg]
  809. 37.30 s [go-tests] === RUN TestNewRelativePath/subfolder_parent_directory_traversal_is_invalid_[foo/../../abc123.jpg]
  810. 37.30 s [go-tests] === RUN TestNewRelativePath/directory-only_path_is_invalid_[.]
  811. 37.30 s [go-tests] --- PASS: TestNewRelativePath (0.00s)
  812. 37.30 s [go-tests] --- PASS: TestNewRelativePath/filename_is_valid_[abc123.jpg] (0.00s)
  813. 37.30 s [go-tests] --- PASS: TestNewRelativePath/path_with_subfolder_is_valid_[imports/abc123.jpg] (0.00s)
  814. 37.30 s [go-tests] --- PASS: TestNewRelativePath/surrounding_spaces_are_trimmed_[__imports/abc123.jpg__] (0.00s)
  815. 37.30 s [go-tests] --- PASS: TestNewRelativePath/empty_path_is_invalid_[] (0.00s)
  816. 37.30 s [go-tests] --- PASS: TestNewRelativePath/whitespace-only_path_is_invalid_[___] (0.00s)
  817. 37.30 s [go-tests] --- PASS: TestNewRelativePath/trailing_slash_is_invalid_[imports/] (0.00s)
  818. 37.30 s [go-tests] --- PASS: TestNewRelativePath/leading_slash_is_invalid_[/imports/abc123.jpg] (0.00s)
  819. 37.30 s [go-tests] --- PASS: TestNewRelativePath/single_parent_directory_traversal_is_invalid_[../abc123.jpg] (0.00s)
  820. 37.30 s [go-tests] --- PASS: TestNewRelativePath/leading_whitespace_before_traversal_is_invalid_[__../abc123.jpg] (0.00s)
  821. 37.30 s [go-tests] --- PASS: TestNewRelativePath/nested_parent_directory_traversal_is_invalid_[../../abc123.jpg] (0.00s)
  822. 37.30 s [go-tests] --- PASS: TestNewRelativePath/subfolder_parent_directory_traversal_is_invalid_[foo/../../abc123.jpg] (0.00s)
  823. 37.30 s [go-tests] --- PASS: TestNewRelativePath/directory-only_path_is_invalid_[.] (0.00s)
  824. 37.30 s [go-tests] === RUN TestNewSubfolder
  825. 37.30 s [go-tests] === RUN TestNewSubfolder/subfolder_is_valid_[imports]
  826. 37.30 s [go-tests] === RUN TestNewSubfolder/nested_subfolder_is_valid_[media/uploads]
  827. 37.30 s [go-tests] === RUN TestNewSubfolder/surrounding_spaces_are_trimmed_[__media/uploads__]
  828. 37.30 s [go-tests] === RUN TestNewSubfolder/empty_subfolder_is_invalid_[]
  829. 37.30 s [go-tests] === RUN TestNewSubfolder/whitespace-only_subfolder_is_invalid_[___]
  830. 37.30 s [go-tests] === RUN TestNewSubfolder/current_directory_subfolder_is_invalid_[.]
  831. 37.30 s [go-tests] === RUN TestNewSubfolder/current_directory_subfolder_with_slash_is_invalid_[./]
  832. 37.30 s [go-tests] === RUN TestNewSubfolder/leading_slash_is_invalid_[/imports]
  833. 37.30 s [go-tests] === RUN TestNewSubfolder/single_parent_directory_traversal_is_invalid_[../imports]
  834. 37.30 s [go-tests] === RUN TestNewSubfolder/leading_whitespace_before_traversal_is_invalid_[__../imports]
  835. 37.30 s [go-tests] === RUN TestNewSubfolder/nested_parent_directory_traversal_is_invalid_[../../imports]
  836. 37.30 s [go-tests] === RUN TestNewSubfolder/subfolder_parent_directory_traversal_is_invalid_[foo/../../imports]
  837. 37.30 s [go-tests] --- PASS: TestNewSubfolder (0.00s)
  838. 37.30 s [go-tests] --- PASS: TestNewSubfolder/subfolder_is_valid_[imports] (0.00s)
  839. 37.30 s [go-tests] --- PASS: TestNewSubfolder/nested_subfolder_is_valid_[media/uploads] (0.00s)
  840. 37.30 s [go-tests] --- PASS: TestNewSubfolder/surrounding_spaces_are_trimmed_[__media/uploads__] (0.00s)
  841. 37.30 s [go-tests] --- PASS: TestNewSubfolder/empty_subfolder_is_invalid_[] (0.00s)
  842. 37.30 s [go-tests] --- PASS: TestNewSubfolder/whitespace-only_subfolder_is_invalid_[___] (0.00s)
  843. 37.30 s [go-tests] --- PASS: TestNewSubfolder/current_directory_subfolder_is_invalid_[.] (0.00s)
  844. 37.30 s [go-tests] --- PASS: TestNewSubfolder/current_directory_subfolder_with_slash_is_invalid_[./] (0.00s)
  845. 37.30 s [go-tests] --- PASS: TestNewSubfolder/leading_slash_is_invalid_[/imports] (0.00s)
  846. 37.30 s [go-tests] --- PASS: TestNewSubfolder/single_parent_directory_traversal_is_invalid_[../imports] (0.00s)
  847. 37.30 s [go-tests] --- PASS: TestNewSubfolder/leading_whitespace_before_traversal_is_invalid_[__../imports] (0.00s)
  848. 37.30 s [go-tests] --- PASS: TestNewSubfolder/nested_parent_directory_traversal_is_invalid_[../../imports] (0.00s)
  849. 37.30 s [go-tests] --- PASS: TestNewSubfolder/subfolder_parent_directory_traversal_is_invalid_[foo/../../imports] (0.00s)
  850. 37.30 s [go-tests] === RUN TestSubfolderJoin
  851. 37.30 s [go-tests] === RUN TestSubfolderJoin/empty_prefix_returns_child
  852. 37.30 s [go-tests] === RUN TestSubfolderJoin/prefix_joins_with_child
  853. 37.30 s [go-tests] === RUN TestSubfolderJoin/nested_prefix_joins_with_child
  854. 37.30 s [go-tests] --- PASS: TestSubfolderJoin (0.00s)
  855. 37.30 s [go-tests] --- PASS: TestSubfolderJoin/empty_prefix_returns_child (0.00s)
  856. 37.30 s [go-tests] --- PASS: TestSubfolderJoin/prefix_joins_with_child (0.00s)
  857. 37.30 s [go-tests] --- PASS: TestSubfolderJoin/nested_prefix_joins_with_child (0.00s)
  858. 37.30 s [go-tests] === RUN TestSubfolderEmpty
  859. 37.30 s [go-tests] === RUN TestSubfolderEmpty/zero_value_is_empty
  860. 37.30 s [go-tests] === RUN TestSubfolderEmpty/non-empty_subfolder_is_not_empty
  861. 37.30 s [go-tests] --- PASS: TestSubfolderEmpty (0.00s)
  862. 37.30 s [go-tests] --- PASS: TestSubfolderEmpty/zero_value_is_empty (0.00s)
  863. 37.30 s [go-tests] --- PASS: TestSubfolderEmpty/non-empty_subfolder_is_not_empty (0.00s)
  864. 37.30 s [go-tests] === RUN TestNewContentType
  865. 37.30 s [go-tests] === RUN TestNewContentType/JPEG_content_type_is_valid_[image/jpeg]
  866. 37.30 s [go-tests] === RUN TestNewContentType/AVIF_content_type_is_valid_[image/avif]
  867. 37.30 s [go-tests] === RUN TestNewContentType/WebM_content_type_is_valid_[video/webm]
  868. 37.30 s [go-tests] === RUN TestNewContentType/surrounding_spaces_are_ignored_[__image/jpeg__]
  869. 37.30 s [go-tests] === RUN TestNewContentType/empty_content_type_is_invalid_[]
  870. 37.30 s [go-tests] === RUN TestNewContentType/PNG_content_type_is_invalid_[image/png]
  871. 37.30 s [go-tests] === RUN TestNewContentType/generic_binary_content_type_is_invalid_[application/octet-stream]
  872. 37.30 s [go-tests] === RUN TestNewContentType/JPEG_with_parameters_is_invalid_[image/jpeg;_charset=utf-8]
  873. 37.30 s [go-tests] --- PASS: TestNewContentType (0.00s)
  874. 37.30 s [go-tests] --- PASS: TestNewContentType/JPEG_content_type_is_valid_[image/jpeg] (0.00s)
  875. 37.30 s [go-tests] --- PASS: TestNewContentType/AVIF_content_type_is_valid_[image/avif] (0.00s)
  876. 37.30 s [go-tests] --- PASS: TestNewContentType/WebM_content_type_is_valid_[video/webm] (0.00s)
  877. 37.30 s [go-tests] --- PASS: TestNewContentType/surrounding_spaces_are_ignored_[__image/jpeg__] (0.00s)
  878. 37.30 s [go-tests] --- PASS: TestNewContentType/empty_content_type_is_invalid_[] (0.00s)
  879. 37.30 s [go-tests] --- PASS: TestNewContentType/PNG_content_type_is_invalid_[image/png] (0.00s)
  880. 37.30 s [go-tests] --- PASS: TestNewContentType/generic_binary_content_type_is_invalid_[application/octet-stream] (0.00s)
  881. 37.30 s [go-tests] --- PASS: TestNewContentType/JPEG_with_parameters_is_invalid_[image/jpeg;_charset=utf-8] (0.00s)
  882. 37.30 s [go-tests] === RUN TestNewMediaRootDir
  883. 37.30 s [go-tests] === RUN TestNewMediaRootDir/absolute_path_is_valid_[/srv/media]
  884. 37.30 s [go-tests] === RUN TestNewMediaRootDir/relative_path_is_valid_[data/media]
  885. 37.30 s [go-tests] === RUN TestNewMediaRootDir/surrounding_spaces_are_trimmed_[__data/media__]
  886. 37.30 s [go-tests] === RUN TestNewMediaRootDir/empty_path_is_invalid_[]
  887. 37.30 s [go-tests] === RUN TestNewMediaRootDir/whitespace-only_path_is_invalid_[___]
  888. 37.30 s [go-tests] --- PASS: TestNewMediaRootDir (0.00s)
  889. 37.30 s [go-tests] --- PASS: TestNewMediaRootDir/absolute_path_is_valid_[/srv/media] (0.00s)
  890. 37.30 s [go-tests] --- PASS: TestNewMediaRootDir/relative_path_is_valid_[data/media] (0.00s)
  891. 37.30 s [go-tests] --- PASS: TestNewMediaRootDir/surrounding_spaces_are_trimmed_[__data/media__] (0.00s)
  892. 37.30 s [go-tests] --- PASS: TestNewMediaRootDir/empty_path_is_invalid_[] (0.00s)
  893. 37.30 s [go-tests] --- PASS: TestNewMediaRootDir/whitespace-only_path_is_invalid_[___] (0.00s)
  894. 37.30 s [go-tests] === RUN TestMediaRootDirJoin
  895. 37.30 s [go-tests] === RUN TestMediaRootDirJoin/joins_filename_to_root
  896. 37.30 s [go-tests] === RUN TestMediaRootDirJoin/joins_nested_output_path_to_root
  897. 37.30 s [go-tests] --- PASS: TestMediaRootDirJoin (0.00s)
  898. 37.30 s [go-tests] --- PASS: TestMediaRootDirJoin/joins_filename_to_root (0.00s)
  899. 37.30 s [go-tests] --- PASS: TestMediaRootDirJoin/joins_nested_output_path_to_root (0.00s)
  900. 37.30 s [go-tests] PASS
  901. 37.30 s [go-tests] coverage: 79.3% of statements
  902. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/mediastore 1.060s coverage: 79.3% of statements
  903. 37.30 s [go-tests] codeberg.org/mtlynch/little-moments/random coverage: 0.0% of statements
  904. 37.30 s [go-tests] === RUN TestNewLimiterRejectsZeroLimits
  905. 37.30 s [go-tests] === RUN TestNewLimiterRejectsZeroLimits/rejects_zero_max_attempts_per_email
  906. 37.30 s [go-tests] === RUN TestNewLimiterRejectsZeroLimits/rejects_zero_max_attempts_per_IPv4
  907. 37.30 s [go-tests] --- PASS: TestNewLimiterRejectsZeroLimits (0.00s)
  908. 37.30 s [go-tests] --- PASS: TestNewLimiterRejectsZeroLimits/rejects_zero_max_attempts_per_email (0.00s)
  909. 37.30 s [go-tests] --- PASS: TestNewLimiterRejectsZeroLimits/rejects_zero_max_attempts_per_IPv4 (0.00s)
  910. 37.30 s [go-tests] === RUN TestLimiter
  911. 37.30 s [go-tests] === RUN TestLimiter/new_limiter_allows_first_attempt
  912. 37.30 s [go-tests] === RUN TestLimiter/allows_attempts_after_unrelated_login_volume
  913. 37.30 s [go-tests] === RUN TestLimiter/allows_the_max-th_attempt_for_the_same_email
  914. 37.30 s [go-tests] === RUN TestLimiter/blocks_attempts_after_the_email_limit_is_reached
  915. 37.30 s [go-tests] === RUN TestLimiter/allows_attempts_for_a_different_email
  916. 37.30 s [go-tests] === RUN TestLimiter/allows_two_attempts_from_the_same_IPv4_address
  917. 37.30 s [go-tests] === RUN TestLimiter/blocks_the_third_attempt_from_the_same_IPv4_address
  918. 37.30 s [go-tests] === RUN TestLimiter/allows_attempts_from_a_different_IPv4_address
  919. 37.30 s [go-tests] === RUN TestLimiter/does_not_apply_IPv4_limit_to_IPv6_addresses
  920. 37.30 s [go-tests] === RUN TestLimiter/treats_IPv4-mapped_addresses_as_the_same_IPv4_address
  921. 37.30 s [go-tests] === RUN TestLimiter/allows_attempts_after_the_window_expires
  922. 37.30 s [go-tests] --- PASS: TestLimiter (0.00s)
  923. 37.30 s [go-tests] --- PASS: TestLimiter/new_limiter_allows_first_attempt (0.00s)
  924. 37.30 s [go-tests] --- PASS: TestLimiter/allows_attempts_after_unrelated_login_volume (0.00s)
  925. 37.30 s [go-tests] --- PASS: TestLimiter/allows_the_max-th_attempt_for_the_same_email (0.00s)
  926. 37.30 s [go-tests] --- PASS: TestLimiter/blocks_attempts_after_the_email_limit_is_reached (0.00s)
  927. 37.30 s [go-tests] --- PASS: TestLimiter/allows_attempts_for_a_different_email (0.00s)
  928. 37.30 s [go-tests] --- PASS: TestLimiter/allows_two_attempts_from_the_same_IPv4_address (0.00s)
  929. 37.30 s [go-tests] --- PASS: TestLimiter/blocks_the_third_attempt_from_the_same_IPv4_address (0.00s)
  930. 37.30 s [go-tests] --- PASS: TestLimiter/allows_attempts_from_a_different_IPv4_address (0.00s)
  931. 37.30 s [go-tests] --- PASS: TestLimiter/does_not_apply_IPv4_limit_to_IPv6_addresses (0.00s)
  932. 37.30 s [go-tests] --- PASS: TestLimiter/treats_IPv4-mapped_addresses_as_the_same_IPv4_address (0.00s)
  933. 37.30 s [go-tests] --- PASS: TestLimiter/allows_attempts_after_the_window_expires (0.00s)
  934. 37.30 s [go-tests] PASS
  935. 37.30 s [go-tests] coverage: 100.0% of statements
  936. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/ratelimit 1.033s coverage: 100.0% of statements
  937. 37.30 s [go-tests] codeberg.org/mtlynch/little-moments/s3 coverage: 0.0% of statements
  938. 37.30 s [go-tests] === RUN TestReadEnv
  939. 37.30 s [go-tests] === RUN TestReadEnv/all_fields
  940. 37.30 s [go-tests] === RUN TestReadEnv/optional_fields_omitted
  941. 37.30 s [go-tests] === RUN TestReadEnv/values_are_trimmed
  942. 37.30 s [go-tests] === RUN TestReadEnv/required_field_omitted
  943. 37.30 s [go-tests] === RUN TestReadEnv/empty_subfolder_is_valid_because_subfolder_is_optional
  944. 37.30 s [go-tests] --- PASS: TestReadEnv (0.00s)
  945. 37.30 s [go-tests] --- PASS: TestReadEnv/all_fields (0.00s)
  946. 37.30 s [go-tests] --- PASS: TestReadEnv/optional_fields_omitted (0.00s)
  947. 37.30 s [go-tests] --- PASS: TestReadEnv/values_are_trimmed (0.00s)
  948. 37.30 s [go-tests] --- PASS: TestReadEnv/required_field_omitted (0.00s)
  949. 37.30 s [go-tests] --- PASS: TestReadEnv/empty_subfolder_is_valid_because_subfolder_is_optional (0.00s)
  950. 37.30 s [go-tests] === RUN TestReadServingBaseURL
  951. 37.30 s [go-tests] === RUN TestReadServingBaseURL/value_is_set
  952. 37.30 s [go-tests] === RUN TestReadServingBaseURL/value_is_trimmed
  953. 37.30 s [go-tests] === RUN TestReadServingBaseURL/required_field_omitted
  954. 37.30 s [go-tests] --- PASS: TestReadServingBaseURL (0.00s)
  955. 37.30 s [go-tests] --- PASS: TestReadServingBaseURL/value_is_set (0.00s)
  956. 37.30 s [go-tests] --- PASS: TestReadServingBaseURL/value_is_trimmed (0.00s)
  957. 37.30 s [go-tests] --- PASS: TestReadServingBaseURL/required_field_omitted (0.00s)
  958. 37.30 s [go-tests] === RUN TestMediaBaseURL
  959. 37.30 s [go-tests] === RUN TestMediaBaseURL/uses_serving_base_URL
  960. 37.30 s [go-tests] === RUN TestMediaBaseURL/uses_serving_base_URL_with_subfolder
  961. 37.30 s [go-tests] --- PASS: TestMediaBaseURL (0.00s)
  962. 37.30 s [go-tests] --- PASS: TestMediaBaseURL/uses_serving_base_URL (0.00s)
  963. 37.30 s [go-tests] --- PASS: TestMediaBaseURL/uses_serving_base_URL_with_subfolder (0.00s)
  964. 37.30 s [go-tests] PASS
  965. 37.30 s [go-tests] coverage: 84.4% of statements
  966. 37.30 s [go-tests] ok codeberg.org/mtlynch/little-moments/s3config 1.020s coverage: 84.4% of statements
  967. 37.30 s [go-tests] ? codeberg.org/mtlynch/little-moments/store [no test files]
  968. 37.30 s [go-tests] === RUN TestAuthSessionLifecycle
  969. 37.30 s [go-tests] 2026/08/03 16:40:45 reading DB from file:/TestAuthSessionLifecycle_0xc0001a6248?vfs=memdb
  970. 37.30 s [go-tests] --- PASS: TestAuthSessionLifecycle (6.94s)
  971. 37.30 s [go-tests] === RUN TestReadSessionReturnsNoSessionForExpiredSession
  972. 37.31 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestReadSessionReturnsNoSessionForExpiredSession_0xc002f37688?vfs=memdb
  973. 37.31 s [go-tests] --- PASS: TestReadSessionReturnsNoSessionForExpiredSession (0.00s)
  974. 37.31 s [go-tests] === RUN TestDeleteExpiredSessions
  975. 37.31 s [go-tests] === RUN TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expired_before_now
  976. 37.31 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expired_before_now_0xc002f37b08?vfs=memdb
  977. 37.31 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  978. 37.31 s [go-tests] === RUN TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expires_at_now
  979. 37.31 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expires_at_now_0xc002f37d48?vfs=memdb
  980. 37.31 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  981. 37.31 s [go-tests] === RUN TestDeleteExpiredSessions/cleanup_preserves_a_session_that_expires_after_now
  982. 37.31 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestDeleteExpiredSessions/cleanup_preserves_a_session_that_expires_after_now_0xc002f06008?vfs=memdb
  983. 37.31 s [go-tests] 2026/08/03 16:40:52 cleaning expired auth sessions from store
  984. 37.31 s [go-tests] --- PASS: TestDeleteExpiredSessions (0.01s)
  985. 37.31 s [go-tests] --- PASS: TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expired_before_now (0.00s)
  986. 37.31 s [go-tests] --- PASS: TestDeleteExpiredSessions/cleanup_deletes_a_session_that_expires_at_now (0.00s)
  987. 37.31 s [go-tests] --- PASS: TestDeleteExpiredSessions/cleanup_preserves_a_session_that_expires_after_now (0.00s)
  988. 37.31 s [go-tests] === RUN TestReadUserByEmail
  989. 37.31 s [go-tests] === RUN TestReadUserByEmail/returns_a_non-admin_user_with_all_fields
  990. 37.31 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestReadUserByEmail/returns_a_non-admin_user_with_all_fields_0xc002f06488?vfs=memdb
  991. 37.31 s [go-tests] === RUN TestReadUserByEmail/returns_an_admin_user
  992. 37.31 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestReadUserByEmail/returns_an_admin_user_0xc002f066c8?vfs=memdb
  993. 37.31 s [go-tests] === RUN TestReadUserByEmail/returns_ErrUserNotFound_for_unknown_email
  994. 37.31 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestReadUserByEmail/returns_ErrUserNotFound_for_unknown_email_0xc002f06908?vfs=memdb
  995. 37.31 s [go-tests] --- PASS: TestReadUserByEmail (0.01s)
  996. 37.31 s [go-tests] --- PASS: TestReadUserByEmail/returns_a_non-admin_user_with_all_fields (0.00s)
  997. 37.31 s [go-tests] --- PASS: TestReadUserByEmail/returns_an_admin_user (0.00s)
  998. 37.31 s [go-tests] --- PASS: TestReadUserByEmail/returns_ErrUserNotFound_for_unknown_email (0.00s)
  999. 37.31 s [go-tests] === RUN TestInsertDuplicateUserFails
  1000. 37.31 s [go-tests] 2026/08/03 16:40:52 reading DB from file:/TestInsertDuplicateUserFails_0xc002f06b48?vfs=memdb
  1001. 37.31 s [go-tests] --- PASS: TestInsertDuplicateUserFails (0.00s)
  1002. 37.31 s [go-tests] PASS
  1003. 37.31 s [go-tests] coverage: 23.9% of statements
  1004. 37.31 s [go-tests] ok codeberg.org/mtlynch/little-moments/store/sqlite 8.006s coverage: 23.9% of statements
  1005. 37.31 s [go-tests] codeberg.org/mtlynch/little-moments/store/test_sqlite coverage: 0.0% of statements
  1006. 37.31 s [go-tests] === RUN TestNewProcessableImageRejectsPixelOverflowDimensions
  1007. 37.31 s [go-tests] --- PASS: TestNewProcessableImageRejectsPixelOverflowDimensions (0.00s)
  1008. 37.31 s [go-tests] === RUN TestNewProcessableImageAcceptsSmallImage
  1009. 37.31 s [go-tests] --- PASS: TestNewProcessableImageAcceptsSmallImage (0.00s)
  1010. 37.31 s [go-tests] === RUN TestNewProcessableImageRejectsUnreadableGIF
  1011. 37.31 s [go-tests] --- PASS: TestNewProcessableImageRejectsUnreadableGIF (0.00s)
  1012. 37.31 s [go-tests] === RUN TestNewProcessableImageRejectsPixelOverflowGIFDimensions
  1013. 37.31 s [go-tests] --- PASS: TestNewProcessableImageRejectsPixelOverflowGIFDimensions (0.00s)
  1014. 37.31 s [go-tests] === RUN TestNewProcessableImageAcceptsSmallGIF
  1015. 37.31 s [go-tests] --- PASS: TestNewProcessableImageAcceptsSmallGIF (0.00s)
  1016. 37.31 s [go-tests] === RUN TestNewProcessableVideo
  1017. 37.31 s [go-tests] === RUN TestNewProcessableVideo/duration_over_limit_is_invalid
  1018. 37.31 s [go-tests] === RUN TestNewProcessableVideo/zero_duration_is_invalid
  1019. 37.31 s [go-tests] === RUN TestNewProcessableVideo/duration_at_limit_is_valid
  1020. 37.31 s [go-tests] === RUN TestNewProcessableVideo/unreadable_video_is_invalid
  1021. 37.31 s [go-tests] --- PASS: TestNewProcessableVideo (0.00s)
  1022. 37.31 s [go-tests] --- PASS: TestNewProcessableVideo/duration_over_limit_is_invalid (0.00s)
  1023. 37.31 s [go-tests] --- PASS: TestNewProcessableVideo/zero_duration_is_invalid (0.00s)
  1024. 37.31 s [go-tests] --- PASS: TestNewProcessableVideo/duration_at_limit_is_valid (0.00s)
  1025. 37.31 s [go-tests] --- PASS: TestNewProcessableVideo/unreadable_video_is_invalid (0.00s)
  1026. 37.31 s [go-tests] === RUN TestNewProcessableVideoDerivesDurationFromPath
  1027. 37.31 s [go-tests] --- PASS: TestNewProcessableVideoDerivesDurationFromPath (0.00s)
  1028. 37.31 s [go-tests] === RUN TestNewProcessableVideoStoresUploadPathAndDuration
  1029. 37.31 s [go-tests] --- PASS: TestNewProcessableVideoStoresUploadPathAndDuration (0.00s)
  1030. 37.31 s [go-tests] PASS
  1031. 37.31 s [go-tests] coverage: 33.3% of statements
  1032. 37.31 s [go-tests] ok codeberg.org/mtlynch/little-moments/uploads 1.020s coverage: 33.3% of statements
  1033. 37.37 s [go-tests] + [[ -n 1 ]]
  1034. 37.37 s [go-tests] + go tool cover -html .coverage.out -o .coverage.html
  1035. 37.50 s [go-tests] + go vet ./...
  1036. 45.56 s [go-tests] + go_package_dirs=()
  1037. 45.62 s [go-tests] + IFS=
  1038. 45.62 s [go-tests] + read -r go_package_dir
  1039. 45.62 s [go-tests] ++ go list -f '{{.Dir}}' ./...
  1040. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1041. 45.64 s [go-tests] + IFS=
  1042. 45.64 s [go-tests] + read -r go_package_dir
  1043. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1044. 45.64 s [go-tests] + IFS=
  1045. 45.64 s [go-tests] + read -r go_package_dir
  1046. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1047. 45.64 s [go-tests] + IFS=
  1048. 45.64 s [go-tests] + read -r go_package_dir
  1049. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1050. 45.64 s [go-tests] + IFS=
  1051. 45.64 s [go-tests] + read -r go_package_dir
  1052. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1053. 45.64 s [go-tests] + IFS=
  1054. 45.64 s [go-tests] + read -r go_package_dir
  1055. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1056. 45.64 s [go-tests] + IFS=
  1057. 45.64 s [go-tests] + read -r go_package_dir
  1058. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1059. 45.64 s [go-tests] + IFS=
  1060. 45.64 s [go-tests] + read -r go_package_dir
  1061. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1062. 45.64 s [go-tests] + IFS=
  1063. 45.64 s [go-tests] + read -r go_package_dir
  1064. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1065. 45.64 s [go-tests] + IFS=
  1066. 45.64 s [go-tests] + read -r go_package_dir
  1067. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1068. 45.64 s [go-tests] + IFS=
  1069. 45.64 s [go-tests] + read -r go_package_dir
  1070. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1071. 45.64 s [go-tests] + IFS=
  1072. 45.64 s [go-tests] + read -r go_package_dir
  1073. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1074. 45.64 s [go-tests] + IFS=
  1075. 45.64 s [go-tests] + read -r go_package_dir
  1076. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1077. 45.64 s [go-tests] + IFS=
  1078. 45.64 s [go-tests] + read -r go_package_dir
  1079. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1080. 45.64 s [go-tests] + IFS=
  1081. 45.64 s [go-tests] + read -r go_package_dir
  1082. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1083. 45.64 s [go-tests] + IFS=
  1084. 45.64 s [go-tests] + read -r go_package_dir
  1085. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1086. 45.64 s [go-tests] + IFS=
  1087. 45.64 s [go-tests] + read -r go_package_dir
  1088. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1089. 45.64 s [go-tests] + IFS=
  1090. 45.64 s [go-tests] + read -r go_package_dir
  1091. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1092. 45.64 s [go-tests] + IFS=
  1093. 45.64 s [go-tests] + read -r go_package_dir
  1094. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1095. 45.64 s [go-tests] + IFS=
  1096. 45.64 s [go-tests] + read -r go_package_dir
  1097. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1098. 45.64 s [go-tests] + IFS=
  1099. 45.64 s [go-tests] + read -r go_package_dir
  1100. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1101. 45.64 s [go-tests] + IFS=
  1102. 45.64 s [go-tests] + read -r go_package_dir
  1103. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1104. 45.64 s [go-tests] + IFS=
  1105. 45.64 s [go-tests] + read -r go_package_dir
  1106. 45.64 s [go-tests] + go_package_dirs+=("${go_package_dir}")
  1107. 45.64 s [go-tests] + IFS=
  1108. 45.64 s [go-tests] + read -r go_package_dir
  1109. 45.64 s [go-tests] + readonly go_package_dirs
  1110. 45.64 s [go-tests] ++ go env GOBIN
  1111. 45.65 s [go-tests] + GCI_PATH=/build/home/go/bin/gci
  1112. 45.65 s [go-tests] + readonly GCI_PATH
  1113. 45.65 s [go-tests] + readonly GCI_VERSION=v0.14.0
  1114. 45.65 s [go-tests] + GCI_VERSION=v0.14.0
  1115. 45.65 s [go-tests] + [[ -f /build/home/go/bin/gci ]]
  1116. 45.65 s [go-tests] ++ /build/home/go/bin/gci --version
  1117. 45.65 s [go-tests] + gci_version_output='gci version 0.14.0'
  1118. 45.65 s [go-tests] + [[ gci version 0.14.0 != gci version 0\.14\.0 ]]
  1119. 45.65 s [go-tests] + gci_sections=("--section=standard" "--section=default" "--section=localmodule")
  1120. 45.65 s [go-tests] + readonly gci_sections
  1121. 45.65 s [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
  1122. 45.69 s [go-tests] + gci_output=
  1123. 45.69 s [go-tests] + [[ -n '' ]]
  1124. 45.69 s [go-tests] ++ go env GOBIN
  1125. 45.69 s [go-tests] + GOCRITIC_PATH=/build/home/go/bin/go-critic
  1126. 45.69 s [go-tests] + readonly GOCRITIC_PATH
  1127. 45.69 s [go-tests] + readonly GOCRITIC_VERSION=v0.14.3
  1128. 45.69 s [go-tests] + GOCRITIC_VERSION=v0.14.3
  1129. 45.69 s [go-tests] + [[ ! -f /build/home/go/bin/go-critic ]]
  1130. 45.69 s [go-tests] + /build/home/go/bin/go-critic check ./...
  1131. 46.83 s [go-tests] + /build/home/go/bin/go-critic check -enable=returnAfterHttpError ./...
  1132. 47.35 s [go-tests] ++ go env GOBIN
  1133. 47.35 s [go-tests] + STATICCHECK_PATH=/build/home/go/bin/staticcheck
  1134. 47.35 s [go-tests] + readonly STATICCHECK_PATH
  1135. 47.35 s [go-tests] + readonly STATICCHECK_VERSION=v0.6.1
  1136. 47.35 s [go-tests] + STATICCHECK_VERSION=v0.6.1
  1137. 47.35 s [go-tests] + [[ ! -f /build/home/go/bin/staticcheck ]]
  1138. 47.35 s [go-tests] + /build/home/go/bin/staticcheck ./...
  1139. 50.95 s [go-tests] ++ go env GOBIN
  1140. 50.99 s [go-tests] + ERRCHECK_PATH=/build/home/go/bin/errcheck
  1141. 50.99 s [go-tests] + readonly ERRCHECK_PATH
  1142. 50.99 s [go-tests] + readonly ERRCHECK_VERSION=v1.10.0
  1143. 51.00 s [go-tests] + ERRCHECK_VERSION=v1.10.0
  1144. 51.00 s [go-tests] + [[ ! -f /build/home/go/bin/errcheck ]]
  1145. 51.00 s [go-tests] + /build/home/go/bin/errcheck -ignoretests ./...
  1146. 51.13 s [go-tests] buildPhase completed in 48 seconds
  1147. 51.13 s [go-tests] Phase: installPhase
  1148. 51.14 s [go-tests] Phase: fixupPhase
  1149. 51.15 s [go-tests] shrinking RPATHs of ELF executables and libraries in /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0
  1150. 51.15 s [go-tests] checking for references to /build/ in /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0...
  1151. 51.17 s [go-tests] patching script interpreter paths in /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0
  1152. 51.42 s [go-tests:post-build] Uploading to the NixCI cache: /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0
  1153. 51.46 s [go-tests:post-build] warning: 'warn-short-path-literals' is deprecated, use 'lint-short-path-literals = ignore' instead
  1154. 51.47 s [go-tests:post-build] copying 1 paths...
  1155. 51.47 s [go-tests:post-build] copying path '/nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0' to 'https://cache.nix-ci.com'...
  1156. 51.65 s [go-tests:post-build] warning: 'warn-short-path-literals' is deprecated, use 'lint-short-path-literals = ignore' instead
  1157. 51.90 s [go-tests:post-build] copying 1 paths...
  1158. 51.90 s [go-tests:post-build] copying path '/nix/store/1qpcqixxlfqbx557ivj200llnbnaz2ah-go-tests-0.0.0.drv' to 'https://cache.nix-ci.com'...
  1159. 52.12 s Uploaded go-tests in 710ms
  1160. 52.12 s Progress: 1 of 2 built
  1161. 52.12 s Built go-tests in 49.5s
  1162. 52.12 s Progress: 2 of 2 built
  1163. 52.12 s /nix/store/bsg06i7v3q0v8fs15mzd9lq4032g3406-go-tests-0.0.0
  1164. 52.17 s Build succeeded.