package Ġcomp osable architecture . example . search Ċ Ċ import Ġarrow . core . left Ċ import Ġarrow . core . right Ċ import Ġcomp osable architecture . test . Test Store Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġokhttp 3 . ResponseBody . Companion . to ResponseBody Ċ import Ġorg . junit . Test Ċ import Ġretrofit 2 . HttpException Ċ import Ġretrofit 2 . Response Ċ Ċ class ĠSearch Tests Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Search Ġand Ġclear Ġquery `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= ĠSearch Environment ( weather Client Ġ= ĠMock Weather Client ()) ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠTest Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSearch State (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Reducer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġstore . assert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Search Action . Search Query Changed (" S ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( search Query Ġ= Ġ" S ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Block Ġ{ Ġdispatcher . advance Time By ( 3 0 0 L ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive ( Search Action . Locations Response ( mock Locations . right ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( locations Ġ= Ġmock Locations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Search Action . Search Query Changed ("")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocations Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Query Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Search Ġfailure `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= ĠSearch Environment ( weather Client Ġ= ĠMock Weather Client ()) ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠTest Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSearch State (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Reducer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠHttp Exception ( Response . error < Unit >( 5 0 0 , Ġ"". to ResponseBody ())). left () ĊĊĠĠĠĠĠĠĠ Ġstore . assert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . weather Client . search Location Ġ= Ġ{ Ġerror Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Search Action . Search Query Changed (" S ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( search Query Ġ= Ġ" S ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Block Ġ{ Ġdispatcher . advance Time By ( 3 0 0 L ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive ( Search Action . Locations Response ( error )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Clear Ġquery Ġcancel s Ġin - flight Ġsearch Ġrequest `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= ĠSearch Environment ( weather Client Ġ= ĠMock Weather Client ()) ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠTest Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSearch State (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Reducer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġstore . assert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Search Action . Search Query Changed (" S ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( search Query Ġ= Ġ" S ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Block Ġ{ Ġdispatcher . advance Time By ( 2 0 0 L ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Search Action . Search Query Changed ("")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( search Query Ġ= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Tap Ġon Ġlocation `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġspecial Location Ġ= ĠLocation ( 4 2 , Ġ" Special ĠPlace ") ĊĠĠĠĠĠĠĠ Ġval Ġspecial Location Weather Ġ= ĠLocation Weather ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcon solid ated Weather Ġ= Ġmock Weather , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 4 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= ĠSearch Environment ( weather Client Ġ= ĠMock Weather Client (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather Ġ= Ġ{ Ġspecial Location Weather . right () Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠTest Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSearch State ( locations Ġ= Ġmock Locations Ġ+ Ġspecial Location ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Reducer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġstore . assert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Search Action . Location T apped ( special Location )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( location Weather Request In Flight Ġ= Ġspecial Location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive ( Search Action . Location Weather Response ( special Location Weather . right ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Weather Request In Flight Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Weather Ġ= Ġspecial Location Weather ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Tap Ġon Ġlocation Ġfailure `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĊĠĠĠĠĠĠĠ Ġval Ġerror Ġ= ĠHttp Exception ( Response . error < Unit >( 5 0 0 , Ġ"". to ResponseBody ())). left () ĊĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= ĠSearch Environment ( weather Client Ġ= ĠMock Weather Client (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather Ġ= Ġ{ Ġerror Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠTest Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSearch State ( locations Ġ= Ġmock Locations ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Reducer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġstore . assert Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( Search Action . Location T apped ( mock Locations . first ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( location Weather Request In Flight Ġ= Ġmock Locations . first ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreceive ( Search Action . Location Weather Response ( error )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy ( location Weather Request In Flight Ġ= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ