Skip to content

Commit 9bda0b8

Browse files
committed
chore: Adding a bit more testing
1 parent 578c6f0 commit 9bda0b8

2 files changed

Lines changed: 129 additions & 0 deletions

File tree

internal/cli/commands/catalog/tui/redesign/copy_test.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,3 +142,82 @@ func TestCopyCmd_RefusesToOverwriteExistingFile(t *testing.T) {
142142
require.Error(t, err)
143143
assert.Contains(t, err.Error(), "already exists")
144144
}
145+
146+
func TestCopyCmd_RejectsNilComponent(t *testing.T) {
147+
t.Parallel()
148+
149+
opts := options.NewTerragruntOptions()
150+
opts.WorkingDir = t.TempDir()
151+
152+
err := redesign.NewCopyCmd(logger.CreateLogger(), opts, nil).Run()
153+
require.Error(t, err)
154+
assert.Contains(t, err.Error(), "nil component")
155+
}
156+
157+
func TestCopyCmd_RejectsEmptyWorkingDir(t *testing.T) {
158+
t.Parallel()
159+
160+
repoDir := helpers.TmpDirWOSymlinks(t)
161+
writeFile(t, filepath.Join(repoDir, "vpc", "terragrunt.hcl"), "# unit\n")
162+
163+
repo := newFakeRepo(t, repoDir)
164+
165+
components, err := redesign.NewComponentDiscovery().Discover(repo)
166+
require.NoError(t, err)
167+
require.Len(t, components, 1)
168+
169+
opts := options.NewTerragruntOptions()
170+
opts.WorkingDir = ""
171+
172+
err = redesign.NewCopyCmd(logger.CreateLogger(), opts, components[0]).Run()
173+
require.Error(t, err)
174+
assert.Contains(t, err.Error(), "empty working directory")
175+
}
176+
177+
func TestCopyCmd_FailsWhenSourceMissing(t *testing.T) {
178+
t.Parallel()
179+
180+
repoDir := helpers.TmpDirWOSymlinks(t)
181+
writeFile(t, filepath.Join(repoDir, "vpc", "terragrunt.hcl"), "# unit\n")
182+
183+
repo := newFakeRepo(t, repoDir)
184+
185+
components, err := redesign.NewComponentDiscovery().Discover(repo)
186+
require.NoError(t, err)
187+
require.Len(t, components, 1)
188+
189+
// Remove the source directory after discovery so the copy walk fails.
190+
require.NoError(t, os.RemoveAll(filepath.Join(repoDir, "vpc")))
191+
192+
opts := options.NewTerragruntOptions()
193+
opts.WorkingDir = t.TempDir()
194+
195+
err = redesign.NewCopyCmd(logger.CreateLogger(), opts, components[0]).Run()
196+
require.Error(t, err)
197+
}
198+
199+
func TestCopyCmd_SkipsSymlinks(t *testing.T) {
200+
t.Parallel()
201+
202+
repoDir := helpers.TmpDirWOSymlinks(t)
203+
writeFile(t, filepath.Join(repoDir, "vpc", "terragrunt.hcl"), "# unit\n")
204+
writeFile(t, filepath.Join(repoDir, "vpc", "real.txt"), "hello\n")
205+
206+
// Add a symlink inside the component; copyDir should skip it silently.
207+
require.NoError(t, os.Symlink("real.txt", filepath.Join(repoDir, "vpc", "link.txt")))
208+
209+
repo := newFakeRepo(t, repoDir)
210+
211+
components, err := redesign.NewComponentDiscovery().Discover(repo)
212+
require.NoError(t, err)
213+
require.Len(t, components, 1)
214+
215+
workingDir := t.TempDir()
216+
opts := options.NewTerragruntOptions()
217+
opts.WorkingDir = workingDir
218+
219+
require.NoError(t, redesign.NewCopyCmd(logger.CreateLogger(), opts, components[0]).Run())
220+
221+
assert.FileExists(t, filepath.Join(workingDir, "real.txt"))
222+
assert.NoFileExists(t, filepath.Join(workingDir, "link.txt"))
223+
}

internal/cli/commands/catalog/tui/redesign/model_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package redesign_test
33
import (
44
"bytes"
55
"os"
6+
"path/filepath"
67
"strings"
78
"testing"
89
"time"
@@ -12,6 +13,7 @@ import (
1213

1314
"github.com/gruntwork-io/terragrunt/internal/cli/commands/catalog/tui/redesign"
1415
"github.com/gruntwork-io/terragrunt/pkg/options"
16+
"github.com/gruntwork-io/terragrunt/test/helpers"
1517
"github.com/gruntwork-io/terragrunt/test/helpers/logger"
1618
"github.com/stretchr/testify/assert"
1719
"github.com/stretchr/testify/require"
@@ -203,6 +205,54 @@ func TestModelTabShiftTabCycles(t *testing.T) {
203205
assert.Equal(t, redesign.TabModules, finalModel.ActiveTab(), "shift+tab from All should wrap to the last tab")
204206
}
205207

208+
// TestModelCopyActionMaterializesUnit drives the Model through a real
209+
// scaffold-key press on a unit component and asserts that the copy action
210+
// runs end-to-end: the unit's files land in the working directory and a
211+
// terragrunt.values.hcl stub is generated from the referenced values.*.
212+
func TestModelCopyActionMaterializesUnit(t *testing.T) {
213+
t.Parallel()
214+
215+
repoDir := helpers.TmpDirWOSymlinks(t)
216+
217+
unitBody := `locals { region = values.region }` + "\n"
218+
writeFile(t, filepath.Join(repoDir, "vpc", "terragrunt.hcl"), unitBody)
219+
220+
repo := newFakeRepo(t, repoDir)
221+
222+
components, err := redesign.NewComponentDiscovery().Discover(repo)
223+
require.NoError(t, err)
224+
require.Len(t, components, 1)
225+
require.Equal(t, redesign.ComponentKindUnit, components[0].Kind)
226+
227+
workingDir := t.TempDir()
228+
229+
opts, err := options.NewTerragruntOptionsForTest("")
230+
require.NoError(t, err)
231+
232+
opts.WorkingDir = workingDir
233+
234+
entry := redesign.NewComponentEntry(components[0]).WithSource("github.com/gruntwork-io/fake-repo")
235+
236+
componentCh := make(chan *redesign.ComponentEntry)
237+
m := redesign.NewModelStreaming(logger.CreateLogger(), opts, entry, componentCh)
238+
239+
finalModel := runModel(t, m, 120, 40, func(p *tea.Program) {
240+
// 's' is the scaffold key. For units and stacks, this dispatches to
241+
// the copy action via primaryActionCmd.
242+
p.Send(tea.KeyPressMsg{Code: 's', Text: "s"})
243+
})
244+
245+
assert.FileExists(t, filepath.Join(workingDir, "terragrunt.hcl"))
246+
assert.FileExists(t, filepath.Join(workingDir, "terragrunt.values.hcl"))
247+
248+
raw, err := os.ReadFile(filepath.Join(workingDir, "terragrunt.values.hcl"))
249+
require.NoError(t, err)
250+
assert.Contains(t, string(raw), "region")
251+
252+
assert.Contains(t, finalModel.ExitMessage(), "terragrunt.values.hcl generated",
253+
"the model should stash a post-exit callout after a successful copy")
254+
}
255+
206256
// TestModelStreamingDeduplicates verifies that sending the same component
207257
// twice does not result in a duplicate entry in the list.
208258
func TestModelStreamingDeduplicates(t *testing.T) {

0 commit comments

Comments
 (0)