...

Source file src/sigs.k8s.io/cli-utils/pkg/print/table/base_test.go

Documentation: sigs.k8s.io/cli-utils/pkg/print/table

     1  // Copyright 2020 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     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