package test import ( domainArticle "RenewCMS/internal/domain/article" "RenewCMS/internal/infrastructure/useCases" "encoding/base64" "net/http" "net/url" "reflect" "testing" ) type mediaOrderRecordingArticleRepo struct { *mockArticleRepo updated []uint32 } func (r *mediaOrderRecordingArticleRepo) UpdateBody(id uint32, body string) (domainArticle.Article, error) { r.updated = append(r.updated, id) return r.mockArticleRepo.UpdateBody(id, body) } func TestMediaCursorBoundaries(t *testing.T) { seed := func(env *mediaEnv) { env.seedImage(1, "a.jpg", 10, "image/jpeg", 3, 2, hashA, 1) env.seedImage(2, "b.jpg", 20, "image/jpeg", 3, 2, hashB, 1) } encode := func(raw string) string { return url.QueryEscape(base64.RawURLEncoding.EncodeToString([]byte(raw))) } t.Run("A cursor at offset zero is accepted and starts from the first item", func(t *testing.T) { env := newMediaEnv(t) seed(env) rec := env.send(t, http.MethodGet, "/v1/media/?cursor="+encode("offset:0"), "", mediaVerifiedUserId) if rec.Code != http.StatusOK { t.Fatalf("expected status 200, got %d", rec.Code) } }) t.Run("A negative cursor offset is refused", func(t *testing.T) { env := newMediaEnv(t) seed(env) rec := env.send(t, http.MethodGet, "/v1/media/?cursor="+encode("offset:-1"), "", mediaVerifiedUserId) if rec.Code != http.StatusBadRequest { t.Fatalf("expected status 400, got %d", rec.Code) } }) } func TestMediaMergeRewritesArticlesInIdOrder(t *testing.T) { env := newMediaEnv(t) env.seedImage(2, "floorboards.jpg", 20, "image/jpeg", 3, 2, hashB, 1) env.seedImage(3, "floorboards-copy.jpg", 20, "image/jpeg", 3, 2, hashB, 2) for id := uint32(1); id <= 8; id++ { env.seedArticle(id, "Article", true, env.urlOf(3)) } recorder := &mediaOrderRecordingArticleRepo{mockArticleRepo: env.articles} uc := useCases.NewMergeMediaUseCase(env.images, recorder, env.storage, newMockVariantFileRepo(), discardRecorder) if _, err := uc.Merge(testCtx, 2, []uint32{3}); err != nil { t.Fatalf("unexpected error: %v", err) } if want := []uint32{1, 2, 3, 4, 5, 6, 7, 8}; !reflect.DeepEqual(recorder.updated, want) { t.Errorf("expected updates in id order %v, got %v", want, recorder.updated) } }