diff --git a/app/build.gradle b/app/build.gradle index 1d99271..2d3bed5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -121,6 +121,7 @@ dependencies { androidTestImplementation "androidx.test.espresso.idling:idling-concurrent:$espressoVersion" implementation "androidx.test.espresso:espresso-idling-resource:$espressoVersion" androidTestImplementation "androidx.test:runner:$testRunnerVersion" + androidTestImplementation "androidx.test.espresso:espresso-contrib:$espressoVersion" / * Google play services */ implementation "com.google.android.gms:play-services-auth:20.4.1" / * Google firebase */ @@ -156,4 +157,8 @@ dependencies { implementation 'com.squareup.okhttp3:okhttp:4.10.0' / * Kotlin Reflect */ implementation "org.jetbrains.kotlin:kotlin-reflect:1.8.10" + / * Retrofit2 */ + def retrofit_version = "2.9.0" + androidTestImplementation "com.squareup.retrofit2:retrofit:$retrofit_version" + androidTestImplementation "com.squareup.retrofit2:converter-gson:$retrofit_version" } diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/Constants.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/Constants.kt index 5336d08..211d073 100644 --- a/app/src/androidTest/java/h_mal/appttude/com/driver/Constants.kt +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/Constants.kt @@ -7,4 +7,8 @@ const val deleteAccountFirebase = "http://10.0.2.2:9099/identitytoolkit.googleapis.com/v1/accounts:delete?key=$apiKey" -const val USER_PASSWORD = "LetMeIn123!" \ No newline at end of file +const val USER_PASSWORD = "LetMeIn123!" + +const val DRIVER_EMAIL = "existing-driver@driver.com" +const val ADMIN_EMAIL = "admin@driver.com" +const val PASSWORD = "test123456" \ No newline at end of file diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/api/FirebaseApi.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/api/FirebaseApi.kt new file mode 100644 index 0000000..da707da --- /dev/null +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/api/FirebaseApi.kt @@ -0,0 +1,56 @@ +package h_mal.appttude.com.driver.firebase.api + +import h_mal.appttude.com.driver.firebase.model.* +import okhttp3.OkHttpClient +import okhttp3.Request +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.PUT +import retrofit2.http.Query + +interface FirebaseApi { + + @PUT("v1/accounts:signUp") + suspend fun signUp(@Body request: SignUpRequest): Response + + @PUT("v1/accounts:signInWithPassword") + suspend fun signInWithPassword(@Body request: SignUpRequest): Response + + @PUT("v1/accounts:sendOobCode") + suspend fun sendOobCode(@Body request: Map): Response + + @PUT("v1/accounts:resetPassword") + suspend fun resetPassword(@Body request: ResetPasswordRequest): Response + + // invoke method creating an invocation of the api call + companion object{ + operator fun invoke() : FirebaseApi { + val host = "10.0.2.2" + val baseUrl = "http://$host:9099/identitytoolkit.googleapis.com/" + + val okkHttpclient = OkHttpClient.Builder() + .addInterceptor { + val original = it.request() + val url = original.url.newBuilder() + .addQueryParameter("key", "apikeydfasdfasdfasdf") + .build() + + val requestBuilder = original.newBuilder().url(url) + val request: Request = requestBuilder.build() + it.proceed(request) + } + .build() + + // creation of retrofit class + return Retrofit.Builder() + .client(okkHttpclient) + .baseUrl(baseUrl) + .addConverterFactory(GsonConverterFactory.create()) + .build() + .create(FirebaseApi::class.java) + } + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/api/NetworkConnectionInterceptor.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/api/NetworkConnectionInterceptor.kt new file mode 100644 index 0000000..eb081f9 --- /dev/null +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/api/NetworkConnectionInterceptor.kt @@ -0,0 +1,38 @@ +package h_mal.appttude.com.driver.firebase.api + +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import okhttp3.Interceptor +import java.io.IOException + +class NetworkConnectionInterceptor( + context: Context +) : Interceptor { + + private val applicationContext = context.applicationContext + + override fun intercept(chain: Interceptor.Chain): okhttp3.Response { + if (!isInternetAvailable()){ + throw IOException("Make sure you have an active data connection") + } + return chain.proceed(chain.request()) + } + + private fun isInternetAvailable(): Boolean { + var result = false + val connectivityManager = + applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager? + connectivityManager?.let { + it.getNetworkCapabilities(connectivityManager.activeNetwork)?.apply { + result = when { + hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true + hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true + else -> false + } + } + } + return result + } + +} \ No newline at end of file diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/OobCodeResponse.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/OobCodeResponse.kt new file mode 100644 index 0000000..00dca1c --- /dev/null +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/OobCodeResponse.kt @@ -0,0 +1,9 @@ +package h_mal.appttude.com.driver.firebase.model + +data class OobCodeResponse( + val kind: String? = null, + val oobLink: String? = null, + val oobCode: String? = null, + val email: String? = null +) + diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/ResetPasswordRequest.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/ResetPasswordRequest.kt new file mode 100644 index 0000000..5018a97 --- /dev/null +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/ResetPasswordRequest.kt @@ -0,0 +1,10 @@ +package h_mal.appttude.com.driver.firebase.model + +data class ResetPasswordRequest( + val oldPassword: String? = null, + val tenantId: String? = null, + val newPassword: String? = null, + val oobCode: String? = null, + val email: String? = null +) + diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/ResetPasswordResponse.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/ResetPasswordResponse.kt new file mode 100644 index 0000000..8a18205 --- /dev/null +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/ResetPasswordResponse.kt @@ -0,0 +1,9 @@ +package h_mal.appttude.com.driver.firebase.model + +data class ResetPasswordResponse( + val requestType: String? = null, + val kind: String? = null, + val newEmail: String? = null, + val email: String? = null +) + diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/SignUpRequest.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/SignUpRequest.kt new file mode 100644 index 0000000..6337c06 --- /dev/null +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/SignUpRequest.kt @@ -0,0 +1,7 @@ +package h_mal.appttude.com.driver.firebase.model + +data class SignUpRequest( + val password: String? = null, + val email: String? = null +) + diff --git a/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/SignUpResponse.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/SignUpResponse.kt similarity index 81% rename from app/src/androidTest/java/h_mal/appttude/com/driver/firebase/SignUpResponse.kt rename to app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/SignUpResponse.kt index 4ae760e..8ca9e4b 100644 --- a/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/SignUpResponse.kt +++ b/app/src/androidTest/java/h_mal/appttude/com/driver/firebase/model/SignUpResponse.kt @@ -1,4 +1,4 @@ -package h_mal.appttude.com.driver.firebase +package h_mal.appttude.com.driver.firebase.model data class SignUpResponse( val expiresIn: String? = null, diff --git a/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/LoginRobot.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/robots/LoginRobot.kt similarity index 100% rename from app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/LoginRobot.kt rename to app/src/androidTest/java/h_mal/appttude/com/driver/robots/LoginRobot.kt diff --git a/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/RegisterRobot.kt b/app/src/androidTest/java/h_mal/appttude/com/driver/robots/RegisterRobot.kt similarity index 100% rename from app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/RegisterRobot.kt rename to app/src/androidTest/java/h_mal/appttude/com/driver/robots/RegisterRobot.kt diff --git a/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/HomeRobot.kt b/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/HomeRobot.kt index 50148c3..29318a3 100644 --- a/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/HomeRobot.kt +++ b/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/HomeRobot.kt @@ -1,5 +1,8 @@ package h_mal.appttude.com.driver.robots +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.contrib.DrawerActions +import androidx.test.espresso.matcher.ViewMatchers.withId import h_mal.appttude.com.driver.BaseTestRobot import h_mal.appttude.com.driver.R @@ -8,4 +11,20 @@ class HomeRobot : BaseTestRobot() { fun checkTitleExists(title: String) = matchText(R.id.prova_title_tv, title) + fun openDrawer() { + onView(withId(R.id.drawer_layout)).perform(DrawerActions.open()) + } + + fun closeDrawer() { + onView(withId(R.id.drawer_layout)).perform(DrawerActions.close()) + } + + fun updateProfile() { + openDrawer() + clickButton(R.id.nav_user_settings) + } + + fun openDriverProfile() = clickButton(R.id.driver) + fun openVehicleProfile() = clickButton(R.id.car) + } \ No newline at end of file diff --git a/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/UpdateRobot.kt b/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/UpdateRobot.kt new file mode 100644 index 0000000..3a11686 --- /dev/null +++ b/app/src/androidTestDriver/java/h_mal/appttude/com/driver/robots/UpdateRobot.kt @@ -0,0 +1,17 @@ +package h_mal.appttude.com.driver.robots + +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.contrib.DrawerActions +import androidx.test.espresso.matcher.ViewMatchers.withId +import h_mal.appttude.com.driver.BaseTestRobot +import h_mal.appttude.com.driver.R + +fun update(func: UpdateRobot.() -> Unit) = UpdateRobot().apply { func() } +class UpdateRobot : BaseTestRobot() { + + fun updateEmail() = clickButton(R.id.update_email_button) + fun updatePassword() = clickButton(R.id.update_password_button) + fun updateProfile() = clickButton(R.id.update_profile_button) + fun deleteProfile() = clickButton(R.id.delete_profile) + +} \ No newline at end of file diff --git a/app/src/androidTestDriver/java/h_mal/appttude/com/driver/tests/UserAuthenticationActivityTest.kt b/app/src/androidTestDriver/java/h_mal/appttude/com/driver/tests/UserAuthenticationActivityTest.kt index c2a995a..eb03bde 100644 --- a/app/src/androidTestDriver/java/h_mal/appttude/com/driver/tests/UserAuthenticationActivityTest.kt +++ b/app/src/androidTestDriver/java/h_mal/appttude/com/driver/tests/UserAuthenticationActivityTest.kt @@ -33,7 +33,10 @@ class UserAuthenticationActivityTest : FirebaseTest(LoginActivity } home { checkTitleExists(getResourceString(R.string.welcome_title)) + updateProfile() } + + // TODO: update user details } } diff --git a/app/src/driver/java/h_mal/appttude/com/driver/ui/MainActivity.kt b/app/src/driver/java/h_mal/appttude/com/driver/ui/MainActivity.kt index 270d7ba..9f2eaf1 100644 --- a/app/src/driver/java/h_mal/appttude/com/driver/ui/MainActivity.kt +++ b/app/src/driver/java/h_mal/appttude/com/driver/ui/MainActivity.kt @@ -33,6 +33,7 @@ class MainActivity : DrawerActivity() { setupDrawer(data) } } + } private fun setupDrawer(user: FirebaseUser) { diff --git a/app/src/main/java/h_mal/appttude/com/driver/application/DriverApplication.kt b/app/src/main/java/h_mal/appttude/com/driver/application/DriverApplication.kt index 9800149..f8393ef 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/application/DriverApplication.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/application/DriverApplication.kt @@ -1,6 +1,9 @@ package h_mal.appttude.com.driver.application import android.app.Application +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.database.FirebaseDatabase +import com.google.firebase.storage.FirebaseStorage import h_mal.appttude.com.driver.data.FirebaseAuthSource import h_mal.appttude.com.driver.data.FirebaseDatabaseSource import h_mal.appttude.com.driver.data.FirebaseStorageSource @@ -15,6 +18,16 @@ import org.kodein.di.generic.singleton class DriverApplication : Application(), KodeinAware { + override fun onCreate() { + super.onCreate() + + val localHost = "10.0.2.2" + + FirebaseAuth.getInstance().useEmulator(localHost, 9099) + FirebaseDatabase.getInstance().useEmulator(localHost, 9000) + FirebaseStorage.getInstance().useEmulator(localHost, 9199) + } + // Kodein aware to initialise the classes used for DI override val kodein = Kodein.lazy { import(androidXModule(this@DriverApplication)) diff --git a/app/src/main/java/h_mal/appttude/com/driver/base/BaseActivity.kt b/app/src/main/java/h_mal/appttude/com/driver/base/BaseActivity.kt index c6dc707..8a5c0ab 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/base/BaseActivity.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/base/BaseActivity.kt @@ -45,8 +45,6 @@ abstract class BaseActivity : AppCompatActi { defaultViewModelCreationExtras } ) - private var loading: Boolean = false - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) configureObserver() @@ -95,7 +93,6 @@ abstract class BaseActivity : AppCompatActi */ open fun onStarted() { loadingView.fadeIn() - loading = true mIdlingResource?.setIdleState(false) } @@ -104,7 +101,6 @@ abstract class BaseActivity : AppCompatActi */ open fun onSuccess(data: Any?) { loadingView.fadeOut() - loading = false mIdlingResource?.setIdleState(true) } @@ -114,7 +110,6 @@ abstract class BaseActivity : AppCompatActi open fun onFailure(error: String?) { error?.let { displayToast(it) } loadingView.fadeOut() - loading = false mIdlingResource?.setIdleState(true) } @@ -140,7 +135,8 @@ abstract class BaseActivity : AppCompatActi override fun onBackPressed() { - if (!loading) super.onBackPressed() + loadingView.hide() + super.onBackPressed() } /** diff --git a/app/src/main/java/h_mal/appttude/com/driver/base/DrawerActivity.kt b/app/src/main/java/h_mal/appttude/com/driver/base/DrawerActivity.kt index ef12248..22194a2 100644 --- a/app/src/main/java/h_mal/appttude/com/driver/base/DrawerActivity.kt +++ b/app/src/main/java/h_mal/appttude/com/driver/base/DrawerActivity.kt @@ -48,7 +48,6 @@ abstract class DrawerActivity : BaseActivit appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout) navView.setupWithNavController(navController) setupActionBarWithNavController(navController, appBarConfiguration) - } override fun onSupportNavigateUp(): Boolean { diff --git a/app/src/main/res/layout/update_overview_fragment.xml b/app/src/main/res/layout/update_overview_fragment.xml index 037e106..562503e 100644 --- a/app/src/main/res/layout/update_overview_fragment.xml +++ b/app/src/main/res/layout/update_overview_fragment.xml @@ -44,13 +44,13 @@ android:text="@string/update_password" /> + app:layout_constraintStart_toStartOf="parent" />