Files
MeBox/internal/service/download_clients_test.go
T

171 lines
4.4 KiB
Go

package service
import (
"testing"
"github.com/glebarez/sqlite"
"go.uber.org/zap"
"gorm.io/gorm"
"github.com/ShukeBta/MediaStationGo/internal/model"
"github.com/ShukeBta/MediaStationGo/internal/repository"
)
func TestDownloadClientCreateNormalizesHostAndClearsDefault(t *testing.T) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.DownloadClient{}, &model.Setting{}); err != nil {
t.Fatal(err)
}
repos := repository.New(db)
svc := NewDownloadClientService(zap.NewNop(), repos)
first, err := svc.Create(t.Context(), DownloadClientInput{
Name: "qB old",
Type: "qbittorrent",
Host: "http://127.0.0.1:8080/",
IsDefault: true,
Enabled: true,
})
if err != nil {
t.Fatal(err)
}
second, err := svc.Create(t.Context(), DownloadClientInput{
Name: "qB NAS",
Type: "qbittorrent",
Host: "172.17.0.1:8085",
IsDefault: true,
Enabled: true,
})
if err != nil {
t.Fatal(err)
}
if second.Host != "http://172.17.0.1:8085" {
t.Fatalf("host = %q, want normalized http URL", second.Host)
}
refreshedFirst, err := repos.DownloadClient.FindByID(t.Context(), first.ID)
if err != nil {
t.Fatal(err)
}
if refreshedFirst == nil || refreshedFirst.IsDefault {
t.Fatalf("old default should be cleared, got %#v", refreshedFirst)
}
refreshedSecond, err := repos.DownloadClient.FindByID(t.Context(), second.ID)
if err != nil {
t.Fatal(err)
}
if refreshedSecond == nil || !refreshedSecond.IsDefault {
t.Fatalf("new default should be active, got %#v", refreshedSecond)
}
}
func TestDownloadClientRejectsUnsupportedHostScheme(t *testing.T) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.DownloadClient{}, &model.Setting{}); err != nil {
t.Fatal(err)
}
svc := NewDownloadClientService(zap.NewNop(), repository.New(db))
if _, err := svc.Create(t.Context(), DownloadClientInput{
Name: "bad",
Type: "qbittorrent",
Host: "ftp://127.0.0.1:8080",
Enabled: true,
}); err == nil {
t.Fatal("expected unsupported scheme error")
}
}
func TestDownloadClientDeleteClearsLegacyQBitConnectionWhenNoDefault(t *testing.T) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.DownloadClient{}, &model.Setting{}); err != nil {
t.Fatal(err)
}
repos := repository.New(db)
for key, value := range map[string]string{
"qbittorrent.url": "http://127.0.0.1:8080",
"qbittorrent.username": "admin",
"qbittorrent.password": "admin",
} {
if err := repos.Setting.Set(t.Context(), key, value); err != nil {
t.Fatal(err)
}
}
svc := NewDownloadClientService(zap.NewNop(), repos)
row, err := svc.Create(t.Context(), DownloadClientInput{
Name: "qB",
Type: "qbittorrent",
Host: "http://127.0.0.1:8080",
IsDefault: true,
Enabled: true,
})
if err != nil {
t.Fatal(err)
}
if err := svc.Delete(t.Context(), row.ID); err != nil {
t.Fatal(err)
}
for _, key := range []string{"qbittorrent.url", "qbittorrent.username", "qbittorrent.password"} {
value, err := repos.Setting.Get(t.Context(), key)
if err != nil {
t.Fatal(err)
}
if value != "" {
t.Fatalf("%s = %q, want cleared", key, value)
}
}
}
func TestDownloadClientUpdateClearsLegacyQBitConnectionWhenDefaultDisabled(t *testing.T) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
t.Fatal(err)
}
if err := db.AutoMigrate(&model.DownloadClient{}, &model.Setting{}); err != nil {
t.Fatal(err)
}
repos := repository.New(db)
if err := repos.Setting.Set(t.Context(), "qbittorrent.url", "http://127.0.0.1:8080"); err != nil {
t.Fatal(err)
}
svc := NewDownloadClientService(zap.NewNop(), repos)
row, err := svc.Create(t.Context(), DownloadClientInput{
Name: "qB",
Type: "qbittorrent",
Host: "http://127.0.0.1:8080",
IsDefault: true,
Enabled: true,
})
if err != nil {
t.Fatal(err)
}
if _, err := svc.Update(t.Context(), row.ID, DownloadClientInput{
Name: "qB",
Type: "qbittorrent",
Host: "http://127.0.0.1:8080",
IsDefault: false,
Enabled: false,
}); err != nil {
t.Fatal(err)
}
value, err := repos.Setting.Get(t.Context(), "qbittorrent.url")
if err != nil {
t.Fatal(err)
}
if value != "" {
t.Fatalf("qbittorrent.url = %q, want cleared", value)
}
}