package handler import ( "bytes" "context" "encoding/json" "net/http" "net/http/httptest" "testing" "gitea.starryskymeow.cn/B309/datamarket/internal/service" ) type fakeAssetService struct { listResult service.ListResult[service.Asset] listErr error } func (f fakeAssetService) CreateAsset(context.Context, service.AssetCreateInput) (service.AssetStatusResult, error) { return service.AssetStatusResult{}, nil } func (f fakeAssetService) GetAsset(context.Context, string) (service.Asset, error) { return service.Asset{}, nil } func (f fakeAssetService) ListAssets(context.Context, service.AssetListInput) (service.ListResult[service.Asset], error) { return f.listResult, f.listErr } func (f fakeAssetService) UpdateAssetStatus(context.Context, string, service.StatusUpdate) (service.AssetStatusResult, error) { return service.AssetStatusResult{}, nil } func TestCreateAssetHandlerRejectsInvalidJSON(t *testing.T) { req := httptest.NewRequest(http.MethodPost, "/api/assets", bytes.NewBufferString("{")) rec := httptest.NewRecorder() CreateAsset(fakeAssetService{}).ServeHTTP(rec, req) if rec.Code != http.StatusBadRequest { t.Fatalf("status = %d, want %d", rec.Code, http.StatusBadRequest) } } func TestListAssetsHandlerReturnsListPayload(t *testing.T) { req := httptest.NewRequest(http.MethodGet, "/api/assets?limit=5&offset=0", nil) rec := httptest.NewRecorder() handler := ListAssets(fakeAssetService{ listResult: service.ListResult[service.Asset]{ List: []service.Asset{ { ID: "asset-1", AssetName: "机械臂抓取演示数据集A", AssetType: "视频+轨迹", Domain: "机器人", DataDescription: "包含工业抓取场景的机械臂操作视频与轨迹", DataScale: "1200条轨迹", CollectionMethod: "真实采集", PrivacyLevel: "中", PermissionMode: "授权访问", SupportsValidation: true, AssetStatus: "已上架", }, }, Total: 1, Limit: 5, Offset: 0, }, }) handler.ServeHTTP(rec, req) if rec.Code != http.StatusOK { t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK) } var body Response[ListResponse[service.Asset]] if err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil { t.Fatalf("json.Unmarshal() error = %v", err) } if body.Code != 0 { t.Fatalf("code = %d, want 0", body.Code) } if body.Data.Total != 1 || len(body.Data.List) != 1 { t.Fatalf("unexpected payload: %+v", body.Data) } }