1
2
3
4 package table
5
6 import (
7 "fmt"
8 "io"
9 "strings"
10 "testing"
11
12 "github.com/stretchr/testify/assert"
13 "k8s.io/apimachinery/pkg/runtime/schema"
14 "k8s.io/cli-runtime/pkg/genericclioptions"
15 pe "sigs.k8s.io/cli-utils/pkg/kstatus/polling/event"
16 "sigs.k8s.io/cli-utils/pkg/object"
17 )
18
19 var (
20 endColumnDef = ColumnDef{
21 ColumnName: "end",
22 ColumnHeader: "END",
23 ColumnWidth: 3,
24 PrintResourceFunc: func(w io.Writer, width int, r Resource) (i int,
25 err error) {
26 return fmt.Fprint(w, "end")
27 },
28 }
29 )
30
31 func TestBaseTablePrinter_PrintTable(t *testing.T) {
32 testCases := map[string]struct {
33 columnDefinitions []ColumnDefinition
34 resources []Resource
35 expectedOutput string
36 }{
37 "no resources": {
38 columnDefinitions: []ColumnDefinition{
39 MustColumn("resource"),
40 endColumnDef,
41 },
42 resources: []Resource{},
43 expectedOutput: `
44 RESOURCE END
45 `,
46 },
47 "with resource": {
48 columnDefinitions: []ColumnDefinition{
49 MustColumn("resource"),
50 endColumnDef,
51 },
52 resources: []Resource{
53 &fakeResource{
54 resourceStatus: &pe.ResourceStatus{
55 Identifier: object.ObjMetadata{
56 Namespace: "default",
57 Name: "Foo",
58 GroupKind: schema.GroupKind{
59 Group: "apps",
60 Kind: "Deployment",
61 },
62 },
63 },
64 },
65 },
66 expectedOutput: `
67 RESOURCE END
68 Deployment/Foo end
69 `,
70 },
71 "sub resources": {
72 columnDefinitions: []ColumnDefinition{
73 MustColumn("resource"),
74 endColumnDef,
75 },
76 resources: []Resource{
77 &fakeResource{
78 resourceStatus: &pe.ResourceStatus{
79 Identifier: object.ObjMetadata{
80 Namespace: "default",
81 Name: "Foo",
82 GroupKind: schema.GroupKind{
83 Group: "apps",
84 Kind: "Deployment",
85 },
86 },
87 GeneratedResources: []*pe.ResourceStatus{
88 {
89 Identifier: object.ObjMetadata{
90 Namespace: "default",
91 Name: "Bar",
92 GroupKind: schema.GroupKind{
93 Group: "apps",
94 Kind: "ReplicaSet",
95 },
96 },
97 },
98 },
99 },
100 },
101 },
102 expectedOutput: `
103 RESOURCE END
104 Deployment/Foo end
105 └─ ReplicaSet/Bar end
106 `,
107 },
108 "trim long content": {
109 columnDefinitions: []ColumnDefinition{
110 MustColumn("resource"),
111 endColumnDef,
112 },
113 resources: []Resource{
114 &fakeResource{
115 resourceStatus: &pe.ResourceStatus{
116 Identifier: object.ObjMetadata{
117 Namespace: "default",
118 Name: "VeryLongNameThatShouldBeTrimmed",
119 GroupKind: schema.GroupKind{
120 Group: "apps",
121 Kind: "Deployment",
122 },
123 },
124 },
125 },
126 },
127 expectedOutput: `
128 RESOURCE END
129 Deployment/VeryLongNameThatShouldBeTrimm end
130 `,
131 },
132 }
133
134 for tn, tc := range testCases {
135 t.Run(tn, func(t *testing.T) {
136 ioStreams, _, outBuffer, _ := genericclioptions.NewTestIOStreams()
137
138 printer := &BaseTablePrinter{
139 IOStreams: ioStreams,
140 Columns: tc.columnDefinitions,
141 }
142
143 resourceStates := &fakeResourceStates{
144 resources: tc.resources,
145 }
146
147 printer.PrintTable(resourceStates, 0)
148
149 assert.Equal(t,
150 strings.TrimSpace(tc.expectedOutput),
151 strings.TrimSpace(outBuffer.String()))
152 })
153 }
154 }
155
156 type fakeResourceStates struct {
157 resources []Resource
158 }
159
160 func (r *fakeResourceStates) Resources() []Resource {
161 return r.resources
162 }
163
164 func (r *fakeResourceStates) Error() error {
165 return nil
166 }
167
168 type fakeResource struct {
169 resourceStatus *pe.ResourceStatus
170 }
171
172 func (r *fakeResource) Identifier() object.ObjMetadata {
173 return r.resourceStatus.Identifier
174 }
175
176 func (r *fakeResource) ResourceStatus() *pe.ResourceStatus {
177 return r.resourceStatus
178 }
179
180 func (r *fakeResource) SubResources() []Resource {
181 var resources []Resource
182 for _, res := range r.resourceStatus.GeneratedResources {
183 resources = append(resources, &fakeResource{
184 resourceStatus: res,
185 })
186 }
187 return resources
188 }
189
View as plain text