blob: 00c5790bf200202dc934ff8cfe2f7c0834263f3c [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package rpcapi
import (
"fmt"
"testing"
"github.com/hashicorp/hcl/v2"
"github.com/hashicorp/terraform/internal/rpcapi/terraform1"
"github.com/hashicorp/terraform/internal/tfdiags"
"github.com/google/go-cmp/cmp"
"google.golang.org/protobuf/testing/protocmp"
)
func TestDiagnosticsToProto(t *testing.T) {
tests := map[string]struct {
Input tfdiags.Diagnostics
Want []*terraform1.Diagnostic
}{
"nil": {
Input: nil,
Want: nil,
},
"empty": {
Input: make(tfdiags.Diagnostics, 0, 5),
Want: nil,
},
"sourceless": {
Input: tfdiags.Diagnostics{
tfdiags.Sourceless(
tfdiags.Error,
"Something annoying",
"But I'll get over it.",
),
},
Want: []*terraform1.Diagnostic{
{
Severity: terraform1.Diagnostic_ERROR,
Summary: "Something annoying",
Detail: "But I'll get over it.",
},
},
},
"warning": {
Input: tfdiags.Diagnostics{
tfdiags.Sourceless(
tfdiags.Warning,
"I have a very bad feeling about this",
"That's no moon; it's a space station.",
),
},
Want: []*terraform1.Diagnostic{
{
Severity: terraform1.Diagnostic_WARNING,
Summary: "I have a very bad feeling about this",
Detail: "That's no moon; it's a space station.",
},
},
},
"with subject": {
Input: tfdiags.Diagnostics{}.Append(
&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Something annoying",
Detail: "But I'll get over it.",
Subject: &hcl.Range{
Filename: "git::https://example.com/foo.git",
Start: hcl.InitialPos,
End: hcl.Pos{
Byte: 2,
Line: 3,
Column: 4,
},
},
},
),
Want: []*terraform1.Diagnostic{
{
Severity: terraform1.Diagnostic_ERROR,
Summary: "Something annoying",
Detail: "But I'll get over it.",
Subject: &terraform1.SourceRange{
SourceAddr: "git::https://example.com/foo.git",
Start: &terraform1.SourcePos{
Byte: 0,
Line: 1,
Column: 1,
},
End: &terraform1.SourcePos{
Byte: 2,
Line: 3,
Column: 4,
},
},
},
},
},
"with subject and context": {
Input: tfdiags.Diagnostics{}.Append(
&hcl.Diagnostic{
Severity: hcl.DiagError,
Summary: "Something annoying",
Detail: "But I'll get over it.",
Subject: &hcl.Range{
Filename: "git::https://example.com/foo.git",
Start: hcl.InitialPos,
End: hcl.Pos{
Byte: 2,
Line: 3,
Column: 4,
},
},
Context: &hcl.Range{
Filename: "git::https://example.com/foo.git",
Start: hcl.InitialPos,
End: hcl.Pos{
Byte: 5,
Line: 6,
Column: 7,
},
},
},
),
Want: []*terraform1.Diagnostic{
{
Severity: terraform1.Diagnostic_ERROR,
Summary: "Something annoying",
Detail: "But I'll get over it.",
Subject: &terraform1.SourceRange{
SourceAddr: "git::https://example.com/foo.git",
Start: &terraform1.SourcePos{
Byte: 0,
Line: 1,
Column: 1,
},
End: &terraform1.SourcePos{
Byte: 2,
Line: 3,
Column: 4,
},
},
Context: &terraform1.SourceRange{
SourceAddr: "git::https://example.com/foo.git",
Start: &terraform1.SourcePos{
Byte: 0,
Line: 1,
Column: 1,
},
End: &terraform1.SourcePos{
Byte: 5,
Line: 6,
Column: 7,
},
},
},
},
},
"with only severity and summary": {
// This is the kind of degenerate diagnostic we produce when
// we're just naively wrapping a Go error, as tends to arise
// in providers that are just passing through their SDK errors.
Input: tfdiags.Diagnostics{}.Append(
fmt.Errorf("oh no bad"),
),
Want: []*terraform1.Diagnostic{
{
Severity: terraform1.Diagnostic_ERROR,
Summary: "oh no bad",
},
},
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
got := diagnosticsToProto(test.Input)
want := test.Want
if diff := cmp.Diff(want, got, protocmp.Transform()); diff != "" {
t.Errorf("wrong result\n%s", diff)
}
})
}
}