15
15
package test
16
16
17
17
import (
18
+ "encoding/json"
18
19
"fmt"
19
20
"log"
20
21
"os"
@@ -23,6 +24,7 @@ import (
23
24
24
25
"github.com/GoogleCloudPlatform/terraform-google-conversion/v2/caiasset"
25
26
"github.com/google/go-cmp/cmp"
27
+ terraformJSON "github.com/hashicorp/terraform-json"
26
28
)
27
29
28
30
// TestCLI tests the "convert" and "validate" subcommand against a generated .tfplan file.
@@ -32,6 +34,19 @@ func TestCLI(t *testing.T) {
32
34
return
33
35
}
34
36
37
+ if os .Getenv ("CREATE_TEST_PROJECT" ) != "" && os .Getenv ("TEST_ORG_ID" ) != "" {
38
+ orgID := os .Getenv ("TEST_ORG_ID" )
39
+ dir , err := os .MkdirTemp (t .TempDir (), "terraform" )
40
+ if err != nil {
41
+ t .Fatalf ("os.MkdirTemp = %v" , err )
42
+ }
43
+ // Do not use defer since it will execute before t.Parallel()
44
+ t .Cleanup (func () {
45
+ terraformDestroy (t , "terraform" , dir , "" )
46
+ })
47
+ createTestProject (t , dir , orgID )
48
+ }
49
+
35
50
// Test cases for each type of resource is defined here.
36
51
cases := []struct {
37
52
name string
@@ -176,3 +191,34 @@ func compareMergedIamBindingOutput(t *testing.T, expected []caiasset.Asset, actu
176
191
t .Errorf ("%v diff(-want, +got):\n %s" , t .Name (), diff )
177
192
}
178
193
}
194
+
195
+ func createTestProject (t * testing.T , dir string , orgID string ) {
196
+ generateTestFiles (t , "./" , dir , "create_test_project.tf" )
197
+ // any terraform execute failure will trigger t.Fatal
198
+ terraformInit (t , "terraform" , dir )
199
+ terraformPlan (t , "terraform" , dir , "create_test_project.tfplan" )
200
+ terraformApply (t , "terraform" , dir , "" )
201
+ // terraform show result contains format_version field which is required in unmarshal.
202
+ b := terraformShow (t , "terraform" , dir , "" )
203
+ var state terraformJSON.State
204
+ err := json .Unmarshal (b , & state )
205
+ if err != nil {
206
+ t .Fatal (err )
207
+ }
208
+
209
+ var ok bool
210
+ for _ , resource := range state .Values .RootModule .Resources {
211
+ if resource .Type == "google_project" {
212
+ data .FolderID , ok = resource .AttributeValues ["folder_id" ].(string )
213
+ if ! ok {
214
+ t .Fatalf ("Failed to get folder ID from value %v" , resource .AttributeValues ["folder_id" ])
215
+ }
216
+ data .Project ["project" ], ok = resource .AttributeValues ["project_id" ].(string )
217
+ if ! ok {
218
+ t .Fatalf ("Failed to get project ID from value %v" , resource .AttributeValues ["project_id" ])
219
+ }
220
+ }
221
+ }
222
+ data .Ancestry = fmt .Sprintf ("organizations/%s/folders/%s" , orgID , data .FolderID )
223
+ t .Logf ("Successfully created folder_id=%v, project_id=%v" , data .FolderID , data .Project ["project" ])
224
+ }
0 commit comments