package command import ( "fmt" "path/filepath" "testing" "github.com/google/go-cmp/cmp" ) func Test_commands(t *testing.T) { tc := []struct { command []string env []string expected string }{ {[]string{"inspect", filepath.Join(testFixture("var-arg"), "fruit_builder.pkr.hcl")}, nil, `Packer Inspect: HCL2 mode > input-variables: var.fruit: "" > local-variables: local.fruit: "" > builds: > : sources: null.builder provisioners: shell-local post-processors: `}, {[]string{"inspect", "-var=fruit=banana", filepath.Join(testFixture("var-arg"), "fruit_builder.pkr.hcl")}, nil, `Packer Inspect: HCL2 mode > input-variables: var.fruit: "banana" > local-variables: local.fruit: "banana" > builds: > : sources: null.builder provisioners: shell-local post-processors: `}, {[]string{"inspect", "-var=fruit=peach", "-var=unknown_string=also_peach", `-var=unknown_unknown=["peach_too"]`, `-var=unknown_list_of_string=["first_peach", "second_peach"]`, filepath.Join(testFixture("hcl"), "inspect", "fruit_string.pkr.hcl")}, nil, `Packer Inspect: HCL2 mode > input-variables: var.default_from_env: "" var.fruit: "peach" var.other_default_from_env: "" var.unknown_list_of_string: "[\n \"first_peach\",\n \"second_peach\",\n]" var.unknown_string: "also_peach" var.unknown_unknown: "[\"peach_too\"]" > local-variables: > builds: `}, {[]string{"inspect", "-var=fruit=peach", "-var=other_default_from_env=apple", filepath.Join(testFixture("hcl"), "inspect")}, []string{"DEFAULT_FROM_ENV=cherry"}, `Packer Inspect: HCL2 mode > input-variables: var.default_from_env: "cherry" var.fruit: "peach" var.other_default_from_env: "apple" var.unknown_list_of_string: "" var.unknown_string: "" var.unknown_unknown: "" > local-variables: > builds: > aws_example_builder: > Description: The builder of clouds !! Use it at will. sources: amazon-ebs.example-1 amazon-ebs.example-2 provisioners: shell post-processors: 0: manifest 1: shell-local 2: manifest shell-local `}, {[]string{"inspect", filepath.Join(testFixture("inspect"), "unset_var.json")}, nil, `Packer Inspect: JSON mode Required variables: something Optional variables and their defaults: Builders: Provisioners: Note: If your build names contain user variables or template functions such as 'timestamp', these are processed at build time, and therefore only show in their raw form here. `}, { []string{ "inspect", filepath.Join(testFixture("hcl-inspect-with-sensitive-vars")), }, nil, testFixtureContent("hcl-inspect-with-sensitive-vars", "expected-output.txt"), }, } for _, tc := range tc { t.Run(fmt.Sprintf("packer %s", tc.command), func(t *testing.T) { p := helperCommand(t, tc.command...) p.Env = append(p.Env, tc.env...) bs, err := p.Output() if err != nil { t.Fatalf("%v: %s", err, bs) } actual := string(bs) if diff := cmp.Diff(tc.expected, actual); diff != "" { t.Fatalf("unexpected ouput %s", diff) } }) } }