|
29 | 29 |
|
30 | 30 | import android.app.Application; |
31 | 31 | import androidx.annotation.NonNull; |
| 32 | +import androidx.annotation.Nullable; |
32 | 33 | import androidx.test.core.app.ApplicationProvider; |
33 | 34 | import com.google.android.gms.tasks.Tasks; |
34 | 35 | import com.google.firebase.FirebaseApp; |
|
56 | 57 | import io.reactivex.Flowable; |
57 | 58 | import io.reactivex.FlowableEmitter; |
58 | 59 | import io.reactivex.Maybe; |
| 60 | +import java.util.Map; |
59 | 61 | import org.junit.Before; |
60 | 62 | import org.junit.Test; |
61 | 63 | import org.junit.runner.RunWith; |
62 | 64 | import org.mockito.Mock; |
| 65 | +import org.mockito.Mockito; |
63 | 66 | import org.mockito.MockitoAnnotations; |
64 | 67 | import org.robolectric.RobolectricTestRunner; |
65 | 68 | import org.robolectric.annotation.Config; |
@@ -151,9 +154,8 @@ public Builder toBuilder() { |
151 | 154 | @Mock private FirebaseInAppMessagingDisplayCallbacks displayCallbacks; |
152 | 155 | @Mock private ProgramaticContextualTriggers programaticContextualTriggers; |
153 | 156 |
|
154 | | - @Mock |
155 | 157 | DeveloperListenerManager developerListenerManager = |
156 | | - new DeveloperListenerManager(TestOnlyExecutors.background()); |
| 158 | + Mockito.spy(new DeveloperListenerManager(TestOnlyExecutors.background())); |
157 | 159 |
|
158 | 160 | FirebaseApp firebaseApp1; |
159 | 161 | FirebaseOptions options; |
@@ -214,6 +216,8 @@ public void setup() { |
214 | 216 | displayCallbacksFactory, |
215 | 217 | developerListenerManager, |
216 | 218 | TestOnlyExecutors.lite()); |
| 219 | + |
| 220 | + developerListenerManager.removeAllListeners(); |
217 | 221 | } |
218 | 222 |
|
219 | 223 | @Test |
@@ -299,4 +303,80 @@ public void addDisplayErrorListener_forwardsEventListenerRequestsToDeveloperList |
299 | 303 | firebaseInAppMessaging.addDisplayErrorListener((inAppMessage, error) -> {}); |
300 | 304 | verify(developerListenerManager, times(1)).addDisplayErrorListener(any()); |
301 | 305 | } |
| 306 | + |
| 307 | + @Test |
| 308 | + public void addRemoveListeners_WorksAsExpected() { |
| 309 | + FirebaseInAppMessagingClickListener clickListener = (inAppMessage, action) -> {}; |
| 310 | + FirebaseInAppMessagingDismissListener dismissListener = inAppMessage -> {}; |
| 311 | + FirebaseInAppMessagingImpressionListener impressionListener = inAppMessage -> {}; |
| 312 | + FirebaseInAppMessagingDisplayErrorListener displayErrorListener = (inAppMessage, error) -> {}; |
| 313 | + |
| 314 | + verifyListenerPresenceAndListenersCountMatch(null, false, 0); |
| 315 | + |
| 316 | + firebaseInAppMessaging.addClickListener(clickListener); |
| 317 | + verifyListenerPresenceAndListenersCountMatch(clickListener, true, 1); |
| 318 | + |
| 319 | + firebaseInAppMessaging.addDismissListener(dismissListener); |
| 320 | + verifyListenerPresenceAndListenersCountMatch(dismissListener, true, 2); |
| 321 | + |
| 322 | + firebaseInAppMessaging.addImpressionListener(impressionListener); |
| 323 | + verifyListenerPresenceAndListenersCountMatch(impressionListener, true, 3); |
| 324 | + |
| 325 | + firebaseInAppMessaging.addDisplayErrorListener(displayErrorListener); |
| 326 | + verifyListenerPresenceAndListenersCountMatch(displayErrorListener, true, 4); |
| 327 | + |
| 328 | + firebaseInAppMessaging.removeClickListener(clickListener); |
| 329 | + verifyListenerPresenceAndListenersCountMatch(clickListener, false, 3); |
| 330 | + |
| 331 | + firebaseInAppMessaging.removeDismissListener(dismissListener); |
| 332 | + verifyListenerPresenceAndListenersCountMatch(dismissListener, false, 2); |
| 333 | + |
| 334 | + firebaseInAppMessaging.removeImpressionListener(impressionListener); |
| 335 | + verifyListenerPresenceAndListenersCountMatch(impressionListener, false, 1); |
| 336 | + |
| 337 | + firebaseInAppMessaging.removeDisplayErrorListener(displayErrorListener); |
| 338 | + verifyListenerPresenceAndListenersCountMatch(displayErrorListener, false, 0); |
| 339 | + |
| 340 | + verifyListenerPresenceAndListenersCountMatch(null, false, 0); |
| 341 | + } |
| 342 | + |
| 343 | + @Test |
| 344 | + public void addRemoveAllListeners_WorksAsExpected() { |
| 345 | + FirebaseInAppMessagingClickListener clickListener = (inAppMessage, action) -> {}; |
| 346 | + FirebaseInAppMessagingDismissListener dismissListener = inAppMessage -> {}; |
| 347 | + FirebaseInAppMessagingImpressionListener impressionListener = inAppMessage -> {}; |
| 348 | + FirebaseInAppMessagingDisplayErrorListener displayErrorListener = (inAppMessage, error) -> {}; |
| 349 | + |
| 350 | + verifyListenerPresenceAndListenersCountMatch(null, false, 0); |
| 351 | + |
| 352 | + firebaseInAppMessaging.addClickListener(clickListener); |
| 353 | + firebaseInAppMessaging.addDismissListener(dismissListener); |
| 354 | + firebaseInAppMessaging.addImpressionListener(impressionListener); |
| 355 | + firebaseInAppMessaging.addDisplayErrorListener(displayErrorListener); |
| 356 | + |
| 357 | + verifyListenerPresenceAndListenersCountMatch(null, false, 4); |
| 358 | + |
| 359 | + firebaseInAppMessaging.removeAllListeners(); |
| 360 | + |
| 361 | + verifyListenerPresenceAndListenersCountMatch(null, false, 0); |
| 362 | + } |
| 363 | + |
| 364 | + /** |
| 365 | + * Verifies the presence of the provided listener in the set of listeners inside |
| 366 | + * DeveloperListenerManager. |
| 367 | + * |
| 368 | + * @param listener the listener object or null. If null, only count verification will be done. |
| 369 | + * @param shouldPresent should be present or absent. |
| 370 | + * @param listenersCount the number of listeners that should be present. |
| 371 | + */ |
| 372 | + private void verifyListenerPresenceAndListenersCountMatch( |
| 373 | + @Nullable Object listener, boolean shouldPresent, int listenersCount) { |
| 374 | + Map listeners = developerListenerManager.getAllListeners(); |
| 375 | + |
| 376 | + if (listener != null) { |
| 377 | + assertThat(listeners.containsKey(listener)).isEqualTo(shouldPresent); |
| 378 | + } |
| 379 | + |
| 380 | + assertThat(listeners.keySet().size()).isEqualTo(listenersCount); |
| 381 | + } |
302 | 382 | } |
0 commit comments