Skip to content

Commit 8cde4d3

Browse files
authored
Add support for searching modules in private registry (#1179)
* add support for searching modules in private registry using query, org and providername * changing the registryName data type
1 parent eae164f commit 8cde4d3

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Unreleased
22

33
## Enhancements
4+
* Add support for querying and filtering private registry modules based on a search query, `provider`, `registry_name` and `organization_name`, by @gautambaghel [#1179](https://github.com/hashicorp/go-tfe/pull/1179)
45
* Adds support for `RegistryModule` VCS source_directory and tag_prefix options, by @jillrami [#1154] (https://github.com/hashicorp/go-tfe/pull/1154)
56
* Adds `GroupName` filter option for `StackDeploymentGroup` by @Maed223 [#1175](https://github.com/hashicorp/go-tfe/pull/1175)
67
* Adds endpoint for reruning a stack deployment by @hwatkins05-hashicorp/@Maed223 [#1176](https://github.com/hashicorp/go-tfe/pull/1176)

registry_module.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,18 @@ type RegistryModuleListOptions struct {
269269

270270
// Include is a list of relations to include.
271271
Include []RegistryModuleListIncludeOpt `url:"include,omitempty"`
272+
273+
// Search is a search query string. Modules are searchable by name, namespace, provider fields.
274+
Search string `url:"q,omitempty"`
275+
276+
// Provider filters results by provider name
277+
Provider string `url:"filter[provider],omitempty"`
278+
279+
// RegistryName filters results by registry name (public or private)
280+
RegistryName RegistryName `url:"filter[registry_name],omitempty"`
281+
282+
// OrganizationName filters results by organization name
283+
OrganizationName string `url:"filter[organization_name],omitempty"`
272284
}
273285

274286
type RegistryModuleListIncludeOpt string

registry_module_integration_test.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,88 @@ func TestRegistryModulesList(t *testing.T) {
8888
}
8989
}
9090
})
91+
92+
t.Run("with search query", func(t *testing.T) {
93+
// Search for modules by name
94+
modl, err := client.RegistryModules.List(ctx, orgTest.Name, &RegistryModuleListOptions{
95+
Search: registryModuleTest1.Name,
96+
})
97+
require.NoError(t, err)
98+
99+
// Should find at least the first test module
100+
found := false
101+
for _, m := range modl.Items {
102+
if m.ID == registryModuleTest1.ID {
103+
found = true
104+
break
105+
}
106+
}
107+
assert.True(t, found, "Registry module should be found by name search")
108+
})
109+
110+
t.Run("with provider filter", func(t *testing.T) {
111+
// Filter by provider
112+
modl, err := client.RegistryModules.List(ctx, orgTest.Name, &RegistryModuleListOptions{
113+
Provider: registryModuleTest1.Provider,
114+
})
115+
require.NoError(t, err)
116+
117+
// All returned modules should have the specified provider
118+
for _, m := range modl.Items {
119+
assert.Equal(t, registryModuleTest1.Provider, m.Provider)
120+
}
121+
})
122+
123+
t.Run("with registry name filter", func(t *testing.T) {
124+
// Filter by registry name
125+
modl, err := client.RegistryModules.List(ctx, orgTest.Name, &RegistryModuleListOptions{
126+
RegistryName: PrivateRegistry,
127+
})
128+
require.NoError(t, err)
129+
130+
// All returned modules should have the specified registry name
131+
for _, m := range modl.Items {
132+
assert.Equal(t, PrivateRegistry, m.RegistryName)
133+
}
134+
})
135+
136+
t.Run("with organization name filter", func(t *testing.T) {
137+
// Filter by organization name
138+
modl, err := client.RegistryModules.List(ctx, orgTest.Name, &RegistryModuleListOptions{
139+
OrganizationName: orgTest.Name,
140+
})
141+
require.NoError(t, err)
142+
143+
// All returned modules should belong to the specified organization
144+
for _, m := range modl.Items {
145+
assert.Equal(t, orgTest.Name, m.Namespace)
146+
}
147+
})
148+
149+
t.Run("with combined search and filters", func(t *testing.T) {
150+
// Combine search with filters
151+
modl, err := client.RegistryModules.List(ctx, orgTest.Name, &RegistryModuleListOptions{
152+
Search: registryModuleTest1.Name,
153+
Provider: registryModuleTest1.Provider,
154+
RegistryName: PrivateRegistry,
155+
OrganizationName: orgTest.Name,
156+
})
157+
require.NoError(t, err)
158+
159+
// Should find the specific module when all criteria match
160+
found := false
161+
for _, m := range modl.Items {
162+
if m.ID != registryModuleTest1.ID {
163+
continue
164+
}
165+
found = true
166+
assert.Equal(t, registryModuleTest1.Provider, m.Provider)
167+
assert.Equal(t, PrivateRegistry, m.RegistryName)
168+
assert.Equal(t, orgTest.Name, m.Namespace)
169+
break
170+
}
171+
assert.True(t, found, "Registry module should be found with combined search and filters")
172+
})
91173
}
92174

93175
func TestRegistryModulesCreate(t *testing.T) {

0 commit comments

Comments
 (0)