Skip to content

Instantly share code, notes, and snippets.

View esilverberg's full-sized avatar

Eric Silverberg esilverberg

View GitHub Profile
@esilverberg
esilverberg / BlockingFirstTest.kt
Last active November 29, 2021 22:09
blockingMostRecent vs blockingFirst
@DisplayName("Given we are testing blockingFirst")
class BlockingFirstTest : KoinTest() {
private val behaviorSubject: BehaviorSubject<Int> = BehaviorSubject.createDefault(0)
private val observableSubject: Observable<Int> = behaviorSubject
@Test
fun `then it should have emitted six times`() {
var didEmit = 0
observableSubject.doOnNext { didEmit += 1 }.blockingMostRecent(null).iterator().next()
Type RxJava ReactiveSwift Combine
properties Observable<T>, where Observable is often backed by a BehaviorSubject Property<T>, where it wraps a MutableProperty CurrentValueSubject or @Published
retrieving values Single<T> SignalProducer<T> Publisher<T, Error>, or Deferred + Future
modifying state Completable SignalProducer<Void, Error> Publisher<T, Error>
// 🍎
// in viewDidLoad
viewModel.events.take(duringLifetimeOf: self).observeValues { [weak self] (event) in
guard let self = self else { return }
switch event {
case .mutualMatch: //...
case .premiumRequired: //...
case .exitMatch: //...
}
// 🍎
// In our viewDidLoad
viewModel.state.producer.take(duringLifetimeOf: self).startWithValues { [weak self] (state) in
guard let self = self else { return }
switch state {
case .initial: //...
case .error: //...
case .loading: //...
case .started: //...
case .finished: //...
Platform Interface Implementation Example
iOS <feature>ApiImplementing <feature>Api MatchApiImplementing / MatchApi
Android I<feature>Api <feature>Api IMatchApi / MatchApi
Platform GET POST/DELETE
iOS SignalProducer<T, TError> or AnyPublisher<T, TError> SignalProducer<Void, Error> or AnyPublisher<Void, TError>
Android Single Completable
static func mapError(apiError: Error) -> PSSFreeTrialError {
if let apiError = apiError as? PSSApiError {
switch apiError.statusCode {
case Int(HTTP_RESPONSE_BAD_REQUEST):
return PSSFreeTrialError.cannotBeActivated
@Nested
@DisplayName("given I flag someone")
inner class FlagSomeone {
lateinit var testObserver: TestObserver<MatchEvent>
lateinit var targetProfile: Profile
@BeforeEach
fun setup() {
testObserver = matchViewModel.events.test()
context("given I flag someone") {
var testObs: TestObserver<PSSMatchViewModel.Event, Never>!
var targetProfile: PSSProfile!
beforeEach {
testObs = TestObserver<PSSMatchViewModel.Event, Never>()
viewModel.events.signal.observe(testObs.observer)
for _ in 0..<instructionCardsNum {
viewModel.swipe(rating: PSSMatchRating.interested)
class InstantExecutorExtension : BeforeEachCallback, AfterEachCallback {
override fun beforeEach(context: ExtensionContext?) {
ArchTaskExecutor.getInstance()
.setDelegate(object : TaskExecutor() {
override fun executeOnDiskIO(runnable: Runnable) = runnable.run()
override fun postToMainThread(runnable: Runnable) = runnable.run()
override fun isMainThread(): Boolean = true
})