All checks were successful
Release / Scraper / Test (push) Successful in 10s
Release / UI / Build (push) Successful in 26s
Release / v2 / Build ui-v2 (push) Successful in 17s
Release / Scraper / Docker (push) Successful in 47s
Release / UI / Docker (push) Successful in 56s
CI / Scraper / Lint (pull_request) Successful in 7s
CI / Scraper / Test (pull_request) Successful in 8s
CI / UI / Build (pull_request) Successful in 16s
CI / Scraper / Docker Push (pull_request) Has been skipped
CI / UI / Docker Push (pull_request) Has been skipped
Release / v2 / Docker / ui-v2 (push) Successful in 56s
Release / v2 / Test backend (push) Successful in 4m35s
iOS CI / Build (pull_request) Successful in 4m28s
Release / v2 / Docker / backend (push) Successful in 1m29s
Release / v2 / Docker / runner (push) Successful in 1m39s
iOS CI / Test (pull_request) Successful in 9m51s
- backend/: Go API server and runner binaries with PocketBase + MinIO storage - ui-v2/: SvelteKit frontend rewrite - docker-compose-new.yml: compose file for the v2 stack - .gitea/workflows/release-v2.yaml: CI/CD for backend, runner, and ui-v2 Docker Hub images - scripts/pb-init.sh: migrate from wget to curl, add superuser bootstrap for fresh installs - .env.example: document DOCKER_BUILDKIT=1 for Colima users
105 lines
2.7 KiB
Go
105 lines
2.7 KiB
Go
package domain_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/libnovel/backend/internal/domain"
|
|
)
|
|
|
|
func TestBookMeta_JSONRoundtrip(t *testing.T) {
|
|
orig := domain.BookMeta{
|
|
Slug: "a-great-novel",
|
|
Title: "A Great Novel",
|
|
Author: "Jane Doe",
|
|
Cover: "https://example.com/cover.jpg",
|
|
Status: "Ongoing",
|
|
Genres: []string{"Fantasy", "Action"},
|
|
Summary: "A thrilling tale.",
|
|
TotalChapters: 120,
|
|
SourceURL: "https://novelfire.net/book/a-great-novel",
|
|
Ranking: 3,
|
|
}
|
|
|
|
b, err := json.Marshal(orig)
|
|
if err != nil {
|
|
t.Fatalf("marshal: %v", err)
|
|
}
|
|
var got domain.BookMeta
|
|
if err := json.Unmarshal(b, &got); err != nil {
|
|
t.Fatalf("unmarshal: %v", err)
|
|
}
|
|
if got.Slug != orig.Slug {
|
|
t.Errorf("Slug: want %q, got %q", orig.Slug, got.Slug)
|
|
}
|
|
if got.TotalChapters != orig.TotalChapters {
|
|
t.Errorf("TotalChapters: want %d, got %d", orig.TotalChapters, got.TotalChapters)
|
|
}
|
|
if len(got.Genres) != len(orig.Genres) {
|
|
t.Errorf("Genres len: want %d, got %d", len(orig.Genres), len(got.Genres))
|
|
}
|
|
}
|
|
|
|
func TestChapterRef_JSONRoundtrip(t *testing.T) {
|
|
orig := domain.ChapterRef{Number: 42, Title: "The Battle", URL: "https://example.com/ch-42", Volume: 2}
|
|
b, _ := json.Marshal(orig)
|
|
var got domain.ChapterRef
|
|
json.Unmarshal(b, &got)
|
|
if got != orig {
|
|
t.Errorf("want %+v, got %+v", orig, got)
|
|
}
|
|
}
|
|
|
|
func TestRankingItem_JSONRoundtrip(t *testing.T) {
|
|
now := time.Now().Truncate(time.Second)
|
|
orig := domain.RankingItem{
|
|
Rank: 1,
|
|
Slug: "top-novel",
|
|
Title: "Top Novel",
|
|
SourceURL: "https://novelfire.net/book/top-novel",
|
|
Updated: now,
|
|
}
|
|
b, _ := json.Marshal(orig)
|
|
var got domain.RankingItem
|
|
json.Unmarshal(b, &got)
|
|
if got.Rank != orig.Rank || got.Slug != orig.Slug {
|
|
t.Errorf("want %+v, got %+v", orig, got)
|
|
}
|
|
}
|
|
|
|
func TestScrapeResult_JSONRoundtrip(t *testing.T) {
|
|
orig := domain.ScrapeResult{BooksFound: 10, ChaptersScraped: 200, ChaptersSkipped: 5, Errors: 1, ErrorMessage: "one error"}
|
|
b, _ := json.Marshal(orig)
|
|
var got domain.ScrapeResult
|
|
json.Unmarshal(b, &got)
|
|
if got != orig {
|
|
t.Errorf("want %+v, got %+v", orig, got)
|
|
}
|
|
}
|
|
|
|
func TestAudioResult_JSONRoundtrip(t *testing.T) {
|
|
orig := domain.AudioResult{ObjectKey: "audio/slug/1/af_bella.mp3"}
|
|
b, _ := json.Marshal(orig)
|
|
var got domain.AudioResult
|
|
json.Unmarshal(b, &got)
|
|
if got != orig {
|
|
t.Errorf("want %+v, got %+v", orig, got)
|
|
}
|
|
}
|
|
|
|
func TestTaskStatus_Values(t *testing.T) {
|
|
cases := []domain.TaskStatus{
|
|
domain.TaskStatusPending,
|
|
domain.TaskStatusRunning,
|
|
domain.TaskStatusDone,
|
|
domain.TaskStatusFailed,
|
|
domain.TaskStatusCancelled,
|
|
}
|
|
for _, s := range cases {
|
|
if s == "" {
|
|
t.Errorf("TaskStatus constant must not be empty")
|
|
}
|
|
}
|
|
}
|