github.com/versent/saml2aws@v2.17.0+incompatible/pkg/provider/pingfed/pingfed_test.go (about) 1 package pingfed 2 3 import ( 4 "bytes" 5 "context" 6 "io/ioutil" 7 "testing" 8 9 "github.com/PuerkitoBio/goquery" 10 "github.com/stretchr/testify/require" 11 "github.com/versent/saml2aws/mocks" 12 "github.com/versent/saml2aws/pkg/creds" 13 "github.com/versent/saml2aws/pkg/prompter" 14 ) 15 16 func TestMakeAbsoluteURL(t *testing.T) { 17 require.Equal(t, makeAbsoluteURL("/a", "https://example.com"), "https://example.com/a") 18 require.Equal(t, makeAbsoluteURL("https://foo.com/a/b", "https://bar.com"), "https://foo.com/a/b") 19 } 20 21 var docTests = []struct { 22 fn func(*goquery.Document) bool 23 file string 24 expected bool 25 }{ 26 {docIsLogin, "example/login.html", true}, 27 {docIsLogin, "example/login2.html", true}, 28 {docIsLogin, "example/otp.html", false}, 29 {docIsLogin, "example/swipe.html", false}, 30 {docIsLogin, "example/form-redirect.html", false}, 31 {docIsLogin, "example/webauthn.html", false}, 32 {docIsOTP, "example/login.html", false}, 33 {docIsOTP, "example/otp.html", true}, 34 {docIsOTP, "example/swipe.html", false}, 35 {docIsOTP, "example/form-redirect.html", false}, 36 {docIsOTP, "example/webauthn.html", false}, 37 {docIsSwipe, "example/login.html", false}, 38 {docIsSwipe, "example/otp.html", false}, 39 {docIsSwipe, "example/swipe.html", true}, 40 {docIsSwipe, "example/form-redirect.html", false}, 41 {docIsSwipe, "example/webauthn.html", false}, 42 {docIsFormRedirect, "example/login.html", false}, 43 {docIsFormRedirect, "example/otp.html", false}, 44 {docIsFormRedirect, "example/swipe.html", false}, 45 {docIsFormRedirect, "example/form-redirect.html", true}, 46 {docIsFormRedirect, "example/webauthn.html", false}, 47 {docIsWebAuthn, "example/login.html", false}, 48 {docIsWebAuthn, "example/otp.html", false}, 49 {docIsWebAuthn, "example/swipe.html", false}, 50 {docIsWebAuthn, "example/form-redirect.html", false}, 51 {docIsWebAuthn, "example/webauthn.html", true}, 52 } 53 54 func TestDocTypes(t *testing.T) { 55 for _, tt := range docTests { 56 data, err := ioutil.ReadFile(tt.file) 57 require.Nil(t, err) 58 59 doc, err := goquery.NewDocumentFromReader(bytes.NewReader(data)) 60 require.Nil(t, err) 61 62 if tt.fn(doc) != tt.expected { 63 t.Errorf("expect doc check of %v to be %v", tt.file, tt.expected) 64 } 65 } 66 } 67 68 func TestHandleLogin(t *testing.T) { 69 ac := Client{} 70 loginDetails := creds.LoginDetails{ 71 Username: "fdsa", 72 Password: "secret", 73 URL: "https://example.com/foo", 74 } 75 ctx := context.WithValue(context.Background(), ctxKey("login"), &loginDetails) 76 77 data, err := ioutil.ReadFile("example/login.html") 78 require.Nil(t, err) 79 80 doc, err := goquery.NewDocumentFromReader(bytes.NewReader(data)) 81 require.Nil(t, err) 82 83 ctx, req, err := ac.handleLogin(ctx, doc) 84 require.Nil(t, err) 85 86 b, err := ioutil.ReadAll(req.Body) 87 require.Nil(t, err) 88 89 s := string(b[:]) 90 require.Contains(t, s, "pf.username=fdsa") 91 require.Contains(t, s, "pf.pass=secret") 92 } 93 94 func TestHandleOTP(t *testing.T) { 95 pr := &mocks.Prompter{} 96 prompter.SetPrompter(pr) 97 pr.Mock.On("StringRequired", "Enter passcode").Return("5309") 98 99 data, err := ioutil.ReadFile("example/otp.html") 100 require.Nil(t, err) 101 102 doc, err := goquery.NewDocumentFromReader(bytes.NewReader(data)) 103 require.Nil(t, err) 104 105 ac := Client{} 106 _, req, err := ac.handleOTP(context.Background(), doc) 107 require.Nil(t, err) 108 109 b, err := ioutil.ReadAll(req.Body) 110 require.Nil(t, err) 111 112 s := string(b[:]) 113 require.Contains(t, s, "otp=5309") 114 } 115 116 func TestHandleFormRedirect(t *testing.T) { 117 data, err := ioutil.ReadFile("example/form-redirect.html") 118 require.Nil(t, err) 119 120 doc, err := goquery.NewDocumentFromReader(bytes.NewReader(data)) 121 require.Nil(t, err) 122 123 ac := Client{} 124 _, req, err := ac.handleFormRedirect(context.Background(), doc) 125 require.Nil(t, err) 126 127 b, err := ioutil.ReadAll(req.Body) 128 require.Nil(t, err) 129 130 s := string(b[:]) 131 require.Contains(t, s, "ppm_request=secret") 132 require.Contains(t, s, "idp_account_id=some-uuid") 133 } 134 135 func TestHandleWebAuthn(t *testing.T) { 136 data, err := ioutil.ReadFile("example/webauthn.html") 137 require.Nil(t, err) 138 139 doc, err := goquery.NewDocumentFromReader(bytes.NewReader(data)) 140 require.Nil(t, err) 141 142 ac := Client{} 143 _, req, err := ac.handleWebAuthn(context.Background(), doc) 144 require.Nil(t, err) 145 146 b, err := ioutil.ReadAll(req.Body) 147 require.Nil(t, err) 148 149 s := string(b[:]) 150 require.Contains(t, s, "isWebAuthnSupportedByBrowser=false") 151 }