github.com/kanishk98/terraform@v1.3.0-dev.0.20220917174235-661ca8088a6a/internal/command/version_test.go (about)

     1  package command
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/google/go-cmp/cmp"
     8  	"github.com/hashicorp/terraform/internal/addrs"
     9  	"github.com/hashicorp/terraform/internal/depsfile"
    10  	"github.com/hashicorp/terraform/internal/getproviders"
    11  	"github.com/mitchellh/cli"
    12  )
    13  
    14  func TestVersionCommand_implements(t *testing.T) {
    15  	var _ cli.Command = &VersionCommand{}
    16  }
    17  
    18  func TestVersion(t *testing.T) {
    19  	td := t.TempDir()
    20  	defer testChdir(t, td)()
    21  
    22  	// We'll create a fixed dependency lock file in our working directory
    23  	// so we can verify that the version command shows the information
    24  	// from it.
    25  	locks := depsfile.NewLocks()
    26  	locks.SetProvider(
    27  		addrs.NewDefaultProvider("test2"),
    28  		getproviders.MustParseVersion("1.2.3"),
    29  		nil,
    30  		nil,
    31  	)
    32  	locks.SetProvider(
    33  		addrs.NewDefaultProvider("test1"),
    34  		getproviders.MustParseVersion("7.8.9-beta.2"),
    35  		nil,
    36  		nil,
    37  	)
    38  
    39  	ui := cli.NewMockUi()
    40  	c := &VersionCommand{
    41  		Meta: Meta{
    42  			Ui: ui,
    43  		},
    44  		Version:           "4.5.6",
    45  		VersionPrerelease: "foo",
    46  		Platform:          getproviders.Platform{OS: "aros", Arch: "riscv64"},
    47  	}
    48  	if err := c.replaceLockedDependencies(locks); err != nil {
    49  		t.Fatal(err)
    50  	}
    51  	if code := c.Run([]string{}); code != 0 {
    52  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
    53  	}
    54  
    55  	actual := strings.TrimSpace(ui.OutputWriter.String())
    56  	expected := "Terraform v4.5.6-foo\non aros_riscv64\n+ provider registry.terraform.io/hashicorp/test1 v7.8.9-beta.2\n+ provider registry.terraform.io/hashicorp/test2 v1.2.3"
    57  	if actual != expected {
    58  		t.Fatalf("wrong output\ngot:\n%s\nwant:\n%s", actual, expected)
    59  	}
    60  
    61  }
    62  
    63  func TestVersion_flags(t *testing.T) {
    64  	ui := new(cli.MockUi)
    65  	m := Meta{
    66  		Ui: ui,
    67  	}
    68  
    69  	// `terraform version`
    70  	c := &VersionCommand{
    71  		Meta:              m,
    72  		Version:           "4.5.6",
    73  		VersionPrerelease: "foo",
    74  		Platform:          getproviders.Platform{OS: "aros", Arch: "riscv64"},
    75  	}
    76  
    77  	if code := c.Run([]string{"-v", "-version"}); code != 0 {
    78  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
    79  	}
    80  
    81  	actual := strings.TrimSpace(ui.OutputWriter.String())
    82  	expected := "Terraform v4.5.6-foo\non aros_riscv64"
    83  	if actual != expected {
    84  		t.Fatalf("wrong output\ngot: %#v\nwant: %#v", actual, expected)
    85  	}
    86  }
    87  
    88  func TestVersion_outdated(t *testing.T) {
    89  	ui := new(cli.MockUi)
    90  	m := Meta{
    91  		Ui: ui,
    92  	}
    93  
    94  	c := &VersionCommand{
    95  		Meta:      m,
    96  		Version:   "4.5.6",
    97  		CheckFunc: mockVersionCheckFunc(true, "4.5.7"),
    98  		Platform:  getproviders.Platform{OS: "aros", Arch: "riscv64"},
    99  	}
   100  
   101  	if code := c.Run([]string{}); code != 0 {
   102  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   103  	}
   104  
   105  	actual := strings.TrimSpace(ui.OutputWriter.String())
   106  	expected := "Terraform v4.5.6\non aros_riscv64\n\nYour version of Terraform is out of date! The latest version\nis 4.5.7. You can update by downloading from https://www.terraform.io/downloads.html"
   107  	if actual != expected {
   108  		t.Fatalf("wrong output\ngot: %#v\nwant: %#v", actual, expected)
   109  	}
   110  }
   111  
   112  func TestVersion_json(t *testing.T) {
   113  	td := t.TempDir()
   114  	defer testChdir(t, td)()
   115  
   116  	ui := cli.NewMockUi()
   117  	meta := Meta{
   118  		Ui: ui,
   119  	}
   120  
   121  	// `terraform version -json` without prerelease
   122  	c := &VersionCommand{
   123  		Meta:     meta,
   124  		Version:  "4.5.6",
   125  		Platform: getproviders.Platform{OS: "aros", Arch: "riscv64"},
   126  	}
   127  	if code := c.Run([]string{"-json"}); code != 0 {
   128  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   129  	}
   130  
   131  	actual := strings.TrimSpace(ui.OutputWriter.String())
   132  	expected := strings.TrimSpace(`
   133  {
   134    "terraform_version": "4.5.6",
   135    "platform": "aros_riscv64",
   136    "provider_selections": {},
   137    "terraform_outdated": false
   138  }
   139  `)
   140  	if diff := cmp.Diff(expected, actual); diff != "" {
   141  		t.Fatalf("wrong output\n%s", diff)
   142  	}
   143  
   144  	// flush the output from the mock ui
   145  	ui.OutputWriter.Reset()
   146  
   147  	// Now we'll create a fixed dependency lock file in our working directory
   148  	// so we can verify that the version command shows the information
   149  	// from it.
   150  	locks := depsfile.NewLocks()
   151  	locks.SetProvider(
   152  		addrs.NewDefaultProvider("test2"),
   153  		getproviders.MustParseVersion("1.2.3"),
   154  		nil,
   155  		nil,
   156  	)
   157  	locks.SetProvider(
   158  		addrs.NewDefaultProvider("test1"),
   159  		getproviders.MustParseVersion("7.8.9-beta.2"),
   160  		nil,
   161  		nil,
   162  	)
   163  
   164  	// `terraform version -json` with prerelease and provider dependencies
   165  	c = &VersionCommand{
   166  		Meta:              meta,
   167  		Version:           "4.5.6",
   168  		VersionPrerelease: "foo",
   169  		Platform:          getproviders.Platform{OS: "aros", Arch: "riscv64"},
   170  	}
   171  	if err := c.replaceLockedDependencies(locks); err != nil {
   172  		t.Fatal(err)
   173  	}
   174  	if code := c.Run([]string{"-json"}); code != 0 {
   175  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   176  	}
   177  
   178  	actual = strings.TrimSpace(ui.OutputWriter.String())
   179  	expected = strings.TrimSpace(`
   180  {
   181    "terraform_version": "4.5.6-foo",
   182    "platform": "aros_riscv64",
   183    "provider_selections": {
   184      "registry.terraform.io/hashicorp/test1": "7.8.9-beta.2",
   185      "registry.terraform.io/hashicorp/test2": "1.2.3"
   186    },
   187    "terraform_outdated": false
   188  }
   189  `)
   190  	if diff := cmp.Diff(expected, actual); diff != "" {
   191  		t.Fatalf("wrong output\n%s", diff)
   192  	}
   193  
   194  }
   195  
   196  func TestVersion_jsonoutdated(t *testing.T) {
   197  	ui := new(cli.MockUi)
   198  	m := Meta{
   199  		Ui: ui,
   200  	}
   201  
   202  	c := &VersionCommand{
   203  		Meta:      m,
   204  		Version:   "4.5.6",
   205  		CheckFunc: mockVersionCheckFunc(true, "4.5.7"),
   206  		Platform:  getproviders.Platform{OS: "aros", Arch: "riscv64"},
   207  	}
   208  
   209  	if code := c.Run([]string{"-json"}); code != 0 {
   210  		t.Fatalf("bad: \n%s", ui.ErrorWriter.String())
   211  	}
   212  
   213  	actual := strings.TrimSpace(ui.OutputWriter.String())
   214  	expected := "{\n  \"terraform_version\": \"4.5.6\",\n  \"platform\": \"aros_riscv64\",\n  \"provider_selections\": {},\n  \"terraform_outdated\": true\n}"
   215  	if actual != expected {
   216  		t.Fatalf("wrong output\ngot: %#v\nwant: %#v", actual, expected)
   217  	}
   218  }
   219  
   220  func mockVersionCheckFunc(outdated bool, latest string) VersionCheckFunc {
   221  	return func() (VersionCheckInfo, error) {
   222  		return VersionCheckInfo{
   223  			Outdated: outdated,
   224  			Latest:   latest,
   225  			// Alerts is not used by version command
   226  		}, nil
   227  	}
   228  }