Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions pkg/generators/terraform_generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,12 @@ func (g *TerraformGenerator) Write(overwrite ...bool) error {
// TerraformComponents and determines the variables.tf location based on component source presence (remote or local).
// Module resolution is now handled by the pkg/terraform package.
func (g *TerraformGenerator) Generate(data map[string]any, overwrite ...bool) error {
// Set reset flag from overwrite parameter
shouldOverwrite := false
if len(overwrite) > 0 {
shouldOverwrite = overwrite[0]
}
g.reset = shouldOverwrite

contextPath, err := g.configHandler.GetConfigRoot()
if err != nil {
Expand Down
105 changes: 105 additions & 0 deletions pkg/generators/terraform_generator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3101,3 +3101,108 @@ func TestTerraformGenerator_Generate_AdditionalCases(t *testing.T) {
}
})
}

func TestTerraformGenerator_Generate_ResetFlag(t *testing.T) {
setup := func(t *testing.T) (*TerraformGenerator, *Mocks) {
mocks := setupMocks(t)
generator := NewTerraformGenerator(mocks.Injector)
generator.shims = mocks.Shims
if err := generator.Initialize(); err != nil {
t.Fatalf("failed to initialize TerraformGenerator: %v", err)
}
return generator, mocks
}

t.Run("GenerateRespectsResetFlag", func(t *testing.T) {
// Given a TerraformGenerator with mocks
generator, mocks := setup(t)

// Set up project and context paths
mocks.Shell.GetProjectRootFunc = func() (string, error) {
return "/mock/project", nil
}
mocks.ConfigHandler.(*config.MockConfigHandler).GetConfigRootFunc = func() (string, error) {
return "/mock/context", nil
}

// Set up component that the generator can process
component := blueprintv1alpha1.TerraformComponent{
Path: "test-module",
FullPath: "/mock/project/terraform/test-module",
}
mocks.BlueprintHandler.GetTerraformComponentsFunc = func() []blueprintv1alpha1.TerraformComponent {
return []blueprintv1alpha1.TerraformComponent{component}
}

// Mock variables.tf file exists
mocks.Shims.Stat = func(path string) (fs.FileInfo, error) {
if strings.HasSuffix(path, "variables.tf") {
return &mockFileInfo{name: "variables.tf", isDir: false}, nil
}
// Return that tfvars file exists
if strings.HasSuffix(path, ".tfvars") {
return &mockFileInfo{name: "test.tfvars", isDir: false}, nil
}
return nil, os.ErrNotExist
}

// Mock variables.tf content
mocks.Shims.ReadFile = func(path string) ([]byte, error) {
if strings.HasSuffix(path, "variables.tf") {
return []byte(`variable "test_var" {
description = "Test variable"
type = string
}`), nil
}
// Return existing tfvars content
if strings.HasSuffix(path, ".tfvars") {
return []byte("# existing content"), nil
}
return nil, fmt.Errorf("unexpected file read: %s", path)
}

// Track if WriteFile was called
writeFileCalled := false
mocks.Shims.WriteFile = func(path string, data []byte, perm fs.FileMode) error {
writeFileCalled = true
return nil
}
mocks.Shims.MkdirAll = func(path string, perm fs.FileMode) error {
return nil
}

// When Generate is called WITHOUT reset flag (overwrite=false)
data := map[string]any{
"terraform/test-module": map[string]any{
"test_var": "test_value",
},
}
err := generator.Generate(data, false)

// Then no error should occur
if err != nil {
t.Errorf("expected no error, got %v", err)
}

// And WriteFile should NOT be called (file should not be overwritten)
if writeFileCalled {
t.Error("expected WriteFile to not be called when reset=false and file exists")
}

// Reset the flag for the next test
writeFileCalled = false

// When Generate is called WITH reset flag (overwrite=true)
err = generator.Generate(data, true)

// Then no error should occur
if err != nil {
t.Errorf("expected no error, got %v", err)
}

// And WriteFile should be called (file should be overwritten)
if !writeFileCalled {
t.Error("expected WriteFile to be called when reset=true")
}
})
}
Loading