d4e176ba09
Also adding some common resource validation error types to the internal/resource package.
125 lines
2.9 KiB
Go
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))
|
|
})
|
|
}
|
|
}
|