Files
stamp/internal/config/config_test.go
Thomas fb347eaa54 Stamp
2026-03-11 20:55:31 +01:00

133 lines
2.9 KiB
Go

package config_test
import (
"os"
"path/filepath"
"testing"
"git.thokra.dev/thokra/stamp/internal/config"
)
const validTOML = `
[config]
base_branch = "main"
changeset_dir = ".stamp"
[[projects]]
name = "my-app"
path = "apps/my-app"
version = "1.2.3"
[[projects]]
name = "my-lib"
path = "libs/my-lib"
version = "0.1.0"
`
func TestLoad_Valid(t *testing.T) {
dir := t.TempDir()
if err := os.WriteFile(filepath.Join(dir, "stamp.toml"), []byte(validTOML), 0o644); err != nil {
t.Fatal(err)
}
cfg, err := config.Load(dir)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(cfg.Projects) != 2 {
t.Fatalf("expected 2 projects, got %d", len(cfg.Projects))
}
if cfg.BaseBranch() != "main" {
t.Errorf("expected base_branch=main, got %s", cfg.BaseBranch())
}
if cfg.ChangesetDir() != ".stamp" {
t.Errorf("expected changeset_dir=.stamp, got %s", cfg.ChangesetDir())
}
}
func TestLoad_Defaults(t *testing.T) {
dir := t.TempDir()
minimal := "[[projects]]\nname = \"app\"\npath = \".\"\nversion = \"1.0.0\"\n"
if err := os.WriteFile(filepath.Join(dir, "stamp.toml"), []byte(minimal), 0o644); err != nil {
t.Fatal(err)
}
cfg, err := config.Load(dir)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if cfg.BaseBranch() != "main" {
t.Errorf("default base_branch should be main, got %s", cfg.BaseBranch())
}
if cfg.ChangesetDir() != ".stamp" {
t.Errorf("default changeset_dir should be .stamp, got %s", cfg.ChangesetDir())
}
}
func TestLoad_MissingFile(t *testing.T) {
_, err := config.Load(t.TempDir())
if err == nil {
t.Fatal("expected error for missing stamp.toml")
}
}
func TestLoad_NoProjects(t *testing.T) {
dir := t.TempDir()
if err := os.WriteFile(filepath.Join(dir, "stamp.toml"), []byte("[config]\n"), 0o644); err != nil {
t.Fatal(err)
}
_, err := config.Load(dir)
if err == nil {
t.Fatal("expected error for config with no projects")
}
}
func TestLoad_DuplicateProjectName(t *testing.T) {
dir := t.TempDir()
dup := `
[[projects]]
name = "app"
path = "."
version = "1.0.0"
[[projects]]
name = "app"
path = "other"
version = "2.0.0"
`
if err := os.WriteFile(filepath.Join(dir, "stamp.toml"), []byte(dup), 0o644); err != nil {
t.Fatal(err)
}
_, err := config.Load(dir)
if err == nil {
t.Fatal("expected error for duplicate project name")
}
}
func TestFindProject(t *testing.T) {
dir := t.TempDir()
if err := os.WriteFile(filepath.Join(dir, "stamp.toml"), []byte(validTOML), 0o644); err != nil {
t.Fatal(err)
}
cfg, _ := config.Load(dir)
if p := cfg.FindProject("my-app"); p == nil {
t.Error("expected to find my-app")
}
if p := cfg.FindProject("nonexistent"); p != nil {
t.Error("expected nil for nonexistent project")
}
}
func TestPublishDefaults(t *testing.T) {
var pc config.PublishConfig
if !pc.PublishTags() {
t.Error("tags should default to true")
}
if !pc.PublishReleases() {
t.Error("releases should default to true")
}
}