2019-11-02 21:32:58 +07:00
package suites
import (
2019-11-25 03:27:59 +07:00
"context"
"log"
2019-11-02 21:32:58 +07:00
"testing"
2019-11-25 03:27:59 +07:00
"time"
2021-12-01 10:32:58 +07:00
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
2019-11-25 03:27:59 +07:00
"github.com/stretchr/testify/suite"
2021-12-01 10:32:58 +07:00
"github.com/authelia/authelia/v4/internal/duo"
"github.com/authelia/authelia/v4/internal/models"
"github.com/authelia/authelia/v4/internal/storage"
2019-11-02 21:32:58 +07:00
)
2019-12-06 04:35:03 +07:00
type DuoPushWebDriverSuite struct {
2021-11-05 20:14:42 +07:00
* RodSuite
2019-11-02 21:32:58 +07:00
}
2019-12-06 04:35:03 +07:00
func NewDuoPushWebDriverSuite ( ) * DuoPushWebDriverSuite {
2021-11-05 20:14:42 +07:00
return & DuoPushWebDriverSuite { RodSuite : new ( RodSuite ) }
2019-11-02 21:32:58 +07:00
}
2019-12-06 04:35:03 +07:00
func ( s * DuoPushWebDriverSuite ) SetupSuite ( ) {
2021-11-05 20:14:42 +07:00
browser , err := StartRod ( )
2019-11-25 03:27:59 +07:00
if err != nil {
log . Fatal ( err )
}
2021-11-05 20:14:42 +07:00
s . RodSession = browser
2019-11-25 03:27:59 +07:00
}
2019-12-06 04:35:03 +07:00
func ( s * DuoPushWebDriverSuite ) TearDownSuite ( ) {
2021-11-05 20:14:42 +07:00
err := s . RodSession . Stop ( )
2019-11-25 03:27:59 +07:00
if err != nil {
log . Fatal ( err )
}
}
2019-12-06 04:35:03 +07:00
func ( s * DuoPushWebDriverSuite ) SetupTest ( ) {
2021-11-05 20:14:42 +07:00
s . Page = s . doCreateTab ( s . T ( ) , HomeBaseURL )
s . verifyIsHome ( s . T ( ) , s . Page )
2019-11-30 23:49:52 +07:00
}
2019-12-06 04:35:03 +07:00
func ( s * DuoPushWebDriverSuite ) TearDownTest ( ) {
2020-02-01 19:54:50 +07:00
ctx , cancel := context . WithTimeout ( context . Background ( ) , 10 * time . Second )
2021-11-05 20:14:42 +07:00
defer func ( ) {
cancel ( )
s . collectScreenshot ( ctx . Err ( ) , s . Page )
s . collectCoverage ( s . Page )
s . MustClose ( )
} ( )
2019-11-25 03:27:59 +07:00
2021-12-01 10:32:58 +07:00
// Set default 2FA preference and clean up any Duo device already in DB.
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferred2FAMethod ( ctx , "john" , "totp" ) )
require . NoError ( s . T ( ) , provider . DeletePreferredDuoDevice ( ctx , "john" ) )
}
func ( s * DuoPushWebDriverSuite ) TestShouldBypassDeviceSelection ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "allow" ,
StatusMessage : "Allowing unknown user" ,
}
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . verifyIsHome ( s . T ( ) , s . Context ( ctx ) )
}
func ( s * DuoPushWebDriverSuite ) TestShouldDenyDeviceSelection ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "deny" ,
StatusMessage : "We're sorry, access is not allowed." ,
}
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . verifyNotificationDisplayed ( s . T ( ) , s . Context ( ctx ) , "Device selection was denied by Duo policy" )
}
func ( s * DuoPushWebDriverSuite ) TestShouldAskUserToRegister ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "enroll" ,
EnrollPortalURL : "https://api-example.duosecurity.com/portal?code=1234567890ABCDEF&akey=12345ABCDEFGHIJ67890" ,
}
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . WaitElementLocatedByClassName ( s . T ( ) , s . Context ( ctx ) , "state-not-registered" )
s . verifyNotificationDisplayed ( s . T ( ) , s . Context ( ctx ) , "No compatible device found" )
enrollPage := s . Page . MustWaitOpen ( )
s . WaitElementLocatedByCSSSelector ( s . T ( ) , s . Context ( ctx ) , "register-link" ) . MustClick ( )
s . Page = enrollPage ( )
assert . Contains ( s . T ( ) , s . WaitElementLocatedByClassName ( s . T ( ) , s . Context ( ctx ) , "description" ) . MustText ( ) , "This enrollment code has expired. Contact your administrator to get a new enrollment code." )
}
func ( s * DuoPushWebDriverSuite ) TestShouldAutoSelectDevice ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 30 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "auth" ,
Devices : [ ] duo . Device { {
Device : "12345ABCDEFGHIJ67890" ,
DisplayName : "Test Device 1" ,
Capabilities : [ ] string { "auto" , "push" , "sms" , "mobile_otp" } ,
} } ,
}
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
ConfigureDuo ( s . T ( ) , Allow )
2022-01-31 12:25:15 +07:00
// Authenticate.
2021-12-01 10:32:58 +07:00
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
// Switch Method where single Device should be selected automatically.
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . verifyIsHome ( s . T ( ) , s . Context ( ctx ) )
2022-01-31 12:25:15 +07:00
// Re-Login the user.
2021-11-05 20:14:42 +07:00
s . doLogout ( s . T ( ) , s . Context ( ctx ) )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
2021-12-01 10:32:58 +07:00
// And check the latest method and device is still used.
s . WaitElementLocatedByCSSSelector ( s . T ( ) , s . Context ( ctx ) , "push-notification-method" )
2022-01-31 12:25:15 +07:00
// Meaning the authentication is successful.
2021-12-01 10:32:58 +07:00
s . verifyIsHome ( s . T ( ) , s . Context ( ctx ) )
}
func ( s * DuoPushWebDriverSuite ) TestShouldSelectDevice ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 30 * time . Second )
defer cancel ( )
// Set default 2FA preference to enable Select Device link in frontend.
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "ABCDEFGHIJ1234567890" , Method : "push" } ) )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "auth" ,
Devices : [ ] duo . Device { {
Device : "12345ABCDEFGHIJ67890" ,
DisplayName : "Test Device 1" ,
Capabilities : [ ] string { "auto" , "push" , "sms" , "mobile_otp" } ,
} , {
Device : "1234567890ABCDEFGHIJ" ,
DisplayName : "Test Device 2" ,
Capabilities : [ ] string { "auto" , "push" , "sms" , "mobile_otp" } ,
} } ,
}
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
ConfigureDuo ( s . T ( ) , Allow )
2022-01-31 12:25:15 +07:00
// Authenticate.
2021-12-01 10:32:58 +07:00
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
// Switch Method where Device Selection should open automatically.
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
// Check for available Device 1.
s . WaitElementLocatedByCSSSelector ( s . T ( ) , s . Context ( ctx ) , "device-12345ABCDEFGHIJ67890" )
// Test Back button.
s . doClickButton ( s . T ( ) , s . Context ( ctx ) , "device-selection-back" )
// then select Device 2 for further use and be redirected.
s . doChangeDevice ( s . T ( ) , s . Context ( ctx ) , "1234567890ABCDEFGHIJ" )
s . verifyIsHome ( s . T ( ) , s . Context ( ctx ) )
2022-01-31 12:25:15 +07:00
// Re-Login the user.
2021-12-01 10:32:58 +07:00
s . doLogout ( s . T ( ) , s . Context ( ctx ) )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
// And check the latest method and device is still used.
s . WaitElementLocatedByCSSSelector ( s . T ( ) , s . Context ( ctx ) , "push-notification-method" )
2022-01-31 12:25:15 +07:00
// Meaning the authentication is successful.
2021-12-01 10:32:58 +07:00
s . verifyIsHome ( s . T ( ) , s . Context ( ctx ) )
}
func ( s * DuoPushWebDriverSuite ) TestShouldFailInitialSelectionBecauseOfUnsupportedMethod ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "auth" ,
Devices : [ ] duo . Device { {
Device : "12345ABCDEFGHIJ67890" ,
DisplayName : "Test Device 1" ,
Capabilities : [ ] string { "auto" , "sms" } ,
} } ,
}
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . WaitElementLocatedByClassName ( s . T ( ) , s . Context ( ctx ) , "state-not-registered" )
s . verifyNotificationDisplayed ( s . T ( ) , s . Context ( ctx ) , "No compatible device found" )
}
func ( s * DuoPushWebDriverSuite ) TestShouldSelectNewDeviceAfterSavedDeviceMethodIsNoLongerSupported ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "auth" ,
Devices : [ ] duo . Device { {
Device : "12345ABCDEFGHIJ67890" ,
DisplayName : "Test Device 1" ,
Capabilities : [ ] string { "push" , "sms" } ,
} , {
Device : "1234567890ABCDEFGHIJ" ,
DisplayName : "Test Device 2" ,
Capabilities : [ ] string { "auto" , "push" , "sms" , "mobile_otp" } ,
} } ,
}
// Setup unsupported Duo device in DB.
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "ABCDEFGHIJ1234567890" , Method : "sms" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
ConfigureDuo ( s . T ( ) , Allow )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . WaitElementLocatedByCSSSelector ( s . T ( ) , s . Context ( ctx ) , "device-selection" )
s . doSelectDevice ( s . T ( ) , s . Context ( ctx ) , "12345ABCDEFGHIJ67890" )
s . verifyIsHome ( s . T ( ) , s . Context ( ctx ) )
}
func ( s * DuoPushWebDriverSuite ) TestShouldAutoSelectNewDeviceAfterSavedDeviceIsNoLongerAvailable ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "auth" ,
Devices : [ ] duo . Device { {
Device : "12345ABCDEFGHIJ67890" ,
DisplayName : "Test Device 1" ,
Capabilities : [ ] string { "push" , "sms" } ,
} } ,
}
// Setup unsupported Duo device in DB.
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "ABCDEFGHIJ1234567890" , Method : "push" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
ConfigureDuo ( s . T ( ) , Allow )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . verifyIsHome ( s . T ( ) , s . Context ( ctx ) )
}
func ( s * DuoPushWebDriverSuite ) TestShouldFailSelectionBecauseOfSelectionBypassed ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "allow" ,
StatusMessage : "Allowing unknown user" ,
}
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "12345ABCDEFGHIJ67890" , Method : "push" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
ConfigureDuo ( s . T ( ) , Deny )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . doClickButton ( s . T ( ) , s . Context ( ctx ) , "selection-link" )
s . verifyNotificationDisplayed ( s . T ( ) , s . Context ( ctx ) , "Device selection was bypassed by Duo policy" )
}
func ( s * DuoPushWebDriverSuite ) TestShouldFailSelectionBecauseOfSelectionDenied ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "deny" ,
StatusMessage : "We're sorry, access is not allowed." ,
}
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "12345ABCDEFGHIJ67890" , Method : "push" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
ConfigureDuo ( s . T ( ) , Deny )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
err := s . WaitElementLocatedByCSSSelector ( s . T ( ) , s . Context ( ctx ) , "selection-link" ) . Click ( "left" )
require . NoError ( s . T ( ) , err )
s . verifyNotificationDisplayed ( s . T ( ) , s . Context ( ctx ) , "Device selection was denied by Duo policy" )
}
func ( s * DuoPushWebDriverSuite ) TestShouldFailAuthenticationBecausePreauthDenied ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 20 * time . Second )
defer cancel ( )
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "deny" ,
StatusMessage : "We're sorry, access is not allowed." ,
}
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "12345ABCDEFGHIJ67890" , Method : "push" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . WaitElementLocatedByClassName ( s . T ( ) , s . Context ( ctx ) , "failure-icon" )
s . verifyNotificationDisplayed ( s . T ( ) , s . Context ( ctx ) , "There was an issue completing sign in process" )
2019-11-25 03:27:59 +07:00
}
2019-12-06 04:35:03 +07:00
func ( s * DuoPushWebDriverSuite ) TestShouldSucceedAuthentication ( ) {
2019-11-30 23:49:52 +07:00
ctx , cancel := context . WithTimeout ( context . Background ( ) , 15 * time . Second )
2021-11-05 20:14:42 +07:00
defer func ( ) {
cancel ( )
s . collectScreenshot ( ctx . Err ( ) , s . Page )
} ( )
2019-11-25 03:27:59 +07:00
2021-12-01 10:32:58 +07:00
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "auth" ,
Devices : [ ] duo . Device { {
Device : "12345ABCDEFGHIJ67890" ,
DisplayName : "Test Device 1" ,
Capabilities : [ ] string { "auto" , "push" , "sms" , "mobile_otp" } ,
} } ,
}
// Setup Duo device in DB.
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "12345ABCDEFGHIJ67890" , Method : "push" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
2019-11-25 03:27:59 +07:00
ConfigureDuo ( s . T ( ) , Allow )
2021-11-05 20:14:42 +07:00
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . verifyIsHome ( s . T ( ) , s . Context ( ctx ) )
2019-11-25 03:27:59 +07:00
}
2019-12-06 04:35:03 +07:00
func ( s * DuoPushWebDriverSuite ) TestShouldFailAuthentication ( ) {
2019-11-30 23:49:52 +07:00
ctx , cancel := context . WithTimeout ( context . Background ( ) , 15 * time . Second )
2021-11-05 20:14:42 +07:00
defer func ( ) {
cancel ( )
s . collectScreenshot ( ctx . Err ( ) , s . Page )
} ( )
2019-11-25 03:27:59 +07:00
2021-12-01 10:32:58 +07:00
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "auth" ,
Devices : [ ] duo . Device { {
Device : "12345ABCDEFGHIJ67890" ,
DisplayName : "Test Device 1" ,
Capabilities : [ ] string { "auto" , "push" , "sms" , "mobile_otp" } ,
} } ,
}
// Setup Duo device in DB.
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "12345ABCDEFGHIJ67890" , Method : "push" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
2019-11-25 03:27:59 +07:00
ConfigureDuo ( s . T ( ) , Deny )
2021-11-05 20:14:42 +07:00
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . WaitElementLocatedByClassName ( s . T ( ) , s . Context ( ctx ) , "failure-icon" )
2019-11-25 03:27:59 +07:00
}
2020-02-01 19:54:50 +07:00
type DuoPushDefaultRedirectionSuite struct {
2021-11-05 20:14:42 +07:00
* RodSuite
2020-02-01 19:54:50 +07:00
}
func NewDuoPushDefaultRedirectionSuite ( ) * DuoPushDefaultRedirectionSuite {
2021-11-05 20:14:42 +07:00
return & DuoPushDefaultRedirectionSuite { RodSuite : new ( RodSuite ) }
2020-02-01 19:54:50 +07:00
}
func ( s * DuoPushDefaultRedirectionSuite ) SetupSuite ( ) {
2021-11-05 20:14:42 +07:00
browser , err := StartRod ( )
2020-02-01 19:54:50 +07:00
if err != nil {
log . Fatal ( err )
}
2021-11-05 20:14:42 +07:00
s . RodSession = browser
2020-02-01 19:54:50 +07:00
}
func ( s * DuoPushDefaultRedirectionSuite ) TearDownSuite ( ) {
2021-11-05 20:14:42 +07:00
err := s . RodSession . Stop ( )
2020-02-01 19:54:50 +07:00
if err != nil {
log . Fatal ( err )
}
}
func ( s * DuoPushDefaultRedirectionSuite ) SetupTest ( ) {
2021-11-05 20:14:42 +07:00
s . Page = s . doCreateTab ( s . T ( ) , HomeBaseURL )
s . verifyIsHome ( s . T ( ) , s . Page )
}
2020-02-01 19:54:50 +07:00
2021-11-05 20:14:42 +07:00
func ( s * DuoPushDefaultRedirectionSuite ) TearDownTest ( ) {
s . collectCoverage ( s . Page )
s . MustClose ( )
2020-02-01 19:54:50 +07:00
}
func ( s * DuoPushDefaultRedirectionSuite ) TestUserIsRedirectedToDefaultURL ( ) {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 15 * time . Second )
2021-11-05 20:14:42 +07:00
defer func ( ) {
cancel ( )
s . collectScreenshot ( ctx . Err ( ) , s . Page )
} ( )
2021-12-01 10:32:58 +07:00
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "allow" ,
StatusMessage : "Allowing unknown user" ,
}
// Setup Duo device in DB.
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "12345ABCDEFGHIJ67890" , Method : "push" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
ConfigureDuo ( s . T ( ) , Allow )
2021-11-05 20:14:42 +07:00
s . doLoginOneFactor ( s . T ( ) , s . Context ( ctx ) , "john" , "password" , false , "" )
s . doChangeMethod ( s . T ( ) , s . Context ( ctx ) , "push-notification" )
s . verifyIsHome ( s . T ( ) , s . Page )
2021-12-01 10:32:58 +07:00
// Clean up any Duo device already in DB.
require . NoError ( s . T ( ) , provider . DeletePreferredDuoDevice ( ctx , "john" ) )
2020-02-01 19:54:50 +07:00
}
2019-12-06 04:35:03 +07:00
type DuoPushSuite struct {
suite . Suite
}
func NewDuoPushSuite ( ) * DuoPushSuite {
return & DuoPushSuite { }
}
func ( s * DuoPushSuite ) TestDuoPushWebDriverSuite ( ) {
suite . Run ( s . T ( ) , NewDuoPushWebDriverSuite ( ) )
}
2020-02-01 19:54:50 +07:00
func ( s * DuoPushSuite ) TestDuoPushRedirectionURLSuite ( ) {
suite . Run ( s . T ( ) , NewDuoPushDefaultRedirectionSuite ( ) )
}
2019-12-06 04:35:03 +07:00
func ( s * DuoPushSuite ) TestAvailableMethodsScenario ( ) {
suite . Run ( s . T ( ) , NewAvailableMethodsScenario ( [ ] string {
2021-02-12 12:59:42 +07:00
"TIME-BASED ONE-TIME PASSWORD" ,
2022-03-03 18:20:43 +07:00
"SECURITY KEY - WEBAUTHN" ,
2019-11-25 03:27:59 +07:00
"PUSH NOTIFICATION" ,
} ) )
2019-12-06 04:35:03 +07:00
}
func ( s * DuoPushSuite ) TestUserPreferencesScenario ( ) {
2021-12-01 10:32:58 +07:00
var PreAuthAPIResponse = duo . PreAuthResponse {
Result : "allow" ,
StatusMessage : "Allowing unknown user" ,
}
ctx := context . Background ( )
// Setup Duo device in DB.
2021-12-01 19:11:29 +07:00
provider := storage . NewSQLiteProvider ( & storageLocalTmpConfig )
2021-12-01 10:32:58 +07:00
require . NoError ( s . T ( ) , provider . SavePreferredDuoDevice ( ctx , models . DuoDevice { Username : "john" , Device : "12345ABCDEFGHIJ67890" , Method : "push" } ) )
ConfigureDuoPreAuth ( s . T ( ) , PreAuthAPIResponse )
ConfigureDuo ( s . T ( ) , Allow )
2019-12-06 04:35:03 +07:00
suite . Run ( s . T ( ) , NewUserPreferencesScenario ( ) )
2021-12-01 10:32:58 +07:00
// Clean up any Duo device already in DB.
require . NoError ( s . T ( ) , provider . DeletePreferredDuoDevice ( ctx , "john" ) )
2019-12-06 04:35:03 +07:00
}
func TestDuoPushSuite ( t * testing . T ) {
2021-03-14 14:08:26 +07:00
if testing . Short ( ) {
t . Skip ( "skipping suite test in short mode" )
}
2019-12-06 04:35:03 +07:00
suite . Run ( t , NewDuoPushSuite ( ) )
2019-11-02 21:32:58 +07:00
}