package server import ( "bytes" "context" "encoding/json" "net/http" "net/http/httptest" "path/filepath" "testing" "time" "git.meatbag.se/varl/subsyt/internal/config" ) func TestHandleVideosRequiresAuth(t *testing.T) { queue, err := NewQueue("") if err != nil { t.Fatalf("new queue: %v", err) } s := NewServer(config.Http_api{Auth_token: "secret"}, "/videos", queue) req := httptest.NewRequest(http.MethodPost, "/v1/videos", bytes.NewBufferString(`{"url":"https://example.com"}`)) rec := httptest.NewRecorder() s.handleVideos(rec, req) if rec.Result().StatusCode != http.StatusUnauthorized { t.Fatalf("expected unauthorized, got %d", rec.Result().StatusCode) } } func TestHandleVideosSuccess(t *testing.T) { queue, err := NewQueue("") if err != nil { t.Fatalf("new queue: %v", err) } s := NewServer(config.Http_api{}, "/videos", queue) payload := map[string]interface{}{ "url": "https://example.com/watch?v=123", "out_dir": "channel", "metadata_only": true, } body, err := json.Marshal(payload) if err != nil { t.Fatalf("marshal: %v", err) } req := httptest.NewRequest(http.MethodPost, "/v1/videos", bytes.NewReader(body)) rec := httptest.NewRecorder() s.handleVideos(rec, req) if rec.Result().StatusCode != http.StatusAccepted { t.Fatalf("expected accepted, got %d", rec.Result().StatusCode) } ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() item, err := queue.Next(ctx) if err != nil { t.Fatalf("next: %v", err) } expectedOutDir := filepath.Join("/videos", "channel") if item.Request.OutDir != expectedOutDir { t.Fatalf("expected out dir %s, got %s", expectedOutDir, item.Request.OutDir) } if !item.Request.MetadataOnly { t.Fatalf("expected metadata flag to be true") } if err := queue.MarkDone(item.ID); err != nil { t.Fatalf("mark done: %v", err) } } func TestHandleStatus(t *testing.T) { queue, err := NewQueue("") if err != nil { t.Fatalf("new queue: %v", err) } s := NewServer(config.Http_api{Auth_token: "secret"}, "/videos", queue) req := httptest.NewRequest(http.MethodGet, "/status", nil) rec := httptest.NewRecorder() s.handleStatus(rec, req) if rec.Result().StatusCode != http.StatusUnauthorized { t.Fatalf("expected unauthorized, got %d", rec.Result().StatusCode) } if _, err := queue.Enqueue(VideoRequest{URL: "https://example.com/watch?v=1", OutDir: "/videos", MetadataOnly: false}); err != nil { t.Fatalf("enqueue: %v", err) } req = httptest.NewRequest(http.MethodGet, "/status", nil) req.Header.Set("Authorization", "Bearer secret") rec = httptest.NewRecorder() s.handleStatus(rec, req) if rec.Result().StatusCode != http.StatusOK { t.Fatalf("expected ok, got %d", rec.Result().StatusCode) } var payload struct { Count int `json:"count"` Items []queueItem `json:"items"` } if err := json.NewDecoder(rec.Body).Decode(&payload); err != nil { t.Fatalf("decode: %v", err) } if payload.Count != 1 { t.Fatalf("expected count 1, got %d", payload.Count) } if len(payload.Items) != 1 { t.Fatalf("expected one item, got %d", len(payload.Items)) } if payload.Items[0].Request.URL == "" { t.Fatalf("expected item url to be set") } }