From f0a990b85f24b89dd50f3b9905556d5c538059be Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Wed, 23 Jul 2025 09:49:47 -0400 Subject: [PATCH] chore: add source completion tester (#4077) * add source completion tester Signed-off-by: Alex Goodman * add missing t.Helper calls Signed-off-by: Alex Goodman --------- Signed-off-by: Alex Goodman --- .../packagemetadata/completion_tester.go | 26 +++++++++++++++++++ .../sourcemetadata/completion_tester.go | 26 +++++++++++++++++++ ...kage_metadata.go => completion_testing.go} | 13 ++++++++++ 3 files changed, 65 insertions(+) rename syft/testutil/{package_metadata.go => completion_testing.go} (51%) diff --git a/syft/internal/packagemetadata/completion_tester.go b/syft/internal/packagemetadata/completion_tester.go index 08a285bcf..b677222ab 100644 --- a/syft/internal/packagemetadata/completion_tester.go +++ b/syft/internal/packagemetadata/completion_tester.go @@ -12,6 +12,7 @@ type CompletionTester struct { } func NewCompletionTester(t testing.TB, ignore ...any) *CompletionTester { + t.Helper() tester := &CompletionTester{ valid: AllTypes(), ignore: ignore, @@ -23,6 +24,14 @@ func NewCompletionTester(t testing.TB, ignore ...any) *CompletionTester { return tester } +func (tr *CompletionTester) Ignore(is ...any) { + tr.ignore = append(tr.ignore, keepNonNil(is...)...) +} + +func (tr *CompletionTester) Expect(is ...any) { + tr.valid = append(tr.valid, keepNonNil(is...)...) +} + func (tr *CompletionTester) Tested(t testing.TB, m any) { t.Helper() @@ -33,6 +42,13 @@ func (tr *CompletionTester) Tested(t testing.TB, m any) { t.Fatal("no valid metadata types to test against") } ty := reflect.TypeOf(m) + + for _, v := range tr.ignore { + if reflect.TypeOf(v) == ty { + return + } + } + for _, v := range tr.valid { if reflect.TypeOf(v) == ty { tr.saw = append(tr.saw, m) @@ -67,3 +83,13 @@ validations: } } } + +func keepNonNil(is ...any) []any { + var result []any + for _, i := range is { + if i != nil { + result = append(result, i) + } + } + return result +} diff --git a/syft/internal/sourcemetadata/completion_tester.go b/syft/internal/sourcemetadata/completion_tester.go index 8dc9ce0c4..0e6bbea1a 100644 --- a/syft/internal/sourcemetadata/completion_tester.go +++ b/syft/internal/sourcemetadata/completion_tester.go @@ -12,6 +12,7 @@ type CompletionTester struct { } func NewCompletionTester(t testing.TB, ignore ...any) *CompletionTester { + t.Helper() tester := &CompletionTester{ valid: AllTypes(), ignore: ignore, @@ -23,6 +24,14 @@ func NewCompletionTester(t testing.TB, ignore ...any) *CompletionTester { return tester } +func (tr *CompletionTester) Ignore(is ...any) { + tr.ignore = append(tr.ignore, keepNonNil(is...)...) +} + +func (tr *CompletionTester) Expect(is ...any) { + tr.valid = append(tr.valid, keepNonNil(is...)...) +} + func (tr *CompletionTester) Tested(t testing.TB, m any) { t.Helper() @@ -33,6 +42,13 @@ func (tr *CompletionTester) Tested(t testing.TB, m any) { t.Fatal("no valid metadata types to test against") } ty := reflect.TypeOf(m) + + for _, v := range tr.ignore { + if reflect.TypeOf(v) == ty { + return + } + } + for _, v := range tr.valid { if reflect.TypeOf(v) == ty { tr.saw = append(tr.saw, m) @@ -67,3 +83,13 @@ validations: } } } + +func keepNonNil(is ...any) []any { + var result []any + for _, i := range is { + if i != nil { + result = append(result, i) + } + } + return result +} diff --git a/syft/testutil/package_metadata.go b/syft/testutil/completion_testing.go similarity index 51% rename from syft/testutil/package_metadata.go rename to syft/testutil/completion_testing.go index ae49ba798..6b9ec11c6 100644 --- a/syft/testutil/package_metadata.go +++ b/syft/testutil/completion_testing.go @@ -4,14 +4,27 @@ import ( "testing" "github.com/anchore/syft/syft/internal/packagemetadata" + "github.com/anchore/syft/syft/internal/sourcemetadata" ) type PackageMetadataCompletionTester struct { *packagemetadata.CompletionTester } +type SourceMetadataCompletionTester struct { + *sourcemetadata.CompletionTester +} + func NewPackageMetadataCompletionTester(t testing.TB, ignore ...any) *PackageMetadataCompletionTester { + t.Helper() return &PackageMetadataCompletionTester{ CompletionTester: packagemetadata.NewCompletionTester(t, ignore...), } } + +func NewSourceMetadataCompletionTester(t testing.TB, ignore ...any) *SourceMetadataCompletionTester { + t.Helper() + return &SourceMetadataCompletionTester{ + CompletionTester: sourcemetadata.NewCompletionTester(t, ignore...), + } +}