mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 18:01:01 -06:00
176a5abfd3
This possibility was lost in the rewrite to use HCL2, but it's used by a number of external utilities and text editor integrations, so we'll restore it here. Using the stdin/stdout mode is generally preferable for text editor use since it allows formatting of the in-memory buffer rather than directly the file on disk, but for editors that don't have support for that sort of tooling it can be convenient to just launch a single command and directly modify the on-disk file.
300 lines
6.4 KiB
Go
300 lines
6.4 KiB
Go
package command
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/mitchellh/cli"
|
|
)
|
|
|
|
func TestFmt_nonexist(t *testing.T) {
|
|
tempDir := fmtFixtureWriteDir(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
missingDir := filepath.Join(tempDir, "doesnotexist")
|
|
args := []string{missingDir}
|
|
if code := c.Run(args); code != 2 {
|
|
t.Fatalf("wrong exit code. errors: \n%s", ui.ErrorWriter.String())
|
|
}
|
|
|
|
expected := "No file or directory at"
|
|
if actual := ui.ErrorWriter.String(); !strings.Contains(actual, expected) {
|
|
t.Fatalf("expected:\n%s\n\nto include: %q", actual, expected)
|
|
}
|
|
}
|
|
|
|
func TestFmt_syntaxError(t *testing.T) {
|
|
tempDir := testTempDir(t)
|
|
|
|
invalidSrc := `
|
|
a = 1 +
|
|
`
|
|
|
|
err := ioutil.WriteFile(filepath.Join(tempDir, "invalid.tf"), []byte(invalidSrc), 0644)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{tempDir}
|
|
if code := c.Run(args); code != 2 {
|
|
t.Fatalf("wrong exit code. errors: \n%s", ui.ErrorWriter.String())
|
|
}
|
|
|
|
expected := "Invalid expression"
|
|
if actual := ui.ErrorWriter.String(); !strings.Contains(actual, expected) {
|
|
t.Fatalf("expected:\n%s\n\nto include: %q", actual, expected)
|
|
}
|
|
}
|
|
|
|
func TestFmt_tooManyArgs(t *testing.T) {
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{
|
|
"one",
|
|
"two",
|
|
}
|
|
if code := c.Run(args); code != 1 {
|
|
t.Fatalf("wrong exit code. errors: \n%s", ui.ErrorWriter.String())
|
|
}
|
|
|
|
expected := "The fmt command expects at most one argument."
|
|
if actual := ui.ErrorWriter.String(); !strings.Contains(actual, expected) {
|
|
t.Fatalf("expected:\n%s\n\nto include: %q", actual, expected)
|
|
}
|
|
}
|
|
|
|
func TestFmt_workingDirectory(t *testing.T) {
|
|
tempDir := fmtFixtureWriteDir(t)
|
|
|
|
cwd, err := os.Getwd()
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
err = os.Chdir(tempDir)
|
|
if err != nil {
|
|
t.Fatalf("err: %s", err)
|
|
}
|
|
defer os.Chdir(cwd)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("wrong exit code. errors: \n%s", ui.ErrorWriter.String())
|
|
}
|
|
|
|
expected := fmt.Sprintf("%s\n", fmtFixture.filename)
|
|
if actual := ui.OutputWriter.String(); actual != expected {
|
|
t.Fatalf("got: %q\nexpected: %q", actual, expected)
|
|
}
|
|
}
|
|
|
|
func TestFmt_directoryArg(t *testing.T) {
|
|
tempDir := fmtFixtureWriteDir(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{tempDir}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("wrong exit code. errors: \n%s", ui.ErrorWriter.String())
|
|
}
|
|
|
|
got, err := filepath.Abs(strings.TrimSpace(ui.OutputWriter.String()))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
want := filepath.Join(tempDir, fmtFixture.filename)
|
|
|
|
if got != want {
|
|
t.Fatalf("wrong output\ngot: %s\nwant: %s", got, want)
|
|
}
|
|
}
|
|
|
|
func TestFmt_fileArg(t *testing.T) {
|
|
tempDir := fmtFixtureWriteDir(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{filepath.Join(tempDir, fmtFixture.filename)}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("wrong exit code. errors: \n%s", ui.ErrorWriter.String())
|
|
}
|
|
|
|
got, err := filepath.Abs(strings.TrimSpace(ui.OutputWriter.String()))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
want := filepath.Join(tempDir, fmtFixture.filename)
|
|
|
|
if got != want {
|
|
t.Fatalf("wrong output\ngot: %s\nwant: %s", got, want)
|
|
}
|
|
}
|
|
|
|
func TestFmt_stdinArg(t *testing.T) {
|
|
input := new(bytes.Buffer)
|
|
input.Write(fmtFixture.input)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
input: input,
|
|
}
|
|
|
|
args := []string{"-"}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("wrong exit code. errors: \n%s", ui.ErrorWriter.String())
|
|
}
|
|
|
|
expected := fmtFixture.golden
|
|
if actual := ui.OutputWriter.Bytes(); !bytes.Equal(actual, expected) {
|
|
t.Fatalf("got: %q\nexpected: %q", actual, expected)
|
|
}
|
|
}
|
|
|
|
func TestFmt_nonDefaultOptions(t *testing.T) {
|
|
tempDir := fmtFixtureWriteDir(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{
|
|
"-list=false",
|
|
"-write=false",
|
|
"-diff",
|
|
tempDir,
|
|
}
|
|
if code := c.Run(args); code != 0 {
|
|
t.Fatalf("wrong exit code. errors: \n%s", ui.ErrorWriter.String())
|
|
}
|
|
|
|
expected := fmt.Sprintf("-%s+%s", fmtFixture.input, fmtFixture.golden)
|
|
if actual := ui.OutputWriter.String(); !strings.Contains(actual, expected) {
|
|
t.Fatalf("expected:\n%s\n\nto include: %q", actual, expected)
|
|
}
|
|
}
|
|
|
|
func TestFmt_check(t *testing.T) {
|
|
tempDir := fmtFixtureWriteDir(t)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
}
|
|
|
|
args := []string{
|
|
"-check",
|
|
tempDir,
|
|
}
|
|
if code := c.Run(args); code != 3 {
|
|
t.Fatalf("wrong exit code. expected 3")
|
|
}
|
|
|
|
if actual := ui.OutputWriter.String(); !strings.Contains(actual, tempDir) {
|
|
t.Fatalf("expected:\n%s\n\nto include: %q", actual, tempDir)
|
|
}
|
|
}
|
|
|
|
func TestFmt_checkStdin(t *testing.T) {
|
|
input := new(bytes.Buffer)
|
|
input.Write(fmtFixture.input)
|
|
|
|
ui := new(cli.MockUi)
|
|
c := &FmtCommand{
|
|
Meta: Meta{
|
|
testingOverrides: metaOverridesForProvider(testProvider()),
|
|
Ui: ui,
|
|
},
|
|
input: input,
|
|
}
|
|
|
|
args := []string{
|
|
"-check",
|
|
"-",
|
|
}
|
|
if code := c.Run(args); code != 3 {
|
|
t.Fatalf("wrong exit code. expected 3, got %d", code)
|
|
}
|
|
|
|
if ui.OutputWriter != nil {
|
|
t.Fatalf("expected no output, got: %q", ui.OutputWriter.String())
|
|
}
|
|
}
|
|
|
|
var fmtFixture = struct {
|
|
filename string
|
|
input, golden []byte
|
|
}{
|
|
"main.tf",
|
|
[]byte(` foo = "bar"
|
|
`),
|
|
[]byte(`foo = "bar"
|
|
`),
|
|
}
|
|
|
|
func fmtFixtureWriteDir(t *testing.T) string {
|
|
dir := testTempDir(t)
|
|
|
|
err := ioutil.WriteFile(filepath.Join(dir, fmtFixture.filename), fmtFixture.input, 0644)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
return dir
|
|
}
|