Files
opentf/internal/addrs/output_value_test.go
Mikel Olasagasti Uranga 66765bdab3 Fix: Ensure constant format strings in fmt and printf calls
Go 1.24 introduces stricter checks for format string validation.
This commit fixes instances where non-constant format strings were
used in calls to functions like `fmt.Errorf`, `fmt.Printf`, and similar.

Changes include:
- Replacing dynamically constructed strings passed as format strings
with constant format strings.
- Refactoring `fmt.Sprintf` calls to ensure the format string matches
the number of arguments provided.
- Simplifying redundant formatting and ensuring compliance with Go
1.24's stricter `vet` tool checks.

This update ensures compatibility with Go 1.24 and prevents potential
runtime errors caused by misinterpreted dynamic format strings.

Resolves #2389

Signed-off-by: Mikel Olasagasti Uranga <mikel@olasagasti.info>
Co-authored-by: Martin Atkins <mart@degeneration.co.uk>
Signed-off-by: Martin Atkins <mart@degeneration.co.uk>
2025-02-26 11:33:43 -08:00

137 lines
3.0 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 addrs
import (
"fmt"
"strings"
"testing"
"github.com/go-test/deep"
)
func TestAbsOutputValueInstanceEqual_true(t *testing.T) {
foo, diags := ParseModuleInstanceStr("module.foo")
if len(diags) > 0 {
t.Fatalf("unexpected diags: %s", diags.Err())
}
foobar, diags := ParseModuleInstanceStr("module.foo[1].module.bar")
if len(diags) > 0 {
t.Fatalf("unexpected diags: %s", diags.Err())
}
ovs := []AbsOutputValue{
foo.OutputValue("a"),
foobar.OutputValue("b"),
}
for _, r := range ovs {
t.Run(r.String(), func(t *testing.T) {
if !r.Equal(r) {
t.Fatalf("expected %#v to be equal to itself", r)
}
})
}
}
func TestAbsOutputValueInstanceEqual_false(t *testing.T) {
foo, diags := ParseModuleInstanceStr("module.foo")
if len(diags) > 0 {
t.Fatalf("unexpected diags: %s", diags.Err())
}
foobar, diags := ParseModuleInstanceStr("module.foo[1].module.bar")
if len(diags) > 0 {
t.Fatalf("unexpected diags: %s", diags.Err())
}
testCases := []struct {
left AbsOutputValue
right AbsOutputValue
}{
{
foo.OutputValue("a"),
foo.OutputValue("b"),
},
{
foo.OutputValue("a"),
foobar.OutputValue("a"),
},
}
for _, tc := range testCases {
t.Run(fmt.Sprintf("%s = %s", tc.left, tc.right), func(t *testing.T) {
if tc.left.Equal(tc.right) {
t.Fatalf("expected %#v not to be equal to %#v", tc.left, tc.right)
}
if tc.right.Equal(tc.left) {
t.Fatalf("expected %#v not to be equal to %#v", tc.right, tc.left)
}
})
}
}
func TestParseAbsOutputValueStr(t *testing.T) {
tests := map[string]struct {
want AbsOutputValue
wantErr string
}{
"module.foo": {
wantErr: "An output name is required",
},
"module.foo.output": {
wantErr: "An output name is required",
},
"module.foo.boop.beep": {
wantErr: "Output address must start with \"output.\"",
},
"module.foo.output[0]": {
wantErr: "An output name is required",
},
"output": {
wantErr: "An output name is required",
},
"output[0]": {
wantErr: "An output name is required",
},
"output.boop": {
want: AbsOutputValue{
Module: RootModuleInstance,
OutputValue: OutputValue{
Name: "boop",
},
},
},
"module.foo.output.beep": {
want: AbsOutputValue{
Module: mustParseModuleInstanceStr("module.foo"),
OutputValue: OutputValue{
Name: "beep",
},
},
},
}
for input, tc := range tests {
t.Run(input, func(t *testing.T) {
got, diags := ParseAbsOutputValueStr(input)
for _, problem := range deep.Equal(got, tc.want) {
t.Errorf("%s", problem)
}
if len(diags) > 0 {
gotErr := diags.Err().Error()
if tc.wantErr == "" {
t.Errorf("got error, expected success: %s", gotErr)
} else if !strings.Contains(gotErr, tc.wantErr) {
t.Errorf("unexpected error\n got: %s\nwant: %s", gotErr, tc.wantErr)
}
} else {
if tc.wantErr != "" {
t.Errorf("got success, expected error: %s", tc.wantErr)
}
}
})
}
}