Skip to content

Instantly share code, notes, and snippets.

View elihart's full-sized avatar

Eli Hart elihart

  • Airbnb
  • San Francisco
View GitHub Profile
@elihart
elihart / InteractionTestingClickResultExample.json
Created November 20, 2019 18:58
Interaction Testing Report Click Result Example
"click": [
{
"startActivityFromFragment": {
"activity": "MvRxActivity",
"calledFrom": "AccountLandingFragment",
"extras": "[fragment_class=com.airbnb.android.profile.UserProfileFragment, fragment_args=UserProfileArgs(userId=1)]",
"intentFlags": 0,
"requestCode": 102
}
}
@elihart
elihart / InteractionReportExample.json
Last active November 20, 2019 18:55
Airbnb interaction testing report example
"fragment_container->coordinator_layout->recycler_view->AccountDocumentMarqueeModel->link_text": {
"view": "TextView",
"viewId": "link_text",
"click": [
{
"startActivityFromFragment": {
"activity": "MvRxActivity",
"calledFrom": "AccountLandingFragment",
"extras": "[fragment_class=com.airbnb.android.profile.UserProfileFragment, fragment_args=UserProfileArgs(userId=1)]",
"intentFlags": 0,
@elihart
elihart / MvRxMockArgumentSyntaxExample.kt
Last active November 20, 2019 17:49
MvRx Mock Argument Syntax Example
args("No dates") {
setNull {  ::checkInDate }
}
@elihart
elihart / MvRxSetSyntaxChainingExample.kt
Last active November 20, 2019 18:00
MvRx Set Syntax Chaining Example
state("Not super hosted") {
setFalse {  ::listingDetails { success {  ::isHostedBySuperhost } } }
.setFalse {  ::listingDetails { success {  ::primaryHost {  ::isSuperhost } } } }
}
@elihart
elihart / MvRxSetSyntaxShortcutsExample.kt
Created November 20, 2019 17:33
MvRx Set Syntax Shortcuts Example
state("Show cancellation policy subtitle") {
set {  ::bookingDetails { success {  ::cancellationSection {  ::showSubtitle } } } }.with { true }
// Can also be written more simply as:
setTrue {  ::bookingDetails { success {  ::cancellationSection {  ::showSubtitle } } } }
}
@elihart
elihart / MvRxNestedSetSyntaxExample.kt
Created November 20, 2019 17:32
MvRx Nested Set Syntax Example
state("Empty results") {
// Nested copying - gross!
copy(request = Success(request.copy(results = emptyList())))
// A cleaner way to specify the same thing
set {  ::request { success {  ::results } } }.with { emptyList() }
}
@elihart
elihart / MvRxMockVariantDslExample.kt
Created November 20, 2019 17:30
MvRx Mock Variant DSL Example
override fun provideMocks() = mockSingleViewModel(
viewModelReference = DadJokeFragment::viewModel,
defaultState = mockDadJokeState
) {
state("Loading") {
copy(jokes = Loading())
}
state("Empty results") {
copy(jokes = Success(jokes.copy(results = emptyList())))
@elihart
elihart / MvRxDadJokeMockExample.kt
Created November 20, 2019 17:28
MvRx Mock State Example
val mockDadJokeState = DadJokeState(
jokes = Success(
value = JokesResponse(
nextPage = 3,
results = listOf(
Joke(
id = "0LuXvkq4Muc",
joke = "I'm tired of following my dreams. I'm just going to ask them where they are going and meet up with them later."
),
Joke(
@elihart
elihart / MvRxMockDeclarationExample.kt
Created November 20, 2019 17:25
MvRx Mock Declaration Example
class DadJokeFragment : MvRxFragment() {
val viewModel: DadJokeViewModel by fragmentViewModel()
override fun provideMocks() = mockSingleViewModel(
viewModelReference = DadJokeFragment::viewModel,
defaultState = mockDadJokeState
)
}
@elihart
elihart / MvRxHelloWorld.kt
Created November 20, 2019 17:19
MvRx Hello World Example
data class MyState(val text: String = "Hello World") : MvRxState
class MyViewModel(state: MyState) : BaseMvRxViewModel<MyState>(state)
class MyFragment : MvRxFragment() {
val viewModel: MyViewModel by fragmentViewModel()
fun epoxyController() = simpleController(viewModel) { state ->
textRow {