🌱 Replace hand-written test mocks with gomock-generated mocks#2775
Conversation
✅ Deploy Preview for olmv1 ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
There was a problem hiding this comment.
Pull request overview
This PR standardizes the repository’s test mocking approach by replacing hand-written mock implementations with go.uber.org/mock (gomock) generated mocks, and adds tooling + make targets to keep mocks regenerated and in sync with interface changes.
Changes:
- Added mock generation infrastructure (bingo-managed
mockgen,make generate-mocks, centralizedgo:generatedirectives). - Introduced generated gomock packages under
internal/testutil/mock/**and migrated many tests to use them. - Kept/clarified true “test fakes” (preconfigured return values) vs interaction-verifying mocks (e.g., rename to
FakePuller/FakeCache).
Reviewed changes
Copilot reviewed 56 out of 59 changed files in this pull request and generated 16 comments.
Show a summary per file
| File | Description |
|---|---|
| Makefile | Adds mockgen symlink + generate-mocks target and wires it into make generate. |
| .bingo/Variables.mk | Installs mockgen via bingo and exposes MOCKGEN. |
| .bingo/variables.env | Adds MOCKGEN env var for bingo tooling. |
| .bingo/mockgen.mod | Adds bingo module for mockgen. |
| .bingo/mockgen.sum | Adds checksums for mockgen bingo module. |
| go.mod | Adds go.uber.org/mock dependency (and tidies indirect deps). |
| go.sum | Adds go.uber.org/mock sums. |
| AGENTS.md | Documents gomock as the standard for interface mocks + regeneration workflow. |
| internal/testutil/mock/generate.go | Centralizes //go:generate mockgen ... directives for exported interfaces. |
| internal/testutil/mock/helmclient/interfaces.go | Adds composite interface used for generating a combined helm client mock. |
| internal/testutil/mock/helmclient/mock_actionclient.go | Generated mocks for helm-operator-plugins action interfaces/getter. |
| internal/testutil/mock/helmclient/mock_composite.go | Generated mock for composite helm interface. |
| internal/testutil/mock/ctrlclient/mock_client.go | Generated mocks for controller-runtime client.Client and sub-writers. |
| internal/testutil/mock/crdclient/mock_crdinterface.go | Generated mock for CRD typed client interface. |
| internal/testutil/mock/logrsink/mock_logsink.go | Generated mock for logr.LogSink. |
| internal/testutil/mock/httputil/mock_roundtripper.go | Generated mock for net/http.RoundTripper. |
| internal/testutil/mock/rbac/mock_rulesresolver.go | Generated mock for Kubernetes RBAC rule resolver. |
| internal/testutil/mock/machinery/mock_results.go | Generated mocks for boxcutter machinery result interfaces. |
| internal/testutil/mock/storage/mock_instance.go | Generated mock for catalogd storage Instance. |
| internal/testutil/mock/catalogdserver/mock_catalogstore.go | Generated mock for catalogd server CatalogStore. |
| internal/testutil/mock/catalogdservice/mock_graphqlservice.go | Generated mock for catalogd GraphQLService. |
| internal/testutil/mock/catalogclient/mock_cache.go | Generated mock for catalogmetadata client cache interface. |
| internal/testutil/mock/config/mock_schemaprovider.go | Generated mock for config SchemaProvider. |
| internal/testutil/mock/contentmanager/mock_contentmanager.go | Generated mock for contentmanager Manager. |
| internal/testutil/mock/cmcache/mock_cache.go | Generated mocks for contentmanager cache interfaces. |
| internal/testutil/mock/controllers/mock_controllers.go | Generated mocks for operator-controller controller interfaces. |
| internal/testutil/mock/authorization/mock_authorization.go | Generated mock for authorization PreAuthorizer. |
| internal/testutil/mock/applier/mock_applier.go | Generated mocks for applier interfaces. |
| internal/testutil/mock/render/mock_certprovider.go | Generated mock for rukpak render CertificateProvider. |
| internal/shared/util/image/fakes.go | Renames Mock* to Fake* for non-interaction fakes. |
| internal/shared/util/image/pull_test.go | Updates tests to use renamed fakes. |
| internal/shared/util/featuregates/logging_test.go | Migrates to gomock-based LogSink mock. |
| internal/operator-controller/rukpak/render/fake.go | Removes duplicated handwritten cert provider fake (replaced by generated mock). |
| internal/operator-controller/rukpak/util/testing/testing.go | Removes duplicated handwritten cert provider fake from shared test util. |
| internal/operator-controller/rukpak/render/render_test.go | Switches to generated MockCertificateProvider. |
| internal/operator-controller/rukpak/render/certprovider_test.go | Switches to generated MockCertificateProvider. |
| internal/operator-controller/rukpak/render/registryv1/generators/generators_test.go | Switches to generated MockCertificateProvider with expectations. |
| internal/operator-controller/rukpak/preflights/crdupgradesafety/crdupgradesafety_test.go | Replaces handwritten CRD getter with generated mock. |
| internal/operator-controller/controllers/clusterobjectset_controller.go | Adds go:generate for unexported interface mock (source mode). |
| internal/operator-controller/controllers/mock_trackingcache_gen_test.go | Adds generated in-package mock for trackingCache (test-only). |
| internal/operator-controller/controllers/resolve_ref_test.go | Refactors tests to use gomock-based helpers/mocks. |
| internal/operator-controller/controllers/clusterobjectset_controller_internal_test.go | Replaces handwritten tracking cache with gomock-generated mock. |
| internal/operator-controller/controllers/suite_test.go | Replaces handwritten controller deps with gomock-generated mocks/helpers. |
| internal/operator-controller/controllers/clustercatalog_controller_test.go | Replaces handwritten catalog cache/populator mocks with gomock mocks. |
| internal/operator-controller/contentmanager/cache/cache.go | Adds go:generate for sourcerer/watch/source mocks (test-only). |
| internal/operator-controller/contentmanager/cache/mock_sourcerer_gen_test.go | Adds generated in-package mock for unexported interfaces (test-only). |
| internal/operator-controller/contentmanager/cache/cache_test.go | Migrates tests to gomock-generated mocks. |
| internal/operator-controller/config/config_test.go | Migrates schema-provider tests to gomock-generated mock. |
| internal/operator-controller/catalogmetadata/client/client_test.go | Migrates cache and HTTP transport fakes to gomock mocks. |
| internal/operator-controller/authorization/rbac_test.go | Migrates RBAC resolver test double to gomock mock. |
| internal/operator-controller/applier/provider_test.go | Migrates manifest provider / certificate provider fakes to generated mocks. |
| internal/operator-controller/action/helm_test.go | Migrates from testify/mock to gomock-generated helm client mocks. |
| internal/catalogd/serverutil/serverutil_test.go | Migrates storage instance test double to generated gomock mock. |
| internal/catalogd/server/handlers_test.go | Moves to server_test package and uses generated mocks. |
| internal/catalogd/controllers/core/clustercatalog_controller_test.go | Migrates storage instance test double to generated gomock mock. |
| internal/operator-controller/applier/helm_test.go | Migrates applier Helm tests to generated mocks and helper builders. |
| internal/operator-controller/applier/boxcutter_test.go | Migrates boxcutter tests to generated mocks and helper builders. |
Files not reviewed (2)
- internal/operator-controller/contentmanager/cache/mock_sourcerer_gen_test.go: Generated file
- internal/operator-controller/controllers/mock_trackingcache_gen_test.go: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #2775 +/- ##
==========================================
+ Coverage 66.78% 70.46% +3.67%
==========================================
Files 149 143 -6
Lines 11386 10617 -769
==========================================
- Hits 7604 7481 -123
+ Misses 3222 2577 -645
+ Partials 560 559 -1
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 57 out of 60 changed files in this pull request and generated 3 comments.
Files not reviewed (2)
- internal/operator-controller/contentmanager/cache/mock_sourcerer_gen_test.go: Generated file
- internal/operator-controller/controllers/mock_trackingcache_gen_test.go: Generated file
32a4020 to
3f7ec8e
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 57 out of 60 changed files in this pull request and generated 1 comment.
Files not reviewed (2)
- internal/operator-controller/contentmanager/cache/mock_sourcerer_gen_test.go: Generated file
- internal/operator-controller/controllers/mock_trackingcache_gen_test.go: Generated file
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 56 out of 59 changed files in this pull request and generated no new comments.
Files not reviewed (2)
- internal/operator-controller/contentmanager/cache/mock_sourcerer_gen_test.go: Generated file
- internal/operator-controller/controllers/mock_trackingcache_gen_test.go: Generated file
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 57 out of 60 changed files in this pull request and generated 1 comment.
Files not reviewed (2)
- internal/operator-controller/contentmanager/cache/mock_sourcerer_gen_test.go: Generated file
- internal/operator-controller/controllers/mock_trackingcache_gen_test.go: Generated file
Introduce go.uber.org/mock (gomock) with mockgen code generation to replace all hand-written mock structs across the test suite. This eliminates duplicated mocks, establishes a single consistent mocking pattern, and ensures mocks stay in sync with interface changes automatically via make generate-mocks. Infrastructure: - Add mockgen via bingo with unversioned symlink for go generate - Add generate-mocks Makefile target (go generate ./...) - Wire into existing generate/verify targets for CI enforcement - Centralized //go:generate directives in internal/testutil/mock/ for exported interfaces (external and internal) - Source-mode directives at interface definitions for unexported interfaces (trackingCache, sourcerer), output to _test.go files to keep gomock out of the production binary - Mock helpers accept shared *gomock.Controller to avoid controller proliferation in nested mock scenarios Rename MockPuller/MockCache to FakePuller/FakeCache in image/fakes.go to clarify they are test fakes (preconfigured return values), not mocks (interaction verification). Remove duplicated FakeCertProvider from render/fake.go and rukpak/util/testing.go, replaced by generated MockCertificateProvider. FakeBundleSource (a function type, not an interface) is retained as-is. Co-Authored-By: Claude <noreply@anthropic.com>
|
Nice one! Thank you! |
|
/approve |
|
/lgtm |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: perdasilva, rashmigottipati The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:
Approvers can indicate their approval by writing |
e4879a3
into
operator-framework:main
Description
Replace all hand-written mock structs across the test suite with
go.uber.org/mock(gomock) generated mocks. This eliminates duplicated mocks, establishes a single consistent mocking pattern, and ensures mocks stay in sync with interface changes automatically viamake generate-mocks.Hand-written test code shrank by 373 lines (1901 added, 2274 removed). The generated mocks add 3580 lines, but those are auto-generated and never manually maintained.
Infrastructure
mockgenvia bingo, consistent with how all other build tools are managedgenerate-mocksMakefile target wired intogenerate/verifyso CI catches stale mocks//go:generatedirectives live ininternal/testutil/mock/generate.gofor all exported interfaces, and inline at interface definitions for unexported ones (trackingCache,sourcerer)_test.gofiles to keepgo.uber.org/mockout of the production binaryMock migration
internal/testutil/mock/Naming cleanup
MockPuller/MockCache→FakePuller/FakeCacheinimage/fakes.goto clarify they are test fakes (preconfigured return values), not mocks (interaction verification)FakeCertProviderfromrender/fake.goandrukpak/util/testing/testing.go, replaced by generatedMockCertificateProviderFakeBundleSource(a function type, not an interface) retained as-isReviewer Checklist