github.com/kevinklinger/open_terraform@v1.3.6/noninternal/command/output_test.go (about)

     1  package command
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/zclconf/go-cty/cty"
    10  
    11  	"github.com/kevinklinger/open_terraform/noninternal/addrs"
    12  	"github.com/kevinklinger/open_terraform/noninternal/states"
    13  )
    14  
    15  func TestOutput(t *testing.T) {
    16  	originalState := states.BuildState(func(s *states.SyncState) {
    17  		s.SetOutputValue(
    18  			addrs.OutputValue{Name: "foo"}.Absolute(addrs.RootModuleInstance),
    19  			cty.StringVal("bar"),
    20  			false,
    21  		)
    22  	})
    23  
    24  	statePath := testStateFile(t, originalState)
    25  
    26  	view, done := testView(t)
    27  	c := &OutputCommand{
    28  		Meta: Meta{
    29  			testingOverrides: metaOverridesForProvider(testProvider()),
    30  			View:             view,
    31  		},
    32  	}
    33  
    34  	args := []string{
    35  		"-state", statePath,
    36  		"foo",
    37  	}
    38  	code := c.Run(args)
    39  	output := done(t)
    40  	if code != 0 {
    41  		t.Fatalf("bad: \n%s", output.Stderr())
    42  	}
    43  
    44  	actual := strings.TrimSpace(output.Stdout())
    45  	if actual != `"bar"` {
    46  		t.Fatalf("bad: %#v", actual)
    47  	}
    48  }
    49  
    50  func TestOutput_json(t *testing.T) {
    51  	originalState := states.BuildState(func(s *states.SyncState) {
    52  		s.SetOutputValue(
    53  			addrs.OutputValue{Name: "foo"}.Absolute(addrs.RootModuleInstance),
    54  			cty.StringVal("bar"),
    55  			false,
    56  		)
    57  	})
    58  
    59  	statePath := testStateFile(t, originalState)
    60  
    61  	view, done := testView(t)
    62  	c := &OutputCommand{
    63  		Meta: Meta{
    64  			testingOverrides: metaOverridesForProvider(testProvider()),
    65  			View:             view,
    66  		},
    67  	}
    68  
    69  	args := []string{
    70  		"-state", statePath,
    71  		"-json",
    72  	}
    73  	code := c.Run(args)
    74  	output := done(t)
    75  	if code != 0 {
    76  		t.Fatalf("bad: \n%s", output.Stderr())
    77  	}
    78  
    79  	actual := strings.TrimSpace(output.Stdout())
    80  	expected := "{\n  \"foo\": {\n    \"sensitive\": false,\n    \"type\": \"string\",\n    \"value\": \"bar\"\n  }\n}"
    81  	if actual != expected {
    82  		t.Fatalf("wrong output\ngot:  %#v\nwant: %#v", actual, expected)
    83  	}
    84  }
    85  
    86  func TestOutput_emptyOutputs(t *testing.T) {
    87  	originalState := states.NewState()
    88  	statePath := testStateFile(t, originalState)
    89  
    90  	p := testProvider()
    91  	view, done := testView(t)
    92  	c := &OutputCommand{
    93  		Meta: Meta{
    94  			testingOverrides: metaOverridesForProvider(p),
    95  			View:             view,
    96  		},
    97  	}
    98  
    99  	args := []string{
   100  		"-no-color",
   101  		"-state", statePath,
   102  	}
   103  	code := c.Run(args)
   104  	output := done(t)
   105  	if code != 0 {
   106  		t.Fatalf("bad: \n%s", output.Stderr())
   107  	}
   108  	// Warning diagnostics should go to stdout
   109  	if got, want := output.Stdout(), "Warning: No outputs found"; !strings.Contains(got, want) {
   110  		t.Fatalf("bad output: expected to contain %q, got:\n%s", want, got)
   111  	}
   112  }
   113  
   114  func TestOutput_badVar(t *testing.T) {
   115  	originalState := states.BuildState(func(s *states.SyncState) {
   116  		s.SetOutputValue(
   117  			addrs.OutputValue{Name: "foo"}.Absolute(addrs.RootModuleInstance),
   118  			cty.StringVal("bar"),
   119  			false,
   120  		)
   121  	})
   122  	statePath := testStateFile(t, originalState)
   123  
   124  	view, done := testView(t)
   125  	c := &OutputCommand{
   126  		Meta: Meta{
   127  			testingOverrides: metaOverridesForProvider(testProvider()),
   128  			View:             view,
   129  		},
   130  	}
   131  
   132  	args := []string{
   133  		"-state", statePath,
   134  		"bar",
   135  	}
   136  	code := c.Run(args)
   137  	output := done(t)
   138  	if code != 1 {
   139  		t.Fatalf("bad: \n%s", output.Stderr())
   140  	}
   141  }
   142  
   143  func TestOutput_blank(t *testing.T) {
   144  	originalState := states.BuildState(func(s *states.SyncState) {
   145  		s.SetOutputValue(
   146  			addrs.OutputValue{Name: "foo"}.Absolute(addrs.RootModuleInstance),
   147  			cty.StringVal("bar"),
   148  			false,
   149  		)
   150  		s.SetOutputValue(
   151  			addrs.OutputValue{Name: "name"}.Absolute(addrs.RootModuleInstance),
   152  			cty.StringVal("john-doe"),
   153  			false,
   154  		)
   155  	})
   156  	statePath := testStateFile(t, originalState)
   157  
   158  	view, done := testView(t)
   159  	c := &OutputCommand{
   160  		Meta: Meta{
   161  			testingOverrides: metaOverridesForProvider(testProvider()),
   162  			View:             view,
   163  		},
   164  	}
   165  
   166  	args := []string{
   167  		"-state", statePath,
   168  		"",
   169  	}
   170  
   171  	code := c.Run(args)
   172  	output := done(t)
   173  	if code != 0 {
   174  		t.Fatalf("bad: \n%s", output.Stderr())
   175  	}
   176  
   177  	expectedOutput := "foo = \"bar\"\nname = \"john-doe\"\n"
   178  	if got := output.Stdout(); got != expectedOutput {
   179  		t.Fatalf("wrong output\ngot:  %#v\nwant: %#v", got, expectedOutput)
   180  	}
   181  }
   182  
   183  func TestOutput_manyArgs(t *testing.T) {
   184  	view, done := testView(t)
   185  	c := &OutputCommand{
   186  		Meta: Meta{
   187  			testingOverrides: metaOverridesForProvider(testProvider()),
   188  			View:             view,
   189  		},
   190  	}
   191  
   192  	args := []string{
   193  		"bad",
   194  		"bad",
   195  	}
   196  	code := c.Run(args)
   197  	output := done(t)
   198  	if code != 1 {
   199  		t.Fatalf("bad: \n%s", output.Stdout())
   200  	}
   201  }
   202  
   203  func TestOutput_noArgs(t *testing.T) {
   204  	view, done := testView(t)
   205  	c := &OutputCommand{
   206  		Meta: Meta{
   207  			testingOverrides: metaOverridesForProvider(testProvider()),
   208  			View:             view,
   209  		},
   210  	}
   211  
   212  	args := []string{}
   213  	code := c.Run(args)
   214  	output := done(t)
   215  	if code != 0 {
   216  		t.Fatalf("bad: \n%s", output.Stdout())
   217  	}
   218  }
   219  
   220  func TestOutput_noState(t *testing.T) {
   221  	originalState := states.NewState()
   222  	statePath := testStateFile(t, originalState)
   223  
   224  	view, done := testView(t)
   225  	c := &OutputCommand{
   226  		Meta: Meta{
   227  			testingOverrides: metaOverridesForProvider(testProvider()),
   228  			View:             view,
   229  		},
   230  	}
   231  
   232  	args := []string{
   233  		"-state", statePath,
   234  		"foo",
   235  	}
   236  	code := c.Run(args)
   237  	output := done(t)
   238  	if code != 0 {
   239  		t.Fatalf("bad: \n%s", output.Stderr())
   240  	}
   241  }
   242  
   243  func TestOutput_noVars(t *testing.T) {
   244  	originalState := states.NewState()
   245  
   246  	statePath := testStateFile(t, originalState)
   247  
   248  	view, done := testView(t)
   249  	c := &OutputCommand{
   250  		Meta: Meta{
   251  			testingOverrides: metaOverridesForProvider(testProvider()),
   252  			View:             view,
   253  		},
   254  	}
   255  
   256  	args := []string{
   257  		"-state", statePath,
   258  		"bar",
   259  	}
   260  	code := c.Run(args)
   261  	output := done(t)
   262  	if code != 0 {
   263  		t.Fatalf("bad: \n%s", output.Stderr())
   264  	}
   265  }
   266  
   267  func TestOutput_stateDefault(t *testing.T) {
   268  	originalState := states.BuildState(func(s *states.SyncState) {
   269  		s.SetOutputValue(
   270  			addrs.OutputValue{Name: "foo"}.Absolute(addrs.RootModuleInstance),
   271  			cty.StringVal("bar"),
   272  			false,
   273  		)
   274  	})
   275  
   276  	// Write the state file in a temporary directory with the
   277  	// default filename.
   278  	td := testTempDir(t)
   279  	statePath := filepath.Join(td, DefaultStateFilename)
   280  
   281  	f, err := os.Create(statePath)
   282  	if err != nil {
   283  		t.Fatalf("err: %s", err)
   284  	}
   285  	err = writeStateForTesting(originalState, f)
   286  	f.Close()
   287  	if err != nil {
   288  		t.Fatalf("err: %s", err)
   289  	}
   290  
   291  	// Change to that directory
   292  	cwd, err := os.Getwd()
   293  	if err != nil {
   294  		t.Fatalf("err: %s", err)
   295  	}
   296  	if err := os.Chdir(filepath.Dir(statePath)); err != nil {
   297  		t.Fatalf("err: %s", err)
   298  	}
   299  	defer os.Chdir(cwd)
   300  
   301  	view, done := testView(t)
   302  	c := &OutputCommand{
   303  		Meta: Meta{
   304  			testingOverrides: metaOverridesForProvider(testProvider()),
   305  			View:             view,
   306  		},
   307  	}
   308  
   309  	args := []string{
   310  		"foo",
   311  	}
   312  	code := c.Run(args)
   313  	output := done(t)
   314  	if code != 0 {
   315  		t.Fatalf("bad: \n%s", output.Stderr())
   316  	}
   317  
   318  	actual := strings.TrimSpace(output.Stdout())
   319  	if actual != `"bar"` {
   320  		t.Fatalf("bad: %#v", actual)
   321  	}
   322  }