package Ġcom . mart ys uz uki . ui logic Ċ Ċ import Ġcom . mart ys uz uki . repository interface . movie .* Ċ import Ġcom . mart ys uz uki . ui logic . search . Movie Search Ui Logic Impl Ċ import Ġcom . mart ys uz uki . ui logic . util . Movie Repository Mock Ċ import Ġcom . mart ys uz uki . ui logic interface . search . Movie Search Item Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . test . Test Coroutine Scope Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Test Ċ Ċ @ Experimental Cor outines Api Ċ class ĠMovie Search Ui Logic Impl Test Ġ{ ĊĊĠĠĠ Ġprivate Ġclass ĠDependency Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmovie Repository Ġ= ĠMovie Repository Mock () ĊĠĠĠĠĠĠĠ Ġval Ġcoroutine Scope Ġ= ĠTest Coroutine Scope () ĊĠĠĠĠĠĠĠ Ġval Ġcoroutine Dispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Target Ġ= ĠMovie Search Ui Logic Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie Repository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Dispatcher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ search _ sequence _ is Success () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependency Ġ= ĠDependency () ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġ" test - query " ĊĠĠĠĠĠĠĠ Ġval Ġmovie Ġ= ĠMovie ( id Ġ= Ġ 1 , Ġposter Path Ġ= Ġ" test - post ", Ġtitle Ġ= Ġ" test - title ") ĊĠĠĠĠĠĠĠ Ġval Ġmovie Item Ġ= ĠMovie Search Item . Movie ( movie . id , Ġmovie . title , Ġmovie . poster Path ) ĊĠĠĠĠĠĠĠ Ġval Ġmatch Parent Loading Item Ġ= ĠMovie Search Item . Loading ( Movie Search Item . Loading . Style . MATCH _ PARENT ) ĊĠĠĠĠĠĠĠ Ġval Ġwrap Content Loading Item Ġ= ĠMovie Search Item . Loading ( Movie Search Item . Loading . Style . WRAP _ CONTENT ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġactual Items : ĠList < Movie Search Item >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġjob 1 Ġ= Ġdependency . test Target . update ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġactual Items Ġ= Ġit . items Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( this ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġactual Navigate To Movie Detail : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġjob 2 Ġ= Ġdependency . test Target . navigate To Movie Detail ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġactual Navigate To Movie Detail Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( this ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclear : Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Items Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Navigate To Movie Detail Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 st ĠTEST Ġimmediately Ġafter Ġwhen Ġsearch Ġmethod Ġcalled ĊĠĠĠĠĠĠĠ Ġdependency . test Target . search ( query ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( match Parent Loading Item ), Ġactual Items ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Pair ( query , Ġ 1 ), Ġdependency . movie Repository . fetch Movies Spy . params ) ĊĠĠĠĠĠĠĠ Ġclear () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 nd ĠTEST Ġwhen ĠAPI Ġresponse Ġreceived ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . result Ġ= ĠMov ies Result . Success ( listOf ( movie ), ĠPage . Next ( 2 )) ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( movie Item , Ġwrap Content Loading Item ), Ġactual Items ) ĊĠĠĠĠĠĠĠ Ġclear () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 3 rd ĠTEST Ġwhen Ġfetch Ġmore Ġpages ĊĠĠĠĠĠĠĠ Ġdependency . test Target . reach Bottom () ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . result Ġ= ĠMov ies Result . Success ( listOf ( movie ), ĠPage . Finish ) ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Pair ( query , Ġ 2 ), Ġdependency . movie Repository . fetch Movies Spy . params ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( movie Item , Ġmovie Item ), Ġactual Items ) ĊĠĠĠĠĠĠĠ Ġclear () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 4 th ĠIf Ġpage Ġis ĠPages . Finish , Ġno Ġmore Ġfetch ĠAPI Ġcalled ĊĠĠĠĠĠĠĠ Ġdependency . test Target . reach Bottom () ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertNull ( dependency . movie Repository . fetch Movies Spy . params ) ĊĠĠĠĠĠĠĠ ĠassertNull ( actual Items ) ĊĠĠĠĠĠĠĠ Ġclear () ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 5 th ĠTEST Ġwhen Ġon Item Clicked Ġcalled , Ġnavigate To Movie Detail Ġemits Ġmovie Id ĊĠĠĠĠĠĠĠ Ġdependency . test Target . on Item Clicked ( 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( movie Item . id , Ġactual Navigate To Movie Detail ) ĊĠĠĠĠĠĠĠ Ġclear () ĊĊĠĠĠĠĠĠĠ Ġjob 1 . cancel () ĊĠĠĠĠĠĠĠ Ġjob 2 . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ search _ is Success _ but _ no Result () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependency Ġ= ĠDependency () ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġ" test - query " ĊĠĠĠĠĠĠĠ Ġval Ġmatch Parent Loading Item Ġ= ĠMovie Search Item . Loading ( Movie Search Item . Loading . Style . MATCH _ PARENT ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġactual Items : ĠList < Movie Search Item >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġdependency . test Target . update ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġactual Items Ġ= Ġit . items Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 st ĠTEST Ġimmediately Ġafter Ġwhen Ġsearch Ġmethod Ġcalled ĊĠĠĠĠĠĠĠ Ġdependency . test Target . search ( query ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( match Parent Loading Item ), Ġactual Items ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 nd ĠTEST Ġwhen ĠAPI Ġresponse Ġreceived ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . result Ġ= ĠMov ies Result . Success ( emptyList (), ĠPage . Finish ) ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Pair ( query , Ġ 1 ), Ġdependency . movie Repository . fetch Movies Spy . params ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( Movie Search Item . No Results ), Ġactual Items ) ĊĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ search _ load _ more _ prevent ed _ when _ search ing () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependency Ġ= ĠDependency () ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġ" test - query " ĊĠĠĠĠĠĠĠ Ġval Ġmovie Ġ= ĠMovie ( id Ġ= Ġ 1 , Ġposter Path Ġ= Ġ" test - post ", Ġtitle Ġ= Ġ" test - title ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 st ĠTEST Ġimmediately Ġafter Ġwhen Ġsearch Ġmethod Ġcalled ĊĠĠĠĠĠĠĠ Ġdependency . test Target . search ( query ) ĊĠĠĠĠĠĠĠ Ġdependency . test Target . reach Bottom () ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . result Ġ= ĠMov ies Result . Success ( emptyList (), ĠPage . Finish ) ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Pair ( query , Ġ 1 ), Ġdependency . movie Repository . fetch Movies Spy . params ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdependency . movie Repository . fetch Movies Spy . called Count ) ĊĊĠĠĠĠĠĠĠ Ġdependency . test Target . search ( query ) ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . result Ġ= ĠMov ies Result . Success ( listOf ( movie ), ĠPage . Next ( 2 )) ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Pair ( query , Ġ 1 ), Ġdependency . movie Repository . fetch Movies Spy . params ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġdependency . movie Repository . fetch Movies Spy . called Count ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 nd ĠTEST Ġimmediately Ġafter Ġwhen Ġload Ġmore Ġcalled ĊĠĠĠĠĠĠĠ Ġdependency . test Target . reach Bottom () ĊĠĠĠĠĠĠĠ Ġdependency . test Target . reach Bottom () ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . result Ġ= ĠMov ies Result . Success ( listOf ( movie ), ĠPage . Finish ) ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Pair ( query , Ġ 2 ), Ġdependency . movie Repository . fetch Movies Spy . params ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġdependency . movie Repository . fetch Movies Spy . called Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ search _ is Unauthorized () Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependency Ġ= ĠDependency () ĊĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġ" test - query " ĊĠĠĠĠĠĠĠ Ġval Ġmatch Parent Loading Item Ġ= ĠMovie Search Item . Loading ( Movie Search Item . Loading . Style . MATCH _ PARENT ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġactual Items : ĠList < Movie Search Item >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġjob 1 Ġ= Ġdependency . test Target . update ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġactual Items Ġ= Ġit . items Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( this ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġactual Show Unauthorized Dialog : ĠUnit ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġjob 2 Ġ= Ġdependency . test Target . show Unauthorized Dialog ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġactual Show Unauthorized Dialog Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( this ) ĊĊĠĠĠĠĠĠĠ Ġdependency . test Target . search ( query ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 1 st ĠTEST Ġimmediately Ġafter Ġwhen Ġsearch Ġmethod Ġcalled ĊĠĠĠĠĠĠĠ Ġdependency . test Target . search ( query ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( match Parent Loading Item ), Ġactual Items ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ 2 nd ĠTEST Ġwhen ĠUnauthorized Ġresponse Ġreceived ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . result Ġ= ĠMov ies Result . Failure ( Movies Result . Failure . Reason . Unauthorized ) ĊĠĠĠĠĠĠĠ Ġdependency . movie Repository . fetch Movies Spy . advance Time By ( 1 0 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Pair ( query , Ġ 1 ), Ġdependency . movie Repository . fetch Movies Spy . params ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( emptyList < Movie Search Item >(), Ġactual Items ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( actual Show Unauthorized Dialog ) ĊĊĠĠĠĠĠĠĠ Ġjob 1 . cancel () ĊĠĠĠĠĠĠĠ Ġjob 2 . cancel () ĊĠĠĠ Ġ} Ċ }