Skip to content

Commit cde7d65

Browse files
committed
test: also run ConvertState against tfstate
1 parent 37aa13e commit cde7d65

File tree

1 file changed

+67
-58
lines changed

1 file changed

+67
-58
lines changed

provisioner/terraform/resources_test.go

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -51,75 +51,84 @@ func TestConvertStateGoldenFiles(t *testing.T) {
5151
testFiles, err := os.ReadDir(filepath.Join(testResourceDirectories, testDirectory.Name()))
5252
require.NoError(t, err)
5353

54-
planIdx := slices.IndexFunc(testFiles, func(entry os.DirEntry) bool {
55-
return strings.HasSuffix(entry.Name(), ".tfplan.json")
56-
})
57-
dotIdx := slices.IndexFunc(testFiles, func(entry os.DirEntry) bool {
58-
return strings.HasSuffix(entry.Name(), ".tfplan.dot")
59-
})
54+
for _, step := range []string{"plan", "state"} {
55+
planIdx := slices.IndexFunc(testFiles, func(entry os.DirEntry) bool {
56+
return strings.HasSuffix(entry.Name(), fmt.Sprintf(".tf%s.json", step))
57+
})
58+
dotIdx := slices.IndexFunc(testFiles, func(entry os.DirEntry) bool {
59+
return strings.HasSuffix(entry.Name(), fmt.Sprintf(".tf%s.dot", step))
60+
})
6061

61-
if planIdx == -1 || dotIdx == -1 {
62-
continue
63-
}
62+
if planIdx == -1 || dotIdx == -1 {
63+
continue
64+
}
6465

65-
t.Run(testDirectory.Name(), func(t *testing.T) {
66-
testDirectoryPath := filepath.Join(testResourceDirectories, testDirectory.Name())
67-
planFile := filepath.Join(testDirectoryPath, testFiles[planIdx].Name())
68-
dotFile := filepath.Join(testDirectoryPath, testFiles[dotIdx].Name())
69-
t.Parallel()
70-
ctx := testutil.Context(t, testutil.WaitMedium)
71-
logger := slogtest.Make(t, nil)
66+
t.Run(step+"_"+testDirectory.Name(), func(t *testing.T) {
67+
testDirectoryPath := filepath.Join(testResourceDirectories, testDirectory.Name())
68+
planFile := filepath.Join(testDirectoryPath, testFiles[planIdx].Name())
69+
dotFile := filepath.Join(testDirectoryPath, testFiles[dotIdx].Name())
70+
t.Parallel()
71+
ctx := testutil.Context(t, testutil.WaitMedium)
72+
logger := slogtest.Make(t, nil)
7273

73-
// Gather plan
74-
tfPlanRaw, err := os.ReadFile(planFile)
75-
require.NoError(t, err)
74+
// Gather plan
75+
tfStepRaw, err := os.ReadFile(planFile)
76+
require.NoError(t, err)
7677

77-
var tfPlan tfjson.Plan
78-
err = json.Unmarshal(tfPlanRaw, &tfPlan)
79-
require.NoError(t, err)
78+
var modules []*tfjson.StateModule
79+
switch step {
80+
case "plan":
81+
var tfPlan tfjson.Plan
82+
err = json.Unmarshal(tfStepRaw, &tfPlan)
83+
require.NoError(t, err)
8084

81-
modules := []*tfjson.StateModule{tfPlan.PlannedValues.RootModule}
82-
if tfPlan.PriorState != nil {
83-
modules = append(modules, tfPlan.PriorState.Values.RootModule)
84-
} else {
85-
// Ensure that resources canF be duplicated in the source state
86-
// and that no errors occur!
87-
modules = append(modules, tfPlan.PlannedValues.RootModule)
88-
}
85+
modules = []*tfjson.StateModule{tfPlan.PlannedValues.RootModule}
86+
if tfPlan.PriorState != nil {
87+
modules = append(modules, tfPlan.PriorState.Values.RootModule)
88+
}
89+
case "state":
90+
var tfState tfjson.State
91+
err = json.Unmarshal(tfStepRaw, &tfState)
92+
require.NoError(t, err)
93+
modules = []*tfjson.StateModule{tfState.Values.RootModule}
94+
default:
95+
t.Fatalf("unknown step: %s", step)
96+
}
8997

90-
// Gather graph
91-
dotFileRaw, err := os.ReadFile(dotFile)
92-
require.NoError(t, err)
98+
// Gather graph
99+
dotFileRaw, err := os.ReadFile(dotFile)
100+
require.NoError(t, err)
93101

94-
var expectedOutput any
95-
state, err := terraform.ConvertState(ctx, modules, string(dotFileRaw), logger)
96-
if err == nil {
97-
sortResources(state.Resources)
98-
sortExternalAuthProviders(state.ExternalAuthProviders)
99-
deterministicAppIDs(state.Resources)
100-
expectedOutput = state
101-
} else {
102-
// Write the error to the file then. Track errors as much as valid paths.
103-
expectedOutput = err.Error()
104-
}
102+
var expectedOutput any
103+
state, err := terraform.ConvertState(ctx, modules, string(dotFileRaw), logger)
104+
if err == nil {
105+
sortResources(state.Resources)
106+
sortExternalAuthProviders(state.ExternalAuthProviders)
107+
deterministicAppIDs(state.Resources)
108+
expectedOutput = state
109+
} else {
110+
// Write the error to the file then. Track errors as much as valid paths.
111+
expectedOutput = err.Error()
112+
}
105113

106-
expPath := filepath.Join(testDirectoryPath, "converted_state.golden")
107-
if *updateGoldenFiles {
108-
gotBytes, err := json.MarshalIndent(expectedOutput, "", " ")
109-
require.NoError(t, err, "marshaling converted state to JSON")
110-
err = os.WriteFile(expPath, gotBytes, 0o600)
111-
require.NoError(t, err)
112-
return
113-
}
114+
expPath := filepath.Join(testDirectoryPath, fmt.Sprintf("converted_state.%s.golden", step))
115+
if *updateGoldenFiles {
116+
gotBytes, err := json.MarshalIndent(expectedOutput, "", " ")
117+
require.NoError(t, err, "marshaling converted state to JSON")
118+
err = os.WriteFile(expPath, gotBytes, 0o600)
119+
require.NoError(t, err)
120+
return
121+
}
114122

115-
gotBytes, err := json.Marshal(expectedOutput)
116-
require.NoError(t, err, "marshaling converted state to JSON")
123+
gotBytes, err := json.Marshal(expectedOutput)
124+
require.NoError(t, err, "marshaling converted state to JSON")
117125

118-
expBytes, err := os.ReadFile(expPath)
119-
require.NoError(t, err)
126+
expBytes, err := os.ReadFile(expPath)
127+
require.NoError(t, err)
120128

121-
require.JSONEq(t, string(expBytes), string(gotBytes), "converted state")
122-
})
129+
require.JSONEq(t, string(expBytes), string(gotBytes), "converted state")
130+
})
131+
}
123132
}
124133
}
125134

0 commit comments

Comments
 (0)