mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Test humanreadable table output
This commit is contained in:
parent
fe339d2420
commit
ead86cf350
@ -18,26 +18,58 @@ package get
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
corev1 "k8s.io/api/core/v1"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
"k8s.io/cli-runtime/pkg/genericclioptions"
|
"k8s.io/cli-runtime/pkg/genericclioptions"
|
||||||
api "k8s.io/kubernetes/pkg/apis/core"
|
api "k8s.io/kubernetes/pkg/apis/core"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestHumanReadablePrinterSupportsExpectedOptions(t *testing.T) {
|
func TestHumanReadablePrinterSupportsExpectedOptions(t *testing.T) {
|
||||||
testObject := &api.Pod{ObjectMeta: metav1.ObjectMeta{
|
testTable := &metav1.Table{
|
||||||
Name: "foo",
|
ColumnDefinitions: []metav1.TableColumnDefinition{
|
||||||
Labels: map[string]string{
|
{Name: "Name", Type: "string", Format: "name"},
|
||||||
"l1": "value",
|
{Name: "Ready", Type: "string", Format: ""},
|
||||||
|
{Name: "Status", Type: "string", Format: ""},
|
||||||
|
{Name: "Restarts", Type: "integer", Format: ""},
|
||||||
|
{Name: "Age", Type: "string", Format: ""},
|
||||||
|
{Name: "IP", Type: "string", Format: "", Priority: 1},
|
||||||
|
{Name: "Node", Type: "string", Format: "", Priority: 1},
|
||||||
|
{Name: "Nominated Node", Type: "string", Format: "", Priority: 1},
|
||||||
|
{Name: "Readiness Gates", Type: "string", Format: "", Priority: 1},
|
||||||
},
|
},
|
||||||
}}
|
Rows: []metav1.TableRow{{
|
||||||
|
Object: runtime.RawExtension{
|
||||||
|
Object: &corev1.Pod{
|
||||||
|
TypeMeta: metav1.TypeMeta{APIVersion: "v1", Kind: "Pod"},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{Name: "foo", Labels: map[string]string{"l1": "value"}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Cells: []interface{}{"foo", "0/0", "", int64(0), "<unknown>", "<none>", "<none>", "<none>", "<none>"},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
testPod := &api.Pod{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: "v1",
|
||||||
|
Kind: "Pod",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Name: "foo",
|
||||||
|
Labels: map[string]string{
|
||||||
|
"l1": "value",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
|
testObject runtime.Object
|
||||||
showKind bool
|
showKind bool
|
||||||
showLabels bool
|
showLabels bool
|
||||||
|
|
||||||
@ -56,53 +88,104 @@ func TestHumanReadablePrinterSupportsExpectedOptions(t *testing.T) {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "empty output format matches a humanreadable printer",
|
name: "empty output format matches a humanreadable printer",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
|
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\nfoo\\ +0/0\\ +0\\ +<unknown>\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "empty output format matches a humanreadable printer",
|
||||||
|
testObject: testTable.DeepCopy(),
|
||||||
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\nfoo\\ +0/0\\ +0\\ +<unknown>\n",
|
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\nfoo\\ +0/0\\ +0\\ +<unknown>\n",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "\"wide\" output format prints",
|
name: "\"wide\" output format prints",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
|
outputFormat: "wide",
|
||||||
|
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\\ +IP\\ +NODE\\ +NOMINATED NODE\\ +READINESS GATES\nfoo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\\ +<none>\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "\"wide\" output format prints",
|
||||||
|
testObject: testTable.DeepCopy(),
|
||||||
outputFormat: "wide",
|
outputFormat: "wide",
|
||||||
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\\ +IP\\ +NODE\\ +NOMINATED NODE\\ +READINESS GATES\nfoo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\\ +<none>\n",
|
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\\ +IP\\ +NODE\\ +NOMINATED NODE\\ +READINESS GATES\nfoo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\\ +<none>\n",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "no-headers prints output with no headers",
|
name: "no-headers prints output with no headers",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
|
noHeaders: true,
|
||||||
|
expectedOutput: "foo\\ +0/0\\ +0\\ +<unknown>\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no-headers prints output with no headers",
|
||||||
|
testObject: testTable.DeepCopy(),
|
||||||
noHeaders: true,
|
noHeaders: true,
|
||||||
expectedOutput: "foo\\ +0/0\\ +0\\ +<unknown>\n",
|
expectedOutput: "foo\\ +0/0\\ +0\\ +<unknown>\n",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "no-headers and a \"wide\" output format prints output with no headers and additional columns",
|
name: "no-headers and a \"wide\" output format prints output with no headers and additional columns",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
|
outputFormat: "wide",
|
||||||
|
noHeaders: true,
|
||||||
|
expectedOutput: "foo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\\ +<none>\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "no-headers and a \"wide\" output format prints output with no headers and additional columns",
|
||||||
|
testObject: testTable.DeepCopy(),
|
||||||
outputFormat: "wide",
|
outputFormat: "wide",
|
||||||
noHeaders: true,
|
noHeaders: true,
|
||||||
expectedOutput: "foo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\\ +<none>\n",
|
expectedOutput: "foo\\ +0/0\\ +0\\ +<unknown>\\ +<none>\\ +<none>\\ +<none>\\ +<none>\n",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "show-kind displays the resource's kind, even when printing a single type of resource",
|
name: "show-kind displays the resource's kind, even when printing a single type of resource",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
|
showKind: true,
|
||||||
|
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\npod/foo\\ +0/0\\ +0\\ +<unknown>\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "show-kind displays the resource's kind, even when printing a single type of resource",
|
||||||
|
testObject: testTable.DeepCopy(),
|
||||||
showKind: true,
|
showKind: true,
|
||||||
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\npod/foo\\ +0/0\\ +0\\ +<unknown>\n",
|
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\npod/foo\\ +0/0\\ +0\\ +<unknown>\n",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "label-columns prints specified label values in new column",
|
name: "label-columns prints specified label values in new column",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
|
columnLabels: []string{"l1"},
|
||||||
|
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\\ +L1\nfoo\\ +0/0\\ +0\\ +<unknown>\\ +value\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "label-columns prints specified label values in new column",
|
||||||
|
testObject: testTable.DeepCopy(),
|
||||||
columnLabels: []string{"l1"},
|
columnLabels: []string{"l1"},
|
||||||
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\\ +L1\nfoo\\ +0/0\\ +0\\ +<unknown>\\ +value\n",
|
expectedOutput: "NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\\ +L1\nfoo\\ +0/0\\ +0\\ +<unknown>\\ +value\n",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "withNamespace displays an additional NAMESPACE column",
|
name: "withNamespace displays an additional NAMESPACE column",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
|
withNamespace: true,
|
||||||
|
expectedOutput: "NAMESPACE\\ +NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\n\\ +foo\\ +0/0\\ +0\\ +<unknown>\n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "withNamespace displays an additional NAMESPACE column",
|
||||||
|
testObject: testTable.DeepCopy(),
|
||||||
withNamespace: true,
|
withNamespace: true,
|
||||||
expectedOutput: "NAMESPACE\\ +NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\n\\ +foo\\ +0/0\\ +0\\ +<unknown>\n",
|
expectedOutput: "NAMESPACE\\ +NAME\\ +READY\\ +STATUS\\ +RESTARTS\\ +AGE\n\\ +foo\\ +0/0\\ +0\\ +<unknown>\n",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "no printer is matched on an invalid outputFormat",
|
name: "no printer is matched on an invalid outputFormat",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
outputFormat: "invalid",
|
outputFormat: "invalid",
|
||||||
expectNoMatch: true,
|
expectNoMatch: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "printer should not match on any other format supported by another printer",
|
name: "printer should not match on any other format supported by another printer",
|
||||||
|
testObject: testPod.DeepCopy(),
|
||||||
outputFormat: "go-template",
|
outputFormat: "go-template",
|
||||||
expectNoMatch: true,
|
expectNoMatch: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.name, func(t *testing.T) {
|
t.Run(fmt.Sprintf("%s %T", tc.name, tc.testObject), func(t *testing.T) {
|
||||||
printFlags := HumanPrintFlags{
|
printFlags := HumanPrintFlags{
|
||||||
ShowKind: &tc.showKind,
|
ShowKind: &tc.showKind,
|
||||||
ShowLabels: &tc.showLabels,
|
ShowLabels: &tc.showLabels,
|
||||||
@ -139,7 +222,7 @@ func TestHumanReadablePrinterSupportsExpectedOptions(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
out := bytes.NewBuffer([]byte{})
|
out := bytes.NewBuffer([]byte{})
|
||||||
err = p.PrintObj(testObject, out)
|
err = p.PrintObj(tc.testObject, out)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
@ -149,7 +232,7 @@ func TestHumanReadablePrinterSupportsExpectedOptions(t *testing.T) {
|
|||||||
t.Errorf("unexpected error: %v", err)
|
t.Errorf("unexpected error: %v", err)
|
||||||
}
|
}
|
||||||
if !match {
|
if !match {
|
||||||
t.Errorf("unexpected output: expecting %q, got %q", tc.expectedOutput, out.String())
|
t.Errorf("unexpected output: expecting\n%s\ngot\n%s", tc.expectedOutput, out.String())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user