Immutable Extracts
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
||||
"errors"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"slices"
|
||||
"strings"
|
||||
"testing"
|
||||
@@ -254,6 +255,15 @@ extract:
|
||||
layout: nwn_canonical_json
|
||||
hak_discovery: configured_haks
|
||||
cleanup_stale: false
|
||||
merge:
|
||||
gff_json:
|
||||
- target: module/module.ifo.json
|
||||
preserve_fields:
|
||||
- Mod_Entry_Area
|
||||
merge_lists:
|
||||
- field: Mod_Area_list
|
||||
key_field: Area_Name
|
||||
strategy: preserve_existing_order_append_new
|
||||
topdata:
|
||||
wiki:
|
||||
source: topdata/wiki
|
||||
@@ -305,6 +315,19 @@ autogen:
|
||||
if effective.Extract.CleanupStale == nil || *effective.Extract.CleanupStale {
|
||||
t.Fatalf("expected cleanup_stale false, got %#v", effective.Extract.CleanupStale)
|
||||
}
|
||||
if got, want := len(effective.Extract.Merge.GFFJSON), 1; got != want {
|
||||
t.Fatalf("expected %d gff json merge rule, got %d", want, got)
|
||||
}
|
||||
rule := effective.Extract.Merge.GFFJSON[0]
|
||||
if got, want := rule.Target, "module/module.ifo.json"; got != want {
|
||||
t.Fatalf("expected merge target %q, got %q", want, got)
|
||||
}
|
||||
if got, want := rule.PreserveFields, []string{"Mod_Entry_Area"}; !reflect.DeepEqual(got, want) {
|
||||
t.Fatalf("expected preserve fields %#v, got %#v", want, got)
|
||||
}
|
||||
if got, want := rule.MergeLists[0].Strategy, "preserve_existing_order_append_new"; got != want {
|
||||
t.Fatalf("expected merge list strategy %q, got %q", want, got)
|
||||
}
|
||||
if got, want := effective.TopData.Wiki.DeployManifest, "wiki-manifest.json"; got != want {
|
||||
t.Fatalf("expected wiki deploy manifest %q, got %q", want, got)
|
||||
}
|
||||
@@ -346,6 +369,91 @@ autogen:
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateLayoutRejectsInvalidExtractMergeRules(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
config string
|
||||
wantErr string
|
||||
}{
|
||||
{
|
||||
name: "empty target",
|
||||
config: `
|
||||
extract:
|
||||
merge:
|
||||
gff_json:
|
||||
- target: ""
|
||||
preserve_fields: [Mod_Entry_Area]
|
||||
`,
|
||||
wantErr: "extract.merge.gff_json[0].target must not be empty",
|
||||
},
|
||||
{
|
||||
name: "duplicate target",
|
||||
config: `
|
||||
extract:
|
||||
merge:
|
||||
gff_json:
|
||||
- target: module/module.ifo.json
|
||||
- target: module/module.ifo.json
|
||||
`,
|
||||
wantErr: "extract.merge.gff_json target \"module/module.ifo.json\" is configured more than once",
|
||||
},
|
||||
{
|
||||
name: "empty merge list field",
|
||||
config: `
|
||||
extract:
|
||||
merge:
|
||||
gff_json:
|
||||
- target: module/module.ifo.json
|
||||
merge_lists:
|
||||
- field: ""
|
||||
key_field: Area_Name
|
||||
strategy: preserve_existing_order_append_new
|
||||
`,
|
||||
wantErr: "extract.merge.gff_json[0].merge_lists[0].field must not be empty",
|
||||
},
|
||||
{
|
||||
name: "unsupported strategy",
|
||||
config: `
|
||||
extract:
|
||||
merge:
|
||||
gff_json:
|
||||
- target: module/module.ifo.json
|
||||
merge_lists:
|
||||
- field: Mod_Area_list
|
||||
key_field: Area_Name
|
||||
strategy: replace
|
||||
`,
|
||||
wantErr: "extract.merge.gff_json[0].merge_lists[0].strategy \"replace\" is not supported",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
writeProjectFile(t, filepath.Join(root, ConfigFile), `
|
||||
module:
|
||||
name: Test Module
|
||||
resref: testmod
|
||||
paths:
|
||||
source: src
|
||||
build: build
|
||||
`+tt.config)
|
||||
|
||||
proj, err := Load(root)
|
||||
if err != nil {
|
||||
t.Fatalf("Load returned error: %v", err)
|
||||
}
|
||||
err = proj.ValidateLayout()
|
||||
if err == nil {
|
||||
t.Fatalf("expected validation error containing %q", tt.wantErr)
|
||||
}
|
||||
if !strings.Contains(err.Error(), tt.wantErr) {
|
||||
t.Fatalf("expected validation error containing %q, got %v", tt.wantErr, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestActiveOverridesAreVisibleAndSensitiveValuesAreMasked(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
writeProjectFile(t, filepath.Join(root, ConfigFile), `
|
||||
|
||||
Reference in New Issue
Block a user