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  }