Skip to content

Commit 46beb2e

Browse files
committed
🌱 crd: add integration coverage for indirect type alias resolution
Add regression coverage for #1063, ensuring CRD generation correctly resolves type aliases whose target types are defined in packages not directly imported. Align test error handling with existing parser integration tests by ignoring packages.TypeError.
1 parent 33e5fdc commit 46beb2e

5 files changed

Lines changed: 92 additions & 0 deletions

File tree

pkg/crd/parser_integration_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,58 @@ var _ = Describe("CRD Generation From Parsing to CustomResourceDefinition", func
235235
})
236236
})
237237

238+
It("should resolve type aliases to packages not directly imported", func() {
239+
By("switching into testdata to appease go modules")
240+
cwd, err := os.Getwd()
241+
Expect(err).NotTo(HaveOccurred())
242+
Expect(os.Chdir("./testdata")).To(Succeed())
243+
defer func() { Expect(os.Chdir(cwd)).To(Succeed()) }()
244+
245+
By("loading the roots")
246+
pkgs, err := loader.LoadRoots("./typealiasindirect/rootpkg")
247+
Expect(err).NotTo(HaveOccurred())
248+
Expect(pkgs).To(HaveLen(1))
249+
pkg := pkgs[0]
250+
251+
By("setting up the parser")
252+
reg := &markers.Registry{}
253+
Expect(crdmarkers.Register(reg)).To(Succeed())
254+
parser := &crd.Parser{
255+
Collector: &markers.Collector{Registry: reg},
256+
Checker: &loader.TypeChecker{},
257+
}
258+
crd.AddKnownTypes(parser)
259+
260+
By("requesting that the package be parsed")
261+
parser.NeedPackage(pkg)
262+
263+
By("checking that no non-type errors occurred along the way")
264+
Expect(packageErrors(pkg, packages.TypeError)).NotTo(HaveOccurred())
265+
266+
By("requesting that the CRD be generated")
267+
groupKind := schema.GroupKind{Kind: "Repro", Group: "repro.io"}
268+
parser.NeedCRDFor(groupKind, nil)
269+
270+
By("fixing top level ObjectMeta on the CRD")
271+
crd.FixTopLevelMetadata(parser.CustomResourceDefinitions[groupKind])
272+
273+
By("checking that the CRD is present")
274+
generated, found := parser.CustomResourceDefinitions[groupKind]
275+
Expect(found).To(BeTrue())
276+
277+
By("verifying schema includes the field from the aliased package")
278+
versions := generated.Spec.Versions
279+
Expect(versions).NotTo(BeEmpty())
280+
schemaProps := versions[0].Schema.OpenAPIV3Schema.Properties
281+
specSchema, ok := schemaProps["spec"]
282+
Expect(ok).To(BeTrue())
283+
reproducerSchema, ok := specSchema.Properties["reproducer"]
284+
Expect(ok).To(BeTrue())
285+
Expect(reproducerSchema.Type).To(Equal("object"))
286+
_, ok = reproducerSchema.Properties["repro"]
287+
Expect(ok).To(BeTrue())
288+
})
289+
238290
It("should generate plural words for Kind correctly", func() {
239291
By("switching into testdata to appease go modules")
240292
cwd, err := os.Getwd()
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package aliaspkg
2+
3+
import "testdata.kubebuilder.io/cronjob/typealiasindirect/targetpkg"
4+
5+
type MyAlias = targetpkg.TargetStruct
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// +kubebuilder:object:generate=true
2+
// +groupName=repro.io
3+
package rootpkg
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package rootpkg
2+
3+
import (
4+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
5+
6+
"testdata.kubebuilder.io/cronjob/typealiasindirect/aliaspkg"
7+
)
8+
9+
// +kubebuilder:object:root=true
10+
// +kubebuilder:resource:scope=Namespaced,path=repros
11+
type Repro struct {
12+
metav1.TypeMeta `json:",inline"`
13+
metav1.ObjectMeta `json:"metadata,omitempty"`
14+
15+
Spec ReproSpec `json:"spec,omitempty"`
16+
}
17+
18+
type ReproSpec struct {
19+
Reproducer aliaspkg.MyAlias `json:"reproducer"`
20+
}
21+
22+
// +kubebuilder:object:root=true
23+
type ReproList struct {
24+
metav1.TypeMeta `json:",inline"`
25+
metav1.ListMeta `json:"metadata,omitempty"`
26+
Items []Repro `json:"items"`
27+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package targetpkg
2+
3+
type TargetStruct struct {
4+
Repro string `json:"repro"`
5+
}

0 commit comments

Comments
 (0)