Add overlay migration regression coverage

This commit is contained in:
2026-09-23 18:31:20 +00:00
parent ae91f57bbe
commit 73ce6e9e31
8 changed files with 90 additions and 137 deletions

View File

@@ -49,6 +49,12 @@ func TestExplainShowsDefaultBaseAndEffectiveOverlayValue(t *testing.T) {
explanation.Origin.Locations[0].Line != 2 {
t.Fatalf("effective explanation = %#v", explanation)
}
var rendered bytes.Buffer
if err := result.WriteExplanation(&rendered, Keys("transcription", "concurrency")); err != nil ||
!strings.Contains(rendered.String(), `layer="overlay"`) ||
!strings.Contains(rendered.String(), `label="overlays/testing.yml"`) {
t.Fatalf("rendered explanation = %v\n%s", err, rendered.String())
}
}
type explanationConfig struct {

View File

@@ -89,6 +89,18 @@ settings:
}
}
func TestLoadImportsFromProfilesDirectoryAsBaseInput(t *testing.T) {
directory := t.TempDir()
mainPath := writeImportFile(t, directory, "main.yml", "configkit: {imports: [{path: profiles/shared.yml}]}\n")
writeImportFile(t, directory, "profiles/shared.yml", "settings: {root: imported}\n")
result, err := testLoad[importTestConfig](File(mainPath), Options[importTestConfig]{Imports: true})
if err != nil || result.Config.Settings.Root != "imported" || len(result.Sources()) != 2 ||
result.Sources()[1].Layer != LayerBase {
t.Fatalf("profiles import = %#v, %v", result, err)
}
}
func TestLoadRejectsImportConflictsAndFragmentVersions(t *testing.T) {
t.Run("all duplicate claimants", func(t *testing.T) {
directory := t.TempDir()

View File

@@ -21,7 +21,7 @@ func overlayDocuments(base *composedDocument, overlay *document.Node) (*composed
if base == nil || base.root == nil || base.root.Kind != document.Mapping || overlay == nil || overlay.Kind != document.Mapping {
return nil, []Diagnostic{{
Code: CodeOverlayInvalid, Severity: SeverityError,
Message: "overlay overlay requires mapping document roots",
Message: "overlay requires mapping document roots",
}}
}
result := cloneComposedDocument(base)

View File

@@ -98,6 +98,7 @@ func TestLoadOverlaySelectionUsesOneFixedYAMLFile(t *testing.T) {
directory := t.TempDir()
mainPath := writeImportFile(t, directory, "main.yml", "settings: {kept: base}\n")
writeImportFile(t, directory, "overlays/testing.yml", "settings: {changed: selected}\n")
writeImportFile(t, directory, "profiles/testing.yml", "settings: {changed: legacy}\n")
writeImportFile(t, directory, "overlays/default.yml", "settings: {changed: forbidden}\n")
for _, name := range []string{"", "default"} {
@@ -107,10 +108,18 @@ func TestLoadOverlaySelectionUsesOneFixedYAMLFile(t *testing.T) {
}
}
selected, err := testLoad[overlayTestConfig](File(mainPath), Options[overlayTestConfig]{Overlay: "testing"})
if err != nil || selected.Config.Settings.Changed != "selected" || len(selected.Sources()) != 2 {
if err != nil || selected.Config.Settings.Changed != "selected" || len(selected.Sources()) != 2 ||
selected.Sources()[1].Label != "overlays/testing.yml" || selected.Sources()[1].Layer != LayerOverlay {
t.Fatalf("selected overlay = %#v, %v", selected, err)
}
t.Run("legacy directory is not selected", func(t *testing.T) {
legacyDirectory := t.TempDir()
legacyMain := writeImportFile(t, legacyDirectory, "main.yml", "settings: {kept: base}\n")
writeImportFile(t, legacyDirectory, "profiles/testing.yml", "settings: {changed: legacy}\n")
requireOverlayLoadCode(t, File(legacyMain), Options[overlayTestConfig]{Overlay: "testing"}, CodeOverlayMissing)
})
for _, name := range []string{"../testing", "testing.yml", "one,two", "with space", "é", "bad\x00name"} {
t.Run(name, func(t *testing.T) {
requireOverlayLoadCode(t, File(mainPath), Options[overlayTestConfig]{Overlay: name}, CodeOptionsInvalid)