Skip to content

Commit

Permalink
e2etests for ShowState, ShowPlan
Browse files Browse the repository at this point in the history
  • Loading branch information
kmoe committed Aug 20, 2020
1 parent 6290faf commit cd34d8d
Show file tree
Hide file tree
Showing 10 changed files with 268 additions and 2 deletions.
206 changes: 206 additions & 0 deletions tfexec/internal/e2etest/show_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
tfjson "github.com/hashicorp/terraform-json"

"github.com/hashicorp/terraform-exec/tfexec"
"github.com/hashicorp/terraform-exec/tfexec/internal/testutil"
)

var (
Expand Down Expand Up @@ -104,3 +105,208 @@ func TestShow_versionMismatch(t *testing.T) {
}
})
}

// Non-default state files cannot be migrated from 0.12 to 0.13,
// so we maintain one fixture per supported version.
// See github.com/hashicorp/terraform/25920
func TestShowState012(t *testing.T) {
runTestVersions(t, []string{testutil.Latest012}, "non_default_statefile_012", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) {
expected := tfjson.State{
FormatVersion: "0.1",
TerraformVersion: "0.12.29",
Values: &tfjson.StateValues{
RootModule: &tfjson.StateModule{
Resources: []*tfjson.StateResource{{
Address: "null_resource.foo",
AttributeValues: map[string]interface{}{
"id": "3610244792381545397",
"triggers": nil,
},
Mode: tfjson.ManagedResourceMode,
Type: "null_resource",
Name: "foo",
ProviderName: "null",
}},
},
},
}

err := tf.Init(context.Background())
if err != nil {
t.Fatalf("error running Init in test directory: %s", err)
}

actual, err := tf.ShowState(context.Background(), "statefilefoo")
if err != nil {
t.Fatal(err)
}

if !reflect.DeepEqual(actual, &expected) {
t.Fatalf("actual: %s\nexpected: %s", spew.Sdump(actual), spew.Sdump(expected))
}
})
}

func TestShowState013(t *testing.T) {
runTestVersions(t, []string{testutil.Latest013}, "non_default_statefile_013", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) {
expected := tfjson.State{
FormatVersion: "0.1",
TerraformVersion: "0.13.0",
Values: &tfjson.StateValues{
RootModule: &tfjson.StateModule{
Resources: []*tfjson.StateResource{{
Address: "null_resource.foo",
AttributeValues: map[string]interface{}{
"id": "3610244792381545397",
"triggers": nil,
},
Mode: tfjson.ManagedResourceMode,
Type: "null_resource",
Name: "foo",
ProviderName: "registry.terraform.io/hashicorp/null",
}},
},
},
}

err := tf.Init(context.Background())
if err != nil {
t.Fatalf("error running Init in test directory: %s", err)
}

actual, err := tf.ShowState(context.Background(), "statefilefoo")
if err != nil {
t.Fatal(err)
}

if !reflect.DeepEqual(actual, &expected) {
t.Fatalf("actual: %s\nexpected: %s", spew.Sdump(actual), spew.Sdump(expected))
}
})
}

// Plan files cannot be transferred between different Terraform versions,
// so we maintain one fixture per supported version
func TestShowPlan012(t *testing.T) {
runTestVersions(t, []string{testutil.Latest012}, "non_default_planfile_012", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) {
providerName := "null"

expected := tfjson.Plan{
FormatVersion: "0.1",
TerraformVersion: "0.12.29",
PlannedValues: &tfjson.StateValues{
RootModule: &tfjson.StateModule{
Resources: []*tfjson.StateResource{{
Address: "null_resource.foo",
AttributeValues: map[string]interface{}{
"triggers": nil,
},
Mode: tfjson.ManagedResourceMode,
Type: "null_resource",
Name: "foo",
ProviderName: providerName,
}},
},
},
ResourceChanges: []*tfjson.ResourceChange{{
Address: "null_resource.foo",
Mode: tfjson.ManagedResourceMode,
Type: "null_resource",
Name: "foo",
ProviderName: providerName,
Change: &tfjson.Change{
Actions: tfjson.Actions{tfjson.ActionCreate},
After: map[string]interface{}{"triggers": nil},
AfterUnknown: map[string]interface{}{"id": (true)},
},
}},
Config: &tfjson.Config{
RootModule: &tfjson.ConfigModule{
Resources: []*tfjson.ConfigResource{{
Address: "null_resource.foo",
Mode: tfjson.ManagedResourceMode,
Type: "null_resource",
Name: "foo",
ProviderConfigKey: "null",
}},
},
},
}

err := tf.Init(context.Background())
if err != nil {
t.Fatalf("error running Init in test directory: %s", err)
}

actual, err := tf.ShowPlan(context.Background(), "planfilefoo")
if err != nil {
t.Fatal(err)
}

if !reflect.DeepEqual(actual, &expected) {
t.Fatalf("actual: %s\nexpected: %s", spew.Sdump(actual), spew.Sdump(expected))
}
})
}

func TestShowPlan013(t *testing.T) {
runTestVersions(t, []string{testutil.Latest013}, "non_default_planfile_013", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) {
providerName := "registry.terraform.io/hashicorp/null"

expected := tfjson.Plan{
FormatVersion: "0.1",
TerraformVersion: "0.13.0",
PlannedValues: &tfjson.StateValues{
RootModule: &tfjson.StateModule{
Resources: []*tfjson.StateResource{{
Address: "null_resource.foo",
AttributeValues: map[string]interface{}{
"triggers": nil,
},
Mode: tfjson.ManagedResourceMode,
Type: "null_resource",
Name: "foo",
ProviderName: providerName,
}},
},
},
ResourceChanges: []*tfjson.ResourceChange{{
Address: "null_resource.foo",
Mode: tfjson.ManagedResourceMode,
Type: "null_resource",
Name: "foo",
ProviderName: providerName,
Change: &tfjson.Change{
Actions: tfjson.Actions{tfjson.ActionCreate},
After: map[string]interface{}{"triggers": nil},
AfterUnknown: map[string]interface{}{"id": true},
},
}},
Config: &tfjson.Config{
RootModule: &tfjson.ConfigModule{
Resources: []*tfjson.ConfigResource{{
Address: "null_resource.foo",
Mode: tfjson.ManagedResourceMode,
Type: "null_resource",
Name: "foo",
ProviderConfigKey: "null",
}},
},
},
}

err := tf.Init(context.Background())
if err != nil {
t.Fatalf("error running Init in test directory: %s", err)
}

actual, err := tf.ShowPlan(context.Background(), "planfilefoo")
if err != nil {
t.Fatal(err)
}

if !reflect.DeepEqual(actual, &expected) {
t.Fatalf("actual: %s\nexpected: %s", spew.Sdump(actual), spew.Sdump(expected))
}
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
resource null_resource "foo" {
}

Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
resource null_resource "foo" {
}

Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
resource null_resource "foo" {
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"version": 4,
"terraform_version": "0.12.29",
"serial": 1,
"lineage": "b69e96b9-250f-2004-c603-1b11dc3459c1",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "null_resource",
"name": "foo",
"provider": "provider.null",
"instances": [
{
"schema_version": 0,
"attributes": {
"id": "3610244792381545397",
"triggers": null
},
"private": "bnVsbA=="
}
]
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
resource null_resource "foo" {
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"version": 4,
"terraform_version": "0.13.0",
"serial": 1,
"lineage": "b69e96b9-250f-2004-c603-1b11dc3459c1",
"outputs": {},
"resources": [
{
"mode": "managed",
"type": "null_resource",
"name": "foo",
"provider": "provider[\"registry.terraform.io/hashicorp/null\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"id": "3610244792381545397",
"triggers": null
},
"private": "bnVsbA=="
}
]
}
]
}
2 changes: 0 additions & 2 deletions tfexec/internal/e2etest/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ func runTest(t *testing.T, fixtureName string, cb func(t *testing.T, tfVersion *
}, fixtureName, cb)
}

// runTestVersions should probably not be used directly, better to use
// t.Skip in your test with a comment as to why you shouldn't test on a version
func runTestVersions(t *testing.T, versions []string, fixtureName string, cb func(t *testing.T, tfVersion *version.Version, tf *tfexec.Terraform)) {
t.Helper()

Expand Down

0 comments on commit cd34d8d

Please sign in to comment.