123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /*
- Copyright 2018 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package get
- import (
- "bytes"
- "fmt"
- "io/ioutil"
- "os"
- "strings"
- "testing"
- corev1 "k8s.io/api/core/v1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/cli-runtime/pkg/genericclioptions"
- )
- func TestPrinterSupportsExpectedCustomColumnFormats(t *testing.T) {
- testObject := &corev1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}}
- customColumnsFile, err := ioutil.TempFile("", "printers_jsonpath_flags")
- if err != nil {
- t.Fatalf("unexpected error: %v", err)
- }
- defer func(tempFile *os.File) {
- tempFile.Close()
- os.Remove(tempFile.Name())
- }(customColumnsFile)
- fmt.Fprintf(customColumnsFile, "NAME\n.metadata.name")
- testCases := []struct {
- name string
- outputFormat string
- templateArg string
- expectedError string
- expectedParseError string
- expectedOutput string
- expectNoMatch bool
- }{
- {
- name: "valid output format also containing the custom-columns argument succeeds",
- outputFormat: "custom-columns=NAME:.metadata.name",
- expectedOutput: "foo",
- },
- {
- name: "valid output format and no --template argument results in an error",
- outputFormat: "custom-columns",
- expectedError: "custom-columns format specified but no custom columns given",
- },
- {
- name: "valid output format and --template argument succeeds",
- outputFormat: "custom-columns",
- templateArg: "NAME:.metadata.name",
- expectedOutput: "foo",
- },
- {
- name: "custom-columns template file should match, and successfully return correct value",
- outputFormat: "custom-columns-file",
- templateArg: customColumnsFile.Name(),
- expectedOutput: "foo",
- },
- {
- name: "valid output format and invalid --template argument results in a parsing error from the printer",
- outputFormat: "custom-columns",
- templateArg: "invalid",
- expectedError: "unexpected custom-columns spec: invalid, expected <header>:<json-path-expr>",
- },
- {
- name: "no printer is matched on an invalid outputFormat",
- outputFormat: "invalid",
- expectNoMatch: true,
- },
- {
- name: "custom-columns printer should not match on any other format supported by another printer",
- outputFormat: "go-template",
- expectNoMatch: true,
- },
- }
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- printFlags := CustomColumnsPrintFlags{
- TemplateArgument: tc.templateArg,
- }
- p, err := printFlags.ToPrinter(tc.outputFormat)
- if tc.expectNoMatch {
- if !genericclioptions.IsNoCompatiblePrinterError(err) {
- t.Fatalf("expected no printer matches for output format %q", tc.outputFormat)
- }
- return
- }
- if genericclioptions.IsNoCompatiblePrinterError(err) {
- t.Fatalf("expected to match template printer for output format %q", tc.outputFormat)
- }
- if len(tc.expectedError) > 0 {
- if err == nil || !strings.Contains(err.Error(), tc.expectedError) {
- t.Errorf("expecting error %q, got %v", tc.expectedError, err)
- }
- return
- }
- if err != nil {
- t.Fatalf("unexpected error: %v", err)
- }
- out := bytes.NewBuffer([]byte{})
- err = p.PrintObj(testObject, out)
- if len(tc.expectedParseError) > 0 {
- if err == nil || !strings.Contains(err.Error(), tc.expectedParseError) {
- t.Errorf("expecting error %q, got %v", tc.expectedError, err)
- }
- return
- }
- if err != nil {
- t.Errorf("unexpected error: %v", err)
- }
- if !strings.Contains(out.String(), tc.expectedOutput) {
- t.Errorf("unexpected output: expecting %q, got %q", tc.expectedOutput, out.String())
- }
- })
- }
- }
|