pulumi/pulumi · error

registry.Mock.ListPackagesF not implemented

Error message

registry.Mock.ListPackagesF not implemented

What it means

registry.Mock.ListPackages iterates packages via the ListPackagesF function field; if that field is nil the mock was never configured for listing and it panics with this message rather than returning an empty or fake sequence.

Source

Thrown at pkg/registry/mock.go:56

	) (apitype.TemplateMetadata, error)

	ListTemplatesF func(ctx context.Context, opts ListTemplatesOptions) iter.Seq2[apitype.ListTemplatesResponse, error]

	DownloadTemplateF func(ctx context.Context, downloadURL string) (io.ReadCloser, error)
}

func (m Mock) GetPackage(
	ctx context.Context, source, publisher, name string, version *semver.Version,
) (apitype.PackageMetadata, error) {
	if m.GetPackageF == nil {
		panic("registry.Mock.GetPackageF not implemented")
	}
	return m.GetPackageF(ctx, source, publisher, name, version)
}

func (m Mock) ListPackages(ctx context.Context, name *string) iter.Seq2[apitype.PackageMetadata, error] {
	if m.ListPackagesF == nil {
		panic("registry.Mock.ListPackagesF not implemented")
	}
	return m.ListPackagesF(ctx, name)
}

func (m Mock) GetTemplate(
	ctx context.Context, source, publisher, name string, version *semver.Version,
) (apitype.TemplateMetadata, error) {
	if m.GetTemplateF == nil {
		panic("registry.Mock.GetTemplateF not implemented")
	}
	return m.GetTemplateF(ctx, source, publisher, name, version)
}

func (m Mock) ListTemplates(
	ctx context.Context, opts ListTemplatesOptions,
) iter.Seq2[apitype.ListTemplatesResponse, error] {
	if m.ListTemplatesF == nil {
		panic("registry.Mock.ListTemplatesF not implemented")

View on GitHub (pinned to 793f7b2e16)

Solutions

  1. Set ListPackagesF in the test fixture, e.g. ListPackagesF: func(name *string) iter.Seq2[apitype.PackageMetadata, error] { ... } returning a small sequence
  2. If listing isn't relevant to the test, route the code under test to a different dependency or stub it
  3. Add a default-populated Mock constructor to keep fixtures complete
  4. Update stale test setups after registry interface changes

Example fix

// before
mock := registry.Mock{}
// after
mock := registry.Mock{
  ListPackagesF: func(name *string) iter.Seq2[apitype.PackageMetadata, error] {
    return func(yield func(apitype.PackageMetadata, error) bool) {
      yield(apitype.PackageMetadata{Name: deref(name)}, nil)
    }
  },
}
Defensive patterns

Strategy: validation

Validate before calling

if mock.ListPackagesF == nil {
  t.Fatal("test bug: registry.Mock.ListPackagesF must be set before use")
}

Type guard

func configuredListPackages(m registry.Mock) bool { return m.ListPackagesF != nil }

Try / catch

// panic is intentional; guard in test setup:
require.NotNil(t, mock.ListPackagesF, "ListPackagesF not configured")

Prevention

When it happens

Trigger: Code under test calls Mock.ListPackages (e.g. pulumi package list or search flows) while the test's Mock lacks ListPackagesF, or a test exercising a newly added list path with an older fixture.

Common situations: Existing tests re-used after production code started calling ListPackages; forgetting to stub iterator-returning methods when setting up the registry mock; incremental interface changes leaving fixtures incomplete.

Related errors


AI-assisted analysis of pulumi/pulumi@793f7b2e16 (2026-08-31). Data as JSON: /api/errors/614175f63431c240. Report an issue: GitHub.