package Ġcom . stripe . android . view Ċ Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . stripe . android . Customer Session Ċ import Ġcom . stripe . android . Payment Session Config Ċ import Ġcom . stripe . android . Payment Session Data Ċ import Ġcom . stripe . android . Payment Session Fixtures Ċ import Ġcom . stripe . android . model . Customer Ċ import Ġcom . stripe . android . model . Customer Fixtures Ċ import Ġcom . stripe . android . model . Shipping Information Ċ import Ġcom . stripe . android . model . Shipping Method Ċ import Ġcom . stripe . android . utils . TestUtils . idle Looper Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . Un conf ined Test Dispatcher Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . kotlin . argument Captor Ċ import Ġorg . mockito . kotlin . eq Ċ import Ġorg . mockito . kotlin . mock Ċ import Ġorg . mockito . kotlin . verify Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġkotlin . test . Test Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ @ Experimental Cor outines Api Ċ class ĠPayment Flow ViewModel Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcustomer Session : ĠCustomer Session Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġcustomer Retrie val Listener Ġ= Ġargument Captor < Customer Session . Customer Retrie val Listener >() ĊĊĠĠĠ Ġprivate Ġval Ġtest Dispatcher Ġ= ĠUn conf ined Test Dispatcher () ĊĠĠĠ Ġprivate Ġval ĠviewModel Ġ= ĠPayment Flow ViewModel ( ĊĠĠĠĠĠĠĠ Ġcustomer Session Ġ= Ġcustomer Session , ĊĠĠĠĠĠĠĠ Ġpayment Session Data Ġ= ĠPayment Session Data ( Payment Session Fixtures . CONFIG ), ĊĠĠĠĠĠĠĠ Ġwork Context Ġ= Ġtest Dispatcher ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsave Customer Shipping Information _ on Success _ returns Expected Data () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( viewModel . is Shipping Info Submitted ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isFalse () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . save Customer Shipping Information ( Shipping Info Fixtures . DEFAULT ) ĊĠĠĠĠĠĠĠ Ġverify ( customer Session ). set Customer Shipping Information ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( Shipping Info Fixtures . DEFAULT ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( Payment Flow ViewModel . PRODUCT _ USAGE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustomer Retrie val Listener . capture () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcustomer : ĠCustomer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġresult . observe Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustomer Ġ= Ġit . get OrThrow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcustomer Retrie val Listener . first Value . on Customer Retrie ved ( Customer Fixtures . CUSTOMER ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( customer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isNotNull () ĊĠĠĠĠĠĠĠ ĠassertThat ( viewModel . is Shipping Info Submitted ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġvalidate Shipping Information _ with Valid Shipping Info _ creates Expected Shipping Methods () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠviewModel . validate Shipping Information ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFake Shipping Information Validator (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFake Shipping Methods Factory (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSh ipping Info Fixtures . DEFAULT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġshipping Methods : ĠList < Shipping Method >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġresult . observe Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshipping Methods Ġ= Ġit . get OrThrow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġidle Looper () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( shipping Methods ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( SHIP PING _ METHO DS ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( viewModel . shipping Methods ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( SHIP PING _ METHO DS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġvalidate Shipping Information _ with Valid Shipping Info And No Shipping Methods Factory _ creates Empty Shipping Methods () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠviewModel . validate Shipping Information ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFake Shipping Information Validator (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSh ipping Info Fixtures . DEFAULT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġshipping Methods : ĠList < Shipping Method >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġresult . observe Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshipping Methods Ġ= Ġit . get OrThrow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġidle Looper () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( shipping Methods ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEmpty () ĊĠĠĠĠĠĠĠ ĠassertThat ( viewModel . shipping Methods ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġvalidate Shipping Information _ with Invalid Valid Shipping Info _ creates Empty Shipping Methods () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠviewModel . validate Shipping Information ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF ailing Shipping Information Validator (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThrow ing Shipping Methods Factory (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSh ipping Info Fixtures . DEFAULT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġthrowable : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġresult . observe Fore ver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrowable Ġ= Ġit . exception OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġidle Looper () ĊĊĠĠĠĠĠĠĠ ĠassertThat ( throwable ?. message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( SHIP PING _ ERROR _ MESSAGE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠFake Shipping Information Validator Ġ: ĠPayment Session Config . Shipping Information Validator Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠisValid ( shipping Information : ĠSh ipping Information ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ErrorMessage ( shipping Information : ĠSh ipping Information ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Should Ġnot Ġbe Ġcalled Ġbecause Ġshipping Ġinfo Ġis Ġvalid ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠFake Shipping Methods Factory Ġ: ĠPayment Session Config . Shipping Methods Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( shipping Information : ĠSh ipping Information ): ĠList < Shipping Method > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSH IP PING _ METHO DS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠF ailing Shipping Information Validator Ġ: ĠPayment Session Config . Shipping Information Validator Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠisValid ( shipping Information : ĠSh ipping Information ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ErrorMessage ( shipping Information : ĠSh ipping Information ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSH IP PING _ ERROR _ MESSAGE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠThrow ing Shipping Methods Factory Ġ: ĠPayment Session Config . Shipping Methods Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate ( shipping Information : ĠSh ipping Information ): ĠList < Shipping Method > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Always Ġthrows Ġan Ġexception ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSH IP PING _ ERROR _ MESSAGE Ġ= Ġ" Shipping Ġinfo Ġwas Ġinvalid " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSH IP PING _ METHO DS Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSh ipping Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" UP S ĠGround ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" ups - ground ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" USD ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ar rives Ġin Ġ 3 - 5 Ġdays " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSh ipping Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Fed Ex ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" fe dex ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" USD ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ar rives Ġtomorrow " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ