// // Copyright Amazon.com Inc. or its affiliates. // All Rights Reserved. // // SPDX-License-Identifier: Apache-2.0 // import AWSCognitoIdentity import AWSCognitoIdentityProvider import AWSPluginsCore import ClientRuntime @testable import Amplify @testable import AWSCognitoAuthPlugin import Foundation struct AuthTestHarnessInput { let initialAuthState: AuthState let expectedAuthState: AuthState? let amplifyAPI: AmplifyAPI let cognitoAPI: [API.APIName: CognitoAPI] } extension AuthTestHarnessInput { static func createInput(from specification: FeatureSpecification) -> AuthTestHarnessInput { return AuthTestHarnessInput( initialAuthState: specification.preConditions.initialAuthState, expectedAuthState: getExpectedAuthState(from: specification), amplifyAPI: getAmplifyAPIUnderTest(from: specification), cognitoAPI: getCognitoAPI(from: specification) ) } private static func getAmplifyAPIUnderTest(from specification: FeatureSpecification) -> AmplifyAPI { return TestHarnessAPIDecoder.decode( specification: specification) } private static func getCognitoAPI( from specification: FeatureSpecification) -> [API.APIName: CognitoAPI] { return CognitoAPIDecodingHelper.decode(with: specification) } private static func getExpectedAuthState(from specification: FeatureSpecification) -> AuthState? { guard let expectedAuthStateValidation = specification.validations.first(where: { validation in validation.value(at: "type") == .string("state") }) else { return nil } guard case .string(let expectedAuthStateFileName) = expectedAuthStateValidation.value(at: "expectedState") else { fatalError("State validation not found") } return AuthState.initialize(fileName: expectedAuthStateFileName) } } enum AmplifyAPI { case resetPassword( input: AuthResetPasswordRequest, expectedOutput: Result?) case signUp( input: AuthSignUpRequest, expectedOutput: Result?) case signIn( input: AuthSignInRequest, expectedOutput: Result?) case fetchAuthSession( input: AuthFetchSessionRequest, expectedOutput: Result?) case signOut( input: AuthSignOutRequest, expectedOutput: Result?) case deleteUser( input: Void, expectedOutput: Result?) case confirmSignIn( input: AuthConfirmSignInRequest, expectedOutput: Result?) } enum CognitoAPI { case forgotPassword(CognitoAPIData) case signUp(CognitoAPIData) case deleteUser(CognitoAPIData) case respondToAuthChallenge(CognitoAPIData) case getId(CognitoAPIData) case getCredentialsForIdentity(CognitoAPIData) case confirmDevice(CognitoAPIData) case initiateAuth(CognitoAPIData) case revokeToken(CognitoAPIData) case globalSignOut(CognitoAPIData) } struct CognitoAPIData { let expectedInput: Input? let output: Result }