package Ġcom . fib el att i . pin board . features . posts . data Ċ Ċ import Ġcom . fib el att i . core . functional . Success Ċ import Ġcom . fib el att i . core . functional . exception OrNull Ċ import Ġcom . fib el att i . core . functional . get OrNull Ċ import Ġcom . fib el att i . core . functional . get OrThrow Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . create Generic Response Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . create Get Post Dto Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . create Post Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . create Post Dto Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Future Time Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tag 1 Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tag 2 Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tag 3 Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tag String 1 Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tag String 2 Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tag String 3 Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tag String Html Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tag String Html Esc aped Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tags Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Tags Request Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Time Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Url Title Ċ import Ġcom . fib el att i . pin board . Mock DataProvider . mock Url Valid Ċ import Ġcom . fib el att i . pin board . Test RateLimit Runner Ċ import Ġcom . fib el att i . pin board . core . AppConfig Ċ import Ġcom . fib el att i . pin board . core . AppConfig . API _ PAGE _ SIZE Ċ import Ġcom . fib el att i . pin board . core . android . Connectivity Info Provider Ċ import Ġcom . fib el att i . pin board . core . extension . HTML _ CHAR _ MAP Ċ import Ġcom . fib el att i . pin board . core . network . ApiException Ċ import Ġcom . fib el att i . pin board . core . network . Api Result Codes Ċ import Ġcom . fib el att i . pin board . core . network . Invalid RequestException Ċ import Ġcom . fib el att i . pin board . core . util . Date Formatter Ċ import Ġcom . fib el att i . pin board . features . posts . data . model . Post Dto Ċ import Ġcom . fib el att i . pin board . features . posts . data . model . Post Dto Mapper Ċ import Ġcom . fib el att i . pin board . features . posts . data . model . Suggest ed Tag Dto Mapper Ċ import Ġcom . fib el att i . pin board . features . posts . data . model . Suggest ed Tags Dto Ċ import Ġcom . fib el att i . pin board . features . posts . data . model . Update Dto Ċ import Ġcom . fib el att i . pin board . features . posts . domain . Post Visibility Ċ import Ġcom . fib el att i . pin board . features . posts . domain . model . Post Ċ import Ġcom . fib el att i . pin board . features . posts . domain . model . Post ListResult Ċ import Ġcom . fib el att i . pin board . features . posts . domain . model . Suggest ed Tags Ċ import Ġcom . fib el att i . pin board . features . tags . domain . model . Tag Ċ import Ġcom . fib el att i . pin board . features . user . domain . UserRepository Ċ import Ġcom . fib el att i . pin board . random Boolean Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . clear Mocks Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . every Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . flow . collect Indexed Ċ import Ġkotlinx . coroutines . flow . collect Latest Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . test . Test Coroutine Scope Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġorg . junit . jupiter . api . fail Ċ import Ġorg . junit . jupiter . params . Parameterized Test Ċ import Ġorg . junit . jupiter . params . provider . Method Source Ċ Ċ class ĠPosts DataSource Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmock UserRepository Ġ= Ġmock k < UserRepository >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġval Ġmock Api Ġ= Ġmock k < Posts Api >() ĊĠĠĠ Ġprivate Ġval Ġmock Dao Ġ= Ġmock k < Posts Dao >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġval Ġmock Post Dto Mapper Ġ= Ġmock k < Post Dto Mapper >() ĊĠĠĠ Ġprivate Ġval Ġmock Suggest ed Tags Dto Mapper Ġ= Ġmock k < Suggest ed Tag Dto Mapper >() ĊĠĠĠ Ġprivate Ġval Ġmock Date Formatter Ġ= Ġmock k < Date Formatter >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġprivate Ġval Ġmock Connectivity Info Provider Ġ= Ġmock k < Connectivity Info Provider >() ĊĠĠĠ Ġprivate Ġval Ġmock Runner Ġ= ĠTest RateLimit Runner () ĊĠĠĠ Ġprivate Ġval Ġmock Io Scope Ġ= ĠTest Coroutine Scope ( Test Coroutine Dispatcher ()) ĊĊĠĠĠ Ġprivate Ġval Ġmock Post Dto Ġ= Ġmock k < Post Dto >() ĊĠĠĠ Ġprivate Ġval Ġmock List Post Dto Ġ= ĠlistOf ( mock Post Dto ) ĊĠĠĠ Ġprivate Ġval Ġmock Post Ġ= Ġmock k < Post >() ĊĠĠĠ Ġprivate Ġval Ġmock List Post Ġ= ĠlistOf ( mock Post ) ĊĠĠĠ Ġprivate Ġval Ġmock Suggest ed Tags Dto Ġ= Ġmock k < Suggest ed Tags Dto >() ĊĠĠĠ Ġprivate Ġval Ġmock Suggest ed Tags Ġ= Ġmock k < Suggest ed Tags >() ĊĊĠĠĠ Ġprivate Ġval ĠdataSource Ġ= Ġspy k ( ĊĠĠĠĠĠĠĠ ĠPosts DataSource ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock UserRepository , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Post Dto Mapper , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Suggest ed Tags Dto Mapper , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Date Formatter , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Connectivity Info Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Runner , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Io Scope ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠUpdate Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġan Ġerror ĠWHEN Ġupdate Ġis Ġcalled ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . update () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġupdate Ġis Ġcalled ĠTHEN ĠSuccess Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Time ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . update () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrNull ()). isEqualTo ( mock Time ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) ĊĠĠĠ Ġinner Ġclass ĠAdd Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ BeforeEach ĊĠĠĠĠĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Mocks ( mock Api , Ġmock UserRepository ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġan Ġerror ĠWHEN Ġadd Ġis Ġcalled ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġ 2 0 0 Ġbut Ġthe Ġresult Ġcode Ġis Ġnot ĠDONE ĠWHEN Ġadd Ġis Ġcalled ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . MISSING _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( ApiException :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġ@ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) ĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠItem AlreadyExists Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġ 2 0 0 ĠAND Ġthe Ġresult Ġcode Ġis ĠITEM _ AL READY _ EXISTS ĠWHEN Ġadd Ġis Ġcalled ĠTHEN Ġthe Ġdb Ġresult Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . ITEM _ AL READY _ EXISTS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . getPost ( mock Url Valid ) Ġ} Ġreturns Ġmock Post Dto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Post Dto Mapper . map ( mock Post Dto ) Ġ} Ġreturns Ġmock Post ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrNull ()). isEqualTo ( mock Post ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġ 2 0 0 ĠAND Ġthe Ġresult Ġcode Ġis ĠITEM _ AL READY _ EXISTS ĠAND Ġdb Ġhas Ġno Ġdata ĠWHEN Ġadd Ġis Ġcalled ĠTHEN Ġthe Ġapi Ġresult Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . ITEM _ AL READY _ EXISTS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . getPost ( mock Url Valid ) Ġ} Ġreturns Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . getPost ( mock Url Valid ) Ġ} Ġreturns Ġcreate Get Post Dto ( posts Ġ= Ġmock List Post Dto ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Post Dto Mapper . map ( mock Post Dto ) Ġ} Ġreturns Ġmock Post ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrNull ()). isEqualTo ( mock Post ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġ 2 0 0 ĠAND Ġthe Ġresult Ġcode Ġis ĠITEM _ AL READY _ EXISTS ĠAND Ġboth Ġgets Ġfail ĠWHEN Ġadd Ġis Ġcalled ĠTHEN Ġfailure Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . ITEM _ AL READY _ EXISTS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . getPost ( mock Url Valid ) Ġ} Ġreturns Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . getPost ( mock Url Valid ) Ġ} Ġreturns Ġcreate Get Post Dto ( posts Ġ= Ġempty List ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Invalid RequestException :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġ 2 0 0 Ġand Ġthe Ġresult Ġcode Ġis ĠDONE ĠWHEN Ġadd Ġis Ġcalled ĠTHEN ĠSuccess Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Future Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . DONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . getPost ( mock Url Valid ) Ġ} Ġreturns Ġcreate Get Post Dto ( posts Ġ= Ġmock List Post Dto ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . save Posts ( mock List Post Dto ) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Post Dto Mapper . map ( mock Post Dto ) Ġ} Ġreturns Ġmock Post ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Dao . save Posts ( mock List Post Dto ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrNull ()). isEqualTo ( mock Post ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthe Ġtags Ġcontain Ġa Ġplus Ġsign ĠTHEN Ġtheir Ġare Ġescaped Ġbefore Ġthe Ġrequest Ġis Ġsent `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Tags Ġ= Ġ" C % 2 b % 2 b + Tag % 2 b Tag " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Tags Ġ= ĠlistOf ( Tag ( name Ġ= Ġ" C ++ "), ĠTag ( name =" Tag + Tag ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġexpected Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= ĠApp Config . Pin board Api L iterals . NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . DONE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġinput Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġexpected Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= ĠApp Config . Pin board Api L iterals . NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Parameterized Test ĊĠĠĠĠĠĠĠ Ġ@ Method Source (" test Cases ") ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthe Ġparameters ĠTHEN Ġthe Ġexpected Ġapi Ġcall Ġparameters Ġare Ġsent `( test Cases : ĠParams ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Public Ġ= Ġwhen Ġ( test Cases . private ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠApp Config . Pin board Api L iterals . NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Read Later Ġ= Ġwhen Ġ( test Cases . read Later ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠApp Config . Pin board Api L iterals . NO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Replace Ġ= Ġif Ġ( test Cases . replace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Config . Pin board Api L iterals . YES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Config . Pin board Api L iterals . NO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġexpected Public , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġexpected Read Later , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġexpected Replace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . DONE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġ= Ġtest Cases . private , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġtest Cases . read Later , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġtest Cases . replace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġmock Url Valid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġ= Ġexpected Public , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Ġ= Ġexpected Read Later , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġmock Tags Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Ġ= Ġexpected Replace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġtest Cases (): ĠList < Params > Ġ= Ġmutable ListOf < Params >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠlistOf ( true , Ġfalse , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ Ġprivate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ Ġread Later Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( true , Ġfalse ). forEach Ġ{ Ġreplace Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Params ( private , Ġread Later , Ġreplace )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠParams ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprivate : ĠBoolean ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Later : ĠBoolean ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreplace : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Params ( private =$ private , Ġread Later =$ read Later , Ġreplace =$ replace )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠDelete Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġan Ġerror ĠWHEN Ġdelete Ġis Ġcalled ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . delete ( mock Url Valid ) Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . delete ( mock Url Valid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . delete Post ( mock Url Valid ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġ 2 0 0 Ġbut Ġthe Ġresult Ġcode Ġis Ġnot ĠDONE ĠWHEN Ġdelete Ġis Ġcalled ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . delete ( mock Url Valid ) Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . MISSING _ URL ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . delete ( mock Url Valid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . delete Post ( mock Url Valid ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( ApiException :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġ 2 0 0 Ġand Ġthe Ġresult Ġcode Ġis ĠDONE ĠWHEN Ġdelete Ġis Ġcalled ĠTHEN ĠSuccess Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . delete ( mock Url Valid ) Ġ} Ġreturns Ġcreate Generic Response ( Api Result Codes . DONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Future Time ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . delete Post ( mock Url Valid ) Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . delete ( mock Url Valid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Dao . delete Post ( mock Url Valid ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrNull ()). isEqualTo ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠGetAll Posts Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmock Local Data : ĠPost ListResult Ġ= Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠNo Connection Test Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ BeforeEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Connectivity Info Provider . isConnected () Ġ} Ġreturns Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġis Connected Ġis Ġfalse ĠWHEN ĠgetAll Posts Ġis Ġcalled ĠTHEN Ġlocal Ġdata Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns ĠSuccess ( mock Local Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Latest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . get OrThrow ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Nested ĊĠĠĠĠĠĠĠ Ġinner Ġclass ĠConnected Tests Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ BeforeEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Connectivity Info Provider . isConnected () Ġ} Ġreturns Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock UserRepository . last Update Ġ} Ġreturns Ġmock Time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns ĠSuccess ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns ĠSuccess ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġupdate Ġfails ĠTHEN Ġnow As Tz Format Ġis Ġused Ġinstead `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġthrows ĠException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Date Formatter . now As Tz Format () Ġ} Ġreturns Ġmock Time ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Latest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . get OrThrow ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Date Formatter . now As Tz Format () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Api . getAll Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . save Posts ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġuser Ġlast Ġupdate Ġis Ġnull ĠTHEN Ġapi Ġshould Ġbe Ġcalled `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock UserRepository . last Update Ġ} Ġreturns Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Future Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock List Post Dto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠdataSource . save Posts ( any ()) Ġ} Ġreturns ĠUnit ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfail (" Unexpected Ġnumber Ġof Ġcollections ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= Ġ 0 , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĠdataSource . save Posts ( mock List Post Dto ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock UserRepository . last Update Ġ= Ġmock Future Time Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġupdate Ġtime Ġstamp s Ġmatch ĠTHEN Ġlocal Ġdata Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Time ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Latest Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . get OrThrow ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Api . getAll Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . save Posts ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġforce Ġrefresh Ġis Ġtrue ĠTHEN Ġthen Ġapi Ġdata Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmock List Post Dto Ġ= Ġmock k < List < Post Dto >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock List Post Dto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock List Post Dto . size Ġ} Ġreturns ĠAPI _ PAGE _ SIZE Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠdataSource . save Posts ( any ()) Ġ} Ġreturns ĠUnit ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfail (" Unexpected Ġnumber Ġof Ġcollections ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= Ġ 0 , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĠdataSource . save Posts ( mock List Post Dto ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock UserRepository . last Update Ġ= Ġmock Time Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` WHEN ĠgetAll Posts Ġfails ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Future Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠassertThat ( value . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfail (" Unexpected Ġnumber Ġof Ġcollections ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= Ġ 0 , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . save Posts ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġdelete All Posts Ġfails ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Future Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock List Post Dto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . delete All Posts () Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠassertThat ( value . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfail (" Unexpected Ġnumber Ġof Ġcollections ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= Ġ 0 , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock Dao . save Posts ( any ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġsave Posts Ġfails ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Future Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock List Post Dto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠdataSource . save Posts ( any ()) Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠassertThat ( value . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= Ġ 0 , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĠdataSource . save Posts ( mock List Post Dto ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmock UserRepository . last Update Ġ= Ġany () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġfirst Ġcall Ġresult Ġlist Ġhas Ġthe Ġsame Ġsize Ġas ĠAPI _ PAGE _ SIZE ĠTHEN Ġget Additional Pages Ġis Ġcalled `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmock List Post Dto Ġ= Ġmock k < List < Post Dto >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . update () Ġ} Ġreturns ĠUpdate Dto ( mock Future Time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock List Post Dto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock List Post Dto . size Ġ} Ġreturns ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠdataSource . getAdditional Pages () Ġ} Ġreturns ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠdataSource . save Posts ( any ()) Ġ} Ġreturns ĠUnit ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce Refresh Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . collect Indexed Ġ{ Ġindex , Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠassertThat ( value . get OrNull ()). isEqualTo ( mock Local Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfail (" Unexpected Ġnumber Ġof Ġcollections ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= Ġ 0 , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĠdataSource . save Posts ( mock List Post Dto ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĠdataSource . getAdditional Pages () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock UserRepository . last Update Ġ= Ġmock Future Time Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠGet Additional Pages Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` getAdditional Pages Ġshould Ġrun Ġat Ġleast Ġonce `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmock Posts Ġ= Ġmock k < List < Post Dto >>() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĠAPI _ PAGE _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock Posts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠdataSource . save Posts ( any ()) Ġ} Ġreturns ĠUnit ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAdditional Pages () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĠdataSource . save Posts ( mock Posts ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= ĠAPI _ PAGE _ SIZE , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` getAdditional Pages Ġshould Ġrun Ġagain Ġif Ġthe Ġfirst Ġtime Ġreturned Ġthe Ġsame Ġas Ġthe Ġpage Ġsize `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmock Posts Ġ= Ġmock k < List < Post Dto >>() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Posts . size Ġ} Ġreturns Many ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAPI _ PAGE _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAPI _ PAGE _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAPI _ PAGE _ SIZE Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĠAPI _ PAGE _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock Posts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Api . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĠAPI _ PAGE _ SIZE Ġ* Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock Posts ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĠdataSource . save Posts ( any ()) Ġ} Ġreturns ĠUnit ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getAdditional Pages () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 2 ) Ġ{ ĠdataSource . save Posts ( mock Posts ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= ĠAPI _ PAGE _ SIZE , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Api . getAll Posts ( offset Ġ= ĠAPI _ PAGE _ SIZE Ġ* Ġ 2 , Ġlimit Ġ= ĠAPI _ PAGE _ SIZE ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠSave Posts Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġhref Ġcontains Ġescaped Ġescape Ġhtml Ġcharacter ĠTHEN Ġhref Ġis Ġreplaced `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( create Post Dto ( href Ġ= Ġ" https :// www . some - url . com ? query = with % 2 0 space ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( create Post Dto ( href Ġ= Ġ" https :// www . some - url . com ? query = with Ġspace ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . save Posts ( expected ) Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . save Posts ( input ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Dao . save Posts ( expected ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġcontain Ġescaped Ġhtml Ġcharacters ĠTHEN Ġtags Ġare Ġreplaced `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠHTML _ CHAR _ MAP . keys . map Ġ{ Ġcreate Post Dto ( tags Ġ= Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List (). apply Ġ{ Ġadd ( create Post Dto ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠHTML _ CHAR _ MAP . values . map Ġ{ Ġcreate Post Dto ( tags Ġ= Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Mutable List (). apply Ġ{ Ġadd ( create Post Dto ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . save Posts ( expected ) Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . save Posts ( input ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmock Dao . save Posts ( expected ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠGet Local DataSize Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġis Ġempty ĠTHEN Ġtag 1 Ġtag 2 Ġand Ġtag 3 Ġare Ġsent Ġas Ġempty `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getPost Count ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal DataSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getPost Count ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= ĠPosts Dao . pre Format Term ( mock Url Title ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġsize Ġis Ġ 1 ĠTHEN Ġtag 2 Ġand Ġtag 3 Ġare Ġsent Ġas Ġempty `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getPost Count ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal DataSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= ĠlistOf ( mock Tag 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getPost Count ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= ĠPosts Dao . pre Format Term ( mock Url Title ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 1 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġsize Ġis Ġ 2 ĠTHEN Ġtag 3 Ġis Ġsent Ġas Ġempty `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getPost Count ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal DataSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= ĠlistOf ( mock Tag 1 , Ġmock Tag 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getPost Count ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= ĠPosts Dao . pre Format Term ( mock Url Title ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 1 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 2 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġsize Ġis Ġ 3 ĠTHEN Ġall Ġtags Ġare Ġsent `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getPost Count ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal DataSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= ĠlistOf ( mock Tag 1 , Ġmock Tag 2 , Ġmock Tag 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getPost Count ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= ĠPosts Dao . pre Format Term ( mock Url Title ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 1 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 2 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 3 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result ). isEqualTo ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠGet Local Data Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġup ToDate Ġ= Ġrandom Boolean () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmock Local DataSize Ġ= Ġ 4 2 ĊĊĠĠĠĠĠĠĠ Ġ@ BeforeEach ĊĠĠĠĠĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal DataSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock Local DataSize ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġmock List Post Dto ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Post Dto Mapper . map List ( mock List Post Dto ) Ġ} Ġreturns Ġmock List Post ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġlocal Ġdata Ġsize Ġis Ġ 0 ĠTHEN ĠPost ListResult Ġis Ġreturned Ġand ĠgetAll Posts Ġis Ġnot Ġcalled `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal DataSize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrThrow ()). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost ListResult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Count Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposts Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġis Ġempty ĠTHEN Ġtag 1 Ġtag 2 Ġand Ġtag 3 Ġare Ġsent Ġas Ġempty `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= ĠPosts Dao . pre Format Term ( mock Url Title ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrThrow ()). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost ListResult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Local DataSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock List Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġsize Ġis Ġ 1 ĠTHEN Ġtag 2 Ġand Ġtag 3 Ġare Ġsent Ġas Ġempty `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= ĠlistOf ( mock Tag 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= ĠPosts Dao . pre Format Term ( mock Url Title ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 1 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrThrow ()). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost ListResult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Local DataSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock List Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġsize Ġis Ġ 2 ĠTHEN Ġtag 3 Ġis Ġsent Ġas Ġempty `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= ĠlistOf ( mock Tag 1 , Ġmock Tag 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= ĠPosts Dao . pre Format Term ( mock Url Title ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 1 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 2 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrThrow ()). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost ListResult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Local DataSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock List Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġtags Ġsize Ġis Ġ 3 ĠTHEN Ġall Ġtags Ġare Ġsent `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= ĠlistOf ( mock Tag 1 , Ġmock Tag 2 , Ġmock Tag 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= ĠPosts Dao . pre Format Term ( mock Url Title ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 1 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 2 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= ĠPosts Dao . pre Format Tag ( mock Tag 3 . name ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrThrow ()). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPost ListResult ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Local DataSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock List Post , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġget GetAll Ġposts Ġfails ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Dao . getAll Posts ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġterm Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 1 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 2 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag 3 Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Posts Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource . getLocal Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewest First Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Term Ġ= Ġmock Url Title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunt agged Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost Visibility Ġ= ĠPost Visibility . None , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Later Only Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Limit Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Offset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġup ToDate Ġ= Ġup ToDate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠGet Post Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġan Ġerror ĠWHEN Ġget Post Ġis Ġcalled ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . getPost ( mock Url Valid ) Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . getPost ( mock Url Valid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthe Ġlist Ġis Ġempty ĠWHEN Ġget Post Ġis Ġcalled ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . getPost ( mock Url Valid ) Ġ} Ġreturns Ġcreate Get Post Dto ( posts Ġ= Ġempty List ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . getPost ( mock Url Valid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġget Post Ġis Ġcalled ĠTHEN ĠSuccess Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpost Ġ= Ġcreate Post () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . getPost ( mock Url Valid ) Ġ} Ġreturns Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . getPost ( mock Url Valid ) Ġ} Ġreturns Ġcreate Get Post Dto () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Post Dto Mapper . map ( create Post Dto ()) Ġ} Ġreturns Ġpost ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . getPost ( mock Url Valid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrNull ()). isEqualTo ( post ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠSearch Existing Post Tag Test Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġthe Ġdb Ġcall Ġfails ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . search Existing Post Tag ( any ()) Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . search Existing Post Tag ( mock Tag String 1 ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġthe Ġdb Ġcall Ġsucceeds ĠTHEN Ġdistinct Ġand Ġsorted Ġvalues Ġare Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Dao . search Existing Post Tag ( any ()) Ġ} Ġreturns ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Tag String 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ mock Tag String 2 Ġ$ mock Tag String 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ mock Tag String 1 Ġ$ mock Tag String 2 Ġ$ mock Tag String 3 ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Tag String Html Esc aped ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommon Prefix Ġ= Ġmock Tag String 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. common Prefix With ( mock Tag String 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. common Prefix With ( mock Tag String 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. common Prefix With ( mock Tag String Html Esc aped ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . search Existing Post Tag ( common Prefix ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrNull ()). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Tag String 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Tag String 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Tag String 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Tag String Html ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠGet Suggest ed Tags For Url Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` G IV EN Ġthat Ġthe Ġapi Ġreturns Ġan Ġerror ĠWHEN Ġget Suggest ed Tags For Url Ġis Ġcalled ĠTHEN ĠFailure Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . get Suggest ed Tags For Url ( mock Url Valid ) Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . get Suggest ed Tags For Url ( mock Url Valid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . exception OrNull ()). isInstanceOf ( Exception :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġget Suggest ed Tags For Url Ġis Ġcalled ĠTHEN ĠSuccess Ġis Ġreturned `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠG IV EN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmock Api . get Suggest ed Tags For Url ( mock Url Valid ) Ġ} Ġreturns Ġmock Suggest ed Tags Dto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmock Suggest ed Tags Dto Mapper . map ( mock Suggest ed Tags Dto ) Ġ} Ġreturns Ġmock Suggest ed Tags ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrun Blocking Ġ{ ĠdataSource . get Suggest ed Tags For Url ( mock Url Valid ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( result . get OrNull ()). isEqualTo ( mock Suggest ed Tags ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġinner Ġclass ĠClear Cache Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġfun Ġ` WHEN Ġclear Cache Ġis Ġcalled ĠTHEN Ġdao Ġdelete All Posts Ġis Ġcalled `() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĠdataSource . clear Cache () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTHEN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmock Dao . delete All Posts () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ