142 lines
3.4 KiB
Go
142 lines
3.4 KiB
Go
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)
|
|
}
|
|
|
|
tmp := t.TempDir()
|
|
tokenPath := filepath.Join(tmp, "token.txt")
|
|
if err := os.WriteFile(tokenPath, []byte("secret"), 0o600); err != nil {
|
|
t.Fatalf("write token file: %v", err)
|
|
}
|
|
|
|
s := NewServer(config.Http_api{Auth_token_file: tokenPath}, "/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")
|
|
}
|
|
}
|