Skip to content

Commit 065062a

Browse files
vhvb1989Copilot
andcommitted
fix: address Copilot review feedback (iteration 10)
- Format 'Show all subscriptions' with index prefix for consistent UX - Add multi-tenant tests for set and remove actions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 12c6794 commit 065062a

3 files changed

Lines changed: 110 additions & 2 deletions

File tree

cli/azd/cmd/config_sub_filter_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,109 @@ func TestSubFilterRemoveAction_CancelledRemoval(t *testing.T) {
189189
require.True(t, exists)
190190
require.Equal(t, []string{"sub-1"}, ids)
191191
}
192+
193+
func TestSubFilterSetAction_MultiTenant_SavesFilterForSelectedTenant(
194+
t *testing.T,
195+
) {
196+
mockConsole := mockinput.NewMockConsole()
197+
ucm := newTestUserConfigManager(t)
198+
199+
mockAccount := &mockaccount.MockAccountManager{
200+
Subscriptions: []account.Subscription{
201+
{Id: "sub-1", Name: "Alpha", TenantId: "t1", UserAccessTenantId: "t1"},
202+
{Id: "sub-2", Name: "Bravo", TenantId: "t2", UserAccessTenantId: "t2"},
203+
{Id: "sub-3", Name: "Charlie", TenantId: "t2", UserAccessTenantId: "t2"},
204+
},
205+
}
206+
207+
action := &subFilterSetAction{
208+
accountManager: mockAccount,
209+
userConfigManager: ucm,
210+
console: mockConsole,
211+
}
212+
213+
// Select second tenant (index 1)
214+
mockConsole.WhenSelect(func(opts input.ConsoleOptions) bool {
215+
return strings.Contains(opts.Message, "tenant")
216+
}).Respond(1)
217+
218+
// Pick the first subscription from tenant t2
219+
mockConsole.WhenMultiSelect(func(opts input.ConsoleOptions) bool {
220+
return strings.Contains(opts.Message, "subscription")
221+
}).RespondFn(func(opts input.ConsoleOptions) (any, error) {
222+
if len(opts.Options) > 0 {
223+
return []string{opts.Options[0]}, nil
224+
}
225+
return []string{}, nil
226+
})
227+
228+
result, err := action.Run(t.Context())
229+
require.NoError(t, err)
230+
require.NotNil(t, result)
231+
require.Contains(t, result.Message.Header, "Saved subscription filter")
232+
233+
// Verify filter was saved under t2
234+
cfg, err := ucm.Load()
235+
require.NoError(t, err)
236+
ids, exists := prompt.LoadSubscriptionFilter(cfg, "t2")
237+
require.True(t, exists)
238+
require.Len(t, ids, 1)
239+
240+
// Verify no filter saved under t1
241+
_, exists = prompt.LoadSubscriptionFilter(cfg, "t1")
242+
require.False(t, exists)
243+
}
244+
245+
func TestSubFilterRemoveAction_MultiTenant_RemovesCorrectTenant(
246+
t *testing.T,
247+
) {
248+
mockConsole := mockinput.NewMockConsole()
249+
ucm := newTestUserConfigManager(t)
250+
251+
// Pre-save filters for both tenants
252+
cfg, err := ucm.Load()
253+
require.NoError(t, err)
254+
err = prompt.SaveSubscriptionFilter(cfg, "t1", []string{"sub-1"})
255+
require.NoError(t, err)
256+
err = prompt.SaveSubscriptionFilter(cfg, "t2", []string{"sub-2"})
257+
require.NoError(t, err)
258+
err = ucm.Save(cfg)
259+
require.NoError(t, err)
260+
261+
mockAccount := &mockaccount.MockAccountManager{
262+
Subscriptions: []account.Subscription{
263+
{Id: "sub-1", Name: "Alpha", TenantId: "t1", UserAccessTenantId: "t1"},
264+
{Id: "sub-2", Name: "Bravo", TenantId: "t2", UserAccessTenantId: "t2"},
265+
},
266+
}
267+
268+
action := &subFilterRemoveAction{
269+
accountManager: mockAccount,
270+
userConfigManager: ucm,
271+
console: mockConsole,
272+
}
273+
274+
// Select second tenant (index 1)
275+
mockConsole.WhenSelect(func(opts input.ConsoleOptions) bool {
276+
return strings.Contains(opts.Message, "tenant")
277+
}).Respond(1)
278+
279+
// Confirm removal
280+
mockConsole.WhenConfirm(func(opts input.ConsoleOptions) bool {
281+
return strings.Contains(opts.Message, "Remove subscription filter")
282+
}).Respond(true)
283+
284+
result, err := action.Run(t.Context())
285+
require.NoError(t, err)
286+
require.NotNil(t, result)
287+
require.Contains(t, result.Message.Header, "Removed subscription filter")
288+
289+
// Verify t2 filter removed, t1 still exists
290+
cfg, err = ucm.Load()
291+
require.NoError(t, err)
292+
_, exists := prompt.LoadSubscriptionFilter(cfg, "t2")
293+
require.False(t, exists)
294+
ids, exists := prompt.LoadSubscriptionFilter(cfg, "t1")
295+
require.True(t, exists)
296+
require.Equal(t, []string{"sub-1"}, ids)
297+
}

cli/azd/pkg/prompt/prompter.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,10 @@ func (p *DefaultPrompter) PromptSubscription(ctx context.Context, msg string) (s
141141

142142
// Add "Show all subscriptions" option when filter is active
143143
if filterApplied {
144+
nextIdx := len(subscriptionOptions) + 1
144145
subscriptionOptions = append(
145-
subscriptionOptions, ShowAllSubscriptionsOption,
146+
subscriptionOptions,
147+
fmt.Sprintf("%2d. %s", nextIdx, ShowAllSubscriptionsOption),
146148
)
147149
subscriptions = append(
148150
subscriptions, ShowAllSubscriptionsOption,

cli/azd/pkg/prompt/prompter_extra_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ func TestDefaultPrompter_PromptSubscription_FilterApplied(t *testing.T) {
272272
require.Equal(t, "sub-alpha", subId)
273273
// Should show only 1 sub + "Show all subscriptions"
274274
require.Len(t, shownOptions, 2)
275-
require.Equal(t, ShowAllSubscriptionsOption, shownOptions[len(shownOptions)-1])
275+
require.Equal(t, " 2. "+ShowAllSubscriptionsOption, shownOptions[len(shownOptions)-1])
276276
}
277277

278278
func TestDefaultPrompter_PromptSubscription_ShowAll(t *testing.T) {

0 commit comments

Comments
 (0)