Ammar Githam
4 years ago
5 changed files with 214 additions and 54 deletions
-
2app/build.gradle
-
85app/src/main/java/awais/instagrabber/viewmodels/ProfileFragmentViewModel.kt
-
4app/src/main/java/awais/instagrabber/webservices/GraphQLRepository.kt
-
84app/src/test/java/awais/instagrabber/MainCoroutineScopeRule.kt
-
93app/src/test/java/awais/instagrabber/viewmodels/ProfileFragmentViewModelTest.kt
@ -0,0 +1,84 @@ |
|||
/* |
|||
* Copyright (C) 2019 Google LLC |
|||
* |
|||
* Licensed under the Apache License, Version 2.0 (the "License"); |
|||
* you may not use this file except in compliance with the License. |
|||
* You may obtain a copy of the License at |
|||
* |
|||
* http://www.apache.org/licenses/LICENSE-2.0 |
|||
* |
|||
* Unless required by applicable law or agreed to in writing, software |
|||
* distributed under the License is distributed on an "AS IS" BASIS, |
|||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
* See the License for the specific language governing permissions and |
|||
* limitations under the License. |
|||
*/ |
|||
|
|||
package awais.instagrabber |
|||
|
|||
import kotlinx.coroutines.Dispatchers |
|||
import kotlinx.coroutines.ExperimentalCoroutinesApi |
|||
import kotlinx.coroutines.test.TestCoroutineDispatcher |
|||
import kotlinx.coroutines.test.TestCoroutineScope |
|||
import kotlinx.coroutines.test.resetMain |
|||
import kotlinx.coroutines.test.setMain |
|||
import org.junit.rules.TestWatcher |
|||
import org.junit.runner.Description |
|||
|
|||
/** |
|||
* MainCoroutineRule installs a TestCoroutineDispatcher for Disptachers.Main. |
|||
* |
|||
* Since it extends TestCoroutineScope, you can directly launch coroutines on the MainCoroutineRule |
|||
* as a [CoroutineScope]: |
|||
* |
|||
* ``` |
|||
* mainCoroutineRule.launch { aTestCoroutine() } |
|||
* ``` |
|||
* |
|||
* All coroutines started on [MainCoroutineScopeRule] must complete (including timeouts) before the test |
|||
* finishes, or it will throw an exception. |
|||
* |
|||
* When using MainCoroutineRule you should always invoke runBlockingTest on it to avoid creating two |
|||
* instances of [TestCoroutineDispatcher] or [TestCoroutineScope] in your test: |
|||
* |
|||
* ``` |
|||
* @Test |
|||
* fun usingRunBlockingTest() = mainCoroutineRule.runBlockingTest { |
|||
* aTestCoroutine() |
|||
* } |
|||
* ``` |
|||
* |
|||
* You may call [DelayController] methods on [MainCoroutineScopeRule] and they will control the |
|||
* virtual-clock. |
|||
* |
|||
* ``` |
|||
* mainCoroutineRule.pauseDispatcher() |
|||
* // do some coroutines |
|||
* mainCoroutineRule.advanceUntilIdle() // run all pending coroutines until the dispatcher is idle |
|||
* ``` |
|||
* |
|||
* By default, [MainCoroutineScopeRule] will be in a *resumed* state. |
|||
* |
|||
* @param dispatcher if provided, this [TestCoroutineDispatcher] will be used. |
|||
*/ |
|||
@ExperimentalCoroutinesApi |
|||
class MainCoroutineScopeRule(val dispatcher: TestCoroutineDispatcher = TestCoroutineDispatcher()) : |
|||
TestWatcher(), |
|||
TestCoroutineScope by TestCoroutineScope(dispatcher) { |
|||
override fun starting(description: Description?) { |
|||
super.starting(description) |
|||
// If your codebase allows the injection of other dispatchers like |
|||
// Dispatchers.Default and Dispatchers.IO, consider injecting all of them here |
|||
// and renaming this class to `CoroutineScopeRule` |
|||
// |
|||
// All injected dispatchers in a test should point to a single instance of |
|||
// TestCoroutineDispatcher. |
|||
Dispatchers.setMain(dispatcher) |
|||
} |
|||
|
|||
override fun finished(description: Description?) { |
|||
super.finished(description) |
|||
cleanupTestCoroutines() |
|||
Dispatchers.resetMain() |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue