package promptkit_test import ( "io/fs" "os" "path/filepath" "testing" "testing/fstest" "gitea.maximumdirect.net/eric/ConfigKit" "gitea.maximumdirect.net/eric/promptkit" ) type sourceDocument struct { First string `yaml:"first"` Second string `yaml:"second"` } func TestDirectoryInputsSelectsSortedFilesWithRootContext(t *testing.T) { root := t.TempDir() if err := os.Mkdir(filepath.Join(root, "nested"), 0o755); err != nil { t.Fatal(err) } for name, data := range map[string]string{ "a.yaml": "first: one\n", "nested/b.yml": "second: two\n", "nested/body.md": "message", } { if err := os.WriteFile(filepath.Join(root, name), []byte(data), 0o600); err != nil { t.Fatal(err) } } inputs, err := promptkit.DirectoryInputs(root) if err != nil || len(inputs) != 2 || inputs[0].Imports || inputs[1].Imports { t.Fatalf("directory inputs: %+v, %v", inputs, err) } assertSourceInputs(t, inputs, "message") if _, err := promptkit.DirectoryInputs(filepath.Join(root, "missing")); err == nil { t.Fatal("missing selected directory succeeded") } if empty, err := promptkit.DirectoryInputs(t.TempDir()); err != nil || len(empty) != 0 { t.Fatalf("empty directory: %+v, %v", empty, err) } } func TestFilesystemInputsSelectsEmbeddedFilesWithRootContext(t *testing.T) { files := fstest.MapFS{ "settings/a.yaml": {Data: []byte("first: one\n")}, "settings/nested/b.yml": {Data: []byte("second: two\n")}, "settings/nested/body.md": {Data: []byte("message")}, } inputs, err := promptkit.FilesystemInputs("embedded", files, "settings") if err != nil || len(inputs) != 2 || inputs[0].Imports || inputs[1].Imports { t.Fatalf("filesystem inputs: %+v, %v", inputs, err) } assertSourceInputs(t, inputs, "message") if _, err := promptkit.FilesystemInputs("embedded", files, "missing"); err == nil { t.Fatal("missing selected root succeeded") } } func assertSourceInputs(t *testing.T, inputs []configkit.Input, expected string) { t.Helper() result, err := configkit.LoadLayered(configkit.Input{Source: configkit.NoSource()}, configkit.LayeredOptions[sourceDocument]{ Underlays: []configkit.Underlay{{Inputs: inputs}}, }) if err != nil { t.Fatal(err) } if result.Config.First != "one" || result.Config.Second != "two" { t.Fatalf("configuration files did not compose: %+v", result.Config) } field, found := result.Metadata().Lookup(configkit.Keys("second")) if !found || len(field.Origin.Locations) != 1 { t.Fatalf("missing second-field origin: %+v", field) } context, found := result.SourceContext(field.Origin.Locations[0].SourceID) if !found || context.BaseDir != "nested" { t.Fatalf("unexpected rooted source context: %+v", context) } data, err := fs.ReadFile(context.FS, "nested/body.md") if err != nil || string(data) != expected { t.Fatalf("rooted resource read: %q, %v", data, err) } }