@@ -56,10 +56,13 @@ func TestAccHerokuSpace(t *testing.T) {
5656// …
5757// }
5858
59- func TestAccHerokuSpace_Generation (t * testing.T ) {
59+ // TestAccHerokuSpace_Fir creates a single Fir space and runs multiple Fir-specific tests against it
60+ // This follows the efficient pattern from TestAccHerokuSpace instead of creating multiple spaces
61+ func TestAccHerokuSpace_Fir (t * testing.T ) {
6062 var space spaceWithNAT
61- spaceName := fmt .Sprintf ("tftest-gen -%s" , acctest .RandString (10 ))
63+ spaceName := fmt .Sprintf ("tftest-fir -%s" , acctest .RandString (10 ))
6264 org := testAccConfig .GetAnyOrganizationOrSkip (t )
65+ spaceConfig := testAccCheckHerokuSpaceConfig_generation (spaceName , org , "fir" , false )
6366
6467 resource .Test (t , resource.TestCase {
6568 PreCheck : func () {
@@ -69,36 +72,62 @@ func TestAccHerokuSpace_Generation(t *testing.T) {
6972 CheckDestroy : testAccCheckHerokuSpaceDestroy ,
7073 Steps : []resource.TestStep {
7174 {
72- // Test 1: Default generation (should be cedar)
73- Config : testAccCheckHerokuSpaceConfig_generation (spaceName , org , "" , false ),
75+ // Step 1: Create Fir space and validate generation
76+ ResourceName : "heroku_space.foobar" ,
77+ Config : spaceConfig ,
7478 Check : resource .ComposeTestCheckFunc (
7579 testAccCheckHerokuSpaceExists ("heroku_space.foobar" , & space ),
76- resource .TestCheckResourceAttr ("heroku_space.foobar" , "generation" , "cedar " ),
80+ resource .TestCheckResourceAttr ("heroku_space.foobar" , "generation" , "fir " ),
7781 resource .TestCheckResourceAttr ("heroku_space.foobar" , "shield" , "false" ),
82+ resource .TestCheckResourceAttrSet ("heroku_space.foobar" , "outbound_ips.#" ),
83+ resource .TestCheckResourceAttr ("heroku_space.foobar" , "cidr" , "10.0.0.0/16" ),
84+ resource .TestCheckResourceAttrSet ("heroku_space.foobar" , "data_cidr" ),
7885 ),
7986 },
87+ // Test Fir-specific feature limitations (these should fail)
88+ testStep_AccHerokuSpaceVPNConnection_FirValidation (t , spaceConfig ),
89+ testStep_AccHerokuSpaceInboundRuleset_FirValidation (t , spaceConfig ),
90+ testStep_AccHerokuSpacePeeringConnection_FirValidation (t , spaceConfig ),
91+ },
92+ })
93+ }
94+
95+ // TestAccHerokuSpace_Generation tests default and Cedar generation behavior efficiently
96+ func TestAccHerokuSpace_Generation (t * testing.T ) {
97+ var space spaceWithNAT
98+ spaceName := fmt .Sprintf ("tftest-gen-%s" , acctest .RandString (10 ))
99+ org := testAccConfig .GetAnyOrganizationOrSkip (t )
100+
101+ resource .Test (t , resource.TestCase {
102+ PreCheck : func () {
103+ testAccPreCheck (t )
104+ },
105+ Providers : testAccProviders ,
106+ CheckDestroy : testAccCheckHerokuSpaceDestroy ,
107+ Steps : []resource.TestStep {
80108 {
81- // Test 2: Explicit cedar generation
82- Config : testAccCheckHerokuSpaceConfig_generation (spaceName + "-cedar" , org , "cedar " , false ),
109+ // Test 1: Default generation (should be cedar)
110+ Config : testAccCheckHerokuSpaceConfig_generation (spaceName , org , "" , false ),
83111 Check : resource .ComposeTestCheckFunc (
84112 testAccCheckHerokuSpaceExists ("heroku_space.foobar" , & space ),
85113 resource .TestCheckResourceAttr ("heroku_space.foobar" , "generation" , "cedar" ),
86114 resource .TestCheckResourceAttr ("heroku_space.foobar" , "shield" , "false" ),
87115 ),
88116 },
89117 {
90- // Test 3: Fir generation (non-shield )
91- Config : testAccCheckHerokuSpaceConfig_generation (spaceName + "-fir" , org , "fir " , false ),
118+ // Test 2: Explicit cedar generation (ForceNew test - recreates the space )
119+ Config : testAccCheckHerokuSpaceConfig_generation (spaceName , org , "cedar " , false ),
92120 Check : resource .ComposeTestCheckFunc (
93121 testAccCheckHerokuSpaceExists ("heroku_space.foobar" , & space ),
94- resource .TestCheckResourceAttr ("heroku_space.foobar" , "generation" , "fir " ),
122+ resource .TestCheckResourceAttr ("heroku_space.foobar" , "generation" , "cedar " ),
95123 resource .TestCheckResourceAttr ("heroku_space.foobar" , "shield" , "false" ),
96124 ),
97125 },
98126 },
99127 })
100128}
101129
130+ // TestAccHerokuSpace_GenerationShieldValidation tests that Fir + Shield fails with proper error
102131func TestAccHerokuSpace_GenerationShieldValidation (t * testing.T ) {
103132 spaceName := fmt .Sprintf ("tftest-shield-%s" , acctest .RandString (10 ))
104133 org := testAccConfig .GetAnyOrganizationOrSkip (t )
@@ -110,42 +139,16 @@ func TestAccHerokuSpace_GenerationShieldValidation(t *testing.T) {
110139 Providers : testAccProviders ,
111140 Steps : []resource.TestStep {
112141 {
113- // Test: Fir + Shield should fail during apply
142+ // Test: Fir + Shield should fail during plan
114143 Config : testAccCheckHerokuSpaceConfig_generation (spaceName , org , "fir" , true ),
115144 ExpectError : regexp .MustCompile ("shield spaces are not supported for fir generation" ),
116145 },
117146 },
118147 })
119148}
120149
121- func TestAccHerokuSpace_GenerationForceNew (t * testing.T ) {
122- spaceName := fmt .Sprintf ("tftest-forcenew-%s" , acctest .RandString (10 ))
123- org := testAccConfig .GetAnyOrganizationOrSkip (t )
124-
125- resource .Test (t , resource.TestCase {
126- PreCheck : func () {
127- testAccPreCheck (t )
128- },
129- Providers : testAccProviders ,
130- CheckDestroy : testAccCheckHerokuSpaceDestroy ,
131- Steps : []resource.TestStep {
132- {
133- // Step 1: Create space with cedar generation
134- Config : testAccCheckHerokuSpaceConfig_generation (spaceName , org , "cedar" , false ),
135- Check : resource .ComposeTestCheckFunc (
136- resource .TestCheckResourceAttr ("heroku_space.foobar" , "generation" , "cedar" ),
137- ),
138- },
139- {
140- // Step 2: Change generation to fir - should force recreation
141- Config : testAccCheckHerokuSpaceConfig_generation (spaceName , org , "fir" , false ),
142- Check : resource .ComposeTestCheckFunc (
143- resource .TestCheckResourceAttr ("heroku_space.foobar" , "generation" , "fir" ),
144- ),
145- },
146- },
147- })
148- }
150+ // ForceNew behavior is already tested in TestAccHerokuSpace_Generation above
151+ // No separate test needed since changing generation recreates the space
149152
150153func testAccCheckHerokuSpaceConfig_basic (spaceName , orgName , cidr string ) string {
151154 return fmt .Sprintf (`
@@ -334,3 +337,49 @@ func TestHerokuSpaceGeneration(t *testing.T) {
334337 })
335338 }
336339}
340+
341+ // Test step functions for Fir-specific feature validation
342+ // These validate that unsupported features fail properly on Fir spaces
343+
344+ func testStep_AccHerokuSpaceVPNConnection_FirValidation (t * testing.T , spaceConfig string ) resource.TestStep {
345+ return resource.TestStep {
346+ Config : spaceConfig + `
347+ resource "heroku_space_vpn_connection" "fir_vpn_fail" {
348+ name = "fir-vpn-should-fail"
349+ space = heroku_space.foobar.id
350+ generation = "fir"
351+ public_ip = "203.0.113.10"
352+ routable_cidrs = ["192.168.1.0/24"]
353+ }` ,
354+ ExpectError : regexp .MustCompile ("generation.*fir.*not supported|vpn.*not supported.*fir" ),
355+ }
356+ }
357+
358+ func testStep_AccHerokuSpaceInboundRuleset_FirValidation (t * testing.T , spaceConfig string ) resource.TestStep {
359+ return resource.TestStep {
360+ Config : spaceConfig + `
361+ resource "heroku_space_inbound_ruleset" "fir_inbound_fail" {
362+ space = heroku_space.foobar.id
363+ generation = "fir"
364+
365+ rule {
366+ action = "allow"
367+ source = "0.0.0.0/0"
368+ }
369+ }` ,
370+ ExpectError : regexp .MustCompile ("generation.*fir.*not supported|inbound.*not supported.*fir" ),
371+ }
372+ }
373+
374+ func testStep_AccHerokuSpacePeeringConnection_FirValidation (t * testing.T , spaceConfig string ) resource.TestStep {
375+ return resource.TestStep {
376+ Config : spaceConfig + `
377+ resource "heroku_space_peering_connection_accepter" "fir_peering_fail" {
378+ space = heroku_space.foobar.id
379+ generation = "fir"
380+ vpc_peering_connection_id = "pcx-123456789abcdef01"
381+ type = "aws"
382+ }` ,
383+ ExpectError : regexp .MustCompile ("generation.*fir.*not supported|peering.*not supported.*fir" ),
384+ }
385+ }
0 commit comments