Skip to content

Commit c6e1a05

Browse files
committed
DataConnectGrpcMetadataUnitTest.kt: fix tests for null access token.
The tests for the `x-firebase-auth-token` and `x-firebase-appcheck` headers properly tested the case where getToken() would return null; however, they did not test for the case when getToken() returned non-null but the `token` property was null. This commit adds that necessary unit test coverage.
1 parent 89c3e53 commit c6e1a05

File tree

2 files changed

+48
-25
lines changed

2 files changed

+48
-25
lines changed

firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadataUnitTest.kt

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import android.os.Build
1919
import androidx.test.ext.junit.runners.AndroidJUnit4
2020
import com.google.firebase.dataconnect.BuildConfig
2121
import com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType
22+
import com.google.firebase.dataconnect.core.DataConnectAppCheck.GetAppCheckTokenResult
23+
import com.google.firebase.dataconnect.core.DataConnectAuth.GetAuthTokenResult
2224
import com.google.firebase.dataconnect.testutil.FirebaseAppUnitTestingRule
2325
import com.google.firebase.dataconnect.testutil.property.arbitrary.appCheckTokenResult
2426
import com.google.firebase.dataconnect.testutil.property.arbitrary.authTokenResult
@@ -31,9 +33,12 @@ import io.kotest.matchers.collections.shouldNotContain
3133
import io.kotest.matchers.shouldBe
3234
import io.kotest.matchers.types.shouldBeSameInstanceAs
3335
import io.kotest.property.Arb
36+
import io.kotest.property.Exhaustive
3437
import io.kotest.property.arbitrary.constant
3538
import io.kotest.property.arbitrary.enum
3639
import io.kotest.property.arbitrary.next
40+
import io.kotest.property.checkAll
41+
import io.kotest.property.exhaustive.of
3742
import io.mockk.coEvery
3843
import io.mockk.mockk
3944
import kotlinx.coroutines.test.runTest
@@ -160,24 +165,33 @@ class DataConnectGrpcMetadataUnitTest {
160165

161166
@Test
162167
fun `should omit x-firebase-auth-token when the auth token is null`() = runTest {
163-
val dataConnectAuth: DataConnectAuth = mockk()
164-
coEvery { dataConnectAuth.getToken(any()) } returns null
165-
val dataConnectGrpcMetadata =
166-
Arb.dataConnect
167-
.dataConnectGrpcMetadata(dataConnectAuth = Arb.constant(dataConnectAuth))
168-
.next()
169-
val requestId = Arb.dataConnect.requestId().next()
170-
val callerSdkType = Arb.enum<CallerSdkType>().next()
168+
val getAuthTokenResults: Exhaustive<GetAuthTokenResult?> =
169+
Exhaustive.of(
170+
null,
171+
Arb.dataConnect.authTokenResult(accessToken = Arb.constant(null)).next(),
172+
)
171173

172-
val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType)
174+
checkAll(getAuthTokenResults) { getAuthTokenResult ->
175+
val dataConnectAuth: DataConnectAuth = mockk()
176+
coEvery { dataConnectAuth.getToken(any()) } returns getAuthTokenResult
177+
val dataConnectGrpcMetadata =
178+
Arb.dataConnect
179+
.dataConnectGrpcMetadata(dataConnectAuth = Arb.constant(dataConnectAuth))
180+
.next()
181+
val requestId = Arb.dataConnect.requestId().next()
182+
val callerSdkType = Arb.enum<CallerSdkType>().next()
173183

174-
metadata.asClue { it.keys() shouldNotContain "x-firebase-auth-token" }
184+
val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType)
185+
186+
metadata.asClue { it.keys() shouldNotContain "x-firebase-auth-token" }
187+
}
175188
}
176189

177190
@Test
178191
fun `should include x-firebase-auth-token when the auth token is not null`() = runTest {
179192
val dataConnectAuth: DataConnectAuth = mockk()
180-
val authTokenResult = Arb.dataConnect.authTokenResult().next()
193+
val authTokenResult =
194+
Arb.dataConnect.authTokenResult(accessToken = Arb.dataConnect.accessToken()).next()
181195
coEvery { dataConnectAuth.getToken(any()) } returns authTokenResult
182196
val dataConnectGrpcMetadata =
183197
Arb.dataConnect
@@ -197,24 +211,33 @@ class DataConnectGrpcMetadataUnitTest {
197211

198212
@Test
199213
fun `should omit x-firebase-appcheck when the AppCheck token is null`() = runTest {
200-
val dataConnectAppCheck: DataConnectAppCheck = mockk {
201-
coEvery { getToken(any()) } returns null
202-
}
203-
val dataConnectGrpcMetadata =
204-
Arb.dataConnect
205-
.dataConnectGrpcMetadata(dataConnectAppCheck = Arb.constant(dataConnectAppCheck))
206-
.next()
207-
val requestId = Arb.dataConnect.requestId().next()
208-
val callerSdkType = Arb.enum<CallerSdkType>().next()
214+
val getAppCheckTokenResults: Exhaustive<GetAppCheckTokenResult?> =
215+
Exhaustive.of(
216+
null,
217+
Arb.dataConnect.appCheckTokenResult(accessToken = Arb.constant(null)).next(),
218+
)
209219

210-
val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType)
220+
checkAll(getAppCheckTokenResults) { getAppCheckTokenResult ->
221+
val dataConnectAppCheck: DataConnectAppCheck = mockk {
222+
coEvery { getToken(any()) } returns getAppCheckTokenResult
223+
}
224+
val dataConnectGrpcMetadata =
225+
Arb.dataConnect
226+
.dataConnectGrpcMetadata(dataConnectAppCheck = Arb.constant(dataConnectAppCheck))
227+
.next()
228+
val requestId = Arb.dataConnect.requestId().next()
229+
val callerSdkType = Arb.enum<CallerSdkType>().next()
211230

212-
metadata.asClue { it.keys() shouldNotContain "x-firebase-appcheck" }
231+
val metadata = dataConnectGrpcMetadata.get(requestId, callerSdkType)
232+
233+
metadata.asClue { it.keys() shouldNotContain "x-firebase-appcheck" }
234+
}
213235
}
214236

215237
@Test
216238
fun `should include x-firebase-appcheck when the AppCheck token is not null`() = runTest {
217-
val appCheckTokenResult = Arb.dataConnect.appCheckTokenResult().next()
239+
val appCheckTokenResult =
240+
Arb.dataConnect.appCheckTokenResult(accessToken = Arb.dataConnect.accessToken()).next()
218241
val dataConnectAppCheck: DataConnectAppCheck = mockk {
219242
coEvery { getToken(any()) } returns appCheckTokenResult
220243
}

firebase-dataconnect/src/test/kotlin/com/google/firebase/dataconnect/testutil/property/arbitrary/arbs.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,9 +333,9 @@ internal inline fun <Data, reified Variables> DataConnectArb.operationRefConstru
333333
}
334334

335335
internal fun DataConnectArb.authTokenResult(
336-
accessToken: Arb<String> = accessToken()
336+
accessToken: Arb<String?> = accessToken().orNull(nullProbability = 0.33),
337337
): Arb<GetAuthTokenResult> = accessToken.map { GetAuthTokenResult(it) }
338338

339339
internal fun DataConnectArb.appCheckTokenResult(
340-
accessToken: Arb<String> = accessToken()
340+
accessToken: Arb<String?> = accessToken().orNull(nullProbability = 0.33),
341341
): Arb<GetAppCheckTokenResult> = accessToken.map { GetAppCheckTokenResult(it) }

0 commit comments

Comments
 (0)