Building test containers...
podman compose --profile tests build
[4m>>>> Executing external compose provider "/usr/bin/podman-compose". Please see podman-compose(1) for how to disable this message. <<<<

[0m[1/2] STEP 1/15: FROM golang:1.25-alpine AS builder
[1/3] STEP 1/15: FROM golang:1.25-alpine AS builder
[1/2] STEP 2/15: WORKDIR /app
[1/3] STEP 2/15: WORKDIR /app
--> Using cache 0808b2875456ca99b7a8f5a6cad4e081b60104568bdd05f992cade2aa079e7a8
--> 0808b2875456
--> Using cache 0808b2875456ca99b7a8f5a6cad4e081b60104568bdd05f992cade2aa079e7a8
--> 0808b2875456
[1/2] STEP 3/15: RUN apk add --no-cache nodejs npm curl
[1/3] STEP 3/15: RUN apk add --no-cache nodejs npm curl
--> Using cache eb561d60d14bf9cbadd568a0bc38f7385f4d247a5c5f5944678f62274c1bf699
--> eb561d60d14b
--> Using cache eb561d60d14bf9cbadd568a0bc38f7385f4d247a5c5f5944678f62274c1bf699
--> eb561d60d14b
[1/2] STEP 4/15: RUN go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest
[1/3] STEP 4/15: RUN go install github.com/sqlc-dev/sqlc/cmd/sqlc@latest
--> Using cache af8c96bd5a986ef93027119dc0adc1981a6eecf1454df089386579f90a907e7b
--> af8c96bd5a98
--> Using cache af8c96bd5a986ef93027119dc0adc1981a6eecf1454df089386579f90a907e7b
--> af8c96bd5a98
[1/2] STEP 5/15: RUN go install github.com/a-h/templ/cmd/templ@latest
[1/3] STEP 5/15: RUN go install github.com/a-h/templ/cmd/templ@latest
--> Using cache 92f52680222cf9474514079a50410702a2b85ef2f6d0ea5a43e41c8b2355be0d
--> 92f52680222c
--> Using cache 92f52680222cf9474514079a50410702a2b85ef2f6d0ea5a43e41c8b2355be0d
--> 92f52680222c
[1/2] STEP 6/15: COPY package*.json ./
[1/3] STEP 6/15: COPY package*.json ./
--> Using cache c1ac6e2d32bff67b34f42497038f789ab2b937c34871f0e37e49738786636d3f
--> c1ac6e2d32bf
[1/2] STEP 7/15: RUN npm install
--> Using cache c1ac6e2d32bff67b34f42497038f789ab2b937c34871f0e37e49738786636d3f
--> c1ac6e2d32bf
[1/3] STEP 7/15: RUN npm install
--> Using cache b61c1bf0531a5bff95a37f402d121aff95e589972a88c9285d61d99bb7578042
--> b61c1bf0531a
[1/2] STEP 8/15: COPY . .
--> Using cache b61c1bf0531a5bff95a37f402d121aff95e589972a88c9285d61d99bb7578042
--> b61c1bf0531a
[1/3] STEP 8/15: COPY . .
--> 5ad7c6b029ce
--> dd5f96ac6156
[1/2] STEP 9/15: RUN go mod tidy
[1/3] STEP 9/15: RUN go mod tidy
go: downloading github.com/jackc/pgx/v5 v5.4.3
go: downloading github.com/golang-jwt/jwt/v5 v5.3.0
go: downloading github.com/labstack/echo/v4 v4.13.4
go: downloading github.com/google/uuid v1.4.0
go: downloading github.com/gorilla/websocket v1.5.3
go: downloading golang.org/x/crypto v0.46.0
go: downloading github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
go: downloading github.com/stretchr/testify v1.11.1
go: downloading github.com/yuin/goldmark v1.7.16
go: downloading github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594
go: downloading github.com/labstack/echo/v4 v4.13.4
go: downloading github.com/google/uuid v1.4.0
go: downloading github.com/stretchr/testify v1.11.1
go: downloading github.com/jackc/pgx/v5 v5.4.3
go: downloading github.com/go-playground/validator/v10 v10.30.1
go: downloading github.com/golang-jwt/jwt/v5 v5.3.0
go: downloading github.com/gorilla/websocket v1.5.3
go: downloading github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
go: downloading golang.org/x/crypto v0.46.0
go: downloading golang.org/x/text v0.33.0
go: downloading github.com/yuin/goldmark v1.7.16
go: downloading golang.org/x/text v0.33.0
go: downloading github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594
go: downloading github.com/ArcadiaLin/go-epub v0.1.1
go: downloading github.com/bodgit/sevenzip v1.6.1
go: downloading github.com/fsnotify/fsnotify v1.9.0
go: downloading github.com/labstack/echo-jwt/v4 v4.4.0
go: downloading github.com/ArcadiaLin/go-epub v0.1.1
go: downloading github.com/bodgit/sevenzip v1.6.1
go: downloading github.com/nwaples/rardecode v1.1.3
go: downloading github.com/fsnotify/fsnotify v1.9.0
go: downloading github.com/nwaples/rardecode v1.1.3
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/labstack/gommon v0.4.2
go: downloading golang.org/x/net v0.47.0
go: downloading github.com/valyala/fasttemplate v1.2.2
go: downloading golang.org/x/time v0.14.0
go: downloading github.com/go-playground/validator/v10 v10.30.1
go: downloading github.com/jackc/puddle/v2 v2.2.1
go: downloading github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a
go: downloading github.com/gabriel-vasile/mimetype v1.4.12
go: downloading github.com/go-playground/universal-translator v0.18.1
go: downloading github.com/leodido/go-urn v1.4.0
go: downloading github.com/labstack/echo-jwt/v4 v4.4.0
go: downloading github.com/go-playground/locales v0.14.1
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/labstack/gommon v0.4.2
go: downloading golang.org/x/net v0.47.0
go: downloading golang.org/x/sys v0.39.0
go: downloading golang.org/x/sys v0.39.0
go: downloading github.com/gabriel-vasile/mimetype v1.4.12
go: downloading github.com/go-playground/universal-translator v0.18.1
go: downloading github.com/mattn/go-colorable v0.1.14
go: downloading github.com/valyala/bytebufferpool v1.0.0
go: downloading github.com/leodido/go-urn v1.4.0
go: downloading github.com/bodgit/plumbing v1.3.0
go: downloading github.com/bodgit/windows v1.0.1
go: downloading github.com/spf13/afero v1.11.0
go: downloading go4.org v0.0.0-20200411211856-f5505b9728dd
go: downloading golang.org/x/sync v0.19.0
go: downloading github.com/go-playground/locales v0.14.1
go: downloading github.com/valyala/fasttemplate v1.2.2
go: downloading github.com/hashicorp/golang-lru/v2 v2.0.7
go: downloading github.com/andybalholm/brotli v1.1.1
go: downloading golang.org/x/time v0.14.0
go: downloading github.com/alecthomas/chroma v0.10.0
go: downloading github.com/klauspost/compress v1.17.11
go: downloading github.com/pierrec/lz4/v4 v4.1.22
go: downloading github.com/ulikunitz/xz v0.5.12
go: downloading github.com/alecthomas/chroma v0.10.0
go: downloading github.com/mattn/go-colorable v0.1.14
go: downloading github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a
go: downloading github.com/bodgit/plumbing v1.3.0
go: downloading github.com/jackc/puddle/v2 v2.2.1
go: downloading github.com/bodgit/windows v1.0.1
go: downloading github.com/spf13/afero v1.11.0
go: downloading go4.org v0.0.0-20200411211856-f5505b9728dd
go: downloading golang.org/x/sync v0.19.0
go: downloading github.com/valyala/bytebufferpool v1.0.0
go: downloading github.com/hashicorp/golang-lru/v2 v2.0.7
go: downloading github.com/andybalholm/brotli v1.1.1
go: downloading github.com/klauspost/compress v1.17.11
go: downloading github.com/ulikunitz/xz v0.5.12
go: downloading github.com/pierrec/lz4/v4 v4.1.22
go: downloading github.com/dlclark/regexp2 v1.4.0
go: downloading github.com/dlclark/regexp2 v1.4.0
go: downloading github.com/google/go-cmp v0.6.0
go: downloading github.com/go-playground/assert/v2 v2.2.0
go: downloading gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
go: downloading github.com/stretchr/objx v0.5.2
go: downloading github.com/xyproto/randomstring v1.0.5
go: downloading github.com/kr/pretty v0.3.0
go: downloading github.com/google/go-cmp v0.6.0
go: downloading github.com/go-playground/assert/v2 v2.2.0
go: downloading gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c
go: downloading github.com/stretchr/objx v0.5.2
go: downloading github.com/xyproto/randomstring v1.0.5
go: downloading github.com/rogpeppe/go-internal v1.14.1
go: downloading github.com/kr/text v0.2.0
go: downloading github.com/kr/pretty v0.3.0
go: downloading github.com/rogpeppe/go-internal v1.14.1
go: downloading github.com/kr/text v0.2.0
--> 28420f7452ef
[1/3] STEP 10/15: RUN cd internal/database && sqlc generate
--> 6514ab89da2c
--> 90376cb5bb57
[1/3] STEP 11/15: RUN cd templates && templ generate
[1/2] STEP 10/15: RUN cd internal/database && sqlc generate
(✓) Complete [ updates=0 duration=30.014983ms ]
--> 2a326d868f4a
[1/3] STEP 12/15: RUN npm run build:css:prod

> bookhoard@1.0.0 build:css:prod
> tailwindcss -i ./web/static/input.css -o ./web/static/style.css --minify

Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme

Rebuilding...
--> 65f6a4e5222b
[1/2] STEP 11/15: RUN cd templates && templ generate
(✓) Complete [ updates=0 duration=28.343633ms ]
--> d55c3d86391e
[1/2] STEP 12/15: RUN npm run build:css:prod

Done in 713ms.

> bookhoard@1.0.0 build:css:prod
> tailwindcss -i ./web/static/input.css -o ./web/static/style.css --minify

--> 07a9c2bba1ba
[1/3] STEP 13/15: RUN npm run postinstall

> bookhoard@1.0.0 postinstall
> mkdir -p web/static && curl -L https://unpkg.com/htmx.org@1.9.10/dist/htmx.min.js -o web/static/htmx.min.js && curl -L https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js -o web/static/highlight.min.js && curl -L https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css -o web/static/highlight-dark.min.css && curl -L https://cdn.jsdelivr.net/npm/lunr@2.3.9/lunr.min.js -o web/static/lunr.min.js && curl -L https://cdn.jsdelivr.net/npm/lunr-flex@1.0.5/lunr.flex.min.js -o web/static/lunr-flex.min.js

Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
Rebuilding...

 44 47755  44 21381   0     0 123300     0  --:--:-- --:--:-- --:--:-- 122879
100 47755 100 47755   0     0 273598     0  --:--:-- --:--:-- --:--:-- 272885
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
100 121727   0 121727   0     0 527625     0  --:--:-- --:--:-- --:--:-- 529247
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
100  1315   0  1315   0     0  4681     0  --:--:-- --:--:-- --:--:--  4696
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
Done in 670ms.

100 29510   0 29510   0     0 179521     0  --:--:-- --:--:-- --:--:-- 179939
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0--> eb8cdc07fc41
[1/2] STEP 13/15: RUN npm run postinstall

> bookhoard@1.0.0 postinstall
> mkdir -p web/static && curl -L https://unpkg.com/htmx.org@1.9.10/dist/htmx.min.js -o web/static/htmx.min.js && curl -L https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js -o web/static/highlight.min.js && curl -L https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css -o web/static/highlight-dark.min.css && curl -L https://cdn.jsdelivr.net/npm/lunr@2.3.9/lunr.min.js -o web/static/lunr.min.js && curl -L https://cdn.jsdelivr.net/npm/lunr-flex@1.0.5/lunr.flex.min.js -o web/static/lunr-flex.min.js

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
100    43   0    43   0     0    84     0  --:--:-- --:--:-- --:--:--    84

100 47755 100 47755   0     0 300991     0  --:--:-- --:--:-- --:--:-- 302246
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
100 121727   0 121727   0     0  1414k     0  --:--:-- --:--:-- --:--:--  1432k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0--> e6c4f9e2c47c

100  1315   0  1315   0     0 19684     0  --:--:-- --:--:-- --:--:-- 19924
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Uplo[1/3] STEP 14/15: RUN npm run build:ts
ad   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
100 29510   0 29510   0     0 283379     0  --:--:-- --:--:-- --:--:-- 286504
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0   0     0   0     0     0     0  --:--:-- --:--:-- --:--:--     0
> bookhoard@1.0.0 build:ts
> tsc


100    43   0    43   0     0   235     0  --:--:-- --:--:-- --:--:--   236
--> 5cb5267bd0c4
[1/2] STEP 14/15: RUN npm run build:ts

> bookhoard@1.0.0 build:ts
> tsc

--> fcd3bd84f759
[1/3] STEP 15/15: RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./cmd/server
--> 259f93e65704
[1/2] STEP 15/15: RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main ./cmd/server
--> d646a7816646
[3/3] STEP 1/11: FROM alpine:latest
[3/3] STEP 2/11: RUN apk --no-cache add ca-certificates curl
--> Using cache 24f434a4d4b2f86022c7c8601a1c29a1cb847c3474f464de20f96e33a955458a
--> 24f434a4d4b2
[3/3] STEP 3/11: RUN wget -O /usr/bin/kepubify https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-64bit     && chmod +x /usr/bin/kepubify
--> Using cache 89b60cb168ecb44333d5e10e232a5f6c4b8d67e4e6440321834c1ad3670bdf16
--> 89b60cb168ec
[3/3] STEP 4/11: WORKDIR /root/
--> cffd529c8575
[2/2] STEP 1/9: FROM golang:1.25-alpine AS test-runner
--> Using cache 868afc2e0de720355d7ba7c5a09cdce664820eb2d65d3771590241e41b6f328e
--> 868afc2e0de7
[3/3] STEP 5/11: COPY --from=builder /app/main .
--> Using cache 1f5b8665077cb5ae5a9b4125b022799b0974874119fe68ecd6a42bebe3d25be7
--> 1f5b8665077c
[3/3] STEP 6/11: COPY --from=builder /app/database/schema ./database/schema
--> Using cache 5c4d70b0e5efafffe1f7d405c0add1e7a5941f4a73f9cf138e0fadb7f23d631c
--> 5c4d70b0e5ef
[3/3] STEP 7/11: COPY --from=builder /app/templates ./templates
--> Using cache 3e20abb997265eec8842ed058ed1ea98d8fab984c8cfe21e9c8c1f2f7ac48bf4
--> 3e20abb99726
[3/3] STEP 8/11: COPY --from=builder /app/web ./web
--> Using cache 0c6cc3ef432b808134110dcc88aaaf8028c58f87d90589feb64b64fdce4a6001
--> 0c6cc3ef432b
[3/3] STEP 9/11: COPY --from=builder /app/docs ./docs
[2/2] STEP 2/9: RUN apk --no-cache add ca-certificates curl
--> Using cache 6eb0ced3e2522d1cfd8471f241b417c8471160a7b4bf050f9f43382196ed0af3
--> 6eb0ced3e252
[2/2] STEP 3/9: WORKDIR /app
--> Using cache 0649cbac642ebe3d774c709a99552fce1677f49223e5f477fa5871980ba91610
--> 0649cbac642e
[2/2] STEP 4/9: COPY --from=builder /app ./
--> Using cache 3e18f85140d8c979a17f4f3c68387846fc17453fde1d0f85e85484db53e9abee
--> 3e18f85140d8
[3/3] STEP 10/11: EXPOSE 8765
--> Using cache 05041d3ba57c72298f48007a0692677bf558d1eaae156ce570c9f4341295fba9
--> 05041d3ba57c
[3/3] STEP 11/11: CMD ["./main"]
--> Using cache 9b1fd614513a56e78c7b57bb322f85ca405d95a3e30c1dd95e0197d0b93735a0
[3/3] COMMIT bookhoard_app
--> 9b1fd614513a
Successfully tagged localhost/bookhoard_app:latest
9b1fd614513a56e78c7b57bb322f85ca405d95a3e30c1dd95e0197d0b93735a0
--> 2f1418b716f9
[2/2] STEP 5/9: RUN wget -O /usr/bin/kepubify https://github.com/pgaskin/kepubify/releases/latest/download/kepubify-linux-64bit     && chmod +x /usr/bin/kepubify
Connecting to github.com (140.82.112.3:443)
Connecting to github.com (140.82.112.3:443)
Connecting to release-assets.githubusercontent.com (185.199.111.133:443)
saving to '/usr/bin/kepubify'
kepubify             100% |********************************| 3492k  0:00:00 ETA
'/usr/bin/kepubify' saved
--> ef6c877a5a21
[2/2] STEP 6/9: ENV TEST_MODE=true
--> 9e1d5c94c2c1
[2/2] STEP 7/9: ENV RATE_LIMIT_ENABLED=false
--> 841a79a50b90
[2/2] STEP 8/9: ENV REQUESTS_PER_MINUTE=1000
--> d1628aadea4d
[2/2] STEP 9/9: CMD ["go", "test", "./cmd/server/tests", "-v", "-timeout", "5m"]
[2/2] COMMIT bookhoard_tests
--> 5bbfb3146dd9
Successfully tagged localhost/bookhoard_tests:latest
5bbfb3146dd9451c728e47e5fdaa620419ad2a42605d9afe30ba775b3a19c98d
Starting application containers...
podman compose up -d db app
[4m>>>> Executing external compose provider "/usr/bin/podman-compose". Please see podman-compose(1) for how to disable this message. <<<<

[0mbookhoard
bookhoard_db
bookhoard
bookhoard_db
d5a5d804ef3909d3927ec4932b750079cac6e6c2d0d130064d5015835aa1a803
bookhoard_default
4a722ee35bf8e3d1740d7e5d7fa32e578e87b75422d3a016ed5c3a363012a917
c0c5e8ddeb9a62c5a0799de1910ef9fce13433ce0d00c438add55d37d9bc1e27
fd69d5102cbc276a972130623803f95cdea1e9dd349c42f1f7c3d3c942445cee
bookhoard_db
bookhoard
Waiting for services to be healthy...
  ✓ Database is ready
  ✓ Application is ready

Running integration tests in container...
podman compose --profile tests run --rm tests
[4m>>>> Executing external compose provider "/usr/bin/podman-compose". Please see podman-compose(1) for how to disable this message. <<<<

[0mbookhoard_db
bookhoard
bookhoard
bookhoard_db
fdc3cad6e696cb3a20aff96bca162e541cedd79f7322780c729881ecc3b4cbcd
af93ff4ab4d8eaeaace779b86fd494a2ae5fc9354daded5e1b908560e68c219d
bookhoard_db
bookhoard
time="2026-02-10T11:47:37-05:00" level=warning msg="The input device is not a TTY. The --tty and --interactive flags might not work properly"
go: downloading github.com/labstack/echo/v4 v4.13.4
go: downloading github.com/jackc/pgx/v5 v5.4.3
go: downloading github.com/google/uuid v1.4.0
go: downloading github.com/go-playground/validator/v10 v10.30.1
go: downloading github.com/stretchr/testify v1.11.1
go: downloading github.com/gorilla/websocket v1.5.3
go: downloading github.com/ArcadiaLin/go-epub v0.1.1
go: downloading github.com/bodgit/sevenzip v1.6.1
go: downloading github.com/fsnotify/fsnotify v1.9.0
go: downloading github.com/nwaples/rardecode v1.1.3
go: downloading github.com/golang-jwt/jwt/v5 v5.3.0
go: downloading github.com/labstack/echo-jwt/v4 v4.4.0
go: downloading github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
go: downloading golang.org/x/crypto v0.46.0
go: downloading golang.org/x/text v0.33.0
go: downloading github.com/yuin/goldmark v1.7.16
go: downloading github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594
go: downloading github.com/a-h/templ v0.3.977
go: downloading golang.org/x/sys v0.39.0
go: downloading github.com/davecgh/go-spew v1.1.1
go: downloading github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/labstack/gommon v0.4.2
go: downloading golang.org/x/net v0.47.0
go: downloading github.com/valyala/fasttemplate v1.2.2
go: downloading golang.org/x/time v0.14.0
go: downloading github.com/bodgit/plumbing v1.3.0
go: downloading github.com/gabriel-vasile/mimetype v1.4.12
go: downloading github.com/go-playground/universal-translator v0.18.1
go: downloading github.com/leodido/go-urn v1.4.0
go: downloading github.com/bodgit/windows v1.0.1
go: downloading github.com/spf13/afero v1.11.0
go: downloading go4.org v0.0.0-20200411211856-f5505b9728dd
go: downloading github.com/jackc/puddle/v2 v2.2.1
go: downloading github.com/jackc/pgpassfile v1.0.0
go: downloading github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a
go: downloading gopkg.in/yaml.v3 v3.0.1
go: downloading github.com/alecthomas/chroma v0.10.0
go: downloading github.com/mattn/go-colorable v0.1.14
go: downloading github.com/mattn/go-isatty v0.0.20
go: downloading github.com/hashicorp/golang-lru/v2 v2.0.7
go: downloading github.com/andybalholm/brotli v1.1.1
go: downloading github.com/klauspost/compress v1.17.11
go: downloading github.com/pierrec/lz4/v4 v4.1.22
go: downloading github.com/ulikunitz/xz v0.5.12
go: downloading github.com/valyala/bytebufferpool v1.0.0
go: downloading github.com/go-playground/locales v0.14.1
go: downloading golang.org/x/sync v0.19.0
go: downloading github.com/dlclark/regexp2 v1.4.0
=== RUN   TestAnalyticsReadingStats
=== RUN   TestAnalyticsReadingStats/GetReadingStats_WithoutAuth
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 [REQUEST] {"request_id":"4fabb6e9-5a70-4d50-a3ca-7e057b75524b","timestamp":"2026-02-10T16:47:50.555779989Z","method":"GET","path":"/api/analytics/reading-stats","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":36418,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:50.556798488Z","id":"4fabb6e9-5a70-4d50-a3ca-7e057b75524b","remote_ip":"127.0.0.1","host":"127.0.0.1:36963","method":"GET","uri":"/api/analytics/reading-stats","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":1017497,"latency_human":"1.017497ms","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:50.556807976Z","id":"4fabb6e9-5a70-4d50-a3ca-7e057b75524b","remote_ip":"127.0.0.1","host":"127.0.0.1:36963","method":"GET","uri":"/api/analytics/reading-stats","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":1027485,"latency_human":"1.027485ms","bytes_in":0,"bytes_out":39}
=== RUN   TestAnalyticsReadingStats/GetReadingStats_WithAuth_DefaultDates
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '0c6da91f-6218-4af7-82b3-06d00374b66f'
2026/02/10 16:47:50 [REQUEST] {"request_id":"1b53fff5-93bb-4ca9-b547-2ae3b1afbc97","timestamp":"2026-02-10T16:47:50.60807043Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49586645,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:50.657683373Z","id":"1b53fff5-93bb-4ca9-b547-2ae3b1afbc97","remote_ip":"127.0.0.1","host":"127.0.0.1:42557","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49605560,"latency_human":"49.60556ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:50.657692681Z","id":"1b53fff5-93bb-4ca9-b547-2ae3b1afbc97","remote_ip":"127.0.0.1","host":"127.0.0.1:42557","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49620478,"latency_human":"49.620478ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:50 [REQUEST] {"request_id":"dae0d970-9213-46fa-9f6f-2246a9859c51","timestamp":"2026-02-10T16:47:50.657895717Z","method":"GET","path":"/api/analytics/reading-stats","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzAsImlhdCI6MTc3MDc0MjA3MCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijg3YTVmMDVjLTI2NTMtNDI2NS05Mzk2LTY5MjhmZjYzZjc4YyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.WsSVGUKfuu9q5Yj4BwqrXPjfD8l24vcgMPcb07bmXns","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2152743,"status_code":200,"response_size":218}
{"time":"2026-02-10T16:47:50.66005887Z","id":"dae0d970-9213-46fa-9f6f-2246a9859c51","remote_ip":"127.0.0.1","host":"127.0.0.1:42557","method":"GET","uri":"/api/analytics/reading-stats","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2163102,"latency_human":"2.163102ms","bytes_in":0,"bytes_out":218}
{"time":"2026-02-10T16:47:50.660062276Z","id":"dae0d970-9213-46fa-9f6f-2246a9859c51","remote_ip":"127.0.0.1","host":"127.0.0.1:42557","method":"GET","uri":"/api/analytics/reading-stats","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2167110,"latency_human":"2.16711ms","bytes_in":0,"bytes_out":218}
=== RUN   TestAnalyticsReadingStats/GetReadingStats_WithCustomDateRange
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '8ff8b8ae-0904-4986-9ce6-eafe31e546d5'
2026/02/10 16:47:50 [REQUEST] {"request_id":"41675bba-5258-4cc6-8cc3-7ed8d7c3ac0e","timestamp":"2026-02-10T16:47:50.680789412Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49852649,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:50.730682235Z","id":"41675bba-5258-4cc6-8cc3-7ed8d7c3ac0e","remote_ip":"127.0.0.1","host":"127.0.0.1:35441","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49890019,"latency_human":"49.890019ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:50.730694217Z","id":"41675bba-5258-4cc6-8cc3-7ed8d7c3ac0e","remote_ip":"127.0.0.1","host":"127.0.0.1:35441","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49904946,"latency_human":"49.904946ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:50 [REQUEST] {"request_id":"507dfcb4-0653-4426-8182-fa3f04047d74","timestamp":"2026-02-10T16:47:50.731080794Z","method":"GET","path":"/api/analytics/reading-stats","query_params":{"end_date":"2026-02-10","start_date":"2025-12-10"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzAsImlhdCI6MTc3MDc0MjA3MCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjYzNGFkMjc5LWYwYTUtNDZkNC1iNjU4LTU4ZThiZjYxYWI5MCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.i_msFAEiF6vim4Ry5xlR2zq34wf9pDs0AVzpqESMdBE","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2151620,"status_code":200,"response_size":218}
{"time":"2026-02-10T16:47:50.733260958Z","id":"507dfcb4-0653-4426-8182-fa3f04047d74","remote_ip":"127.0.0.1","host":"127.0.0.1:35441","method":"GET","uri":"/api/analytics/reading-stats?start_date=2025-12-10&end_date=2026-02-10","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2179212,"latency_human":"2.179212ms","bytes_in":0,"bytes_out":218}
{"time":"2026-02-10T16:47:50.733265978Z","id":"507dfcb4-0653-4426-8182-fa3f04047d74","remote_ip":"127.0.0.1","host":"127.0.0.1:35441","method":"GET","uri":"/api/analytics/reading-stats?start_date=2025-12-10&end_date=2026-02-10","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2185574,"latency_human":"2.185574ms","bytes_in":0,"bytes_out":218}
=== RUN   TestAnalyticsReadingStats/GetReadingStats_InvalidStartDate
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '4b10b8c7-c2a6-4e62-b0b2-0537bd5ea3b6'
2026/02/10 16:47:50 [REQUEST] {"request_id":"d822425e-3bc3-441d-adeb-a28217e109bb","timestamp":"2026-02-10T16:47:50.753939434Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49344205,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:50.803305971Z","id":"d822425e-3bc3-441d-adeb-a28217e109bb","remote_ip":"127.0.0.1","host":"127.0.0.1:41847","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49358271,"latency_human":"49.358271ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:50.803311861Z","id":"d822425e-3bc3-441d-adeb-a28217e109bb","remote_ip":"127.0.0.1","host":"127.0.0.1:41847","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49372729,"latency_human":"49.372729ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:50 [REQUEST] {"request_id":"c0e21d65-5d04-4b98-bb40-b7f577c1e8b4","timestamp":"2026-02-10T16:47:50.803536979Z","method":"GET","path":"/api/analytics/reading-stats","query_params":{"start_date":"invalid-date"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzAsImlhdCI6MTc3MDc0MjA3MCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE5NjBiNTI2LWRiNmQtNDYxYy04MDY5LTVmYzY4NjlmMTA5YiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0._nfxq7bl1TECit5szYGNVgFX3weobLMvDcADzVwomWM","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":42559,"status_code":200,"response_size":0,"error":"code=400, message=invalid start_date format"}
{"time":"2026-02-10T16:47:50.80360783Z","id":"c0e21d65-5d04-4b98-bb40-b7f577c1e8b4","remote_ip":"127.0.0.1","host":"127.0.0.1:41847","method":"GET","uri":"/api/analytics/reading-stats?start_date=invalid-date","user_agent":"Go-http-client/1.1","status":400,"error":"code=400, message=invalid start_date format","latency":70341,"latency_human":"70.341µs","bytes_in":0,"bytes_out":40}
{"time":"2026-02-10T16:47:50.803616206Z","id":"c0e21d65-5d04-4b98-bb40-b7f577c1e8b4","remote_ip":"127.0.0.1","host":"127.0.0.1:41847","method":"GET","uri":"/api/analytics/reading-stats?start_date=invalid-date","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":80028,"latency_human":"80.028µs","bytes_in":0,"bytes_out":40}
=== RUN   TestAnalyticsReadingStats/GetReadingStats_InvalidEndDate
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '7aa7b9bd-54fd-4f11-a44f-accf207c0704'
2026/02/10 16:47:50 [REQUEST] {"request_id":"7fa6026c-5674-48de-9e1e-daf2fe713e4a","timestamp":"2026-02-10T16:47:50.823625089Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50816988,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:50.87446538Z","id":"7fa6026c-5674-48de-9e1e-daf2fe713e4a","remote_ip":"127.0.0.1","host":"127.0.0.1:43207","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50837516,"latency_human":"50.837516ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:50.874474437Z","id":"7fa6026c-5674-48de-9e1e-daf2fe713e4a","remote_ip":"127.0.0.1","host":"127.0.0.1:43207","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50847454,"latency_human":"50.847454ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:50 [REQUEST] {"request_id":"90af1a93-efeb-4f25-82e8-71d3cc152b4d","timestamp":"2026-02-10T16:47:50.874654471Z","method":"GET","path":"/api/analytics/reading-stats","query_params":{"end_date":"not-a-date"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzAsImlhdCI6MTc3MDc0MjA3MCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhmODQyMzYwLTlhYWMtNGFjNS1iZjY0LWEzMjM5YzMwMWUzOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.DAs1JRCMe9gthOByb1tapfDo4MLG7OIPrUrIV2FEkxE","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":52277,"status_code":200,"response_size":0,"error":"code=400, message=invalid end_date format"}
{"time":"2026-02-10T16:47:50.874727026Z","id":"90af1a93-efeb-4f25-82e8-71d3cc152b4d","remote_ip":"127.0.0.1","host":"127.0.0.1:43207","method":"GET","uri":"/api/analytics/reading-stats?end_date=not-a-date","user_agent":"Go-http-client/1.1","status":400,"error":"code=400, message=invalid end_date format","latency":72645,"latency_human":"72.645µs","bytes_in":0,"bytes_out":38}
{"time":"2026-02-10T16:47:50.874733057Z","id":"90af1a93-efeb-4f25-82e8-71d3cc152b4d","remote_ip":"127.0.0.1","host":"127.0.0.1:43207","method":"GET","uri":"/api/analytics/reading-stats?end_date=not-a-date","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":79888,"latency_human":"79.888µs","bytes_in":0,"bytes_out":38}
=== RUN   TestAnalyticsReadingStats/GetReadingStats_EmptyHistory
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'f9b1c878-9e17-4ebb-a159-8099bb54c131'
2026/02/10 16:47:50 [REQUEST] {"request_id":"80fbe3bf-cf17-4d8a-a422-c61fad4fba99","timestamp":"2026-02-10T16:47:50.895620049Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48344131,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:50.943981322Z","id":"80fbe3bf-cf17-4d8a-a422-c61fad4fba99","remote_ip":"127.0.0.1","host":"127.0.0.1:39027","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48359139,"latency_human":"48.359139ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:50.943989006Z","id":"80fbe3bf-cf17-4d8a-a422-c61fad4fba99","remote_ip":"127.0.0.1","host":"127.0.0.1:39027","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48367204,"latency_human":"48.367204ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:50 [REQUEST] {"request_id":"137a53bd-35c6-4908-87f6-b1a61621bdd6","timestamp":"2026-02-10T16:47:50.94421767Z","method":"GET","path":"/api/analytics/reading-stats","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzAsImlhdCI6MTc3MDc0MjA3MCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjgwNzA2NjMzLTNkYzAtNGVhZS05NDdlLWU4ZDIxYzc0YjIwNCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.yADZ8EWe3GdijglqVIe6pz4V-xcJKs0PLQfdD_oaeyE","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2644786,"status_code":200,"response_size":218}
{"time":"2026-02-10T16:47:50.946897961Z","id":"137a53bd-35c6-4908-87f6-b1a61621bdd6","remote_ip":"127.0.0.1","host":"127.0.0.1:39027","method":"GET","uri":"/api/analytics/reading-stats","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2678638,"latency_human":"2.678638ms","bytes_in":0,"bytes_out":218}
{"time":"2026-02-10T16:47:50.94690805Z","id":"137a53bd-35c6-4908-87f6-b1a61621bdd6","remote_ip":"127.0.0.1","host":"127.0.0.1:39027","method":"GET","uri":"/api/analytics/reading-stats","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2690811,"latency_human":"2.690811ms","bytes_in":0,"bytes_out":218}
--- PASS: TestAnalyticsReadingStats (0.39s)
    --- PASS: TestAnalyticsReadingStats/GetReadingStats_WithoutAuth (0.00s)
    --- PASS: TestAnalyticsReadingStats/GetReadingStats_WithAuth_DefaultDates (0.10s)
    --- PASS: TestAnalyticsReadingStats/GetReadingStats_WithCustomDateRange (0.07s)
    --- PASS: TestAnalyticsReadingStats/GetReadingStats_InvalidStartDate (0.07s)
    --- PASS: TestAnalyticsReadingStats/GetReadingStats_InvalidEndDate (0.07s)
    --- PASS: TestAnalyticsReadingStats/GetReadingStats_EmptyHistory (0.07s)
=== RUN   TestAnalyticsDeviceUsage
=== RUN   TestAnalyticsDeviceUsage/GetDeviceUsage_WithoutAuth
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 [REQUEST] {"request_id":"d09c4daa-794b-4fd8-b94b-b4b485c9eb85","timestamp":"2026-02-10T16:47:50.948623312Z","method":"GET","path":"/api/analytics/device-usage","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":4879,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:50.948656704Z","id":"d09c4daa-794b-4fd8-b94b-b4b485c9eb85","remote_ip":"127.0.0.1","host":"127.0.0.1:38869","method":"GET","uri":"/api/analytics/device-usage","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":31579,"latency_human":"31.579µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:50.948665009Z","id":"d09c4daa-794b-4fd8-b94b-b4b485c9eb85","remote_ip":"127.0.0.1","host":"127.0.0.1:38869","method":"GET","uri":"/api/analytics/device-usage","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":41577,"latency_human":"41.577µs","bytes_in":0,"bytes_out":39}
=== RUN   TestAnalyticsDeviceUsage/GetDeviceUsage_WithAuth_NoDevices
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:50 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '1d801a6a-0ab2-40fd-a04a-7dbd2a7606f0'
2026/02/10 16:47:51 [REQUEST] {"request_id":"93cde909-9539-4bb6-9f49-9062380af87c","timestamp":"2026-02-10T16:47:50.968082776Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49842480,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.017953308Z","id":"93cde909-9539-4bb6-9f49-9062380af87c","remote_ip":"127.0.0.1","host":"127.0.0.1:44897","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49866224,"latency_human":"49.866224ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.017962946Z","id":"93cde909-9539-4bb6-9f49-9062380af87c","remote_ip":"127.0.0.1","host":"127.0.0.1:44897","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49879488,"latency_human":"49.879488ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"9b2cba2a-6791-46ad-8e6d-8e6cb2a9fa1f","timestamp":"2026-02-10T16:47:51.018237174Z","method":"GET","path":"/api/analytics/device-usage","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImQzOGJhYTIyLTk0YzUtNDIyMy05NWY3LTkwZTYyMjUzZjAyYyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.IdQHTtlL2lnGmT7GPkl3LthJfjQejwzeemRB727BMcc","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":4223875,"status_code":200,"response_size":15}
{"time":"2026-02-10T16:47:51.022480886Z","id":"9b2cba2a-6791-46ad-8e6d-8e6cb2a9fa1f","remote_ip":"127.0.0.1","host":"127.0.0.1:44897","method":"GET","uri":"/api/analytics/device-usage","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":4243591,"latency_human":"4.243591ms","bytes_in":0,"bytes_out":15}
{"time":"2026-02-10T16:47:51.022487989Z","id":"9b2cba2a-6791-46ad-8e6d-8e6cb2a9fa1f","remote_ip":"127.0.0.1","host":"127.0.0.1:44897","method":"GET","uri":"/api/analytics/device-usage","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":4251667,"latency_human":"4.251667ms","bytes_in":0,"bytes_out":15}
=== RUN   TestAnalyticsDeviceUsage/GetDeviceUsage_WithAuth_WithDevices
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ba3b0597-c81b-469c-bf65-c8304ca061c0'
2026/02/10 16:47:51 [REQUEST] {"request_id":"687d5708-f51c-4e73-a0f4-719460070852","timestamp":"2026-02-10T16:47:51.043461261Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49080868,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.09255913Z","id":"687d5708-f51c-4e73-a0f4-719460070852","remote_ip":"127.0.0.1","host":"127.0.0.1:34855","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49096106,"latency_human":"49.096106ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.092565672Z","id":"687d5708-f51c-4e73-a0f4-719460070852","remote_ip":"127.0.0.1","host":"127.0.0.1:34855","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49104892,"latency_human":"49.104892ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"9e744791-905e-4412-9133-858c61fae93c","timestamp":"2026-02-10T16:47:51.092733033Z","method":"POST","path":"/api/devices/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjE1Zjk4YmJkLWM3MGQtNGVhMy1iYzA5LWRjOGM1ZjJmNzYyMSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.XDYMHqbaMLvF1I0vvas21VUljFpO9XBOV89HPi-4tlQ","Content-Length":"48","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"device_name":"Test Kobo","device_type":"kobo"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":151902,"status_code":400,"response_size":137}
{"time":"2026-02-10T16:47:51.092905382Z","id":"9e744791-905e-4412-9133-858c61fae93c","remote_ip":"127.0.0.1","host":"127.0.0.1:34855","method":"POST","uri":"/api/devices/register","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":172620,"latency_human":"172.62µs","bytes_in":48,"bytes_out":137}
{"time":"2026-02-10T16:47:51.092912536Z","id":"9e744791-905e-4412-9133-858c61fae93c","remote_ip":"127.0.0.1","host":"127.0.0.1:34855","method":"POST","uri":"/api/devices/register","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":180815,"latency_human":"180.815µs","bytes_in":48,"bytes_out":137}
2026/02/10 16:47:51 [REQUEST] {"request_id":"1898b2e8-3e31-40a8-8f4d-32fc79c1be47","timestamp":"2026-02-10T16:47:51.093220377Z","method":"GET","path":"/api/analytics/device-usage","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjE1Zjk4YmJkLWM3MGQtNGVhMy1iYzA5LWRjOGM1ZjJmNzYyMSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.XDYMHqbaMLvF1I0vvas21VUljFpO9XBOV89HPi-4tlQ","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2203377,"status_code":200,"response_size":15}
{"time":"2026-02-10T16:47:51.095433652Z","id":"1898b2e8-3e31-40a8-8f4d-32fc79c1be47","remote_ip":"127.0.0.1","host":"127.0.0.1:34855","method":"GET","uri":"/api/analytics/device-usage","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2213346,"latency_human":"2.213346ms","bytes_in":0,"bytes_out":15}
{"time":"2026-02-10T16:47:51.095436928Z","id":"1898b2e8-3e31-40a8-8f4d-32fc79c1be47","remote_ip":"127.0.0.1","host":"127.0.0.1:34855","method":"GET","uri":"/api/analytics/device-usage","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2217513,"latency_human":"2.217513ms","bytes_in":0,"bytes_out":15}
=== RUN   TestAnalyticsDeviceUsage/GetDeviceUsage_ResponseStructure
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '698d9278-bdd1-4a66-aeae-ec379f8cbb07'
2026/02/10 16:47:51 [REQUEST] {"request_id":"c05baf78-e0a0-4d59-b627-b92dc2f08415","timestamp":"2026-02-10T16:47:51.114536435Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49078272,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.163667866Z","id":"c05baf78-e0a0-4d59-b627-b92dc2f08415","remote_ip":"127.0.0.1","host":"127.0.0.1:42377","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49125551,"latency_human":"49.125551ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.163688174Z","id":"c05baf78-e0a0-4d59-b627-b92dc2f08415","remote_ip":"127.0.0.1","host":"127.0.0.1:42377","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49148153,"latency_human":"49.148153ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"8f60fb22-29c6-4bc9-8461-7ed640e5e73a","timestamp":"2026-02-10T16:47:51.164054704Z","method":"GET","path":"/api/analytics/device-usage","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjE4NWE0YmQzLTgxNTMtNDBhMS05OTgyLWIxNThlNWFmMGZmZCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.8NXrqFsoBQ18aBh1-XsFkKmM3IK2N_2PwCNVbcOcp8c","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2387288,"status_code":200,"response_size":15}
{"time":"2026-02-10T16:47:51.166476335Z","id":"8f60fb22-29c6-4bc9-8461-7ed640e5e73a","remote_ip":"127.0.0.1","host":"127.0.0.1:42377","method":"GET","uri":"/api/analytics/device-usage","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2420960,"latency_human":"2.42096ms","bytes_in":0,"bytes_out":15}
{"time":"2026-02-10T16:47:51.166485412Z","id":"8f60fb22-29c6-4bc9-8461-7ed640e5e73a","remote_ip":"127.0.0.1","host":"127.0.0.1:42377","method":"GET","uri":"/api/analytics/device-usage","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2431039,"latency_human":"2.431039ms","bytes_in":0,"bytes_out":15}
--- PASS: TestAnalyticsDeviceUsage (0.22s)
    --- PASS: TestAnalyticsDeviceUsage/GetDeviceUsage_WithoutAuth (0.00s)
    --- PASS: TestAnalyticsDeviceUsage/GetDeviceUsage_WithAuth_NoDevices (0.07s)
    --- PASS: TestAnalyticsDeviceUsage/GetDeviceUsage_WithAuth_WithDevices (0.07s)
    --- PASS: TestAnalyticsDeviceUsage/GetDeviceUsage_ResponseStructure (0.07s)
=== RUN   TestAnalyticsPopularBooks
=== RUN   TestAnalyticsPopularBooks/GetPopularBooks_WithoutAuth
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 [REQUEST] {"request_id":"fc6297ad-40f4-4e2d-a23b-e01c8686d3fd","timestamp":"2026-02-10T16:47:51.167690637Z","method":"GET","path":"/api/analytics/popular-books","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2836,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:51.167710564Z","id":"fc6297ad-40f4-4e2d-a23b-e01c8686d3fd","remote_ip":"127.0.0.1","host":"127.0.0.1:42453","method":"GET","uri":"/api/analytics/popular-books","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":24074,"latency_human":"24.074µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:51.167716045Z","id":"fc6297ad-40f4-4e2d-a23b-e01c8686d3fd","remote_ip":"127.0.0.1","host":"127.0.0.1:42453","method":"GET","uri":"/api/analytics/popular-books","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":34263,"latency_human":"34.263µs","bytes_in":0,"bytes_out":39}
=== RUN   TestAnalyticsPopularBooks/GetPopularBooks_WithAuth_DefaultLimit
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'a43818bd-1a22-40a2-8e02-36e37e2db4e6'
2026/02/10 16:47:51 [REQUEST] {"request_id":"f0828138-057c-4773-9709-a4b225074f03","timestamp":"2026-02-10T16:47:51.187218809Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50165229,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.23740158Z","id":"f0828138-057c-4773-9709-a4b225074f03","remote_ip":"127.0.0.1","host":"127.0.0.1:45995","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50180978,"latency_human":"50.180978ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.23741211Z","id":"f0828138-057c-4773-9709-a4b225074f03","remote_ip":"127.0.0.1","host":"127.0.0.1:45995","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50189745,"latency_human":"50.189745ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"059251b2-c99a-4ebc-9d8a-32f367a58f34","timestamp":"2026-02-10T16:47:51.237606681Z","method":"GET","path":"/api/analytics/popular-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjIxYTk3OWFkLTI5YzMtNDhjNC05MTA2LWMxODcxZmVhMWRiYSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.vbkUyDFugoK4_XP_1XgG2IHEfrxRNt7PyryRZmkIK_c","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3308146,"status_code":200,"response_size":13}
{"time":"2026-02-10T16:47:51.240953218Z","id":"059251b2-c99a-4ebc-9d8a-32f367a58f34","remote_ip":"127.0.0.1","host":"127.0.0.1:45995","method":"GET","uri":"/api/analytics/popular-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":3344824,"latency_human":"3.344824ms","bytes_in":0,"bytes_out":13}
{"time":"2026-02-10T16:47:51.240965391Z","id":"059251b2-c99a-4ebc-9d8a-32f367a58f34","remote_ip":"127.0.0.1","host":"127.0.0.1:45995","method":"GET","uri":"/api/analytics/popular-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":3357588,"latency_human":"3.357588ms","bytes_in":0,"bytes_out":13}
=== RUN   TestAnalyticsPopularBooks/GetPopularBooks_WithCustomLimit
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '13667e1f-e4cb-4af5-ba18-ba563629594a'
2026/02/10 16:47:51 [REQUEST] {"request_id":"3d61f327-3f99-40eb-90c2-55e5334416f4","timestamp":"2026-02-10T16:47:51.261912785Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48910481,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.310839146Z","id":"3d61f327-3f99-40eb-90c2-55e5334416f4","remote_ip":"127.0.0.1","host":"127.0.0.1:33297","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48924307,"latency_human":"48.924307ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.310845377Z","id":"3d61f327-3f99-40eb-90c2-55e5334416f4","remote_ip":"127.0.0.1","host":"127.0.0.1:33297","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48932893,"latency_human":"48.932893ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"699f0ce6-b086-41db-88dd-be4d698e18b8","timestamp":"2026-02-10T16:47:51.311036682Z","method":"GET","path":"/api/analytics/popular-books","query_params":{"limit":"5"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjFmZDkwMjI1LWY5YzItNGRmNi1iZDBiLTA3ZjUzN2RhODBmNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Zcz-NMA0yNBWBG9sMTvuHtI134PKvFfNYexrEa_bBdI","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1924300,"status_code":200,"response_size":13}
{"time":"2026-02-10T16:47:51.312979285Z","id":"699f0ce6-b086-41db-88dd-be4d698e18b8","remote_ip":"127.0.0.1","host":"127.0.0.1:33297","method":"GET","uri":"/api/analytics/popular-books?limit=5","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1942163,"latency_human":"1.942163ms","bytes_in":0,"bytes_out":13}
{"time":"2026-02-10T16:47:51.312985026Z","id":"699f0ce6-b086-41db-88dd-be4d698e18b8","remote_ip":"127.0.0.1","host":"127.0.0.1:33297","method":"GET","uri":"/api/analytics/popular-books?limit=5","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1949105,"latency_human":"1.949105ms","bytes_in":0,"bytes_out":13}
=== RUN   TestAnalyticsPopularBooks/GetPopularBooks_InvalidLimit
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '38fa6a57-3924-4069-b1f5-4d54756fa859'
2026/02/10 16:47:51 [REQUEST] {"request_id":"c546c0c5-914c-43d5-8dbb-7e98b15d83cd","timestamp":"2026-02-10T16:47:51.332609947Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":52243273,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.384911468Z","id":"c546c0c5-914c-43d5-8dbb-7e98b15d83cd","remote_ip":"127.0.0.1","host":"127.0.0.1:39003","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52295509,"latency_human":"52.295509ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.384933008Z","id":"c546c0c5-914c-43d5-8dbb-7e98b15d83cd","remote_ip":"127.0.0.1","host":"127.0.0.1:39003","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52316378,"latency_human":"52.316378ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"d74c5704-31fe-4fc9-a2cc-a23b0736f43c","timestamp":"2026-02-10T16:47:51.385193371Z","method":"GET","path":"/api/analytics/popular-books","query_params":{"limit":"invalid"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkxM2VlNWZmLTExYTgtNDg1NS1iODE1LWRhM2YxM2ExYTdiNiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.5YEua5f-e1jjJ7zU9fOO5XuULqb_YZh3WYcPhr6-X5g","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2285600,"status_code":200,"response_size":13}
{"time":"2026-02-10T16:47:51.387503717Z","id":"d74c5704-31fe-4fc9-a2cc-a23b0736f43c","remote_ip":"127.0.0.1","host":"127.0.0.1:39003","method":"GET","uri":"/api/analytics/popular-books?limit=invalid","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2309274,"latency_human":"2.309274ms","bytes_in":0,"bytes_out":13}
{"time":"2026-02-10T16:47:51.38751077Z","id":"d74c5704-31fe-4fc9-a2cc-a23b0736f43c","remote_ip":"127.0.0.1","host":"127.0.0.1:39003","method":"GET","uri":"/api/analytics/popular-books?limit=invalid","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2317719,"latency_human":"2.317719ms","bytes_in":0,"bytes_out":13}
=== RUN   TestAnalyticsPopularBooks/GetPopularBooks_ResponseStructure
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '9ce123ff-93ff-4137-82bf-4e37ae8c0add'
2026/02/10 16:47:51 [REQUEST] {"request_id":"51858316-c605-4630-8118-039481571605","timestamp":"2026-02-10T16:47:51.416299949Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50618289,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.4669406Z","id":"51858316-c605-4630-8118-039481571605","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50633276,"latency_human":"50.633276ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.466947482Z","id":"51858316-c605-4630-8118-039481571605","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50647663,"latency_human":"50.647663ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"211efd82-e082-4f28-9d7f-4a3afc3669f1","timestamp":"2026-02-10T16:47:51.467163703Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhmYWZhMTIwLWQ2Y2MtNDNkYy1hZDIxLTYxMTMzM2JiYmNlZSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.HAB24ilAW3dKmxqqI0oboCSU6RiGGD-mdGJmLwKndiU","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":4496860,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:51.471688496Z","id":"211efd82-e082-4f28-9d7f-4a3afc3669f1","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":4524091,"latency_human":"4.524091ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:51.471695719Z","id":"211efd82-e082-4f28-9d7f-4a3afc3669f1","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":4532076,"latency_human":"4.532076ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:51 [REQUEST] {"request_id":"8a154e89-11e7-4b0d-b5a7-1310797e6eed","timestamp":"2026-02-10T16:47:51.47186324Z","method":"POST","path":"/api/libraries/2a2b392d-73c8-43c3-b853-57946850ce2d/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhmYWZhMTIwLWQ2Y2MtNDNkYy1hZDIxLTYxMTMzM2JiYmNlZSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.HAB24ilAW3dKmxqqI0oboCSU6RiGGD-mdGJmLwKndiU","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":4017272,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:51.475896922Z","id":"8a154e89-11e7-4b0d-b5a7-1310797e6eed","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/libraries/2a2b392d-73c8-43c3-b853-57946850ce2d/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":4033733,"latency_human":"4.033733ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:51.475903084Z","id":"8a154e89-11e7-4b0d-b5a7-1310797e6eed","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/libraries/2a2b392d-73c8-43c3-b853-57946850ce2d/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":4040665,"latency_human":"4.040665ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:51 [REQUEST] {"request_id":"6443afd4-b1a2-428e-b674-5bdab3a3bb13","timestamp":"2026-02-10T16:47:51.476210424Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhmYWZhMTIwLWQ2Y2MtNDNkYy1hZDIxLTYxMTMzM2JiYmNlZSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.HAB24ilAW3dKmxqqI0oboCSU6RiGGD-mdGJmLwKndiU","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"2a2b392d-73c8-43c3-b853-57946850ce2d","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":9341627,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:51.485580524Z","id":"6443afd4-b1a2-428e-b674-5bdab3a3bb13","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":9367365,"latency_human":"9.367365ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:51.485587026Z","id":"6443afd4-b1a2-428e-b674-5bdab3a3bb13","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":9376792,"latency_human":"9.376792ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:51 [REQUEST] {"request_id":"66874e51-5917-47d7-8d68-4ca8d71bff8d","timestamp":"2026-02-10T16:47:51.485840596Z","method":"POST","path":"/api/media-items/68dd11a3-34bb-40ad-9364-55120dadc7f5/progress","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhmYWZhMTIwLWQ2Y2MtNDNkYy1hZDIxLTYxMTMzM2JiYmNlZSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.HAB24ilAW3dKmxqqI0oboCSU6RiGGD-mdGJmLwKndiU","Content-Length":"124","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"media_item_id":"68dd11a3-34bb-40ad-9364-55120dadc7f5","pages_read":100,"progress_percentage":50,"time_spent_seconds":1800},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":29675,"status_code":200,"response_size":0,"error":"code=404, message=Not Found"}
{"time":"2026-02-10T16:47:51.485885239Z","id":"66874e51-5917-47d7-8d68-4ca8d71bff8d","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/media-items/68dd11a3-34bb-40ad-9364-55120dadc7f5/progress","user_agent":"Go-http-client/1.1","status":404,"error":"code=404, message=Not Found","latency":44582,"latency_human":"44.582µs","bytes_in":124,"bytes_out":24}
{"time":"2026-02-10T16:47:51.485888415Z","id":"66874e51-5917-47d7-8d68-4ca8d71bff8d","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"POST","uri":"/api/media-items/68dd11a3-34bb-40ad-9364-55120dadc7f5/progress","user_agent":"Go-http-client/1.1","status":404,"error":"","latency":48480,"latency_human":"48.48µs","bytes_in":124,"bytes_out":24}
2026/02/10 16:47:51 [REQUEST] {"request_id":"db30f4b9-5fdb-429d-ae28-53e810340c20","timestamp":"2026-02-10T16:47:51.486169286Z","method":"GET","path":"/api/analytics/popular-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhmYWZhMTIwLWQ2Y2MtNDNkYy1hZDIxLTYxMTMzM2JiYmNlZSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.HAB24ilAW3dKmxqqI0oboCSU6RiGGD-mdGJmLwKndiU","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1276478,"status_code":200,"response_size":13}
{"time":"2026-02-10T16:47:51.487459659Z","id":"db30f4b9-5fdb-429d-ae28-53e810340c20","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"GET","uri":"/api/analytics/popular-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1290624,"latency_human":"1.290624ms","bytes_in":0,"bytes_out":13}
{"time":"2026-02-10T16:47:51.487463006Z","id":"db30f4b9-5fdb-429d-ae28-53e810340c20","remote_ip":"127.0.0.1","host":"127.0.0.1:44629","method":"GET","uri":"/api/analytics/popular-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1294762,"latency_human":"1.294762ms","bytes_in":0,"bytes_out":13}
=== RUN   TestAnalyticsPopularBooks/GetPopularBooks_NoReadingHistory
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ef902e24-d59e-43bf-86b1-bea71ee3c311'
2026/02/10 16:47:51 [REQUEST] {"request_id":"d57aed8c-851b-424c-b97f-151533cb8067","timestamp":"2026-02-10T16:47:51.510431639Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":54344931,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.564859985Z","id":"d57aed8c-851b-424c-b97f-151533cb8067","remote_ip":"127.0.0.1","host":"127.0.0.1:39005","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":54424439,"latency_human":"54.424439ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.564870084Z","id":"d57aed8c-851b-424c-b97f-151533cb8067","remote_ip":"127.0.0.1","host":"127.0.0.1:39005","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":54438315,"latency_human":"54.438315ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"209af783-f0c3-4f2c-90a7-1c0a54fe5d4f","timestamp":"2026-02-10T16:47:51.565074272Z","method":"GET","path":"/api/analytics/popular-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjVlNWEzMjhiLWIyNGItNGE5Yy1hZGQwLTA0MGZjZWIwYjEzYiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.98gemb4koWv_CEoOadp50Vohrnkg-wchZsW8ers7wiM","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1950578,"status_code":200,"response_size":13}
{"time":"2026-02-10T16:47:51.567034418Z","id":"209af783-f0c3-4f2c-90a7-1c0a54fe5d4f","remote_ip":"127.0.0.1","host":"127.0.0.1:39005","method":"GET","uri":"/api/analytics/popular-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1960426,"latency_human":"1.960426ms","bytes_in":0,"bytes_out":13}
{"time":"2026-02-10T16:47:51.567037754Z","id":"209af783-f0c3-4f2c-90a7-1c0a54fe5d4f","remote_ip":"127.0.0.1","host":"127.0.0.1:39005","method":"GET","uri":"/api/analytics/popular-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1965546,"latency_human":"1.965546ms","bytes_in":0,"bytes_out":13}
--- PASS: TestAnalyticsPopularBooks (0.40s)
    --- PASS: TestAnalyticsPopularBooks/GetPopularBooks_WithoutAuth (0.00s)
    --- PASS: TestAnalyticsPopularBooks/GetPopularBooks_WithAuth_DefaultLimit (0.07s)
    --- PASS: TestAnalyticsPopularBooks/GetPopularBooks_WithCustomLimit (0.07s)
    --- PASS: TestAnalyticsPopularBooks/GetPopularBooks_InvalidLimit (0.07s)
    --- PASS: TestAnalyticsPopularBooks/GetPopularBooks_ResponseStructure (0.10s)
    --- PASS: TestAnalyticsPopularBooks/GetPopularBooks_NoReadingHistory (0.08s)
=== RUN   TestAnalyticsEdgeCases
=== RUN   TestAnalyticsEdgeCases/ReadingStats_FutureDateRange
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ea04d2d9-e1eb-4f32-b5f1-4c34f2ff365a'
2026/02/10 16:47:51 [REQUEST] {"request_id":"f9dc54a0-c803-4450-8a99-a765376ed231","timestamp":"2026-02-10T16:47:51.604116019Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":57655031,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.661795956Z","id":"f9dc54a0-c803-4450-8a99-a765376ed231","remote_ip":"127.0.0.1","host":"127.0.0.1:44707","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":57676761,"latency_human":"57.676761ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.661806465Z","id":"f9dc54a0-c803-4450-8a99-a765376ed231","remote_ip":"127.0.0.1","host":"127.0.0.1:44707","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":57690407,"latency_human":"57.690407ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"b1fa48ca-c316-4503-a4b6-76941d3a81e0","timestamp":"2026-02-10T16:47:51.662280144Z","method":"GET","path":"/api/analytics/reading-stats","query_params":{"end_date":"2026-02-24","start_date":"2026-02-17"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImJkODU4YmEyLTkxYmUtNDkxYS1iOTgwLTZmMGJkOGViMWM3YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.ahfcHfGWPPeDKa7TmxTNVKWLxdO1ao8sjsCLapqyj1s","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3070215,"status_code":200,"response_size":218}
{"time":"2026-02-10T16:47:51.665374153Z","id":"b1fa48ca-c316-4503-a4b6-76941d3a81e0","remote_ip":"127.0.0.1","host":"127.0.0.1:44707","method":"GET","uri":"/api/analytics/reading-stats?start_date=2026-02-17&end_date=2026-02-24","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":3093488,"latency_human":"3.093488ms","bytes_in":0,"bytes_out":218}
{"time":"2026-02-10T16:47:51.665380114Z","id":"b1fa48ca-c316-4503-a4b6-76941d3a81e0","remote_ip":"127.0.0.1","host":"127.0.0.1:44707","method":"GET","uri":"/api/analytics/reading-stats?start_date=2026-02-17&end_date=2026-02-24","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":3102775,"latency_human":"3.102775ms","bytes_in":0,"bytes_out":218}
=== RUN   TestAnalyticsEdgeCases/PopularBooks_LimitZero
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '235d4701-7288-4b6b-be3e-90078d009e87'
2026/02/10 16:47:51 [REQUEST] {"request_id":"47dff906-d143-4ab9-ae38-e303bd5ffd4c","timestamp":"2026-02-10T16:47:51.700904286Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":56954421,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.757880257Z","id":"47dff906-d143-4ab9-ae38-e303bd5ffd4c","remote_ip":"127.0.0.1","host":"127.0.0.1:42529","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":56971714,"latency_human":"56.971714ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.757889534Z","id":"47dff906-d143-4ab9-ae38-e303bd5ffd4c","remote_ip":"127.0.0.1","host":"127.0.0.1:42529","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":56983666,"latency_human":"56.983666ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"41a35b1b-f089-49ca-8c19-7f873b688049","timestamp":"2026-02-10T16:47:51.758055232Z","method":"GET","path":"/api/analytics/popular-books","query_params":{"limit":"0"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjY0NWY3MjE3LTFkM2MtNDEyMS1iMTliLTIwZWNiZWNjMTViNSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.rUTdGlCHt47OmxHnspS7BBNFddT0jCdPaseS07Iuk0Q","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2860666,"status_code":200,"response_size":13}
{"time":"2026-02-10T16:47:51.760930094Z","id":"41a35b1b-f089-49ca-8c19-7f873b688049","remote_ip":"127.0.0.1","host":"127.0.0.1:42529","method":"GET","uri":"/api/analytics/popular-books?limit=0","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2874673,"latency_human":"2.874673ms","bytes_in":0,"bytes_out":13}
{"time":"2026-02-10T16:47:51.76093339Z","id":"41a35b1b-f089-49ca-8c19-7f873b688049","remote_ip":"127.0.0.1","host":"127.0.0.1:42529","method":"GET","uri":"/api/analytics/popular-books?limit=0","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2878579,"latency_human":"2.878579ms","bytes_in":0,"bytes_out":13}
=== RUN   TestAnalyticsEdgeCases/PopularBooks_VeryLargeLimit
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '36701103-7cef-4dea-bef9-eabb6b06fc1e'
2026/02/10 16:47:51 [REQUEST] {"request_id":"07aa0196-0c61-4895-bf94-8c6573018a93","timestamp":"2026-02-10T16:47:51.780894485Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":52840160,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.833754903Z","id":"07aa0196-0c61-4895-bf94-8c6573018a93","remote_ip":"127.0.0.1","host":"127.0.0.1:41607","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52856450,"latency_human":"52.85645ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.833763058Z","id":"07aa0196-0c61-4895-bf94-8c6573018a93","remote_ip":"127.0.0.1","host":"127.0.0.1:41607","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52868583,"latency_human":"52.868583ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"f96c0723-c8dd-4bd4-9fe0-8037633d0164","timestamp":"2026-02-10T16:47:51.833939626Z","method":"GET","path":"/api/analytics/popular-books","query_params":{"limit":"999999"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijg5MzZlYTc2LWIyOWMtNGJiYS04NGZhLWNkZTFlOGIyZTAyOCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Jq-nKYAeKBxx724CUKKKfhEZR-bXgugOz2rOgB8Wt6k","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1916394,"status_code":200,"response_size":13}
{"time":"2026-02-10T16:47:51.835868623Z","id":"f96c0723-c8dd-4bd4-9fe0-8037633d0164","remote_ip":"127.0.0.1","host":"127.0.0.1:41607","method":"GET","uri":"/api/analytics/popular-books?limit=999999","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1928517,"latency_human":"1.928517ms","bytes_in":0,"bytes_out":13}
{"time":"2026-02-10T16:47:51.835872611Z","id":"f96c0723-c8dd-4bd4-9fe0-8037633d0164","remote_ip":"127.0.0.1","host":"127.0.0.1:41607","method":"GET","uri":"/api/analytics/popular-books?limit=999999","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1933075,"latency_human":"1.933075ms","bytes_in":0,"bytes_out":13}
--- PASS: TestAnalyticsEdgeCases (0.27s)
    --- PASS: TestAnalyticsEdgeCases/ReadingStats_FutureDateRange (0.10s)
    --- PASS: TestAnalyticsEdgeCases/PopularBooks_LimitZero (0.10s)
    --- PASS: TestAnalyticsEdgeCases/PopularBooks_VeryLargeLimit (0.07s)
=== RUN   TestAuthMiddlewareAlt
=== RUN   TestAuthMiddlewareAlt/Missing_JWT
=== RUN   TestAuthMiddlewareAlt/Invalid_JWT_format
=== RUN   TestAuthMiddlewareAlt/Valid_JWT_format
--- PASS: TestAuthMiddlewareAlt (0.00s)
    --- PASS: TestAuthMiddlewareAlt/Missing_JWT (0.00s)
    --- PASS: TestAuthMiddlewareAlt/Invalid_JWT_format (0.00s)
    --- PASS: TestAuthMiddlewareAlt/Valid_JWT_format (0.00s)
=== RUN   TestBookMatchingQueryBooks
=== RUN   TestBookMatchingQueryBooks/QueryBooks_WithoutAuth
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 [REQUEST] {"request_id":"8666db54-b6b6-4583-84e5-fa313c4c243d","timestamp":"2026-02-10T16:47:51.837131326Z","method":"POST","path":"/api/sync/books/query","headers":{"Accept-Encoding":"gzip","Content-Length":"21","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"title":"Test Book"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":9598,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:51.837155911Z","id":"8666db54-b6b6-4583-84e5-fa313c4c243d","remote_ip":"127.0.0.1","host":"127.0.0.1:41129","method":"POST","uri":"/api/sync/books/query","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":23814,"latency_human":"23.814µs","bytes_in":21,"bytes_out":39}
{"time":"2026-02-10T16:47:51.837161732Z","id":"8666db54-b6b6-4583-84e5-fa313c4c243d","remote_ip":"127.0.0.1","host":"127.0.0.1:41129","method":"POST","uri":"/api/sync/books/query","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":30627,"latency_human":"30.627µs","bytes_in":21,"bytes_out":39}
=== RUN   TestBookMatchingQueryBooks/QueryBooks_WithAuth_ByTitle
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'a3bb5f57-cdba-4ea7-884a-9848a0c4ca56'
2026/02/10 16:47:51 [REQUEST] {"request_id":"e7965f03-164a-4d9b-98db-4bf4d5866427","timestamp":"2026-02-10T16:47:51.869286449Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":56929164,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:51.926263011Z","id":"e7965f03-164a-4d9b-98db-4bf4d5866427","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":56967446,"latency_human":"56.967446ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:51.926282046Z","id":"e7965f03-164a-4d9b-98db-4bf4d5866427","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":56989727,"latency_human":"56.989727ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:51 [REQUEST] {"request_id":"2758d16d-de4e-4b36-af8a-b0cfc490c23e","timestamp":"2026-02-10T16:47:51.926637736Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk3ODZjOTM2LTQ3MGUtNDZlNC05NGFlLTFkZjkzYTMyNDE1NyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Zrl-aXhvb5FNsgkljeLhCf3xgxVTzXQGUhxBCTqhXAw","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":26658026,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:51.953339644Z","id":"2758d16d-de4e-4b36-af8a-b0cfc490c23e","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":26700996,"latency_human":"26.700996ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:51.953350183Z","id":"2758d16d-de4e-4b36-af8a-b0cfc490c23e","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":26712998,"latency_human":"26.712998ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:51 [REQUEST] {"request_id":"3f821f47-2b56-4edd-8036-7b0c4e4b4662","timestamp":"2026-02-10T16:47:51.953628099Z","method":"POST","path":"/api/libraries/15416d9d-2053-4754-bac4-64f923643a52/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk3ODZjOTM2LTQ3MGUtNDZlNC05NGFlLTFkZjkzYTMyNDE1NyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Zrl-aXhvb5FNsgkljeLhCf3xgxVTzXQGUhxBCTqhXAw","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":10890510,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:51.964559525Z","id":"3f821f47-2b56-4edd-8036-7b0c4e4b4662","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/libraries/15416d9d-2053-4754-bac4-64f923643a52/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":10929733,"latency_human":"10.929733ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:51.964571127Z","id":"3f821f47-2b56-4edd-8036-7b0c4e4b4662","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/libraries/15416d9d-2053-4754-bac4-64f923643a52/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":10942207,"latency_human":"10.942207ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:51 [REQUEST] {"request_id":"a793105c-c479-4dde-bad6-b0a1dabb63cd","timestamp":"2026-02-10T16:47:51.964993009Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk3ODZjOTM2LTQ3MGUtNDZlNC05NGFlLTFkZjkzYTMyNDE1NyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Zrl-aXhvb5FNsgkljeLhCf3xgxVTzXQGUhxBCTqhXAw","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"15416d9d-2053-4754-bac4-64f923643a52","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":10462356,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:51.975481544Z","id":"a793105c-c479-4dde-bad6-b0a1dabb63cd","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":10487884,"latency_human":"10.487884ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:51.975489909Z","id":"a793105c-c479-4dde-bad6-b0a1dabb63cd","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":10498153,"latency_human":"10.498153ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:51 [REQUEST] {"request_id":"73f00cd9-d479-498b-a598-416ce7955b0a","timestamp":"2026-02-10T16:47:51.975766342Z","method":"POST","path":"/api/sync/books/query","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzEsImlhdCI6MTc3MDc0MjA3MSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk3ODZjOTM2LTQ3MGUtNDZlNC05NGFlLTFkZjkzYTMyNDE1NyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Zrl-aXhvb5FNsgkljeLhCf3xgxVTzXQGUhxBCTqhXAw","Content-Length":"22","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"title":"Test Ebook"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":5746679,"status_code":200,"response_size":37}
{"time":"2026-02-10T16:47:51.981568564Z","id":"73f00cd9-d479-498b-a598-416ce7955b0a","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/sync/books/query","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":5797403,"latency_human":"5.797403ms","bytes_in":22,"bytes_out":37}
{"time":"2026-02-10T16:47:51.981580917Z","id":"73f00cd9-d479-498b-a598-416ce7955b0a","remote_ip":"127.0.0.1","host":"127.0.0.1:39687","method":"POST","uri":"/api/sync/books/query","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":5811890,"latency_human":"5.81189ms","bytes_in":22,"bytes_out":37}
=== RUN   TestBookMatchingQueryBooks/QueryBooks_InvalidRequestBody
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:51 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '4a31e12c-b250-446e-9bbc-a489c632fa96'
2026/02/10 16:47:52 [REQUEST] {"request_id":"7b14ac94-d3b4-4b51-a38d-8951fdcf9dd3","timestamp":"2026-02-10T16:47:52.042560665Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":60788543,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.103377821Z","id":"7b14ac94-d3b4-4b51-a38d-8951fdcf9dd3","remote_ip":"127.0.0.1","host":"127.0.0.1:37233","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":60814271,"latency_human":"60.814271ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.103388461Z","id":"7b14ac94-d3b4-4b51-a38d-8951fdcf9dd3","remote_ip":"127.0.0.1","host":"127.0.0.1:37233","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":60829029,"latency_human":"60.829029ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"9cfe8c59-2b2e-4e9e-8fee-a2f90eb51e7c","timestamp":"2026-02-10T16:47:52.103666637Z","method":"POST","path":"/api/sync/books/query","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjA0YjQ4ZWU2LTg3MTctNDRkYi05NGNlLTVmZmZjZDg2ZmIwNCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.sCdATJvXlVWQAOpek4bgVgVqBD83vaEddApUGtw589o","Content-Length":"12","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":70190,"status_code":400,"response_size":33}
{"time":"2026-02-10T16:47:52.103764589Z","id":"9cfe8c59-2b2e-4e9e-8fee-a2f90eb51e7c","remote_ip":"127.0.0.1","host":"127.0.0.1:37233","method":"POST","uri":"/api/sync/books/query","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":97551,"latency_human":"97.551µs","bytes_in":12,"bytes_out":33}
{"time":"2026-02-10T16:47:52.103772944Z","id":"9cfe8c59-2b2e-4e9e-8fee-a2f90eb51e7c","remote_ip":"127.0.0.1","host":"127.0.0.1:37233","method":"POST","uri":"/api/sync/books/query","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":107479,"latency_human":"107.479µs","bytes_in":12,"bytes_out":33}
=== RUN   TestBookMatchingQueryBooks/QueryBooks_NoResults
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '47d04941-13ab-43fe-b5b3-48b2d3daa397'
2026/02/10 16:47:52 [REQUEST] {"request_id":"d1208a1b-f46d-4a19-9c1f-c5c5da98ebd2","timestamp":"2026-02-10T16:47:52.140682666Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49386745,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.190086433Z","id":"d1208a1b-f46d-4a19-9c1f-c5c5da98ebd2","remote_ip":"127.0.0.1","host":"127.0.0.1:35433","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49401502,"latency_human":"49.401502ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.190094307Z","id":"d1208a1b-f46d-4a19-9c1f-c5c5da98ebd2","remote_ip":"127.0.0.1","host":"127.0.0.1:35433","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49410409,"latency_human":"49.410409ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"e8b4e62e-5230-4b29-a5a0-14ea3cf1b54d","timestamp":"2026-02-10T16:47:52.190339011Z","method":"POST","path":"/api/sync/books/query","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjAzMDQ4ZTUxLTM0OGMtNGUwOC04ODQyLTkzZWY1MTZhNzU0OSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.-93YqgQxBnlSYwZaNi7vJKlTZ6VOoAc-D41U7cbujCY","Content-Length":"57","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"title":"NonExistentBookTitleThatDoesNotExist123456789"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3939487,"status_code":200,"response_size":37}
{"time":"2026-02-10T16:47:52.194307572Z","id":"e8b4e62e-5230-4b29-a5a0-14ea3cf1b54d","remote_ip":"127.0.0.1","host":"127.0.0.1:35433","method":"POST","uri":"/api/sync/books/query","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":3966668,"latency_human":"3.966668ms","bytes_in":57,"bytes_out":37}
{"time":"2026-02-10T16:47:52.1943171Z","id":"e8b4e62e-5230-4b29-a5a0-14ea3cf1b54d","remote_ip":"127.0.0.1","host":"127.0.0.1:35433","method":"POST","uri":"/api/sync/books/query","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":3978009,"latency_human":"3.978009ms","bytes_in":57,"bytes_out":37}
--- PASS: TestBookMatchingQueryBooks (0.36s)
    --- PASS: TestBookMatchingQueryBooks/QueryBooks_WithoutAuth (0.00s)
    --- PASS: TestBookMatchingQueryBooks/QueryBooks_WithAuth_ByTitle (0.14s)
    --- PASS: TestBookMatchingQueryBooks/QueryBooks_InvalidRequestBody (0.12s)
    --- PASS: TestBookMatchingQueryBooks/QueryBooks_NoResults (0.09s)
=== RUN   TestBookMatchingBulkLink
=== RUN   TestBookMatchingBulkLink/BulkLinkBooks_WithoutAuth
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 [REQUEST] {"request_id":"180cb6c2-d60d-42ce-a22f-04558244dda2","timestamp":"2026-02-10T16:47:52.195103929Z","method":"POST","path":"/api/sync/bulk-link-books","headers":{"Accept-Encoding":"gzip","Content-Length":"149","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"links":[{"confidence_score":0.9,"media_item_id":"bab5b695-c863-4300-944b-1a85da501b2f","unlinked_book_id":"118f8527-5a51-40c9-8627-43a2bd0ce7f8"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":12253,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:52.195134646Z","id":"180cb6c2-d60d-42ce-a22f-04558244dda2","remote_ip":"127.0.0.1","host":"127.0.0.1:38683","method":"POST","uri":"/api/sync/bulk-link-books","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":28412,"latency_human":"28.412µs","bytes_in":149,"bytes_out":39}
{"time":"2026-02-10T16:47:52.195138874Z","id":"180cb6c2-d60d-42ce-a22f-04558244dda2","remote_ip":"127.0.0.1","host":"127.0.0.1:38683","method":"POST","uri":"/api/sync/bulk-link-books","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":35335,"latency_human":"35.335µs","bytes_in":149,"bytes_out":39}
=== RUN   TestBookMatchingBulkLink/BulkLinkBooks_WithAuth_EmptyLinks
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '949e76bf-bf37-4659-901e-f8be6134e3a6'
2026/02/10 16:47:52 [REQUEST] {"request_id":"97ef824f-6d69-4547-9d04-8442b74e6e8c","timestamp":"2026-02-10T16:47:52.242641153Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50617618,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.293283066Z","id":"97ef824f-6d69-4547-9d04-8442b74e6e8c","remote_ip":"127.0.0.1","host":"127.0.0.1:42087","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50637375,"latency_human":"50.637375ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.293292263Z","id":"97ef824f-6d69-4547-9d04-8442b74e6e8c","remote_ip":"127.0.0.1","host":"127.0.0.1:42087","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50651160,"latency_human":"50.65116ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"810a5545-19fc-4a0e-a2ed-e6e1e27c2562","timestamp":"2026-02-10T16:47:52.293523963Z","method":"POST","path":"/api/sync/bulk-link-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjFmMmE1YTZhLTA3MmQtNDA2My1iN2E0LTJhNGE4OTgwNDY4MSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.1sm7RoOkAoM8WRpVRZZfAlZezpgPANatGTd8R_ZhvL8","Content-Length":"12","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"links":[]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":79477,"status_code":200,"response_size":51}
{"time":"2026-02-10T16:47:52.293626463Z","id":"810a5545-19fc-4a0e-a2ed-e6e1e27c2562","remote_ip":"127.0.0.1","host":"127.0.0.1:42087","method":"POST","uri":"/api/sync/bulk-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":101609,"latency_human":"101.609µs","bytes_in":12,"bytes_out":51}
{"time":"2026-02-10T16:47:52.293632103Z","id":"810a5545-19fc-4a0e-a2ed-e6e1e27c2562","remote_ip":"127.0.0.1","host":"127.0.0.1:42087","method":"POST","uri":"/api/sync/bulk-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":108872,"latency_human":"108.872µs","bytes_in":12,"bytes_out":51}
=== RUN   TestBookMatchingBulkLink/BulkLinkBooks_InvalidUnlinkedBookID
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'c7248f4c-31d0-448c-89e1-ae663a25d495'
2026/02/10 16:47:52 [REQUEST] {"request_id":"230a49f3-213f-4d30-beaf-d45b5012f1b7","timestamp":"2026-02-10T16:47:52.329884907Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":54541776,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.384452261Z","id":"230a49f3-213f-4d30-beaf-d45b5012f1b7","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":54558718,"latency_human":"54.558718ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.384459174Z","id":"230a49f3-213f-4d30-beaf-d45b5012f1b7","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":54575358,"latency_human":"54.575358ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"ae993375-2a1a-4250-9021-c373a77a778e","timestamp":"2026-02-10T16:47:52.384623629Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3ZjYxMDk0LTgwYzMtNDQyNS05YjE5LWVhNzczNWE3ZDJiYSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.24FA0xWq1rSWChcYQRrspZObU2Io3Kvm4Q_9znmr3sU","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3752260,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:52.388392379Z","id":"ae993375-2a1a-4250-9021-c373a77a778e","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3768720,"latency_human":"3.76872ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:52.388396827Z","id":"ae993375-2a1a-4250-9021-c373a77a778e","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3773810,"latency_human":"3.77381ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:52 [REQUEST] {"request_id":"4b1f1e79-4436-4360-a0ce-8e6428546620","timestamp":"2026-02-10T16:47:52.38857601Z","method":"POST","path":"/api/libraries/c3e54e6c-163c-4497-aefa-c725e54f9f30/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3ZjYxMDk0LTgwYzMtNDQyNS05YjE5LWVhNzczNWE3ZDJiYSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.24FA0xWq1rSWChcYQRrspZObU2Io3Kvm4Q_9znmr3sU","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2802508,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:52.391431286Z","id":"4b1f1e79-4436-4360-a0ce-8e6428546620","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/libraries/c3e54e6c-163c-4497-aefa-c725e54f9f30/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2854705,"latency_human":"2.854705ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:52.391437297Z","id":"4b1f1e79-4436-4360-a0ce-8e6428546620","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/libraries/c3e54e6c-163c-4497-aefa-c725e54f9f30/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2862329,"latency_human":"2.862329ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:52 [REQUEST] {"request_id":"6345ebda-bd61-40e9-a61e-1b9ceaf6a423","timestamp":"2026-02-10T16:47:52.391671451Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3ZjYxMDk0LTgwYzMtNDQyNS05YjE5LWVhNzczNWE3ZDJiYSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.24FA0xWq1rSWChcYQRrspZObU2Io3Kvm4Q_9znmr3sU","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"c3e54e6c-163c-4497-aefa-c725e54f9f30","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":40060867,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:52.431757895Z","id":"6345ebda-bd61-40e9-a61e-1b9ceaf6a423","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":40085603,"latency_human":"40.085603ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:52.431763626Z","id":"6345ebda-bd61-40e9-a61e-1b9ceaf6a423","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":40092395,"latency_human":"40.092395ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:52 [REQUEST] {"request_id":"1c4d918a-35f0-421b-812d-92dadafb6133","timestamp":"2026-02-10T16:47:52.431983584Z","method":"POST","path":"/api/sync/bulk-link-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3ZjYxMDk0LTgwYzMtNDQyNS05YjE5LWVhNzczNWE3ZDJiYSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.24FA0xWq1rSWChcYQRrspZObU2Io3Kvm4Q_9znmr3sU","Content-Length":"149","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"links":[{"confidence_score":0.9,"media_item_id":"8a37aca6-a430-430b-aecf-b6b30b318c72","unlinked_book_id":"f2682bc0-f83b-4ba4-8203-d6370874998b"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":17174095,"status_code":200,"response_size":161}
{"time":"2026-02-10T16:47:52.449209455Z","id":"1c4d918a-35f0-421b-812d-92dadafb6133","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/sync/bulk-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":17223457,"latency_human":"17.223457ms","bytes_in":149,"bytes_out":161}
{"time":"2026-02-10T16:47:52.449218512Z","id":"1c4d918a-35f0-421b-812d-92dadafb6133","remote_ip":"127.0.0.1","host":"127.0.0.1:34361","method":"POST","uri":"/api/sync/bulk-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":17235970,"latency_human":"17.23597ms","bytes_in":149,"bytes_out":161}
=== RUN   TestBookMatchingBulkLink/BulkLinkBooks_MultipleLinks
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '5ca53b4d-6471-49db-97f5-75e450aba385'
2026/02/10 16:47:52 [REQUEST] {"request_id":"8e53cd2c-a8d5-4950-ab81-b0607a5dca39","timestamp":"2026-02-10T16:47:52.490122012Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":73864898,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.564042122Z","id":"8e53cd2c-a8d5-4950-ab81-b0607a5dca39","remote_ip":"127.0.0.1","host":"127.0.0.1:45141","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":73911785,"latency_human":"73.911785ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.564055096Z","id":"8e53cd2c-a8d5-4950-ab81-b0607a5dca39","remote_ip":"127.0.0.1","host":"127.0.0.1:45141","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":73932453,"latency_human":"73.932453ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"a5943c89-b641-468f-9d23-c4f2194c6128","timestamp":"2026-02-10T16:47:52.564476437Z","method":"POST","path":"/api/sync/bulk-link-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkxMGI3MjQ3LWYzY2UtNGUwNS05MDQ0LTEyY2RhZTkzN2ZkYiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.BR596oCNWee4uYtzenQXNxIbYsUAucTF2o2n4LIKvIs","Content-Length":"426","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"links":[{"confidence_score":0.9,"media_item_id":"26076f8b-de3c-428f-97ff-3afebc0c4659","unlinked_book_id":"f240cfca-c6a2-4ed2-b159-0b125c39ba8b"},{"confidence_score":0.8,"media_item_id":"bf3739b0-b996-4fc5-8351-9b40674864fe","unlinked_book_id":"a4acdf84-47fb-450b-bcb6-784c54e206e2"},{"confidence_score":0.95,"media_item_id":"75ed36ce-2521-4706-86e7-8b42c243c8a6","unlinked_book_id":"52d70771-0a4c-4b2f-ab29-35eaeb0c20b3"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1199515,"status_code":200,"response_size":383}
{"time":"2026-02-10T16:47:52.565703063Z","id":"a5943c89-b641-468f-9d23-c4f2194c6128","remote_ip":"127.0.0.1","host":"127.0.0.1:45141","method":"POST","uri":"/api/sync/bulk-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1225133,"latency_human":"1.225133ms","bytes_in":426,"bytes_out":383}
{"time":"2026-02-10T16:47:52.565709695Z","id":"a5943c89-b641-468f-9d23-c4f2194c6128","remote_ip":"127.0.0.1","host":"127.0.0.1:45141","method":"POST","uri":"/api/sync/bulk-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":1233939,"latency_human":"1.233939ms","bytes_in":426,"bytes_out":383}
--- PASS: TestBookMatchingBulkLink (0.37s)
    --- PASS: TestBookMatchingBulkLink/BulkLinkBooks_WithoutAuth (0.00s)
    --- PASS: TestBookMatchingBulkLink/BulkLinkBooks_WithAuth_EmptyLinks (0.10s)
    --- PASS: TestBookMatchingBulkLink/BulkLinkBooks_InvalidUnlinkedBookID (0.16s)
    --- PASS: TestBookMatchingBulkLink/BulkLinkBooks_MultipleLinks (0.12s)
=== RUN   TestBookMatchingAutoLink
=== RUN   TestBookMatchingAutoLink/AutoLinkBooks_WithoutAuth
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 [REQUEST] {"request_id":"813035e4-9c8a-4223-aee3-6870c414dfd8","timestamp":"2026-02-10T16:47:52.566564441Z","method":"POST","path":"/api/sync/auto-link-books","headers":{"Accept-Encoding":"gzip","Content-Length":"39","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"confidence_threshold":0.8,"limit":10},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":19756,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:52.566605867Z","id":"813035e4-9c8a-4223-aee3-6870c414dfd8","remote_ip":"127.0.0.1","host":"127.0.0.1:38717","method":"POST","uri":"/api/sync/auto-link-books","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":40966,"latency_human":"40.966µs","bytes_in":39,"bytes_out":39}
{"time":"2026-02-10T16:47:52.566610155Z","id":"813035e4-9c8a-4223-aee3-6870c414dfd8","remote_ip":"127.0.0.1","host":"127.0.0.1:38717","method":"POST","uri":"/api/sync/auto-link-books","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":46186,"latency_human":"46.186µs","bytes_in":39,"bytes_out":39}
=== RUN   TestBookMatchingAutoLink/AutoLinkBooks_WithAuth_DefaultThreshold
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '4ab3b3ba-3121-42aa-be26-e17897f40811'
2026/02/10 16:47:52 [REQUEST] {"request_id":"7b955061-14a3-4bf1-9800-81a9698dd031","timestamp":"2026-02-10T16:47:52.611871428Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":59664528,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.67156485Z","id":"7b955061-14a3-4bf1-9800-81a9698dd031","remote_ip":"127.0.0.1","host":"127.0.0.1:34955","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":59690697,"latency_human":"59.690697ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.671574738Z","id":"7b955061-14a3-4bf1-9800-81a9698dd031","remote_ip":"127.0.0.1","host":"127.0.0.1:34955","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":59704252,"latency_human":"59.704252ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"f7d76047-08a0-49be-a83a-c8e85a0a384b","timestamp":"2026-02-10T16:47:52.671806538Z","method":"POST","path":"/api/sync/auto-link-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImY5YmUzY2ZkLTFkMDMtNDlkYi1hZWE0LWEzYmNjZGU1YzJhMyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.BgDVAbQ-FUTcqkMEJaAP6HSdQrEUhCxWv9dmiwLuhvI","Content-Length":"2","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2759118,"status_code":200,"response_size":31}
{"time":"2026-02-10T16:47:52.674596443Z","id":"f7d76047-08a0-49be-a83a-c8e85a0a384b","remote_ip":"127.0.0.1","host":"127.0.0.1:34955","method":"POST","uri":"/api/sync/auto-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2788512,"latency_human":"2.788512ms","bytes_in":2,"bytes_out":31}
{"time":"2026-02-10T16:47:52.674646426Z","id":"f7d76047-08a0-49be-a83a-c8e85a0a384b","remote_ip":"127.0.0.1","host":"127.0.0.1:34955","method":"POST","uri":"/api/sync/auto-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2839177,"latency_human":"2.839177ms","bytes_in":2,"bytes_out":31}
=== RUN   TestBookMatchingAutoLink/AutoLinkBooks_CustomThreshold
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '42d0ab0c-a643-459c-932a-a7cdf089686e'
2026/02/10 16:47:52 [REQUEST] {"request_id":"f88ab06d-b579-40ce-8683-32dfe3044b5e","timestamp":"2026-02-10T16:47:52.694943995Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":57626929,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.752630194Z","id":"f88ab06d-b579-40ce-8683-32dfe3044b5e","remote_ip":"127.0.0.1","host":"127.0.0.1:33025","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":57682132,"latency_human":"57.682132ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.752642607Z","id":"f88ab06d-b579-40ce-8683-32dfe3044b5e","remote_ip":"127.0.0.1","host":"127.0.0.1:33025","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":57697790,"latency_human":"57.69779ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"870fb6b0-81c0-48d5-9659-c59bdbf17964","timestamp":"2026-02-10T16:47:52.752969313Z","method":"POST","path":"/api/sync/auto-link-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU3M2E4OTJlLTc1ZmMtNGFhNC1iMWU5LTI1MWRkMjE1NTUwYiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.icykQXSsHivFXijoaBlXdtRIl6sDyBCX6fM3Cce0LtQ","Content-Length":"40","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"confidence_threshold":0.95,"limit":20},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2512219,"status_code":200,"response_size":31}
{"time":"2026-02-10T16:47:52.755503022Z","id":"870fb6b0-81c0-48d5-9659-c59bdbf17964","remote_ip":"127.0.0.1","host":"127.0.0.1:33025","method":"POST","uri":"/api/sync/auto-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2533238,"latency_human":"2.533238ms","bytes_in":40,"bytes_out":31}
{"time":"2026-02-10T16:47:52.755510576Z","id":"870fb6b0-81c0-48d5-9659-c59bdbf17964","remote_ip":"127.0.0.1","host":"127.0.0.1:33025","method":"POST","uri":"/api/sync/auto-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2542446,"latency_human":"2.542446ms","bytes_in":40,"bytes_out":31}
=== RUN   TestBookMatchingAutoLink/AutoLinkBooks_NoUnlinkedBooks
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '3ef76df9-03d1-4307-ba46-dc2c4a0360de'
2026/02/10 16:47:52 [REQUEST] {"request_id":"553a62ac-4260-4389-b3a9-8605894499f3","timestamp":"2026-02-10T16:47:52.776609481Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":57700906,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.83434434Z","id":"553a62ac-4260-4389-b3a9-8605894499f3","remote_ip":"127.0.0.1","host":"127.0.0.1:46133","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":57729199,"latency_human":"57.729199ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.834357485Z","id":"553a62ac-4260-4389-b3a9-8605894499f3","remote_ip":"127.0.0.1","host":"127.0.0.1:46133","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":57748063,"latency_human":"57.748063ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"804e0ca2-8b25-40e7-aade-5e8b37922dd1","timestamp":"2026-02-10T16:47:52.834638897Z","method":"POST","path":"/api/sync/auto-link-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjU0MjdhMjQ5LWU0MTUtNDA5NS1iZWJkLWQxOTJkNTVmOTQ4YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Q1ycPwOGjfwvUvqj52THR-D-JzEwSZw0b1xB_b0Ol6s","Content-Length":"11","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"limit":5},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2335572,"status_code":200,"response_size":31}
{"time":"2026-02-10T16:47:52.836995268Z","id":"804e0ca2-8b25-40e7-aade-5e8b37922dd1","remote_ip":"127.0.0.1","host":"127.0.0.1:46133","method":"POST","uri":"/api/sync/auto-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2355609,"latency_human":"2.355609ms","bytes_in":11,"bytes_out":31}
{"time":"2026-02-10T16:47:52.837002872Z","id":"804e0ca2-8b25-40e7-aade-5e8b37922dd1","remote_ip":"127.0.0.1","host":"127.0.0.1:46133","method":"POST","uri":"/api/sync/auto-link-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2364677,"latency_human":"2.364677ms","bytes_in":11,"bytes_out":31}
--- PASS: TestBookMatchingAutoLink (0.27s)
    --- PASS: TestBookMatchingAutoLink/AutoLinkBooks_WithoutAuth (0.00s)
    --- PASS: TestBookMatchingAutoLink/AutoLinkBooks_WithAuth_DefaultThreshold (0.11s)
    --- PASS: TestBookMatchingAutoLink/AutoLinkBooks_CustomThreshold (0.08s)
    --- PASS: TestBookMatchingAutoLink/AutoLinkBooks_NoUnlinkedBooks (0.08s)
=== RUN   TestBookMatchingSuggestions
=== RUN   TestBookMatchingSuggestions/GetUnlinkedBookSuggestions_WithoutAuth
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 [REQUEST] {"request_id":"0a468515-6950-4fb8-8fb6-1aaf3a6fd267","timestamp":"2026-02-10T16:47:52.838223686Z","method":"GET","path":"/api/sync/unlinked-books/45559ab8-3889-44ff-b488-d110751bc818/suggestions","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1884,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:52.838244675Z","id":"0a468515-6950-4fb8-8fb6-1aaf3a6fd267","remote_ip":"127.0.0.1","host":"127.0.0.1:44607","method":"GET","uri":"/api/sync/unlinked-books/45559ab8-3889-44ff-b488-d110751bc818/suggestions","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":26510,"latency_human":"26.51µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:52.838250286Z","id":"0a468515-6950-4fb8-8fb6-1aaf3a6fd267","remote_ip":"127.0.0.1","host":"127.0.0.1:44607","method":"GET","uri":"/api/sync/unlinked-books/45559ab8-3889-44ff-b488-d110751bc818/suggestions","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":32690,"latency_human":"32.69µs","bytes_in":0,"bytes_out":39}
=== RUN   TestBookMatchingSuggestions/GetUnlinkedBookSuggestions_InvalidUUID
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '9bca9a7a-5e80-4e75-8028-aaca1b042658'
2026/02/10 16:47:52 [REQUEST] {"request_id":"c3d37fc8-f1de-4934-b1c4-c550c7bce009","timestamp":"2026-02-10T16:47:52.915462542Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":61379820,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:52.976871286Z","id":"c3d37fc8-f1de-4934-b1c4-c550c7bce009","remote_ip":"127.0.0.1","host":"127.0.0.1:44501","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":61406028,"latency_human":"61.406028ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:52.976897765Z","id":"c3d37fc8-f1de-4934-b1c4-c550c7bce009","remote_ip":"127.0.0.1","host":"127.0.0.1:44501","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":61422899,"latency_human":"61.422899ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:52 [REQUEST] {"request_id":"748a8dc6-87c4-483e-9645-19bc0127f8bb","timestamp":"2026-02-10T16:47:52.977195888Z","method":"GET","path":"/api/sync/unlinked-books/invalid-uuid/suggestions","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzIsImlhdCI6MTc3MDc0MjA3MiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjA3MjVlMWRjLTcyMDItNDgzNi1hNGNhLTc4ODc3NGQwYjRjNSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Y9L1dQYkSmn2_wwPIFK-uAaPeudSIy77ZqACBrvnqew","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":38912,"status_code":400,"response_size":37}
{"time":"2026-02-10T16:47:52.977249217Z","id":"748a8dc6-87c4-483e-9645-19bc0127f8bb","remote_ip":"127.0.0.1","host":"127.0.0.1:44501","method":"GET","uri":"/api/sync/unlinked-books/invalid-uuid/suggestions","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":53509,"latency_human":"53.509µs","bytes_in":0,"bytes_out":37}
{"time":"2026-02-10T16:47:52.977255568Z","id":"748a8dc6-87c4-483e-9645-19bc0127f8bb","remote_ip":"127.0.0.1","host":"127.0.0.1:44501","method":"GET","uri":"/api/sync/unlinked-books/invalid-uuid/suggestions","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":60652,"latency_human":"60.652µs","bytes_in":0,"bytes_out":37}
=== RUN   TestBookMatchingSuggestions/GetUnlinkedBookSuggestions_BookNotFound
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:52 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '540ccd79-1e3f-4791-8be6-7826dd95262f'
2026/02/10 16:47:53 [REQUEST] {"request_id":"d02f5797-3d63-4132-baae-35f49b09d176","timestamp":"2026-02-10T16:47:53.029396412Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":54129632,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.0835457Z","id":"d02f5797-3d63-4132-baae-35f49b09d176","remote_ip":"127.0.0.1","host":"127.0.0.1:41271","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":54147114,"latency_human":"54.147114ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.083554046Z","id":"d02f5797-3d63-4132-baae-35f49b09d176","remote_ip":"127.0.0.1","host":"127.0.0.1:41271","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":54157945,"latency_human":"54.157945ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"95eb35f1-83f2-4eed-bac1-d9de5947c319","timestamp":"2026-02-10T16:47:53.08377198Z","method":"GET","path":"/api/sync/unlinked-books/c2f59119-14b5-4a71-af40-bab802e1c0b0/suggestions","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjBkOTE3ZjU1LTRmMTctNDlkZS04MDJhLWZiMmU0NTgyN2JhMiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.RDHLXblIC54X2R8uNyTKtHjoqsejZLTCgN6_WW_xMLs","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1066999,"status_code":404,"response_size":36}
{"time":"2026-02-10T16:47:53.084854488Z","id":"95eb35f1-83f2-4eed-bac1-d9de5947c319","remote_ip":"127.0.0.1","host":"127.0.0.1:41271","method":"GET","uri":"/api/sync/unlinked-books/c2f59119-14b5-4a71-af40-bab802e1c0b0/suggestions","user_agent":"Go-http-client/1.1","status":404,"error":"","latency":1081456,"latency_human":"1.081456ms","bytes_in":0,"bytes_out":36}
{"time":"2026-02-10T16:47:53.084862593Z","id":"95eb35f1-83f2-4eed-bac1-d9de5947c319","remote_ip":"127.0.0.1","host":"127.0.0.1:41271","method":"GET","uri":"/api/sync/unlinked-books/c2f59119-14b5-4a71-af40-bab802e1c0b0/suggestions","user_agent":"Go-http-client/1.1","status":404,"error":"","latency":1088138,"latency_human":"1.088138ms","bytes_in":0,"bytes_out":36}
=== RUN   TestBookMatchingSuggestions/GetUnlinkedBookSuggestions_ResponseStructure
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ad0a9b62-886c-43b1-a82c-431de69ce9be'
2026/02/10 16:47:53 [REQUEST] {"request_id":"413761fb-9a3d-4c1c-9dc8-0f90cabd0e82","timestamp":"2026-02-10T16:47:53.121170308Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":63564492,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.184752383Z","id":"413761fb-9a3d-4c1c-9dc8-0f90cabd0e82","remote_ip":"127.0.0.1","host":"127.0.0.1:37465","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":63580833,"latency_human":"63.580833ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.184758965Z","id":"413761fb-9a3d-4c1c-9dc8-0f90cabd0e82","remote_ip":"127.0.0.1","host":"127.0.0.1:37465","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":63590160,"latency_human":"63.59016ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"3a44f5f4-4c72-431f-8b3b-1ea83df0c8ff","timestamp":"2026-02-10T16:47:53.184991126Z","method":"GET","path":"/api/sync/unlinked-books/c17ce79d-ff89-414e-80d1-55ebf0992adc/suggestions","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImQ2NGM1YzU3LTc2ZTgtNDY0Yi04NzM0LTdmODM5MzA4ZDA4ZiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.-d7JXgVjHoFDvfP0_NBfnYIDMQGlT13yfzT1y2R49zo","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1110390,"status_code":404,"response_size":36}
{"time":"2026-02-10T16:47:53.186116012Z","id":"3a44f5f4-4c72-431f-8b3b-1ea83df0c8ff","remote_ip":"127.0.0.1","host":"127.0.0.1:37465","method":"GET","uri":"/api/sync/unlinked-books/c17ce79d-ff89-414e-80d1-55ebf0992adc/suggestions","user_agent":"Go-http-client/1.1","status":404,"error":"","latency":1124085,"latency_human":"1.124085ms","bytes_in":0,"bytes_out":36}
{"time":"2026-02-10T16:47:53.186120931Z","id":"3a44f5f4-4c72-431f-8b3b-1ea83df0c8ff","remote_ip":"127.0.0.1","host":"127.0.0.1:37465","method":"GET","uri":"/api/sync/unlinked-books/c17ce79d-ff89-414e-80d1-55ebf0992adc/suggestions","user_agent":"Go-http-client/1.1","status":404,"error":"","latency":1130447,"latency_human":"1.130447ms","bytes_in":0,"bytes_out":36}
--- PASS: TestBookMatchingSuggestions (0.35s)
    --- PASS: TestBookMatchingSuggestions/GetUnlinkedBookSuggestions_WithoutAuth (0.00s)
    --- PASS: TestBookMatchingSuggestions/GetUnlinkedBookSuggestions_InvalidUUID (0.14s)
    --- PASS: TestBookMatchingSuggestions/GetUnlinkedBookSuggestions_BookNotFound (0.11s)
    --- PASS: TestBookMatchingSuggestions/GetUnlinkedBookSuggestions_ResponseStructure (0.10s)
=== RUN   TestBookMatchingDeviceFileAliases
=== RUN   TestBookMatchingDeviceFileAliases/GetDeviceFileAliases_WithoutAuth
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 [REQUEST] {"request_id":"4a00e0e4-0a86-4272-bf34-82410980028d","timestamp":"2026-02-10T16:47:53.186919713Z","method":"GET","path":"/api/devices/a6992f53-d5f2-43cc-8866-8fc45faba047/file-aliases","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":4649,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:53.186944419Z","id":"4a00e0e4-0a86-4272-bf34-82410980028d","remote_ip":"127.0.0.1","host":"127.0.0.1:37541","method":"GET","uri":"/api/devices/a6992f53-d5f2-43cc-8866-8fc45faba047/file-aliases","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":24105,"latency_human":"24.105µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:53.186953606Z","id":"4a00e0e4-0a86-4272-bf34-82410980028d","remote_ip":"127.0.0.1","host":"127.0.0.1:37541","method":"GET","uri":"/api/devices/a6992f53-d5f2-43cc-8866-8fc45faba047/file-aliases","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":31528,"latency_human":"31.528µs","bytes_in":0,"bytes_out":39}
=== RUN   TestBookMatchingDeviceFileAliases/GetDeviceFileAliases_WithAuth
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ada5188c-9ebf-4c28-b407-2bd395968d42'
2026/02/10 16:47:53 [REQUEST] {"request_id":"05a8d518-3963-4b28-9c20-11a94d02d428","timestamp":"2026-02-10T16:47:53.208723315Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":58281624,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.267029213Z","id":"05a8d518-3963-4b28-9c20-11a94d02d428","remote_ip":"127.0.0.1","host":"127.0.0.1:41113","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":58318091,"latency_human":"58.318091ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.267045223Z","id":"05a8d518-3963-4b28-9c20-11a94d02d428","remote_ip":"127.0.0.1","host":"127.0.0.1:41113","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":58330394,"latency_human":"58.330394ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"22091d70-29a0-44fd-a8d9-724f3ef807d3","timestamp":"2026-02-10T16:47:53.267238532Z","method":"GET","path":"/api/devices/675b3ffa-cb30-47b8-88c8-f00e64bdba1c/file-aliases","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjZmODRiMTc3LTBkZGUtNGRmMi05MGEwLWE2YTc0ZjlhMjM4MiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.4xWYkv6Wq5fR_1go7_nnOSd4wxfmqJycdDm-3wOXNEI","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3330147,"status_code":200,"response_size":76}
{"time":"2026-02-10T16:47:53.270592954Z","id":"22091d70-29a0-44fd-a8d9-724f3ef807d3","remote_ip":"127.0.0.1","host":"127.0.0.1:41113","method":"GET","uri":"/api/devices/675b3ffa-cb30-47b8-88c8-f00e64bdba1c/file-aliases","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":3353170,"latency_human":"3.35317ms","bytes_in":0,"bytes_out":76}
{"time":"2026-02-10T16:47:53.270601119Z","id":"22091d70-29a0-44fd-a8d9-724f3ef807d3","remote_ip":"127.0.0.1","host":"127.0.0.1:41113","method":"GET","uri":"/api/devices/675b3ffa-cb30-47b8-88c8-f00e64bdba1c/file-aliases","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":3363229,"latency_human":"3.363229ms","bytes_in":0,"bytes_out":76}
=== RUN   TestBookMatchingDeviceFileAliases/CreateDeviceFileAlias_WithoutAuth
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 [REQUEST] {"request_id":"f034a1aa-499b-4019-a96e-1c6f6c8630d0","timestamp":"2026-02-10T16:47:53.271574424Z","method":"POST","path":"/api/devices/73cfa06e-6708-46b1-afbe-8f48454f715a/file-aliases","headers":{"Accept-Encoding":"gzip","Content-Length":"128","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"confidence_score":0.9,"file_path":"/mnt/sd/test.epub","file_sha256":"","media_item_id":"fe97fc23-0da1-49a8-a5fc-99ee57bff027"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":11502,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:53.271606253Z","id":"f034a1aa-499b-4019-a96e-1c6f6c8630d0","remote_ip":"127.0.0.1","host":"127.0.0.1:37945","method":"POST","uri":"/api/devices/73cfa06e-6708-46b1-afbe-8f48454f715a/file-aliases","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":31328,"latency_human":"31.328µs","bytes_in":128,"bytes_out":39}
{"time":"2026-02-10T16:47:53.271611223Z","id":"f034a1aa-499b-4019-a96e-1c6f6c8630d0","remote_ip":"127.0.0.1","host":"127.0.0.1:37945","method":"POST","uri":"/api/devices/73cfa06e-6708-46b1-afbe-8f48454f715a/file-aliases","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":36989,"latency_human":"36.989µs","bytes_in":128,"bytes_out":39}
=== RUN   TestBookMatchingDeviceFileAliases/CreateDeviceFileAlias_InvalidDeviceID
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'd9a29946-0bd5-4812-9833-27cc2c197b7a'
2026/02/10 16:47:53 [REQUEST] {"request_id":"f0ec4f30-2963-4156-acb0-e799f8c046e1","timestamp":"2026-02-10T16:47:53.305352097Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":53239671,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.358622605Z","id":"f0ec4f30-2963-4156-acb0-e799f8c046e1","remote_ip":"127.0.0.1","host":"127.0.0.1:46291","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":53260310,"latency_human":"53.26031ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.358632694Z","id":"f0ec4f30-2963-4156-acb0-e799f8c046e1","remote_ip":"127.0.0.1","host":"127.0.0.1:46291","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":53281008,"latency_human":"53.281008ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"3f8b17e7-4ba8-4dad-b6ac-fdda43947397","timestamp":"2026-02-10T16:47:53.358902244Z","method":"POST","path":"/api/devices/invalid-uuid/file-aliases","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjM0YzM0ZjU5LWIzZjQtNGY2ZC05YmQ3LTM2NDI2Yzg5N2E3YiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.95TfZznQOKsvLZPWNDwXycHaHbHeWe7alZR_oBMO-jA","Content-Length":"128","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"confidence_score":0.9,"file_path":"/mnt/sd/test.epub","file_sha256":"","media_item_id":"e1997388-a9e6-4f4e-8943-1d6e35f7930d"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":61494,"status_code":400,"response_size":30}
{"time":"2026-02-10T16:47:53.358984286Z","id":"3f8b17e7-4ba8-4dad-b6ac-fdda43947397","remote_ip":"127.0.0.1","host":"127.0.0.1:46291","method":"POST","uri":"/api/devices/invalid-uuid/file-aliases","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":81231,"latency_human":"81.231µs","bytes_in":128,"bytes_out":30}
{"time":"2026-02-10T16:47:53.358991479Z","id":"3f8b17e7-4ba8-4dad-b6ac-fdda43947397","remote_ip":"127.0.0.1","host":"127.0.0.1:46291","method":"POST","uri":"/api/devices/invalid-uuid/file-aliases","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":89846,"latency_human":"89.846µs","bytes_in":128,"bytes_out":30}
=== RUN   TestBookMatchingDeviceFileAliases/CreateDeviceFileAlias_InvalidMediaItemID
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '55e9d80f-b633-49af-ab97-3310a45b5cbc'
2026/02/10 16:47:53 [REQUEST] {"request_id":"b7645ecb-9962-45f7-a3d6-6a4f92897e35","timestamp":"2026-02-10T16:47:53.397327266Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":62737248,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.46011611Z","id":"b7645ecb-9962-45f7-a3d6-6a4f92897e35","remote_ip":"127.0.0.1","host":"127.0.0.1:37793","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":62782571,"latency_human":"62.782571ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.460135686Z","id":"b7645ecb-9962-45f7-a3d6-6a4f92897e35","remote_ip":"127.0.0.1","host":"127.0.0.1:37793","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":62809862,"latency_human":"62.809862ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"0c51d364-90dc-4281-9725-eced68a2ac26","timestamp":"2026-02-10T16:47:53.460521522Z","method":"POST","path":"/api/devices/f27c24cd-e7e8-4378-a25d-27bc7a7fb41d/file-aliases","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjFhMzM3NjQ1LTg0M2QtNDY3NS05NDgwLWY0OThjZWQxYmVlYSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.9OFm_rQ8NS5fcl-UtsxfTxsgsMBwfvy8NPlB_LS_INU","Content-Length":"104","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"confidence_score":0.9,"file_path":"/mnt/sd/test.epub","file_sha256":"","media_item_id":"invalid-uuid"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":125092,"status_code":400,"response_size":34}
{"time":"2026-02-10T16:47:53.460686999Z","id":"0c51d364-90dc-4281-9725-eced68a2ac26","remote_ip":"127.0.0.1","host":"127.0.0.1:37793","method":"POST","uri":"/api/devices/f27c24cd-e7e8-4378-a25d-27bc7a7fb41d/file-aliases","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":164846,"latency_human":"164.846µs","bytes_in":104,"bytes_out":34}
{"time":"2026-02-10T16:47:53.460697598Z","id":"0c51d364-90dc-4281-9725-eced68a2ac26","remote_ip":"127.0.0.1","host":"127.0.0.1:37793","method":"POST","uri":"/api/devices/f27c24cd-e7e8-4378-a25d-27bc7a7fb41d/file-aliases","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":177269,"latency_human":"177.269µs","bytes_in":104,"bytes_out":34}
=== RUN   TestBookMatchingDeviceFileAliases/UpdateDeviceFileAlias_InvalidAliasID
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ec8e9799-a691-4b41-ae13-f2291ccaa93b'
2026/02/10 16:47:53 [REQUEST] {"request_id":"4bfc201b-aa48-43be-bf9c-eb2d50b88e24","timestamp":"2026-02-10T16:47:53.482387049Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":65522204,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.547954677Z","id":"4bfc201b-aa48-43be-bf9c-eb2d50b88e24","remote_ip":"127.0.0.1","host":"127.0.0.1:34075","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":65557458,"latency_human":"65.557458ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.547977489Z","id":"4bfc201b-aa48-43be-bf9c-eb2d50b88e24","remote_ip":"127.0.0.1","host":"127.0.0.1:34075","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":65588517,"latency_human":"65.588517ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"b37ac936-aac0-4548-9d3e-9338662f13af","timestamp":"2026-02-10T16:47:53.548292303Z","method":"PUT","path":"/api/devices/06518f1d-2cb3-4a43-aca4-cb16b75c28b5/file-aliases/invalid-uuid","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImZlNmRlM2I1LTFmZjItNDIzZC04NDVkLTA4NTQ4NjBjZGMxOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Od74tDW3Yjt6JZcxCGzqZzs-OqbQ1t5y8TD99w1gZoE","Content-Length":"25","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"confidence_score":0.95},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":47168,"status_code":400,"response_size":29}
{"time":"2026-02-10T16:47:53.548353747Z","id":"b37ac936-aac0-4548-9d3e-9338662f13af","remote_ip":"127.0.0.1","host":"127.0.0.1:34075","method":"PUT","uri":"/api/devices/06518f1d-2cb3-4a43-aca4-cb16b75c28b5/file-aliases/invalid-uuid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":61394,"latency_human":"61.394µs","bytes_in":25,"bytes_out":29}
{"time":"2026-02-10T16:47:53.548357314Z","id":"b37ac936-aac0-4548-9d3e-9338662f13af","remote_ip":"127.0.0.1","host":"127.0.0.1:34075","method":"PUT","uri":"/api/devices/06518f1d-2cb3-4a43-aca4-cb16b75c28b5/file-aliases/invalid-uuid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":65752,"latency_human":"65.752µs","bytes_in":25,"bytes_out":29}
=== RUN   TestBookMatchingDeviceFileAliases/DeleteDeviceFileAlias_InvalidAliasID
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '04b1ec83-5d40-4e81-9881-a8c60c68fbb1'
2026/02/10 16:47:53 [REQUEST] {"request_id":"79bf334d-67b9-46bb-8edc-a832e77bd6f2","timestamp":"2026-02-10T16:47:53.578208994Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49071710,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.627300481Z","id":"79bf334d-67b9-46bb-8edc-a832e77bd6f2","remote_ip":"127.0.0.1","host":"127.0.0.1:36623","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49088852,"latency_human":"49.088852ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.627307925Z","id":"79bf334d-67b9-46bb-8edc-a832e77bd6f2","remote_ip":"127.0.0.1","host":"127.0.0.1:36623","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49098911,"latency_human":"49.098911ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"dd6305fe-e610-4728-9665-025eb4b60c68","timestamp":"2026-02-10T16:47:53.627473061Z","method":"DELETE","path":"/api/devices/6b6d8842-1cc7-4596-8aae-0015707a27c9/file-aliases/invalid-uuid","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjQ5NzFhYjgzLTMyNWMtNDE1My04ZDliLTMxNTA0YmUwN2Q3OSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Ff_pGWh6kMaU9RMxa55ymhxE-KRwX02fWdyx_6i57uM","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":30276,"status_code":400,"response_size":29}
{"time":"2026-02-10T16:47:53.627512314Z","id":"dd6305fe-e610-4728-9665-025eb4b60c68","remote_ip":"127.0.0.1","host":"127.0.0.1:36623","method":"DELETE","uri":"/api/devices/6b6d8842-1cc7-4596-8aae-0015707a27c9/file-aliases/invalid-uuid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":39303,"latency_human":"39.303µs","bytes_in":0,"bytes_out":29}
{"time":"2026-02-10T16:47:53.62751561Z","id":"dd6305fe-e610-4728-9665-025eb4b60c68","remote_ip":"127.0.0.1","host":"127.0.0.1:36623","method":"DELETE","uri":"/api/devices/6b6d8842-1cc7-4596-8aae-0015707a27c9/file-aliases/invalid-uuid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":44343,"latency_human":"44.343µs","bytes_in":0,"bytes_out":29}
--- PASS: TestBookMatchingDeviceFileAliases (0.44s)
    --- PASS: TestBookMatchingDeviceFileAliases/GetDeviceFileAliases_WithoutAuth (0.00s)
    --- PASS: TestBookMatchingDeviceFileAliases/GetDeviceFileAliases_WithAuth (0.08s)
    --- PASS: TestBookMatchingDeviceFileAliases/CreateDeviceFileAlias_WithoutAuth (0.00s)
    --- PASS: TestBookMatchingDeviceFileAliases/CreateDeviceFileAlias_InvalidDeviceID (0.09s)
    --- PASS: TestBookMatchingDeviceFileAliases/CreateDeviceFileAlias_InvalidMediaItemID (0.10s)
    --- PASS: TestBookMatchingDeviceFileAliases/UpdateDeviceFileAlias_InvalidAliasID (0.09s)
    --- PASS: TestBookMatchingDeviceFileAliases/DeleteDeviceFileAlias_InvalidAliasID (0.08s)
=== RUN   TestBookMatchingGetBookMatches
=== RUN   TestBookMatchingGetBookMatches/GetBookMatches_WithoutAuth
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 [REQUEST] {"request_id":"858b771a-2235-4481-bb2d-fa7f41afa3c4","timestamp":"2026-02-10T16:47:53.628557312Z","method":"GET","path":"/api/books/match","query_params":{"title":"Test"},"headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":5961,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:53.628578892Z","id":"858b771a-2235-4481-bb2d-fa7f41afa3c4","remote_ip":"127.0.0.1","host":"127.0.0.1:40745","method":"GET","uri":"/api/books/match?title=Test","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":20979,"latency_human":"20.979µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:53.628583591Z","id":"858b771a-2235-4481-bb2d-fa7f41afa3c4","remote_ip":"127.0.0.1","host":"127.0.0.1:40745","method":"GET","uri":"/api/books/match?title=Test","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":25768,"latency_human":"25.768µs","bytes_in":0,"bytes_out":39}
=== RUN   TestBookMatchingGetBookMatches/GetBookMatches_WithAuth_ByTitle
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '646ee7c7-09af-4123-9fe5-8a7733feb3ed'
2026/02/10 16:47:53 [REQUEST] {"request_id":"fd0de0a0-642d-4aab-81cf-8c265607898d","timestamp":"2026-02-10T16:47:53.648358951Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50268921,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.698648109Z","id":"fd0de0a0-642d-4aab-81cf-8c265607898d","remote_ip":"127.0.0.1","host":"127.0.0.1:39705","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50285492,"latency_human":"50.285492ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.698660583Z","id":"fd0de0a0-642d-4aab-81cf-8c265607898d","remote_ip":"127.0.0.1","host":"127.0.0.1:39705","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50301561,"latency_human":"50.301561ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"2a18cc70-bed7-40d7-a4c2-84b69a71d9ab","timestamp":"2026-02-10T16:47:53.698932818Z","method":"GET","path":"/api/books/match","query_params":{"title":"Test"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImZmMTZlMzA2LTYyMWYtNDk3Yy04YTY0LWJkMzdmMTc2MmNlOCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.91f28l5GbuBcWx2wXuSPQiItGm3U0MZpLjIfnu9k4wE","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":4365427,"status_code":200,"response_size":37}
{"time":"2026-02-10T16:47:53.703315397Z","id":"2a18cc70-bed7-40d7-a4c2-84b69a71d9ab","remote_ip":"127.0.0.1","host":"127.0.0.1:39705","method":"GET","uri":"/api/books/match?title=Test","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":4381257,"latency_human":"4.381257ms","bytes_in":0,"bytes_out":37}
{"time":"2026-02-10T16:47:53.703320977Z","id":"2a18cc70-bed7-40d7-a4c2-84b69a71d9ab","remote_ip":"127.0.0.1","host":"127.0.0.1:39705","method":"GET","uri":"/api/books/match?title=Test","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":4388050,"latency_human":"4.38805ms","bytes_in":0,"bytes_out":37}
=== RUN   TestBookMatchingGetBookMatches/GetBookMatches_InvalidFileSize
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '980c7a14-5391-4378-813c-aafe03add1c0'
2026/02/10 16:47:53 [REQUEST] {"request_id":"0436bcb0-cca5-40c6-bf21-d0c0ec40831c","timestamp":"2026-02-10T16:47:53.722988277Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50561544,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.773569397Z","id":"0436bcb0-cca5-40c6-bf21-d0c0ec40831c","remote_ip":"127.0.0.1","host":"127.0.0.1:39017","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50577914,"latency_human":"50.577914ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.773575338Z","id":"0436bcb0-cca5-40c6-bf21-d0c0ec40831c","remote_ip":"127.0.0.1","host":"127.0.0.1:39017","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50587752,"latency_human":"50.587752ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"2841c36f-630b-4a67-802e-78437119f1c4","timestamp":"2026-02-10T16:47:53.773736777Z","method":"GET","path":"/api/books/match","query_params":{"file_size":"invalid","title":"Test"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkyYmIzM2I0LTU5MDAtNGUwMS1iZDAzLWJjNzU1MDljNTJmNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.qBNuW712q4gpHDDqtEqgXMBMCafi6Y86ovDbJkXP9Ss","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":38031,"status_code":400,"response_size":40}
{"time":"2026-02-10T16:47:53.773784356Z","id":"2841c36f-630b-4a67-802e-78437119f1c4","remote_ip":"127.0.0.1","host":"127.0.0.1:39017","method":"GET","uri":"/api/books/match?title=Test&file_size=invalid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":47258,"latency_human":"47.258µs","bytes_in":0,"bytes_out":40}
{"time":"2026-02-10T16:47:53.773787361Z","id":"2841c36f-630b-4a67-802e-78437119f1c4","remote_ip":"127.0.0.1","host":"127.0.0.1:39017","method":"GET","uri":"/api/books/match?title=Test&file_size=invalid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":51105,"latency_human":"51.105µs","bytes_in":0,"bytes_out":40}
=== RUN   TestBookMatchingGetBookMatches/GetBookMatches_MultipleIdentifiers
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '4cf9a7e6-a77b-4584-87f3-4da6156c00f5'
2026/02/10 16:47:53 [REQUEST] {"request_id":"7e627f4a-901a-45e4-887f-85a50289f270","timestamp":"2026-02-10T16:47:53.794013898Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50493127,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.844537882Z","id":"7e627f4a-901a-45e4-887f-85a50289f270","remote_ip":"127.0.0.1","host":"127.0.0.1:45333","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50520147,"latency_human":"50.520147ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.844546298Z","id":"7e627f4a-901a-45e4-887f-85a50289f270","remote_ip":"127.0.0.1","host":"127.0.0.1:45333","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50532290,"latency_human":"50.53229ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"0be76ff9-b913-4175-9020-229d91f308df","timestamp":"2026-02-10T16:47:53.844807202Z","method":"GET","path":"/api/books/match","query_params":{"identifier":"id1","title":"Test"},"headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjQyOTU1NjI5LWQyZmYtNGYzMy05YjhkLWNmYmU2ODYyYjg0YiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.iH1_KIYFwe0PuYsgOv8HgqX4JFPKcXzc2QEGx0Mq6Uk","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":4615541,"status_code":200,"response_size":37}
{"time":"2026-02-10T16:47:53.849447208Z","id":"0be76ff9-b913-4175-9020-229d91f308df","remote_ip":"127.0.0.1","host":"127.0.0.1:45333","method":"GET","uri":"/api/books/match?identifier=id1&identifier=id2&title=Test","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":4638654,"latency_human":"4.638654ms","bytes_in":0,"bytes_out":37}
{"time":"2026-02-10T16:47:53.849456626Z","id":"0be76ff9-b913-4175-9020-229d91f308df","remote_ip":"127.0.0.1","host":"127.0.0.1:45333","method":"GET","uri":"/api/books/match?identifier=id1&identifier=id2&title=Test","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":4650907,"latency_human":"4.650907ms","bytes_in":0,"bytes_out":37}
--- PASS: TestBookMatchingGetBookMatches (0.22s)
    --- PASS: TestBookMatchingGetBookMatches/GetBookMatches_WithoutAuth (0.00s)
    --- PASS: TestBookMatchingGetBookMatches/GetBookMatches_WithAuth_ByTitle (0.07s)
    --- PASS: TestBookMatchingGetBookMatches/GetBookMatches_InvalidFileSize (0.07s)
    --- PASS: TestBookMatchingGetBookMatches/GetBookMatches_MultipleIdentifiers (0.08s)
=== RUN   TestCollectionsBulkOperations
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_WithoutAuth
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 [REQUEST] {"request_id":"87e1a82d-ada3-41c6-a6d3-eab0cef33ddf","timestamp":"2026-02-10T16:47:53.850347919Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Content-Length":"125","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[{"book_ids":["cccada95-160d-473e-be7b-6121d04e42e0"],"collection_id":"eacd8bb9-469f-403b-9461-9c111a569925"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":10770,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:53.850392562Z","id":"87e1a82d-ada3-41c6-a6d3-eab0cef33ddf","remote_ip":"127.0.0.1","host":"127.0.0.1:38789","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":49171,"latency_human":"49.171µs","bytes_in":125,"bytes_out":39}
{"time":"2026-02-10T16:47:53.850396699Z","id":"87e1a82d-ada3-41c6-a6d3-eab0cef33ddf","remote_ip":"127.0.0.1","host":"127.0.0.1:38789","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":55794,"latency_human":"55.794µs","bytes_in":125,"bytes_out":39}
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_EmptyOperations
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '6f8daf00-6535-4afb-90a9-0aae2916b6c2'
2026/02/10 16:47:53 [REQUEST] {"request_id":"4991d0ec-0531-42fc-af4f-f478d57f9402","timestamp":"2026-02-10T16:47:53.870958068Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":54096961,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.925096977Z","id":"4991d0ec-0531-42fc-af4f-f478d57f9402","remote_ip":"127.0.0.1","host":"127.0.0.1:44075","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":54134360,"latency_human":"54.13436ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.925126241Z","id":"4991d0ec-0531-42fc-af4f-f478d57f9402","remote_ip":"127.0.0.1","host":"127.0.0.1:44075","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":54158175,"latency_human":"54.158175ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:53 [REQUEST] {"request_id":"366afdf9-b814-41d0-92c7-8bcbfe100540","timestamp":"2026-02-10T16:47:53.925444361Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImJlNWU4NmQ0LTE4M2UtNDQ3ZC04MmRkLTI1MzgzMTdjZGIxOCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.BanKfNuHBjfP9zIki336bCDIwcEEaIIxPEhrd-H_0fM","Content-Length":"17","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":85018,"status_code":400,"response_size":32}
{"time":"2026-02-10T16:47:53.925553774Z","id":"366afdf9-b814-41d0-92c7-8bcbfe100540","remote_ip":"127.0.0.1","host":"127.0.0.1:44075","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":109323,"latency_human":"109.323µs","bytes_in":17,"bytes_out":32}
{"time":"2026-02-10T16:47:53.925560757Z","id":"366afdf9-b814-41d0-92c7-8bcbfe100540","remote_ip":"127.0.0.1","host":"127.0.0.1:44075","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":117228,"latency_human":"117.228µs","bytes_in":17,"bytes_out":32}
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_InvalidCollectionID
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:53 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '15c349f1-2f5c-4e2b-aa0c-4f183475c8d2'
2026/02/10 16:47:53 [REQUEST] {"request_id":"c546b450-ada1-4f01-a6bc-fcadd178887c","timestamp":"2026-02-10T16:47:53.944040354Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":52038483,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:53.996126626Z","id":"c546b450-ada1-4f01-a6bc-fcadd178887c","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52078818,"latency_human":"52.078818ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:53.996159196Z","id":"c546b450-ada1-4f01-a6bc-fcadd178887c","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52118121,"latency_human":"52.118121ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"180c2168-8be0-49ac-8972-a1533fa800ff","timestamp":"2026-02-10T16:47:53.99672736Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjcwODljOGQ0LWZlODEtNGU3NC1iY2EwLTNhYjI1MGNkZWY1NCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.n8hsPRNlXueuUuz5llCTKNFMQ2jaXCtnpa5Wmv7Fo_I","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3670568,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:54.00043123Z","id":"180c2168-8be0-49ac-8972-a1533fa800ff","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3691968,"latency_human":"3.691968ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:54.000440557Z","id":"180c2168-8be0-49ac-8972-a1533fa800ff","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3712957,"latency_human":"3.712957ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:54 [REQUEST] {"request_id":"20338c3e-f147-4a71-bd44-e983c0d3d4e1","timestamp":"2026-02-10T16:47:54.000718092Z","method":"POST","path":"/api/libraries/8ed64b45-a818-45a3-aebc-4af3c25f3797/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjcwODljOGQ0LWZlODEtNGU3NC1iY2EwLTNhYjI1MGNkZWY1NCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.n8hsPRNlXueuUuz5llCTKNFMQ2jaXCtnpa5Wmv7Fo_I","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3055288,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:54.003790892Z","id":"20338c3e-f147-4a71-bd44-e983c0d3d4e1","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/libraries/8ed64b45-a818-45a3-aebc-4af3c25f3797/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3072449,"latency_human":"3.072449ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:54.003798436Z","id":"20338c3e-f147-4a71-bd44-e983c0d3d4e1","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/libraries/8ed64b45-a818-45a3-aebc-4af3c25f3797/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3081085,"latency_human":"3.081085ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:54 [REQUEST] {"request_id":"99f05bda-8aa7-408c-ac68-db02efa688fc","timestamp":"2026-02-10T16:47:54.004066032Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjcwODljOGQ0LWZlODEtNGU3NC1iY2EwLTNhYjI1MGNkZWY1NCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.n8hsPRNlXueuUuz5llCTKNFMQ2jaXCtnpa5Wmv7Fo_I","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"8ed64b45-a818-45a3-aebc-4af3c25f3797","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":6398889,"status_code":201,"response_size":1043}
{"time":"2026-02-10T16:47:54.010488866Z","id":"99f05bda-8aa7-408c-ac68-db02efa688fc","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":6421842,"latency_human":"6.421842ms","bytes_in":183,"bytes_out":1043}
{"time":"2026-02-10T16:47:54.010495989Z","id":"99f05bda-8aa7-408c-ac68-db02efa688fc","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":6430557,"latency_human":"6.430557ms","bytes_in":183,"bytes_out":1043}
2026/02/10 16:47:54 [REQUEST] {"request_id":"d8ef9d50-d374-4e55-9ab3-e398123154a7","timestamp":"2026-02-10T16:47:54.010773984Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzMsImlhdCI6MTc3MDc0MjA3MywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjcwODljOGQ0LWZlODEtNGU3NC1iY2EwLTNhYjI1MGNkZWY1NCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.n8hsPRNlXueuUuz5llCTKNFMQ2jaXCtnpa5Wmv7Fo_I","Content-Length":"101","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[{"book_ids":["40d1934d-27e4-44a3-acc6-a4b36e3cca76"],"collection_id":"invalid-uuid"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":68057,"status_code":200,"response_size":131}
{"time":"2026-02-10T16:47:54.010860074Z","id":"d8ef9d50-d374-4e55-9ab3-e398123154a7","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":86129,"latency_human":"86.129µs","bytes_in":101,"bytes_out":131}
{"time":"2026-02-10T16:47:54.010866316Z","id":"d8ef9d50-d374-4e55-9ab3-e398123154a7","remote_ip":"127.0.0.1","host":"127.0.0.1:37375","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":94235,"latency_human":"94.235µs","bytes_in":101,"bytes_out":131}
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_InvalidBookID
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'e6b5cf68-c914-4ded-92e4-e6842aec8452'
2026/02/10 16:47:54 [REQUEST] {"request_id":"d1c3d344-4c58-466d-a047-327bc259a1ac","timestamp":"2026-02-10T16:47:54.033051075Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48712544,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.081800157Z","id":"d1c3d344-4c58-466d-a047-327bc259a1ac","remote_ip":"127.0.0.1","host":"127.0.0.1:42927","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48741759,"latency_human":"48.741759ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.081820375Z","id":"d1c3d344-4c58-466d-a047-327bc259a1ac","remote_ip":"127.0.0.1","host":"127.0.0.1:42927","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48766243,"latency_human":"48.766243ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"c78b3f66-705c-4e1c-8354-228a4559a73c","timestamp":"2026-02-10T16:47:54.082071641Z","method":"POST","path":"/api/collections","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk0MjE3ZmFhLTZkMjktNDAzOS04MTYyLTRkNmRhMTBhZWY1MSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.gOQWCnOEpg8zMmisNqdtHZPZgR70DXTnssDxVXT-fJI","Content-Length":"60","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test collection","name":"Test Collection"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2907122,"status_code":201,"response_size":288}
{"time":"2026-02-10T16:47:54.08499871Z","id":"c78b3f66-705c-4e1c-8354-228a4559a73c","remote_ip":"127.0.0.1","host":"127.0.0.1:42927","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2925667,"latency_human":"2.925667ms","bytes_in":60,"bytes_out":288}
{"time":"2026-02-10T16:47:54.085006384Z","id":"c78b3f66-705c-4e1c-8354-228a4559a73c","remote_ip":"127.0.0.1","host":"127.0.0.1:42927","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2934824,"latency_human":"2.934824ms","bytes_in":60,"bytes_out":288}
2026/02/10 16:47:54 [REQUEST] {"request_id":"c7b65948-ec44-466c-abb2-92f06549aa31","timestamp":"2026-02-10T16:47:54.08517123Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk0MjE3ZmFhLTZkMjktNDAzOS04MTYyLTRkNmRhMTBhZWY1MSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.gOQWCnOEpg8zMmisNqdtHZPZgR70DXTnssDxVXT-fJI","Content-Length":"101","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[{"book_ids":["invalid-uuid"],"collection_id":"e6f95f65-717a-4313-9df7-92205c8a55ad"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":66834,"status_code":200,"response_size":174}
{"time":"2026-02-10T16:47:54.085254595Z","id":"c7b65948-ec44-466c-abb2-92f06549aa31","remote_ip":"127.0.0.1","host":"127.0.0.1:42927","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":83455,"latency_human":"83.455µs","bytes_in":101,"bytes_out":174}
{"time":"2026-02-10T16:47:54.085259243Z","id":"c7b65948-ec44-466c-abb2-92f06549aa31","remote_ip":"127.0.0.1","host":"127.0.0.1:42927","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":88955,"latency_human":"88.955µs","bytes_in":101,"bytes_out":174}
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_SingleOperation
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '8ca861b7-b493-4df3-8156-f78cc1296831'
2026/02/10 16:47:54 [REQUEST] {"request_id":"795aabdf-57bb-49c3-816c-7d9bf8b83f91","timestamp":"2026-02-10T16:47:54.105851819Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49182626,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.155053651Z","id":"795aabdf-57bb-49c3-816c-7d9bf8b83f91","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49197263,"latency_human":"49.197263ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.155062788Z","id":"795aabdf-57bb-49c3-816c-7d9bf8b83f91","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49209115,"latency_human":"49.209115ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"02881221-4f65-41d5-bad5-c0b6cf16fcdd","timestamp":"2026-02-10T16:47:54.155276354Z","method":"POST","path":"/api/collections","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3NGY2MjhkLWY5NzQtNDMzOC05ZjlhLTk5NmE0Zjk5YzY4MyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.0cKiLnY5lFC6xrAJ4r0GON_YHOaJQE47xd2oO6SVaRw","Content-Length":"60","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test collection","name":"Test Collection"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2874672,"status_code":201,"response_size":288}
{"time":"2026-02-10T16:47:54.158163569Z","id":"02881221-4f65-41d5-bad5-c0b6cf16fcdd","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2887195,"latency_human":"2.887195ms","bytes_in":60,"bytes_out":288}
{"time":"2026-02-10T16:47:54.158167897Z","id":"02881221-4f65-41d5-bad5-c0b6cf16fcdd","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2893107,"latency_human":"2.893107ms","bytes_in":60,"bytes_out":288}
2026/02/10 16:47:54 [REQUEST] {"request_id":"a0bc41c3-e0e9-4594-8336-348349950a7d","timestamp":"2026-02-10T16:47:54.158330188Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3NGY2MjhkLWY5NzQtNDMzOC05ZjlhLTk5NmE0Zjk5YzY4MyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.0cKiLnY5lFC6xrAJ4r0GON_YHOaJQE47xd2oO6SVaRw","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2703104,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:54.161050153Z","id":"a0bc41c3-e0e9-4594-8336-348349950a7d","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2718973,"latency_human":"2.718973ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:54.161056295Z","id":"a0bc41c3-e0e9-4594-8336-348349950a7d","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2726006,"latency_human":"2.726006ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:54 [REQUEST] {"request_id":"8bb705de-724f-4a9f-8ab6-6f6ef2b6bb0a","timestamp":"2026-02-10T16:47:54.161275261Z","method":"POST","path":"/api/libraries/f5c43a17-f704-4fb3-9bf9-8e0fd37386fc/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3NGY2MjhkLWY5NzQtNDMzOC05ZjlhLTk5NmE0Zjk5YzY4MyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.0cKiLnY5lFC6xrAJ4r0GON_YHOaJQE47xd2oO6SVaRw","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3186200,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:54.164526171Z","id":"8bb705de-724f-4a9f-8ab6-6f6ef2b6bb0a","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/libraries/f5c43a17-f704-4fb3-9bf9-8e0fd37386fc/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3250079,"latency_human":"3.250079ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:54.164535919Z","id":"8bb705de-724f-4a9f-8ab6-6f6ef2b6bb0a","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/libraries/f5c43a17-f704-4fb3-9bf9-8e0fd37386fc/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3260478,"latency_human":"3.260478ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:54 [REQUEST] {"request_id":"a2e5b8bf-34ab-40dc-98a0-eba6fc64006a","timestamp":"2026-02-10T16:47:54.165115504Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3NGY2MjhkLWY5NzQtNDMzOC05ZjlhLTk5NmE0Zjk5YzY4MyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.0cKiLnY5lFC6xrAJ4r0GON_YHOaJQE47xd2oO6SVaRw","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"f5c43a17-f704-4fb3-9bf9-8e0fd37386fc","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":6425278,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:54.171560629Z","id":"a2e5b8bf-34ab-40dc-98a0-eba6fc64006a","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":6445356,"latency_human":"6.445356ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:54.171566239Z","id":"a2e5b8bf-34ab-40dc-98a0-eba6fc64006a","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":6453180,"latency_human":"6.45318ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:54 [REQUEST] {"request_id":"48c7b4e8-1598-4091-b5fc-c87cf4c527ff","timestamp":"2026-02-10T16:47:54.171731175Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3NGY2MjhkLWY5NzQtNDMzOC05ZjlhLTk5NmE0Zjk5YzY4MyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.0cKiLnY5lFC6xrAJ4r0GON_YHOaJQE47xd2oO6SVaRw","Content-Length":"125","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[{"book_ids":["ec5c7839-678b-4654-902a-4703fcb03b27"],"collection_id":"7df5b457-caa2-4f10-9925-65adc5cf6f8b"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2616002,"status_code":200,"response_size":172}
{"time":"2026-02-10T16:47:54.17437579Z","id":"48c7b4e8-1598-4091-b5fc-c87cf4c527ff","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2644325,"latency_human":"2.644325ms","bytes_in":125,"bytes_out":172}
{"time":"2026-02-10T16:47:54.174382162Z","id":"48c7b4e8-1598-4091-b5fc-c87cf4c527ff","remote_ip":"127.0.0.1","host":"127.0.0.1:37409","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2651368,"latency_human":"2.651368ms","bytes_in":125,"bytes_out":172}
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_MultipleBooksSingleCollection
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'c93bfc81-da8b-4bb4-8c46-31f45e7fc41c'
2026/02/10 16:47:54 [REQUEST] {"request_id":"2073dc80-70f5-4486-8e26-7382932d926b","timestamp":"2026-02-10T16:47:54.198385705Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50047731,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.248477357Z","id":"2073dc80-70f5-4486-8e26-7382932d926b","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50084660,"latency_human":"50.08466ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.248504147Z","id":"2073dc80-70f5-4486-8e26-7382932d926b","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50105619,"latency_human":"50.105619ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"892687f5-b165-4320-9b2b-c3dc35df3ec3","timestamp":"2026-02-10T16:47:54.248796579Z","method":"POST","path":"/api/collections","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"60","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test collection","name":"Test Collection"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2426721,"status_code":201,"response_size":288}
{"time":"2026-02-10T16:47:54.251237176Z","id":"892687f5-b165-4320-9b2b-c3dc35df3ec3","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2440547,"latency_human":"2.440547ms","bytes_in":60,"bytes_out":288}
{"time":"2026-02-10T16:47:54.251240763Z","id":"892687f5-b165-4320-9b2b-c3dc35df3ec3","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2444725,"latency_human":"2.444725ms","bytes_in":60,"bytes_out":288}
2026/02/10 16:47:54 [REQUEST] {"request_id":"5bcb7240-68b2-48c9-b3a5-f05d0cd720f7","timestamp":"2026-02-10T16:47:54.251348673Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3599006,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:54.254959801Z","id":"5bcb7240-68b2-48c9-b3a5-f05d0cd720f7","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3610366,"latency_human":"3.610366ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:54.254964099Z","id":"5bcb7240-68b2-48c9-b3a5-f05d0cd720f7","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3615526,"latency_human":"3.615526ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:54 [REQUEST] {"request_id":"ba778870-dd3a-42e4-981d-df59169426d2","timestamp":"2026-02-10T16:47:54.255132792Z","method":"POST","path":"/api/libraries/930fe55d-ea60-4a4b-9eae-9f97bd31350c/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2976351,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:54.258123299Z","id":"ba778870-dd3a-42e4-981d-df59169426d2","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries/930fe55d-ea60-4a4b-9eae-9f97bd31350c/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2990417,"latency_human":"2.990417ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:54.258128579Z","id":"ba778870-dd3a-42e4-981d-df59169426d2","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries/930fe55d-ea60-4a4b-9eae-9f97bd31350c/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2996628,"latency_human":"2.996628ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:54 [REQUEST] {"request_id":"82fe7b08-8ce1-4bfd-ac4c-503864234e58","timestamp":"2026-02-10T16:47:54.258440728Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"930fe55d-ea60-4a4b-9eae-9f97bd31350c","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":6932869,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:54.265399495Z","id":"82fe7b08-8ce1-4bfd-ac4c-503864234e58","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":6958597,"latency_human":"6.958597ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:54.265404775Z","id":"82fe7b08-8ce1-4bfd-ac4c-503864234e58","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":6964548,"latency_human":"6.964548ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:54 [REQUEST] {"request_id":"a89b7ec8-c210-47ed-9816-a03333d471d4","timestamp":"2026-02-10T16:47:54.265598785Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2335883,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:54.267948934Z","id":"a89b7ec8-c210-47ed-9816-a03333d471d4","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2349007,"latency_human":"2.349007ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:54.267953482Z","id":"a89b7ec8-c210-47ed-9816-a03333d471d4","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2354848,"latency_human":"2.354848ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:54 [REQUEST] {"request_id":"f5609350-725e-4e26-8b9e-7dd2a06cbb12","timestamp":"2026-02-10T16:47:54.268071181Z","method":"POST","path":"/api/libraries/39ced777-4cb9-4f2f-90d0-cd6ff45ec902/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2379724,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:54.270472685Z","id":"f5609350-725e-4e26-8b9e-7dd2a06cbb12","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries/39ced777-4cb9-4f2f-90d0-cd6ff45ec902/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2401394,"latency_human":"2.401394ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:54.270476282Z","id":"f5609350-725e-4e26-8b9e-7dd2a06cbb12","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries/39ced777-4cb9-4f2f-90d0-cd6ff45ec902/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2405672,"latency_human":"2.405672ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:54 [REQUEST] {"request_id":"f3cdb694-6e77-4c57-81a7-fb8e182d9f50","timestamp":"2026-02-10T16:47:54.270662778Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"39ced777-4cb9-4f2f-90d0-cd6ff45ec902","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3491416,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:54.274178339Z","id":"f3cdb694-6e77-4c57-81a7-fb8e182d9f50","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3515050,"latency_human":"3.51505ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:54.274193096Z","id":"f3cdb694-6e77-4c57-81a7-fb8e182d9f50","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3530819,"latency_human":"3.530819ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:54 [REQUEST] {"request_id":"13ec6742-9239-43f3-bb14-ec65e44f395a","timestamp":"2026-02-10T16:47:54.274446065Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2507501,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:54.27697159Z","id":"13ec6742-9239-43f3-bb14-ec65e44f395a","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2525113,"latency_human":"2.525113ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:54.276985115Z","id":"13ec6742-9239-43f3-bb14-ec65e44f395a","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2539430,"latency_human":"2.53943ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:54 [REQUEST] {"request_id":"1a440c50-a8fb-4366-ad3f-d54e19bd5f03","timestamp":"2026-02-10T16:47:54.277160149Z","method":"POST","path":"/api/libraries/74bc96ea-6a5e-4035-ae9c-56e839be60d8/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2136964,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:54.279472528Z","id":"1a440c50-a8fb-4366-ad3f-d54e19bd5f03","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries/74bc96ea-6a5e-4035-ae9c-56e839be60d8/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2311828,"latency_human":"2.311828ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:54.279479902Z","id":"1a440c50-a8fb-4366-ad3f-d54e19bd5f03","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/libraries/74bc96ea-6a5e-4035-ae9c-56e839be60d8/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2319993,"latency_human":"2.319993ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:54 [REQUEST] {"request_id":"0754b7fc-90a6-4887-a847-e6b00b4080f0","timestamp":"2026-02-10T16:47:54.280031726Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"74bc96ea-6a5e-4035-ae9c-56e839be60d8","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3683292,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:54.283739924Z","id":"0754b7fc-90a6-4887-a847-e6b00b4080f0","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3707025,"latency_human":"3.707025ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:54.283746376Z","id":"0754b7fc-90a6-4887-a847-e6b00b4080f0","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3715531,"latency_human":"3.715531ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:54 [REQUEST] {"request_id":"ac463606-d88c-42c4-83d6-785e4efbfa6d","timestamp":"2026-02-10T16:47:54.284060538Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU1NGYwOTU3LTBmODItNDIxMi05Mjk2LWMzNmQyOTZjYWNiOSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.AwDzC-TsyFFZSK95otJZtH36jxJZMYyl1ZeVhzAWFTA","Content-Length":"203","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[{"book_ids":["ad16f885-0e28-406f-b127-50195afc3623","9d051459-f626-43bf-ba3d-58dda0fb766e","baad5825-08ee-4a42-91ed-4a408a9f0064"],"collection_id":"0b18fbf2-d0a0-4d54-b725-5dc0473256e7"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":7247133,"status_code":200,"response_size":422}
{"time":"2026-02-10T16:47:54.291337416Z","id":"ac463606-d88c-42c4-83d6-785e4efbfa6d","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":7276207,"latency_human":"7.276207ms","bytes_in":203,"bytes_out":422}
{"time":"2026-02-10T16:47:54.291345281Z","id":"ac463606-d88c-42c4-83d6-785e4efbfa6d","remote_ip":"127.0.0.1","host":"127.0.0.1:39553","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":7285674,"latency_human":"7.285674ms","bytes_in":203,"bytes_out":422}
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_MultipleCollections
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ae2d5706-f117-498c-835b-7d225567b876'
2026/02/10 16:47:54 [REQUEST] {"request_id":"7524c3f5-8fd1-4307-99dc-ee270fa27758","timestamp":"2026-02-10T16:47:54.31344909Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49072452,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.36254758Z","id":"7524c3f5-8fd1-4307-99dc-ee270fa27758","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49096056,"latency_human":"49.096056ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.362559352Z","id":"7524c3f5-8fd1-4307-99dc-ee270fa27758","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49106675,"latency_human":"49.106675ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"b8af714c-bfd5-4cc5-8e1c-3ee6a735777e","timestamp":"2026-02-10T16:47:54.36309196Z","method":"POST","path":"/api/collections","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"66","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"First test collection","name":"Test Collection 1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3212398,"status_code":201,"response_size":294}
{"time":"2026-02-10T16:47:54.36633194Z","id":"b8af714c-bfd5-4cc5-8e1c-3ee6a735777e","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3239108,"latency_human":"3.239108ms","bytes_in":66,"bytes_out":294}
{"time":"2026-02-10T16:47:54.366339965Z","id":"b8af714c-bfd5-4cc5-8e1c-3ee6a735777e","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3248275,"latency_human":"3.248275ms","bytes_in":66,"bytes_out":294}
2026/02/10 16:47:54 [REQUEST] {"request_id":"771ea115-a960-48d1-b21c-a365c4860aaa","timestamp":"2026-02-10T16:47:54.366555725Z","method":"POST","path":"/api/collections","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"67","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"Second test collection","name":"Test Collection 2"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2411523,"status_code":201,"response_size":294}
{"time":"2026-02-10T16:47:54.368982085Z","id":"771ea115-a960-48d1-b21c-a365c4860aaa","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2425369,"latency_human":"2.425369ms","bytes_in":67,"bytes_out":294}
{"time":"2026-02-10T16:47:54.368986764Z","id":"771ea115-a960-48d1-b21c-a365c4860aaa","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2431480,"latency_human":"2.43148ms","bytes_in":67,"bytes_out":294}
2026/02/10 16:47:54 [REQUEST] {"request_id":"3354a662-dc60-4563-833f-0db11f784926","timestamp":"2026-02-10T16:47:54.369082341Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3303568,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:54.372412608Z","id":"3354a662-dc60-4563-833f-0db11f784926","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3329566,"latency_human":"3.329566ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:54.372420373Z","id":"3354a662-dc60-4563-833f-0db11f784926","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3338092,"latency_human":"3.338092ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:54 [REQUEST] {"request_id":"67774316-ae7e-4667-9ba3-f4837b588f2a","timestamp":"2026-02-10T16:47:54.37260776Z","method":"POST","path":"/api/libraries/1a501b0f-9b3b-4f4a-87c0-d8d710aee990/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2941607,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:54.375565456Z","id":"67774316-ae7e-4667-9ba3-f4837b588f2a","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/libraries/1a501b0f-9b3b-4f4a-87c0-d8d710aee990/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2957316,"latency_human":"2.957316ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:54.375575505Z","id":"67774316-ae7e-4667-9ba3-f4837b588f2a","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/libraries/1a501b0f-9b3b-4f4a-87c0-d8d710aee990/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2980177,"latency_human":"2.980177ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:54 [REQUEST] {"request_id":"dcf38384-5c83-4e45-ac44-4b148664a2d7","timestamp":"2026-02-10T16:47:54.375839354Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"1a501b0f-9b3b-4f4a-87c0-d8d710aee990","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":5792695,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:54.381660592Z","id":"dcf38384-5c83-4e45-ac44-4b148664a2d7","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":5819694,"latency_human":"5.819694ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:54.381669148Z","id":"dcf38384-5c83-4e45-ac44-4b148664a2d7","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":5829644,"latency_human":"5.829644ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:54 [REQUEST] {"request_id":"cea58837-438c-4115-b88c-29e3b7ae75b6","timestamp":"2026-02-10T16:47:54.381898864Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2450676,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:54.384372232Z","id":"cea58837-438c-4115-b88c-29e3b7ae75b6","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2472677,"latency_human":"2.472677ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:54.384377241Z","id":"cea58837-438c-4115-b88c-29e3b7ae75b6","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2478708,"latency_human":"2.478708ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:54 [REQUEST] {"request_id":"11685c43-1663-4be1-9ba7-0069d685ed7e","timestamp":"2026-02-10T16:47:54.38450589Z","method":"POST","path":"/api/libraries/09bd14a3-ffd4-4609-8200-eb42fe251116/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2211241,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:54.386735495Z","id":"11685c43-1663-4be1-9ba7-0069d685ed7e","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/libraries/09bd14a3-ffd4-4609-8200-eb42fe251116/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2229165,"latency_human":"2.229165ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:54.386742729Z","id":"11685c43-1663-4be1-9ba7-0069d685ed7e","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/libraries/09bd14a3-ffd4-4609-8200-eb42fe251116/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2236929,"latency_human":"2.236929ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:54 [REQUEST] {"request_id":"e9c1f4fd-92a0-4adf-b719-1ea5f4f97959","timestamp":"2026-02-10T16:47:54.386979979Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"09bd14a3-ffd4-4609-8200-eb42fe251116","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3394456,"status_code":201,"response_size":1045}
{"time":"2026-02-10T16:47:54.390389813Z","id":"e9c1f4fd-92a0-4adf-b719-1ea5f4f97959","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3409985,"latency_human":"3.409985ms","bytes_in":183,"bytes_out":1045}
{"time":"2026-02-10T16:47:54.390394371Z","id":"e9c1f4fd-92a0-4adf-b719-1ea5f4f97959","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3429110,"latency_human":"3.42911ms","bytes_in":183,"bytes_out":1045}
2026/02/10 16:47:54 [REQUEST] {"request_id":"869c0233-0612-4315-9132-34bf273643d3","timestamp":"2026-02-10T16:47:54.390644676Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjkwNDc0YWJmLTFmNTctNGI4Ny04NThkLTU0YzVlYzBkNDk5YSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.GF4yjyrXt4IKHMLnPBcCVs1JV75NJyvLLcYZBBFyMZc","Content-Length":"273","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[{"book_ids":["d908d677-7881-4e78-8eab-7a84503c31f5"],"collection_id":"e6e6be88-2813-492d-a83f-a5d358de6aa9"},{"book_ids":["d908d677-7881-4e78-8eab-7a84503c31f5","6120d90b-7b00-4985-9b88-fbe24f41f6a1"],"collection_id":"e6d0ed3b-3478-4478-8464-267ed3e1c0a6"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":7360423,"status_code":200,"response_size":422}
{"time":"2026-02-10T16:47:54.398078915Z","id":"869c0233-0612-4315-9132-34bf273643d3","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":7433458,"latency_human":"7.433458ms","bytes_in":273,"bytes_out":422}
{"time":"2026-02-10T16:47:54.398089455Z","id":"869c0233-0612-4315-9132-34bf273643d3","remote_ip":"127.0.0.1","host":"127.0.0.1:37893","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":7445310,"latency_human":"7.44531ms","bytes_in":273,"bytes_out":422}
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_DuplicateBooks
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'fe078d60-7d6f-4a9f-80cf-7c9b6c31d1f6'
2026/02/10 16:47:54 [REQUEST] {"request_id":"9fea5e97-4a58-49ad-bfba-ca144e6b3fce","timestamp":"2026-02-10T16:47:54.418674196Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":51238169,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.46993661Z","id":"9fea5e97-4a58-49ad-bfba-ca144e6b3fce","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51257825,"latency_human":"51.257825ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.469944224Z","id":"9fea5e97-4a58-49ad-bfba-ca144e6b3fce","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51270078,"latency_human":"51.270078ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"f2ce13f8-da5a-425b-a6d4-bbcd66aa4ab9","timestamp":"2026-02-10T16:47:54.470121233Z","method":"POST","path":"/api/collections","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhlZDhlZDUyLWY0YTYtNGQ2My1hMGU4LTQzZDU0YmFiOTIxNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Fj5jKBeg-D2PewWpDmF_XmOPkiTOHMPBfk3j0wQygYo","Content-Length":"60","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test collection","name":"Test Collection"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2518000,"status_code":201,"response_size":288}
{"time":"2026-02-10T16:47:54.472654672Z","id":"f2ce13f8-da5a-425b-a6d4-bbcd66aa4ab9","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2533299,"latency_human":"2.533299ms","bytes_in":60,"bytes_out":288}
{"time":"2026-02-10T16:47:54.472660433Z","id":"f2ce13f8-da5a-425b-a6d4-bbcd66aa4ab9","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/collections","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2540051,"latency_human":"2.540051ms","bytes_in":60,"bytes_out":288}
2026/02/10 16:47:54 [REQUEST] {"request_id":"b13329e7-bb8e-4e88-b0ff-c27d03f11c19","timestamp":"2026-02-10T16:47:54.472790654Z","method":"POST","path":"/api/libraries","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhlZDhlZDUyLWY0YTYtNGQ2My1hMGU4LTQzZDU0YmFiOTIxNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Fj5jKBeg-D2PewWpDmF_XmOPkiTOHMPBfk3j0wQygYo","Content-Length":"86","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"description":"A test library for media items","name":"Test Library","type":"ebooks"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":3094861,"status_code":201,"response_size":319}
{"time":"2026-02-10T16:47:54.475907926Z","id":"b13329e7-bb8e-4e88-b0ff-c27d03f11c19","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3116271,"latency_human":"3.116271ms","bytes_in":86,"bytes_out":319}
{"time":"2026-02-10T16:47:54.475913446Z","id":"b13329e7-bb8e-4e88-b0ff-c27d03f11c19","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/libraries","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":3123303,"latency_human":"3.123303ms","bytes_in":86,"bytes_out":319}
2026/02/10 16:47:54 [REQUEST] {"request_id":"b8d1d802-3ff3-4e73-bb0e-fabd42ec1d8a","timestamp":"2026-02-10T16:47:54.476059988Z","method":"POST","path":"/api/libraries/541c1857-86c4-4d34-969a-6e5ac32d2cd4/folders","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhlZDhlZDUyLWY0YTYtNGQ2My1hMGU4LTQzZDU0YmFiOTIxNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Fj5jKBeg-D2PewWpDmF_XmOPkiTOHMPBfk3j0wQygYo","Content-Length":"30","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"folder_path":"/app/uploads"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2613298,"status_code":201,"response_size":170}
{"time":"2026-02-10T16:47:54.47869705Z","id":"b8d1d802-3ff3-4e73-bb0e-fabd42ec1d8a","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/libraries/541c1857-86c4-4d34-969a-6e5ac32d2cd4/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2636039,"latency_human":"2.636039ms","bytes_in":30,"bytes_out":170}
{"time":"2026-02-10T16:47:54.478704463Z","id":"b8d1d802-3ff3-4e73-bb0e-fabd42ec1d8a","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/libraries/541c1857-86c4-4d34-969a-6e5ac32d2cd4/folders","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":2644966,"latency_human":"2.644966ms","bytes_in":30,"bytes_out":170}
2026/02/10 16:47:54 [REQUEST] {"request_id":"7f73b616-a135-445e-a471-fff998d85d7c","timestamp":"2026-02-10T16:47:54.478962682Z","method":"POST","path":"/api/media-items","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhlZDhlZDUyLWY0YTYtNGQ2My1hMGU4LTQzZDU0YmFiOTIxNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Fj5jKBeg-D2PewWpDmF_XmOPkiTOHMPBfk3j0wQygYo","Content-Length":"183","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"author":"Test Author","file_path":"/tmp/test.epub","file_size":1024,"library_id":"541c1857-86c4-4d34-969a-6e5ac32d2cd4","mime_type":"application/epub+zip","title":"Test Media Item"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":6949891,"status_code":201,"response_size":1043}
{"time":"2026-02-10T16:47:54.485942198Z","id":"7f73b616-a135-445e-a471-fff998d85d7c","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":6978383,"latency_human":"6.978383ms","bytes_in":183,"bytes_out":1043}
{"time":"2026-02-10T16:47:54.485952898Z","id":"7f73b616-a135-445e-a471-fff998d85d7c","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/media-items","user_agent":"Go-http-client/1.1","status":201,"error":"","latency":6990536,"latency_human":"6.990536ms","bytes_in":183,"bytes_out":1043}
2026/02/10 16:47:54 [REQUEST] {"request_id":"bff606d9-d532-4acb-9f62-25b868ec66cd","timestamp":"2026-02-10T16:47:54.486286707Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhlZDhlZDUyLWY0YTYtNGQ2My1hMGU4LTQzZDU0YmFiOTIxNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Fj5jKBeg-D2PewWpDmF_XmOPkiTOHMPBfk3j0wQygYo","Content-Length":"125","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[{"book_ids":["b1086fb2-844f-4923-84bc-3627b4dda9a9"],"collection_id":"bdb2f427-b4f8-4dcb-861d-41bcedb3ca03"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2530363,"status_code":200,"response_size":172}
{"time":"2026-02-10T16:47:54.48883864Z","id":"bff606d9-d532-4acb-9f62-25b868ec66cd","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2551122,"latency_human":"2.551122ms","bytes_in":125,"bytes_out":172}
{"time":"2026-02-10T16:47:54.48884388Z","id":"bff606d9-d532-4acb-9f62-25b868ec66cd","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2557944,"latency_human":"2.557944ms","bytes_in":125,"bytes_out":172}
2026/02/10 16:47:54 [REQUEST] {"request_id":"a166a95d-a677-493b-9c49-1b46b040e960","timestamp":"2026-02-10T16:47:54.489069579Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhlZDhlZDUyLWY0YTYtNGQ2My1hMGU4LTQzZDU0YmFiOTIxNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Fj5jKBeg-D2PewWpDmF_XmOPkiTOHMPBfk3j0wQygYo","Content-Length":"125","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"operations":[{"book_ids":["b1086fb2-844f-4923-84bc-3627b4dda9a9"],"collection_id":"bdb2f427-b4f8-4dcb-861d-41bcedb3ca03"}]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":689880,"status_code":200,"response_size":202}
{"time":"2026-02-10T16:47:54.489854735Z","id":"a166a95d-a677-493b-9c49-1b46b040e960","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":779406,"latency_human":"779.406µs","bytes_in":125,"bytes_out":202}
{"time":"2026-02-10T16:47:54.48987345Z","id":"a166a95d-a677-493b-9c49-1b46b040e960","remote_ip":"127.0.0.1","host":"127.0.0.1:42173","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":799182,"latency_human":"799.182µs","bytes_in":125,"bytes_out":202}
=== RUN   TestCollectionsBulkOperations/BulkAddBooks_InvalidRequestBody
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '1bae6edc-2c77-4e93-817e-67f44aa7f2ab'
2026/02/10 16:47:54 [REQUEST] {"request_id":"84761cad-bc96-497d-9c15-46c50c013aa4","timestamp":"2026-02-10T16:47:54.512308754Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49089363,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.561437771Z","id":"84761cad-bc96-497d-9c15-46c50c013aa4","remote_ip":"127.0.0.1","host":"127.0.0.1:39483","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49123066,"latency_human":"49.123066ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.561459501Z","id":"84761cad-bc96-497d-9c15-46c50c013aa4","remote_ip":"127.0.0.1","host":"127.0.0.1:39483","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49141841,"latency_human":"49.141841ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"d4cfee1e-7037-4eff-9f5b-f91efeb2a27f","timestamp":"2026-02-10T16:47:54.561768174Z","method":"POST","path":"/api/collections/bulk-add-books","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImMxMWJlYzkzLTZmMzQtNGFjMy1hMGQzLTFiNTJhYTJjNjUyMyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.gi-b6B6Yb52Qmq8iMz3fGF1OGEQei24zbD3olU2UzBg","Content-Length":"12","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":71723,"status_code":400,"response_size":28}
{"time":"2026-02-10T16:47:54.561871235Z","id":"d4cfee1e-7037-4eff-9f5b-f91efeb2a27f","remote_ip":"127.0.0.1","host":"127.0.0.1:39483","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":103091,"latency_human":"103.091µs","bytes_in":12,"bytes_out":28}
{"time":"2026-02-10T16:47:54.561878328Z","id":"d4cfee1e-7037-4eff-9f5b-f91efeb2a27f","remote_ip":"127.0.0.1","host":"127.0.0.1:39483","method":"POST","uri":"/api/collections/bulk-add-books","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":111416,"latency_human":"111.416µs","bytes_in":12,"bytes_out":28}
--- PASS: TestCollectionsBulkOperations (0.71s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_WithoutAuth (0.00s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_EmptyOperations (0.08s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_InvalidCollectionID (0.09s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_InvalidBookID (0.07s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_SingleOperation (0.09s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_MultipleBooksSingleCollection (0.12s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_MultipleCollections (0.11s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_DuplicateBooks (0.09s)
    --- PASS: TestCollectionsBulkOperations/BulkAddBooks_InvalidRequestBody (0.07s)
=== RUN   TestConflictDetection_TriggeringConditions
=== RUN   TestConflictDetection_TriggeringConditions/conflict_detected_when_different_devices_sync_within_5_minutes
=== RUN   TestConflictDetection_TriggeringConditions/no_conflict_when_progress_difference_is_less_than_1%
=== RUN   TestConflictDetection_TriggeringConditions/no_conflict_when_sync_timestamps_are_more_than_5_minutes_apart
--- PASS: TestConflictDetection_TriggeringConditions (0.00s)
    --- PASS: TestConflictDetection_TriggeringConditions/conflict_detected_when_different_devices_sync_within_5_minutes (0.00s)
    --- PASS: TestConflictDetection_TriggeringConditions/no_conflict_when_progress_difference_is_less_than_1% (0.00s)
    --- PASS: TestConflictDetection_TriggeringConditions/no_conflict_when_sync_timestamps_are_more_than_5_minutes_apart (0.00s)
=== RUN   TestConflictResolution_ChoosingWinner
=== RUN   TestConflictResolution_ChoosingWinner/resolve_conflict_by_choosing_koreader_source
=== RUN   TestConflictResolution_ChoosingWinner/resolve_conflict_with_manual_merge_data
=== RUN   TestConflictResolution_ChoosingWinner/error_when_winner_is_manual_but_no_manual_data_provided
--- PASS: TestConflictResolution_ChoosingWinner (0.00s)
    --- PASS: TestConflictResolution_ChoosingWinner/resolve_conflict_by_choosing_koreader_source (0.00s)
    --- PASS: TestConflictResolution_ChoosingWinner/resolve_conflict_with_manual_merge_data (0.00s)
    --- PASS: TestConflictResolution_ChoosingWinner/error_when_winner_is_manual_but_no_manual_data_provided (0.00s)
=== RUN   TestConflictListing_Filtering
=== RUN   TestConflictListing_Filtering/list_only_unresolved_conflicts
=== RUN   TestConflictListing_Filtering/list_all_conflicts_regardless_of_status
=== RUN   TestConflictListing_Filtering/list_only_resolved_conflicts
--- PASS: TestConflictListing_Filtering (0.00s)
    --- PASS: TestConflictListing_Filtering/list_only_unresolved_conflicts (0.00s)
    --- PASS: TestConflictListing_Filtering/list_all_conflicts_regardless_of_status (0.00s)
    --- PASS: TestConflictListing_Filtering/list_only_resolved_conflicts (0.00s)
=== RUN   TestConflictResponse_Structure
=== RUN   TestConflictResponse_Structure/conflict_detail_response_includes_all_required_fields
=== RUN   TestConflictResponse_Structure/conflict_list_response_includes_summary_counts
--- PASS: TestConflictResponse_Structure (0.00s)
    --- PASS: TestConflictResponse_Structure/conflict_detail_response_includes_all_required_fields (0.00s)
    --- PASS: TestConflictResponse_Structure/conflict_list_response_includes_summary_counts (0.00s)
=== RUN   TestConflictDeletion
=== RUN   TestConflictDeletion/delete_single_conflict_by_ID
=== RUN   TestConflictDeletion/dismiss_all_resolved_conflicts
--- PASS: TestConflictDeletion (0.00s)
    --- PASS: TestConflictDeletion/delete_single_conflict_by_ID (0.00s)
    --- PASS: TestConflictDeletion/dismiss_all_resolved_conflicts (0.00s)
=== RUN   TestConflictNotification_WebSocketBroadcast
=== RUN   TestConflictNotification_WebSocketBroadcast/conflict_detection_notification
=== RUN   TestConflictNotification_WebSocketBroadcast/conflict_resolved_notification
--- PASS: TestConflictNotification_WebSocketBroadcast (0.00s)
    --- PASS: TestConflictNotification_WebSocketBroadcast/conflict_detection_notification (0.00s)
    --- PASS: TestConflictNotification_WebSocketBroadcast/conflict_resolved_notification (0.00s)
=== RUN   TestConflictsBulkOperations
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_WithoutAuth
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 [REQUEST] {"request_id":"fce61493-6309-4e31-86ee-9d59cb637748","timestamp":"2026-02-10T16:47:54.563662938Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Content-Length":"82","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["b463802b-887e-437b-89db-d2ccd4be5c24"],"strategy":"most_recent"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":14016,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:54.563707711Z","id":"fce61493-6309-4e31-86ee-9d59cb637748","remote_ip":"127.0.0.1","host":"127.0.0.1:45123","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":38762,"latency_human":"38.762µs","bytes_in":82,"bytes_out":39}
{"time":"2026-02-10T16:47:54.563713912Z","id":"fce61493-6309-4e31-86ee-9d59cb637748","remote_ip":"127.0.0.1","host":"127.0.0.1:45123","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":51405,"latency_human":"51.405µs","bytes_in":82,"bytes_out":39}
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_EmptyConflictIDs
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'faea0af8-a335-448d-9eb1-98783d91d71d'
2026/02/10 16:47:54 [REQUEST] {"request_id":"1e8c2d49-668a-4782-bc05-391bf53fd8eb","timestamp":"2026-02-10T16:47:54.584166379Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50454164,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.634648285Z","id":"1e8c2d49-668a-4782-bc05-391bf53fd8eb","remote_ip":"127.0.0.1","host":"127.0.0.1:40537","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50478490,"latency_human":"50.47849ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.634657462Z","id":"1e8c2d49-668a-4782-bc05-391bf53fd8eb","remote_ip":"127.0.0.1","host":"127.0.0.1:40537","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50492436,"latency_human":"50.492436ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"a83607f3-e38e-4097-98ca-f7038cbc56e8","timestamp":"2026-02-10T16:47:54.634954984Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImZiZTViNDFkLTliNDgtNGFlOC1hMWUwLWNlZWRmMmJlOWY4YyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.WmY69bl51JY1cbIZiew-AzTHu9wW5ovssjuwXqd2a8M","Content-Length":"44","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":[],"strategy":"most_recent"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":63918,"status_code":200,"response_size":0,"error":"code=400, message=conflict_ids required"}
{"time":"2026-02-10T16:47:54.63503948Z","id":"a83607f3-e38e-4097-98ca-f7038cbc56e8","remote_ip":"127.0.0.1","host":"127.0.0.1:40537","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":400,"error":"code=400, message=conflict_ids required","latency":84276,"latency_human":"84.276µs","bytes_in":44,"bytes_out":36}
{"time":"2026-02-10T16:47:54.635045862Z","id":"a83607f3-e38e-4097-98ca-f7038cbc56e8","remote_ip":"127.0.0.1","host":"127.0.0.1:40537","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":91349,"latency_human":"91.349µs","bytes_in":44,"bytes_out":36}
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_InvalidConflictID
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '0c820bdb-a001-4034-9160-49b3a3bf7cdc'
2026/02/10 16:47:54 [REQUEST] {"request_id":"bcc33c92-24af-4733-a081-6f2dbbeaeb6d","timestamp":"2026-02-10T16:47:54.657245389Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49908883,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.707194487Z","id":"bcc33c92-24af-4733-a081-6f2dbbeaeb6d","remote_ip":"127.0.0.1","host":"127.0.0.1:46713","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49939220,"latency_human":"49.93922ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.707204846Z","id":"bcc33c92-24af-4733-a081-6f2dbbeaeb6d","remote_ip":"127.0.0.1","host":"127.0.0.1:46713","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49959307,"latency_human":"49.959307ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"8d2ea509-4b35-4e32-a2bb-93a9ff668461","timestamp":"2026-02-10T16:47:54.707445853Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImVkNmQyZTJhLWQwOWMtNGM2OS1iNGFmLTUwMDJlZTRmMGJhNSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.X8mgY3dKczDeGIy2y7nqpj6JcuHh9POBVRyMLJDxe18","Content-Length":"58","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["invalid-uuid"],"strategy":"most_recent"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":87031,"status_code":200,"response_size":125}
{"time":"2026-02-10T16:47:54.707544386Z","id":"8d2ea509-4b35-4e32-a2bb-93a9ff668461","remote_ip":"127.0.0.1","host":"127.0.0.1:46713","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":98322,"latency_human":"98.322µs","bytes_in":58,"bytes_out":125}
{"time":"2026-02-10T16:47:54.707550727Z","id":"8d2ea509-4b35-4e32-a2bb-93a9ff668461","remote_ip":"127.0.0.1","host":"127.0.0.1:46713","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":105977,"latency_human":"105.977µs","bytes_in":58,"bytes_out":125}
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_InvalidStrategy
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '7b0436a4-8bc0-41aa-b6e9-18be03e848ce'
2026/02/10 16:47:54 [REQUEST] {"request_id":"66c4451a-22b9-45fa-b945-7b098371f344","timestamp":"2026-02-10T16:47:54.72909555Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49721626,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.778849626Z","id":"66c4451a-22b9-45fa-b945-7b098371f344","remote_ip":"127.0.0.1","host":"127.0.0.1:36589","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49742374,"latency_human":"49.742374ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.778859684Z","id":"66c4451a-22b9-45fa-b945-7b098371f344","remote_ip":"127.0.0.1","host":"127.0.0.1:36589","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49764335,"latency_human":"49.764335ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"884150f2-b6f8-44b8-ba75-b78060dfa7b4","timestamp":"2026-02-10T16:47:54.77913207Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjFiMWVhZjBiLWRlMGMtNGM3Zi04MmM0LWZlMGQ0ODhhYjAyYyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.ZxQudyqWkpCmGXUR-L5NCfXiNNnnk0JEvzehGKf8ihM","Content-Length":"87","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["2705df08-ea4e-4e33-b18a-bbfe5e2a8e68"],"strategy":"invalid_strategy"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":336544,"status_code":200,"response_size":148}
{"time":"2026-02-10T16:47:54.779490014Z","id":"884150f2-b6f8-44b8-ba75-b78060dfa7b4","remote_ip":"127.0.0.1","host":"127.0.0.1:36589","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":357513,"latency_human":"357.513µs","bytes_in":87,"bytes_out":148}
{"time":"2026-02-10T16:47:54.779497658Z","id":"884150f2-b6f8-44b8-ba75-b78060dfa7b4","remote_ip":"127.0.0.1","host":"127.0.0.1:36589","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":366179,"latency_human":"366.179µs","bytes_in":87,"bytes_out":148}
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_MostRecentStrategy
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ffb0095f-d8cb-48b7-a1de-aeb6aeb26b27'
2026/02/10 16:47:54 [REQUEST] {"request_id":"6fabf8e6-14d4-4172-926f-8533a068a1fd","timestamp":"2026-02-10T16:47:54.798622662Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48927743,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.847642165Z","id":"6fabf8e6-14d4-4172-926f-8533a068a1fd","remote_ip":"127.0.0.1","host":"127.0.0.1:44115","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48965383,"latency_human":"48.965383ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.847675958Z","id":"6fabf8e6-14d4-4172-926f-8533a068a1fd","remote_ip":"127.0.0.1","host":"127.0.0.1:44115","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49036174,"latency_human":"49.036174ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"1612a3df-3602-431e-9d20-8268519eaf84","timestamp":"2026-02-10T16:47:54.84794118Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjVlZDlkYmYyLWExMzEtNGEyYy05NGUxLTAyNDIzYjM0MDliYyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.O6t9oqMelWl09_NCHK1S9doQh-uMD1tCTyiRuwZhuCk","Content-Length":"121","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["f968053b-4fe4-4255-994f-c14f389bae40","45058dc1-9897-437c-9d62-76808d0cd6fd"],"strategy":"most_recent"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":551082,"status_code":200,"response_size":249}
{"time":"2026-02-10T16:47:54.848506468Z","id":"1612a3df-3602-431e-9d20-8268519eaf84","remote_ip":"127.0.0.1","host":"127.0.0.1:44115","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":564578,"latency_human":"564.578µs","bytes_in":121,"bytes_out":249}
{"time":"2026-02-10T16:47:54.848511067Z","id":"1612a3df-3602-431e-9d20-8268519eaf84","remote_ip":"127.0.0.1","host":"127.0.0.1:44115","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":569887,"latency_human":"569.887µs","bytes_in":121,"bytes_out":249}
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_HighestProgressStrategy
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '7f651822-f714-4ae3-99a4-33ce83cc2064'
2026/02/10 16:47:54 [REQUEST] {"request_id":"5ae8f95c-fbf5-402b-8da8-c8261e26acbf","timestamp":"2026-02-10T16:47:54.86802901Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49320902,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.917368557Z","id":"5ae8f95c-fbf5-402b-8da8-c8261e26acbf","remote_ip":"127.0.0.1","host":"127.0.0.1:45591","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49336943,"latency_human":"49.336943ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.917374087Z","id":"5ae8f95c-fbf5-402b-8da8-c8261e26acbf","remote_ip":"127.0.0.1","host":"127.0.0.1:45591","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49344827,"latency_human":"49.344827ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"25be465f-4ea1-4b17-8e21-4d44444ff00d","timestamp":"2026-02-10T16:47:54.91761305Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjUyN2U3MmEwLTY0YjctNDNhMS1iNWZlLWJiMjYzMjBmYThmMCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.MDgW0pL4X4ylaAY_6tsxuNmhwetRqRS1HIwhR_7K3Ak","Content-Length":"126","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["15b26029-3149-44c6-be4e-07ea8c80276c","62c991c9-cf56-4c9f-befc-a6d13004559c"],"strategy":"highest_progress"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":557475,"status_code":200,"response_size":249}
{"time":"2026-02-10T16:47:54.918203125Z","id":"25be465f-4ea1-4b17-8e21-4d44444ff00d","remote_ip":"127.0.0.1","host":"127.0.0.1:45591","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":589935,"latency_human":"589.935µs","bytes_in":126,"bytes_out":249}
{"time":"2026-02-10T16:47:54.918209737Z","id":"25be465f-4ea1-4b17-8e21-4d44444ff00d","remote_ip":"127.0.0.1","host":"127.0.0.1:45591","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":597609,"latency_human":"597.609µs","bytes_in":126,"bytes_out":249}
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_ManualStrategy_WithoutWinner
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '98d6d5b7-63df-4c7d-955b-0bfe88086631'
2026/02/10 16:47:54 [REQUEST] {"request_id":"cde0bc45-1d11-41a0-a5f1-a0958a87aeda","timestamp":"2026-02-10T16:47:54.938680307Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50119343,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:54.988825598Z","id":"cde0bc45-1d11-41a0-a5f1-a0958a87aeda","remote_ip":"127.0.0.1","host":"127.0.0.1:32847","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50140372,"latency_human":"50.140372ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:54.988836298Z","id":"cde0bc45-1d11-41a0-a5f1-a0958a87aeda","remote_ip":"127.0.0.1","host":"127.0.0.1:32847","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50156452,"latency_human":"50.156452ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:54 [REQUEST] {"request_id":"a6d56f0e-cc48-48d3-afad-ecd895c50ea0","timestamp":"2026-02-10T16:47:54.989115886Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzQsImlhdCI6MTc3MDc0MjA3NCwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImJjNzc0OGI1LTZkMTYtNGMyZC1iM2Y2LWU4ODU5MGRjMzdjNyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.N6rXjpxPytoaa8AR2V3P4H0imHuIHt2vusBfWG7Z8pI","Content-Length":"77","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["0fdeb10e-6b22-4075-940a-71bb5dee6f22"],"strategy":"manual"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":329681,"status_code":200,"response_size":148}
{"time":"2026-02-10T16:47:54.989465024Z","id":"a6d56f0e-cc48-48d3-afad-ecd895c50ea0","remote_ip":"127.0.0.1","host":"127.0.0.1:32847","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":348256,"latency_human":"348.256µs","bytes_in":77,"bytes_out":148}
{"time":"2026-02-10T16:47:54.989472398Z","id":"a6d56f0e-cc48-48d3-afad-ecd895c50ea0","remote_ip":"127.0.0.1","host":"127.0.0.1:32847","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":357023,"latency_human":"357.023µs","bytes_in":77,"bytes_out":148}
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_ManualStrategy_WithWinner
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:54 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '03e0c2e0-5b0e-476f-a5ff-1b5faaaafaeb'
2026/02/10 16:47:55 [REQUEST] {"request_id":"9d345629-25d6-4d55-a0c7-7ac10fca9610","timestamp":"2026-02-10T16:47:55.01030528Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49134497,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.059463861Z","id":"9d345629-25d6-4d55-a0c7-7ac10fca9610","remote_ip":"127.0.0.1","host":"127.0.0.1:34037","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49153683,"latency_human":"49.153683ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.059472547Z","id":"9d345629-25d6-4d55-a0c7-7ac10fca9610","remote_ip":"127.0.0.1","host":"127.0.0.1:34037","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49166756,"latency_human":"49.166756ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"8e52dee2-36dd-4e34-b358-fd0c6933a1cf","timestamp":"2026-02-10T16:47:55.059722661Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjQxMzA2MjRkLWEzZTYtNGE3MS05N2I3LWM5NmQ5ZDBmM2FkNiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.1MvzRmjp65pQy8OYt4mVzwbjvATgojERmS0pf5tS7L4","Content-Length":"103","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["113dafb2-aa7c-42d6-afad-ba3a0df1714e"],"strategy":"manual","winning_source":"device"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":399912,"status_code":200,"response_size":148}
{"time":"2026-02-10T16:47:55.060139123Z","id":"8e52dee2-36dd-4e34-b358-fd0c6933a1cf","remote_ip":"127.0.0.1","host":"127.0.0.1:34037","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":416513,"latency_human":"416.513µs","bytes_in":103,"bytes_out":148}
{"time":"2026-02-10T16:47:55.060145205Z","id":"8e52dee2-36dd-4e34-b358-fd0c6933a1cf","remote_ip":"127.0.0.1","host":"127.0.0.1:34037","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":424086,"latency_human":"424.086µs","bytes_in":103,"bytes_out":148}
=== RUN   TestConflictsBulkOperations/BulkResolveConflicts_InvalidRequestBody
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'a2f44f61-be36-462f-b4d4-13c21ab098dc'
2026/02/10 16:47:55 [REQUEST] {"request_id":"c328805c-6ce7-4467-8c33-8a4ca1841e6c","timestamp":"2026-02-10T16:47:55.080102903Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48592822,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.128722084Z","id":"c328805c-6ce7-4467-8c33-8a4ca1841e6c","remote_ip":"127.0.0.1","host":"127.0.0.1:43159","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48614613,"latency_human":"48.614613ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.128739166Z","id":"c328805c-6ce7-4467-8c33-8a4ca1841e6c","remote_ip":"127.0.0.1","host":"127.0.0.1:43159","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48635682,"latency_human":"48.635682ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"75951aaf-e926-477a-a995-6ca7aafc85b7","timestamp":"2026-02-10T16:47:55.129137966Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjhjNjE2NGQ1LTlmZDAtNDY3Zi1iZTBjLTMwNTUzZDhlMjZhYiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.sxIE7AzpDAmP9QEDuunk2jhDoSoOkHRVtPFoISUa3t8","Content-Length":"12","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":88724,"status_code":200,"response_size":0,"error":"code=400, message=invalid request body"}
{"time":"2026-02-10T16:47:55.129255203Z","id":"75951aaf-e926-477a-a995-6ca7aafc85b7","remote_ip":"127.0.0.1","host":"127.0.0.1:43159","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":400,"error":"code=400, message=invalid request body","latency":116376,"latency_human":"116.376µs","bytes_in":12,"bytes_out":35}
{"time":"2026-02-10T16:47:55.129264039Z","id":"75951aaf-e926-477a-a995-6ca7aafc85b7","remote_ip":"127.0.0.1","host":"127.0.0.1:43159","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":126775,"latency_human":"126.775µs","bytes_in":12,"bytes_out":35}
--- PASS: TestConflictsBulkOperations (0.57s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_WithoutAuth (0.00s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_EmptyConflictIDs (0.07s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_InvalidConflictID (0.07s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_InvalidStrategy (0.07s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_MostRecentStrategy (0.07s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_HighestProgressStrategy (0.07s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_ManualStrategy_WithoutWinner (0.07s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_ManualStrategy_WithWinner (0.07s)
    --- PASS: TestConflictsBulkOperations/BulkResolveConflicts_InvalidRequestBody (0.07s)
=== RUN   TestConflictsBulkDismiss
=== RUN   TestConflictsBulkDismiss/BulkDismissConflicts_WithoutAuth
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 [REQUEST] {"request_id":"81d123d4-5281-4db9-9137-c6f50f56192a","timestamp":"2026-02-10T16:47:55.137333818Z","method":"POST","path":"/api/conflicts/bulk-dismiss","headers":{"Accept-Encoding":"gzip","Content-Length":"57","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["dddc1f6c-8644-473e-be58-cab611749b0c"]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":16501,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:55.137381607Z","id":"81d123d4-5281-4db9-9137-c6f50f56192a","remote_ip":"127.0.0.1","host":"127.0.0.1:35537","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":46717,"latency_human":"46.717µs","bytes_in":57,"bytes_out":39}
{"time":"2026-02-10T16:47:55.137390964Z","id":"81d123d4-5281-4db9-9137-c6f50f56192a","remote_ip":"127.0.0.1","host":"127.0.0.1:35537","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":57407,"latency_human":"57.407µs","bytes_in":57,"bytes_out":39}
=== RUN   TestConflictsBulkDismiss/BulkDismissConflicts_EmptyConflictIDs
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'f66d31c7-012a-46b9-9d72-17dc670d13dd'
2026/02/10 16:47:55 [REQUEST] {"request_id":"6186c7b9-a542-4a3a-b065-a9c1ec18b8cd","timestamp":"2026-02-10T16:47:55.156500679Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":56049032,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.212586981Z","id":"6186c7b9-a542-4a3a-b065-a9c1ec18b8cd","remote_ip":"127.0.0.1","host":"127.0.0.1:36647","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":56082073,"latency_human":"56.082073ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.212600886Z","id":"6186c7b9-a542-4a3a-b065-a9c1ec18b8cd","remote_ip":"127.0.0.1","host":"127.0.0.1:36647","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":56097983,"latency_human":"56.097983ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"a8fac855-2e8c-4aa0-a859-fbb3272988c5","timestamp":"2026-02-10T16:47:55.213128695Z","method":"POST","path":"/api/conflicts/bulk-dismiss","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjRmYmYxMDRiLTQ3M2QtNGY0YS1iMWE5LWE1ODZkODgzNTVhNSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.ESKqYKMbqUCn_NgPratt1r_RnWY4WnvUH2D3cv3TRaE","Content-Length":"19","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":[]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":181788,"status_code":200,"response_size":0,"error":"code=400, message=conflict_ids required"}
{"time":"2026-02-10T16:47:55.213378318Z","id":"a8fac855-2e8c-4aa0-a859-fbb3272988c5","remote_ip":"127.0.0.1","host":"127.0.0.1:36647","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":400,"error":"code=400, message=conflict_ids required","latency":247038,"latency_human":"247.038µs","bytes_in":19,"bytes_out":36}
{"time":"2026-02-10T16:47:55.213391924Z","id":"a8fac855-2e8c-4aa0-a859-fbb3272988c5","remote_ip":"127.0.0.1","host":"127.0.0.1:36647","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":263579,"latency_human":"263.579µs","bytes_in":19,"bytes_out":36}
=== RUN   TestConflictsBulkDismiss/BulkDismissConflicts_InvalidConflictID
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '97cd0574-0432-45be-ae26-a75343fc465d'
2026/02/10 16:47:55 [REQUEST] {"request_id":"5d112719-aac9-478e-a455-39a5ee6ee5fa","timestamp":"2026-02-10T16:47:55.235798594Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":51365585,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.287200988Z","id":"5d112719-aac9-478e-a455-39a5ee6ee5fa","remote_ip":"127.0.0.1","host":"127.0.0.1:35879","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51398205,"latency_human":"51.398205ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.287219773Z","id":"5d112719-aac9-478e-a455-39a5ee6ee5fa","remote_ip":"127.0.0.1","host":"127.0.0.1:35879","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51417492,"latency_human":"51.417492ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"c26286f6-bd12-426c-9031-b2c4f9291033","timestamp":"2026-02-10T16:47:55.287499241Z","method":"POST","path":"/api/conflicts/bulk-dismiss","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjFkOWUwMjNhLTQyOTktNDQ3Yi1hMDQ2LWRkNTY4ZjMzOTFkMyIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.TvoDSd80e7US2XB0xKVBvoobFkQ-7oEIMHcn_C_coyg","Content-Length":"72","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["invalid-uuid","9abc9cc8-bfc8-4e63-b721-f4f32bee2345"]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":427002,"status_code":200,"response_size":226}
{"time":"2026-02-10T16:47:55.287950849Z","id":"c26286f6-bd12-426c-9031-b2c4f9291033","remote_ip":"127.0.0.1","host":"127.0.0.1:35879","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":451388,"latency_human":"451.388µs","bytes_in":72,"bytes_out":226}
{"time":"2026-02-10T16:47:55.287958022Z","id":"c26286f6-bd12-426c-9031-b2c4f9291033","remote_ip":"127.0.0.1","host":"127.0.0.1:35879","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":459432,"latency_human":"459.432µs","bytes_in":72,"bytes_out":226}
=== RUN   TestConflictsBulkDismiss/BulkDismissConflicts_MultipleConflicts
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '573babe7-6045-4650-9948-34f9a4ac294d'
2026/02/10 16:47:55 [REQUEST] {"request_id":"d64cfad9-0c76-40c5-9ca4-bdcacee6c5fd","timestamp":"2026-02-10T16:47:55.30694525Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49894337,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.356868611Z","id":"d64cfad9-0c76-40c5-9ca4-bdcacee6c5fd","remote_ip":"127.0.0.1","host":"127.0.0.1:35119","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49918782,"latency_human":"49.918782ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.356878429Z","id":"d64cfad9-0c76-40c5-9ca4-bdcacee6c5fd","remote_ip":"127.0.0.1","host":"127.0.0.1:35119","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49934441,"latency_human":"49.934441ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"c9a2c7d5-0fee-444f-8520-c60bf7cc816c","timestamp":"2026-02-10T16:47:55.357070826Z","method":"POST","path":"/api/conflicts/bulk-dismiss","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjAwYmVlNzY4LWFjMTgtNGY3Ni1hZDY3LWE0YjI0YmFmNzVlZiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.v3yGqolSuZZq9gz3H5W9x9fID3Rj69YacgReiqzElEY","Content-Length":"135","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["ac9a753f-ea8b-41c4-bf68-0b3f594e93c1","f1fac0fd-b864-42e3-b3f6-4b43b41465a3","6152eb5c-2eb4-49b0-b5be-2999c57f9f43"]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":694859,"status_code":200,"response_size":350}
{"time":"2026-02-10T16:47:55.357785341Z","id":"c9a2c7d5-0fee-444f-8520-c60bf7cc816c","remote_ip":"127.0.0.1","host":"127.0.0.1:35119","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":713794,"latency_human":"713.794µs","bytes_in":135,"bytes_out":350}
{"time":"2026-02-10T16:47:55.357791893Z","id":"c9a2c7d5-0fee-444f-8520-c60bf7cc816c","remote_ip":"127.0.0.1","host":"127.0.0.1:35119","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":721658,"latency_human":"721.658µs","bytes_in":135,"bytes_out":350}
=== RUN   TestConflictsBulkDismiss/BulkDismissConflicts_InvalidRequestBody
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '332a8b40-c0f9-476a-bb7f-c4e7aff508d0'
2026/02/10 16:47:55 [REQUEST] {"request_id":"aa4d1abe-6aa5-4b65-a2b3-26ed921957d7","timestamp":"2026-02-10T16:47:55.37814206Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50015100,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.428195481Z","id":"aa4d1abe-6aa5-4b65-a2b3-26ed921957d7","remote_ip":"127.0.0.1","host":"127.0.0.1:41305","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50050095,"latency_human":"50.050095ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.428214005Z","id":"aa4d1abe-6aa5-4b65-a2b3-26ed921957d7","remote_ip":"127.0.0.1","host":"127.0.0.1:41305","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50067807,"latency_human":"50.067807ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"17f82faa-f6bd-4a6a-b49b-5f9a7b12f021","timestamp":"2026-02-10T16:47:55.428406713Z","method":"POST","path":"/api/conflicts/bulk-dismiss","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImRlYmExNjFhLTRmODUtNGE3My1iZTBhLWE4ODI2YTNhZDllYSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.2nz8nvMo263c1lRlvxF5604JOVLzk6eLORn-bNZwomI","Content-Length":"12","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48590,"status_code":200,"response_size":0,"error":"code=400, message=invalid request body"}
{"time":"2026-02-10T16:47:55.428473707Z","id":"17f82faa-f6bd-4a6a-b49b-5f9a7b12f021","remote_ip":"127.0.0.1","host":"127.0.0.1:41305","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":400,"error":"code=400, message=invalid request body","latency":66744,"latency_human":"66.744µs","bytes_in":12,"bytes_out":35}
{"time":"2026-02-10T16:47:55.428483375Z","id":"17f82faa-f6bd-4a6a-b49b-5f9a7b12f021","remote_ip":"127.0.0.1","host":"127.0.0.1:41305","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":77153,"latency_human":"77.153µs","bytes_in":12,"bytes_out":35}
--- PASS: TestConflictsBulkDismiss (0.30s)
    --- PASS: TestConflictsBulkDismiss/BulkDismissConflicts_WithoutAuth (0.01s)
    --- PASS: TestConflictsBulkDismiss/BulkDismissConflicts_EmptyConflictIDs (0.08s)
    --- PASS: TestConflictsBulkDismiss/BulkDismissConflicts_InvalidConflictID (0.07s)
    --- PASS: TestConflictsBulkDismiss/BulkDismissConflicts_MultipleConflicts (0.07s)
    --- PASS: TestConflictsBulkDismiss/BulkDismissConflicts_InvalidRequestBody (0.07s)
=== RUN   TestConflictsBulkEdgeCases
=== RUN   TestConflictsBulkEdgeCases/BulkResolve_NonExistentConflicts
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'eef5a546-0717-4ef0-ae94-090c606527fb'
2026/02/10 16:47:55 [REQUEST] {"request_id":"4edda437-2703-4551-b422-00d7df67896e","timestamp":"2026-02-10T16:47:55.448786504Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":51168540,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.499972185Z","id":"4edda437-2703-4551-b422-00d7df67896e","remote_ip":"127.0.0.1","host":"127.0.0.1:46045","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51183427,"latency_human":"51.183427ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.499980641Z","id":"4edda437-2703-4551-b422-00d7df67896e","remote_ip":"127.0.0.1","host":"127.0.0.1:46045","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51192364,"latency_human":"51.192364ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"69ae367e-5f1f-4884-885c-8d1e767b3532","timestamp":"2026-02-10T16:47:55.500185892Z","method":"POST","path":"/api/conflicts/bulk-resolve","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImE3YTE0ZWIzLTM0YzktNDU0OS1iNzhjLTU1ZjEwZDNlZDU5YiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.tSNrkPKPz8u6SnE1QRtudOrvc0vJPN5XGVPmZUDx_dY","Content-Length":"160","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["31d95760-82bf-40a8-a4f4-b56bc52aad33","82d4a18f-5e96-48cd-b695-727a8eab74fb","81d50d3a-0b8b-431c-8b38-de1b4b7337e6"],"strategy":"most_recent"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":406434,"status_code":200,"response_size":350}
{"time":"2026-02-10T16:47:55.500603727Z","id":"69ae367e-5f1f-4884-885c-8d1e767b3532","remote_ip":"127.0.0.1","host":"127.0.0.1:46045","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":417244,"latency_human":"417.244µs","bytes_in":160,"bytes_out":350}
{"time":"2026-02-10T16:47:55.500607193Z","id":"69ae367e-5f1f-4884-885c-8d1e767b3532","remote_ip":"127.0.0.1","host":"127.0.0.1:46045","method":"POST","uri":"/api/conflicts/bulk-resolve","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":422885,"latency_human":"422.885µs","bytes_in":160,"bytes_out":350}
=== RUN   TestConflictsBulkEdgeCases/BulkDismiss_MixedValidInvalid
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '4111c05f-7227-405f-bb21-36d7bfec7a83'
2026/02/10 16:47:55 [REQUEST] {"request_id":"fd0edc22-e83d-43cf-88bd-a55dc6b0ed85","timestamp":"2026-02-10T16:47:55.519152673Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49877124,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.56904738Z","id":"fd0edc22-e83d-43cf-88bd-a55dc6b0ed85","remote_ip":"127.0.0.1","host":"127.0.0.1:35989","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49892763,"latency_human":"49.892763ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.569055174Z","id":"fd0edc22-e83d-43cf-88bd-a55dc6b0ed85","remote_ip":"127.0.0.1","host":"127.0.0.1:35989","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49901640,"latency_human":"49.90164ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"a9c1e8de-ba33-4c5d-a789-3b9c3c5b742b","timestamp":"2026-02-10T16:47:55.569294408Z","method":"POST","path":"/api/conflicts/bulk-dismiss","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjA1ZmMyOThiLTU0ODMtNDQxMC1hNjQ0LTVhMGU1NTJjODE1MSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.t_4vPLHEaHlP3fYI_V5q_I0jNdghW8vBvMx7LzAGhfE","Content-Length":"91","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"conflict_ids":["invalid-uuid-1","invalid-uuid-2","5525652f-2d04-4e08-b760-70f932d52db2"]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":432943,"status_code":200,"response_size":308}
{"time":"2026-02-10T16:47:55.569745755Z","id":"a9c1e8de-ba33-4c5d-a789-3b9c3c5b742b","remote_ip":"127.0.0.1","host":"127.0.0.1:35989","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":450666,"latency_human":"450.666µs","bytes_in":91,"bytes_out":308}
{"time":"2026-02-10T16:47:55.569754571Z","id":"a9c1e8de-ba33-4c5d-a789-3b9c3c5b742b","remote_ip":"127.0.0.1","host":"127.0.0.1:35989","method":"POST","uri":"/api/conflicts/bulk-dismiss","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":460594,"latency_human":"460.594µs","bytes_in":91,"bytes_out":308}
--- PASS: TestConflictsBulkEdgeCases (0.14s)
    --- PASS: TestConflictsBulkEdgeCases/BulkResolve_NonExistentConflicts (0.07s)
    --- PASS: TestConflictsBulkEdgeCases/BulkDismiss_MixedValidInvalid (0.07s)
=== RUN   TestUpdateUserMaxDevices
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'de7fa692-2f9c-4e47-a999-f6fd0990d734'
2026/02/10 16:47:55 [REQUEST] {"request_id":"8d57e57d-0a23-4f1c-9f30-367ddd0fa929","timestamp":"2026-02-10T16:47:55.590685916Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":52479601,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.643216682Z","id":"8d57e57d-0a23-4f1c-9f30-367ddd0fa929","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52526970,"latency_human":"52.52697ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.643228043Z","id":"8d57e57d-0a23-4f1c-9f30-367ddd0fa929","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52541587,"latency_human":"52.541587ms","bytes_in":59,"bytes_out":579}
DEBUG: refreshToken generated: 'f824447d-0af5-4e37-8595-270fd6d08631'
2026/02/10 16:47:55 [REQUEST] {"request_id":"7466ec30-c3b4-4c0e-9fb0-ea9bc6148207","timestamp":"2026-02-10T16:47:55.649227101Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":52318423,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.701561594Z","id":"7466ec30-c3b4-4c0e-9fb0-ea9bc6148207","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52334793,"latency_human":"52.334793ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.701567114Z","id":"7466ec30-c3b4-4c0e-9fb0-ea9bc6148207","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":52341776,"latency_human":"52.341776ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"e5121a4f-2f4f-48d8-88f0-3c30b80a22f9","timestamp":"2026-02-10T16:47:55.701735436Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk4YjdiNDM0LWVjMDktNGJjMy04NTVlLTg3YzhmMTNjZjJjMCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.3Lu6Fk1yRj2WmsWruoGryrl5AB4gqxcR7jwneN7uaBQ","Content-Length":"128","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"maxdevices@example.com","first_name":"Test","last_name":"User","password":"Test@Pass123!","username":"maxdevicesuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":410913,"status_code":409,"response_size":33}
{"time":"2026-02-10T16:47:55.702169021Z","id":"e5121a4f-2f4f-48d8-88f0-3c30b80a22f9","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":409,"error":"","latency":433444,"latency_human":"433.444µs","bytes_in":128,"bytes_out":33}
{"time":"2026-02-10T16:47:55.702192534Z","id":"e5121a4f-2f4f-48d8-88f0-3c30b80a22f9","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":409,"error":"","latency":458120,"latency_human":"458.12µs","bytes_in":128,"bytes_out":33}
    device_cap_test.go:345: User maxdevices@example.com already exists, logging in to get ID
DEBUG: refreshToken generated: 'b441ce33-4045-40ed-ad64-f8b9f551f477'
2026/02/10 16:47:55 [REQUEST] {"request_id":"f7594371-19f4-4c14-8cec-1901f961fbad","timestamp":"2026-02-10T16:47:55.702916237Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"61","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"maxdevices@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49028220,"status_code":200,"response_size":595}
{"time":"2026-02-10T16:47:55.751961018Z","id":"f7594371-19f4-4c14-8cec-1901f961fbad","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49043869,"latency_human":"49.043869ms","bytes_in":61,"bytes_out":595}
{"time":"2026-02-10T16:47:55.751967229Z","id":"f7594371-19f4-4c14-8cec-1901f961fbad","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49051193,"latency_human":"49.051193ms","bytes_in":61,"bytes_out":595}
    device_cap_test.go:379: JWT claims: map[exp:1.770745675e+09 iat:1.770742075e+09 user_email:maxdevices@example.com user_id:5376cadf-3c0e-4629-9b00-eba8d0e176f9 user_role:user user_username:maxdevicesuser]
    device_cap_test.go:382: Extracted userID from JWT: 5376cadf-3c0e-4629-9b00-eba8d0e176f9
=== RUN   TestUpdateUserMaxDevices/Update_to_5_devices
2026/02/10 16:47:55 [REQUEST] {"request_id":"88bd41ff-aa3c-4efb-97e3-3d54382eab8b","timestamp":"2026-02-10T16:47:55.752294326Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk4YjdiNDM0LWVjMDktNGJjMy04NTVlLTg3YzhmMTNjZjJjMCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.3Lu6Fk1yRj2WmsWruoGryrl5AB4gqxcR7jwneN7uaBQ","Content-Length":"17","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":5},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2360448,"status_code":200,"response_size":34}
{"time":"2026-02-10T16:47:55.754682445Z","id":"88bd41ff-aa3c-4efb-97e3-3d54382eab8b","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2386417,"latency_human":"2.386417ms","bytes_in":17,"bytes_out":34}
{"time":"2026-02-10T16:47:55.754692224Z","id":"88bd41ff-aa3c-4efb-97e3-3d54382eab8b","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2398188,"latency_human":"2.398188ms","bytes_in":17,"bytes_out":34}
=== RUN   TestUpdateUserMaxDevices/Update_to_10_devices_(default)
2026/02/10 16:47:55 [REQUEST] {"request_id":"c9211265-384b-4096-8d7a-7eed86c84761","timestamp":"2026-02-10T16:47:55.754987782Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk4YjdiNDM0LWVjMDktNGJjMy04NTVlLTg3YzhmMTNjZjJjMCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.3Lu6Fk1yRj2WmsWruoGryrl5AB4gqxcR7jwneN7uaBQ","Content-Length":"18","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":10},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2107649,"status_code":200,"response_size":34}
{"time":"2026-02-10T16:47:55.757107924Z","id":"c9211265-384b-4096-8d7a-7eed86c84761","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2119221,"latency_human":"2.119221ms","bytes_in":18,"bytes_out":34}
{"time":"2026-02-10T16:47:55.757111912Z","id":"c9211265-384b-4096-8d7a-7eed86c84761","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2124450,"latency_human":"2.12445ms","bytes_in":18,"bytes_out":34}
=== RUN   TestUpdateUserMaxDevices/Update_to_50_devices
2026/02/10 16:47:55 [REQUEST] {"request_id":"b1b2a921-fe90-4d71-9ae0-da035dfbe8ae","timestamp":"2026-02-10T16:47:55.757260227Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk4YjdiNDM0LWVjMDktNGJjMy04NTVlLTg3YzhmMTNjZjJjMCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.3Lu6Fk1yRj2WmsWruoGryrl5AB4gqxcR7jwneN7uaBQ","Content-Length":"18","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":50},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2052336,"status_code":200,"response_size":34}
{"time":"2026-02-10T16:47:55.759336768Z","id":"b1b2a921-fe90-4d71-9ae0-da035dfbe8ae","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2076241,"latency_human":"2.076241ms","bytes_in":18,"bytes_out":34}
{"time":"2026-02-10T16:47:55.759341788Z","id":"b1b2a921-fe90-4d71-9ae0-da035dfbe8ae","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2081841,"latency_human":"2.081841ms","bytes_in":18,"bytes_out":34}
=== RUN   TestUpdateUserMaxDevices/Update_to_100_devices_(maximum)
2026/02/10 16:47:55 [REQUEST] {"request_id":"48503d95-5141-43fc-84de-53454bf7cc99","timestamp":"2026-02-10T16:47:55.75945607Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk4YjdiNDM0LWVjMDktNGJjMy04NTVlLTg3YzhmMTNjZjJjMCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.3Lu6Fk1yRj2WmsWruoGryrl5AB4gqxcR7jwneN7uaBQ","Content-Length":"19","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":100},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":2154596,"status_code":200,"response_size":34}
{"time":"2026-02-10T16:47:55.761626996Z","id":"48503d95-5141-43fc-84de-53454bf7cc99","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2171097,"latency_human":"2.171097ms","bytes_in":19,"bytes_out":34}
{"time":"2026-02-10T16:47:55.761631775Z","id":"48503d95-5141-43fc-84de-53454bf7cc99","remote_ip":"127.0.0.1","host":"127.0.0.1:39819","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":2176698,"latency_human":"2.176698ms","bytes_in":19,"bytes_out":34}
--- PASS: TestUpdateUserMaxDevices (0.19s)
    --- PASS: TestUpdateUserMaxDevices/Update_to_5_devices (0.00s)
    --- PASS: TestUpdateUserMaxDevices/Update_to_10_devices_(default) (0.00s)
    --- PASS: TestUpdateUserMaxDevices/Update_to_50_devices (0.00s)
    --- PASS: TestUpdateUserMaxDevices/Update_to_100_devices_(maximum) (0.00s)
=== RUN   TestUpdateUserMaxDevicesValidation
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'aed5da12-01db-422d-abef-9f87d472e25a'
2026/02/10 16:47:55 [REQUEST] {"request_id":"a98d8b4b-d843-4292-9726-81cbe80992fa","timestamp":"2026-02-10T16:47:55.784150714Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49778340,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.833949442Z","id":"a98d8b4b-d843-4292-9726-81cbe80992fa","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49794430,"latency_human":"49.79443ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.833962827Z","id":"a98d8b4b-d843-4292-9726-81cbe80992fa","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49805701,"latency_human":"49.805701ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"ccc045d2-052a-4beb-9cfe-a6995a394109","timestamp":"2026-02-10T16:47:55.834150375Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImIwNThlZWUwLTk3MDYtNDRjNS1hZGNiLWUxZWFjZjM4NWY1MSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.q_W3BfwiTp3KtSjcgyQBXXOM1M_f8xh5c4lCT7UMgrE","Content-Length":"135","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"admin@example.com","first_name":"Admin","last_name":"User","password":"Admin@Pass123!","role":"admin","username":"adminuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48820584,"status_code":403,"response_size":58}
{"time":"2026-02-10T16:47:55.882994783Z","id":"ccc045d2-052a-4beb-9cfe-a6995a394109","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":48843427,"latency_human":"48.843427ms","bytes_in":135,"bytes_out":58}
{"time":"2026-02-10T16:47:55.883000684Z","id":"ccc045d2-052a-4beb-9cfe-a6995a394109","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":48850640,"latency_human":"48.85064ms","bytes_in":135,"bytes_out":58}
DEBUG: refreshToken generated: '9791a725-7418-4238-9aff-4c90005a0b3f'
2026/02/10 16:47:55 [REQUEST] {"request_id":"2c6935b8-5624-4262-9a5a-d7fd525c4051","timestamp":"2026-02-10T16:47:55.888427129Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48576861,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:55.937029427Z","id":"2c6935b8-5624-4262-9a5a-d7fd525c4051","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48600535,"latency_human":"48.600535ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:55.937039135Z","id":"2c6935b8-5624-4262-9a5a-d7fd525c4051","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48612226,"latency_human":"48.612226ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:55 [REQUEST] {"request_id":"33970c75-bf0b-49a7-8214-1599cbac8693","timestamp":"2026-02-10T16:47:55.937270895Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjY0ZDliZTY4LWQ3ZjQtNGJjOS1hYTgwLTJmOGU5OWVlNDJhNCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.KDEBWcNUSM5weTFQ4VIx_Ghv_5mLgRJ8AqIqebUdMJI","Content-Length":"128","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"maxdevices@example.com","first_name":"Test","last_name":"User","password":"Test@Pass123!","username":"maxdevicesuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":339590,"status_code":409,"response_size":33}
{"time":"2026-02-10T16:47:55.937632306Z","id":"33970c75-bf0b-49a7-8214-1599cbac8693","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":409,"error":"","latency":360819,"latency_human":"360.819µs","bytes_in":128,"bytes_out":33}
{"time":"2026-02-10T16:47:55.937640721Z","id":"33970c75-bf0b-49a7-8214-1599cbac8693","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":409,"error":"","latency":370848,"latency_human":"370.848µs","bytes_in":128,"bytes_out":33}
    device_cap_test.go:345: User maxdevices@example.com already exists, logging in to get ID
DEBUG: refreshToken generated: '3c4cd4fd-a1cf-42ea-a737-33d95743cb5a'
2026/02/10 16:47:55 [REQUEST] {"request_id":"1ae3a91d-6e35-4643-867e-836bcc491d30","timestamp":"2026-02-10T16:47:55.938028821Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"61","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"maxdevices@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":51532043,"status_code":200,"response_size":595}
{"time":"2026-02-10T16:47:55.989599927Z","id":"1ae3a91d-6e35-4643-867e-836bcc491d30","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51570374,"latency_human":"51.570374ms","bytes_in":61,"bytes_out":595}
{"time":"2026-02-10T16:47:55.989609044Z","id":"1ae3a91d-6e35-4643-867e-836bcc491d30","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51580843,"latency_human":"51.580843ms","bytes_in":61,"bytes_out":595}
    device_cap_test.go:379: JWT claims: map[exp:1.770745675e+09 iat:1.770742075e+09 user_email:maxdevices@example.com user_id:5376cadf-3c0e-4629-9b00-eba8d0e176f9 user_role:user user_username:maxdevicesuser]
    device_cap_test.go:382: Extracted userID from JWT: 5376cadf-3c0e-4629-9b00-eba8d0e176f9
=== RUN   TestUpdateUserMaxDevicesValidation/Zero_devices_(below_minimum)
2026/02/10 16:47:55 [REQUEST] {"request_id":"7665dd04-eea6-4ccb-8aaa-f09804514c4b","timestamp":"2026-02-10T16:47:55.989964383Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjY0ZDliZTY4LWQ3ZjQtNGJjOS1hYTgwLTJmOGU5OWVlNDJhNCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.KDEBWcNUSM5weTFQ4VIx_Ghv_5mLgRJ8AqIqebUdMJI","Content-Length":"17","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":0},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":44452,"status_code":400,"response_size":127}
{"time":"2026-02-10T16:47:55.990018393Z","id":"7665dd04-eea6-4ccb-8aaa-f09804514c4b","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":54020,"latency_human":"54.02µs","bytes_in":17,"bytes_out":127}
{"time":"2026-02-10T16:47:55.990021949Z","id":"7665dd04-eea6-4ccb-8aaa-f09804514c4b","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":57928,"latency_human":"57.928µs","bytes_in":17,"bytes_out":127}
=== RUN   TestUpdateUserMaxDevicesValidation/Negative_devices
2026/02/10 16:47:55 [REQUEST] {"request_id":"c1b2205f-c1d8-4b5b-a1df-a703521785ac","timestamp":"2026-02-10T16:47:55.990324601Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjY0ZDliZTY4LWQ3ZjQtNGJjOS1hYTgwLTJmOGU5OWVlNDJhNCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.KDEBWcNUSM5weTFQ4VIx_Ghv_5mLgRJ8AqIqebUdMJI","Content-Length":"18","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":-1},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":29074,"status_code":400,"response_size":122}
{"time":"2026-02-10T16:47:55.990362621Z","id":"c1b2205f-c1d8-4b5b-a1df-a703521785ac","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":37370,"latency_human":"37.37µs","bytes_in":18,"bytes_out":122}
{"time":"2026-02-10T16:47:55.990370376Z","id":"c1b2205f-c1d8-4b5b-a1df-a703521785ac","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":45805,"latency_human":"45.805µs","bytes_in":18,"bytes_out":122}
=== RUN   TestUpdateUserMaxDevicesValidation/101_devices_(above_maximum)
2026/02/10 16:47:55 [REQUEST] {"request_id":"6c830db7-b927-41ca-9df2-957b5bdba982","timestamp":"2026-02-10T16:47:55.99053966Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjY0ZDliZTY4LWQ3ZjQtNGJjOS1hYTgwLTJmOGU5OWVlNDJhNCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.KDEBWcNUSM5weTFQ4VIx_Ghv_5mLgRJ8AqIqebUdMJI","Content-Length":"19","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":101},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":23052,"status_code":400,"response_size":122}
{"time":"2026-02-10T16:47:55.990574434Z","id":"6c830db7-b927-41ca-9df2-957b5bdba982","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":34735,"latency_human":"34.735µs","bytes_in":19,"bytes_out":122}
{"time":"2026-02-10T16:47:55.99057745Z","id":"6c830db7-b927-41ca-9df2-957b5bdba982","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":38130,"latency_human":"38.13µs","bytes_in":19,"bytes_out":122}
=== RUN   TestUpdateUserMaxDevicesValidation/1000_devices_(far_above_maximum)
2026/02/10 16:47:55 [REQUEST] {"request_id":"b485b967-913b-4ad7-9674-a50f899a7b5e","timestamp":"2026-02-10T16:47:55.990902152Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzUsImlhdCI6MTc3MDc0MjA3NSwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjY0ZDliZTY4LWQ3ZjQtNGJjOS1hYTgwLTJmOGU5OWVlNDJhNCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.KDEBWcNUSM5weTFQ4VIx_Ghv_5mLgRJ8AqIqebUdMJI","Content-Length":"20","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":1000},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":34975,"status_code":400,"response_size":122}
{"time":"2026-02-10T16:47:55.990950722Z","id":"b485b967-913b-4ad7-9674-a50f899a7b5e","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":48369,"latency_human":"48.369µs","bytes_in":20,"bytes_out":122}
{"time":"2026-02-10T16:47:55.990953798Z","id":"b485b967-913b-4ad7-9674-a50f899a7b5e","remote_ip":"127.0.0.1","host":"127.0.0.1:37475","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":51936,"latency_human":"51.936µs","bytes_in":20,"bytes_out":122}
--- PASS: TestUpdateUserMaxDevicesValidation (0.23s)
    --- PASS: TestUpdateUserMaxDevicesValidation/Zero_devices_(below_minimum) (0.00s)
    --- PASS: TestUpdateUserMaxDevicesValidation/Negative_devices (0.00s)
    --- PASS: TestUpdateUserMaxDevicesValidation/101_devices_(above_maximum) (0.00s)
    --- PASS: TestUpdateUserMaxDevicesValidation/1000_devices_(far_above_maximum) (0.00s)
=== RUN   TestUpdateUserMaxDevicesAuth
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:55 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '17c9c7da-4195-4ab6-b937-a4385c4f8d6d'
2026/02/10 16:47:56 [REQUEST] {"request_id":"00ad1082-155e-4940-b516-4c500d076dd9","timestamp":"2026-02-10T16:47:56.011004479Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49841378,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.060892383Z","id":"00ad1082-155e-4940-b516-4c500d076dd9","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49877244,"latency_human":"49.877244ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:56.060903434Z","id":"00ad1082-155e-4940-b516-4c500d076dd9","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49897703,"latency_human":"49.897703ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"8e454740-a834-421d-8e72-b7ac2380f11c","timestamp":"2026-02-10T16:47:56.061169257Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjU3MmQzZmRhLTY0OGEtNDAzNC1hZjI2LWZkNmU2NTZiODExMiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.XoDd_ZyqZB7c9zPcgXX5sfB_uqDrilGTpinxafJJ-8A","Content-Length":"135","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"admin@example.com","first_name":"Admin","last_name":"User","password":"Admin@Pass123!","role":"admin","username":"adminuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48419711,"status_code":403,"response_size":58}
{"time":"2026-02-10T16:47:56.109618392Z","id":"8e454740-a834-421d-8e72-b7ac2380f11c","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":48447313,"latency_human":"48.447313ms","bytes_in":135,"bytes_out":58}
{"time":"2026-02-10T16:47:56.109626147Z","id":"8e454740-a834-421d-8e72-b7ac2380f11c","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":48457050,"latency_human":"48.45705ms","bytes_in":135,"bytes_out":58}
DEBUG: refreshToken generated: '00679ec0-0a06-4d09-a939-bdf00708b437'
2026/02/10 16:47:56 [REQUEST] {"request_id":"17d8d12e-8631-4366-bc2c-801cfe10cf04","timestamp":"2026-02-10T16:47:56.115391631Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50497014,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.165911918Z","id":"17d8d12e-8631-4366-bc2c-801cfe10cf04","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50518684,"latency_human":"50.518684ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:56.165919913Z","id":"17d8d12e-8631-4366-bc2c-801cfe10cf04","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50528252,"latency_human":"50.528252ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"905602c2-ec6c-444d-a66e-b1947932cd6a","timestamp":"2026-02-10T16:47:56.166211413Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjljYTA2Nzk4LTA0ZmEtNDE5MC04ZjVkLTAyNzE4N2Q0MWQwYiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.wVf5PT6Wty464MCwFFPhTJBw8CjTtIy2j5ggW7_MgBA","Content-Length":"128","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"maxdevices@example.com","first_name":"Test","last_name":"User","password":"Test@Pass123!","username":"maxdevicesuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":319804,"status_code":409,"response_size":33}
{"time":"2026-02-10T16:47:56.166552095Z","id":"905602c2-ec6c-444d-a66e-b1947932cd6a","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":409,"error":"","latency":339901,"latency_human":"339.901µs","bytes_in":128,"bytes_out":33}
{"time":"2026-02-10T16:47:56.166557125Z","id":"905602c2-ec6c-444d-a66e-b1947932cd6a","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":409,"error":"","latency":346543,"latency_human":"346.543µs","bytes_in":128,"bytes_out":33}
    device_cap_test.go:345: User maxdevices@example.com already exists, logging in to get ID
DEBUG: refreshToken generated: '705410a9-9533-4d2a-91bf-5ba2cd26418e'
2026/02/10 16:47:56 [REQUEST] {"request_id":"d8306d27-b64e-4842-99bf-b9f686743571","timestamp":"2026-02-10T16:47:56.166763047Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"61","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"maxdevices@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50247039,"status_code":200,"response_size":595}
{"time":"2026-02-10T16:47:56.217032859Z","id":"d8306d27-b64e-4842-99bf-b9f686743571","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50267317,"latency_human":"50.267317ms","bytes_in":61,"bytes_out":595}
{"time":"2026-02-10T16:47:56.217041424Z","id":"d8306d27-b64e-4842-99bf-b9f686743571","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50285691,"latency_human":"50.285691ms","bytes_in":61,"bytes_out":595}
    device_cap_test.go:379: JWT claims: map[exp:1.770745676e+09 iat:1.770742076e+09 user_email:maxdevices@example.com user_id:5376cadf-3c0e-4629-9b00-eba8d0e176f9 user_role:user user_username:maxdevicesuser]
    device_cap_test.go:382: Extracted userID from JWT: 5376cadf-3c0e-4629-9b00-eba8d0e176f9
=== RUN   TestUpdateUserMaxDevicesAuth/No_authorization
2026/02/10 16:47:56 [REQUEST] {"request_id":"cd0c21a0-9325-4006-8319-09dfa6c074a7","timestamp":"2026-02-10T16:47:56.217447628Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Content-Length":"18","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":10},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":17152,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:56.217503041Z","id":"cd0c21a0-9325-4006-8319-09dfa6c074a7","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":55363,"latency_human":"55.363µs","bytes_in":18,"bytes_out":39}
{"time":"2026-02-10T16:47:56.217510535Z","id":"cd0c21a0-9325-4006-8319-09dfa6c074a7","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":70821,"latency_human":"70.821µs","bytes_in":18,"bytes_out":39}
=== RUN   TestUpdateUserMaxDevicesAuth/Non-admin_user
2026/02/10 16:47:56 [REQUEST] {"request_id":"ebbc1082-5a55-4ec5-a64e-f31de76c6fb1","timestamp":"2026-02-10T16:47:56.217839074Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjljYTA2Nzk4LTA0ZmEtNDE5MC04ZjVkLTAyNzE4N2Q0MWQwYiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.wVf5PT6Wty464MCwFFPhTJBw8CjTtIy2j5ggW7_MgBA","Content-Length":"128","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"maxdevices@example.com","first_name":"Test","last_name":"User","password":"Test@Pass123!","username":"maxdevicesuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":294897,"status_code":409,"response_size":33}
{"time":"2026-02-10T16:47:56.218169888Z","id":"ebbc1082-5a55-4ec5-a64e-f31de76c6fb1","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":409,"error":"","latency":330764,"latency_human":"330.764µs","bytes_in":128,"bytes_out":33}
{"time":"2026-02-10T16:47:56.218185276Z","id":"ebbc1082-5a55-4ec5-a64e-f31de76c6fb1","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":409,"error":"","latency":347224,"latency_human":"347.224µs","bytes_in":128,"bytes_out":33}
    device_cap_test.go:345: User maxdevices@example.com already exists, logging in to get ID
DEBUG: refreshToken generated: '172ce389-f307-4ab0-9b07-98a4e8341659'
2026/02/10 16:47:56 [REQUEST] {"request_id":"6dc8df0e-5a92-4c6c-b84b-04cc6e0ae038","timestamp":"2026-02-10T16:47:56.218390737Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"61","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"maxdevices@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50716130,"status_code":200,"response_size":595}
{"time":"2026-02-10T16:47:56.269121835Z","id":"6dc8df0e-5a92-4c6c-b84b-04cc6e0ae038","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50730316,"latency_human":"50.730316ms","bytes_in":61,"bytes_out":595}
{"time":"2026-02-10T16:47:56.269127335Z","id":"6dc8df0e-5a92-4c6c-b84b-04cc6e0ae038","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50736728,"latency_human":"50.736728ms","bytes_in":61,"bytes_out":595}
    device_cap_test.go:379: JWT claims: map[exp:1.770745676e+09 iat:1.770742076e+09 user_email:maxdevices@example.com user_id:5376cadf-3c0e-4629-9b00-eba8d0e176f9 user_role:user user_username:maxdevicesuser]
    device_cap_test.go:382: Extracted userID from JWT: 5376cadf-3c0e-4629-9b00-eba8d0e176f9
DEBUG: refreshToken generated: '23cf5337-a596-4c10-9970-e683fa9d839e'
2026/02/10 16:47:56 [REQUEST] {"request_id":"2addc3d4-bcc9-4364-80e8-018eafc3303c","timestamp":"2026-02-10T16:47:56.269365517Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"61","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"maxdevices@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48303676,"status_code":200,"response_size":595}
{"time":"2026-02-10T16:47:56.317693178Z","id":"2addc3d4-bcc9-4364-80e8-018eafc3303c","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48326478,"latency_human":"48.326478ms","bytes_in":61,"bytes_out":595}
{"time":"2026-02-10T16:47:56.31769969Z","id":"2addc3d4-bcc9-4364-80e8-018eafc3303c","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48337780,"latency_human":"48.33778ms","bytes_in":61,"bytes_out":595}
2026/02/10 16:47:56 [REQUEST] {"request_id":"5dff3430-175e-46a9-a6bb-2aadfc558ea2","timestamp":"2026-02-10T16:47:56.317868112Z","method":"PUT","path":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6Im1heGRldmljZXNAZXhhbXBsZS5jb20iLCJ1c2VyX2lkIjoiNTM3NmNhZGYtM2MwZS00NjI5LTliMDAtZWJhOGQwZTE3NmY5IiwidXNlcl9yb2xlIjoidXNlciIsInVzZXJfdXNlcm5hbWUiOiJtYXhkZXZpY2VzdXNlciJ9.hDnfTBbp7zszcmK3FvB3z0WYnRET7ZfizPaNWfqbgQE","Content-Length":"18","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":10},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":60002,"status_code":403,"response_size":34}
{"time":"2026-02-10T16:47:56.317939024Z","id":"5dff3430-175e-46a9-a6bb-2aadfc558ea2","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":70951,"latency_human":"70.951µs","bytes_in":18,"bytes_out":34}
{"time":"2026-02-10T16:47:56.317941959Z","id":"5dff3430-175e-46a9-a6bb-2aadfc558ea2","remote_ip":"127.0.0.1","host":"127.0.0.1:44069","method":"PUT","uri":"/api/auth/users/5376cadf-3c0e-4629-9b00-eba8d0e176f9/max-devices","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":74799,"latency_human":"74.799µs","bytes_in":18,"bytes_out":34}
--- PASS: TestUpdateUserMaxDevicesAuth (0.33s)
    --- PASS: TestUpdateUserMaxDevicesAuth/No_authorization (0.00s)
    --- PASS: TestUpdateUserMaxDevicesAuth/Non-admin_user (0.10s)
=== RUN   TestUpdateUserMaxDevicesNonExistentUser
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '3af8f5ed-2489-41c5-a20b-67eb63063fd4'
2026/02/10 16:47:56 [REQUEST] {"request_id":"d44774ae-ee28-4406-9dc4-bc82fd94d21d","timestamp":"2026-02-10T16:47:56.337516918Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":51894225,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.389435128Z","id":"d44774ae-ee28-4406-9dc4-bc82fd94d21d","remote_ip":"127.0.0.1","host":"127.0.0.1:43633","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51915144,"latency_human":"51.915144ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:56.389445517Z","id":"d44774ae-ee28-4406-9dc4-bc82fd94d21d","remote_ip":"127.0.0.1","host":"127.0.0.1:43633","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":51928730,"latency_human":"51.92873ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"3fdfdc5e-1c3d-48e3-af45-fc0a8ccecdcb","timestamp":"2026-02-10T16:47:56.389681144Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjJkNGI5OWMwLTk1OGMtNDBmNS1hYjhhLWJmZWJiYWI3Y2RjYSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.ZMEcItWC-Lgx6bCnIrvs09lBe8w_3BWl7zG6pUg9bcY","Content-Length":"135","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"admin@example.com","first_name":"Admin","last_name":"User","password":"Admin@Pass123!","role":"admin","username":"adminuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49640624,"status_code":403,"response_size":58}
{"time":"2026-02-10T16:47:56.439356462Z","id":"3fdfdc5e-1c3d-48e3-af45-fc0a8ccecdcb","remote_ip":"127.0.0.1","host":"127.0.0.1:43633","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":49674507,"latency_human":"49.674507ms","bytes_in":135,"bytes_out":58}
{"time":"2026-02-10T16:47:56.439363976Z","id":"3fdfdc5e-1c3d-48e3-af45-fc0a8ccecdcb","remote_ip":"127.0.0.1","host":"127.0.0.1:43633","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":49683794,"latency_human":"49.683794ms","bytes_in":135,"bytes_out":58}
DEBUG: refreshToken generated: 'a18b973e-339f-4a30-b2c3-088698269f3b'
2026/02/10 16:47:56 [REQUEST] {"request_id":"29ab3c8b-ec6c-4897-a884-bc771b84fb26","timestamp":"2026-02-10T16:47:56.445004168Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50254444,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.495283458Z","id":"29ab3c8b-ec6c-4897-a884-bc771b84fb26","remote_ip":"127.0.0.1","host":"127.0.0.1:43633","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50277857,"latency_human":"50.277857ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:56.495292635Z","id":"29ab3c8b-ec6c-4897-a884-bc771b84fb26","remote_ip":"127.0.0.1","host":"127.0.0.1:43633","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50288797,"latency_human":"50.288797ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"82d063e5-7456-42f5-b702-579159fc8ae6","timestamp":"2026-02-10T16:47:56.495496403Z","method":"PUT","path":"/api/auth/users/a34fd9d0-fa61-41a2-ab54-3b6614c67d98/max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjdkZGQxYjdkLTUwZDAtNGFjMC1hODg2LWI3ZTYzZjhlNGFjNiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.Nc8P-7r8TM2seOlJEUvIQ4u9PlRLJU1d_reEafOu6-I","Content-Length":"18","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":10},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":1018249,"status_code":404,"response_size":27}
{"time":"2026-02-10T16:47:56.49653549Z","id":"82d063e5-7456-42f5-b702-579159fc8ae6","remote_ip":"127.0.0.1","host":"127.0.0.1:43633","method":"PUT","uri":"/api/auth/users/a34fd9d0-fa61-41a2-ab54-3b6614c67d98/max-devices","user_agent":"Go-http-client/1.1","status":404,"error":"","latency":1038146,"latency_human":"1.038146ms","bytes_in":18,"bytes_out":27}
{"time":"2026-02-10T16:47:56.496559374Z","id":"82d063e5-7456-42f5-b702-579159fc8ae6","remote_ip":"127.0.0.1","host":"127.0.0.1:43633","method":"PUT","uri":"/api/auth/users/a34fd9d0-fa61-41a2-ab54-3b6614c67d98/max-devices","user_agent":"Go-http-client/1.1","status":404,"error":"","latency":1046301,"latency_human":"1.046301ms","bytes_in":18,"bytes_out":27}
--- PASS: TestUpdateUserMaxDevicesNonExistentUser (0.18s)
=== RUN   TestUpdateUserMaxDevicesMissingUserID
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '885a742e-a5e1-4f14-b562-380b731394c4'
2026/02/10 16:47:56 [REQUEST] {"request_id":"a676484c-04be-42fc-8919-964b34afe126","timestamp":"2026-02-10T16:47:56.516619292Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49508780,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.566159983Z","id":"a676484c-04be-42fc-8919-964b34afe126","remote_ip":"127.0.0.1","host":"127.0.0.1:34165","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49536262,"latency_human":"49.536262ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:56.566176193Z","id":"a676484c-04be-42fc-8919-964b34afe126","remote_ip":"127.0.0.1","host":"127.0.0.1:34165","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49551320,"latency_human":"49.55132ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"e8cb3840-1e2e-4326-be32-34b2c5ddc7ab","timestamp":"2026-02-10T16:47:56.566529308Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjEyOWQyNjMyLTViZTgtNGVjMi1iNmI5LTY4YTlkNDYzZDRmNSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.rVRLlfLOeG2Rlc4sOOYUWUCFJZ7liZ-11D3uApNZtNk","Content-Length":"135","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"admin@example.com","first_name":"Admin","last_name":"User","password":"Admin@Pass123!","role":"admin","username":"adminuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":46318614,"status_code":403,"response_size":58}
{"time":"2026-02-10T16:47:56.61287945Z","id":"e8cb3840-1e2e-4326-be32-34b2c5ddc7ab","remote_ip":"127.0.0.1","host":"127.0.0.1:34165","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":46349200,"latency_human":"46.3492ms","bytes_in":135,"bytes_out":58}
{"time":"2026-02-10T16:47:56.612886263Z","id":"e8cb3840-1e2e-4326-be32-34b2c5ddc7ab","remote_ip":"127.0.0.1","host":"127.0.0.1:34165","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":46357446,"latency_human":"46.357446ms","bytes_in":135,"bytes_out":58}
DEBUG: refreshToken generated: '89d62519-5fd5-4ddb-b2d4-629b70e084dc'
2026/02/10 16:47:56 [REQUEST] {"request_id":"0b709c36-a782-4400-ad0a-02d07d274e61","timestamp":"2026-02-10T16:47:56.619131817Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50611156,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.669766587Z","id":"0b709c36-a782-4400-ad0a-02d07d274e61","remote_ip":"127.0.0.1","host":"127.0.0.1:34165","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50632806,"latency_human":"50.632806ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:56.669776115Z","id":"0b709c36-a782-4400-ad0a-02d07d274e61","remote_ip":"127.0.0.1","host":"127.0.0.1:34165","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50644418,"latency_human":"50.644418ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"d64a5aad-99d8-41af-95d7-60fbd864539f","timestamp":"2026-02-10T16:47:56.669952882Z","method":"PUT","path":"/api/auth/users//max-devices","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6ImU4YmVjZjdmLWQ5MDUtNGFkNC1hZDM4LWI3MmJmZGQ3MTEyZiIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.I2fWzFm_xNE9Zp8UbWieXV3_GrlXhTf7RVVoKMcCAdk","Content-Length":"18","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"max_devices":10},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":62435,"status_code":400,"response_size":29}
{"time":"2026-02-10T16:47:56.670043751Z","id":"d64a5aad-99d8-41af-95d7-60fbd864539f","remote_ip":"127.0.0.1","host":"127.0.0.1:34165","method":"PUT","uri":"/api/auth/users//max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":90427,"latency_human":"90.427µs","bytes_in":18,"bytes_out":29}
{"time":"2026-02-10T16:47:56.670049952Z","id":"d64a5aad-99d8-41af-95d7-60fbd864539f","remote_ip":"127.0.0.1","host":"127.0.0.1:34165","method":"PUT","uri":"/api/auth/users//max-devices","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":97862,"latency_human":"97.862µs","bytes_in":18,"bytes_out":29}
--- PASS: TestUpdateUserMaxDevicesMissingUserID (0.17s)
=== RUN   TestListUsersIncludesMaxDevices
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ca5c2474-bffe-4d8b-95df-741bdb9ecea2'
2026/02/10 16:47:56 [REQUEST] {"request_id":"eea732e7-06a4-4eb9-a31a-78b8eb759ae6","timestamp":"2026-02-10T16:47:56.689274211Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50886085,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.740225317Z","id":"eea732e7-06a4-4eb9-a31a-78b8eb759ae6","remote_ip":"127.0.0.1","host":"127.0.0.1:42089","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50942731,"latency_human":"50.942731ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:56.740240926Z","id":"eea732e7-06a4-4eb9-a31a-78b8eb759ae6","remote_ip":"127.0.0.1","host":"127.0.0.1:42089","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50965613,"latency_human":"50.965613ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"01e271b4-9312-4467-9bee-a6dc3564cab8","timestamp":"2026-02-10T16:47:56.740621472Z","method":"POST","path":"/api/auth/register","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjNiODM0NjgzLWJjZjktNDY1NS04NTM2LTEwNjQzZGM0NjJhNSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.yecrQ3hU-M6cseY95jwe1YY20mFDFAGiHKHJMwSvvIM","Content-Length":"135","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"email":"admin@example.com","first_name":"Admin","last_name":"User","password":"Admin@Pass123!","role":"admin","username":"adminuser"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50438856,"status_code":403,"response_size":58}
{"time":"2026-02-10T16:47:56.791092568Z","id":"01e271b4-9312-4467-9bee-a6dc3564cab8","remote_ip":"127.0.0.1","host":"127.0.0.1:42089","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":50470635,"latency_human":"50.470635ms","bytes_in":135,"bytes_out":58}
{"time":"2026-02-10T16:47:56.791098198Z","id":"01e271b4-9312-4467-9bee-a6dc3564cab8","remote_ip":"127.0.0.1","host":"127.0.0.1:42089","method":"POST","uri":"/api/auth/register","user_agent":"Go-http-client/1.1","status":403,"error":"","latency":50478048,"latency_human":"50.478048ms","bytes_in":135,"bytes_out":58}
DEBUG: refreshToken generated: '1f96750e-a35a-4f52-8e34-d1362680b15e'
2026/02/10 16:47:56 [REQUEST] {"request_id":"10f09196-330c-46f3-bb81-397019a3f8bb","timestamp":"2026-02-10T16:47:56.796898397Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":50437904,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.847395972Z","id":"10f09196-330c-46f3-bb81-397019a3f8bb","remote_ip":"127.0.0.1","host":"127.0.0.1:42089","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50495041,"latency_human":"50.495041ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:56.847408495Z","id":"10f09196-330c-46f3-bb81-397019a3f8bb","remote_ip":"127.0.0.1","host":"127.0.0.1:42089","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":50510029,"latency_human":"50.510029ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"88485622-e47e-4817-8cff-66beb5670444","timestamp":"2026-02-10T16:47:56.847627792Z","method":"GET","path":"/api/auth/users","headers":{"Accept-Encoding":"gzip","Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjgwYjNmZmMwLWM5NGUtNDhmYi05OGFjLWYwYWFiNzY2NTFjOCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0._j6Bh84lYINfaD4X3wGF6fI0R456hrhl_KznxCt-obw","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":580096,"status_code":200,"response_size":3792}
{"time":"2026-02-10T16:47:56.848237673Z","id":"88485622-e47e-4817-8cff-66beb5670444","remote_ip":"127.0.0.1","host":"127.0.0.1:42089","method":"GET","uri":"/api/auth/users","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":608308,"latency_human":"608.308µs","bytes_in":0,"bytes_out":3792}
{"time":"2026-02-10T16:47:56.848254825Z","id":"88485622-e47e-4817-8cff-66beb5670444","remote_ip":"127.0.0.1","host":"127.0.0.1:42089","method":"GET","uri":"/api/auth/users","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":627965,"latency_human":"627.965µs","bytes_in":0,"bytes_out":3792}
--- PASS: TestListUsersIncludesMaxDevices (0.18s)
=== RUN   TestDeviceRegistrationFlow
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:56 [REQUEST] {"request_id":"4dacf355-2b64-4381-b85b-25fac2cbd2a1","timestamp":"2026-02-10T16:47:56.84905032Z","method":"POST","path":"/api/devices/register","headers":{"Content-Type":"application/json"},"body":{"device_identifier":"kindle-test-hw-id-12345","device_name":"Test Kindle Paperwhite","device_type":"koreader"},"remote_addr":"192.0.2.1","duration":1441314,"status_code":201,"response_size":1239}
{"time":"2026-02-10T16:47:56.850506211Z","id":"4dacf355-2b64-4381-b85b-25fac2cbd2a1","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/devices/register","user_agent":"","status":201,"error":"","latency":1452785,"latency_human":"1.452785ms","bytes_in":0,"bytes_out":1239}
{"time":"2026-02-10T16:47:56.850512362Z","id":"4dacf355-2b64-4381-b85b-25fac2cbd2a1","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/devices/register","user_agent":"","status":201,"error":"","latency":1460449,"latency_human":"1.460449ms","bytes_in":0,"bytes_out":1239}
2026/02/10 16:47:56 [REQUEST] {"request_id":"13995485-207c-424a-ba1d-52eea415e0cc","timestamp":"2026-02-10T16:47:56.850542949Z","method":"POST","path":"/api/devices/register/status","headers":{"Content-Type":"application/json"},"body":{"registration_id":"3e9df04d-4ac1-4f7a-b913-fbccfebb562d"},"remote_addr":"192.0.2.1","duration":18575,"status_code":200,"response_size":124}
{"time":"2026-02-10T16:47:56.850566583Z","id":"13995485-207c-424a-ba1d-52eea415e0cc","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/devices/register/status","user_agent":"","status":200,"error":"","latency":23704,"latency_human":"23.704µs","bytes_in":0,"bytes_out":124}
{"time":"2026-02-10T16:47:56.850568757Z","id":"13995485-207c-424a-ba1d-52eea415e0cc","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/devices/register/status","user_agent":"","status":200,"error":"","latency":26149,"latency_human":"26.149µs","bytes_in":0,"bytes_out":124}
DEBUG: refreshToken generated: '69333176-b3ab-4e87-8f8a-bb58fc291da4'
2026/02/10 16:47:56 [REQUEST] {"request_id":"ee38fbe7-cc7d-4b38-89fb-c48052c46500","timestamp":"2026-02-10T16:47:56.850585428Z","method":"POST","path":"/api/auth/login","headers":{"Content-Type":"application/json"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"192.0.2.1","duration":54524474,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:56.905138115Z","id":"ee38fbe7-cc7d-4b38-89fb-c48052c46500","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/auth/login","user_agent":"","status":200,"error":"","latency":54549220,"latency_human":"54.54922ms","bytes_in":0,"bytes_out":579}
{"time":"2026-02-10T16:47:56.905144146Z","id":"ee38fbe7-cc7d-4b38-89fb-c48052c46500","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/auth/login","user_agent":"","status":200,"error":"","latency":54558438,"latency_human":"54.558438ms","bytes_in":0,"bytes_out":579}
2026/02/10 16:47:56 [REQUEST] {"request_id":"e2d56846-def4-466a-8420-067bca79b9c9","timestamp":"2026-02-10T16:47:56.905190492Z","method":"GET","path":"/api/devices/approve/3e9df04d-4ac1-4f7a-b913-fbccfebb562d","headers":{"Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzYsImlhdCI6MTc3MDc0MjA3NiwidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjgwYjNmZmMwLWM5NGUtNDhmYi05OGFjLWYwYWFiNzY2NTFjOCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0._j6Bh84lYINfaD4X3wGF6fI0R456hrhl_KznxCt-obw","Content-Type":"application/json"},"remote_addr":"192.0.2.1","duration":22151,"status_code":200,"response_size":180}
{"time":"2026-02-10T16:47:56.905217031Z","id":"e2d56846-def4-466a-8420-067bca79b9c9","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/devices/approve/3e9df04d-4ac1-4f7a-b913-fbccfebb562d","user_agent":"","status":200,"error":"","latency":26619,"latency_human":"26.619µs","bytes_in":0,"bytes_out":180}
{"time":"2026-02-10T16:47:56.905218925Z","id":"e2d56846-def4-466a-8420-067bca79b9c9","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/devices/approve/3e9df04d-4ac1-4f7a-b913-fbccfebb562d","user_agent":"","status":200,"error":"","latency":29054,"latency_human":"29.054µs","bytes_in":0,"bytes_out":180}
2026/02/10 16:47:56 [REQUEST] {"request_id":"8774211d-df18-4c1b-a1b1-2185d113d2dc","timestamp":"2026-02-10T16:47:56.905227631Z","method":"POST","path":"/api/devices/register/status","headers":{"Content-Type":"application/json"},"body":{"registration_id":"3e9df04d-4ac1-4f7a-b913-fbccfebb562d"},"remote_addr":"192.0.2.1","duration":49028039,"status_code":200,"response_size":365}
{"time":"2026-02-10T16:47:56.954278352Z","id":"8774211d-df18-4c1b-a1b1-2185d113d2dc","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/devices/register/status","user_agent":"","status":200,"error":"","latency":49049659,"latency_human":"49.049659ms","bytes_in":0,"bytes_out":365}
{"time":"2026-02-10T16:47:56.954286307Z","id":"8774211d-df18-4c1b-a1b1-2185d113d2dc","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/devices/register/status","user_agent":"","status":200,"error":"","latency":49058346,"latency_human":"49.058346ms","bytes_in":0,"bytes_out":365}
--- PASS: TestDeviceRegistrationFlow (0.11s)
=== RUN   TestListDevices
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:56 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: 'ac26bd4e-23e1-4eab-b76f-a143abb3341d'
2026/02/10 16:47:57 [REQUEST] {"request_id":"4f0dff82-483f-4938-8680-6fa685378255","timestamp":"2026-02-10T16:47:56.980619371Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":49758865,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:57.030427777Z","id":"4f0dff82-483f-4938-8680-6fa685378255","remote_ip":"127.0.0.1","host":"127.0.0.1:34849","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49797056,"latency_human":"49.797056ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:57.030446893Z","id":"4f0dff82-483f-4938-8680-6fa685378255","remote_ip":"127.0.0.1","host":"127.0.0.1:34849","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49827012,"latency_human":"49.827012ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:57 [REQUEST] {"request_id":"1cb208de-1c6b-42fb-b50d-e256d096b03a","timestamp":"2026-02-10T16:47:57.033703834Z","method":"GET","path":"/api/devices","headers":{"Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzcsImlhdCI6MTc3MDc0MjA3NywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6Ijk3ODVkNTNmLThiYWMtNDA3Ni1hZDJkLWRmYWU3N2VjNzRhNCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.ATazFbFSO4EY-xiMUOcH-jNIJRhg4NYWmtoa1FIVywY"},"remote_addr":"192.0.2.1","duration":1232676,"status_code":200,"response_size":321}
{"time":"2026-02-10T16:47:57.034958191Z","id":"1cb208de-1c6b-42fb-b50d-e256d096b03a","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/devices","user_agent":"","status":200,"error":"","latency":1253234,"latency_human":"1.253234ms","bytes_in":0,"bytes_out":321}
{"time":"2026-02-10T16:47:57.03496323Z","id":"1cb208de-1c6b-42fb-b50d-e256d096b03a","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/devices","user_agent":"","status":200,"error":"","latency":1259897,"latency_human":"1.259897ms","bytes_in":0,"bytes_out":321}
--- PASS: TestListDevices (0.08s)
=== RUN   TestUpdateDevice
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '1d1da3af-f596-4db4-b7be-b8663a4e17e0'
2026/02/10 16:47:57 [REQUEST] {"request_id":"adb7c2e8-2569-4779-a6b2-831ddfdcd2d4","timestamp":"2026-02-10T16:47:57.057487449Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48836013,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:57.1063763Z","id":"adb7c2e8-2569-4779-a6b2-831ddfdcd2d4","remote_ip":"127.0.0.1","host":"127.0.0.1:35575","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48878883,"latency_human":"48.878883ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:57.106393552Z","id":"adb7c2e8-2569-4779-a6b2-831ddfdcd2d4","remote_ip":"127.0.0.1","host":"127.0.0.1:35575","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":48901946,"latency_human":"48.901946ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:57 [REQUEST] {"request_id":"d8011d2f-6980-4796-9a7b-8cb54d0b2f86","timestamp":"2026-02-10T16:47:57.109297919Z","method":"PUT","path":"/api/devices/af8df2a6-1abc-45f9-a4d2-fd633855d751","headers":{"Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzcsImlhdCI6MTc3MDc0MjA3NywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjQ5MTE2MDlhLTgxYzktNDMxNy04ZmQ1LTk3YTlmZjMzOTQzMCIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.F0kN3As7_A3Vrth-vlYXMWcL4Eyke7XuRRMkjjFISoE","Content-Type":"application/json"},"body":{"device_name":"Updated Device Name","sync_enabled":false,"sync_frequency_minutes":10},"remote_addr":"192.0.2.1","duration":5014562,"status_code":200,"response_size":340}
{"time":"2026-02-10T16:47:57.114361391Z","id":"d8011d2f-6980-4796-9a7b-8cb54d0b2f86","remote_ip":"192.0.2.1","host":"example.com","method":"PUT","uri":"/api/devices/af8df2a6-1abc-45f9-a4d2-fd633855d751","user_agent":"","status":200,"error":"","latency":5060376,"latency_human":"5.060376ms","bytes_in":0,"bytes_out":340}
{"time":"2026-02-10T16:47:57.114382631Z","id":"d8011d2f-6980-4796-9a7b-8cb54d0b2f86","remote_ip":"192.0.2.1","host":"example.com","method":"PUT","uri":"/api/devices/af8df2a6-1abc-45f9-a4d2-fd633855d751","user_agent":"","status":200,"error":"","latency":5076716,"latency_human":"5.076716ms","bytes_in":0,"bytes_out":340}
--- PASS: TestUpdateDevice (0.08s)
=== RUN   TestDeleteDevice
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
DEBUG: refreshToken generated: '6f4d2a7e-7967-4303-8270-8b403ddd1c8f'
2026/02/10 16:47:57 [REQUEST] {"request_id":"9ca200ea-e8ef-4006-9d24-e7332c7fbc61","timestamp":"2026-02-10T16:47:57.13987758Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":48996190,"status_code":200,"response_size":579}
{"time":"2026-02-10T16:47:57.188903545Z","id":"9ca200ea-e8ef-4006-9d24-e7332c7fbc61","remote_ip":"127.0.0.1","host":"127.0.0.1:35689","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49017731,"latency_human":"49.017731ms","bytes_in":59,"bytes_out":579}
{"time":"2026-02-10T16:47:57.188914826Z","id":"9ca200ea-e8ef-4006-9d24-e7332c7fbc61","remote_ip":"127.0.0.1","host":"127.0.0.1:35689","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":200,"error":"","latency":49035042,"latency_human":"49.035042ms","bytes_in":59,"bytes_out":579}
2026/02/10 16:47:57 [REQUEST] {"request_id":"92e8c350-f0ce-49ac-8f63-664f40f6a560","timestamp":"2026-02-10T16:47:57.191958772Z","method":"DELETE","path":"/api/devices/ec7a2870-9c81-4a9f-a488-71a8fe1eec02","headers":{"Authorization":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3NzA3NDU2NzcsImlhdCI6MTc3MDc0MjA3NywidXNlcl9lbWFpbCI6InRlc3R1c2VyQGV4YW1wbGUuY29tIiwidXNlcl9pZCI6IjU1ZDFmZTM1LTA4MjktNGYyYy1hNWM4LWU4MjExZGJkNGUxZSIsInVzZXJfcm9sZSI6ImFkbWluIiwidXNlcl91c2VybmFtZSI6InRlc3R1c2VyIn0.heeFlfq9xWkd9FMHjGIzN8y5UsAS02hKitQtRE1Fx8c"},"remote_addr":"192.0.2.1","duration":3324928,"status_code":204,"response_size":0}
{"time":"2026-02-10T16:47:57.195322041Z","id":"92e8c350-f0ce-49ac-8f63-664f40f6a560","remote_ip":"192.0.2.1","host":"example.com","method":"DELETE","uri":"/api/devices/ec7a2870-9c81-4a9f-a488-71a8fe1eec02","user_agent":"","status":204,"error":"","latency":3361224,"latency_human":"3.361224ms","bytes_in":0,"bytes_out":0}
{"time":"2026-02-10T16:47:57.195331909Z","id":"92e8c350-f0ce-49ac-8f63-664f40f6a560","remote_ip":"192.0.2.1","host":"example.com","method":"DELETE","uri":"/api/devices/ec7a2870-9c81-4a9f-a488-71a8fe1eec02","user_agent":"","status":204,"error":"","latency":3373387,"latency_human":"3.373387ms","bytes_in":0,"bytes_out":0}
--- PASS: TestDeleteDevice (0.08s)
=== RUN   TestDeviceAuthentication
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 [REQUEST] {"request_id":"4439a694-80f5-4ecd-9881-1c2ee2cae6b4","timestamp":"2026-02-10T16:47:57.217388521Z","method":"GET","path":"/api/devices","headers":{"Authorization":"Bearer dev_a415d1b1-5364-4076-835f-86c24810b69b"},"remote_addr":"192.0.2.1","duration":9958,"status_code":200,"response_size":0,"error":"code=401, message=invalid or expired jwt, internal=token is malformed: token contains an invalid number of segments"}
{"time":"2026-02-10T16:47:57.217431791Z","id":"4439a694-80f5-4ecd-9881-1c2ee2cae6b4","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/devices","user_agent":"","status":401,"error":"code=401, message=invalid or expired jwt, internal=token is malformed: token contains an invalid number of segments","latency":41968,"latency_human":"41.968µs","bytes_in":0,"bytes_out":37}
{"time":"2026-02-10T16:47:57.217439375Z","id":"4439a694-80f5-4ecd-9881-1c2ee2cae6b4","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/devices","user_agent":"","status":401,"error":"","latency":49723,"latency_human":"49.723µs","bytes_in":0,"bytes_out":37}
--- PASS: TestDeviceAuthentication (0.02s)
=== RUN   TestListPendingRegistrations
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/device_test.go:236
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestListPendingRegistrations
        	Messages:   	Failed to create test user
--- FAIL: TestListPendingRegistrations (0.00s)
=== RUN   TestApproveDeviceRegistration
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/device_test.go:257
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestApproveDeviceRegistration
        	Messages:   	Failed to create test user
--- FAIL: TestApproveDeviceRegistration (0.00s)
=== RUN   TestRejectDeviceRegistration
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/device_test.go:296
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestRejectDeviceRegistration
        	Messages:   	Failed to create test user
--- FAIL: TestRejectDeviceRegistration (0.00s)
=== RUN   TestScannerEndpoints
=== RUN   TestScannerEndpoints/POST_/api/scanner/scan_-_Scan_without_admin_role
=== RUN   TestScannerEndpoints/POST_/api/scanner/watch/start_-_Start_watch_mode
=== RUN   TestScannerEndpoints/POST_/api/scanner/watch/stop_-_Stop_watch_mode
=== RUN   TestScannerEndpoints/GET_/api/scanner/watch/status_-_Get_watch_mode_status
=== RUN   TestScannerEndpoints/GET_/api/scanner/status/:jobId_-_Get_job_status
=== RUN   TestScannerEndpoints/GET_/api/scanner/status/:jobId_-_Job_not_found
=== RUN   TestScannerEndpoints/POST_/api/scanner/scan_-_Successful_scan_(background_job)
=== RUN   TestScannerEndpoints/POST_/api/scanner/start_-_Start_scanner_without_admin_role
=== RUN   TestScannerEndpoints/POST_/api/scanner/start_-_Start_scanner_successfully
=== RUN   TestScannerEndpoints/POST_/api/scanner/stop_-_Stop_scanner_without_admin_role
=== RUN   TestScannerEndpoints/POST_/api/scanner/stop_-_Stop_scanner_successfully
--- PASS: TestScannerEndpoints (0.00s)
    --- PASS: TestScannerEndpoints/POST_/api/scanner/scan_-_Scan_without_admin_role (0.00s)
    --- PASS: TestScannerEndpoints/POST_/api/scanner/watch/start_-_Start_watch_mode (0.00s)
    --- PASS: TestScannerEndpoints/POST_/api/scanner/watch/stop_-_Stop_watch_mode (0.00s)
    --- PASS: TestScannerEndpoints/GET_/api/scanner/watch/status_-_Get_watch_mode_status (0.00s)
    --- PASS: TestScannerEndpoints/GET_/api/scanner/status/:jobId_-_Get_job_status (0.00s)
    --- PASS: TestScannerEndpoints/GET_/api/scanner/status/:jobId_-_Job_not_found (0.00s)
    --- PASS: TestScannerEndpoints/POST_/api/scanner/scan_-_Successful_scan_(background_job) (0.00s)
    --- PASS: TestScannerEndpoints/POST_/api/scanner/start_-_Start_scanner_without_admin_role (0.00s)
    --- PASS: TestScannerEndpoints/POST_/api/scanner/start_-_Start_scanner_successfully (0.00s)
    --- PASS: TestScannerEndpoints/POST_/api/scanner/stop_-_Stop_scanner_without_admin_role (0.00s)
    --- PASS: TestScannerEndpoints/POST_/api/scanner/stop_-_Stop_scanner_successfully (0.00s)
=== RUN   TestEdgeCases
=== RUN   TestEdgeCases/Empty_request_body
=== RUN   TestEdgeCases/Malformed_JSON
=== RUN   TestEdgeCases/Very_large_payload
=== RUN   TestEdgeCases/SQL_Injection_attempt
=== RUN   TestEdgeCases/XSS_attempt_in_fields
=== RUN   TestEdgeCases/Rate_limiting_simulation
--- PASS: TestEdgeCases (0.00s)
    --- PASS: TestEdgeCases/Empty_request_body (0.00s)
    --- PASS: TestEdgeCases/Malformed_JSON (0.00s)
    --- PASS: TestEdgeCases/Very_large_payload (0.00s)
    --- PASS: TestEdgeCases/SQL_Injection_attempt (0.00s)
    --- PASS: TestEdgeCases/XSS_attempt_in_fields (0.00s)
    --- PASS: TestEdgeCases/Rate_limiting_simulation (0.00s)
=== RUN   TestHTMXRequests
=== RUN   TestHTMXRequests/Registration_with_HTMX_header
=== RUN   TestHTMXRequests/Registration_error_with_HTMX_header
--- PASS: TestHTMXRequests (0.00s)
    --- PASS: TestHTMXRequests/Registration_with_HTMX_header (0.00s)
    --- PASS: TestHTMXRequests/Registration_error_with_HTMX_header (0.00s)
=== RUN   TestConcurrentRequests
=== RUN   TestConcurrentRequests/Multiple_concurrent_requests
--- PASS: TestConcurrentRequests (0.00s)
    --- PASS: TestConcurrentRequests/Multiple_concurrent_requests (0.00s)
=== RUN   TestJWTValidation
=== RUN   TestJWTValidation/Valid_JWT_format
=== RUN   TestJWTValidation/Invalid_JWT_-_no_Bearer_prefix
=== RUN   TestJWTValidation/Invalid_JWT_-_malformed
--- PASS: TestJWTValidation (0.00s)
    --- PASS: TestJWTValidation/Valid_JWT_format (0.00s)
    --- PASS: TestJWTValidation/Invalid_JWT_-_no_Bearer_prefix (0.00s)
    --- PASS: TestJWTValidation/Invalid_JWT_-_malformed (0.00s)
=== RUN   TestListMediaItemsFiltering
=== RUN   TestListMediaItemsFiltering/No_user_context_-_GET_/api/media-items/filtered_without_authentication
=== RUN   TestListMediaItemsFiltering/User_context_-_Filter_by_genre
=== RUN   TestListMediaItemsFiltering/User_context_-_Filter_by_language
=== RUN   TestListMediaItemsFiltering/User_context_-_Filter_by_year_range
=== RUN   TestListMediaItemsFiltering/User_context_-_Filter_by_has_cover
=== RUN   TestListMediaItemsFiltering/User_context_-_Combine_multiple_filters
=== RUN   TestListMediaItemsFiltering/User_context_-_Filter_with_pagination
=== RUN   TestListMediaItemsFiltering/User_context_-_Filter_with_sorting
--- PASS: TestListMediaItemsFiltering (0.00s)
    --- PASS: TestListMediaItemsFiltering/No_user_context_-_GET_/api/media-items/filtered_without_authentication (0.00s)
    --- PASS: TestListMediaItemsFiltering/User_context_-_Filter_by_genre (0.00s)
    --- PASS: TestListMediaItemsFiltering/User_context_-_Filter_by_language (0.00s)
    --- PASS: TestListMediaItemsFiltering/User_context_-_Filter_by_year_range (0.00s)
    --- PASS: TestListMediaItemsFiltering/User_context_-_Filter_by_has_cover (0.00s)
    --- PASS: TestListMediaItemsFiltering/User_context_-_Combine_multiple_filters (0.00s)
    --- PASS: TestListMediaItemsFiltering/User_context_-_Filter_with_pagination (0.00s)
    --- PASS: TestListMediaItemsFiltering/User_context_-_Filter_with_sorting (0.00s)
=== RUN   TestGoroutineCleanup
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
    goroutine_leak_test.go:18: Initial goroutine count: 2042
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
    goroutine_leak_test.go:27: Goroutines while running: 2067 (delta: +25)
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:57 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
    goroutine_leak_test.go:35: Goroutines after shutdown: 2066 (delta: 24)
    goroutine_leak_test.go:43: WARNING: 24 goroutines still running after shutdown (may be expected for test infrastructure)
--- PASS: TestGoroutineCleanup (0.80s)
=== RUN   TestKoboInitialization
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/kobo_test.go:23
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestKoboInitialization
        	Messages:   	Failed to create test user
--- FAIL: TestKoboInitialization (0.00s)
=== RUN   TestKoboLibrarySync
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/kobo_test.go:48
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestKoboLibrarySync
        	Messages:   	Failed to create test user
--- FAIL: TestKoboLibrarySync (0.00s)
=== RUN   TestKoboMarkupSync
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/kobo_test.go:72
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestKoboMarkupSync
        	Messages:   	Failed to create test user
--- FAIL: TestKoboMarkupSync (0.00s)
=== RUN   TestKoboBookmarkSync
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/kobo_test.go:128
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestKoboBookmarkSync
        	Messages:   	Failed to create test user
--- FAIL: TestKoboBookmarkSync (0.00s)
=== RUN   TestKoboAnalyticsGettests
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/kobo_test.go:169
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestKoboAnalyticsGettests
        	Messages:   	Failed to create test user
--- FAIL: TestKoboAnalyticsGettests (0.00s)
=== RUN   TestKoboDeviceHeaderParsing
=== RUN   TestKoboDeviceHeaderParsing/valid_device_header
--- PASS: TestKoboDeviceHeaderParsing (0.00s)
    --- PASS: TestKoboDeviceHeaderParsing/valid_device_header (0.00s)
=== RUN   TestKOReaderSyncProgress_RequestBody
=== RUN   TestKOReaderSyncProgress_RequestBody/valid_request_body
=== RUN   TestKOReaderSyncProgress_RequestBody/request_with_multiple_books
=== RUN   TestKOReaderSyncProgress_RequestBody/request_with_highlights_and_bookmarks
--- PASS: TestKOReaderSyncProgress_RequestBody (0.00s)
    --- PASS: TestKOReaderSyncProgress_RequestBody/valid_request_body (0.00s)
    --- PASS: TestKOReaderSyncProgress_RequestBody/request_with_multiple_books (0.00s)
    --- PASS: TestKOReaderSyncProgress_RequestBody/request_with_highlights_and_bookmarks (0.00s)
=== RUN   TestKOReaderMetadataParsing
=== RUN   TestKOReaderMetadataParsing/parse_progress_data
=== RUN   TestKOReaderMetadataParsing/parse_annotation_data
--- PASS: TestKOReaderMetadataParsing (0.00s)
    --- PASS: TestKOReaderMetadataParsing/parse_progress_data (0.00s)
    --- PASS: TestKOReaderMetadataParsing/parse_annotation_data (0.00s)
=== RUN   TestKOReaderResponseFormats
=== RUN   TestKOReaderResponseFormats/sync_progress_response
=== RUN   TestKOReaderResponseFormats/metadata_response
=== RUN   TestKOReaderResponseFormats/library_response
--- PASS: TestKOReaderResponseFormats (0.00s)
    --- PASS: TestKOReaderResponseFormats/sync_progress_response (0.00s)
    --- PASS: TestKOReaderResponseFormats/metadata_response (0.00s)
    --- PASS: TestKOReaderResponseFormats/library_response (0.00s)
=== RUN   TestKOReaderErrorHandling
=== RUN   TestKOReaderErrorHandling/invalid_UUID_format
=== RUN   TestKOReaderErrorHandling/missing_authorization_header
=== RUN   TestKOReaderErrorHandling/invalid_percentage_value
--- PASS: TestKOReaderErrorHandling (0.00s)
    --- PASS: TestKOReaderErrorHandling/invalid_UUID_format (0.00s)
    --- PASS: TestKOReaderErrorHandling/missing_authorization_header (0.00s)
    --- PASS: TestKOReaderErrorHandling/invalid_percentage_value (0.00s)
=== RUN   TestKOReaderDeviceMatching
=== RUN   TestKOReaderDeviceMatching/match_by_UUID
=== RUN   TestKOReaderDeviceMatching/match_by_file_path
=== RUN   TestKOReaderDeviceMatching/match_by_title_and_author
--- PASS: TestKOReaderDeviceMatching (0.00s)
    --- PASS: TestKOReaderDeviceMatching/match_by_UUID (0.00s)
    --- PASS: TestKOReaderDeviceMatching/match_by_file_path (0.00s)
    --- PASS: TestKOReaderDeviceMatching/match_by_title_and_author (0.00s)
=== RUN   TestAuthMiddleware
=== RUN   TestAuthMiddleware/Missing_JWT
=== RUN   TestAuthMiddleware/Invalid_JWT_format
=== RUN   TestAuthMiddleware/Valid_JWT_format
--- PASS: TestAuthMiddleware (0.00s)
    --- PASS: TestAuthMiddleware/Missing_JWT (0.00s)
    --- PASS: TestAuthMiddleware/Invalid_JWT_format (0.00s)
    --- PASS: TestAuthMiddleware/Valid_JWT_format (0.00s)
=== RUN   TestLibraryCreationUnauthorized
--- PASS: TestLibraryCreationUnauthorized (0.00s)
=== RUN   TestLibraryCreationWithValidAdmin
--- PASS: TestLibraryCreationWithValidAdmin (0.00s)
=== RUN   TestLibraryTypesResponse
--- PASS: TestLibraryTypesResponse (0.00s)
=== RUN   TestUserVisibleLibraries
--- PASS: TestUserVisibleLibraries (0.00s)
=== RUN   TestMediaItemsList
--- PASS: TestMediaItemsList (0.00s)
=== RUN   TestJSONValidation
=== RUN   TestJSONValidation/Invalid_JSON
=== RUN   TestJSONValidation/Invalid_library_type
=== RUN   TestJSONValidation/Valid_request
--- PASS: TestJSONValidation (0.00s)
    --- PASS: TestJSONValidation/Invalid_JSON (0.00s)
    --- PASS: TestJSONValidation/Invalid_library_type (0.00s)
    --- PASS: TestJSONValidation/Valid_request (0.00s)
=== RUN   TestErrorHandling
=== RUN   TestErrorHandling/Missing_library_ID
=== RUN   TestErrorHandling/Invalid_UUID
=== RUN   TestErrorHandling/Nonexistent_user_library
--- PASS: TestErrorHandling (0.00s)
    --- PASS: TestErrorHandling/Missing_library_ID (0.00s)
    --- PASS: TestErrorHandling/Invalid_UUID (0.00s)
    --- PASS: TestErrorHandling/Nonexistent_user_library (0.00s)
=== RUN   TestTest
    main_test.go:8: 🧪 Comprehensive test suite verification
    main_test.go:9: ✅ Testing framework is properly configured
    main_test.go:10: 📋 Test discovery and execution should work correctly
    main_test.go:11: 🎯 All edge cases should be covered
--- PASS: TestTest (0.00s)
=== RUN   TestMediaBulkOperations
=== RUN   TestMediaBulkOperations/BulkDeleteBooks_WithoutAuth
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"3ef776d6-3ee8-4876-916b-cac0ff628ca2","timestamp":"2026-02-10T16:47:58.042305103Z","method":"POST","path":"/api/books/bulk-delete","headers":{"Accept-Encoding":"gzip","Content-Length":"53","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"book_ids":["b416a4fc-fca7-4e3a-901f-6035198febaf"]},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":11521,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:58.042337864Z","id":"3ef776d6-3ee8-4876-916b-cac0ff628ca2","remote_ip":"127.0.0.1","host":"127.0.0.1:33325","method":"POST","uri":"/api/books/bulk-delete","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":31429,"latency_human":"31.429µs","bytes_in":53,"bytes_out":39}
{"time":"2026-02-10T16:47:58.042342883Z","id":"3ef776d6-3ee8-4876-916b-cac0ff628ca2","remote_ip":"127.0.0.1","host":"127.0.0.1:33325","method":"POST","uri":"/api/books/bulk-delete","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":37669,"latency_human":"37.669µs","bytes_in":53,"bytes_out":39}
=== RUN   TestMediaBulkOperations/BulkDeleteBooks_EmptyBookIDs
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:40
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkDeleteBooks_EmptyBookIDs
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkDeleteBooks_InvalidBookIDs
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:63
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkDeleteBooks_InvalidBookIDs
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkDeleteBooks_WithValidBooks
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:94
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkDeleteBooks_WithValidBooks
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkDeleteBooks_InvalidRequestBody
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:132
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkDeleteBooks_InvalidRequestBody
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkUpdateBooks_WithoutAuth
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"17f21138-0f79-4bd2-874c-f0b1cc5e0e6f","timestamp":"2026-02-10T16:47:58.050928688Z","method":"POST","path":"/api/books/bulk-update","headers":{"Accept-Encoding":"gzip","Content-Length":"81","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"book_ids":["2781a621-a63b-4db0-8db0-1b6e49d8a236"],"updates":{"tags":["test"]}},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":11612,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:58.050962361Z","id":"17f21138-0f79-4bd2-874c-f0b1cc5e0e6f","remote_ip":"127.0.0.1","host":"127.0.0.1:44915","method":"POST","uri":"/api/books/bulk-update","user_agent":"Go-http-client/1.1","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":38371,"latency_human":"38.371µs","bytes_in":81,"bytes_out":39}
{"time":"2026-02-10T16:47:58.050970606Z","id":"17f21138-0f79-4bd2-874c-f0b1cc5e0e6f","remote_ip":"127.0.0.1","host":"127.0.0.1:44915","method":"POST","uri":"/api/books/bulk-update","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":48410,"latency_human":"48.41µs","bytes_in":81,"bytes_out":39}
=== RUN   TestMediaBulkOperations/BulkUpdateBooks_EmptyBookIDs
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:174
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkUpdateBooks_EmptyBookIDs
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkUpdateBooks_InvalidBookIDs
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:200
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkUpdateBooks_InvalidBookIDs
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkUpdateBooks_UpdateTags
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:234
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkUpdateBooks_UpdateTags
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkUpdateBooks_UpdateReadingStatus
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:274
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkUpdateBooks_UpdateReadingStatus
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkUpdateBooks_UpdateMultipleFields
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:308
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkUpdateBooks_UpdateMultipleFields
        	Messages:   	Failed to create test user
=== RUN   TestMediaBulkOperations/BulkUpdateBooks_InvalidRequestBody
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_bulk_test.go:344
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaBulkOperations/BulkUpdateBooks_InvalidRequestBody
        	Messages:   	Failed to create test user
--- FAIL: TestMediaBulkOperations (0.02s)
    --- PASS: TestMediaBulkOperations/BulkDeleteBooks_WithoutAuth (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkDeleteBooks_EmptyBookIDs (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkDeleteBooks_InvalidBookIDs (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkDeleteBooks_WithValidBooks (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkDeleteBooks_InvalidRequestBody (0.00s)
    --- PASS: TestMediaBulkOperations/BulkUpdateBooks_WithoutAuth (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkUpdateBooks_EmptyBookIDs (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkUpdateBooks_InvalidBookIDs (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkUpdateBooks_UpdateTags (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkUpdateBooks_UpdateReadingStatus (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkUpdateBooks_UpdateMultipleFields (0.00s)
    --- FAIL: TestMediaBulkOperations/BulkUpdateBooks_InvalidRequestBody (0.00s)
=== RUN   TestMediaItemISBNNormalization
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_item_isbn_test.go:49
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaItemISBNNormalization
        	Messages:   	Failed to create test user
--- FAIL: TestMediaItemISBNNormalization (0.00s)
=== RUN   TestMediaItemISBNEdgeCases
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_item_isbn_test.go:137
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaItemISBNEdgeCases
        	Messages:   	Failed to create test user
--- FAIL: TestMediaItemISBNEdgeCases (0.00s)
=== RUN   TestMediaItemsPagination
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_item_isbn_test.go:222
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaItemsPagination
        	Messages:   	Failed to create test user
--- FAIL: TestMediaItemsPagination (0.00s)
=== RUN   TestMediaItemLibraryRequirement
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_item_isbn_test.go:329
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestMediaItemLibraryRequirement
        	Messages:   	Failed to create test user
--- FAIL: TestMediaItemLibraryRequirement (0.00s)
=== RUN   TestUpdateMediaItemISBN
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/media_item_isbn_test.go:392
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestUpdateMediaItemISBN
        	Messages:   	Failed to create test user
--- FAIL: TestUpdateMediaItemISBN (0.00s)
=== RUN   TestUsernameWhitespaceValidation
    new_fixes_test.go:16: Requires integration test with real handler
--- SKIP: TestUsernameWhitespaceValidation (0.00s)
=== RUN   TestRoleCaseNormalization
    new_fixes_test.go:22: Requires integration test with real handler
--- SKIP: TestRoleCaseNormalization (0.00s)
=== RUN   TestPaginationMaxLimit
    new_fixes_test.go:28: Already tested in TestPaginationAndFiltering
--- SKIP: TestPaginationMaxLimit (0.00s)
=== RUN   TestPaginationNegativeOffset
    new_fixes_test.go:34: Already tested in TestPaginationAndFiltering
--- SKIP: TestPaginationNegativeOffset (0.00s)
=== RUN   TestRateLimiter
--- PASS: TestRateLimiter (0.00s)
=== RUN   TestOPDSEndpoints
=== RUN   TestOPDSEndpoints/GetDeviceCatalog_WithoutDeviceAuth
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"df564519-8bbb-4ab5-8dc8-e54d6bc92e34","timestamp":"2026-02-10T16:47:58.071109891Z","method":"GET","path":"/opds/devices/e928cb4b-50c5-4dc7-bea7-4ce3d2f330dc/catalog","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":636842,"status_code":500,"response_size":407}
{"time":"2026-02-10T16:47:58.071762011Z","id":"df564519-8bbb-4ab5-8dc8-e54d6bc92e34","remote_ip":"127.0.0.1","host":"127.0.0.1:41935","method":"GET","uri":"/opds/devices/e928cb4b-50c5-4dc7-bea7-4ce3d2f330dc/catalog","user_agent":"Go-http-client/1.1","status":500,"error":"","latency":649885,"latency_human":"649.885µs","bytes_in":0,"bytes_out":407}
{"time":"2026-02-10T16:47:58.071767711Z","id":"df564519-8bbb-4ab5-8dc8-e54d6bc92e34","remote_ip":"127.0.0.1","host":"127.0.0.1:41935","method":"GET","uri":"/opds/devices/e928cb4b-50c5-4dc7-bea7-4ce3d2f330dc/catalog","user_agent":"Go-http-client/1.1","status":500,"error":"","latency":657660,"latency_human":"657.66µs","bytes_in":0,"bytes_out":407}
    opds_test.go:28: 
        	Error Trace:	/app/cmd/server/tests/opds_test.go:28
        	Error:      	Should be true
        	Test:       	TestOPDSEndpoints/GetDeviceCatalog_WithoutDeviceAuth
=== RUN   TestOPDSEndpoints/GetDeviceCatalog_InvalidDeviceID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"ecd4f8ea-9366-451e-8bca-eb3c91fe16a3","timestamp":"2026-02-10T16:47:58.072439507Z","method":"GET","path":"/opds/devices/invalid-uuid/catalog","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":569447,"status_code":500,"response_size":407}
{"time":"2026-02-10T16:47:58.073020796Z","id":"ecd4f8ea-9366-451e-8bca-eb3c91fe16a3","remote_ip":"127.0.0.1","host":"127.0.0.1:35025","method":"GET","uri":"/opds/devices/invalid-uuid/catalog","user_agent":"Go-http-client/1.1","status":500,"error":"","latency":580206,"latency_human":"580.206µs","bytes_in":0,"bytes_out":407}
{"time":"2026-02-10T16:47:58.073024733Z","id":"ecd4f8ea-9366-451e-8bca-eb3c91fe16a3","remote_ip":"127.0.0.1","host":"127.0.0.1:35025","method":"GET","uri":"/opds/devices/invalid-uuid/catalog","user_agent":"Go-http-client/1.1","status":500,"error":"","latency":585707,"latency_human":"585.707µs","bytes_in":0,"bytes_out":407}
    opds_test.go:43: 
        	Error Trace:	/app/cmd/server/tests/opds_test.go:43
        	Error:      	Not equal: 
        	            	expected: 400
        	            	actual  : 500
        	Test:       	TestOPDSEndpoints/GetDeviceCatalog_InvalidDeviceID
=== RUN   TestOPDSEndpoints/GetDeviceCatalog_ValidDevice
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:50
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEndpoints/GetDeviceCatalog_ValidDevice
        	Messages:   	Failed to create test user
=== RUN   TestOPDSEndpoints/SearchDeviceCatalog_InvalidDeviceID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"474a9de8-9902-42e9-854a-f4cfdcbe4302","timestamp":"2026-02-10T16:47:58.075491228Z","method":"GET","path":"/opds/devices/invalid-uuid/search","query_params":{"query":"test"},"headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":24846,"status_code":400,"response_size":407}
{"time":"2026-02-10T16:47:58.075534418Z","id":"474a9de8-9902-42e9-854a-f4cfdcbe4302","remote_ip":"127.0.0.1","host":"127.0.0.1:45027","method":"GET","uri":"/opds/devices/invalid-uuid/search?query=test","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":37479,"latency_human":"37.479µs","bytes_in":0,"bytes_out":407}
{"time":"2026-02-10T16:47:58.075538997Z","id":"474a9de8-9902-42e9-854a-f4cfdcbe4302","remote_ip":"127.0.0.1","host":"127.0.0.1:45027","method":"GET","uri":"/opds/devices/invalid-uuid/search?query=test","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":47758,"latency_human":"47.758µs","bytes_in":0,"bytes_out":407}
=== RUN   TestOPDSEndpoints/SearchDeviceCatalog_ValidDevice
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:85
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEndpoints/SearchDeviceCatalog_ValidDevice
        	Messages:   	Failed to create test user
=== RUN   TestOPDSEndpoints/GetDeviceNavigation_InvalidDeviceID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"00d9974c-76b6-4576-92c3-09779cc344cb","timestamp":"2026-02-10T16:47:58.077672805Z","method":"GET","path":"/opds/devices/invalid-uuid/nav","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":573533,"status_code":500,"response_size":407}
{"time":"2026-02-10T16:47:58.078261086Z","id":"00d9974c-76b6-4576-92c3-09779cc344cb","remote_ip":"127.0.0.1","host":"127.0.0.1:39785","method":"GET","uri":"/opds/devices/invalid-uuid/nav","user_agent":"Go-http-client/1.1","status":500,"error":"","latency":586648,"latency_human":"586.648µs","bytes_in":0,"bytes_out":407}
{"time":"2026-02-10T16:47:58.078267227Z","id":"00d9974c-76b6-4576-92c3-09779cc344cb","remote_ip":"127.0.0.1","host":"127.0.0.1:39785","method":"GET","uri":"/opds/devices/invalid-uuid/nav","user_agent":"Go-http-client/1.1","status":500,"error":"","latency":594312,"latency_human":"594.312µs","bytes_in":0,"bytes_out":407}
    opds_test.go:111: 
        	Error Trace:	/app/cmd/server/tests/opds_test.go:111
        	Error:      	Not equal: 
        	            	expected: 400
        	            	actual  : 500
        	Test:       	TestOPDSEndpoints/GetDeviceNavigation_InvalidDeviceID
=== RUN   TestOPDSEndpoints/GetDeviceNavigation_ValidDevice
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:118
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEndpoints/GetDeviceNavigation_ValidDevice
        	Messages:   	Failed to create test user
=== RUN   TestOPDSEndpoints/DownloadBook_InvalidDeviceID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"c539ca1c-7ab3-47df-9495-1d8009ab0919","timestamp":"2026-02-10T16:47:58.081285285Z","method":"GET","path":"/opds/devices/invalid-uuid/download/93d22eeb-da4e-408c-adf1-3740df6f3c0c","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":21790,"status_code":400,"response_size":30}
{"time":"2026-02-10T16:47:58.081327553Z","id":"c539ca1c-7ab3-47df-9495-1d8009ab0919","remote_ip":"127.0.0.1","host":"127.0.0.1:38089","method":"GET","uri":"/opds/devices/invalid-uuid/download/93d22eeb-da4e-408c-adf1-3740df6f3c0c","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":39945,"latency_human":"39.945µs","bytes_in":0,"bytes_out":30}
{"time":"2026-02-10T16:47:58.081335829Z","id":"c539ca1c-7ab3-47df-9495-1d8009ab0919","remote_ip":"127.0.0.1","host":"127.0.0.1:38089","method":"GET","uri":"/opds/devices/invalid-uuid/download/93d22eeb-da4e-408c-adf1-3740df6f3c0c","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":49212,"latency_human":"49.212µs","bytes_in":0,"bytes_out":30}
=== RUN   TestOPDSEndpoints/DownloadBook_InvalidBookID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"717a123f-90db-4841-aa3c-2a52c00ba7cf","timestamp":"2026-02-10T16:47:58.082082844Z","method":"GET","path":"/opds/devices/9516c404-a449-4323-a905-ec8d1d7dda6a/download/invalid-uuid","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":37550,"status_code":400,"response_size":28}
{"time":"2026-02-10T16:47:58.082136734Z","id":"717a123f-90db-4841-aa3c-2a52c00ba7cf","remote_ip":"127.0.0.1","host":"127.0.0.1:40389","method":"GET","uri":"/opds/devices/9516c404-a449-4323-a905-ec8d1d7dda6a/download/invalid-uuid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":60863,"latency_human":"60.863µs","bytes_in":0,"bytes_out":28}
{"time":"2026-02-10T16:47:58.082141974Z","id":"717a123f-90db-4841-aa3c-2a52c00ba7cf","remote_ip":"127.0.0.1","host":"127.0.0.1:40389","method":"GET","uri":"/opds/devices/9516c404-a449-4323-a905-ec8d1d7dda6a/download/invalid-uuid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":67115,"latency_human":"67.115µs","bytes_in":0,"bytes_out":28}
=== RUN   TestOPDSEndpoints/DownloadBook_ValidIDs
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:167
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEndpoints/DownloadBook_ValidIDs
        	Messages:   	Failed to create test user
=== RUN   TestOPDSEndpoints/GetCoverImage_InvalidDeviceID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"f720aa50-4633-445d-8a7a-2602ccca52f2","timestamp":"2026-02-10T16:47:58.085224642Z","method":"GET","path":"/opds/devices/invalid-uuid/cover/cf36cf65-4992-43aa-8a0b-a9465121b3ce","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":15739,"status_code":400,"response_size":30}
{"time":"2026-02-10T16:47:58.085260218Z","id":"f720aa50-4633-445d-8a7a-2602ccca52f2","remote_ip":"127.0.0.1","host":"127.0.0.1:43379","method":"GET","uri":"/opds/devices/invalid-uuid/cover/cf36cf65-4992-43aa-8a0b-a9465121b3ce","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":34093,"latency_human":"34.093µs","bytes_in":0,"bytes_out":30}
{"time":"2026-02-10T16:47:58.085266149Z","id":"f720aa50-4633-445d-8a7a-2602ccca52f2","remote_ip":"127.0.0.1","host":"127.0.0.1:43379","method":"GET","uri":"/opds/devices/invalid-uuid/cover/cf36cf65-4992-43aa-8a0b-a9465121b3ce","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":41647,"latency_human":"41.647µs","bytes_in":0,"bytes_out":30}
=== RUN   TestOPDSEndpoints/GetCoverImage_InvalidBookID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"3ac842a2-ed2b-4b50-b90a-33ff8f0b73f1","timestamp":"2026-02-10T16:47:58.08591926Z","method":"GET","path":"/opds/devices/aa8f073e-306e-46fa-8cc6-5ea153a83f04/cover/invalid-uuid","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":9077,"status_code":400,"response_size":28}
{"time":"2026-02-10T16:47:58.085938416Z","id":"3ac842a2-ed2b-4b50-b90a-33ff8f0b73f1","remote_ip":"127.0.0.1","host":"127.0.0.1:41493","method":"GET","uri":"/opds/devices/aa8f073e-306e-46fa-8cc6-5ea153a83f04/cover/invalid-uuid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":17913,"latency_human":"17.913µs","bytes_in":0,"bytes_out":28}
{"time":"2026-02-10T16:47:58.085943475Z","id":"3ac842a2-ed2b-4b50-b90a-33ff8f0b73f1","remote_ip":"127.0.0.1","host":"127.0.0.1:41493","method":"GET","uri":"/opds/devices/aa8f073e-306e-46fa-8cc6-5ea153a83f04/cover/invalid-uuid","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":24756,"latency_human":"24.756µs","bytes_in":0,"bytes_out":28}
=== RUN   TestOPDSEndpoints/GetCoverImage_ValidIDs
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Error listing pending items: failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:218
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEndpoints/GetCoverImage_ValidIDs
        	Messages:   	Failed to create test user
=== RUN   TestOPDSEndpoints/ListFormats_InvalidDeviceID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"a81453b7-b47e-422a-ac9f-c1e329c29470","timestamp":"2026-02-10T16:47:58.088381598Z","method":"GET","path":"/opds/devices/invalid-uuid/formats/c088efd6-44dc-4ae1-89ab-5e87a369792e","headers":{"Accept-Encoding":"gzip","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":18845,"status_code":400,"response_size":30}
{"time":"2026-02-10T16:47:58.088427192Z","id":"a81453b7-b47e-422a-ac9f-c1e329c29470","remote_ip":"127.0.0.1","host":"127.0.0.1:46327","method":"GET","uri":"/opds/devices/invalid-uuid/formats/c088efd6-44dc-4ae1-89ab-5e87a369792e","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":44362,"latency_human":"44.362µs","bytes_in":0,"bytes_out":30}
{"time":"2026-02-10T16:47:58.088433494Z","id":"a81453b7-b47e-422a-ac9f-c1e329c29470","remote_ip":"127.0.0.1","host":"127.0.0.1:46327","method":"GET","uri":"/opds/devices/invalid-uuid/formats/c088efd6-44dc-4ae1-89ab-5e87a369792e","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":51005,"latency_human":"51.005µs","bytes_in":0,"bytes_out":30}
=== RUN   TestOPDSEndpoints/ListFormats_ValidDeviceID
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:253
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEndpoints/ListFormats_ValidDeviceID
        	Messages:   	Failed to create test user
--- FAIL: TestOPDSEndpoints (0.02s)
    --- FAIL: TestOPDSEndpoints/GetDeviceCatalog_WithoutDeviceAuth (0.00s)
    --- FAIL: TestOPDSEndpoints/GetDeviceCatalog_InvalidDeviceID (0.00s)
    --- FAIL: TestOPDSEndpoints/GetDeviceCatalog_ValidDevice (0.00s)
    --- PASS: TestOPDSEndpoints/SearchDeviceCatalog_InvalidDeviceID (0.00s)
    --- FAIL: TestOPDSEndpoints/SearchDeviceCatalog_ValidDevice (0.00s)
    --- FAIL: TestOPDSEndpoints/GetDeviceNavigation_InvalidDeviceID (0.00s)
    --- FAIL: TestOPDSEndpoints/GetDeviceNavigation_ValidDevice (0.00s)
    --- PASS: TestOPDSEndpoints/DownloadBook_InvalidDeviceID (0.00s)
    --- PASS: TestOPDSEndpoints/DownloadBook_InvalidBookID (0.00s)
    --- FAIL: TestOPDSEndpoints/DownloadBook_ValidIDs (0.00s)
    --- PASS: TestOPDSEndpoints/GetCoverImage_InvalidDeviceID (0.00s)
    --- PASS: TestOPDSEndpoints/GetCoverImage_InvalidBookID (0.00s)
    --- FAIL: TestOPDSEndpoints/GetCoverImage_ValidIDs (0.00s)
    --- PASS: TestOPDSEndpoints/ListFormats_InvalidDeviceID (0.00s)
    --- FAIL: TestOPDSEndpoints/ListFormats_ValidDeviceID (0.00s)
=== RUN   TestOPDSConversion
=== RUN   TestOPDSConversion/DownloadKEPUB_FormatParameter
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:276
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSConversion/DownloadKEPUB_FormatParameter
        	Messages:   	Failed to create test user
=== RUN   TestOPDSConversion/DownloadEPUB_DefaultFormat
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:298
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSConversion/DownloadEPUB_DefaultFormat
        	Messages:   	Failed to create test user
=== RUN   TestOPDSConversion/Download_UnsupportedFormat
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:319
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSConversion/Download_UnsupportedFormat
        	Messages:   	Failed to create test user
--- FAIL: TestOPDSConversion (0.01s)
    --- FAIL: TestOPDSConversion/DownloadKEPUB_FormatParameter (0.00s)
    --- FAIL: TestOPDSConversion/DownloadEPUB_DefaultFormat (0.00s)
    --- FAIL: TestOPDSConversion/Download_UnsupportedFormat (0.00s)
=== RUN   TestOPDSEdgeCases
=== RUN   TestOPDSEdgeCases/Catalog_EmptyLibrary
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:343
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEdgeCases/Catalog_EmptyLibrary
        	Messages:   	Failed to create test user
=== RUN   TestOPDSEdgeCases/Search_SpecialCharacters
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:362
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEdgeCases/Search_SpecialCharacters
        	Messages:   	Failed to create test user
=== RUN   TestOPDSEdgeCases/Search_EmptyQuery
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/opds_test.go:382
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestOPDSEdgeCases/Search_EmptyQuery
        	Messages:   	Failed to create test user
--- FAIL: TestOPDSEdgeCases (0.01s)
    --- FAIL: TestOPDSEdgeCases/Catalog_EmptyLibrary (0.00s)
    --- FAIL: TestOPDSEdgeCases/Search_SpecialCharacters (0.00s)
    --- FAIL: TestOPDSEdgeCases/Search_EmptyQuery (0.00s)
=== RUN   TestListAllQueueItems_Admin
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"c6f291d1-14df-4557-a74f-bd4797374c7c","timestamp":"2026-02-10T16:47:58.104720053Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":580006,"status_code":401,"response_size":32}
{"time":"2026-02-10T16:47:58.105320968Z","id":"c6f291d1-14df-4557-a74f-bd4797374c7c","remote_ip":"127.0.0.1","host":"127.0.0.1:36661","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":598591,"latency_human":"598.591µs","bytes_in":59,"bytes_out":32}
{"time":"2026-02-10T16:47:58.105328071Z","id":"c6f291d1-14df-4557-a74f-bd4797374c7c","remote_ip":"127.0.0.1","host":"127.0.0.1:36661","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":608198,"latency_human":"608.198µs","bytes_in":59,"bytes_out":32}
    queue_test.go:254: 
        	Error Trace:	/app/cmd/server/tests/queue_test.go:254
        	            				/app/cmd/server/tests/queue_test.go:23
        	Error:      	Should be true
        	Test:       	TestListAllQueueItems_Admin
        	Messages:   	Should have access_token
--- FAIL: TestListAllQueueItems_Admin (0.00s)
=== RUN   TestGetDeviceQueueStats
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/queue_test.go:41
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestGetDeviceQueueStats
        	Messages:   	Failed to create test user
--- FAIL: TestGetDeviceQueueStats (0.00s)
=== RUN   TestListDeviceQueueItems
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/queue_test.go:78
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestListDeviceQueueItems
        	Messages:   	Failed to create test user
--- FAIL: TestListDeviceQueueItems (0.00s)
=== RUN   TestRetryQueueItem
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/queue_test.go:115
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestRetryQueueItem
        	Messages:   	Failed to create test user
--- FAIL: TestRetryQueueItem (0.00s)
=== RUN   TestDeleteQueueItem
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/queue_test.go:131
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestDeleteQueueItem
        	Messages:   	Failed to create test user
--- FAIL: TestDeleteQueueItem (0.00s)
=== RUN   TestClearDeviceQueue
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
    test_helpers.go:406: 
        	Error Trace:	/app/cmd/server/tests/test_helpers.go:406
        	            				/app/cmd/server/tests/test_helpers.go:351
        	            				/app/cmd/server/tests/queue_test.go:147
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestClearDeviceQueue
        	Messages:   	Failed to create test user
--- FAIL: TestClearDeviceQueue (0.01s)
=== RUN   TestQueueEndpoints_Unauthorized
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
=== RUN   TestQueueEndpoints_Unauthorized/ListAllQueueItems
2026/02/10 16:47:58 [REQUEST] {"request_id":"c062045d-5208-4898-b7cc-cefb1c505a1f","timestamp":"2026-02-10T16:47:58.125347664Z","method":"GET","path":"/api/queue/items","remote_addr":"192.0.2.1","duration":12283,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:58.125383881Z","id":"c062045d-5208-4898-b7cc-cefb1c505a1f","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/queue/items","user_agent":"","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":35276,"latency_human":"35.276µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:58.125389652Z","id":"c062045d-5208-4898-b7cc-cefb1c505a1f","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/queue/items","user_agent":"","status":401,"error":"","latency":43230,"latency_human":"43.23µs","bytes_in":0,"bytes_out":39}
=== RUN   TestQueueEndpoints_Unauthorized/GetDeviceQueueStats
2026/02/10 16:47:58 [REQUEST] {"request_id":"f6e87541-e5e8-441a-b81b-8dddb3104de1","timestamp":"2026-02-10T16:47:58.125413095Z","method":"GET","path":"/api/queue/devices/test-device-id/stats","remote_addr":"192.0.2.1","duration":1072,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:58.125423344Z","id":"f6e87541-e5e8-441a-b81b-8dddb3104de1","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/queue/devices/test-device-id/stats","user_agent":"","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":10299,"latency_human":"10.299µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:58.125425929Z","id":"f6e87541-e5e8-441a-b81b-8dddb3104de1","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/queue/devices/test-device-id/stats","user_agent":"","status":401,"error":"","latency":13174,"latency_human":"13.174µs","bytes_in":0,"bytes_out":39}
=== RUN   TestQueueEndpoints_Unauthorized/ListDeviceQueueItems
2026/02/10 16:47:58 [REQUEST] {"request_id":"d0c471eb-fd2e-42ff-a328-911fe22f2622","timestamp":"2026-02-10T16:47:58.125446357Z","method":"GET","path":"/api/queue/devices/test-device-id/items","remote_addr":"192.0.2.1","duration":531,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:58.125451537Z","id":"d0c471eb-fd2e-42ff-a328-911fe22f2622","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/queue/devices/test-device-id/items","user_agent":"","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":5200,"latency_human":"5.2µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:58.125453761Z","id":"d0c471eb-fd2e-42ff-a328-911fe22f2622","remote_ip":"192.0.2.1","host":"example.com","method":"GET","uri":"/api/queue/devices/test-device-id/items","user_agent":"","status":401,"error":"","latency":7685,"latency_human":"7.685µs","bytes_in":0,"bytes_out":39}
=== RUN   TestQueueEndpoints_Unauthorized/RetryQueueItem
2026/02/10 16:47:58 [REQUEST] {"request_id":"c87fd593-feff-4751-b9f3-c10176e56022","timestamp":"2026-02-10T16:47:58.125473037Z","method":"POST","path":"/api/queue/items/test-item-id/retry","remote_addr":"192.0.2.1","duration":1302,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:58.125479949Z","id":"c87fd593-feff-4751-b9f3-c10176e56022","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/queue/items/test-item-id/retry","user_agent":"","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":6933,"latency_human":"6.933µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:58.125482043Z","id":"c87fd593-feff-4751-b9f3-c10176e56022","remote_ip":"192.0.2.1","host":"example.com","method":"POST","uri":"/api/queue/items/test-item-id/retry","user_agent":"","status":401,"error":"","latency":9217,"latency_human":"9.217µs","bytes_in":0,"bytes_out":39}
=== RUN   TestQueueEndpoints_Unauthorized/DeleteQueueItem
2026/02/10 16:47:58 [REQUEST] {"request_id":"0b4a8ea3-8db7-43ca-91fd-044f28030dc4","timestamp":"2026-02-10T16:47:58.125491781Z","method":"DELETE","path":"/api/queue/items/test-item-id","remote_addr":"192.0.2.1","duration":511,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:58.125497071Z","id":"0b4a8ea3-8db7-43ca-91fd-044f28030dc4","remote_ip":"192.0.2.1","host":"example.com","method":"DELETE","uri":"/api/queue/items/test-item-id","user_agent":"","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":5340,"latency_human":"5.34µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:58.125499075Z","id":"0b4a8ea3-8db7-43ca-91fd-044f28030dc4","remote_ip":"192.0.2.1","host":"example.com","method":"DELETE","uri":"/api/queue/items/test-item-id","user_agent":"","status":401,"error":"","latency":7494,"latency_human":"7.494µs","bytes_in":0,"bytes_out":39}
=== RUN   TestQueueEndpoints_Unauthorized/ClearDeviceQueue
2026/02/10 16:47:58 [REQUEST] {"request_id":"126cfb8a-a9d9-4fd3-ae6c-38ec020ad918","timestamp":"2026-02-10T16:47:58.125515656Z","method":"DELETE","path":"/api/queue/devices/test-device-id/clear","remote_addr":"192.0.2.1","duration":481,"status_code":200,"response_size":0,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header"}
{"time":"2026-02-10T16:47:58.125519843Z","id":"126cfb8a-a9d9-4fd3-ae6c-38ec020ad918","remote_ip":"192.0.2.1","host":"example.com","method":"DELETE","uri":"/api/queue/devices/test-device-id/clear","user_agent":"","status":401,"error":"code=401, message=missing or malformed jwt, internal=missing value in request header","latency":4248,"latency_human":"4.248µs","bytes_in":0,"bytes_out":39}
{"time":"2026-02-10T16:47:58.125521687Z","id":"126cfb8a-a9d9-4fd3-ae6c-38ec020ad918","remote_ip":"192.0.2.1","host":"example.com","method":"DELETE","uri":"/api/queue/devices/test-device-id/clear","user_agent":"","status":401,"error":"","latency":6242,"latency_human":"6.242µs","bytes_in":0,"bytes_out":39}
--- PASS: TestQueueEndpoints_Unauthorized (0.00s)
    --- PASS: TestQueueEndpoints_Unauthorized/ListAllQueueItems (0.00s)
    --- PASS: TestQueueEndpoints_Unauthorized/GetDeviceQueueStats (0.00s)
    --- PASS: TestQueueEndpoints_Unauthorized/ListDeviceQueueItems (0.00s)
    --- PASS: TestQueueEndpoints_Unauthorized/RetryQueueItem (0.00s)
    --- PASS: TestQueueEndpoints_Unauthorized/DeleteQueueItem (0.00s)
    --- PASS: TestQueueEndpoints_Unauthorized/ClearDeviceQueue (0.00s)
=== RUN   TestRefreshTokenFlow
=== RUN   TestRefreshTokenFlow/RefreshToken_MissingToken
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"e7b3a2bb-75c5-40d9-b842-ca9b4193e70e","timestamp":"2026-02-10T16:47:58.126082637Z","method":"POST","path":"/api/auth/refresh","headers":{"Accept-Encoding":"gzip","Content-Length":"2","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":40666,"status_code":400,"response_size":123}
{"time":"2026-02-10T16:47:58.12614312Z","id":"e7b3a2bb-75c5-40d9-b842-ca9b4193e70e","remote_ip":"127.0.0.1","host":"127.0.0.1:37701","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":50033,"latency_human":"50.033µs","bytes_in":2,"bytes_out":123}
{"time":"2026-02-10T16:47:58.126147838Z","id":"e7b3a2bb-75c5-40d9-b842-ca9b4193e70e","remote_ip":"127.0.0.1","host":"127.0.0.1:37701","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":65191,"latency_human":"65.191µs","bytes_in":2,"bytes_out":123}
=== RUN   TestRefreshTokenFlow/RefreshToken_InvalidTokenFormat
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"bdae5fed-aeb1-4b5d-a581-92fa71f15a0e","timestamp":"2026-02-10T16:47:58.126745988Z","method":"POST","path":"/api/auth/refresh","headers":{"Accept-Encoding":"gzip","Content-Length":"41","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"refresh_token":"not-a-valid-jwt-token"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":19776,"status_code":400,"response_size":41}
{"time":"2026-02-10T16:47:58.12677399Z","id":"bdae5fed-aeb1-4b5d-a581-92fa71f15a0e","remote_ip":"127.0.0.1","host":"127.0.0.1:34129","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":27070,"latency_human":"27.07µs","bytes_in":41,"bytes_out":41}
{"time":"2026-02-10T16:47:58.126778147Z","id":"bdae5fed-aeb1-4b5d-a581-92fa71f15a0e","remote_ip":"127.0.0.1","host":"127.0.0.1:34129","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":32380,"latency_human":"32.38µs","bytes_in":41,"bytes_out":41}
    refresh_token_test.go:50: 
        	Error Trace:	/app/cmd/server/tests/refresh_token_test.go:50
        	Error:      	Not equal: 
        	            	expected: 401
        	            	actual  : 400
        	Test:       	TestRefreshTokenFlow/RefreshToken_InvalidTokenFormat
=== RUN   TestRefreshTokenFlow/RefreshToken_ExpiredToken
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"f4320bd2-a494-4788-bc25-8fa04e859a7d","timestamp":"2026-02-10T16:47:58.127375836Z","method":"POST","path":"/api/auth/refresh","headers":{"Accept-Encoding":"gzip","Content-Length":"89","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MjAwMDAwMDB9.expired"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":22582,"status_code":400,"response_size":41}
{"time":"2026-02-10T16:47:58.127408416Z","id":"f4320bd2-a494-4788-bc25-8fa04e859a7d","remote_ip":"127.0.0.1","host":"127.0.0.1:43647","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":31799,"latency_human":"31.799µs","bytes_in":89,"bytes_out":41}
{"time":"2026-02-10T16:47:58.127412744Z","id":"f4320bd2-a494-4788-bc25-8fa04e859a7d","remote_ip":"127.0.0.1","host":"127.0.0.1:43647","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":37890,"latency_human":"37.89µs","bytes_in":89,"bytes_out":41}
    refresh_token_test.go:71: 
        	Error Trace:	/app/cmd/server/tests/refresh_token_test.go:71
        	Error:      	Not equal: 
        	            	expected: 401
        	            	actual  : 400
        	Test:       	TestRefreshTokenFlow/RefreshToken_ExpiredToken
=== RUN   TestRefreshTokenFlow/RefreshToken_ValidToken
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"24608392-21b7-4351-975d-6de943df3fc2","timestamp":"2026-02-10T16:47:58.127990937Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":696131,"status_code":401,"response_size":32}
{"time":"2026-02-10T16:47:58.128696966Z","id":"24608392-21b7-4351-975d-6de943df3fc2","remote_ip":"127.0.0.1","host":"127.0.0.1:33651","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":704457,"latency_human":"704.457µs","bytes_in":59,"bytes_out":32}
{"time":"2026-02-10T16:47:58.128701385Z","id":"24608392-21b7-4351-975d-6de943df3fc2","remote_ip":"127.0.0.1","host":"127.0.0.1:33651","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":709767,"latency_human":"709.767µs","bytes_in":59,"bytes_out":32}
    refresh_token_test.go:93: 
        	Error Trace:	/app/cmd/server/tests/refresh_token_test.go:93
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 401
        	Test:       	TestRefreshTokenFlow/RefreshToken_ValidToken
=== RUN   TestRefreshTokenFlow/RefreshToken_InvalidRequestBody
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"066e6650-1c29-4f40-bd3b-0442c7a6ce6e","timestamp":"2026-02-10T16:47:58.12986333Z","method":"POST","path":"/api/auth/refresh","headers":{"Accept-Encoding":"gzip","Content-Length":"12","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":21339,"status_code":400,"response_size":28}
{"time":"2026-02-10T16:47:58.129892975Z","id":"066e6650-1c29-4f40-bd3b-0442c7a6ce6e","remote_ip":"127.0.0.1","host":"127.0.0.1:44577","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":29134,"latency_human":"29.134µs","bytes_in":12,"bytes_out":28}
{"time":"2026-02-10T16:47:58.129900709Z","id":"066e6650-1c29-4f40-bd3b-0442c7a6ce6e","remote_ip":"127.0.0.1","host":"127.0.0.1:44577","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":33412,"latency_human":"33.412µs","bytes_in":12,"bytes_out":28}
=== RUN   TestRefreshTokenFlow/RefreshToken_MissingContentType
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"327cd2d2-7c85-4554-8e00-a14919422e9e","timestamp":"2026-02-10T16:47:58.130638668Z","method":"POST","path":"/api/auth/refresh","headers":{"Accept-Encoding":"gzip","Content-Length":"30","User-Agent":"Go-http-client/1.1"},"body":{"refresh_token":"some-token"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":21520,"status_code":400,"response_size":28}
{"time":"2026-02-10T16:47:58.130670517Z","id":"327cd2d2-7c85-4554-8e00-a14919422e9e","remote_ip":"127.0.0.1","host":"127.0.0.1:33307","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":30716,"latency_human":"30.716µs","bytes_in":30,"bytes_out":28}
{"time":"2026-02-10T16:47:58.130675085Z","id":"327cd2d2-7c85-4554-8e00-a14919422e9e","remote_ip":"127.0.0.1","host":"127.0.0.1:33307","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":35916,"latency_human":"35.916µs","bytes_in":30,"bytes_out":28}
--- FAIL: TestRefreshTokenFlow (0.01s)
    --- PASS: TestRefreshTokenFlow/RefreshToken_MissingToken (0.00s)
    --- FAIL: TestRefreshTokenFlow/RefreshToken_InvalidTokenFormat (0.00s)
    --- FAIL: TestRefreshTokenFlow/RefreshToken_ExpiredToken (0.00s)
    --- FAIL: TestRefreshTokenFlow/RefreshToken_ValidToken (0.00s)
    --- PASS: TestRefreshTokenFlow/RefreshToken_InvalidRequestBody (0.00s)
    --- PASS: TestRefreshTokenFlow/RefreshToken_MissingContentType (0.00s)
=== RUN   TestRefreshTokenSecurity
=== RUN   TestRefreshTokenSecurity/RefreshToken_ReuseProtection
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"58b77c88-51dd-4cce-b3b8-d02e79c3cbc0","timestamp":"2026-02-10T16:47:58.131580595Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":940725,"status_code":401,"response_size":32}
{"time":"2026-02-10T16:47:58.132536608Z","id":"58b77c88-51dd-4cce-b3b8-d02e79c3cbc0","remote_ip":"127.0.0.1","host":"127.0.0.1:39475","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":954460,"latency_human":"954.46µs","bytes_in":59,"bytes_out":32}
{"time":"2026-02-10T16:47:58.132543631Z","id":"58b77c88-51dd-4cce-b3b8-d02e79c3cbc0","remote_ip":"127.0.0.1","host":"127.0.0.1:39475","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":961724,"latency_human":"961.724µs","bytes_in":59,"bytes_out":32}
    refresh_token_test.go:187: 
        	Error Trace:	/app/cmd/server/tests/refresh_token_test.go:187
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 401
        	Test:       	TestRefreshTokenSecurity/RefreshToken_ReuseProtection
=== RUN   TestRefreshTokenSecurity/RefreshToken_TokenTampering
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"9c90abbe-99bc-40f3-87ca-2d780b812ffd","timestamp":"2026-02-10T16:47:58.13334063Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":694037,"status_code":401,"response_size":32}
{"time":"2026-02-10T16:47:58.134047872Z","id":"9c90abbe-99bc-40f3-87ca-2d780b812ffd","remote_ip":"127.0.0.1","host":"127.0.0.1:40707","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":705449,"latency_human":"705.449µs","bytes_in":59,"bytes_out":32}
{"time":"2026-02-10T16:47:58.1340526Z","id":"9c90abbe-99bc-40f3-87ca-2d780b812ffd","remote_ip":"127.0.0.1","host":"127.0.0.1:40707","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":711961,"latency_human":"711.961µs","bytes_in":59,"bytes_out":32}
    refresh_token_test.go:241: 
        	Error Trace:	/app/cmd/server/tests/refresh_token_test.go:241
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 401
        	Test:       	TestRefreshTokenSecurity/RefreshToken_TokenTampering
--- FAIL: TestRefreshTokenSecurity (0.00s)
    --- FAIL: TestRefreshTokenSecurity/RefreshToken_ReuseProtection (0.00s)
    --- FAIL: TestRefreshTokenSecurity/RefreshToken_TokenTampering (0.00s)
=== RUN   TestRefreshTokenEdgeCases
=== RUN   TestRefreshTokenEdgeCases/RefreshToken_EmptyStringToken
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"7771c152-c3bf-4b0c-9dc0-b7a7c5348633","timestamp":"2026-02-10T16:47:58.134819703Z","method":"POST","path":"/api/auth/refresh","headers":{"Accept-Encoding":"gzip","Content-Length":"20","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"refresh_token":""},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":25026,"status_code":400,"response_size":123}
{"time":"2026-02-10T16:47:58.134854918Z","id":"7771c152-c3bf-4b0c-9dc0-b7a7c5348633","remote_ip":"127.0.0.1","host":"127.0.0.1:35675","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":34053,"latency_human":"34.053µs","bytes_in":20,"bytes_out":123}
{"time":"2026-02-10T16:47:58.13486649Z","id":"7771c152-c3bf-4b0c-9dc0-b7a7c5348633","remote_ip":"127.0.0.1","host":"127.0.0.1:35675","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":39253,"latency_human":"39.253µs","bytes_in":20,"bytes_out":123}
=== RUN   TestRefreshTokenEdgeCases/RefreshToken_NullToken
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"648bba08-f0e3-4e7a-8298-c003bcbd4e5f","timestamp":"2026-02-10T16:47:58.135449331Z","method":"POST","path":"/api/auth/refresh","headers":{"Accept-Encoding":"gzip","Content-Length":"22","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"refresh_token":null},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":18584,"status_code":400,"response_size":123}
{"time":"2026-02-10T16:47:58.135478405Z","id":"648bba08-f0e3-4e7a-8298-c003bcbd4e5f","remote_ip":"127.0.0.1","host":"127.0.0.1:39479","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":28062,"latency_human":"28.062µs","bytes_in":22,"bytes_out":123}
{"time":"2026-02-10T16:47:58.135482021Z","id":"648bba08-f0e3-4e7a-8298-c003bcbd4e5f","remote_ip":"127.0.0.1","host":"127.0.0.1:39479","method":"POST","uri":"/api/auth/refresh","user_agent":"Go-http-client/1.1","status":400,"error":"","latency":32861,"latency_human":"32.861µs","bytes_in":22,"bytes_out":123}
=== RUN   TestRefreshTokenEdgeCases/RefreshToken_ResponseStructure
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"a27bdaca-d56f-4bbd-b8ea-6e8880d6ee39","timestamp":"2026-02-10T16:47:58.136901154Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":937108,"status_code":401,"response_size":32}
{"time":"2026-02-10T16:47:58.137872425Z","id":"a27bdaca-d56f-4bbd-b8ea-6e8880d6ee39","remote_ip":"127.0.0.1","host":"127.0.0.1:38851","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":970210,"latency_human":"970.21µs","bytes_in":59,"bytes_out":32}
{"time":"2026-02-10T16:47:58.137878547Z","id":"a27bdaca-d56f-4bbd-b8ea-6e8880d6ee39","remote_ip":"127.0.0.1","host":"127.0.0.1:38851","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":976501,"latency_human":"976.501µs","bytes_in":59,"bytes_out":32}
    refresh_token_test.go:330: 
        	Error Trace:	/app/cmd/server/tests/refresh_token_test.go:330
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 401
        	Test:       	TestRefreshTokenEdgeCases/RefreshToken_ResponseStructure
=== RUN   TestRefreshTokenEdgeCases/RefreshToken_TokenType
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 Starting sync queue processor (interval: 5s, batch: 50)
2026/02/10 16:47:58 [REQUEST] {"request_id":"ac1621f0-1ef7-4f63-b5b5-23ec35b532cf","timestamp":"2026-02-10T16:47:58.138781381Z","method":"POST","path":"/api/auth/login","headers":{"Accept-Encoding":"gzip","Content-Length":"59","Content-Type":"application/json","User-Agent":"Go-http-client/1.1"},"body":{"login":"testuser@example.com","password":"Test@Pass123!"},"remote_addr":"127.0.0.1","user_agent":"Go-http-client/1.1","duration":672738,"status_code":401,"response_size":32}
{"time":"2026-02-10T16:47:58.139494424Z","id":"ac1621f0-1ef7-4f63-b5b5-23ec35b532cf","remote_ip":"127.0.0.1","host":"127.0.0.1:45949","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":702833,"latency_human":"702.833µs","bytes_in":59,"bytes_out":32}
{"time":"2026-02-10T16:47:58.139501627Z","id":"ac1621f0-1ef7-4f63-b5b5-23ec35b532cf","remote_ip":"127.0.0.1","host":"127.0.0.1:45949","method":"POST","uri":"/api/auth/login","user_agent":"Go-http-client/1.1","status":401,"error":"","latency":724765,"latency_human":"724.765µs","bytes_in":59,"bytes_out":32}
    refresh_token_test.go:382: 
        	Error Trace:	/app/cmd/server/tests/refresh_token_test.go:382
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 401
        	Test:       	TestRefreshTokenEdgeCases/RefreshToken_TokenType
--- FAIL: TestRefreshTokenEdgeCases (0.01s)
    --- PASS: TestRefreshTokenEdgeCases/RefreshToken_EmptyStringToken (0.00s)
    --- PASS: TestRefreshTokenEdgeCases/RefreshToken_NullToken (0.00s)
    --- FAIL: TestRefreshTokenEdgeCases/RefreshToken_ResponseStructure (0.00s)
    --- FAIL: TestRefreshTokenEdgeCases/RefreshToken_TokenType (0.00s)
=== RUN   TestRegisterEndpoint
=== RUN   TestRegisterEndpoint/Valid_registration_with_all_fields
=== RUN   TestRegisterEndpoint/Valid_registration_with_only_required_fields
=== RUN   TestRegisterEndpoint/Registration_with_role_specified
=== RUN   TestRegisterEndpoint/Invalid_email_format
=== RUN   TestRegisterEndpoint/Email_already_exists
=== RUN   TestRegisterEndpoint/Username_already_exists
=== RUN   TestRegisterEndpoint/Username_too_short
=== RUN   TestRegisterEndpoint/Username_too_long
=== RUN   TestRegisterEndpoint/Password_too_short
=== RUN   TestRegisterEndpoint/Missing_required_field_-_email
=== RUN   TestRegisterEndpoint/Missing_required_field_-_username
=== RUN   TestRegisterEndpoint/Missing_required_field_-_password
=== RUN   TestRegisterEndpoint/Invalid_JSON_payload
=== RUN   TestRegisterEndpoint/Invalid_role_value
=== RUN   TestRegisterEndpoint/Empty_email
=== RUN   TestRegisterEndpoint/Empty_username
=== RUN   TestRegisterEndpoint/Empty_password
=== RUN   TestRegisterEndpoint/Whitespace-only_username
=== RUN   TestRegisterEndpoint/Empty_JSON_request_body
--- PASS: TestRegisterEndpoint (0.00s)
    --- PASS: TestRegisterEndpoint/Valid_registration_with_all_fields (0.00s)
    --- PASS: TestRegisterEndpoint/Valid_registration_with_only_required_fields (0.00s)
    --- PASS: TestRegisterEndpoint/Registration_with_role_specified (0.00s)
    --- PASS: TestRegisterEndpoint/Invalid_email_format (0.00s)
    --- PASS: TestRegisterEndpoint/Email_already_exists (0.00s)
    --- PASS: TestRegisterEndpoint/Username_already_exists (0.00s)
    --- PASS: TestRegisterEndpoint/Username_too_short (0.00s)
    --- PASS: TestRegisterEndpoint/Username_too_long (0.00s)
    --- PASS: TestRegisterEndpoint/Password_too_short (0.00s)
    --- PASS: TestRegisterEndpoint/Missing_required_field_-_email (0.00s)
    --- PASS: TestRegisterEndpoint/Missing_required_field_-_username (0.00s)
    --- PASS: TestRegisterEndpoint/Missing_required_field_-_password (0.00s)
    --- PASS: TestRegisterEndpoint/Invalid_JSON_payload (0.00s)
    --- PASS: TestRegisterEndpoint/Invalid_role_value (0.00s)
    --- PASS: TestRegisterEndpoint/Empty_email (0.00s)
    --- PASS: TestRegisterEndpoint/Empty_username (0.00s)
    --- PASS: TestRegisterEndpoint/Empty_password (0.00s)
    --- PASS: TestRegisterEndpoint/Whitespace-only_username (0.00s)
    --- PASS: TestRegisterEndpoint/Empty_JSON_request_body (0.00s)
=== RUN   TestLoginEndpoint
=== RUN   TestLoginEndpoint/Valid_login_with_email
=== RUN   TestLoginEndpoint/Valid_login_with_username
=== RUN   TestLoginEndpoint/Invalid_password
=== RUN   TestLoginEndpoint/User_not_found
=== RUN   TestLoginEndpoint/Missing_login_field
=== RUN   TestLoginEndpoint/Missing_password_field
=== RUN   TestLoginEndpoint/Empty_login
=== RUN   TestLoginEndpoint/Empty_password
=== RUN   TestLoginEndpoint/Invalid_JSON_payload
=== RUN   TestLoginEndpoint/Empty_request_body
--- PASS: TestLoginEndpoint (0.00s)
    --- PASS: TestLoginEndpoint/Valid_login_with_email (0.00s)
    --- PASS: TestLoginEndpoint/Valid_login_with_username (0.00s)
    --- PASS: TestLoginEndpoint/Invalid_password (0.00s)
    --- PASS: TestLoginEndpoint/User_not_found (0.00s)
    --- PASS: TestLoginEndpoint/Missing_login_field (0.00s)
    --- PASS: TestLoginEndpoint/Missing_password_field (0.00s)
    --- PASS: TestLoginEndpoint/Empty_login (0.00s)
    --- PASS: TestLoginEndpoint/Empty_password (0.00s)
    --- PASS: TestLoginEndpoint/Invalid_JSON_payload (0.00s)
    --- PASS: TestLoginEndpoint/Empty_request_body (0.00s)
=== RUN   TestSearchMediaItemsTests
=== RUN   TestSearchMediaItemsTests/No_user_context_-_GET_/api/media-items/search_without_authentication
=== RUN   TestSearchMediaItemsTests/User_context_-_GET_/api/media-items/search_with_valid_authentication
=== RUN   TestSearchMediaItemsTests/Admin_context_-_GET_/api/media-items/search_with_admin_token
=== RUN   TestSearchMediaItemsTests/Search_with_missing_query_parameter
=== RUN   TestSearchMediaItemsTests/Search_with_no_results_found_(404)
=== RUN   TestSearchMediaItemsTests/Search_with_partial_match
=== RUN   TestSearchMediaItemsTests/Search_with_fuzzy_match_fallback
=== RUN   TestSearchMediaItemsTests/Search_by_author_name
=== RUN   TestSearchMediaItemsTests/Search_with_special_characters
--- PASS: TestSearchMediaItemsTests (0.00s)
    --- PASS: TestSearchMediaItemsTests/No_user_context_-_GET_/api/media-items/search_without_authentication (0.00s)
    --- PASS: TestSearchMediaItemsTests/User_context_-_GET_/api/media-items/search_with_valid_authentication (0.00s)
    --- PASS: TestSearchMediaItemsTests/Admin_context_-_GET_/api/media-items/search_with_admin_token (0.00s)
    --- PASS: TestSearchMediaItemsTests/Search_with_missing_query_parameter (0.00s)
    --- PASS: TestSearchMediaItemsTests/Search_with_no_results_found_(404) (0.00s)
    --- PASS: TestSearchMediaItemsTests/Search_with_partial_match (0.00s)
    --- PASS: TestSearchMediaItemsTests/Search_with_fuzzy_match_fallback (0.00s)
    --- PASS: TestSearchMediaItemsTests/Search_by_author_name (0.00s)
    --- PASS: TestSearchMediaItemsTests/Search_with_special_characters (0.00s)
=== RUN   TestSearchIntegrationWithRealDatabase
=== RUN   TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items
=== RUN   TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/Register_admin_user
=== RUN   TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/Register_regular_user
=== RUN   TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/Create_library_with_admin_token
=== RUN   TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/User_searches_for_existing_media_items
=== RUN   TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/Admin_searches_all_items_including_hidden
--- PASS: TestSearchIntegrationWithRealDatabase (0.00s)
    --- PASS: TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items (0.00s)
        --- PASS: TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/Register_admin_user (0.00s)
        --- PASS: TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/Register_regular_user (0.00s)
        --- PASS: TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/Create_library_with_admin_token (0.00s)
        --- PASS: TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/User_searches_for_existing_media_items (0.00s)
        --- PASS: TestSearchIntegrationWithRealDatabase/Setup_-_Register_admin_and_user,_create_library_with_media_items/Admin_searches_all_items_including_hidden (0.00s)
=== RUN   TestPasswordComplexity
=== RUN   TestPasswordComplexity/Valid_password_with_all_requirements
=== RUN   TestPasswordComplexity/Missing_uppercase
=== RUN   TestPasswordComplexity/Missing_lowercase
=== RUN   TestPasswordComplexity/Missing_number
=== RUN   TestPasswordComplexity/Missing_special_char
=== RUN   TestPasswordComplexity/Too_short
=== RUN   TestPasswordComplexity/Minimum_valid_password
--- PASS: TestPasswordComplexity (0.00s)
    --- PASS: TestPasswordComplexity/Valid_password_with_all_requirements (0.00s)
    --- PASS: TestPasswordComplexity/Missing_uppercase (0.00s)
    --- PASS: TestPasswordComplexity/Missing_lowercase (0.00s)
    --- PASS: TestPasswordComplexity/Missing_number (0.00s)
    --- PASS: TestPasswordComplexity/Missing_special_char (0.00s)
    --- PASS: TestPasswordComplexity/Too_short (0.00s)
    --- PASS: TestPasswordComplexity/Minimum_valid_password (0.00s)
=== RUN   TestAccountLockout
=== RUN   TestAccountLockout/Failed_login_attempts_tracking
=== RUN   TestAccountLockout/Clear_attempts_unlocks_account
--- PASS: TestAccountLockout (0.00s)
    --- PASS: TestAccountLockout/Failed_login_attempts_tracking (0.00s)
    --- PASS: TestAccountLockout/Clear_attempts_unlocks_account (0.00s)
=== RUN   TestRateLimiterSecurity
--- PASS: TestRateLimiterSecurity (0.00s)
=== RUN   TestJWTExpiration
--- PASS: TestJWTExpiration (0.00s)
=== RUN   TestRefreshTokenExpiration
--- PASS: TestRefreshTokenExpiration (0.00s)
=== RUN   TestPasswordRequirementsList
--- PASS: TestPasswordRequirementsList (0.00s)
=== RUN   TestDatabaseTransactionManager
--- PASS: TestDatabaseTransactionManager (0.00s)
=== RUN   TestErrorHandlingTypes
--- PASS: TestErrorHandlingTypes (0.00s)
=== RUN   TestSimpleSetup
    setup_test.go:8: 🔧 Test setup verification
    setup_test.go:11: ✅ Go compilation successful
    setup_test.go:14: 🚀 Test runner is working
    setup_test.go:17: ✅ Basic test completed successfully
--- PASS: TestSimpleSetup (0.00s)
=== RUN   TestListMediaItemsSorting
=== RUN   TestListMediaItemsSorting/No_user_context_-_GET_/api/media-items_without_authentication
=== RUN   TestListMediaItemsSorting/User_context_-_GET_/api/media-items_with_title_ASC_sort
=== RUN   TestListMediaItemsSorting/User_context_-_GET_/api/media-items_with_author_DESC_sort
=== RUN   TestListMediaItemsSorting/Admin_context_-_GET_/api/media-items_with_page_count_DESC_sort
=== RUN   TestListMediaItemsSorting/User_context_-_Invalid_sort_parameter_defaults_to_created_at_DESC
=== RUN   TestListMediaItemsSorting/User_context_-_Sort_by_genre_ASC
=== RUN   TestListMediaItemsSorting/User_context_-_Sort_by_copyright_year_DESC
=== RUN   TestListMediaItemsSorting/User_context_-_Sort_with_pagination
--- PASS: TestListMediaItemsSorting (0.00s)
    --- PASS: TestListMediaItemsSorting/No_user_context_-_GET_/api/media-items_without_authentication (0.00s)
    --- PASS: TestListMediaItemsSorting/User_context_-_GET_/api/media-items_with_title_ASC_sort (0.00s)
    --- PASS: TestListMediaItemsSorting/User_context_-_GET_/api/media-items_with_author_DESC_sort (0.00s)
    --- PASS: TestListMediaItemsSorting/Admin_context_-_GET_/api/media-items_with_page_count_DESC_sort (0.00s)
    --- PASS: TestListMediaItemsSorting/User_context_-_Invalid_sort_parameter_defaults_to_created_at_DESC (0.00s)
    --- PASS: TestListMediaItemsSorting/User_context_-_Sort_by_genre_ASC (0.00s)
    --- PASS: TestListMediaItemsSorting/User_context_-_Sort_by_copyright_year_DESC (0.00s)
    --- PASS: TestListMediaItemsSorting/User_context_-_Sort_with_pagination (0.00s)
=== RUN   TestSyncIntegration_OfflineDetector_DeviceStatusDetection
    sync_integration_test.go:53: 
        	Error Trace:	/app/cmd/server/tests/sync_integration_test.go:53
        	            				/app/cmd/server/tests/sync_integration_test.go:79
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestSyncIntegration_OfflineDetector_DeviceStatusDetection
--- FAIL: TestSyncIntegration_OfflineDetector_DeviceStatusDetection (0.00s)
=== RUN   TestSyncIntegration_OfflineDetector_OfflineThreshold
    sync_integration_test.go:53: 
        	Error Trace:	/app/cmd/server/tests/sync_integration_test.go:53
        	            				/app/cmd/server/tests/sync_integration_test.go:95
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestSyncIntegration_OfflineDetector_OfflineThreshold
--- FAIL: TestSyncIntegration_OfflineDetector_OfflineThreshold (0.00s)
=== RUN   TestSyncIntegration_OfflineDetector_GetDeviceStatus
    sync_integration_test.go:53: 
        	Error Trace:	/app/cmd/server/tests/sync_integration_test.go:53
        	            				/app/cmd/server/tests/sync_integration_test.go:113
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestSyncIntegration_OfflineDetector_GetDeviceStatus
--- FAIL: TestSyncIntegration_OfflineDetector_GetDeviceStatus (0.00s)
=== RUN   TestSyncIntegration_OfflineDetector_ForceReconnectDevice
    sync_integration_test.go:53: 
        	Error Trace:	/app/cmd/server/tests/sync_integration_test.go:53
        	            				/app/cmd/server/tests/sync_integration_test.go:129
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestSyncIntegration_OfflineDetector_ForceReconnectDevice
--- FAIL: TestSyncIntegration_OfflineDetector_ForceReconnectDevice (0.00s)
=== RUN   TestSyncIntegration_QueueProcessor_EnqueueProgress
    sync_integration_test.go:174: 
        	Error Trace:	/app/cmd/server/tests/sync_integration_test.go:174
        	Error:      	Received unexpected error:
        	            	failed to connect to `host=db user=postgres database=bookhoard`: server error (FATAL: sorry, too many clients already (SQLSTATE 53300))
        	Test:       	TestSyncIntegration_QueueProcessor_EnqueueProgress
--- FAIL: TestSyncIntegration_QueueProcessor_EnqueueProgress (0.00s)
=== RUN   TestSystemSettingsHandler
=== RUN   TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_without_auth
=== RUN   TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_as_non-admin
=== RUN   TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_as_admin
    system_settings_test.go:77: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:77
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_as_admin
    system_settings_test.go:81: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:81
        	Error:      	Received unexpected error:
        	            	EOF
        	Test:       	TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_as_admin
    system_settings_test.go:82: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:82
        	Error:      	Not equal: 
        	            	expected: float64(60)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_as_admin
    system_settings_test.go:83: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:83
        	Error:      	Not equal: 
        	            	expected: bool(true)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_as_admin
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_without_auth
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_as_non-admin
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_low_(14_minutes)
    system_settings_test.go:175: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:175
        	Error:      	Not equal: 
        	            	expected: 400
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_low_(14_minutes)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_high_(1441_minutes)
    system_settings_test.go:175: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:175
        	Error:      	Not equal: 
        	            	expected: 400
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_high_(1441_minutes)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_low_(0_minutes)
    system_settings_test.go:175: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:175
        	Error:      	Not equal: 
        	            	expected: 400
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_low_(0_minutes)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_negative_(-10)
    system_settings_test.go:175: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:175
        	Error:      	Not equal: 
        	            	expected: 400
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_negative_(-10)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_missing_required_field
    system_settings_test.go:203: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:203
        	Error:      	Not equal: 
        	            	expected: 400
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_missing_required_field
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(15_minutes)
    system_settings_test.go:251: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:251
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(15_minutes)
    system_settings_test.go:255: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:255
        	Error:      	Received unexpected error:
        	            	EOF
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(15_minutes)
    system_settings_test.go:256: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:256
        	Error:      	Not equal: 
        	            	expected: float64(15)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(15_minutes)
    system_settings_test.go:257: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:257
        	Error:      	Not equal: 
        	            	expected: bool(true)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(15_minutes)
    system_settings_test.go:258: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:258
        	Error:      	Not equal: 
        	            	expected: string("scan settings updated successfully")
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(15_minutes)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(60_minutes)
    system_settings_test.go:251: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:251
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(60_minutes)
    system_settings_test.go:255: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:255
        	Error:      	Received unexpected error:
        	            	EOF
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(60_minutes)
    system_settings_test.go:256: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:256
        	Error:      	Not equal: 
        	            	expected: float64(60)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(60_minutes)
    system_settings_test.go:257: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:257
        	Error:      	Not equal: 
        	            	expected: bool(true)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(60_minutes)
    system_settings_test.go:258: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:258
        	Error:      	Not equal: 
        	            	expected: string("scan settings updated successfully")
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(60_minutes)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(1440_minutes)
    system_settings_test.go:251: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:251
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(1440_minutes)
    system_settings_test.go:255: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:255
        	Error:      	Received unexpected error:
        	            	EOF
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(1440_minutes)
    system_settings_test.go:256: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:256
        	Error:      	Not equal: 
        	            	expected: float64(1440)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(1440_minutes)
    system_settings_test.go:257: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:257
        	Error:      	Not equal: 
        	            	expected: bool(true)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(1440_minutes)
    system_settings_test.go:258: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:258
        	Error:      	Not equal: 
        	            	expected: string("scan settings updated successfully")
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(1440_minutes)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(120_minutes)
    system_settings_test.go:251: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:251
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(120_minutes)
    system_settings_test.go:255: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:255
        	Error:      	Received unexpected error:
        	            	EOF
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(120_minutes)
    system_settings_test.go:256: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:256
        	Error:      	Not equal: 
        	            	expected: float64(120)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(120_minutes)
    system_settings_test.go:257: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:257
        	Error:      	Not equal: 
        	            	expected: bool(false)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(120_minutes)
    system_settings_test.go:258: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:258
        	Error:      	Not equal: 
        	            	expected: string("scan settings updated successfully")
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(120_minutes)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(30_minutes)
    system_settings_test.go:251: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:251
        	Error:      	Not equal: 
        	            	expected: 200
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(30_minutes)
    system_settings_test.go:255: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:255
        	Error:      	Received unexpected error:
        	            	EOF
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(30_minutes)
    system_settings_test.go:256: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:256
        	Error:      	Not equal: 
        	            	expected: float64(30)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(30_minutes)
    system_settings_test.go:257: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:257
        	Error:      	Not equal: 
        	            	expected: bool(true)
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(30_minutes)
    system_settings_test.go:258: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:258
        	Error:      	Not equal: 
        	            	expected: string("scan settings updated successfully")
        	            	actual  : <nil>(<nil>)
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(30_minutes)
=== RUN   TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_JSON
    system_settings_test.go:283: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:283
        	Error:      	Not equal: 
        	            	expected: 400
        	            	actual  : 403
        	Test:       	TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_JSON
--- FAIL: TestSystemSettingsHandler (0.00s)
    --- PASS: TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_without_auth (0.00s)
    --- PASS: TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_as_non-admin (0.00s)
    --- FAIL: TestSystemSettingsHandler/GET_/api/libraries/scan-settings_-_Get_settings_as_admin (0.00s)
    --- PASS: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_without_auth (0.00s)
    --- PASS: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_as_non-admin (0.00s)
    --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_low_(14_minutes) (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_high_(1441_minutes) (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_too_low_(0_minutes) (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_frequency/Frequency_negative_(-10) (0.00s)
    --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_missing_required_field (0.00s)
    --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(15_minutes) (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(60_minutes) (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(1440_minutes) (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(120_minutes) (0.00s)
        --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_valid_data/Valid_frequency_(30_minutes) (0.00s)
    --- FAIL: TestSystemSettingsHandler/PUT_/api/libraries/scan-settings_-_Update_with_invalid_JSON (0.00s)
=== RUN   TestSystemSettingsIntegration
=== RUN   TestSystemSettingsIntegration/System_settings_affect_all_libraries_equally
=== RUN   TestSystemSettingsIntegration/Disabling_auto_scan_stops_all_library_scans
    system_settings_test.go:306: 
        	Error Trace:	/app/cmd/server/tests/system_settings_test.go:306
        	Error:      	Not equal: 
        	            	expected: "Scans should not run when auto_scan_enabled is false"
        	            	actual  : "Scans should not run"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1 +1 @@
        	            	-Scans should not run when auto_scan_enabled is false
        	            	+Scans should not run
        	Test:       	TestSystemSettingsIntegration/Disabling_auto_scan_stops_all_library_scans
=== RUN   TestSystemSettingsIntegration/Valid_frequency_range_enforcement
--- FAIL: TestSystemSettingsIntegration (0.00s)
    --- PASS: TestSystemSettingsIntegration/System_settings_affect_all_libraries_equally (0.00s)
    --- FAIL: TestSystemSettingsIntegration/Disabling_auto_scan_stops_all_library_scans (0.00s)
    --- PASS: TestSystemSettingsIntegration/Valid_frequency_range_enforcement (0.00s)
=== RUN   TestTestRunner
    testrunner_test.go:8: 🧪 Go test runner verification
    testrunner_test.go:9: ✅ Testing framework is properly configured
    testrunner_test.go:10: 📋 Package structure is correct
    testrunner_test.go:13: 📝 All tests should be discoverable and runnable
    testrunner_test.go:20: ✅ Test runner verification completed
--- PASS: TestTestRunner (0.00s)
=== RUN   TestPhase1Integration
=== RUN   TestPhase1Integration/Cleanup_ExistingTestUser
    universal_progress_integration_test.go:34: Cleanup: No existing test user to delete (server not available)
=== RUN   TestPhase1Integration/Step1_CreateFirstUser
    universal_progress_integration_test.go:108: 
        	Error Trace:	/app/cmd/server/tests/universal_progress_integration_test.go:108
        	Error:      	Received unexpected error:
        	            	Post "http://localhost:8765/api/auth/register": dial tcp [::1]:8765: connect: connection refused
        	Test:       	TestPhase1Integration/Step1_CreateFirstUser
--- FAIL: TestPhase1Integration (0.00s)
    --- PASS: TestPhase1Integration/Cleanup_ExistingTestUser (0.00s)
    --- FAIL: TestPhase1Integration/Step1_CreateFirstUser (0.00s)
panic: runtime error: invalid memory address or nil pointer dereference [recovered, repanicked]
[signal SIGSEGV: segmentation violation code=0x1 addr=0x40 pc=0x10304cd]

goroutine 7630 [running]:
testing.tRunner.func1.2({0x11c2420, 0x1e28230})
	/usr/local/go/src/testing/testing.go:1872 +0x237
testing.tRunner.func1()
	/usr/local/go/src/testing/testing.go:1875 +0x35b
panic({0x11c2420?, 0x1e28230?})
	/usr/local/go/src/runtime/panic.go:783 +0x132
bookhoard/cmd/server/tests.TestPhase1Integration.func2(0xc00257a700)
	/app/cmd/server/tests/universal_progress_integration_test.go:109 +0x26d
testing.tRunner(0xc00257a700, 0x140bc48)
	/usr/local/go/src/testing/testing.go:1934 +0xea
created by testing.(*T).Run in goroutine 7622
	/usr/local/go/src/testing/testing.go:1997 +0x465
FAIL	bookhoard/cmd/server/tests	7.634s
FAIL
Error: executing /usr/bin/podman-compose --profile tests run --rm tests: exit status 1
make: *** [Makefile:39: test-integration] Error 1
