Skip to content

Commit

Permalink
Merge branch 'develop' into fix/home-tablet-ui
Browse files Browse the repository at this point in the history
  • Loading branch information
adhiamboperes authored Feb 19, 2024
2 parents 9021c88 + a864d5d commit 3cca111
Show file tree
Hide file tree
Showing 113 changed files with 1,636 additions and 1,459 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ app_test(
"//app/src/main/java/org/oppia/android/app/translation/testing:test_module",
"//testing",
"//testing/src/main/java/org/oppia/android/testing/junit:initialize_default_locale_rule",
"//testing/src/main/java/org/oppia/android/testing/logging:event_log_subject",
"//testing/src/main/java/org/oppia/android/testing/logging:sync_status_test_module",
"//testing/src/main/java/org/oppia/android/testing/platformparameter:test_module",
"//testing/src/main/java/org/oppia/android/testing/robolectric:test_module",
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,7 @@ class DeveloperOptionsFragmentTest {
createDeveloperOptionsTestActivityIntent(internalProfileId)
).use {
testCoroutineDispatchers.runCurrent()
val exception = assertThrows(RuntimeException::class) {
val exception = assertThrows<RuntimeException>() {
scrollToPosition(position = 2)
onView(withId(R.id.force_crash_text_view)).perform(click())
}
Expand All @@ -433,7 +433,7 @@ class DeveloperOptionsFragmentTest {
).use {
testCoroutineDispatchers.runCurrent()
onView(isRoot()).perform(orientationLandscape())
val exception = assertThrows(RuntimeException::class) {
val exception = assertThrows<RuntimeException>() {
scrollToPosition(position = 2)
onView(withId(R.id.force_crash_text_view)).perform(click())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ class StringToRatioParserTest {

@Test
fun testParser_parseRatioOrThrow_ratioWithInvalidRatio_throwsException() {
val exception = assertThrows(IllegalArgumentException::class) {
val exception = assertThrows<IllegalArgumentException>() {
stringToRatioParser.parseRatioOrThrow("a:b:c")
}
assertThat(exception)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ class AppLanguageLocaleHandlerTest {

@Test
fun testGetDisplayLocale_initialState_throwsException() {
val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
appLanguageLocaleHandler.getDisplayLocale()
}

Expand Down Expand Up @@ -103,7 +103,7 @@ class AppLanguageLocaleHandlerTest {
fun testInitializeLocale_twice_throwsException() {
appLanguageLocaleHandler.initializeLocale(computeNewAppLanguageLocale(ENGLISH))

val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
appLanguageLocaleHandler.initializeLocale(retrieveAppLanguageLocale())
}

Expand All @@ -117,7 +117,7 @@ class AppLanguageLocaleHandlerTest {
fun testUpdateLocale_uninitialized_throwsException() {
setAppLanguage(ENGLISH)

val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
appLanguageLocaleHandler.updateLocale(retrieveAppLanguageLocale())
}

Expand Down Expand Up @@ -186,7 +186,7 @@ class AppLanguageLocaleHandlerTest {
fun testInitializeLocaleForActivity_uninitialized_throwsException() {
val configuration = Configuration()

val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
appLanguageLocaleHandler.initializeLocaleForActivity(configuration)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ class AppLanguageResourceHandlerTest {
updateAppLanguageTo(OppiaLanguage.ENGLISH)
val handler = retrieveAppLanguageResourceHandler()

assertThrows(Resources.NotFoundException::class) { handler.getStringInLocale(-1) }
assertThrows<Resources.NotFoundException>() { handler.getStringInLocale(-1) }
}

@Test
Expand Down Expand Up @@ -279,7 +279,7 @@ class AppLanguageResourceHandlerTest {
updateAppLanguageTo(OppiaLanguage.ENGLISH)
val handler = retrieveAppLanguageResourceHandler()

assertThrows(Resources.NotFoundException::class) { handler.getStringInLocaleWithWrapping(-1) }
assertThrows<Resources.NotFoundException>() { handler.getStringInLocaleWithWrapping(-1) }
}

@Test
Expand Down Expand Up @@ -316,7 +316,7 @@ class AppLanguageResourceHandlerTest {
updateAppLanguageTo(OppiaLanguage.ENGLISH)
val handler = retrieveAppLanguageResourceHandler()

assertThrows(Resources.NotFoundException::class) {
assertThrows<Resources.NotFoundException>() {
handler.getStringInLocaleWithoutWrapping(-1)
}
}
Expand All @@ -336,7 +336,7 @@ class AppLanguageResourceHandlerTest {
updateAppLanguageTo(OppiaLanguage.ENGLISH)
val handler = retrieveAppLanguageResourceHandler()

assertThrows(Resources.NotFoundException::class) { handler.getStringArrayInLocale(-1) }
assertThrows<Resources.NotFoundException>() { handler.getStringArrayInLocale(-1) }
}

@Test
Expand Down Expand Up @@ -366,7 +366,7 @@ class AppLanguageResourceHandlerTest {
updateAppLanguageTo(OppiaLanguage.ENGLISH)
val handler = retrieveAppLanguageResourceHandler()

assertThrows(Resources.NotFoundException::class) { handler.getQuantityStringInLocale(-1, 0) }
assertThrows<Resources.NotFoundException>() { handler.getQuantityStringInLocale(-1, 0) }
}

@Test
Expand Down Expand Up @@ -397,7 +397,7 @@ class AppLanguageResourceHandlerTest {
updateAppLanguageTo(OppiaLanguage.ENGLISH)
val handler = retrieveAppLanguageResourceHandler()

assertThrows(Resources.NotFoundException::class) {
assertThrows<Resources.NotFoundException>() {
handler.getQuantityStringInLocaleWithWrapping(-1, 0)
}
}
Expand Down Expand Up @@ -432,7 +432,7 @@ class AppLanguageResourceHandlerTest {
updateAppLanguageTo(OppiaLanguage.ENGLISH)
val handler = retrieveAppLanguageResourceHandler()

assertThrows(Resources.NotFoundException::class) {
assertThrows<Resources.NotFoundException>() {
handler.getQuantityStringInLocaleWithoutWrapping(-1, 0)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,15 @@ class LoggingIdentifierController @Inject constructor(
private val persistentCacheStoreFactory: PersistentCacheStore.Factory,
private val oppiaLogger: OppiaLogger
) {
private val learnerIdRandom by lazy { Random(applicationIdSeed) }
// Use a base random to compute the per-ID random IDs in order so that test behaviors are
// consistent and deterministic when fixing the application ID seed.
private val baseRandom = Random(applicationIdSeed)
private val installationRandomSeed = baseRandom.nextLong()
private val sessionRandomSeed = baseRandom.nextLong()
private val learnerRandomSeed = baseRandom.nextLong()
private val installationIdRandom by lazy { Random(installationRandomSeed) }
private val sessionIdRandom by lazy { Random(sessionRandomSeed) }
private val learnerIdRandom by lazy { Random(learnerRandomSeed) }

private val sessionId by lazy { MutableStateFlow(computeSessionId()) }
private val sessionIdDataProvider by lazy {
Expand Down Expand Up @@ -113,12 +121,12 @@ class LoggingIdentifierController @Inject constructor(
sessionId.value = computeSessionId()
}

private fun computeSessionId(): String = learnerIdRandom.randomUuid().toString()
private fun computeSessionId(): String = sessionIdRandom.randomUuid().toString()

private fun computeInstallationId(): String {
return machineLocale.run {
MessageDigest.getInstance("SHA-1")
.digest(learnerIdRandom.randomUuid().toString().toByteArray())
.digest(installationIdRandom.randomUuid().toString().toByteArray())
.joinToString("") { "%02x".formatForMachines(it) }
.substring(startIndex = 0, endIndex = 12)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ class AudioPlayerControllerTest {
@Test
fun testController_notInitialized_releasePlayer_fails() {
setUpMediaReadyApplication()
val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
audioPlayerController.releaseMediaPlayer()
}

Expand All @@ -446,7 +446,7 @@ class AudioPlayerControllerTest {
@Test
fun testError_notPrepared_invokePlay_fails() {
setUpMediaReadyApplication()
val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
audioPlayerController.play(isPlayingFromAutoPlay = false, reloadingMainContent = false)
}

Expand All @@ -456,7 +456,7 @@ class AudioPlayerControllerTest {
@Test
fun testError_notPrepared_invokePause_fails() {
setUpMediaReadyApplication()
val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
audioPlayerController.pause(isFromExplicitUserAction = true)
}

Expand All @@ -466,7 +466,7 @@ class AudioPlayerControllerTest {
@Test
fun testError_notPrepared_invokeSeekTo_fails() {
setUpMediaReadyApplication()
val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
audioPlayerController.seekTo(500)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,21 @@ import dagger.Module
import dagger.Provides
import kotlinx.coroutines.CoroutineDispatcher
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoInteractions
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
import org.oppia.android.domain.oppialogger.analytics.ApplicationLifecycleModule
import org.oppia.android.testing.TestLogReportingModule
import org.oppia.android.testing.assertThrows
import org.oppia.android.testing.firebase.FakeFirebaseAuthWrapperImpl
import org.oppia.android.testing.firebase.TestAuthenticationModule
import org.oppia.android.testing.mockito.capture
import org.oppia.android.testing.robolectric.RobolectricModule
import org.oppia.android.testing.time.FakeOppiaClockModule
import org.oppia.android.util.data.DataProvidersInjector
Expand All @@ -36,66 +44,66 @@ import javax.inject.Singleton
@LooperMode(LooperMode.Mode.PAUSED)
@Config(application = AuthenticationControllerTest.TestApplication::class)
class AuthenticationControllerTest {
@Inject
lateinit var firebaseAuthWrapper: FirebaseAuthWrapper
@field:[Rule JvmField] val mockitoRule: MockitoRule = MockitoJUnit.rule()

@Inject
lateinit var fakeFirebaseAuthWrapperImpl: FakeFirebaseAuthWrapperImpl
@Inject lateinit var firebaseAuthWrapper: FirebaseAuthWrapper
@Inject lateinit var fakeFirebaseAuthWrapperImpl: FakeFirebaseAuthWrapperImpl
@Inject lateinit var authenticationController: AuthenticationController
@field:[Inject BackgroundDispatcher] lateinit var backgroundDispatcher: CoroutineDispatcher

@Inject
lateinit var authenticationController: AuthenticationController

@field:[Inject BackgroundDispatcher]
lateinit var backgroundDispatcher: CoroutineDispatcher
@Mock lateinit var mockFakeSuccessCallback: FakeSuccessCallback
@Mock lateinit var mockFakeFailureCallback: FakeFailureCallback
@Captor lateinit var throwableCaptor: ArgumentCaptor<Throwable>

@Before
fun setUp() {
setUpTestApplicationComponent()
}

@Test
fun testAuthentication_getCurrentUser_userSignedIn_returnsInstanceOfFirebaseUserWrapper() {
fun testAuthentication_signInAnonymously_onlyOnSuccessCalled() {
fakeFirebaseAuthWrapperImpl.simulateSignInSuccess()

firebaseAuthWrapper.signInAnonymously(
onSuccess = {},
onFailure = {}
onSuccess = mockFakeSuccessCallback::onSuccess,
onFailure = mockFakeFailureCallback::onFailure
)

val user = authenticationController.currentFirebaseUser

assertThat(user).isInstanceOf(FirebaseUserWrapper::class.java)
// onSuccess should be called.
verify(mockFakeSuccessCallback).onSuccess()
verifyNoInteractions(mockFakeFailureCallback)
}

@Test
fun testAuthentication_signInAnonymously_succeeds() {
fakeFirebaseAuthWrapperImpl.simulateSignInSuccess()
fun testAuthentication_signInAnonymously_onlyOnFailureCalled() {
fakeFirebaseAuthWrapperImpl.simulateSignInFailure()

firebaseAuthWrapper.signInAnonymously(
onSuccess = {},
onFailure = {}
onSuccess = mockFakeSuccessCallback::onSuccess,
onFailure = mockFakeFailureCallback::onFailure
)

val user = authenticationController.currentFirebaseUser

assertThat(user).isInstanceOf(FirebaseUserWrapper::class.java)
// onFailure should be called with the failure details.
verify(mockFakeFailureCallback).onFailure(capture(throwableCaptor))
verifyNoInteractions(mockFakeSuccessCallback)
assertThat(throwableCaptor.value).hasMessageThat().contains("Sign-in failure")
}

@Test
fun testAuthentication_signInAnonymously_failure_returnsException() {
fakeFirebaseAuthWrapperImpl.simulateSignInFailure()
fun testAuthentication_getCurrentUser_userSignedIn_returnsInstanceOfFirebaseUserWrapper() {
fakeFirebaseAuthWrapperImpl.simulateSignInSuccess()
firebaseAuthWrapper.signInAnonymously(
onSuccess = mockFakeSuccessCallback::onSuccess,
onFailure = mockFakeFailureCallback::onFailure
)

assertThrows(Throwable::class) {
firebaseAuthWrapper.signInAnonymously(
onSuccess = {},
onFailure = {}
)
}
val user = authenticationController.currentFirebaseUser

assertThat(user).isInstanceOf(FirebaseUserWrapper::class.java)
}

private fun setUpTestApplicationComponent() {
ApplicationProvider.getApplicationContext<TestApplication>()
.inject(this)
ApplicationProvider.getApplicationContext<TestApplication>().inject(this)
}

@Module
Expand Down Expand Up @@ -141,4 +149,8 @@ class AuthenticationControllerTest {

override fun getDataProvidersInjector(): DataProvidersInjector = component
}

interface FakeSuccessCallback { fun onSuccess() }

interface FakeFailureCallback { fun onFailure(failure: Throwable) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ class AnswerClassificationControllerTest {
fun testClassify_forUnknownInteraction_throwsException() {
val interaction = Interaction.getDefaultInstance()

val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
answerClassificationController.classify(
interaction,
TEST_STRING_0,
Expand All @@ -170,7 +170,7 @@ class AnswerClassificationControllerTest {
.addAnswerGroups(AnswerGroup.newBuilder().addRuleSpecs(RuleSpec.getDefaultInstance()))
.build()

val exception = assertThrows(IllegalStateException::class) {
val exception = assertThrows<IllegalStateException>() {
answerClassificationController.classify(
interaction,
TEST_STRING_0,
Expand Down
Loading

0 comments on commit 3cca111

Please sign in to comment.