1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00
mxpv-podsync/cmd/podsync/config_test.go
2022-05-08 16:39:04 -07:00

243 lines
5.6 KiB
Go

package main
import (
"io/ioutil"
"os"
"testing"
"time"
"github.com/mxpv/podsync/services/web"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/mxpv/podsync/pkg/model"
)
func TestLoadConfig(t *testing.T) {
const file = `
[tokens]
youtube = "123"
vimeo = ["321", "456"]
[server]
port = 80
data_dir = "test/data/"
[database]
dir = "/home/user/db/"
[downloader]
self_update = true
timeout = 15
[feeds]
[feeds.XYZ]
url = "https://youtube.com/watch?v=ygIUF678y40"
page_size = 48
update_period = "5h"
format = "audio"
quality = "low"
filters = { title = "regex for title here" }
playlist_sort = "desc"
clean = { keep_last = 10 }
[feeds.XYZ.custom]
cover_art = "http://img"
cover_art_quality = "high"
category = "TV"
subcategories = ["1", "2"]
explicit = true
lang = "en"
author = "Mrs. Smith (mrs@smith.org)"
ownerName = "Mrs. Smith"
ownerEmail = "mrs@smith.org"
`
path := setup(t, file)
defer os.Remove(path)
config, err := LoadConfig(path)
assert.NoError(t, err)
require.NotNil(t, config)
assert.Equal(t, "test/data/", config.Server.DataDir)
assert.EqualValues(t, 80, config.Server.Port)
assert.Equal(t, "/home/user/db/", config.Database.Dir)
require.Len(t, config.Tokens["youtube"], 1)
assert.Equal(t, "123", config.Tokens["youtube"][0])
require.Len(t, config.Tokens["vimeo"], 2)
assert.Equal(t, "321", config.Tokens["vimeo"][0])
assert.Equal(t, "456", config.Tokens["vimeo"][1])
assert.Len(t, config.Feeds, 1)
feed, ok := config.Feeds["XYZ"]
assert.True(t, ok)
assert.Equal(t, "https://youtube.com/watch?v=ygIUF678y40", feed.URL)
assert.EqualValues(t, 48, feed.PageSize)
assert.EqualValues(t, 5*time.Hour, feed.UpdatePeriod)
assert.EqualValues(t, "audio", feed.Format)
assert.EqualValues(t, "low", feed.Quality)
assert.EqualValues(t, "regex for title here", feed.Filters.Title)
assert.EqualValues(t, 10, feed.Clean.KeepLast)
assert.EqualValues(t, model.SortingDesc, feed.PlaylistSort)
assert.EqualValues(t, "http://img", feed.Custom.CoverArt)
assert.EqualValues(t, "high", feed.Custom.CoverArtQuality)
assert.EqualValues(t, "TV", feed.Custom.Category)
assert.True(t, feed.Custom.Explicit)
assert.EqualValues(t, "en", feed.Custom.Language)
assert.EqualValues(t, "Mrs. Smith (mrs@smith.org)", feed.Custom.Author)
assert.EqualValues(t, "Mrs. Smith", feed.Custom.OwnerName)
assert.EqualValues(t, "mrs@smith.org", feed.Custom.OwnerEmail)
assert.EqualValues(t, feed.Custom.Subcategories, []string{"1", "2"})
assert.Nil(t, config.Database.Badger)
assert.True(t, config.Downloader.SelfUpdate)
assert.EqualValues(t, 15, config.Downloader.Timeout)
}
func TestLoadEmptyKeyList(t *testing.T) {
const file = `
[tokens]
vimeo = []
[server]
data_dir = "/data"
[feeds]
[feeds.A]
url = "https://youtube.com/watch?v=ygIUF678y40"
`
path := setup(t, file)
defer os.Remove(path)
config, err := LoadConfig(path)
assert.NoError(t, err)
require.NotNil(t, config)
require.Len(t, config.Tokens, 1)
require.Len(t, config.Tokens["vimeo"], 0)
}
func TestApplyDefaults(t *testing.T) {
const file = `
[server]
data_dir = "/data"
[feeds]
[feeds.A]
url = "https://youtube.com/watch?v=ygIUF678y40"
`
path := setup(t, file)
defer os.Remove(path)
config, err := LoadConfig(path)
assert.NoError(t, err)
assert.NotNil(t, config)
assert.Len(t, config.Feeds, 1)
feed, ok := config.Feeds["A"]
require.True(t, ok)
assert.EqualValues(t, feed.UpdatePeriod, model.DefaultUpdatePeriod)
assert.EqualValues(t, feed.PageSize, 50)
assert.EqualValues(t, feed.Quality, "high")
assert.EqualValues(t, feed.Custom.CoverArtQuality, "high")
assert.EqualValues(t, feed.Format, "video")
}
func TestHttpServerListenAddress(t *testing.T) {
const file = `
[server]
bind_address = "172.20.10.2"
port = 8080
path = "test"
data_dir = "/data"
[feeds]
[feeds.A]
url = "https://youtube.com/watch?v=ygIUF678y40"
[database]
badger = { truncate = true, file_io = true }
`
path := setup(t, file)
defer os.Remove(path)
config, err := LoadConfig(path)
assert.NoError(t, err)
require.NotNil(t, config)
require.NotNil(t, config.Server.BindAddress)
require.NotNil(t, config.Server.Path)
}
func TestDefaultHostname(t *testing.T) {
cfg := Config{
Server: web.Config{},
}
t.Run("empty hostname", func(t *testing.T) {
cfg.applyDefaults("")
assert.Equal(t, "http://localhost", cfg.Server.Hostname)
})
t.Run("empty hostname with port", func(t *testing.T) {
cfg.Server.Hostname = ""
cfg.Server.Port = 7979
cfg.applyDefaults("")
assert.Equal(t, "http://localhost:7979", cfg.Server.Hostname)
})
t.Run("skip overwrite", func(t *testing.T) {
cfg.Server.Hostname = "https://my.host:4443"
cfg.Server.Port = 80
cfg.applyDefaults("")
assert.Equal(t, "https://my.host:4443", cfg.Server.Hostname)
})
}
func TestDefaultDatabasePath(t *testing.T) {
cfg := Config{}
cfg.applyDefaults("/home/user/podsync/config.toml")
assert.Equal(t, "/home/user/podsync/db", cfg.Database.Dir)
}
func TestLoadBadgerConfig(t *testing.T) {
const file = `
[server]
data_dir = "/data"
[feeds]
[feeds.A]
url = "https://youtube.com/watch?v=ygIUF678y40"
[database]
badger = { truncate = true, file_io = true }
`
path := setup(t, file)
defer os.Remove(path)
config, err := LoadConfig(path)
assert.NoError(t, err)
require.NotNil(t, config)
require.NotNil(t, config.Database.Badger)
assert.True(t, config.Database.Badger.Truncate)
assert.True(t, config.Database.Badger.FileIO)
}
func setup(t *testing.T, file string) string {
t.Helper()
f, err := ioutil.TempFile("", "")
require.NoError(t, err)
defer f.Close()
_, err = f.WriteString(file)
require.NoError(t, err)
return f.Name()
}