github.com/versent/saml2aws@v2.17.0+incompatible/pkg/provider/psu/psu_test.go (about) 1 package psu 2 3 import ( 4 "github.com/stretchr/testify/assert" 5 "testing" 6 ) 7 8 var goodDuoResults = `<script type="text/javascript">var duoResults = { 9 devices: {"devices":[{"capabilities":["push","phone","sms"],"device":"abcdefg123456789","display_name":"Phone 1 (XXX-XXX-1234)","sms_nextcode":"1","type":"phone"},{"capabilities":["phone","sms"],"device":"987654321gfedcba","display_name":"Phone 2 (XXX-XXX-5678)","type":"phone"},{"capabilities":[],"device":"hijklmnop123456789","display_name":"12345678","type":"token"}]}, 10 service: 'cosign-as1.fim.psu.edu', 11 referrer: 'https://as1.fim.psu.edu/idp/Authn/RemoteUser?conversation=e1s1', 12 remoteuser: '', 13 account_type: "dce", 14 requiredFactors: unescape('dce.psu.edu,2fa'), 15 satisfiedFactors: 'dce.psu.edu', 16 error: 'Additional authentication is required.', 17 onRedirect: function(url) { 18 window.location.assign(url); 19 } 20 }; 21 </script>` 22 23 func TestStringInSlice(t *testing.T) { 24 needle := "needle" 25 haystackA := []string{"foo", "bar", "baz", "needle"} 26 haystackB := []string{"foo", "bar", "baz"} 27 28 assert.True(t, stringInSlice(needle, haystackA), "is true") 29 assert.False(t, stringInSlice(needle, haystackB), "is false") 30 } 31 32 func TestExtractDuoResults(t *testing.T) { 33 34 r, err := extractDuoResults(goodDuoResults) 35 assert.NoError(t, err) 36 assert.Len(t, r.Devices.Devices, 3) 37 38 _, err = extractDuoResults("") 39 assert.Error(t, err) 40 41 _, err = extractDuoResults(`var thisIsValidJson = {foo: "bar"};`) 42 assert.Error(t, err) 43 44 _, err = extractDuoResults(`var duoResults = {foo: "bar"};`) 45 assert.Error(t, err) 46 47 r, err = extractDuoResults(`var duoResults = { devices: {"devices":[]} };`) 48 assert.Error(t, err) 49 assert.Len(t, r.Devices.Devices, 0) 50 } 51 52 func TestParseDuoResults(t *testing.T) { 53 54 dr, err := extractDuoResults(goodDuoResults) 55 assert.Nil(t, err) 56 57 duoDevices := parseDuoResults(dr) 58 assert.Len(t, duoDevices, 5) 59 60 // push 61 assert.Equal(t, "push", duoDevices[0].OptionType) 62 assert.Equal(t, "abcdefg123456789", duoDevices[0].Device) 63 assert.Equal(t, "Duo Push to Phone 1 (XXX-XXX-1234)", duoDevices[0].Prompt) 64 65 // phone 66 assert.Equal(t, "phone", duoDevices[1].OptionType) 67 assert.Equal(t, "abcdefg123456789", duoDevices[1].Device) 68 assert.Equal(t, "Phone call to Phone 1 (XXX-XXX-1234)", duoDevices[1].Prompt) 69 70 // sms with next code 71 assert.Equal(t, "sms", duoDevices[3].OptionType, "sms") 72 assert.Equal(t, "abcdefg123456789", duoDevices[3].Device) 73 assert.Equal(t, "SMS passcodes to Phone 1 (XXX-XXX-1234) (next code starts with 1)", duoDevices[3].Prompt) 74 75 // sms without next code 76 assert.Equal(t, "sms", duoDevices[4].OptionType, "sms") 77 assert.Equal(t, "987654321gfedcba", duoDevices[4].Device) 78 assert.Equal(t, "SMS passcodes to Phone 2 (XXX-XXX-5678)", duoDevices[4].Prompt) 79 }