1
16
17 package v2
18
19 import (
20 "bytes"
21 "encoding/json"
22 "fmt"
23 "testing"
24
25 "github.com/stretchr/testify/require"
26 "k8s.io/apimachinery/pkg/runtime/schema"
27 "k8s.io/client-go/openapi/openapitest"
28 )
29
30 var apiGroupsPath = "apis/discovery.k8s.io/v1"
31
32 var apiGroupsGVR = schema.GroupVersionResource{
33 Group: "discovery.k8s.io",
34 Version: "v1",
35 Resource: "apigroups",
36 }
37
38 func TestExplainErrors(t *testing.T) {
39 var buf bytes.Buffer
40
41
42 fakeClient := openapitest.NewFakeClient()
43 err := PrintModelDescription(nil, &buf, fakeClient, schema.GroupVersionResource{
44 Group: "test0.example.com",
45 Version: "v1",
46 Resource: "doesntmatter",
47 }, false, "unknown-format")
48 require.ErrorContains(t, err, "couldn't find resource for \"test0.example.com/v1, Resource=doesntmatter\"")
49
50
51 fakeClient.ForcedErr = fmt.Errorf("Always fails")
52 err = PrintModelDescription(nil, &buf, fakeClient, apiGroupsGVR, false, "unknown-format")
53 require.ErrorContains(t, err, "failed to fetch list of groupVersions")
54
55
56 fakeClient = openapitest.NewFakeClient()
57 forceErrorGV := openapitest.FakeGroupVersion{ForcedErr: fmt.Errorf("Always fails")}
58 fakeClient.PathsMap["apis/test1.example.com/v1"] = &forceErrorGV
59 err = PrintModelDescription(nil, &buf, fakeClient, schema.GroupVersionResource{
60 Group: "test1.example.com",
61 Version: "v1",
62 Resource: "doesntmatter",
63 }, false, "unknown-format")
64 require.ErrorContains(t, err, "failed to fetch openapi schema ")
65
66
67 parseErrorGV := openapitest.FakeGroupVersion{GVSpec: []byte(`<some invalid json!>`)}
68 fakeClient.PathsMap["apis/test2.example.com/v1"] = &parseErrorGV
69 err = PrintModelDescription(nil, &buf, fakeClient, schema.GroupVersionResource{
70 Group: "test2.example.com",
71 Version: "v1",
72 Resource: "doesntmatter",
73 }, false, "unknown-format")
74 require.ErrorContains(t, err, "failed to parse openapi schema")
75
76
77 client := openapitest.NewEmbeddedFileClient()
78 err = PrintModelDescription(nil, &buf, client, apiGroupsGVR, false, "unknown-format")
79 require.ErrorContains(t, err, "unrecognized format: unknown-format")
80 }
81
82
83
84 func TestExplainOpenAPIClient(t *testing.T) {
85 var buf bytes.Buffer
86
87 fileClient := openapitest.NewEmbeddedFileClient()
88 paths, err := fileClient.Paths()
89 require.NoError(t, err)
90 gv, found := paths[apiGroupsPath]
91 require.True(t, found)
92 discoveryBytes, err := gv.Schema("application/json")
93 require.NoError(t, err)
94
95 var doc map[string]interface{}
96 err = json.Unmarshal(discoveryBytes, &doc)
97 require.NoError(t, err)
98
99 gen := NewGenerator()
100 err = gen.AddTemplate("Context", "{{ toJson . }}")
101 require.NoError(t, err)
102
103 expectedContext := TemplateContext{
104 Document: doc,
105 GVR: apiGroupsGVR,
106 Recursive: false,
107 FieldPath: nil,
108 }
109
110 err = printModelDescriptionWithGenerator(gen, nil, &buf, fileClient, apiGroupsGVR, false, "Context")
111 require.NoError(t, err)
112
113 var actualContext TemplateContext
114 err = json.Unmarshal(buf.Bytes(), &actualContext)
115 require.NoError(t, err)
116 require.Equal(t, expectedContext, actualContext)
117 }
118
View as plain text