* Add packer fmt command This change adds a new command that allows users to format one or more HCL2 Packer configuration template files. Related to: #9174 * command/fmt: Add check flag Packer's fmt command now supports a check flag that will output the name of any file that would be changed by the HCL2 formatting engine. The check flag is mutually exclusive with the write flag and will only check if formatting is needed. The update write flag will now overwrite the source files with the newly formatted HCL2 source unless the `-write=false` or `-check` is passed at the command line. * Returns a diagnostic error if Format is unable to show a diff - equivalent to `terraform fmt` * Updates testing to run against #Format and not the private methods of the HCL2Formatter; fixes ShowDiff test failure on Windows * Updates comments for exported functions * Add docs for fmt command
111 lines
2.6 KiB
Go
111 lines
2.6 KiB
Go
package hcl2template
|
|
|
|
import (
|
|
"bytes"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
)
|
|
|
|
func TestHCL2Formatter_Format(t *testing.T) {
|
|
tt := []struct {
|
|
Name string
|
|
Path string
|
|
FormatExpected bool
|
|
}{
|
|
{Name: "Unformatted file", Path: "testdata/format/unformatted.pkr.hcl", FormatExpected: true},
|
|
{Name: "Formatted file", Path: "testdata/format/formatted.pkr.hcl"},
|
|
{Name: "Directory", Path: "testdata/format", FormatExpected: true},
|
|
}
|
|
|
|
for _, tc := range tt {
|
|
tc := tc
|
|
var buf bytes.Buffer
|
|
f := NewHCL2Formatter()
|
|
f.Output = &buf
|
|
_, diags := f.Format(tc.Path)
|
|
if diags.HasErrors() {
|
|
t.Fatalf("the call to Format failed unexpectedly %s", diags.Error())
|
|
}
|
|
|
|
if buf.String() != "" && tc.FormatExpected == false {
|
|
t.Errorf("Format(%q) should contain the name of the formatted file(s), but got %q", tc.Path, buf.String())
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
func TestHCL2Formatter_Format_Write(t *testing.T) {
|
|
|
|
var buf bytes.Buffer
|
|
f := NewHCL2Formatter()
|
|
f.Output = &buf
|
|
f.Write = true
|
|
|
|
unformattedData, err := ioutil.ReadFile("testdata/format/unformatted.pkr.hcl")
|
|
if err != nil {
|
|
t.Fatalf("failed to open the unformatted fixture %s", err)
|
|
}
|
|
|
|
tf, err := ioutil.TempFile("", "*.pkr.hcl")
|
|
if err != nil {
|
|
t.Fatalf("failed to create tempfile for test %s", err)
|
|
}
|
|
defer os.Remove(tf.Name())
|
|
|
|
_, _ = tf.Write(unformattedData)
|
|
tf.Close()
|
|
|
|
_, diags := f.Format(tf.Name())
|
|
if diags.HasErrors() {
|
|
t.Fatalf("the call to Format failed unexpectedly %s", diags.Error())
|
|
}
|
|
|
|
//lets re-read the tempfile which should now be formatted
|
|
data, err := ioutil.ReadFile(tf.Name())
|
|
if err != nil {
|
|
t.Fatalf("failed to open the newly formatted fixture %s", err)
|
|
}
|
|
|
|
formattedData, err := ioutil.ReadFile("testdata/format/formatted.pkr.hcl")
|
|
if err != nil {
|
|
t.Fatalf("failed to open the formatted fixture %s", err)
|
|
}
|
|
|
|
if diff := cmp.Diff(string(data), string(formattedData)); diff != "" {
|
|
t.Errorf("Unexpected format output %s", diff)
|
|
}
|
|
}
|
|
|
|
func TestHCL2Formatter_Format_ShowDiff(t *testing.T) {
|
|
|
|
if _, err := exec.LookPath("diff"); err != nil {
|
|
t.Skip("Skipping test because diff is not in the executable PATH")
|
|
}
|
|
|
|
var buf bytes.Buffer
|
|
f := HCL2Formatter{
|
|
Output: &buf,
|
|
ShowDiff: true,
|
|
}
|
|
|
|
_, diags := f.Format("testdata/format/unformatted.pkr.hcl")
|
|
if diags.HasErrors() {
|
|
t.Fatalf("the call to Format failed unexpectedly %s", diags.Error())
|
|
}
|
|
|
|
diffHeader := `
|
|
--- old/testdata/format/unformatted.pkr.hcl
|
|
+++ new/testdata/format/unformatted.pkr.hcl
|
|
@@ -1,149 +1,149 @@
|
|
`
|
|
if !strings.Contains(buf.String(), diffHeader) {
|
|
t.Errorf("expected buf to contain a file diff, but instead we got %s", buf.String())
|
|
}
|
|
|
|
}
|