diff --git a/face/capture/build.gradle.kts b/face/capture/build.gradle.kts index 95fc9d955c..eead2c311c 100644 --- a/face/capture/build.gradle.kts +++ b/face/capture/build.gradle.kts @@ -1,6 +1,5 @@ plugins { id("simprints.feature") - id("simprints.testing.android") id("kotlin-parcelize") id("simprints.library.kotlinSerialization") } diff --git a/face/capture/src/androidTest/AndroidManifest.xml b/face/capture/src/androidTest/AndroidManifest.xml deleted file mode 100644 index c99d51054c..0000000000 --- a/face/capture/src/androidTest/AndroidManifest.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/face/capture/src/androidTest/java/com/simprints/face/CustomTestRunner.kt b/face/capture/src/androidTest/java/com/simprints/face/CustomTestRunner.kt deleted file mode 100644 index 4cf6496d0d..0000000000 --- a/face/capture/src/androidTest/java/com/simprints/face/CustomTestRunner.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.simprints.face - -import android.app.Application -import android.content.Context -import androidx.test.runner.AndroidJUnitRunner -import dagger.hilt.android.testing.HiltTestApplication - -// A custom runner to set up the instrumented application class for tests. -class CustomTestRunner : AndroidJUnitRunner() { - override fun newApplication( - cl: ClassLoader?, - name: String?, - context: Context?, - ): Application = super.newApplication(cl, HiltTestApplication::class.java.name, context) -} diff --git a/face/capture/src/androidTest/java/com/simprints/face/capture/confirmation/ConfirmationFragmentTest.kt b/face/capture/src/androidTest/java/com/simprints/face/capture/confirmation/ConfirmationFragmentTest.kt deleted file mode 100644 index 42aa15e40a..0000000000 --- a/face/capture/src/androidTest/java/com/simprints/face/capture/confirmation/ConfirmationFragmentTest.kt +++ /dev/null @@ -1,96 +0,0 @@ -package com.simprints.face.capture.confirmation - -import android.graphics.Bitmap -import androidx.fragment.app.testing.launchFragmentInContainer -import androidx.navigation.Navigation -import androidx.navigation.testing.TestNavHostController -import androidx.test.core.app.ApplicationProvider -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.matcher.ViewMatchers.* -import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.google.common.truth.Truth.assertThat -import com.simprints.core.tools.time.Timestamp -import com.simprints.face.capture.R -import com.simprints.face.capture.models.FaceDetection -import com.simprints.face.capture.screens.FaceCaptureViewModel -import com.simprints.face.capture.screens.confirmation.ConfirmationFragment -import dagger.hilt.android.testing.BindValue -import dagger.hilt.android.testing.HiltAndroidRule -import dagger.hilt.android.testing.HiltAndroidTest -import io.mockk.every -import io.mockk.mockk -import org.hamcrest.CoreMatchers.allOf -import org.junit.Rule -import org.junit.Test -import org.junit.runner.RunWith -import com.simprints.infra.resources.R as IDR - -@HiltAndroidTest -@RunWith(AndroidJUnit4::class) -class ConfirmationFragmentTest { - @get:Rule - var hiltRule = HiltAndroidRule(this) - - @BindValue - @JvmField - internal val faceCaptureViewModel: FaceCaptureViewModel = mockk(relaxed = true) { - every { getSampleDetection() } returns FaceDetection( - Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888), - face = null, - status = FaceDetection.Status.VALID, - securedImageRef = null, - detectionStartTime = Timestamp(0L), - isFallback = false, - id = "", - detectionEndTime = Timestamp(0L), - ) - } - - @Test - fun onLaunchConfirmationFragmentAssertTextAndNavigation() { - val navController = TestNavHostController( - ApplicationProvider.getApplicationContext(), - ) - - val confirmationScenario = - launchFragmentInContainer() - - confirmationScenario.onFragment { confirmationFragment -> - navController.setGraph(R.navigation.graph_face_capture_internal) - Navigation.setViewNavController(confirmationFragment.requireView(), navController) - } - - onView( - allOf( - withId(R.id.face_confirm_title), - withText(IDR.string.face_capture_confirmation_title), - ), - ).check(matches(isDisplayed())) - - onView( - allOf( - withId(R.id.confirmation_txt), - withText(IDR.string.face_capture_successfully_title), - ), - ).check(matches(isDisplayed())) - - onView( - allOf( - withId(R.id.recapture_btn), - withText(IDR.string.face_capture_recapture_button), - ), - ).check(matches(isDisplayed())) - - onView( - allOf( - withId(R.id.confirmation_btn), - withText(IDR.string.face_capture_finish_button), - ), - ).check(matches(isDisplayed())) - - onView(withId(R.id.confirmation_btn)).perform(click()) - assertThat(navController.currentDestination?.id).isEqualTo(R.id.facePreparationFragment) - } -} diff --git a/face/capture/src/androidTest/java/com/simprints/face/capture/livefeedback/LiveFeedbackFragmentTest.kt b/face/capture/src/androidTest/java/com/simprints/face/capture/livefeedback/LiveFeedbackFragmentTest.kt deleted file mode 100644 index 269b737cde..0000000000 --- a/face/capture/src/androidTest/java/com/simprints/face/capture/livefeedback/LiveFeedbackFragmentTest.kt +++ /dev/null @@ -1,75 +0,0 @@ -package com.simprints.face.capture.livefeedback - -import android.os.Build -import androidx.fragment.app.testing.launchFragmentInContainer -import androidx.navigation.NavHostController -import androidx.navigation.Navigation -import androidx.navigation.testing.TestNavHostController -import androidx.test.core.app.ApplicationProvider -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.assertion.ViewAssertions.matches -import androidx.test.espresso.matcher.ViewMatchers.* -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.uiautomator.UiDevice -import androidx.test.uiautomator.UiObjectNotFoundException -import androidx.test.uiautomator.UiSelector -import com.simprints.face.capture.R -import com.simprints.face.capture.screens.FaceCaptureViewModel -import com.simprints.face.capture.screens.livefeedback.LiveFeedbackFragment -import com.simprints.face.capture.screens.livefeedback.LiveFeedbackFragmentViewModel -import com.simprints.infra.logging.Simber -import io.mockk.mockk -import org.hamcrest.CoreMatchers.allOf -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import com.simprints.infra.resources.R as IDR - -@RunWith(AndroidJUnit4::class) -class LiveFeedbackFragmentTest { - private lateinit var device: UiDevice - private val faceCaptureViewModel: FaceCaptureViewModel = mockk(relaxed = true) - private val liveFeedBackVm: LiveFeedbackFragmentViewModel = mockk(relaxed = true) - - @Before - fun setUp() { - device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) - } - - @Test - fun openingLiveFeedBackScreenShowsCorrectText() { - val navController: NavHostController = TestNavHostController( - ApplicationProvider.getApplicationContext(), - ) - val liveFeedBackScenario = - launchFragmentInContainer() - - liveFeedBackScenario.onFragment { liveFeedbackFragment -> - navController.setGraph(R.navigation.graph_face_capture_internal) - Navigation.setViewNavController(liveFeedbackFragment.requireView(), navController) - } - allowPermissionsIfNeeded("Only this time") - allowPermissionsIfNeeded("Allow") - // Is this test really useful for the UI?? - onView( - allOf( - withId(R.id.capture_feedback_txt_title), - withText(IDR.string.face_capture_title_previewing), - ), - ).check(matches(isDisplayed())) - } - - private fun allowPermissionsIfNeeded(text: String) { - if (Build.VERSION.SDK_INT >= 23) { - val allowPermissions = device.findObject(UiSelector().text(text)) - if (allowPermissions.exists()) { - try { - allowPermissions.click() - } catch (e: UiObjectNotFoundException) { - Simber.e("There is no permissions dialog to interact with.", e) - } - } - } - } -} diff --git a/face/capture/src/androidTest/java/com/simprints/face/capture/livefeedback/PreparationFragmentTest.kt b/face/capture/src/androidTest/java/com/simprints/face/capture/livefeedback/PreparationFragmentTest.kt deleted file mode 100644 index 4476c9c715..0000000000 --- a/face/capture/src/androidTest/java/com/simprints/face/capture/livefeedback/PreparationFragmentTest.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.simprints.face.capture.livefeedback - -import androidx.fragment.app.testing.launchFragmentInContainer -import androidx.navigation.NavHostController -import androidx.navigation.Navigation -import androidx.navigation.testing.TestNavHostController -import androidx.test.core.app.ApplicationProvider -import androidx.test.espresso.Espresso.onView -import androidx.test.espresso.action.ViewActions.click -import androidx.test.espresso.matcher.ViewMatchers.withId -import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.google.common.truth.Truth.assertThat -import com.simprints.face.capture.R -import com.simprints.face.capture.screens.preparation.PreparationFragment -import org.junit.Test -import org.junit.runner.RunWith - -@RunWith(AndroidJUnit4::class) -class PreparationFragmentTest { - @Test - fun testNavigationFromPreparationToLiveFeedBackFragment() { - val navController: NavHostController = TestNavHostController( - ApplicationProvider.getApplicationContext(), - ) - val prepFragScenario = - launchFragmentInContainer() - - prepFragScenario.onFragment { prepFragment -> - navController.setGraph(R.navigation.graph_face_capture_internal) - Navigation.setViewNavController(prepFragment.requireView(), navController) - } - - onView(withId(R.id.detection_onboarding_frame)).perform(click()) - assertThat(navController.currentDestination?.id).isEqualTo(R.id.faceLiveFeedbackFragment) - } -} diff --git a/feature/matcher/build.gradle.kts b/feature/matcher/build.gradle.kts index 24cdbd4338..57c7e4789d 100644 --- a/feature/matcher/build.gradle.kts +++ b/feature/matcher/build.gradle.kts @@ -1,6 +1,5 @@ plugins { id("simprints.feature") - id("simprints.testing.android") id("kotlin-parcelize") } diff --git a/fingerprint/capture/build.gradle.kts b/fingerprint/capture/build.gradle.kts index f5e24ee094..1b3f69fe9a 100644 --- a/fingerprint/capture/build.gradle.kts +++ b/fingerprint/capture/build.gradle.kts @@ -1,17 +1,11 @@ plugins { id("simprints.feature") - id("simprints.testing.android") id("kotlin-parcelize") id("simprints.library.kotlinSerialization") } android { namespace = "com.simprints.fingerprint.capture" - - defaultConfig { - testInstrumentationRunner = "com.simprints.fingerprint.CustomTestRunner" - testInstrumentationRunnerArguments["clearPackageData"] = "true" - } } dependencies { diff --git a/infra/event-sync/build.gradle.kts b/infra/event-sync/build.gradle.kts index 59da5d177f..0814d95788 100644 --- a/infra/event-sync/build.gradle.kts +++ b/infra/event-sync/build.gradle.kts @@ -1,7 +1,6 @@ plugins { id("simprints.infra") id("simprints.library.room") - id("simprints.testing.android") id("simprints.library.kotlinSerialization") id("simprints.library.backendApi") } diff --git a/infra/event-sync/src/androidTest/java/com/simprints/infra/eventsync/remote/EventRemoteDataSourceImplAndroidTest.kt b/infra/event-sync/src/androidTest/java/com/simprints/infra/eventsync/remote/EventRemoteDataSourceImplAndroidTest.kt deleted file mode 100644 index a44eaabf50..0000000000 --- a/infra/event-sync/src/androidTest/java/com/simprints/infra/eventsync/remote/EventRemoteDataSourceImplAndroidTest.kt +++ /dev/null @@ -1,701 +0,0 @@ -// TODO fix -@file:Suppress("ktlint:standard:no-empty-file") - -package com.simprints.infra.eventsync.remote - -// @RunWith(AndroidJUnit4::class) -// class EventRemoteDataSourceImplAndroidTest { -// -// companion object { -// const val URL = "https://dev.simprints-apis.com/androidapi/v2/" -// const val SIGNED_ID_USER = "some_signed_user" -// const val DEFAULT_TIME = 1000L -// } -// -// private val app = ApplicationProvider.getApplicationContext() -// -// private val remoteTestingManager: RemoteTestingManager by lazy { -// RemoteTestingManager.create(app) -// } -// -// private val facePayloadId = randomUUID() -// private val fingerPayloadId = randomUUID() -// -// @MockK -// lateinit var timeHelper: TimeHelper -// -// private lateinit var testProject: TestProject -// -// @get:Rule -// val testProjectRule = TestProjectRule(app) -// -// private lateinit var eventRemoteDataSource: EventRemoteDataSource -// private lateinit var eventLabels: EventLabels -// -// @MockK -// var loginManager = mockk() -// -// @Before -// fun setUp() { -// MockKAnnotations.init(this) -// testProject = testProjectRule.testProject -// eventLabels = EventLabels(sessionId = GUID1, deviceId = GUID1, projectId = testProject.id) -// -// val firebaseTestToken = runTest { -// remoteTestingManager.generateFirebaseToken( -// projectId = testProject.id, -// userId = SIGNED_ID_USER -// ) -// } -// coEvery { loginManager.buildClient(any()) } returns SimApiClientImpl( -// EventRemoteInterface::class, -// app, -// URL, -// "deviceId", -// "Test", -// firebaseTestToken.token, -// ) -// eventRemoteDataSource = EventRemoteDataSourceImpl( -// loginManager, -// JsonHelper -// ) -// every { timeHelper.nowMinus(any(), any()) } returns 100 -// every { timeHelper.now() } returns 100 -// } -// -// /** -// * This test case makes calls to BFSID, and its a way for us to validate that, changes to any of -// * the [Event] subtypes, is accepted by BFSID. Thus ensuring that at development time, we catch -// * any issues that might arise as a result of updating the captured events' data structures. -// */ -// @Test(expected = Test.None::class) -// fun aSessionWithAllEvents_shouldGetUploaded() { -// runBlocking { -// val events = mutableListOf() -// EventType.values().forEach { -// events.addEventFor(it) -// } -// -// Simber.d("UPLOAD ALL EVENTS") -// executeUpload(events) -// Simber.d("UPLOAD ENROLMENT V1") -// executeUpload(listOf(createEnrolmentEventV1().apply { labels = eventLabels })) -// } -// } -// -// private suspend fun executeUpload(events: List) { -// eventRemoteDataSource.post( -// projectId = testProject.id, -// acceptInvalidEvents = false, -// events = events.toImmutableList() -// ) -// } -// -// private fun MutableList.addAlertScreenEvents() { -// AlertScreenEvent.AlertScreenPayload.AlertScreenEventType.values() -// .forEach { -// add( -// AlertScreenEvent( -// createdAt = DEFAULT_TIME, -// alertType = it, -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addArtificialTerminationEvent() { -// ArtificialTerminationPayload.Reason.values().forEach { -// add( -// ArtificialTerminationEvent( -// createdAt = DEFAULT_TIME, -// reason = it, -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addAuthenticationEvent() { -// listOf( -// Result.OFFLINE, -// Result.OFFLINE, -// Result.OFFLINE, -// Result.OFFLINE, -// Result.TECHNICAL_FAILURE, -// Result.BACKEND_MAINTENANCE_ERROR, -// Result.INTEGRITY_SERVICE_ERROR, -// Result.UNKNOWN -// ).forEach { -// add( -// AuthenticationEvent( -// createdAt = DEFAULT_TIME, -// endTime = DEFAULT_TIME, -// userInfo = UserInfo("some_project", DEFAULT_USER_ID), -// result = it, -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addAuthorizationEvent() { -// AuthorizationPayload.AuthorizationResult.values().forEach { -// add( -// AuthorizationEvent( -// createdAt = DEFAULT_TIME, -// result = it, -// userInfo = AuthorizationPayload.UserInfo("some_project", DEFAULT_USER_ID), -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addCandidateReadEvent() { -// CandidateReadPayload.LocalResult.values().forEach { local -> -// CandidateReadPayload.RemoteResult.values().forEach { remote -> -// add( -// CandidateReadEvent( -// createdAt = DEFAULT_TIME, -// endTime = DEFAULT_TIME, -// candidateId = randomUUID(), -// localResult = local, -// remoteResult = remote, -// labels = eventLabels -// ) -// ) -// } -// } -// } -// -// private fun MutableList.addConnectivitySnapshotEvent() { -// add( -// ConnectivitySnapshotEvent( -// createdAt = DEFAULT_TIME, -// connections = listOf( -// SimNetworkUtils.Connection( -// SimNetworkUtils.ConnectionType.MOBILE, -// SimNetworkUtils.ConnectionState.CONNECTED -// ) -// ), labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addConsentEvent() { -// ConsentPayload.Type.values().forEach { type -> -// ConsentPayload.Result.values().forEach { result -> -// add( -// ConsentEvent( -// createdAt = DEFAULT_TIME, -// endTime = DEFAULT_TIME, -// consentType = type, -// result = result, -// labels = eventLabels -// ) -// ) -// } -// } -// } -// -// private fun MutableList.addEnrolmentEvent() { -// add( -// EnrolmentEventV2( -// createdAt = DEFAULT_TIME, -// subjectId = randomUUID(), -// projectId = testProject.id, -// moduleId = DEFAULT_MODULE_ID, -// attendantId = DEFAULT_USER_ID, -// personCreationEventId = randomUUID(), -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addFingerprintCaptureEvent() { -// FingerprintCaptureEvent.FingerprintCapturePayload.Result.values().forEach { result -> -// FingerIdentifier.values().forEach { fingerIdentifier -> -// -// val fingerprint = FingerprintCaptureEvent.FingerprintCapturePayload.Fingerprint( -// finger = fingerIdentifier.fromDomainToModuleApi(), -// quality = 0, -// format = "ISO_19794_2" -// ) -// -// val event = FingerprintCaptureEvent( -// createdAt = DEFAULT_TIME, -// endTime = DEFAULT_TIME, -// finger = fingerIdentifier.fromDomainToModuleApi(), -// qualityThreshold = 0, -// result = result, -// fingerprint = fingerprint, -// labels = eventLabels, -// payloadId = fingerPayloadId -// ) -// -// add(event) -// } -// } -// } -// -// private fun MutableList.addFingerprintBiometricCaptureEvent() { -// FingerIdentifier.values().forEach { fingerIdentifier -> -// val fakeTemplate = EncodingUtilsImpl.byteArrayToBase64( -// Random.nextBytes(64) -// ) -// -// val fingerprint = -// FingerprintCaptureBiometricsEvent.FingerprintCaptureBiometricsPayload.Fingerprint( -// finger = fingerIdentifier.fromDomainToModuleApi(), -// template = fakeTemplate, -// quality = 1, -// format = "ISO_19794_2" -// ) -// -// val event = FingerprintCaptureBiometricsEvent( -// createdAt = DEFAULT_TIME, -// fingerprint = fingerprint, -// labels = eventLabels, -// payloadId = fingerPayloadId -// ) -// -// add(event) -// } -// } -// -// -// private fun MutableList.addFaceCaptureEvent() { -// FaceCaptureEvent.FaceCapturePayload.Result.values().forEachIndexed { index, result -> -// -// val face = -// FaceCaptureEvent.FaceCapturePayload.Face( -// yaw = 30f, -// roll = 40f, -// quality = 100f, -// format = RANK_ONE_1_23 -// ) -// -// val event = FaceCaptureEvent( -// startTime = DEFAULT_TIME, -// endTime = DEFAULT_TIME + 100, -// attemptNb = index + 1, -// qualityThreshold = 0f, -// result = result, -// isFallback = false, -// face = face, -// labels = eventLabels, -// payloadId = facePayloadId -// ) -// -// add(event) -// } -// } -// -// private fun MutableList.addFaceCaptureBiometricCaptureEvent() { -// val template = EncodingUtilsImpl.byteArrayToBase64(Random.nextBytes(64)) -// -// val face = -// FaceCaptureBiometricsEvent.FaceCaptureBiometricsPayload.Face( -// roll = 0.0f, -// yaw = 0.0f, -// template = template, -// quality = 1.0f, -// format = RANK_ONE_1_23 -// ) -// -// val event = FaceCaptureBiometricsEvent( -// startTime = DEFAULT_TIME, -// face = face, -// labels = eventLabels, -// payloadId = facePayloadId -// ) -// -// add(event) -// } -// -// private fun MutableList.addFaceCaptureConfirmationEvent() { -// FaceCaptureConfirmationPayload.Result.values().forEach { result -> -// val event = FaceCaptureConfirmationEvent( -// startTime = DEFAULT_TIME, -// endTime = DEFAULT_TIME + 100, -// result = result, -// labels = eventLabels -// ) -// -// add(event) -// } -// } -// -// private fun MutableList.addFaceFallbackCaptureEvent() { -// val event = FaceFallbackCaptureEvent( -// startTime = DEFAULT_TIME, -// endTime = DEFAULT_TIME + 100, -// labels = eventLabels -// ) -// add(event) -// } -// -// private fun MutableList.addFaceOnboardingCompleteEvent() { -// val event = FaceOnboardingCompleteEvent( -// startTime = DEFAULT_TIME, -// endTime = DEFAULT_TIME + 100, -// labels = eventLabels -// ) -// add(event) -// } -// -// private fun MutableList.addGuidSelectionEvent() { -// add( -// GuidSelectionEvent( -// createdAt = DEFAULT_TIME, -// selectedId = randomUUID(), -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addIntentParsingEvent() { -// IntentParsingPayload.IntegrationInfo.values().forEach { -// add( -// IntentParsingEvent( -// createdAt = DEFAULT_TIME, -// integration = it, -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addInvalidIntentEvent() { -// add( -// InvalidIntentEvent( -// creationTime = DEFAULT_TIME, -// action = "some_action", -// extras = mapOf("wrong_field" to "wrong_value"), -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addOneToManyMatchEvent() { -// OneToManyMatchPayload.MatchPoolType.values().forEach { -// add( -// OneToManyMatchEvent( -// createdAt = DEFAULT_TIME, -// endTime = DEFAULT_TIME, -// pool = OneToManyMatchPayload.MatchPool(it, 0), -// matcher = Matcher.SIM_AFIS, -// result = emptyList(), -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addOneToOneMatchEvent() { -// add( -// OneToOneMatchEvent( -// createdAt = DEFAULT_TIME, -// endTime = DEFAULT_TIME, -// candidateId = randomUUID(), -// matcher = Matcher.SIM_AFIS, -// result = MatchEntry(randomUUID(), 0F), -// fingerComparisonStrategy = FingerComparisonStrategy.SAME_FINGER, -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addPersonCreationEvent( -// fingerprintCaptureEvent: FingerprintCaptureEvent?, -// faceCaptureEvent: FaceCaptureEvent? -// ) { -// add( -// PersonCreationEvent( -// startTime = DEFAULT_TIME, -// fingerprintCaptureIds = listOf( -// fingerprintCaptureEvent?.payload?.id -// ?: "" -// ), -// fingerprintReferenceId = randomUUID(), -// faceCaptureIds = listOf(faceCaptureEvent?.payload?.id ?: ""), -// faceReferenceId = randomUUID(), -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addRefusalEvent() { -// RefusalPayload.Answer.values().forEach { -// add( -// RefusalEvent( -// createdAt = DEFAULT_TIME, -// endTime = DEFAULT_TIME, -// reason = it, -// otherText = "other_text", -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addScannerConnectionEvent() { -// add( -// ScannerConnectionEvent( -// createdAt = DEFAULT_TIME, -// scannerInfo = ScannerConnectionPayload.ScannerInfo( -// "scanner_id", "macAddress", -// ScannerGeneration.VERO_2, "hardware" -// ), -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addVero2InfoSnapshotEvents() { -// add( -// Vero2InfoSnapshotEvent( -// createdAt = DEFAULT_TIME, -// version = Vero2InfoSnapshotEvent.Vero2Version.Vero2NewApiVersion( -// "E-1", "1.23", -// "api", "stmApp" -// ), -// battery = Vero2InfoSnapshotEvent.BatteryInfo(70, 15, 1, 37), -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addScannerFirmwareUpdateEvent() { -// add( -// ScannerFirmwareUpdateEvent( -// createdAt = DEFAULT_TIME, endTime = DEFAULT_TIME, chip = "stm", -// targetAppVersion = "targetApp", failureReason = "failureReason", -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addSuspiciousIntentEvent() { -// add( -// SuspiciousIntentEvent( -// createdAt = DEFAULT_TIME, -// unexpectedExtras = mapOf("some_extra_key" to "value"), -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addCompletionCheckEvent() { -// add(CompletionCheckEvent(createdAt = DEFAULT_TIME, completed = true, labels = eventLabels)) -// } -// -// private fun MutableList.addSessionCaptureEvent() { -// val deviceArg = Device( -// androidSdkVersion = VERSION.SDK_INT.toString(), -// deviceModel = Build.MANUFACTURER + "_" + Build.MODEL, -// deviceId = GUID1 -// ) -// -// val event = SessionCaptureEvent( -// id = randomUUID(), -// projectId = testProject.id, -// createdAt = CREATED_AT, -// modalities = listOf(Modality.FINGERPRINT, Modality.FACE), -// appVersionName = "appVersionName", -// libVersionName = "libSimprintsVersionName", -// language = "EN", -// device = deviceArg, -// databaseInfo = DatabaseInfo(sessionCount = 0, recordCount = 2) -// ) -// -// event.payload.location = Location(latitude = 0.0, longitude = 0.0) -// event.payload.uploadedAt = 1 -// event.payload.endedAt = 1 -// -// add(event) -// } -// -// private fun MutableList.addCallbackErrorEvent() { -// ErrorCallbackPayload.Reason.values().forEach { -// add(ErrorCallbackEvent(createdAt = DEFAULT_TIME, reason = it, labels = eventLabels)) -// } -// } -// -// private fun MutableList.addCallbackEnrolmentEvent() { -// add( -// EnrolmentCallbackEvent( -// createdAt = DEFAULT_TIME, -// guid = randomUUID(), -// eventLabels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addCallbackRefusalEvent() { -// add( -// RefusalCallbackEvent( -// createdAt = DEFAULT_TIME, -// reason = "reason", -// extra = "other_text", -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addCallbackVerificationEvent() { -// IAppResponseTier.values().forEach { -// add( -// VerificationCallbackEvent( -// createdAt = DEFAULT_TIME, -// score = CallbackComparisonScore(randomUUID(), 0, it), -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addCallbackIdentificationEvent() { -// IAppResponseTier.values().forEach { -// add( -// IdentificationCallbackEvent( -// createdAt = DEFAULT_TIME, -// sessionId = randomUUID(), -// scores = listOf(CallbackComparisonScore(randomUUID(), 0, it)), -// labels = eventLabels -// ) -// ) -// } -// } -// -// private fun MutableList.addCallbackConfirmationEvent() { -// add( -// ConfirmationCallbackEvent( -// createdAt = DEFAULT_TIME, -// identificationOutcome = true, -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addCalloutEnrolmentEvent() { -// add( -// EnrolmentCalloutEvent( -// createdAt = DEFAULT_TIME, -// projectId = testProject.id, -// userId = DEFAULT_USER_ID, -// moduleId = DEFAULT_MODULE_ID, -// metadata = "metadata", -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addCalloutIdentificationEvent() { -// add( -// IdentificationCalloutEvent( -// createdAt = DEFAULT_TIME, -// projectId = testProject.id, -// userId = DEFAULT_USER_ID, -// moduleId = DEFAULT_MODULE_ID, -// metadata = "metadata", -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addCalloutVerificationEvent() { -// add( -// VerificationCalloutEvent( -// createdAt = DEFAULT_TIME, -// projectId = testProject.id, -// userId = DEFAULT_USER_ID, -// moduleId = DEFAULT_MODULE_ID, -// verifyGuid = randomUUID(), -// metadata = "metadata", -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addCalloutLastBiomentricsEvent() { -// add( -// EnrolmentLastBiometricsCalloutEvent( -// createdAt = DEFAULT_TIME, -// projectId = testProject.id, -// userId = DEFAULT_USER_ID, -// moduleId = DEFAULT_MODULE_ID, -// metadata = "metadata", -// sessionId = randomUUID(), -// labels = eventLabels -// ) -// ) -// } -// -// private fun MutableList.addCalloutConfirmationCallbackEvent() { -// add( -// ConfirmationCalloutEvent( -// createdAt = DEFAULT_TIME, -// projectId = testProject.id, -// selectedGuid = randomUUID(), -// sessionId = randomUUID(), -// labels = eventLabels -// ) -// ) -// } -// -// // Never invoked, but used to enforce that the implementation of a test for every event class -// private fun MutableList.addEventFor(type: EventType) { -// -// when (type) { -// SESSION_CAPTURE -> addSessionCaptureEvent() -// ARTIFICIAL_TERMINATION -> addArtificialTerminationEvent() -// AUTHENTICATION -> addAuthenticationEvent() -// CONSENT -> addConsentEvent() -// ENROLMENT_V2 -> addEnrolmentEvent() -// AUTHORIZATION -> addAuthorizationEvent() -// FINGERPRINT_CAPTURE -> addFingerprintCaptureEvent() -// FINGERPRINT_CAPTURE_BIOMETRICS -> addFingerprintBiometricCaptureEvent() -// ONE_TO_ONE_MATCH -> addOneToOneMatchEvent() -// ONE_TO_MANY_MATCH -> addOneToManyMatchEvent() -// PERSON_CREATION -> addPersonCreationEvent( -// this.filterIsInstance().firstOrNull(), -// this.filterIsInstance().firstOrNull() -// ) -// ALERT_SCREEN -> addAlertScreenEvents() -// GUID_SELECTION -> addGuidSelectionEvent() -// CONNECTIVITY_SNAPSHOT -> addConnectivitySnapshotEvent() -// REFUSAL -> addRefusalEvent() -// CANDIDATE_READ -> addCandidateReadEvent() -// SCANNER_CONNECTION -> addScannerConnectionEvent() -// VERO_2_INFO_SNAPSHOT -> addVero2InfoSnapshotEvents() -// SCANNER_FIRMWARE_UPDATE -> addScannerFirmwareUpdateEvent() -// INVALID_INTENT -> addInvalidIntentEvent() -// CALLOUT_CONFIRMATION -> addCalloutConfirmationCallbackEvent() -// CALLOUT_IDENTIFICATION -> addCalloutIdentificationEvent() -// CALLOUT_ENROLMENT -> addCalloutEnrolmentEvent() -// CALLOUT_VERIFICATION -> addCalloutVerificationEvent() -// CALLOUT_LAST_BIOMETRICS -> addCalloutLastBiomentricsEvent() -// CALLBACK_IDENTIFICATION -> addCallbackIdentificationEvent() -// CALLBACK_ENROLMENT -> addCallbackEnrolmentEvent() -// CALLBACK_REFUSAL -> addCallbackRefusalEvent() -// CALLBACK_VERIFICATION -> addCallbackVerificationEvent() -// CALLBACK_ERROR -> addCallbackErrorEvent() -// CALLBACK_CONFIRMATION -> addCallbackConfirmationEvent() -// SUSPICIOUS_INTENT -> addSuspiciousIntentEvent() -// INTENT_PARSING -> addIntentParsingEvent() -// COMPLETION_CHECK -> addCompletionCheckEvent() -// FACE_ONBOARDING_COMPLETE -> addFaceOnboardingCompleteEvent() -// FACE_FALLBACK_CAPTURE -> addFaceFallbackCaptureEvent() -// FACE_CAPTURE -> addFaceCaptureEvent() -// FACE_CAPTURE_BIOMETRICS -> addFaceCaptureBiometricCaptureEvent() -// FACE_CAPTURE_CONFIRMATION -> addFaceCaptureConfirmationEvent() -// ENROLMENT_RECORD_DELETION, -// ENROLMENT_RECORD_CREATION, -// ENROLMENT_RECORD_MOVE, -// ENROLMENT_V1 -> { -// } -// }.safeSealedWhens -// } -// } diff --git a/infra/images/build.gradle.kts b/infra/images/build.gradle.kts index 483429d5be..b5f7340559 100644 --- a/infra/images/build.gradle.kts +++ b/infra/images/build.gradle.kts @@ -2,7 +2,6 @@ plugins { id("simprints.infra") id("simprints.library.room") id("kotlin-parcelize") - id("simprints.testing.android") id("simprints.library.kotlinSerialization") id("simprints.library.backendApi") } diff --git a/infra/images/src/androidTest/java/com/simprints/infra/images/ImageLocalDataSourceImplTest.kt b/infra/images/src/androidTest/java/com/simprints/infra/images/ImageLocalDataSourceImplTest.kt deleted file mode 100644 index ff7a3b732d..0000000000 --- a/infra/images/src/androidTest/java/com/simprints/infra/images/ImageLocalDataSourceImplTest.kt +++ /dev/null @@ -1,122 +0,0 @@ -package com.simprints.infra.images - -import android.app.Application -import androidx.test.core.app.ApplicationProvider -import com.google.common.truth.Truth.assertThat -import com.simprints.infra.images.local.ImageLocalDataSourceImpl -import com.simprints.infra.images.model.Path -import com.simprints.infra.images.model.SecuredImageRef -import io.mockk.mockk -import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Test -import java.io.File -import java.util.UUID -import kotlin.random.Random - -class ImageLocalDataSourceImplTest { - private val app = ApplicationProvider.getApplicationContext() - private val imagesFolder = "${app.filesDir}/$IMAGES_FOLDER" - private val path = Path("test/$FILE_NAME") - private val imageLocalDataSource = ImageLocalDataSourceImpl(app, mockk(), UnconfinedTestDispatcher()) - - @Before - fun setUp() { - File(imagesFolder).deleteRecursively() - } - - @Test - fun givenAByteArray_storeIt_shouldReturnASecuredImageRef() = runTest { - val byteArray = Random.Default.nextBytes(SIZE_IMAGE) - val securedImageRef = - imageLocalDataSource.encryptAndStoreImage(byteArray, "projectId", path) - require(securedImageRef != null) - - assertThat(securedImageRef.relativePath.compose()).contains(FILE_NAME) - } - - @Test - fun givenAnEncryptedFile_decryptIt_shouldReturnTheRightContent() = runTest { - val byteArray = Random.Default.nextBytes(SIZE_IMAGE) - val securedImageRef = - imageLocalDataSource.encryptAndStoreImage(byteArray, "projectId", path) - require(securedImageRef != null) - - val encryptedInputStream = imageLocalDataSource.decryptImage(securedImageRef) - assertThat(encryptedInputStream?.readBytes()).isEqualTo(byteArray) - } - - @Test - fun encryptThrowsAnException_shouldBeHandled() = runTest { - val securedImageRef = imageLocalDataSource.encryptAndStoreImage( - emptyArray().toByteArray(), - "projectId", - Path(""), - ) - assertThat(securedImageRef).isNull() - } - - @Test - fun shouldListImageFiles() = runTest { - val expectedFileCount = createImageFiles(10).size - val actualFileCount = imageLocalDataSource.listImages("projectId").size - - assertThat(actualFileCount).isEqualTo(expectedFileCount) - } - - @Test - fun shouldListImageFilesStoredAtDifferentSubDirs() = runTest { - val bytes = Random.nextBytes(SIZE_IMAGE) - with(imageLocalDataSource) { - encryptAndStoreImage(bytes, "projectId", Path("dir1/$FILE_NAME")) - encryptAndStoreImage(bytes, "projectId", Path("dir2/$FILE_NAME")) - } - - val images = imageLocalDataSource.listImages("projectId") - val actualFileCount = images.size - - assertThat(actualFileCount).isEqualTo(2) - } - - @Test - fun shouldDeleteImageFiles() = runTest { - val files = createImageFiles(3) - - val fileToDelete = files.first() - imageLocalDataSource.deleteImage(fileToDelete) - val remainingFiles = imageLocalDataSource.listImages("projectId") - - assertThat(remainingFiles.none { it.relativePath == fileToDelete.relativePath }).isTrue() - assertThat(remainingFiles.size).isEqualTo(2) - } - - @Test - fun shouldHandleDeletionOfNonExistingImageFiles() = runTest { - val file = SecuredImageRef(Path("non/existing/path/file.txt")) - - assertThat(imageLocalDataSource.deleteImage(file)).isFalse() - } - - private suspend fun createImageFiles(count: Int): List { - val createdFiles = arrayListOf() - - for (i in 0 until count) { - val byteArray = Random.nextBytes(SIZE_IMAGE) - imageLocalDataSource - .encryptAndStoreImage( - byteArray, - "projectId", - Path("test/${UUID.randomUUID()}"), - )?.let(createdFiles::add) - } - - return createdFiles - } - - companion object { - private const val FILE_NAME = "test.png" - private const val SIZE_IMAGE = 100 * 1024 // 100kB - private const val IMAGES_FOLDER = "images" - } -} diff --git a/infra/license/build.gradle.kts b/infra/license/build.gradle.kts index cc143e84db..a308f37f73 100644 --- a/infra/license/build.gradle.kts +++ b/infra/license/build.gradle.kts @@ -1,6 +1,5 @@ plugins { id("simprints.infra") - id("simprints.testing.android") id("simprints.library.kotlinSerialization") id("simprints.library.backendApi") }