summaryrefslogtreecommitdiff
path: root/cmd/podman/common/completion_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/common/completion_test.go')
-rw-r--r--cmd/podman/common/completion_test.go142
1 files changed, 142 insertions, 0 deletions
diff --git a/cmd/podman/common/completion_test.go b/cmd/podman/common/completion_test.go
new file mode 100644
index 000000000..5bd627b85
--- /dev/null
+++ b/cmd/podman/common/completion_test.go
@@ -0,0 +1,142 @@
+package common_test
+
+import (
+ "testing"
+
+ "github.com/containers/podman/v3/cmd/podman/common"
+ "github.com/spf13/cobra"
+ "github.com/stretchr/testify/assert"
+)
+
+type Car struct {
+ Brand string
+ Stats struct {
+ HP *int
+ Displacement int
+ }
+ Extras map[string]string
+}
+
+func (c Car) Type() string {
+ return ""
+}
+
+func (c Car) Color() string {
+ return ""
+}
+
+func TestAutocompleteFormat(t *testing.T) {
+ testStruct := struct {
+ Name string
+ Age int
+ Car *Car
+ }{}
+
+ testStruct.Car = &Car{}
+ testStruct.Car.Extras = map[string]string{"test": "1"}
+
+ tests := []struct {
+ name string
+ toComplete string
+ expected []string
+ }{
+ {
+ "empty completion",
+ "",
+ []string{"json"},
+ },
+ {
+ "json completion",
+ "json",
+ []string{"json"},
+ },
+ {
+ "invalid completion",
+ "blahblah",
+ nil,
+ },
+ {
+ "invalid completion",
+ "{{",
+ nil,
+ },
+ {
+ "invalid completion",
+ "{{ ",
+ nil,
+ },
+ {
+ "invalid completion",
+ "{{ ..",
+ nil,
+ },
+ {
+ "fist level struct field name",
+ "{{.",
+ []string{"{{.Name}}", "{{.Age}}", "{{.Car."},
+ },
+ {
+ "fist level struct field name",
+ "{{ .",
+ []string{"{{ .Name}}", "{{ .Age}}", "{{ .Car."},
+ },
+ {
+ "fist level struct field name",
+ "{{ .N",
+ []string{"{{ .Name}}"},
+ },
+ {
+ "second level struct field name",
+ "{{ .Car.",
+ []string{"{{ .Car.Brand}}", "{{ .Car.Stats.", "{{ .Car.Extras}}", "{{ .Car.Color}}", "{{ .Car.Type}}"},
+ },
+ {
+ "second level struct field name",
+ "{{ .Car.B",
+ []string{"{{ .Car.Brand}}"},
+ },
+ {
+ "three level struct field name",
+ "{{ .Car.Stats.",
+ []string{"{{ .Car.Stats.HP}}", "{{ .Car.Stats.Displacement}}"},
+ },
+ {
+ "three level struct field name",
+ "{{ .Car.Stats.D",
+ []string{"{{ .Car.Stats.Displacement}}"},
+ },
+ {
+ "second level struct field name",
+ "{{ .Car.B",
+ []string{"{{ .Car.Brand}}"},
+ },
+ {
+ "invalid field name",
+ "{{ .Ca.B",
+ nil,
+ },
+ {
+ "map key names don't work",
+ "{{ .Car.Extras.",
+ nil,
+ },
+ {
+ "two variables struct field name",
+ "{{ .Car.Brand }} {{ .Car.",
+ []string{"{{ .Car.Brand }} {{ .Car.Brand}}", "{{ .Car.Brand }} {{ .Car.Stats.", "{{ .Car.Brand }} {{ .Car.Extras}}",
+ "{{ .Car.Brand }} {{ .Car.Color}}", "{{ .Car.Brand }} {{ .Car.Type}}"},
+ },
+ {
+ "only dot without variable",
+ ".",
+ nil,
+ },
+ }
+
+ for _, test := range tests {
+ completion, directive := common.AutocompleteFormat(testStruct)(nil, nil, test.toComplete)
+ // directive should always be greater than ShellCompDirectiveNoFileComp
+ assert.GreaterOrEqual(t, directive, cobra.ShellCompDirectiveNoFileComp, "unexpected ShellCompDirective")
+ assert.Equal(t, test.expected, completion, test.name)
+ }
+}