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
8 changes: 7 additions & 1 deletion acceptance/acceptance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,11 @@ func requireEqualOperationResponses(t *testing.T, expected *pb.OperationResponse

got := &pb.OperationResponses{}
require.NoErrorf(t, protojson.Unmarshal(out, got), string(out))
require.Len(t, expected.GetResponses(), len(got.GetResponses()))
require.Lenf(
t, got.GetResponses(), len(expected.GetResponses()),
"expected %d operation responses, got %d, raw response %s",
len(expected.GetResponses()), len(got.GetResponses()), string(out),
)
expectedResponses := expected.GetResponses()
gotResponses := got.GetResponses()
sortResponses(expectedResponses)
Expand Down Expand Up @@ -320,6 +324,8 @@ func requireEqualOperationResponses(t *testing.T, expected *pb.OperationResponse
func requireEqualGenerateResponse(t *testing.T, expected, got *pb.Operation_Response_Generate) {
t.Helper()

require.Len(t, expected.GetDiagnostics(), len(got.GetDiagnostics()), "expected equal generate diagnostics")

if expected.GetTerraformModule().GetModulePath() != "" {
require.Equal(
t, expected.GetTerraformModule().GetModulePath(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Copyright IBM Corp. 2021, 2026
# SPDX-License-Identifier: MPL-2.0

module "foo" {
source = "./modules/foo"

input = "fooinput"
anotherinput = ["anotherfoo"]
}

module "bar" {
source = "./modules/does_not_exist"
}

scenario "test" {
step "foo" {
module = module.foo
}

step "bar" {
module = module.bar
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Copyright IBM Corp. 2021, 2026
# SPDX-License-Identifier: MPL-2.0

output "input" {
value = var.input
}

output "anotherinput" {
value = var.input
}

variable "input" {
type = string
default = "notset"
}

variable "anotherinput" {
type = list(string)
default = ["one"]
}
65 changes: 65 additions & 0 deletions acceptance/scenario_check_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,3 +218,68 @@ func TestAcc_Cmd_Scenario_Check_WithWarnings(t *testing.T) {
})
}
}

func TestAcc_Cmd_Scenario_Check_InvalidScenario(t *testing.T) {
t.Parallel()

for dir, test := range map[string]struct {
name string
uid string
}{
"scenario_step_missing_module": {
"test",
fmt.Sprintf("%x", sha256.Sum256([]byte("test"))),
},
} {
t.Run(fmt.Sprintf("%s %s", dir, test.name), func(t *testing.T) {
t.Parallel()

enos := newAcceptanceRunner(t)

tmpDir := t.TempDir()
outDir := filepath.Join(tmpDir, dir)
err := os.MkdirAll(outDir, 0o755)
require.NoError(t, err)
outDir, err = filepath.EvalSymlinks(outDir)
require.NoError(t, err)
path, err := filepath.Abs(filepath.Join("./invalid_scenarios", dir))
require.NoError(t, err)

filter := test.name
scenarioRef := &pb.Ref_Scenario{
Id: &pb.Scenario_ID{
Name: test.name,
Filter: filter,
Uid: test.uid,
},
}

cmd := fmt.Sprintf("scenario check --chdir %s --out %s %s --format json", path, outDir, filter)
out, _, err := enos.run(context.Background(), cmd)
require.Error(t, err)
expected := &pb.OperationResponses{
Responses: []*pb.Operation_Response{
{
Op: &pb.Ref_Operation{
Scenario: scenarioRef,
},
Status: pb.Operation_STATUS_FAILED,
Value: &pb.Operation_Response_Check_{
Check: &pb.Operation_Response_Check{
Generate: &pb.Operation_Response_Generate{
Diagnostics: []*pb.Diagnostic{
{
Summary: fmt.Sprintf("lstat %s/modules/does_not_exist: no such file or directory", path),
},
},
},
},
},
},
},
}

requireEqualOperationResponses(t, expected, out)
})
}
}
65 changes: 65 additions & 0 deletions acceptance/scenario_destroy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,68 @@ func TestAcc_Cmd_Scenario_Destroy(t *testing.T) {
})
}
}

func TestAcc_Cmd_Scenario_Destroy_InvalidScenario(t *testing.T) {
t.Parallel()

for dir, test := range map[string]struct {
name string
uid string
}{
"scenario_step_missing_module": {
"test",
fmt.Sprintf("%x", sha256.Sum256([]byte("test"))),
},
} {
t.Run(fmt.Sprintf("%s %s", dir, test.name), func(t *testing.T) {
t.Parallel()

enos := newAcceptanceRunner(t)

tmpDir := t.TempDir()
outDir := filepath.Join(tmpDir, dir)
err := os.MkdirAll(outDir, 0o755)
require.NoError(t, err)
outDir, err = filepath.EvalSymlinks(outDir)
require.NoError(t, err)
path, err := filepath.Abs(filepath.Join("./invalid_scenarios", dir))
require.NoError(t, err)

filter := test.name
scenarioRef := &pb.Ref_Scenario{
Id: &pb.Scenario_ID{
Name: test.name,
Filter: filter,
Uid: test.uid,
},
}

cmd := fmt.Sprintf("scenario destroy --chdir %s --out %s %s --format json", path, outDir, filter)
out, _, err := enos.run(context.Background(), cmd)
require.Error(t, err)
expected := &pb.OperationResponses{
Responses: []*pb.Operation_Response{
{
Op: &pb.Ref_Operation{
Scenario: scenarioRef,
},
Status: pb.Operation_STATUS_FAILED,
Value: &pb.Operation_Response_Destroy_{
Destroy: &pb.Operation_Response_Destroy{
Generate: &pb.Operation_Response_Generate{
Diagnostics: []*pb.Diagnostic{
{
Summary: fmt.Sprintf("lstat %s/modules/does_not_exist: no such file or directory", path),
},
},
},
},
},
},
},
}

requireEqualOperationResponses(t, expected, out)
})
}
}
63 changes: 63 additions & 0 deletions acceptance/scenario_generate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,66 @@ func TestAcc_Cmd_Scenario_Generate(t *testing.T) {
})
}
}

func TestAcc_Cmd_Scenario_Generate_InvalidScenario(t *testing.T) {
t.Parallel()

for dir, test := range map[string]struct {
name string
uid string
}{
"scenario_step_missing_module": {
"test",
fmt.Sprintf("%x", sha256.Sum256([]byte("test"))),
},
} {
t.Run(fmt.Sprintf("%s %s", dir, test.name), func(t *testing.T) {
t.Parallel()

enos := newAcceptanceRunner(t)

tmpDir := t.TempDir()
outDir := filepath.Join(tmpDir, dir)
err := os.MkdirAll(outDir, 0o755)
require.NoError(t, err)
outDir, err = filepath.EvalSymlinks(outDir)
require.NoError(t, err)
path, err := filepath.Abs(filepath.Join("./invalid_scenarios", dir))
require.NoError(t, err)

filter := test.name
scenarioRef := &pb.Ref_Scenario{
Id: &pb.Scenario_ID{
Name: test.name,
Filter: filter,
Uid: test.uid,
},
}

cmd := fmt.Sprintf("scenario generate --chdir %s --out %s %s --format json", path, outDir, filter)
out, _, err := enos.run(context.Background(), cmd)
require.Error(t, err)
expected := &pb.OperationResponses{
Responses: []*pb.Operation_Response{
{
Op: &pb.Ref_Operation{
Scenario: scenarioRef,
},
Status: pb.Operation_STATUS_FAILED,
Value: &pb.Operation_Response_Generate_{
Generate: &pb.Operation_Response_Generate{
Diagnostics: []*pb.Diagnostic{
{
Summary: fmt.Sprintf("lstat %s/modules/does_not_exist: no such file or directory", path),
},
},
},
},
},
},
}

requireEqualOperationResponses(t, expected, out)
})
}
}
65 changes: 65 additions & 0 deletions acceptance/scenario_launch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,3 +113,68 @@ func TestAcc_Cmd_Scenario_Launch(t *testing.T) {
})
}
}

func TestAcc_Cmd_Scenario_Launch_InvalidScenario(t *testing.T) {
t.Parallel()

for dir, test := range map[string]struct {
name string
uid string
}{
"scenario_step_missing_module": {
"test",
fmt.Sprintf("%x", sha256.Sum256([]byte("test"))),
},
} {
t.Run(fmt.Sprintf("%s %s", dir, test.name), func(t *testing.T) {
t.Parallel()

enos := newAcceptanceRunner(t)

tmpDir := t.TempDir()
outDir := filepath.Join(tmpDir, dir)
err := os.MkdirAll(outDir, 0o755)
require.NoError(t, err)
outDir, err = filepath.EvalSymlinks(outDir)
require.NoError(t, err)
path, err := filepath.Abs(filepath.Join("./invalid_scenarios", dir))
require.NoError(t, err)

filter := test.name
scenarioRef := &pb.Ref_Scenario{
Id: &pb.Scenario_ID{
Name: test.name,
Filter: filter,
Uid: test.uid,
},
}

cmd := fmt.Sprintf("scenario launch --chdir %s --out %s %s --format json", path, outDir, filter)
out, _, err := enos.run(context.Background(), cmd)
require.Error(t, err)
expected := &pb.OperationResponses{
Responses: []*pb.Operation_Response{
{
Op: &pb.Ref_Operation{
Scenario: scenarioRef,
},
Status: pb.Operation_STATUS_FAILED,
Value: &pb.Operation_Response_Launch_{
Launch: &pb.Operation_Response_Launch{
Generate: &pb.Operation_Response_Generate{
Diagnostics: []*pb.Diagnostic{
{
Summary: fmt.Sprintf("lstat %s/modules/does_not_exist: no such file or directory", path),
},
},
},
},
},
},
},
}

requireEqualOperationResponses(t, expected, out)
})
}
}
Loading
Loading