opentofu/internal/command/views/graph_test.go
Andrei Ciobanu 866b067c0d
Some checks are pending
build / Build for freebsd_386 (push) Waiting to run
build / Build for linux_386 (push) Waiting to run
build / Build for openbsd_386 (push) Waiting to run
build / Build for windows_386 (push) Waiting to run
build / Build for freebsd_amd64 (push) Waiting to run
build / Build for linux_amd64 (push) Waiting to run
build / Build for openbsd_amd64 (push) Waiting to run
build / Build for solaris_amd64 (push) Waiting to run
build / Build for windows_amd64 (push) Waiting to run
build / Build for freebsd_arm (push) Waiting to run
build / Build for linux_arm (push) Waiting to run
build / Build for linux_arm64 (push) Waiting to run
build / Build for darwin_amd64 (push) Waiting to run
build / Build for darwin_arm64 (push) Waiting to run
build / End-to-end Tests for linux_386 (push) Waiting to run
build / End-to-end Tests for windows_386 (push) Waiting to run
build / End-to-end Tests for darwin_amd64 (push) Waiting to run
build / End-to-end Tests for linux_amd64 (push) Waiting to run
build / End-to-end Tests for windows_amd64 (push) Waiting to run
Quick Checks / List files changed for pull request (push) Waiting to run
Quick Checks / Unit tests for linux_386 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_amd64 (push) Blocked by required conditions
Quick Checks / Unit tests for windows_amd64 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_arm (push) Blocked by required conditions
Quick Checks / Unit tests for darwin_arm64 (push) Blocked by required conditions
Quick Checks / Unit tests for linux_arm64 (push) Blocked by required conditions
Quick Checks / Race Tests (push) Blocked by required conditions
Quick Checks / End-to-end Tests (push) Blocked by required conditions
Quick Checks / Code Consistency Checks (push) Blocked by required conditions
Quick Checks / License Checks (push) Waiting to run
Website checks / List files changed for pull request (push) Waiting to run
Website checks / Build (push) Blocked by required conditions
Website checks / Test Installation Instructions (push) Blocked by required conditions
Unify patterns across the refactored commands (#3941)
Signed-off-by: Andrei Ciobanu <andrei.ciobanu@opentofu.org>
2026-03-26 17:19:27 +02:00

107 lines
3 KiB
Go

// Copyright (c) The OpenTofu Authors
// SPDX-License-Identifier: MPL-2.0
// Copyright (c) 2023 HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package views
import (
"testing"
"github.com/google/go-cmp/cmp"
"github.com/opentofu/opentofu/internal/tfdiags"
)
func TestGraphView(t *testing.T) {
tests := map[string]struct {
viewCall func(graph Graph)
wantStdout string
wantStderr string
}{
"output graph": {
viewCall: func(graph Graph) {
graph.Output(`digraph {
compound = "true"
newrank = "true"
subgraph "root" {
"[root] provider.aws" [label = "provider.aws", shape = "diamond"]
}
}`)
},
wantStdout: `digraph {
compound = "true"
newrank = "true"
subgraph "root" {
"[root] provider.aws" [label = "provider.aws", shape = "diamond"]
}
}
`,
wantStderr: "",
},
"error unsupported local op": {
viewCall: func(graph Graph) {
graph.ErrorUnsupportedLocalOp()
},
wantStdout: "",
wantStderr: `
Error: The configured backend doesn't support this operation
The "backend" in OpenTofu defines how OpenTofu operates. The default backend
performs all operations locally on your machine. Your configuration is
configured to use a non-local backend. This backend doesn't support this
operation.
`,
},
"diagnostics warning": {
viewCall: func(graph Graph) {
diags := tfdiags.Diagnostics{
tfdiags.Sourceless(tfdiags.Warning, "A warning occurred", "This is a warning message"),
}
graph.Diagnostics(diags)
},
wantStdout: withNewline("\nWarning: A warning occurred\n\nThis is a warning message"),
wantStderr: "",
},
"diagnostics error": {
viewCall: func(graph Graph) {
diags := tfdiags.Diagnostics{
tfdiags.Sourceless(tfdiags.Error, "An error occurred", "This is an error message"),
}
graph.Diagnostics(diags)
},
wantStdout: "",
wantStderr: withNewline("\nError: An error occurred\n\nThis is an error message"),
},
"diagnostics multiple": {
viewCall: func(graph Graph) {
diags := tfdiags.Diagnostics{
tfdiags.Sourceless(tfdiags.Warning, "First warning", "This is the first warning"),
tfdiags.Sourceless(tfdiags.Error, "An error", "This is an error"),
tfdiags.Sourceless(tfdiags.Warning, "Second warning", "This is the second warning"),
}
graph.Diagnostics(diags)
},
wantStdout: withNewline("\nWarning: First warning\n\nThis is the first warning\n\nWarning: Second warning\n\nThis is the second warning"),
wantStderr: withNewline("\nError: An error\n\nThis is an error"),
},
}
for name, tc := range tests {
t.Run(name, func(t *testing.T) {
testGraphHuman(t, tc.viewCall, tc.wantStdout, tc.wantStderr)
})
}
}
func testGraphHuman(t *testing.T, call func(graph Graph), wantStdout, wantStderr string) {
view, done := testView(t)
graphView := NewGraph(view)
call(graphView)
output := done(t)
if diff := cmp.Diff(wantStderr, output.Stderr()); diff != "" {
t.Errorf("invalid stderr (-want, +got):\n%s", diff)
}
if diff := cmp.Diff(wantStdout, output.Stdout()); diff != "" {
t.Errorf("invalid stdout (-want, +got):\n%s", diff)
}
}