github.com/versent/saml2aws@v2.17.0+incompatible/pkg/provider/keycloak/keycloak_test.go (about) 1 package keycloak 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "net/http" 7 "net/http/httptest" 8 "net/url" 9 "testing" 10 11 "github.com/PuerkitoBio/goquery" 12 13 "github.com/versent/saml2aws/mocks" 14 "github.com/versent/saml2aws/pkg/creds" 15 "github.com/versent/saml2aws/pkg/prompter" 16 "github.com/versent/saml2aws/pkg/provider" 17 "github.com/stretchr/testify/require" 18 ) 19 20 const ( 21 exampleLoginURL = "https://id.example.com/auth/realms/master/login-actions/authenticate?code=G5PSj-AJ7mC2wRS5yOA5NEGZ7BO97Y0_qUkS5zInmhQ&execution=e0c4f6fe-6f9a-435e-a7ff-d61eb2456d58&client_id=urn%3Aamazon%3Awebservices" 22 ) 23 24 func TestClient_getLoginForm(t *testing.T) { 25 26 data, err := ioutil.ReadFile("example/loginpage.html") 27 require.Nil(t, err) 28 29 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 30 w.Write(data) 31 })) 32 defer ts.Close() 33 34 kc := Client{client: &provider.HTTPClient{Client: http.Client{}}} 35 loginDetails := &creds.LoginDetails{URL: ts.URL, Username: "test", Password: "test123"} 36 37 submitURL, authForm, err := kc.getLoginForm(loginDetails) 38 require.Nil(t, err) 39 require.Equal(t, exampleLoginURL, submitURL) 40 require.Equal(t, url.Values{ 41 "username": []string{"test"}, 42 "password": []string{"test123"}, 43 "login": []string{"Log in"}, 44 }, authForm) 45 } 46 47 func TestClient_postLoginForm(t *testing.T) { 48 49 data, err := ioutil.ReadFile("example/mfapage.html") 50 require.Nil(t, err) 51 52 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 53 w.Write(data) 54 })) 55 defer ts.Close() 56 57 loginForm := url.Values{ 58 "username": []string{"test"}, 59 "password": []string{"test123"}, 60 "login": []string{"Log in"}, 61 } 62 63 kc := Client{client: &provider.HTTPClient{Client: http.Client{}}} 64 65 content, err := kc.postLoginForm(ts.URL, loginForm) 66 require.Nil(t, err) 67 require.NotNil(t, content) 68 } 69 70 func TestClient_postTotpForm(t *testing.T) { 71 72 data, err := ioutil.ReadFile("example/assertion.html") 73 require.Nil(t, err) 74 75 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 76 w.Write(data) 77 })) 78 defer ts.Close() 79 80 doc, err := goquery.NewDocumentFromReader(bytes.NewReader(data)) 81 require.Nil(t, err) 82 83 pr := &mocks.Prompter{} 84 prompter.SetPrompter(pr) 85 86 pr.Mock.On("RequestSecurityCode", "000000").Return("123456") 87 88 mfaToken := "" 89 kc := Client{client: &provider.HTTPClient{Client: http.Client{}}} 90 91 kc.postTotpForm(ts.URL, mfaToken, doc) 92 93 pr.Mock.AssertCalled(t, "RequestSecurityCode", "000000") 94 } 95 96 func TestClient_postTotpFormWithProvidedMFAToken(t *testing.T) { 97 98 data, err := ioutil.ReadFile("example/assertion.html") 99 require.Nil(t, err) 100 101 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 102 w.Write(data) 103 })) 104 defer ts.Close() 105 106 doc, err := goquery.NewDocumentFromReader(bytes.NewReader(data)) 107 require.Nil(t, err) 108 109 pr := &mocks.Prompter{} 110 prompter.SetPrompter(pr) 111 112 mfaToken := "123456" 113 kc := Client{client: &provider.HTTPClient{Client: http.Client{}}} 114 115 kc.postTotpForm(ts.URL, mfaToken, doc) 116 117 pr.Mock.AssertNumberOfCalls(t, "RequestSecurityCode", 0) 118 } 119 120 func TestClient_containsTotpForm(t *testing.T) { 121 data, err := ioutil.ReadFile("example/mfapage.html") 122 require.Nil(t, err) 123 124 doc, err := goquery.NewDocumentFromReader(bytes.NewReader(data)) 125 require.Nil(t, err) 126 127 require.True(t, containsTotpForm(doc)) 128 }