open-consul/internal/resource/errors_test.go
Matt Keeler d4e176ba09
Add type validations for the catalog resources (#17211)
Also adding some common resource validation error types to the internal/resource package.
2023-05-12 09:24:55 -04:00

125 lines
2.9 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package resource
import (
"errors"
"flag"
"fmt"
"os"
"path/filepath"
"testing"
"github.com/hashicorp/consul/proto-public/pbresource"
"github.com/stretchr/testify/require"
)
// update allows golden files to be updated based on the current output.
var update = flag.Bool("update", false, "update golden files")
func goldenError(t *testing.T, name string, actual string) {
t.Helper()
fpath := filepath.Join("testdata", name+".golden")
if *update {
require.NoError(t, os.WriteFile(fpath, []byte(actual), 0644))
} else {
expected, err := os.ReadFile(fpath)
require.NoError(t, err)
require.Equal(t, string(expected), actual)
}
}
func TestErrorStrings(t *testing.T) {
type testCase struct {
err error
expected string
}
fakeWrappedErr := fmt.Errorf("fake test error")
cond := &pbresource.Condition{}
cases := map[string]error{
"ErrDataParse": NewErrDataParse(cond, fakeWrappedErr),
"ErrInvalidField": ErrInvalidField{
Name: "host",
Wrapped: fakeWrappedErr,
},
"ErrInvalidListElement": ErrInvalidListElement{
Name: "addresses",
Index: 42,
Wrapped: fakeWrappedErr,
},
"ErrInvalidMapKey": ErrInvalidMapKey{
Map: "ports",
Key: "http",
Wrapped: fakeWrappedErr,
},
"ErrInvalidMapValue": ErrInvalidMapValue{
Map: "ports",
Key: "http",
Wrapped: fakeWrappedErr,
},
"ErrOwnerInvalid": ErrOwnerInvalid{
ResourceType: &pbresource.Type{Group: "foo", GroupVersion: "v1", Kind: "bar"},
OwnerType: &pbresource.Type{Group: "other", GroupVersion: "v2", Kind: "something"},
},
"ErrInvalidReferenceType": ErrInvalidReferenceType{
AllowedType: &pbresource.Type{Group: "foo", GroupVersion: "v1", Kind: "bar"},
},
"ErrMissing": ErrMissing,
"ErrEmpty": ErrEmpty,
"ErrReferenceTenancyNotEqual": ErrReferenceTenancyNotEqual,
}
for name, err := range cases {
t.Run(name, func(t *testing.T) {
goldenError(t, name, err.Error())
})
}
}
func TestErrorUnwrap(t *testing.T) {
type testCase struct {
err error
expected string
}
fakeWrappedErr := fmt.Errorf("fake test error")
cases := map[string]error{
"ErrDataParse": ErrDataParse{
TypeName: "hashicorp.consul.catalog.v1alpha1.Service",
Wrapped: fakeWrappedErr,
},
"ErrInvalidField": ErrInvalidField{
Name: "host",
Wrapped: fakeWrappedErr,
},
"ErrInvalidListElement": ErrInvalidListElement{
Name: "addresses",
Index: 42,
Wrapped: fakeWrappedErr,
},
"ErrInvalidMapKey": ErrInvalidMapKey{
Map: "ports",
Key: "http",
Wrapped: fakeWrappedErr,
},
"ErrInvalidMapValue": ErrInvalidMapValue{
Map: "ports",
Key: "http",
Wrapped: fakeWrappedErr,
},
}
for name, err := range cases {
t.Run(name, func(t *testing.T) {
require.Equal(t, fakeWrappedErr, errors.Unwrap(err))
})
}
}