airshipctl/pkg/cluster/expression_test.go
Ian Howell 77ebd891a2 Cluster Status library tools
This adds the StatusMap type, which can be used to gather the Status of
a given kubernetes resource. A StatusMap can be created from a
document.Bundle and represents all possible Statuses for all
CustomResources, and the conditions that must be met for those statuses
to be valid.

Relates-To: #73
Change-Id: If2cba0bb9890fe28feff0c890bb8036489196fc4
2020-03-27 16:09:15 -05:00

89 lines
2.1 KiB
Go

package cluster_test
import (
"testing"
"github.com/stretchr/testify/assert"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"opendev.org/airship/airshipctl/pkg/cluster"
)
func TestMatch(t *testing.T) {
tests := map[string]struct {
expression cluster.Expression
object *unstructured.Unstructured
expected bool
expectedErr error
}{
"healthy-object-matches-healthy": {
expression: cluster.Expression{
Condition: `@.status.health=="ok"`,
},
object: &unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "testversion/v1",
"kind": "TestObject",
"metadata": map[string]interface{}{
"name": "test-object",
},
"status": map[string]interface{}{
"health": "ok",
},
},
},
expected: true,
},
"unhealthy-object-matches-unhealthy": {
expression: cluster.Expression{
Condition: `@.status.health=="ok"`,
},
object: &unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "testversion/v1",
"kind": "TestObject",
"metadata": map[string]interface{}{
"name": "test-object",
},
"status": map[string]interface{}{
"health": "not-ok",
},
},
},
expected: false,
},
"invalid-json-path-returns-error": {
expression: cluster.Expression{
Condition: `invalid JSON Path]`,
},
object: &unstructured.Unstructured{},
expectedErr: cluster.ErrInvalidStatusCheck{
What: `unable to parse jsonpath "invalid JSON Path]": ` +
`unrecognized character in action: U+005D ']'`,
},
},
"malformed-object-returns-error": {
expression: cluster.Expression{
Condition: `@.status.health=="ok"`,
},
object: &unstructured.Unstructured{},
expectedErr: cluster.ErrInvalidStatusCheck{
What: `failed to execute condition "@.status.health==\"ok\"" ` +
`on object &{map[]}: status is not found`,
},
},
}
for testName, tt := range tests {
tt := tt
t.Run(testName, func(t *testing.T) {
result, err := tt.expression.Match(tt.object)
assert.Equal(t, tt.expectedErr, err)
if tt.expectedErr == nil {
assert.Equal(t, tt.expected, result)
}
})
}
}