build packages.x86_64-linux.go-tests

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