142 lines
3.6 KiB
Go
142 lines
3.6 KiB
Go
package kubernetes_test
|
|
|
|
import (
|
|
"net/http"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/expr-lang/expr"
|
|
"github.com/h2non/gock"
|
|
"github.com/linuxsuren/api-testing/pkg/runner/kubernetes"
|
|
"github.com/linuxsuren/api-testing/pkg/util"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestKubernetesValidatorFunc(t *testing.T) {
|
|
os.Setenv("KUBERNETES_SERVER", urlFoo)
|
|
os.Setenv("KUBERNETES_TOKEN", "token")
|
|
gock.InterceptClient(kubernetes.GetClient())
|
|
defer gock.RestoreClient(http.DefaultClient)
|
|
defer gock.Off()
|
|
|
|
tests := []struct {
|
|
name string
|
|
prepare func()
|
|
expression string
|
|
expectBool bool
|
|
expectErr bool
|
|
}{{
|
|
name: "pod exist expr",
|
|
prepare: preparePod,
|
|
expression: `pod('ns', 'foo').Exist()`,
|
|
expectBool: true,
|
|
}, {
|
|
name: "pod expectField expr",
|
|
prepare: preparePod,
|
|
expression: `pod('ns', 'foo').ExpectField('pod', 'kind')`,
|
|
expectBool: true,
|
|
}, {
|
|
name: "pod expectField expr, not match",
|
|
prepare: preparePod,
|
|
expression: `pod('ns', 'foo').ExpectField('pods', 'kind')`,
|
|
expectBool: false,
|
|
}, {
|
|
name: "pod expectField expr, not find field",
|
|
prepare: preparePod,
|
|
expression: `pod('ns', 'foo').ExpectField('pods', 'kinds')`,
|
|
expectBool: false,
|
|
}, {
|
|
name: "no enough params",
|
|
expression: `k8s('crd')`,
|
|
expectBool: false,
|
|
expectErr: true,
|
|
}, {
|
|
name: "crd",
|
|
expression: `k8s({"kind":"vms","group":"bar","version":"v2"}, "ns", "foo").Exist()`,
|
|
prepare: prepareCRDVM,
|
|
expectBool: true,
|
|
}, {
|
|
name: "deploy",
|
|
expression: `k8s("deployments", "ns", "foo").Exist()`,
|
|
prepare: prepareDeploy,
|
|
expectBool: true,
|
|
}, {
|
|
name: "statefulset",
|
|
expression: `k8s("statefulsets", "ns", "foo").Exist()`,
|
|
prepare: prepareStatefulset,
|
|
expectBool: true,
|
|
}, {
|
|
name: "daemonset",
|
|
expression: `k8s("daemonsets", "ns", "foo").Exist()`,
|
|
prepare: prepareDaemonset,
|
|
expectBool: true,
|
|
}, {
|
|
name: "daemonset count",
|
|
expression: `k8s("daemonsets", "ns", "foo").ExpectCount(0)`,
|
|
prepare: prepareDaemonset,
|
|
expectBool: true,
|
|
}, {
|
|
name: "no kind",
|
|
expression: `k8s({"foo": "bar"}, "ns", "foo").Exist()`,
|
|
expectErr: true,
|
|
}}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
tt.prepare = util.MakeSureNotNil(tt.prepare)
|
|
tt.prepare()
|
|
vm, err := expr.Compile(tt.expression, kubernetes.KubernetesValidatorFunc(),
|
|
kubernetes.PodValidatorFunc())
|
|
assert.Nil(t, err)
|
|
|
|
result, err := expr.Run(vm, expr.Env(tt))
|
|
assert.Equal(t, tt.expectErr, err != nil)
|
|
if err == nil {
|
|
assert.Equal(t, tt.expectBool, result)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func preparePod() {
|
|
gock.New(urlFoo).
|
|
Get("/api/v1/namespaces/ns/pods/foo").
|
|
MatchHeader(util.Authorization, defaultToken).
|
|
Reply(http.StatusOK).
|
|
JSON(`{"kind":"pod"}`)
|
|
}
|
|
|
|
func prepareDeploy() {
|
|
gock.New(urlFoo).
|
|
Get("/apis/apps/v1/namespaces/ns/deployments/foo").
|
|
MatchHeader(util.Authorization, defaultToken).
|
|
Reply(http.StatusOK).
|
|
JSON(`{"kind":"deploy"}`)
|
|
}
|
|
|
|
func prepareStatefulset() {
|
|
gock.New(urlFoo).
|
|
Get("/apis/apps/v1/namespaces/ns/statefulsets/foo").
|
|
MatchHeader(util.Authorization, defaultToken).
|
|
Reply(http.StatusOK).
|
|
JSON(`{"kind":"statefulset"}`)
|
|
}
|
|
|
|
func prepareDaemonset() {
|
|
gock.New(urlFoo).
|
|
Get("/apis/apps/v1/namespaces/ns/daemonsets/foo").
|
|
MatchHeader(util.Authorization, defaultToken).
|
|
Reply(http.StatusOK).
|
|
JSON(`{"kind":"daemonset","items":[]}`)
|
|
}
|
|
|
|
func prepareCRDVM() {
|
|
gock.New(urlFoo).
|
|
Get("/apis/bar/v2/namespaces/ns/vms/foo").
|
|
MatchHeader(util.Authorization, defaultToken).
|
|
Reply(http.StatusOK).
|
|
JSON(`{"kind":"vm"}`)
|
|
}
|
|
|
|
const urlFoo = "http://foo"
|
|
const defaultToken = "Bearer token"
|