mirror of
https://github.com/rancher/steve.git
synced 2025-08-11 19:21:36 +00:00
Fix returning error for empty ingresses.spec.rules.host (#642)
* Fix returning error for empty ingresses.spec.rules.host * Fix error format * Use require instead of assert
This commit is contained in:
parent
18ac23afe7
commit
1e5018e31a
@ -57,7 +57,7 @@ const (
|
|||||||
)`
|
)`
|
||||||
createFieldsIndexFmt = `CREATE INDEX "%s_%s_index" ON "%s_fields"("%s")`
|
createFieldsIndexFmt = `CREATE INDEX "%s_%s_index" ON "%s_fields"("%s")`
|
||||||
|
|
||||||
failedToGetFromSliceFmt = "[listoption indexer] failed to get subfield [%s] from slice items: %w"
|
failedToGetFromSliceFmt = "[listoption indexer] failed to get subfield [%s] from slice items"
|
||||||
|
|
||||||
createLabelsTableFmt = `CREATE TABLE IF NOT EXISTS "%s_labels" (
|
createLabelsTableFmt = `CREATE TABLE IF NOT EXISTS "%s_labels" (
|
||||||
key TEXT NOT NULL REFERENCES "%s"(key) ON DELETE CASCADE,
|
key TEXT NOT NULL REFERENCES "%s"(key) ON DELETE CASCADE,
|
||||||
@ -903,13 +903,19 @@ func getField(a any, field string) (any, error) {
|
|||||||
for index, v := range t {
|
for index, v := range t {
|
||||||
itemVal, ok := v.(map[string]interface{})
|
itemVal, ok := v.(map[string]interface{})
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf(failedToGetFromSliceFmt, subField, err)
|
return nil, fmt.Errorf(failedToGetFromSliceFmt, subField)
|
||||||
}
|
}
|
||||||
itemStr, ok := itemVal[subField].(string)
|
|
||||||
if !ok {
|
_, found := itemVal[subField]
|
||||||
return nil, fmt.Errorf(failedToGetFromSliceFmt, subField, err)
|
if found {
|
||||||
|
itemStr, ok := itemVal[subField].(string)
|
||||||
|
if !ok {
|
||||||
|
return nil, fmt.Errorf(failedToGetFromSliceFmt, subField)
|
||||||
|
}
|
||||||
|
result[index] = itemStr
|
||||||
|
} else {
|
||||||
|
result[index] = ""
|
||||||
}
|
}
|
||||||
result[index] = itemStr
|
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
@ -11,14 +11,15 @@ import (
|
|||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/rancher/steve/pkg/sqlcache/sqltypes"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/rancher/steve/pkg/sqlcache/db"
|
"github.com/rancher/steve/pkg/sqlcache/db"
|
||||||
"github.com/rancher/steve/pkg/sqlcache/partition"
|
"github.com/rancher/steve/pkg/sqlcache/partition"
|
||||||
|
"github.com/rancher/steve/pkg/sqlcache/sqltypes"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/mock/gomock"
|
"go.uber.org/mock/gomock"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
@ -1790,3 +1791,163 @@ func TestBuildSortLabelsClause(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetField(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
obj any
|
||||||
|
field string
|
||||||
|
expectedResult any
|
||||||
|
expectedErr bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "simple",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"foo": "bar",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "foo",
|
||||||
|
expectedResult: "bar",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "nested",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"foo": map[string]any{
|
||||||
|
"bar": "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "foo.bar",
|
||||||
|
expectedResult: "baz",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "array",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"theList": []any{
|
||||||
|
"foo", "bar", "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "theList[1]",
|
||||||
|
expectedResult: "bar",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "array of object",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"theList": []any{
|
||||||
|
map[string]any{
|
||||||
|
"name": "foo",
|
||||||
|
},
|
||||||
|
map[string]any{
|
||||||
|
"name": "bar",
|
||||||
|
},
|
||||||
|
map[string]any{
|
||||||
|
"name": "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "theList.name",
|
||||||
|
expectedResult: []string{"foo", "bar", "baz"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "annotation",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"annotations": map[string]any{
|
||||||
|
"with.dot.in.it/and-slash": "foo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "annotations[with.dot.in.it/and-slash]",
|
||||||
|
expectedResult: "foo",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "field not found",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"spec": map[string]any{
|
||||||
|
"rules": []any{
|
||||||
|
map[string]any{},
|
||||||
|
map[string]any{
|
||||||
|
"host": "example.com",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "spec.rules.host",
|
||||||
|
expectedResult: []string{"", "example.com"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "array index invalid",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"theList": []any{
|
||||||
|
"foo", "bar", "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "theList[a]",
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "array index out of bound",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"theList": []any{
|
||||||
|
"foo", "bar", "baz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "theList[3]",
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid array",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"spec": map[string]any{
|
||||||
|
"rules": []any{
|
||||||
|
1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "spec.rules.host",
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "invalid array nested",
|
||||||
|
obj: &unstructured.Unstructured{
|
||||||
|
Object: map[string]any{
|
||||||
|
"spec": map[string]any{
|
||||||
|
"rules": []any{
|
||||||
|
map[string]any{
|
||||||
|
"host": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
field: "spec.rules.host",
|
||||||
|
expectedErr: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
result, err := getField(test.obj, test.field)
|
||||||
|
if test.expectedErr {
|
||||||
|
require.Error(t, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, test.expectedResult, result)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user