package Ġcom . raz ew are . emit ron . data . content Ċ Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . n ha ar man . mock it ok otlin 2 .* Ċ import Ġcom . ray w ender lich . android . preferences . General Settings Prefs Ċ import Ġcom . raz ew are . emit ron . model .* Ċ import Ġcom . raz ew are . emit ron . utils .* Ċ import Ġcom . raz ew are . emit ron . utils . async . Thread Manager Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Argument Matchers .* Ċ import Ġorg . mockito . Mockito Ċ import Ġretrofit 2 . Response Ċ import Ġretrofit 2 . mock . Calls Ċ Ċ class ĠContent Repository Test Ġ{ ĊĊĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠContent Repository ĊĊĠ Ġprivate Ġval Ġcontent Api : ĠContent Api Ġ= Ġmock () ĊĠ Ġprivate Ġval Ġcontent DataSource Local : ĠContent DataSource Local Ġ= Ġmock () ĊĊĠ Ġ@ get : Rule ĊĠ Ġval Ġinstant Task Executor Rule : ĠInstant Task Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠ Ġprivate Ġval Ġthread Manager : ĠThread Manager Ġ= Ġmock () ĊĊĠ Ġprivate Ġval Ġsettings Pref : ĠGeneral Settings Prefs Ġ= Ġmock () ĊĊĠ Ġ@ get : Rule ĊĠ Ġval Ġtest Coroutine Rule : ĠTest Coroutine Rule Ġ= ĠTest Coroutine Rule () ĊĊĠ Ġ@ Before ĊĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠ Ġwhenever ( thread Manager . io ). do Return ( Dispatch ers . Un conf ined ) ĊĠĠĠ Ġwhenever ( thread Manager . network Executor ). do Return ( Current Thread Executor ()) ĊĠĠĠ Ġrepository Ġ= ĠContent Repository ( content Api , Ġthread Manager , Ġsettings Pref , Ġcontent DataSource Local ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTest Ġno Ġdata Ġreturned Ġfrom ĠAPI ĊĠĠ Ġ*/ ĊĠ Ġ@ Test ĊĠ Ġfun Ġget Contents _ no Data () Ġ{ ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġcontents Ġ= ĠContents ( datum Ġ= Ġempty List ()) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany OrNull () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( ĊĠĠĠĠĠ ĠCalls . response ( ĊĠĠĠĠĠĠĠ Ġcontents ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= Ġrepository . get Contents ( filters Ġ= Ġempty List (), ĠpageSize Ġ= Ġ 5 ) ĊĠĠĠ Ġval Ġnetwork Observer Ġ= Ġresult . ui State ?. observe ForTesting Observer () ĊĠĠĠ Ġval Ġpage d List Ġ= Ġresult . page d List . observe ForTesting Result () ĊĠĠĠ Ġval Ġresponse : ĠContents ? Ġ= Ġresult . initial Data . observe ForTesting Result Nullable () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( page d List ). isNotNull () ĊĠĠĠ ĠassertThat ( page d List . size ). isEqualTo ( 0 ) ĊĠĠĠ ĠassertThat ( result . ui State . observe ForTesting Result ()). isEqualTo ( Ui StateManager . Ui State . INIT _ EMPTY ) ĊĠĠĠ ĠassertThat ( response ). isNull () ĊĊĠĠĠ Ġnetwork Observer ?. let Ġ{ ĊĠĠĠĠĠ Ġval Ġin Order Ġ= ĠMockito . in Order ( network Observer ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . INIT ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . INIT _ EMPTY ) ĊĠĠĠĠĠ Ġin Order . verify No More Interactions () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTest Ġcorrect ĠAPI Ġparameters Ġare Ġpassed ĊĠĠ Ġ*/ ĊĠ Ġ@ Test ĊĠ Ġfun Ġget Contents _ correct Api Param () Ġ{ ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġcontents Ġ= ĠContents ( datum Ġ= Ġempty List ()) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany Boolean () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( ĊĠĠĠĠĠ ĠCalls . response ( ĊĠĠĠĠĠĠĠ Ġcontents ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= Ġrepository . get Contents ( filters Ġ= Ġempty List (), ĠpageSize Ġ= Ġ 5 ) ĊĠĠĠ Ġresult . page d List . observe ForTesting Result () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ Ġval Ġexpected ContentType Filter Ġ= ĠlistOf (" collection ", Ġ" scre enc ast ") ĊĠĠĠ Ġverify ( content Api ). get Contents ( ĊĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠ 5 , ĊĠĠĠĠĠ Ġexpected ContentType Filter , ĊĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠ Ġ"- released _ at ", ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ) ĊĠĠĠ Ġverify No More Interactions ( content Api ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTest Ġcorrect ĠAPI Ġfilters Ġare Ġpassed ĊĠĠ Ġ*/ ĊĠ Ġ@ Test ĊĠ Ġfun Ġget Contents _ correct Api Param With Filters () Ġ{ ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġcontents Ġ= ĠContents ( datum Ġ= Ġempty List ()) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany Boolean () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( ĊĠĠĠĠĠ ĠCalls . response ( ĊĠĠĠĠĠĠĠ Ġcontents ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġfilter List Ġ= ĠlistOf ( ĊĠĠĠĠĠ ĠData ( id Ġ= Ġ" 1 ", Ġtype Ġ= ĠDataType . Categories . to Request Format ()), ĊĠĠĠĠĠ ĠData ( type Ġ= ĠFilter Type . Search . to Request Format (), Ġattributes Ġ= ĠAttributes ( name Ġ= Ġ" Emit ron ")), ĊĠĠĠĠĠ ĠData ( id Ġ= Ġ" 2 ", Ġtype Ġ= ĠDataType . Domains . to Request Format ()), ĊĠĠĠĠĠ ĠData ( type Ġ= ĠFilter Type . Sort . to Request Format (), Ġattributes Ġ= ĠAttributes ( name Ġ= Ġ" pop ularity ")) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= ĊĠĠĠĠĠ Ġrepository . get Contents ( filters Ġ= Ġfilter List , ĠpageSize Ġ= Ġ 5 ) ĊĠĠĠ Ġresult . page d List . observe ForTesting Result () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ Ġval Ġexpected ContentType Filter Ġ= ĠlistOf (" collection ", Ġ" scre enc ast ") ĊĠĠĠ Ġverify ( content Api ). get Contents ( ĊĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠ 5 , ĊĠĠĠĠĠ Ġexpected ContentType Filter , ĊĠĠĠĠĠ ĠlistOf (" 1 "), ĊĠĠĠĠĠ ĠlistOf (" 2 "), ĊĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠ Ġ" Emit ron ", ĊĠĠĠĠĠ Ġ"- pop ularity ", ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ) ĊĠĠĠ Ġverify No More Interactions ( content Api ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTest Ġsingle Ġitem Ġload ĊĠĠ Ġ*/ ĊĠ Ġ@ Test ĊĠ Ġfun Ġget Contents _ some Data () Ġ{ ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġdata Ġ= ĠData () ĊĠĠĠ Ġval Ġcontents Ġ= ĠContents ( datum Ġ= ĠlistOf ( data )) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany OrNull () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( ĊĠĠĠĠĠ ĠCalls . response ( contents ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= Ġrepository . get Contents ( filters Ġ= Ġempty List (), ĠpageSize Ġ= Ġ 5 ) ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( result . page d List . observe ForTesting Result ()). isEqualTo ( listOf ( data )) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTest Ġcomplete Ġdata Ġload ĊĠĠ Ġ*/ ĊĠ Ġ@ Test ĊĠ Ġfun Ġget Contents _ complete Data () Ġ{ ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġdata Ġ= Ġ( 1 .. 5 ). map Ġ{ ĠData ( id Ġ= Ġit . toString ()) Ġ} ĊĠĠĠ Ġval Ġlinks : ĠLinks Ġ= Ġmock () ĊĠĠĠ Ġwhenever ( links . getNext Page ()). do Return ( 2 ) ĊĠĠĠ Ġval Ġcontents Ġ= ĠContents ( datum Ġ= Ġdata , Ġlinks Ġ= Ġlinks ) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany OrNull () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( ĊĠĠĠĠĠ ĠCalls . response ( contents ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= Ġrepository . get Contents ( emptyList (), Ġ 5 ) ĊĠĠĠ Ġval Ġpage d List Ġ= Ġresult . page d List . observe ForTesting Result () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( page d List ). isEqualTo ( data ) ĊĊĠĠĠ Ġ// ĠLoad Ġnext Ġpage ĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġwhenever ( links . getNext Page ()). do Return ( null ) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany OrNull () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( ĊĠĠĠĠĠ ĠCalls . response ( contents ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġpage d List . load All Data () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( page d List ). isNotNull () ĊĠĠĠ ĠassertThat ( page d List . size ). isEqualTo ( 1 0 ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTest Ġinitial Ġload Ġerror ĊĠĠ Ġ*/ ĊĠ Ġ@ Test ĊĠ Ġfun Ġget Contents _ failure () Ġ{ ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġresponse Body : ĠResponse Body Ġ= Ġmock () ĊĠĠĠ Ġval Ġresponse Ġ= ĠCalls . response < Contents >( Response . error ( 5 0 0 , Ġresponse Body )) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany Boolean () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( response ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= Ġrepository . get Contents ( emptyList (), Ġ 5 ) ĊĠĠĠ Ġresult . page d List . observe ForTesting Result () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( result . ui State ?. observe ForTesting Result ()) ĊĠĠĠĠĠ Ġ. isEqualTo ( Ui StateManager . Ui State . INIT _ FAILED ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTest Ġretry Ġafter ĠAPI Ġerror Ġon Ġfirst Ġpage Ġload ĊĠĠ Ġ*/ ĊĠ Ġ@ Test ĊĠ Ġfun Ġget Contents _ retry On _ failure () Ġ{ ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġresponse Body : ĠResponse Body Ġ= Ġmock () ĊĠĠĠ Ġval Ġresponse Ġ= ĠCalls . response < Contents >( Response . error ( 5 0 0 , Ġresponse Body )) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany Boolean () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( response ) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= Ġrepository . get Contents ( emptyList (), Ġ 5 ) ĊĠĠĠ Ġval Ġnetwork Observer Ġ= Ġresult . ui State ?. observe ForTesting Observer () ĊĠĠĠ Ġval Ġlist Ġ= Ġresult . page d List . observe ForTesting Result () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( result . ui State ?. observe ForTesting Result ()). isEqualTo ( Ui StateManager . Ui State . INIT _ FAILED ) ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġdata Ġ= Ġ( 1 .. 2 ). map Ġ{ ĠData ( id Ġ= Ġit . toString ()) Ġ} ĊĠĠĠ Ġval Ġcontents Ġ= ĠContents ( datum Ġ= Ġdata ) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany OrNull () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( Calls . response ( contents )) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġresult . retry ?. invoke () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( list . size ). isEqualTo ( 2 ) ĊĠĠĠ ĠassertThat ( result . ui State ?. observe ForTesting Result ()). isEqualTo ( ĊĠĠĠĠĠ ĠUi StateManager . Ui State . INIT _ LOADED ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġnetwork Observer ?. let Ġ{ ĊĠĠĠĠĠ Ġval Ġin Order Ġ= ĠMockito . in Order ( network Observer ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . INIT ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . INIT _ FAILED ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . INIT ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . INIT _ LOADED ) ĊĠĠĠĠĠ Ġin Order . verify No More Interactions () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTest Ġretry Ġwhen Ġfirst Ġpage Ġloads , Ġbut Ġsubsequent Ġpage Ġload Ġfails Ġdue Ġto ĠAPI Ġerror ĊĠĠ Ġ*/ ĊĠ Ġ@ Test ĊĠ Ġfun Ġretry After Initial Fails () Ġ{ ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġdata Ġ= Ġ( 1 .. 1 0 ). map Ġ{ ĠData ( id Ġ= Ġit . toString ()) Ġ} ĊĠĠĠ Ġval Ġlinks : ĠLinks Ġ= Ġmock () ĊĠĠĠ Ġwhenever ( links . getNext Page ()). do Return ( 2 ) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany OrNull () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( ĊĠĠĠĠĠ ĠCalls . response ( ĊĠĠĠĠĠĠĠ ĠContents ( ĊĠĠĠĠĠĠĠĠĠ Ġdata . sub List ( 0 , Ġ 5 ), ĊĠĠĠĠĠĠĠĠĠ Ġlinks Ġ= Ġlinks ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= Ġrepository . get Contents ( emptyList (), Ġ 5 ) ĊĠĠĠ Ġval Ġnetwork Observer Ġ= Ġresult . ui State ?. observe ForTesting Observer () ĊĠĠĠ Ġval Ġlist Ġ= Ġresult . page d List . observe ForTesting Result () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( list . size Ġ< Ġdata . size ). isTrue () ĊĠĠĠ ĠassertThat ( result . ui State ?. observe ForTesting Result ()). isEqualTo ( Ui StateManager . Ui State . INIT _ LOADED ) ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġresponse Body : ĠResponse Body Ġ= Ġmock () ĊĠĠĠ Ġval Ġresponse Ġ= ĠCalls . response < Contents >( Response . error ( 5 0 0 , Ġresponse Body )) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany Boolean () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( response ) ĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġlist . load All Data () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( result . ui State ?. observe ForTesting Result ()). isEqualTo ( Ui StateManager . Ui State . ERROR ) ĊĠĠĠ ĠassertThat ( result . retry ). isNotNull () ĊĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġval Ġcontents Ġ= ĠContents ( datum Ġ= Ġdata . sub List ( 5 , Ġ 1 0 )) ĊĠĠĠ Ġwhenever ( ĊĠĠĠĠĠ Ġcontent Api . get Contents ( ĊĠĠĠĠĠĠĠ Ġpage Number Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġany Int (), ĊĠĠĠĠĠĠĠ ĠcontentType Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdifficulty Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġcategory Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġdomain Ġ= Ġany List (), ĊĠĠĠĠĠĠĠ Ġsearch Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġsort Ġ= Ġany String (), ĊĠĠĠĠĠĠĠ Ġprofessional Ġ= Ġany OrNull () ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ). do Return ( Calls . response ( contents )) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġresult . retry ?. invoke () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ ĠassertThat ( result . ui State ?. observe ForTesting Result ()). isEqualTo ( Ui StateManager . Ui State . LOADED ) ĊĠĠĠ ĠassertThat ( list ). isEqualTo ( data ) ĊĊĠĠĠ Ġnetwork Observer ?. let Ġ{ ĊĠĠĠĠĠ Ġval Ġin Order Ġ= ĠMockito . in Order ( network Observer ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . INIT ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . INIT _ LOADED ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . ERROR ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . LOADING ) ĊĠĠĠĠĠ Ġin Order . verify ( network Observer ). on Changed ( Ui StateManager . Ui State . LOADED ) ĊĠĠĠĠĠ Ġin Order . verify No More Interactions () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun ĠgetContent () Ġ{ ĊĠĠĠ Ġtest Coroutine Rule . run Blocking Test Ġ{ ĊĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠ Ġval Ġexpected Content Ġ= ĠContent () ĊĊĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠ Ġwhenever ( content Api . getContent (" 1 ")). do Return ( expected Content ) ĊĊĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġrepository . getContent (" 1 ") ĊĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( expected Content ) ĊĊĠĠĠĠĠ Ġverify ( content Api ). getContent (" 1 ") ĊĠĠĠĠĠ Ġverify No More Interactions ( content Api ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun ĠgetContent From Db () Ġ{ ĊĠĠĠ Ġtest Coroutine Rule . run Blocking Test Ġ{ ĊĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠ Ġval Ġexpected Content Ġ= Ġcom . raz ew are . emit ron . data . create Content With Download () ĊĊĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠ Ġwhenever ( content DataSource Local . getContent (" 1 ")). do Return ( ĊĠĠĠĠĠĠĠ Ġcom . raz ew are . emit ron . data . create Content Detail () ĊĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġrepository . getContent From Db (" 1 ") ĊĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( expected Content ) ĊĊĠĠĠĠĠ Ġverify ( content DataSource Local ). getContent (" 1 ") ĊĠĠĠĠĠ Ġverify No More Interactions ( content Api ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ( expected Ġ= ĠException :: class ) ĊĠ Ġfun ĠgetContent _ failure () Ġ{ ĊĠĠĠ Ġtest Coroutine Rule . run Blocking Test Ġ{ ĊĠĠĠĠĠ Ġ// ĠGiven ĊĠĠĠĠĠ Ġval Ġexpected Ġ= ĠRuntimeException () ĊĠĠĠĠĠ Ġwhenever ( content Api . getContent ( any String ())). do Throw ( expected ) ĊĊĠĠĠĠĠ Ġ// ĠWhen ĊĠĠĠĠĠ Ġrepository . getContent (" 1 ") ĊĊĠĠĠĠĠ Ġ// ĠThen ĊĠĠĠĠĠ Ġverify ( content Api ). getContent (" 1 ") ĊĠĠĠĠĠ Ġverify No More Interactions ( content Api ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġget Search Query () Ġ{ ĊĠĠĠ Ġ// ĠGiven ĊĠĠĠ Ġwhenever ( settings Pref . get Search Queries ()). do Return ( listOf (" Emit ron ", Ġ" Swift ")) ĊĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġval Ġresult Ġ= Ġrepository . get Search Queries () ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ Ġresult Ġis EqualTo ĠlistOf (" Emit ron ", Ġ" Swift ") ĊĠĠĠ Ġverify ( settings Pref ). get Search Queries () ĊĠĠĠ Ġverify No More Interactions ( settings Pref ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġsave Search Query () Ġ{ ĊĠĠĠ Ġ// ĠWhen ĊĠĠĠ Ġrepository . save Search Query (" Emit ron ") ĊĊĠĠĠ Ġ// ĠThen ĊĠĠĠ Ġverify ( settings Pref ). save Search Query (" Emit ron ") ĊĠĠĠ Ġverify No More Interactions ( settings Pref ) ĊĠ Ġ} Ċ } Ċ