Loading modules/src/androidTest/java/app/lounge/NetworkFetchingAPITest.kt→modules/src/androidTest/java/app/lounge/UserAuthenticationAPITest.kt +29 −14 Original line number Diff line number Diff line Loading @@ -4,9 +4,10 @@ import app.lounge.model.AnonymousAuthDataRequestBody import app.lounge.model.AnonymousAuthDataValidationRequestBody import app.lounge.model.AuthDataResponse import app.lounge.model.AuthDataValidationResponse import app.lounge.networking.NetworkFetching import app.lounge.networking.NetworkFetchingRetrofitAPI import app.lounge.networking.NetworkFetchingRetrofitImpl import app.lounge.networking.NetworkResult import app.lounge.networking.UserAuthentication import app.lounge.networking.UserAuthenticationRetrofitAPI import app.lounge.networking.UserAuthenticationRetrofitImpl import kotlinx.coroutines.runBlocking import okhttp3.OkHttpClient import org.junit.Test Loading @@ -16,11 +17,11 @@ import java.io.InterruptedIOException import java.util.Properties import java.util.concurrent.TimeUnit class NetworkFetchingAPITest { class UserAuthenticationAPITest { private val networkFetchingToken: NetworkFetching = NetworkFetchingRetrofitImpl( private val userAuthenticationToken: UserAuthentication = UserAuthenticationRetrofitImpl( Retrofit.Builder() .baseUrl(NetworkFetchingRetrofitAPI.tokenBaseURL) .baseUrl(UserAuthenticationRetrofitAPI.tokenBaseURL) .addConverterFactory(GsonConverterFactory.create()) .client( OkHttpClient.Builder() Loading @@ -30,9 +31,9 @@ class NetworkFetchingAPITest { .build() ) private val networkFetchingGoogle: NetworkFetching = NetworkFetchingRetrofitImpl( private val userAuthenticationGoogle: UserAuthentication = UserAuthenticationRetrofitImpl( Retrofit.Builder() .baseUrl(NetworkFetchingRetrofitAPI.googlePlayBaseURL) .baseUrl(UserAuthenticationRetrofitAPI.googlePlayBaseURL) .addConverterFactory(GsonConverterFactory.create()) .client( OkHttpClient.Builder() Loading @@ -42,9 +43,9 @@ class NetworkFetchingAPITest { .build() ) private val networkFetchingTimeoutGoogle: NetworkFetching = NetworkFetchingRetrofitImpl( private val userAuthenticationTimeoutGoogle: UserAuthentication = UserAuthenticationRetrofitImpl( Retrofit.Builder() .baseUrl(NetworkFetchingRetrofitAPI.googlePlayBaseURL) .baseUrl(UserAuthenticationRetrofitAPI.googlePlayBaseURL) .addConverterFactory(GsonConverterFactory.create()) .client( OkHttpClient.Builder() Loading @@ -65,9 +66,14 @@ class NetworkFetchingAPITest { @Test fun test1OnSuccessReturnsAuthData() = runBlocking { authData = networkFetchingToken.requestAuthData( val response = userAuthenticationToken.requestAuthData( anonymousAuthDataRequestBody = requestBodyData, ) when(response){ is NetworkResult.Success -> authData = response.data else -> {} } assert(authData is AuthDataResponse) { "Assert!! Success must return data" } } Loading @@ -77,11 +83,15 @@ class NetworkFetchingAPITest { authData?.let { authData -> authData.dfeCookie = "null" result = networkFetchingGoogle.requestAuthDataValidation( val response = userAuthenticationGoogle.requestAuthDataValidation( anonymousAuthDataValidationRequestBody = AnonymousAuthDataValidationRequestBody( authDataResponse = authData ) ) when(response){ is NetworkResult.Success -> result = response.data else -> {} } } assert(authData is AuthDataResponse) { "Assert!! AuthData must be present" } Loading @@ -90,16 +100,21 @@ class NetworkFetchingAPITest { @Test fun test3OnTimeoutFailureReturnsError(): Unit = runBlocking { var failure: Exception = Exception("No Error") var failure: Throwable = Exception("No Error") authData?.let { authData -> authData.dfeCookie = "null" try { networkFetchingTimeoutGoogle.requestAuthDataValidation( val response = userAuthenticationTimeoutGoogle.requestAuthDataValidation( anonymousAuthDataValidationRequestBody = AnonymousAuthDataValidationRequestBody( authDataResponse = authData ) ) when(response){ is NetworkResult.Error -> failure = response.exception else -> {} } } catch (e: InterruptedIOException) { failure = e } } assert(authData is AuthDataResponse) { "Assert!! AuthData must be present" } Loading modules/src/main/java/app/lounge/di/NetworkModule.kt +2 −3 Original line number Diff line number Diff line package app.lounge.di import app.lounge.networking.NetworkFetchingRetrofitAPI import dagger.Binds import app.lounge.networking.UserAuthenticationRetrofitAPI import dagger.Module import dagger.Provides import dagger.hilt.InstallIn Loading @@ -24,7 +23,7 @@ internal object NetworkModule { @Singleton internal fun providesRetrofit( okHttpClient: OkHttpClient, baseUrl: String = NetworkFetchingRetrofitAPI.tokenBaseURL baseUrl: String = UserAuthenticationRetrofitAPI.tokenBaseURL ) : Retrofit { return Retrofit.Builder() .baseUrl(baseUrl) Loading modules/src/main/java/app/lounge/networking/RetrofitHandler.kt 0 → 100644 +35 −0 Original line number Diff line number Diff line package app.lounge.networking import retrofit2.Response sealed interface NetworkResult<T> { data class Success<T>(val data: T) : NetworkResult<T> data class Error<T>( val exception: Throwable, val code: Int, val errorMessage: String, ) : NetworkResult<T> } suspend fun <T> fetch(call: suspend () -> Response<T>): NetworkResult<T> { try { val response = call() if (response.isSuccessful) { response.body()?.let { result -> return NetworkResult.Success(result) } } return NetworkResult.Error( exception = Exception(response.message()), code = response.code(), errorMessage = " ${response.code()} ${response.message()}" ) } catch (exception: Exception) { return NetworkResult.Error( exception = exception, code = exception.hashCode(), errorMessage = exception.toString() ) } } modules/src/main/java/app/lounge/networking/NetworkFetching.kt→modules/src/main/java/app/lounge/networking/UserAuthentication.kt +3 −3 Original line number Diff line number Diff line Loading @@ -5,13 +5,13 @@ import app.lounge.model.AnonymousAuthDataValidationRequestBody import app.lounge.model.AuthDataResponse import app.lounge.model.AuthDataValidationResponse interface NetworkFetching { interface UserAuthentication { suspend fun requestAuthData( anonymousAuthDataRequestBody: AnonymousAuthDataRequestBody ) : AuthDataResponse ) : NetworkResult<AuthDataResponse> suspend fun requestAuthDataValidation( anonymousAuthDataValidationRequestBody: AnonymousAuthDataValidationRequestBody ) : AuthDataValidationResponse ) : NetworkResult<AuthDataValidationResponse> } modules/src/main/java/app/lounge/networking/NetworkFetchingRetrofitImpl.kt→modules/src/main/java/app/lounge/networking/UserAuthenticationRetrofitImpl.kt +23 −18 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ import com.aurora.gplayapi.GooglePlayApi import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import retrofit2.Response import retrofit2.Retrofit import retrofit2.http.Body import retrofit2.http.HeaderMap Loading @@ -16,7 +17,7 @@ import retrofit2.http.POST import javax.inject.Inject import javax.inject.Singleton interface NetworkFetchingRetrofitAPI { interface UserAuthenticationRetrofitAPI { companion object { const val tokenBaseURL: String = "https://eu.gtoken.ecloud.global" Loading @@ -27,12 +28,12 @@ interface NetworkFetchingRetrofitAPI { suspend fun authDataRequest( @HeaderMap headers: Map<String, String>, @Body requestBody: RequestBody ): AuthDataResponse ): Response<AuthDataResponse> @POST(Path.sync) suspend fun validateAuthentication( @HeaderMap headers: Map<String, String> ): AuthDataValidationResponse ): Response<AuthDataValidationResponse> Loading @@ -50,17 +51,17 @@ interface NetworkFetchingRetrofitAPI { } @Singleton class NetworkFetchingRetrofitImpl @Inject constructor( class UserAuthenticationRetrofitImpl @Inject constructor( retrofit: Retrofit ) : NetworkFetching { ) : UserAuthentication { private val networkFetchingRetrofitAPI = retrofit.create( NetworkFetchingRetrofitAPI::class.java private val userAuthenticationRetrofitAPI = retrofit.create( UserAuthenticationRetrofitAPI::class.java ) override suspend fun requestAuthData( anonymousAuthDataRequestBody: AnonymousAuthDataRequestBody ): AuthDataResponse { ): NetworkResult<AuthDataResponse> { val requestBody: RequestBody = anonymousAuthDataRequestBody.properties.toByteArray().let { result -> result.toRequestBody( Loading @@ -69,20 +70,24 @@ class NetworkFetchingRetrofitImpl @Inject constructor( byteCount = result.size ) } return networkFetchingRetrofitAPI.authDataRequest( return fetch { userAuthenticationRetrofitAPI.authDataRequest( requestBody = requestBody, headers = NetworkFetchingRetrofitAPI.Header.authData { headers = UserAuthenticationRetrofitAPI.Header.authData { anonymousAuthDataRequestBody.userAgent } ) } } override suspend fun requestAuthDataValidation( anonymousAuthDataValidationRequestBody: AnonymousAuthDataValidationRequestBody ): AuthDataValidationResponse { return networkFetchingRetrofitAPI.validateAuthentication( ): NetworkResult<AuthDataValidationResponse> { return fetch { userAuthenticationRetrofitAPI.validateAuthentication( headers = anonymousAuthDataValidationRequestBody.header ) } } } No newline at end of file Loading
modules/src/androidTest/java/app/lounge/NetworkFetchingAPITest.kt→modules/src/androidTest/java/app/lounge/UserAuthenticationAPITest.kt +29 −14 Original line number Diff line number Diff line Loading @@ -4,9 +4,10 @@ import app.lounge.model.AnonymousAuthDataRequestBody import app.lounge.model.AnonymousAuthDataValidationRequestBody import app.lounge.model.AuthDataResponse import app.lounge.model.AuthDataValidationResponse import app.lounge.networking.NetworkFetching import app.lounge.networking.NetworkFetchingRetrofitAPI import app.lounge.networking.NetworkFetchingRetrofitImpl import app.lounge.networking.NetworkResult import app.lounge.networking.UserAuthentication import app.lounge.networking.UserAuthenticationRetrofitAPI import app.lounge.networking.UserAuthenticationRetrofitImpl import kotlinx.coroutines.runBlocking import okhttp3.OkHttpClient import org.junit.Test Loading @@ -16,11 +17,11 @@ import java.io.InterruptedIOException import java.util.Properties import java.util.concurrent.TimeUnit class NetworkFetchingAPITest { class UserAuthenticationAPITest { private val networkFetchingToken: NetworkFetching = NetworkFetchingRetrofitImpl( private val userAuthenticationToken: UserAuthentication = UserAuthenticationRetrofitImpl( Retrofit.Builder() .baseUrl(NetworkFetchingRetrofitAPI.tokenBaseURL) .baseUrl(UserAuthenticationRetrofitAPI.tokenBaseURL) .addConverterFactory(GsonConverterFactory.create()) .client( OkHttpClient.Builder() Loading @@ -30,9 +31,9 @@ class NetworkFetchingAPITest { .build() ) private val networkFetchingGoogle: NetworkFetching = NetworkFetchingRetrofitImpl( private val userAuthenticationGoogle: UserAuthentication = UserAuthenticationRetrofitImpl( Retrofit.Builder() .baseUrl(NetworkFetchingRetrofitAPI.googlePlayBaseURL) .baseUrl(UserAuthenticationRetrofitAPI.googlePlayBaseURL) .addConverterFactory(GsonConverterFactory.create()) .client( OkHttpClient.Builder() Loading @@ -42,9 +43,9 @@ class NetworkFetchingAPITest { .build() ) private val networkFetchingTimeoutGoogle: NetworkFetching = NetworkFetchingRetrofitImpl( private val userAuthenticationTimeoutGoogle: UserAuthentication = UserAuthenticationRetrofitImpl( Retrofit.Builder() .baseUrl(NetworkFetchingRetrofitAPI.googlePlayBaseURL) .baseUrl(UserAuthenticationRetrofitAPI.googlePlayBaseURL) .addConverterFactory(GsonConverterFactory.create()) .client( OkHttpClient.Builder() Loading @@ -65,9 +66,14 @@ class NetworkFetchingAPITest { @Test fun test1OnSuccessReturnsAuthData() = runBlocking { authData = networkFetchingToken.requestAuthData( val response = userAuthenticationToken.requestAuthData( anonymousAuthDataRequestBody = requestBodyData, ) when(response){ is NetworkResult.Success -> authData = response.data else -> {} } assert(authData is AuthDataResponse) { "Assert!! Success must return data" } } Loading @@ -77,11 +83,15 @@ class NetworkFetchingAPITest { authData?.let { authData -> authData.dfeCookie = "null" result = networkFetchingGoogle.requestAuthDataValidation( val response = userAuthenticationGoogle.requestAuthDataValidation( anonymousAuthDataValidationRequestBody = AnonymousAuthDataValidationRequestBody( authDataResponse = authData ) ) when(response){ is NetworkResult.Success -> result = response.data else -> {} } } assert(authData is AuthDataResponse) { "Assert!! AuthData must be present" } Loading @@ -90,16 +100,21 @@ class NetworkFetchingAPITest { @Test fun test3OnTimeoutFailureReturnsError(): Unit = runBlocking { var failure: Exception = Exception("No Error") var failure: Throwable = Exception("No Error") authData?.let { authData -> authData.dfeCookie = "null" try { networkFetchingTimeoutGoogle.requestAuthDataValidation( val response = userAuthenticationTimeoutGoogle.requestAuthDataValidation( anonymousAuthDataValidationRequestBody = AnonymousAuthDataValidationRequestBody( authDataResponse = authData ) ) when(response){ is NetworkResult.Error -> failure = response.exception else -> {} } } catch (e: InterruptedIOException) { failure = e } } assert(authData is AuthDataResponse) { "Assert!! AuthData must be present" } Loading
modules/src/main/java/app/lounge/di/NetworkModule.kt +2 −3 Original line number Diff line number Diff line package app.lounge.di import app.lounge.networking.NetworkFetchingRetrofitAPI import dagger.Binds import app.lounge.networking.UserAuthenticationRetrofitAPI import dagger.Module import dagger.Provides import dagger.hilt.InstallIn Loading @@ -24,7 +23,7 @@ internal object NetworkModule { @Singleton internal fun providesRetrofit( okHttpClient: OkHttpClient, baseUrl: String = NetworkFetchingRetrofitAPI.tokenBaseURL baseUrl: String = UserAuthenticationRetrofitAPI.tokenBaseURL ) : Retrofit { return Retrofit.Builder() .baseUrl(baseUrl) Loading
modules/src/main/java/app/lounge/networking/RetrofitHandler.kt 0 → 100644 +35 −0 Original line number Diff line number Diff line package app.lounge.networking import retrofit2.Response sealed interface NetworkResult<T> { data class Success<T>(val data: T) : NetworkResult<T> data class Error<T>( val exception: Throwable, val code: Int, val errorMessage: String, ) : NetworkResult<T> } suspend fun <T> fetch(call: suspend () -> Response<T>): NetworkResult<T> { try { val response = call() if (response.isSuccessful) { response.body()?.let { result -> return NetworkResult.Success(result) } } return NetworkResult.Error( exception = Exception(response.message()), code = response.code(), errorMessage = " ${response.code()} ${response.message()}" ) } catch (exception: Exception) { return NetworkResult.Error( exception = exception, code = exception.hashCode(), errorMessage = exception.toString() ) } }
modules/src/main/java/app/lounge/networking/NetworkFetching.kt→modules/src/main/java/app/lounge/networking/UserAuthentication.kt +3 −3 Original line number Diff line number Diff line Loading @@ -5,13 +5,13 @@ import app.lounge.model.AnonymousAuthDataValidationRequestBody import app.lounge.model.AuthDataResponse import app.lounge.model.AuthDataValidationResponse interface NetworkFetching { interface UserAuthentication { suspend fun requestAuthData( anonymousAuthDataRequestBody: AnonymousAuthDataRequestBody ) : AuthDataResponse ) : NetworkResult<AuthDataResponse> suspend fun requestAuthDataValidation( anonymousAuthDataValidationRequestBody: AnonymousAuthDataValidationRequestBody ) : AuthDataValidationResponse ) : NetworkResult<AuthDataValidationResponse> }
modules/src/main/java/app/lounge/networking/NetworkFetchingRetrofitImpl.kt→modules/src/main/java/app/lounge/networking/UserAuthenticationRetrofitImpl.kt +23 −18 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ import com.aurora.gplayapi.GooglePlayApi import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.RequestBody import okhttp3.RequestBody.Companion.toRequestBody import retrofit2.Response import retrofit2.Retrofit import retrofit2.http.Body import retrofit2.http.HeaderMap Loading @@ -16,7 +17,7 @@ import retrofit2.http.POST import javax.inject.Inject import javax.inject.Singleton interface NetworkFetchingRetrofitAPI { interface UserAuthenticationRetrofitAPI { companion object { const val tokenBaseURL: String = "https://eu.gtoken.ecloud.global" Loading @@ -27,12 +28,12 @@ interface NetworkFetchingRetrofitAPI { suspend fun authDataRequest( @HeaderMap headers: Map<String, String>, @Body requestBody: RequestBody ): AuthDataResponse ): Response<AuthDataResponse> @POST(Path.sync) suspend fun validateAuthentication( @HeaderMap headers: Map<String, String> ): AuthDataValidationResponse ): Response<AuthDataValidationResponse> Loading @@ -50,17 +51,17 @@ interface NetworkFetchingRetrofitAPI { } @Singleton class NetworkFetchingRetrofitImpl @Inject constructor( class UserAuthenticationRetrofitImpl @Inject constructor( retrofit: Retrofit ) : NetworkFetching { ) : UserAuthentication { private val networkFetchingRetrofitAPI = retrofit.create( NetworkFetchingRetrofitAPI::class.java private val userAuthenticationRetrofitAPI = retrofit.create( UserAuthenticationRetrofitAPI::class.java ) override suspend fun requestAuthData( anonymousAuthDataRequestBody: AnonymousAuthDataRequestBody ): AuthDataResponse { ): NetworkResult<AuthDataResponse> { val requestBody: RequestBody = anonymousAuthDataRequestBody.properties.toByteArray().let { result -> result.toRequestBody( Loading @@ -69,20 +70,24 @@ class NetworkFetchingRetrofitImpl @Inject constructor( byteCount = result.size ) } return networkFetchingRetrofitAPI.authDataRequest( return fetch { userAuthenticationRetrofitAPI.authDataRequest( requestBody = requestBody, headers = NetworkFetchingRetrofitAPI.Header.authData { headers = UserAuthenticationRetrofitAPI.Header.authData { anonymousAuthDataRequestBody.userAgent } ) } } override suspend fun requestAuthDataValidation( anonymousAuthDataValidationRequestBody: AnonymousAuthDataValidationRequestBody ): AuthDataValidationResponse { return networkFetchingRetrofitAPI.validateAuthentication( ): NetworkResult<AuthDataValidationResponse> { return fetch { userAuthenticationRetrofitAPI.validateAuthentication( headers = anonymousAuthDataValidationRequestBody.header ) } } } No newline at end of file