github.com/mysza/terraform@v0.7.6-0.20161011024539-258005408b33/command/output_test.go (about)

     1  package command
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/hashicorp/terraform/terraform"
    11  	"github.com/mitchellh/cli"
    12  )
    13  
    14  func TestOutput(t *testing.T) {
    15  	originalState := &terraform.State{
    16  		Modules: []*terraform.ModuleState{
    17  			{
    18  				Path: []string{"root"},
    19  				Outputs: map[string]*terraform.OutputState{
    20  					"foo": {
    21  						Value: "bar",
    22  						Type:  "string",
    23  					},
    24  				},
    25  			},
    26  		},
    27  	}
    28  
    29  	statePath := testStateFile(t, originalState)
    30  
    31  	ui := new(cli.MockUi)
    32  	c := &OutputCommand{
    33  		Meta: Meta{
    34  			ContextOpts: testCtxConfig(testProvider()),
    35  			Ui:          ui,
    36  		},
    37  	}
    38  
    39  	args := []string{
    40  		"-state", statePath,
    41  		"foo",
    42  	}
    43  	if code := c.Run(args); code != 0 {
    44  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
    45  	}
    46  
    47  	actual := strings.TrimSpace(ui.OutputWriter.String())
    48  	if actual != "bar" {
    49  		t.Fatalf("bad: %#v", actual)
    50  	}
    51  }
    52  
    53  func TestModuleOutput(t *testing.T) {
    54  	originalState := &terraform.State{
    55  		Modules: []*terraform.ModuleState{
    56  			{
    57  				Path: []string{"root"},
    58  				Outputs: map[string]*terraform.OutputState{
    59  					"foo": {
    60  						Value: "bar",
    61  						Type:  "string",
    62  					},
    63  				},
    64  			},
    65  			{
    66  				Path: []string{"root", "my_module"},
    67  				Outputs: map[string]*terraform.OutputState{
    68  					"blah": {
    69  						Value: "tastatur",
    70  						Type:  "string",
    71  					},
    72  				},
    73  			},
    74  		},
    75  	}
    76  
    77  	statePath := testStateFile(t, originalState)
    78  
    79  	ui := new(cli.MockUi)
    80  	c := &OutputCommand{
    81  		Meta: Meta{
    82  			ContextOpts: testCtxConfig(testProvider()),
    83  			Ui:          ui,
    84  		},
    85  	}
    86  
    87  	args := []string{
    88  		"-state", statePath,
    89  		"-module", "my_module",
    90  		"blah",
    91  	}
    92  
    93  	if code := c.Run(args); code != 0 {
    94  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
    95  	}
    96  
    97  	actual := strings.TrimSpace(ui.OutputWriter.String())
    98  	if actual != "tastatur" {
    99  		t.Fatalf("bad: %#v", actual)
   100  	}
   101  }
   102  
   103  func TestModuleOutputs(t *testing.T) {
   104  	originalState := &terraform.State{
   105  		Modules: []*terraform.ModuleState{
   106  			{
   107  				Path: []string{"root"},
   108  				Outputs: map[string]*terraform.OutputState{
   109  					"foo": {
   110  						Value: "bar",
   111  						Type:  "string",
   112  					},
   113  				},
   114  			},
   115  			{
   116  				Path: []string{"root", "my_module"},
   117  				Outputs: map[string]*terraform.OutputState{
   118  					"blah": {
   119  						Value: "tastatur",
   120  						Type:  "string",
   121  					},
   122  				},
   123  			},
   124  		},
   125  	}
   126  
   127  	statePath := testStateFile(t, originalState)
   128  
   129  	ui := new(cli.MockUi)
   130  	c := &OutputCommand{
   131  		Meta: Meta{
   132  			ContextOpts: testCtxConfig(testProvider()),
   133  			Ui:          ui,
   134  		},
   135  	}
   136  
   137  	args := []string{
   138  		"-state", statePath,
   139  		"-module", "my_module",
   140  	}
   141  
   142  	if code := c.Run(args); code != 0 {
   143  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   144  	}
   145  
   146  	actual := strings.TrimSpace(ui.OutputWriter.String())
   147  	if actual != "blah = tastatur" {
   148  		t.Fatalf("bad: %#v", actual)
   149  	}
   150  }
   151  
   152  func TestOutput_nestedListAndMap(t *testing.T) {
   153  	originalState := &terraform.State{
   154  		Modules: []*terraform.ModuleState{
   155  			{
   156  				Path: []string{"root"},
   157  				Outputs: map[string]*terraform.OutputState{
   158  					"foo": {
   159  						Value: []interface{}{
   160  							map[string]interface{}{
   161  								"key":  "value",
   162  								"key2": "value2",
   163  							},
   164  							map[string]interface{}{
   165  								"key": "value",
   166  							},
   167  						},
   168  						Type: "list",
   169  					},
   170  				},
   171  			},
   172  		},
   173  	}
   174  
   175  	statePath := testStateFile(t, originalState)
   176  
   177  	ui := new(cli.MockUi)
   178  	c := &OutputCommand{
   179  		Meta: Meta{
   180  			ContextOpts: testCtxConfig(testProvider()),
   181  			Ui:          ui,
   182  		},
   183  	}
   184  
   185  	args := []string{
   186  		"-state", statePath,
   187  	}
   188  	if code := c.Run(args); code != 0 {
   189  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   190  	}
   191  
   192  	actual := strings.TrimSpace(ui.OutputWriter.String())
   193  	expected := "foo = [\n    {\n        key = value,\n        key2 = value2\n    },\n    {\n        key = value\n    }\n]"
   194  	if actual != expected {
   195  		t.Fatalf("bad:\n%#v\n%#v", expected, actual)
   196  	}
   197  }
   198  
   199  func TestOutput_json(t *testing.T) {
   200  	originalState := &terraform.State{
   201  		Modules: []*terraform.ModuleState{
   202  			{
   203  				Path: []string{"root"},
   204  				Outputs: map[string]*terraform.OutputState{
   205  					"foo": {
   206  						Value: "bar",
   207  						Type:  "string",
   208  					},
   209  				},
   210  			},
   211  		},
   212  	}
   213  
   214  	statePath := testStateFile(t, originalState)
   215  
   216  	ui := new(cli.MockUi)
   217  	c := &OutputCommand{
   218  		Meta: Meta{
   219  			ContextOpts: testCtxConfig(testProvider()),
   220  			Ui:          ui,
   221  		},
   222  	}
   223  
   224  	args := []string{
   225  		"-state", statePath,
   226  		"-json",
   227  	}
   228  	if code := c.Run(args); code != 0 {
   229  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   230  	}
   231  
   232  	actual := strings.TrimSpace(ui.OutputWriter.String())
   233  	expected := "{\n    \"foo\": {\n        \"sensitive\": false,\n        \"type\": \"string\",\n        \"value\": \"bar\"\n    }\n}"
   234  	if actual != expected {
   235  		t.Fatalf("bad:\n%#v\n%#v", expected, actual)
   236  	}
   237  }
   238  
   239  func TestMissingModuleOutput(t *testing.T) {
   240  	originalState := &terraform.State{
   241  		Modules: []*terraform.ModuleState{
   242  			{
   243  				Path: []string{"root"},
   244  				Outputs: map[string]*terraform.OutputState{
   245  					"foo": {
   246  						Value: "bar",
   247  						Type:  "string",
   248  					},
   249  				},
   250  			},
   251  		},
   252  	}
   253  
   254  	statePath := testStateFile(t, originalState)
   255  
   256  	ui := new(cli.MockUi)
   257  	c := &OutputCommand{
   258  		Meta: Meta{
   259  			ContextOpts: testCtxConfig(testProvider()),
   260  			Ui:          ui,
   261  		},
   262  	}
   263  
   264  	args := []string{
   265  		"-state", statePath,
   266  		"-module", "not_existing_module",
   267  		"blah",
   268  	}
   269  
   270  	if code := c.Run(args); code != 1 {
   271  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   272  	}
   273  }
   274  
   275  func TestOutput_badVar(t *testing.T) {
   276  	originalState := &terraform.State{
   277  		Modules: []*terraform.ModuleState{
   278  			{
   279  				Path: []string{"root"},
   280  				Outputs: map[string]*terraform.OutputState{
   281  					"foo": {
   282  						Value: "bar",
   283  						Type:  "string",
   284  					},
   285  				},
   286  			},
   287  		},
   288  	}
   289  
   290  	statePath := testStateFile(t, originalState)
   291  
   292  	ui := new(cli.MockUi)
   293  	c := &OutputCommand{
   294  		Meta: Meta{
   295  			ContextOpts: testCtxConfig(testProvider()),
   296  			Ui:          ui,
   297  		},
   298  	}
   299  
   300  	args := []string{
   301  		"-state", statePath,
   302  		"bar",
   303  	}
   304  	if code := c.Run(args); code != 1 {
   305  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   306  	}
   307  }
   308  
   309  func TestOutput_blank(t *testing.T) {
   310  	originalState := &terraform.State{
   311  		Modules: []*terraform.ModuleState{
   312  			{
   313  				Path: []string{"root"},
   314  				Outputs: map[string]*terraform.OutputState{
   315  					"foo": {
   316  						Value: "bar",
   317  						Type:  "string",
   318  					},
   319  					"name": {
   320  						Value: "john-doe",
   321  						Type:  "string",
   322  					},
   323  				},
   324  			},
   325  		},
   326  	}
   327  
   328  	statePath := testStateFile(t, originalState)
   329  
   330  	ui := new(cli.MockUi)
   331  	c := &OutputCommand{
   332  		Meta: Meta{
   333  			ContextOpts: testCtxConfig(testProvider()),
   334  			Ui:          ui,
   335  		},
   336  	}
   337  
   338  	args := []string{
   339  		"-state", statePath,
   340  		"",
   341  	}
   342  
   343  	if code := c.Run(args); code != 0 {
   344  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   345  	}
   346  
   347  	expectedOutput := "foo = bar\nname = john-doe\n"
   348  	output := ui.OutputWriter.String()
   349  	if output != expectedOutput {
   350  		t.Fatalf("Expected output: %#v\ngiven: %#v", expectedOutput, output)
   351  	}
   352  }
   353  
   354  func TestOutput_manyArgs(t *testing.T) {
   355  	ui := new(cli.MockUi)
   356  	c := &OutputCommand{
   357  		Meta: Meta{
   358  			ContextOpts: testCtxConfig(testProvider()),
   359  			Ui:          ui,
   360  		},
   361  	}
   362  
   363  	args := []string{
   364  		"bad",
   365  		"bad",
   366  	}
   367  	if code := c.Run(args); code != 1 {
   368  		t.Fatalf("bad: \n%s", ui.OutputWriter.String())
   369  	}
   370  }
   371  
   372  func TestOutput_noArgs(t *testing.T) {
   373  	ui := new(cli.MockUi)
   374  	c := &OutputCommand{
   375  		Meta: Meta{
   376  			ContextOpts: testCtxConfig(testProvider()),
   377  			Ui:          ui,
   378  		},
   379  	}
   380  
   381  	args := []string{}
   382  	if code := c.Run(args); code != 1 {
   383  		t.Fatalf("bad: \n%s", ui.OutputWriter.String())
   384  	}
   385  }
   386  
   387  func TestOutput_noState(t *testing.T) {
   388  	originalState := &terraform.State{}
   389  	statePath := testStateFile(t, originalState)
   390  
   391  	ui := new(cli.MockUi)
   392  	c := &OutputCommand{
   393  		Meta: Meta{
   394  			ContextOpts: testCtxConfig(testProvider()),
   395  			Ui:          ui,
   396  		},
   397  	}
   398  
   399  	args := []string{
   400  		"-state", statePath,
   401  		"foo",
   402  	}
   403  	if code := c.Run(args); code != 1 {
   404  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   405  	}
   406  }
   407  
   408  func TestOutput_noVars(t *testing.T) {
   409  	originalState := &terraform.State{
   410  		Modules: []*terraform.ModuleState{
   411  			{
   412  				Path:    []string{"root"},
   413  				Outputs: map[string]*terraform.OutputState{},
   414  			},
   415  		},
   416  	}
   417  
   418  	statePath := testStateFile(t, originalState)
   419  
   420  	ui := new(cli.MockUi)
   421  	c := &OutputCommand{
   422  		Meta: Meta{
   423  			ContextOpts: testCtxConfig(testProvider()),
   424  			Ui:          ui,
   425  		},
   426  	}
   427  
   428  	args := []string{
   429  		"-state", statePath,
   430  		"bar",
   431  	}
   432  	if code := c.Run(args); code != 1 {
   433  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   434  	}
   435  }
   436  
   437  func TestOutput_stateDefault(t *testing.T) {
   438  	originalState := &terraform.State{
   439  		Modules: []*terraform.ModuleState{
   440  			{
   441  				Path: []string{"root"},
   442  				Outputs: map[string]*terraform.OutputState{
   443  					"foo": {
   444  						Value: "bar",
   445  						Type:  "string",
   446  					},
   447  				},
   448  			},
   449  		},
   450  	}
   451  
   452  	// Write the state file in a temporary directory with the
   453  	// default filename.
   454  	td, err := ioutil.TempDir("", "tf")
   455  	if err != nil {
   456  		t.Fatalf("err: %s", err)
   457  	}
   458  	statePath := filepath.Join(td, DefaultStateFilename)
   459  
   460  	f, err := os.Create(statePath)
   461  	if err != nil {
   462  		t.Fatalf("err: %s", err)
   463  	}
   464  	err = terraform.WriteState(originalState, f)
   465  	f.Close()
   466  	if err != nil {
   467  		t.Fatalf("err: %s", err)
   468  	}
   469  
   470  	// Change to that directory
   471  	cwd, err := os.Getwd()
   472  	if err != nil {
   473  		t.Fatalf("err: %s", err)
   474  	}
   475  	if err := os.Chdir(filepath.Dir(statePath)); err != nil {
   476  		t.Fatalf("err: %s", err)
   477  	}
   478  	defer os.Chdir(cwd)
   479  
   480  	ui := new(cli.MockUi)
   481  	c := &OutputCommand{
   482  		Meta: Meta{
   483  			ContextOpts: testCtxConfig(testProvider()),
   484  			Ui:          ui,
   485  		},
   486  	}
   487  
   488  	args := []string{
   489  		"foo",
   490  	}
   491  	if code := c.Run(args); code != 0 {
   492  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   493  	}
   494  
   495  	actual := strings.TrimSpace(ui.OutputWriter.String())
   496  	if actual != "bar" {
   497  		t.Fatalf("bad: %#v", actual)
   498  	}
   499  }