subsyt/internal/server/server_test.go
Viktor Varland 09134c46c4
Some checks are pending
build / build (push) Waiting to run
refactor: split logic into distinct parts
2025-10-01 21:21:59 +02:00

143 lines
3.4 KiB
Go

package server
import (
"bytes"
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"os"
"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")
}
}