1
+ package com.firebase.ui.auth.ui.email
2
+
3
+ import android.app.Application
4
+ import androidx.compose.ui.semantics.SemanticsProperties
5
+ import androidx.compose.ui.test.*
6
+ import androidx.compose.ui.test.junit4.createComposeRule
7
+ import androidx.test.core.app.ApplicationProvider
8
+ import androidx.test.ext.junit.runners.AndroidJUnit4
9
+ import com.firebase.ui.auth.IdpResponse
10
+ import com.firebase.ui.auth.data.model.FlowParameters
11
+ import com.firebase.ui.auth.data.model.User
12
+ import com.firebase.ui.auth.viewmodel.email.WelcomeBackPasswordViewModel
13
+ import com.google.common.truth.Truth.assertThat
14
+ import com.google.firebase.FirebaseApp
15
+ import com.google.firebase.FirebaseOptions
16
+ import com.google.firebase.auth.EmailAuthProvider
17
+ import org.junit.Before
18
+ import org.junit.Rule
19
+ import org.junit.Test
20
+ import org.junit.runner.RunWith
21
+
22
+
23
+ private fun hasAnyError (): SemanticsMatcher =
24
+ SemanticsMatcher (" has any error" ) { it.config.contains(SemanticsProperties .Error ) }
25
+
26
+ private val signInButton =
27
+ hasText(" Sign in" , ignoreCase = true ).and (hasClickAction())
28
+
29
+ @RunWith(AndroidJUnit4 ::class )
30
+ class WelcomeBackPasswordPromptTest {
31
+
32
+ @get:Rule
33
+ val composeTestRule = createComposeRule()
34
+
35
+ private lateinit var flowParameters: FlowParameters
36
+ private lateinit var idpResponse: IdpResponse
37
+ private lateinit var appContext: Application
38
+
39
+ @Before
40
+ fun setUp () {
41
+ appContext = ApplicationProvider .getApplicationContext()
42
+
43
+ if (FirebaseApp .getApps(appContext).none { it.name == " test-app" }) {
44
+ val opts = FirebaseOptions .Builder ()
45
+ .setApplicationId(" 1:123:android:dummy" ) // minimal stub values
46
+ .setApiKey(" dummy" )
47
+ .setProjectId(" dummy" )
48
+ .build()
49
+ FirebaseApp .initializeApp(appContext, opts, " test-app" )
50
+ }
51
+
52
+ flowParameters = FlowParameters (
53
+ appName = " test-app" ,
54
+ providers = emptyList(),
55
+ defaultProvider = null ,
56
+ themeId = 0 ,
57
+ logoId = 0 ,
58
+ termsOfServiceUrl = " https://example.com/terms" ,
59
+ privacyPolicyUrl = " https://example.com/privacy" ,
60
+ enableCredentials = false ,
61
+ enableAnonymousUpgrade = false ,
62
+ alwaysShowProviderChoice = true ,
63
+ lockOrientation = false ,
64
+ emailLink = null ,
65
+ passwordResetSettings = null ,
66
+ authMethodPickerLayout = null
67
+ )
68
+
69
+ val user
= User .
Builder (
EmailAuthProvider .
PROVIDER_ID ,
" [email protected] " ).build()
70
+ idpResponse = IdpResponse .Builder (user).build()
71
+ }
72
+
73
+ @Test
74
+ fun blankPassword_showsError_andDoesNotInvokeSuccess () {
75
+ var successCalled = false
76
+
77
+ composeTestRule.setContent {
78
+ WelcomeBackPasswordPrompt (
79
+ flowParameters = flowParameters,
80
+
81
+ idpResponse = idpResponse,
82
+ onSignInSuccess = { successCalled = true },
83
+ onSignInError = {},
84
+ onForgotPassword = {},
85
+ viewModel = WelcomeBackPasswordViewModel (appContext)
86
+ )
87
+ }
88
+
89
+ composeTestRule.onNode(signInButton).performClick()
90
+
91
+ composeTestRule
92
+ .onNode(hasText(" Password" , ignoreCase = true ).and (hasAnyError()))
93
+ .assertExists()
94
+
95
+ assertThat(successCalled).isFalse()
96
+ }
97
+ }
0 commit comments