Skip to content

Commit c2d2556

Browse files
author
Jon Day
committed
moves getting oktaconfig up a level and add promptRole and promptIDP tests
1 parent f0d6b31 commit c2d2556

2 files changed

Lines changed: 209 additions & 15 deletions

File tree

internal/webssoauth/webssoauth.go

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -479,13 +479,7 @@ func (w *WebSSOAuthentication) choiceFriendlyLabelRole(arn string, roles map[str
479479
}
480480

481481
// promptForRole prompt operator for the AWS Role ARN given a slice of Role ARNs
482-
func (w *WebSSOAuthentication) promptForRole(idp string, roleARNs []string) (roleARN string, err error) {
483-
oktaConfig, err := config.OktaConfig()
484-
var configRoles map[string]string
485-
if err == nil {
486-
configRoles = oktaConfig.AWSCLI.ROLES
487-
}
488-
482+
func (w *WebSSOAuthentication) promptForRole(idp string, roleARNs []string, configRoles map[string]string) (roleARN string, err error) {
489483
if len(roleARNs) == 1 || w.config.AWSIAMRole() != "" {
490484
roleARN = w.config.AWSIAMRole()
491485
if len(roleARNs) == 1 {
@@ -546,12 +540,7 @@ func (w *WebSSOAuthentication) promptForRole(idp string, roleARNs []string) (rol
546540
// promptForIDP prompt operator for the AWS IdP ARN given a slice of IdP ARNs.
547541
// If the fedApp has already been selected via an ask one survey we don't need
548542
// to pretty print out the IdP name again.
549-
func (w *WebSSOAuthentication) promptForIDP(idpARNs []string) (idpARN string, err error) {
550-
var configIDPs map[string]string
551-
if oktaConfig, cErr := config.OktaConfig(); cErr == nil {
552-
configIDPs = oktaConfig.AWSCLI.IDPS
553-
}
554-
543+
func (w *WebSSOAuthentication) promptForIDP(idpARNs []string, configIDPs map[string]string) (idpARN string, err error) {
555544
if len(idpARNs) == 0 {
556545
return idpARN, errors.New(noIDPsError)
557546
}
@@ -609,13 +598,22 @@ func (w *WebSSOAuthentication) promptForIdpAndRole(idpRoles map[string][]string)
609598
for idp := range idpRoles {
610599
idps = append(idps, idp)
611600
}
612-
idp, err := w.promptForIDP(idps)
601+
602+
var configRoles map[string]string
603+
var configIDPs map[string]string
604+
605+
if oktaConfig, cErr := config.OktaConfig(); cErr == nil {
606+
configRoles = oktaConfig.AWSCLI.ROLES
607+
configIDPs = oktaConfig.AWSCLI.IDPS
608+
}
609+
610+
idp, err := w.promptForIDP(idps, configIDPs)
613611
if err != nil {
614612
return nil, err
615613
}
616614

617615
roles := idpRoles[idp]
618-
role, err := w.promptForRole(idp, roles)
616+
role, err := w.promptForRole(idp, roles, configRoles)
619617
if err != nil {
620618
return nil, err
621619
}

internal/webssoauth/webssoauth_test.go

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,199 @@ func TestChoiceFriendlyLabelRole(t *testing.T) {
265265
})
266266
}
267267
}
268+
func TestPromptForRole(t *testing.T) {
269+
testCases := []struct {
270+
name string
271+
idpARN string
272+
configRoles map[string]string
273+
roleARNs []string
274+
roleArg string
275+
expected string
276+
}{
277+
{
278+
name: "friendly label",
279+
idpARN: "arn:aws:iam::123:role/rickrole",
280+
roleArg: "Rock N Role",
281+
roleARNs: []string{
282+
"arn:aws:iam::123:role/rocknrole",
283+
"arn:aws:iam::123:role/rickrole",
284+
},
285+
configRoles: map[string]string{
286+
"arn:aws:iam::123:role/rocknrole": "Rock N Role",
287+
"arn:aws:iam::123:role/rickrole": "Rick Role",
288+
"arn:aws:iam::.*:role/never": "Never Gonna Give You Up",
289+
},
290+
expected: "arn:aws:iam::123:role/rocknrole",
291+
},
292+
{
293+
name: "friendly label configured but arn arg supplied",
294+
idpARN: "arn:aws:iam::123:role/rickrole",
295+
roleArg: "arn:aws:iam::123:role/rocknrole",
296+
roleARNs: []string{
297+
"arn:aws:iam::123:role/rocknrole",
298+
"arn:aws:iam::123:role/rickrole",
299+
},
300+
configRoles: map[string]string{
301+
"arn:aws:iam::123:role/rocknrole": "Rock N Role",
302+
"arn:aws:iam::123:role/rickrole": "Rick Role",
303+
"arn:aws:iam::.*:role/never": "Never Gonna Give You Up",
304+
},
305+
expected: "arn:aws:iam::123:role/rocknrole",
306+
},
307+
{
308+
name: "friendly label with wildcard",
309+
idpARN: "arn:aws:iam::123:role/rickrole",
310+
roleArg: "Never Gonna Give You Up",
311+
roleARNs: []string{
312+
"arn:aws:iam::123:role/never",
313+
"arn:aws:iam::123:role/rocknrole",
314+
},
315+
configRoles: map[string]string{
316+
"arn:aws:iam::123:role/rocknrole": "Rock N Role",
317+
"arn:aws:iam::123:role/rickrole": "Rick Role",
318+
"arn:aws:iam::.*:role/never": "Never Gonna Give You Up",
319+
},
320+
expected: "arn:aws:iam::123:role/never",
321+
},
322+
{
323+
name: "no friendly labels arn arg supplied",
324+
idpARN: "arn:aws:iam::123:role/rickrole",
325+
roleArg: "arn:aws:iam::123:role/rocknrole",
326+
roleARNs: []string{
327+
"arn:aws:iam::123:role/never",
328+
"arn:aws:iam::123:role/rocknrole",
329+
},
330+
configRoles: nil,
331+
expected: "arn:aws:iam::123:role/rocknrole",
332+
},
333+
{
334+
name: "single arn option no arg supplied",
335+
idpARN: "arn:aws:iam::123:role/rickrole",
336+
roleArg: "",
337+
roleARNs: []string{
338+
"arn:aws:iam::123:role/never",
339+
},
340+
configRoles: nil,
341+
expected: "arn:aws:iam::123:role/never",
342+
},
343+
}
344+
t.Parallel()
345+
for _, tc := range testCases {
346+
t.Run(tc.name, func(t *testing.T) {
347+
cfg, err := config.NewConfig(&config.Attributes{
348+
AWSIAMRole: tc.roleArg,
349+
})
350+
require.NoError(t, err)
351+
352+
w, err := NewWebSSOAuthentication(cfg)
353+
roleARn, err := w.promptForRole(tc.idpARN, tc.roleARNs, tc.configRoles)
354+
if roleARn != tc.expected {
355+
t.Errorf("expected %q, got %q", tc.expected, roleARn)
356+
}
357+
})
358+
}
359+
}
360+
361+
func TestPromptForIdp(t *testing.T) {
362+
testCases := []struct {
363+
name string
364+
configIdps map[string]string
365+
idpARNs []string
366+
idpArg string
367+
expected string
368+
}{
369+
{
370+
name: "friendly label",
371+
idpArg: "My IdP",
372+
idpARNs: []string{
373+
"arn:aws:iam::123:saml-provider/youridp",
374+
"arn:aws:iam::123:saml-provider/myidp",
375+
"arn:aws:iam::123:saml-provider/aidp",
376+
},
377+
configIdps: map[string]string{
378+
"arn:aws:iam::123:saml-provider/youridp": "Your IdP",
379+
"arn:aws:iam::123:saml-provider/myidp": "My IdP",
380+
"arn:aws:iam::.*:saml-provider/aidp": "A IdP",
381+
},
382+
expected: "arn:aws:iam::123:saml-provider/myidp",
383+
},
384+
{
385+
name: "friendly label configured but arn arg supplied",
386+
idpArg: "arn:aws:iam::123:saml-provider/myidp",
387+
idpARNs: []string{
388+
"arn:aws:iam::123:saml-provider/youridp",
389+
"arn:aws:iam::123:saml-provider/myidp",
390+
"arn:aws:iam::123:saml-provider/aidp",
391+
},
392+
configIdps: map[string]string{
393+
"arn:aws:iam::123:saml-provider/youridp": "Your IdP",
394+
"arn:aws:iam::123:saml-provider/myidp": "My IdP",
395+
"arn:aws:iam::.*:saml-provider/aidp": "A IdP",
396+
},
397+
expected: "arn:aws:iam::123:saml-provider/myidp",
398+
},
399+
{
400+
name: "friendly label with wildcard",
401+
idpArg: "A IdP",
402+
idpARNs: []string{
403+
"arn:aws:iam::123:saml-provider/youridp",
404+
"arn:aws:iam::123:saml-provider/myidp",
405+
"arn:aws:iam::123:saml-provider/aidp",
406+
},
407+
configIdps: map[string]string{
408+
"arn:aws:iam::123:saml-provider/youridp": "Your IdP",
409+
"arn:aws:iam::123:saml-provider/myidp": "My IdP",
410+
"arn:aws:iam::.*:saml-provider/aidp": "A IdP",
411+
},
412+
expected: "arn:aws:iam::123:saml-provider/aidp",
413+
},
414+
{
415+
name: "no friendly labels arn arg supplied",
416+
idpArg: "arn:aws:iam::123:saml-provider/youridp",
417+
idpARNs: []string{
418+
"arn:aws:iam::123:saml-provider/youridp",
419+
"arn:aws:iam::123:saml-provider/myidp",
420+
"arn:aws:iam::123:saml-provider/aidp",
421+
},
422+
configIdps: nil,
423+
expected: "arn:aws:iam::123:saml-provider/youridp",
424+
},
425+
{
426+
name: "single arn option no arg supplied",
427+
idpArg: "",
428+
idpARNs: []string{
429+
"arn:aws:iam::123:saml-provider/myidp",
430+
},
431+
configIdps: nil,
432+
expected: "arn:aws:iam::123:saml-provider/myidp",
433+
},
434+
{
435+
name: "single arn option no arg supplied with friendly label",
436+
idpArg: "",
437+
idpARNs: []string{
438+
"arn:aws:iam::123:saml-provider/myidp",
439+
},
440+
configIdps: map[string]string{
441+
"arn:aws:iam::123:saml-provider/youridp": "Your IdP",
442+
"arn:aws:iam::123:saml-provider/myidp": "My IdP",
443+
"arn:aws:iam::.*:saml-provider/aidp": "A IdP",
444+
},
445+
expected: "arn:aws:iam::123:saml-provider/myidp",
446+
},
447+
}
448+
t.Parallel()
449+
for _, tc := range testCases {
450+
t.Run(tc.name, func(t *testing.T) {
451+
cfg, err := config.NewConfig(&config.Attributes{
452+
AWSIAMIdP: tc.idpArg,
453+
})
454+
require.NoError(t, err)
455+
456+
w, err := NewWebSSOAuthentication(cfg)
457+
roleARn, err := w.promptForIDP(tc.idpARNs, tc.configIdps)
458+
if roleARn != tc.expected {
459+
t.Errorf("expected %q, got %q", tc.expected, roleARn)
460+
}
461+
})
462+
}
463+
}

0 commit comments

Comments
 (0)