/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠF rol lo Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġus . f rol lo . f rol lo sdk . budget s Ċ Ċ import Ġcom . jr ask a . li ved ata . test Ċ import Ġokhttp 3 . mock webserver . Dispatcher Ċ import Ġokhttp 3 . mock webserver . Mock Response Ċ import Ġokhttp 3 . mock webserver . Re corded Request Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertNotNull Ċ import Ġorg . junit . Assert . assertNull Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Test Ċ import Ġorg . th reet en . bp . LocalDateTime Ċ import Ġorg . th reet en . bp . Zone Offset Ċ import Ġus . f rol lo . f rol lo sdk . Base Android Test Ċ import Ġus . f rol lo . f rol lo sdk . base . Pag inated Result Ċ import Ġus . f rol lo . f rol lo sdk . base . Resource Ċ import Ġus . f rol lo . f rol lo sdk . base . Result Ċ import Ġus . f rol lo . f rol lo sdk . error . Data Error Ċ import Ġus . f rol lo . f rol lo sdk . error . Data Error SubType Ċ import Ġus . f rol lo . f rol lo sdk . error . Data ErrorType Ċ import Ġus . f rol lo . f rol lo sdk . extensions . to Budget Category Ċ import Ġus . f rol lo . f rol lo sdk . mapping . to Budget Ċ import Ġus . f rol lo . f rol lo sdk . mapping . to Budget Period Ċ import Ġus . f rol lo . f rol lo sdk . model . core data . budget s . Budget Frequency Ċ import Ġus . f rol lo . f rol lo sdk . model . core data . budget s . Budget Status Ċ import Ġus . f rol lo . f rol lo sdk . model . core data . budget s . Budget Tracking Status Ċ import Ġus . f rol lo . f rol lo sdk . model . core data . budget s . B ud getType Ċ import Ġus . f rol lo . f rol lo sdk . model . core data . shared . Budget Category Ċ import Ġus . f rol lo . f rol lo sdk . model . test Budget Period ResponseData Ċ import Ġus . f rol lo . f rol lo sdk . model . test Budget ResponseData Ċ import Ġus . f rol lo . f rol lo sdk . network . api . Budget s API Ċ import Ġus . f rol lo . f rol lo sdk . test . R Ċ import Ġus . f rol lo . f rol lo sdk . test utils . readString FromJson Ċ import Ġus . f rol lo . f rol lo sdk . test utils . trimmed Path Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠBudget s Test Ġ: ĠBase Android Test () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġinit Setup () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . init Setup () ĊĊĠĠĠĠĠĠĠ Ġpreferences . logged In Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġpreferences . encrypted AccessToken Ġ= Ġkeystore . encrypt (" Existing AccessToken ") ĊĠĠĠĠĠĠĠ Ġpreferences . encrypted RefreshToken Ġ= Ġkeystore . encrypt (" Existing RefreshToken ") ĊĠĠĠĠĠĠĠ Ġpreferences . accessToken Expiry Ġ= ĠLocalDateTime . now ( Zone Offset . UTC ). to Epoch Second ( Zone Offset . UTC ) Ġ+ Ġ 9 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Merchant Budget s () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 0 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 5 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 1 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 5 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 2 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 3 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 4 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Merchant Budget s ( 6 5 L ). test () ĊĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Merchant Budget s (). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġtest Observer . value (). data ?. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġtest Observer 2 . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Merchant Budget s Filtered () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 0 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 5 ", Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 1 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 5 ", Ġfrequency Ġ= ĠBudget Frequency . F ORT N IGHT LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 2 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 3 ", Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 3 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 2 ", Ġfrequency Ġ= ĠBudget Frequency . DA IL Y ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 4 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 1 ", Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Merchant Budget s ( 6 5 L , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġtest Observer . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Transaction Category Budget s () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 0 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 5 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 1 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 5 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 2 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 3 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 4 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Transaction Category Budget s ( 6 5 L ). test () ĊĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Transaction Category Budget s (). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġtest Observer . value (). data ?. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġtest Observer 2 . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Transaction Category Budget s Filtered () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 0 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 5 ", Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 1 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 5 ", Ġfrequency Ġ= ĠBudget Frequency . F ORT N IGHT LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 2 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 3 ", Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 3 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 2 ", Ġfrequency Ġ= ĠBudget Frequency . DA IL Y ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 4 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 1 ", Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Transaction Category Budget s ( 6 5 L , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġtest Observer . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Budget Category Budget s () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 0 , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY , Ġtype Value Ġ= Ġ" living ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 1 , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY , Ġtype Value Ġ= Ġ" l ifest yle ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 2 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 3 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 3 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 4 , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY , Ġtype Value Ġ= Ġ" l ifest yle ") ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget Category Budget s ( Budget Category . LI F EST Y LE ). test () ĊĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Budget Category Budget s (). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġtest Observer . value (). data ?. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġtest Observer 2 . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Budget Category Budget s Filtered () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 0 , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY , Ġtype Value Ġ= Ġ" living ", Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 1 , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY , Ġtype Value Ġ= Ġ" l ifest yle ", Ġfrequency Ġ= ĠBudget Frequency . F ORT N IGHT LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 2 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 3 ", Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 3 , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY , Ġtype Value Ġ= Ġ" living ", Ġfrequency Ġ= ĠBudget Frequency . DA IL Y ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 1 0 4 , Ġtype Ġ= ĠB ud getType . MER CHANT , Ġtype Value Ġ= Ġ" 6 1 ", Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget Category Budget s ( Budget Category . LI V ING , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġtest Observer . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Budget s () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( 1 0 0 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( 1 0 1 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( 1 0 2 , Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( 1 0 3 , Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( 1 0 5 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 6 Ġ= Ġtest Budget ResponseData ( 1 0 6 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . CANCEL LED , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 7 Ġ= Ġtest Budget ResponseData ( 1 0 7 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . AB O VE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 8 Ġ= Ġtest Budget ResponseData ( 1 0 8 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 9 Ġ= Ġtest Budget ResponseData ( 1 0 9 , Ġfrequency Ġ= ĠBudget Frequency . BI AN NU ALLY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 , Ġdata 6 , Ġdata 7 , Ġdata 8 , Ġdata 9 ) ĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget s ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠBudget Status . ACTIVE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ĊĠĠĠĠĠĠĠ Ġ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertTrue ( test Observer . value (). data ?. isNotEmpty () Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġtest Observer . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Budget sWith Relation () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( 1 0 0 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( 1 0 1 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( 1 0 2 , Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY , Ġstatus Ġ= ĠBudget Status . UN STARTED , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( 1 0 3 , Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( 1 0 5 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 6 Ġ= Ġtest Budget ResponseData ( 1 0 6 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . CANCEL LED , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 7 Ġ= Ġtest Budget ResponseData ( 1 0 7 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . AB O VE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 8 Ġ= Ġtest Budget ResponseData ( 1 0 8 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 9 Ġ= Ġtest Budget ResponseData ( 1 0 9 , Ġfrequency Ġ= ĠBudget Frequency . BI AN NU ALLY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 , Ġdata 6 , Ġdata 7 , Ġdata 8 , Ġdata 9 ) ĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 1 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 0 , Ġb ud getId Ġ= Ġ 1 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 2 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 1 , Ġb ud getId Ġ= Ġ 1 0 1 , Ġtracking Status Ġ= ĠBudget Tracking Status . AB O VE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 3 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 2 , Ġb ud getId Ġ= Ġ 1 0 3 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 4 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 3 , Ġb ud getId Ġ= Ġ 2 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 5 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 4 , Ġb ud getId Ġ= Ġ 2 0 1 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 6 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 5 , Ġb ud getId Ġ= Ġ 1 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 7 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 6 , Ġb ud getId Ġ= Ġ 1 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġperiods Ġ= Ġmutable ListOf ( data 1 1 , Ġdata 1 2 , Ġdata 1 3 , Ġdata 1 4 , Ġdata 1 5 , Ġdata 1 6 , Ġdata 1 7 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget Periods (). insert All (* periods . map Ġ{ Ġit . to Budget Period () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget sWith Relation ( status Ġ= ĠBudget Status . ACTIVE ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertTrue ( test Observer . value (). data ?. isNotEmpty () Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 , Ġtest Observer . value (). data ?. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( test Observer . value (). data ?. get ( 0 )?. budget ?. bud getId , Ġtest Observer . value (). data ?. get ( 0 )?. periods ?. get ( 0 )?. bud getId ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( test Observer . value (). data ?. get ( 0 )?. budget ?. bud getId , Ġ 1 0 0 L ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( test Observer . value (). data ?. get ( 0 )?. periods ?. size , Ġ 3 ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget s Fails If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget s Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . ERROR , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( result . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data Error SubType . MISSING _ ACCESS _ TOKEN , Ġ( result . error Ġas ĠData Error ). sub Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget s All () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ valid ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path ?. contains ( Budget s API . URL _ BU D GET S ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget s Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget s ( current Ġ= Ġtrue ). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġtest Observer . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Budget s API . URL _ BU D GET S , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget s Filtered () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Path Ġ= Ġ" budget s ? current = true " ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ valid ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget s ( true ) Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget s ( current Ġ= Ġtrue ). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġtest Observer . value (). data ?. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( request Path , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget s Failed If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget s ( true ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . ERROR , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( result . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Budget ById () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( 1 0 0 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( 1 0 1 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( 1 0 2 , Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( 1 0 3 , Ġfrequency Ġ= ĠBudget Frequency . AN NU ALLY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget ResponseData ( 1 0 5 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 6 Ġ= Ġtest Budget ResponseData ( 1 0 6 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . CANCEL LED , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 7 Ġ= Ġtest Budget ResponseData ( 1 0 7 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . AB O VE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 8 Ġ= Ġtest Budget ResponseData ( 1 0 8 , Ġfrequency Ġ= ĠBudget Frequency . MONTH LY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 9 Ġ= Ġtest Budget ResponseData ( 1 0 9 , Ġfrequency Ġ= ĠBudget Frequency . BI AN NU ALLY , Ġstatus Ġ= ĠBudget Status . ACTIVE , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 , Ġdata 6 , Ġdata 7 , Ġdata 8 , Ġdata 9 ) ĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget ( 1 0 0 ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 L , Ġtest Observer . value (). data ?. bud getId ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Budget Frequency . MONTH LY , Ġtest Observer . value (). data ?. frequency ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget ById () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġb ud getId : ĠLong Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Path Ġ= Ġ" budget s /$ bud getId " ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ id _ 6 ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget ( bud getId ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . SUCCESS , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . error ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget ( bud getId ). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( bud getId , Ġtest Observer . value (). data ?. bud getId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( request Path , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget ById Fails If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget ( 3 2 1 1 ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . ERROR , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( result . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data Error SubType . MISSING _ ACCESS _ TOKEN , Ġ( result . error Ġas ĠData Error ). sub Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Create Budget Category Budget () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ id _ 6 ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== ĠBudget s API . URL _ BU D GET S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . create Budget Category Budget ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBudget Frequency . MONTH LY , ĠBigDecimal ( 1 0 0 0 ), ĠBudget Category . LI V ING , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// hel px . adobe . com / content / dam / help / en / stock / how - to / visual - reverse - image - search / j cr _ content / main - pars / image / visual - reverse - image - search - v 2 _ intro . jpg " ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Resource . Status . SUCCESS , Ġresource . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( resource . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 6 L , Ġresource . data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget ( 6 ). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 6 L , Ġtest Observer . value (). data ?. bud getId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Budget Frequency . MONTH LY , Ġtest Observer . value (). data ?. frequency ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Budget Category . LI V ING , Ġtest Observer . value (). data ?. type Value ?. to Budget Category ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Budget s API . URL _ BU D GET S , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Create Merchant Category Budget () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ id _ 7 ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== ĠBudget s API . URL _ BU D GET S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . create Merchant Budget ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBudget Frequency . MONTH LY , ĠBigDecimal ( 1 0 0 0 ), Ġ 7 , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// hel px . adobe . com / content / dam / help / en / stock / how - to / visual - reverse - image - search / j cr _ content / main - pars / image / visual - reverse - image - search - v 2 _ intro . jpg " ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Resource . Status . SUCCESS , Ġresource . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( resource . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 7 L , Ġresource . data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget ( 7 ). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 7 L , Ġtest Observer . value (). data ?. bud getId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( B ud getType . MER CHANT , Ġtest Observer . value (). data ?. type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 7 ", Ġtest Observer . value (). data ?. type Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Budget s API . URL _ BU D GET S , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Create Transaction Category Budget () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ id _ 8 ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== ĠBudget s API . URL _ BU D GET S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . create Category Budget ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBudget Frequency . MONTH LY , ĠBigDecimal ( 1 0 0 0 ), Ġ 8 L , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// hel px . adobe . com / content / dam / help / en / stock / how - to / visual - reverse - image - search / j cr _ content / main - pars / image / visual - reverse - image - search - v 2 _ intro . jpg " ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Resource . Status . SUCCESS , Ġresource . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( resource . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 8 L , Ġresource . data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget ( 8 ). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 8 L , Ġtest Observer . value (). data ?. bud getId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( B ud getType . TRANSACTION _ CATEGORY , Ġtest Observer . value (). data ?. type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 8 ", Ġtest Observer . value (). data ?. type Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Budget s API . URL _ BU D GET S , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Create Budget Fails If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĊĠĠĠĠĠĠĠ Ġbudget s . create Budget Category Budget ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBudget Frequency . MONTH LY , ĠBigDecimal ( 1 0 0 0 ), ĠBudget Category . LI F EST Y LE , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// hel px . adobe . com / content / dam / help / en / stock / how - to / visual - reverse - image - search / j cr _ content / main - pars / image / visual - reverse - image - search - v 2 _ intro . jpg " ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Resource . Status . ERROR , Ġresource . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( resource . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( resource . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Update Budget () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġb ud getId : ĠLong Ġ= Ġ 6 ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Path Ġ= Ġ" budget s /$ bud getId " ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ id _ 6 ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbudget Ġ= Ġtest Budget ResponseData ( bud getId , Ġstatus Ġ= ĠBudget Status . UN STARTED , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ). to Budget () ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert ( budget ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . update Budget ( budget ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . SUCCESS , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . error ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget ( bud getId ). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġtest Observer . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( models ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( bud getId , Ġmodels ?. bud getId ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Budget Tracking Status . BE LOW , Ġmodels ?. tracking Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( request Path , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Update Budget Fails If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbudget Ġ= Ġtest Budget ResponseData ( 6 ). to Budget () ĊĠĠĠĠĠĠĠ Ġbudget s . update Budget ( budget ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . ERROR , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( result . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data Error SubType . MISSING _ ACCESS _ TOKEN , Ġ( result . error Ġas ĠData Error ). sub Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Delete Budget () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġb ud getId : ĠLong Ġ= Ġ 6 ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Path Ġ= Ġ" budget s /$ bud getId " ĊĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert ( test Budget ResponseData ( bud getId ). to Budget ()) ĊĊĠĠĠĠĠĠĠ Ġvar Ġtest Observer Ġ= Ġbudget s . fetch Budget ( bud getId ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġtest Observer . value (). data ĊĠĠĠĠĠĠĠ ĠassertNotNull ( model ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( bud getId , Ġmodel ?. bud getId ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . delete Budget ( bud getId ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . SUCCESS , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . error ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer Ġ= Ġbudget s . fetch Budget ( bud getId ). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( request Path , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Delete Budget Fails If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . delete Budget ( 6 ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . ERROR , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( result . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data Error SubType . MISSING _ ACCESS _ TOKEN , Ġ( result . error Ġas ĠData Error ). sub Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠBudget ĠPeriod ĠTests ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Budget Period ById () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 , Ġdata 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget Periods (). insert All (* list . map Ġ{ Ġit . to Budget Period () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget Period ( data 3 . budget Period Id ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( data 3 . budget Period Id , Ġtest Observer . value (). data ?. budget Period Id ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Budget Periods () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 2 0 0 , Ġstatus Ġ= ĠBudget Status . ACTIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 2 0 1 , Ġstatus Ġ= ĠBudget Status . COMPLETED ) ĊĠĠĠĠĠĠĠ Ġval Ġbudget s List Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* budget s List . map Ġ{ Ġit . to Budget () Ġ}. to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 0 , Ġb ud getId Ġ= Ġ 2 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 1 , Ġb ud getId Ġ= Ġ 2 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . AB O VE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 2 , Ġb ud getId Ġ= Ġ 2 0 1 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 6 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 3 , Ġb ud getId Ġ= Ġ 2 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 7 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 1 0 4 , Ġb ud getId Ġ= Ġ 2 0 1 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf ( data 3 , Ġdata 4 , Ġdata 5 , Ġdata 6 , Ġdata 7 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget Periods (). insert All (* list . map Ġ{ Ġit . to Budget Period () Ġ}. to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget Periods ( tracking Status Ġ= ĠBudget Tracking Status . EQUAL , Ġbudget Status Ġ= ĠBudget Status . ACTIVE ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġtest Observer . value (). data ?. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 L , Ġtest Observer . value (). data ?. get ( 0 )?. budget Period Id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 3 L , Ġtest Observer . value (). data ?. get ( 1 )?. budget Period Id ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Fetch Budget ById With Relation () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert ( test Budget ResponseData ( bud getId Ġ= Ġ 6 ). to Budget ()) ĊĠĠĠĠĠĠĠ Ġdatabase . budget Periods (). insert ( test Budget Period ResponseData ( budget Period Id Ġ= Ġ 4 5 6 , Ġb ud getId Ġ= Ġ 6 ). to Budget Period ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget With Relation ( 6 ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 5 6 L , Ġtest Observer . value (). data ?. periods ?. get ( 0 )?. budget Period Id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 6 L , Ġtest Observer . value (). data ?. budget ?. bud getId ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh All Budget Period sWith Pagination () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġfrom Date Ġ= Ġ" 2 0 2 0 - 0 7 - 0 1 " ĊĠĠĠĠĠĠĠ Ġval Ġto Date Ġ= Ġ" 2 0 2 1 - 0 8 - 3 1 " ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= ĠBudget Status . ACTIVE ĊĠĠĠĠĠĠĠ Ġval Ġrequest Path 1 Ġ= Ġ"${ Budget s API . URL _ BU D GET _ PER IO DS }? from _ date =$ from Date & to _ date =$ toDate & status =$ status " ĊĠĠĠĠĠĠĠ Ġval Ġrequest Path 2 Ġ= Ġ"${ Budget s API . URL _ BU D GET _ PER IO DS }? from _ date =$ from Date & to _ date =$ toDate & after = 1 6 1 2 1 3 7 6 0 0 _ 3 7 0 6 & status =$ status " ĊĠĠĠĠĠĠĠ Ġval Ġrequest Path 3 Ġ= Ġ"${ Budget s API . URL _ BU D GET _ PER IO DS }? from _ date =$ from Date & to _ date =$ toDate & after = 1 6 1 9 8 2 7 2 0 0 _ 3 7 2 4 & status =$ status " ĊĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( readString FromJson ( app , ĠR . raw . budget _ periods _ page _ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( readString FromJson ( app , ĠR . raw . budget _ periods _ page _ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( readString FromJson ( app , ĠR . raw . budget _ periods _ page _ 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 7 0 1 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 5 ", Ġstatus Ġ= ĠBudget Status . ACTIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 7 0 2 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 4 ", Ġstatus Ġ= ĠBudget Status . ACTIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 7 0 3 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 3 ", Ġstatus Ġ= ĠBudget Status . ACTIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 7 0 4 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 2 ", Ġstatus Ġ= ĠBudget Status . ACTIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġlist 1 Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 , Ġdata 3 , Ġdata 4 ) ĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list 1 . map Ġ{ Ġit . to Budget () Ġ}. to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 3 7 1 8 , ĠstartDate Ġ= Ġ" 2 0 2 0 - 1 1 - 0 1 ", Ġcurrent Amount Ġ= ĠBigDecimal (" 1 2 . 0 0 "), Ġtracking Status Ġ= ĠBudget Tracking Status . BE LOW ) Ġ// ĠUpdating Ġbudget Ġperiod ĊĠĠĠĠĠĠĠ Ġval Ġdata 6 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 6 0 0 , Ġb ud getId Ġ= Ġ 7 0 2 , ĠstartDate Ġ= Ġ" 2 0 2 1 - 0 3 - 0 1 ") Ġ// ĠDe leting Ġbudget Ġperiod ĊĠĠĠĠĠĠĠ Ġval Ġdata 7 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 5 0 0 , ĠstartDate Ġ= Ġ" 2 0 2 0 - 0 6 - 1 1 ") Ġ// ĠIgnore d Ġbudget Ġperiod ĊĠĠĠĠĠĠĠ Ġval Ġlist 2 Ġ= Ġmutable ListOf ( data 5 , Ġdata 6 , Ġdata 7 ) ĊĠĠĠĠĠĠĠ Ġdatabase . budget Periods (). insert All (* list 2 . map Ġ{ Ġit . to Budget Period () Ġ}. to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġvar Ġafter : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal 1 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġbudget s . refresh All Budget Period sWith Pagination ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbudget Status Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Date Ġ= Ġfrom Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Date Ġ= Ġto Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġafter ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠPag inated Result . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull (( result Ġas ĠPag inated Result . Success ). pagination Info ?. before ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 1 6 1 2 1 3 7 6 0 0 _ 3 7 0 6 ", Ġresult . pagination Info ?. after ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 7 0 6 L , Ġresult . pagination Info ?. after Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 2 0 2 1 - 0 2 - 0 1 ", Ġresult . pagination Info ?. after Date ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġresult . pagination Info ?. after ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 1 Ġ= Ġbudget s . fetch Budget Period sWith Relation (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 1 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfetched Budget Periods Ġ= Ġtest Observer 1 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 1 , Ġfetched Budget Periods ?. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Budget Period ( 3 7 1 8 ). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Budget Period Ġ= Ġtest Observer 2 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( updated Budget Period ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( BigDecimal (" 2 0 0 . 0 0 "), Ġupdated Budget Period ?. current Amount ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Budget Tracking Status . AB O VE , Ġupdated Budget Period ?. tracking Status ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal 1 . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsignal 1 . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal 2 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġbudget s . refresh All Budget Period sWith Pagination ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbudget Status Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Date Ġ= Ġfrom Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Date Ġ= Ġto Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġafter ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠPag inated Result . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 1 6 1 2 1 3 7 6 0 0 _ 3 7 2 1 ", Ġ( result Ġas ĠPag inated Result . Success ). pagination Info ?. before ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 7 2 1 L , Ġresult . pagination Info ?. before Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 2 0 2 1 - 0 2 - 0 1 ", Ġresult . pagination Info ?. before Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 1 6 1 9 8 2 7 2 0 0 _ 3 7 2 4 ", Ġresult . pagination Info ?. after ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 7 2 4 L , Ġresult . pagination Info ?. after Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 2 0 2 1 - 0 5 - 0 1 ", Ġresult . pagination Info ?. after Date ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġresult . pagination Info ?. after ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 1 Ġ= Ġbudget s . fetch Budget Period sWith Relation (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 1 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfetched Budget Periods Ġ= Ġtest Observer 1 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 9 , Ġfetched Budget Periods ?. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Budget Period ( 6 0 0 L ). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbudget Period Ġ= Ġtest Observer 2 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( budget Period ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal 2 . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsignal 2 . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal 3 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġbudget s . refresh All Budget Period sWith Pagination ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbudget Status Ġ= Ġstatus , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Date Ġ= Ġfrom Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Date Ġ= Ġto Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġafter ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠPag inated Result . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 1 6 2 2 5 0 5 6 0 0 _ 3 7 0 4 ", Ġ( result Ġas ĠPag inated Result . Success ). pagination Info ?. before ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 7 0 4 L , Ġresult . pagination Info ?. before Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 2 0 2 1 - 0 6 - 0 1 ", Ġresult . pagination Info ?. before Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . pagination Info ?. after ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 1 Ġ= Ġbudget s . fetch Budget Period sWith Relation (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 1 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfetched Budget Periods Ġ= Ġtest Observer 1 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 5 , Ġfetched Budget Periods ?. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Budget Period ( 5 0 0 L ). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbudget Period Ġ= Ġtest Observer 2 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( budget Period ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal 3 . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsignal 3 . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh All Budget Periods Fails If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh All Budget Period sWith Pagination Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠPag inated Result . Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull (( result Ġas ĠPag inated Result . Error ). error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( result . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data Error SubType . MISSING _ ACCESS _ TOKEN , Ġ( result . error Ġas ĠData Error ). sub Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget Period sBy B ud getId With Pagination () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġfrom Date Ġ= Ġ" 2 0 2 0 - 0 7 - 0 1 " ĊĠĠĠĠĠĠĠ Ġval Ġto Date Ġ= Ġ" 2 0 2 1 - 0 5 - 3 1 " ĊĠĠĠĠĠĠĠ Ġval Ġb ud getId Ġ= Ġ 7 0 4 L ĊĠĠĠĠĠĠĠ Ġval Ġrequest Path 1 Ġ= Ġ"${ Budget s API . URL _ BU D GET S }/ $ bud getId / periods ? from _ date =$ from Date & to _ date =$ toDate " ĊĠĠĠĠĠĠĠ Ġval Ġrequest Path 2 Ġ= Ġ"${ Budget s API . URL _ BU D GET S }/ $ bud getId / periods ? from _ date =$ from Date & to _ date =$ toDate & after = 1 6 1 2 1 3 7 6 0 0 _ 3 7 0 6 " ĊĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( readString FromJson ( app , ĠR . raw . budget _ periods _ by _ budget _ id _ page _ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( readString FromJson ( app , ĠR . raw . budget _ periods _ by _ budget _ id _ page _ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 7 0 3 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 3 ", Ġstatus Ġ= ĠBudget Status . ACTIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 7 0 4 , Ġtype Ġ= ĠB ud getType . TRANSACTION _ CATEGORY , Ġtype Value Ġ= Ġ" 6 2 ", Ġstatus Ġ= ĠBudget Status . ACTIVE ) ĊĠĠĠĠĠĠĠ Ġval Ġlist 1 Ġ= Ġmutable ListOf ( data 1 , Ġdata 2 ) ĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* list 1 . map Ġ{ Ġit . to Budget () Ġ}. to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 3 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 3 7 1 8 , ĠstartDate Ġ= Ġ" 2 0 2 0 - 1 1 - 0 1 ", Ġcurrent Amount Ġ= ĠBigDecimal (" 1 2 . 0 0 "), Ġtracking Status Ġ= ĠBudget Tracking Status . BE LOW ) Ġ// ĠUpdating Ġbudget Ġperiod ĊĠĠĠĠĠĠĠ Ġval Ġdata 4 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 6 0 0 , Ġb ud getId Ġ= Ġ 7 0 4 , ĠstartDate Ġ= Ġ" 2 0 2 1 - 0 3 - 0 1 ") Ġ// ĠDe leting Ġbudget Ġperiod ĊĠĠĠĠĠĠĠ Ġval Ġdata 5 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 5 0 0 , Ġb ud getId Ġ= Ġ 7 0 3 , ĠstartDate Ġ= Ġ" 2 0 2 0 - 0 6 - 1 1 ") Ġ// ĠIgnore d Ġbudget Ġperiod Ġ( outside Ġdate Ġrange Ġdifferent Ġbudget Ġid ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 6 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 5 0 1 , Ġb ud getId Ġ= Ġ 7 0 3 , ĠstartDate Ġ= Ġ" 2 0 2 0 - 0 9 - 1 1 ") Ġ// ĠIgnore d Ġbudget Ġperiod Ġ( inside Ġdate Ġrange Ġdifferent Ġbudget Ġid ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 7 Ġ= Ġtest Budget Period ResponseData ( budget Period Id Ġ= Ġ 5 0 2 , Ġb ud getId Ġ= Ġ 7 0 4 , ĠstartDate Ġ= Ġ" 2 0 2 1 - 0 6 - 1 1 ") Ġ// ĠIgnore d Ġbudget Ġperiod Ġ( outside Ġdate Ġrange Ġbut Ġsame Ġbudget Ġid ) ĊĠĠĠĠĠĠĠ Ġval Ġlist 2 Ġ= Ġmutable ListOf ( data 3 , Ġdata 4 , Ġdata 5 , Ġdata 6 , Ġdata 7 ) ĊĠĠĠĠĠĠĠ Ġdatabase . budget Periods (). insert All (* list 2 . map Ġ{ Ġit . to Budget Period () Ġ}. to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġvar Ġafter : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal 1 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget Period sBy B ud getId With Pagination ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ud getId Ġ= Ġb ud getId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Date Ġ= Ġfrom Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Date Ġ= Ġto Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġafter ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠPag inated Result . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull (( result Ġas ĠPag inated Result . Success ). pagination Info ?. before ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 1 6 1 2 1 3 7 6 0 0 _ 3 7 0 6 ", Ġresult . pagination Info ?. after ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 7 0 6 L , Ġresult . pagination Info ?. after Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 2 0 2 1 - 0 2 - 0 1 ", Ġresult . pagination Info ?. after Date ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġresult . pagination Info ?. after ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 1 Ġ= Ġbudget s . fetch Budget Period sWith Relation (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 1 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfetched Budget Periods Ġ= Ġtest Observer 1 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 2 , Ġfetched Budget Periods ?. size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Budget Period ( 3 7 1 8 ). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Budget Period Ġ= Ġtest Observer 2 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( updated Budget Period ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( BigDecimal (" 2 0 0 . 0 0 "), Ġupdated Budget Period ?. current Amount ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Budget Tracking Status . AB O VE , Ġupdated Budget Period ?. tracking Status ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal 1 . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsignal 1 . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal 2 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget Period sBy B ud getId With Pagination ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb ud getId Ġ= Ġb ud getId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Date Ġ= Ġfrom Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Date Ġ= Ġto Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġafter ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠPag inated Result . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 1 6 1 4 5 5 6 8 0 0 _ 3 7 2 2 ", Ġ( result Ġas ĠPag inated Result . Success ). pagination Info ?. before ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 7 2 2 L , Ġresult . pagination Info ?. before Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 2 0 2 1 - 0 3 - 0 1 ", Ġresult . pagination Info ?. before Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . pagination Info ?. after ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġafter Ġ= Ġresult . pagination Info ?. after ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 1 Ġ= Ġbudget s . fetch Budget Period sWith Relation (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 1 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfetched Budget Periods Ġ= Ġtest Observer 1 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 5 , Ġfetched Budget Periods ?. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠassertEquals ( 1 4 , Ġfetched Budget Periods ?. size ) Ġ// ĠTODO : ĠUncomment Ġand Ġremove Ġabove Ġline Ġwhen Ġhttps :// f rol lo . atlassian . net / browse / SDK - 5 9 0 Ġis Ġresolved ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠUncomment Ġwhen Ġhttps :// f rol lo . atlassian . net / browse / SDK - 5 9 0 Ġis Ġresolved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* val Ġtest Observer 2 Ġ= Ġbudget s . fetch Budget Period ( 6 0 0 L ). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbudget Period Ġ= Ġtest Observer 2 . value (). data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( budget Period ) */ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal 2 . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsignal 2 . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget Period sBy B ud getId Fails If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget Period sBy B ud getId With Pagination ( bud getId Ġ= Ġ 7 0 4 ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠPag inated Result . Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull (( result Ġas ĠPag inated Result . Error ). error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( result . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data Error SubType . MISSING _ ACCESS _ TOKEN , Ġ( result . error Ġas ĠData Error ). sub Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget Period ById () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġb ud getId : ĠLong Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġval Ġperiod Id : ĠLong Ġ= Ġ 8 5 ĊĠĠĠĠĠĠĠ Ġval Ġrequest Path Ġ= Ġ" budget s /$ bud getId / periods /$ period Id " ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ period _ id _ 8 5 ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget Period ( bud getId Ġ= Ġb ud getId , Ġperiod Id Ġ= Ġperiod Id ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . SUCCESS , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . error ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget Period ( period Id ). test () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( test Observer . value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 8 5 L , Ġtest Observer . value (). data ?. budget Period Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( request Path , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Refresh Budget Period ById Fails If Logged Out () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġclear LoggedIn Preferences () ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget Period ( bud getId Ġ= Ġ 6 , Ġperiod Id Ġ= Ġ 8 5 ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . ERROR , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( result . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data ErrorType . AUTHENT ICATION , Ġ( result . error Ġas ĠData Error ). type ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Data Error SubType . MISSING _ ACCESS _ TOKEN , Ġ( result . error Ġas ĠData Error ). sub Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Budget Periods Link To Budget s () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== ĠBudget s API . URL _ BU D GET _ PER IO DS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( readString FromJson ( app , ĠR . raw . budget _ periods _ daily )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( request . trimmed Path Ġ== ĠBudget s API . URL _ BU D GET S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( readString FromJson ( app , ĠR . raw . budget _ valid )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget s Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . SUCCESS , Ġresource . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( resource . error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh All Budget Period sWith Pagination Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result Ġis ĠPag inated Result . Success ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Observer Ġ= Ġbudget s . fetch Budget With Relation ( 6 ). test () ĊĊĠĠĠĠĠĠĠ Ġtest Observer . await Value () ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġtest Observer . value (). data ĊĠĠĠĠĠĠĠ ĠassertNotNull ( model ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 6 L , Ġmodel ?. budget ?. bud getId ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġmodel ?. periods ?. size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 5 L , Ġmodel ?. periods ?. get ( 0 )?. budget Period Id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 8 6 L , Ġmodel ?. periods ?. get ( 1 )?. budget Period Id ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remove Cached Budget s () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Path Ġ= Ġ" budget s " ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 8 5 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 6 , Ġtracking Status Ġ= ĠBudget Tracking Status . AB O VE ) ĊĠĠĠĠĠĠĠ Ġ// Ġbelow Ġline Ġtests Ġremoving Ġof Ġcached Ġbudget Ġperiods ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 2 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 5 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 2 0 1 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL ) ĊĠĠĠĠĠĠĠ Ġval Ġperiods Ġ= Ġmutable ListOf ( data 1 1 , Ġdata 1 2 , Ġdata 1 4 , Ġdata 1 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* periods . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ valid ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget s Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . SUCCESS , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . error ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Budget s (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġtest Observer 2 . value (). data ?. size ) Ġ// Ġ 3 Ġfrom Ġapi ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( request Path , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Remove Cached Budget sWith B ud getType () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Path Ġ= Ġ" budget s ? category _ type = budget _ category " ĊĊĠĠĠĠĠĠĠ Ġval Ġdata 1 1 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 8 5 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 2 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 6 , Ġtracking Status Ġ= ĠBudget Tracking Status . AB O VE , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY ) ĊĠĠĠĠĠĠĠ Ġ// Ġbelow Ġline Ġtests Ġremoving Ġof Ġcached Ġbudget Ġperiods ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 4 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 2 0 0 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL , Ġtype Ġ= ĠB ud getType . BU D GET _ CATEGORY ) ĊĠĠĠĠĠĠĠ Ġval Ġdata 1 5 Ġ= Ġtest Budget ResponseData ( bud getId Ġ= Ġ 2 0 1 , Ġtracking Status Ġ= ĠBudget Tracking Status . EQUAL , Ġtype Ġ= ĠB ud getType . MER CHANT ) ĊĠĠĠĠĠĠĠ Ġval Ġperiods Ġ= Ġmutable ListOf ( data 1 1 , Ġdata 1 2 , Ġdata 1 4 , Ġdata 1 5 ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert All (* periods . map Ġ{ Ġit . to Budget () Ġ}. toList (). to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ valid ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== Ġrequest Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget s ( bud getType Ġ= ĠB ud getType . BU D GET _ CATEGORY ) Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . SUCCESS , Ġresult . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . error ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Observer 2 Ġ= Ġbudget s . fetch Budget s (). test () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Observer 2 . await Value () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġtest Observer 2 . value (). data ?. size ) Ġ// Ġ 3 Ġfrom Ġapi Ġ+ Ġ 1 Ġcached Ġmerchant ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġmock Server . take Request () ĊĠĠĠĠĠĠĠ ĠassertEquals ( request Path , Ġrequest . trimmed Path ) ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Link ing Remove Cached Cascade () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Setup () ĊĊĠĠĠĠĠĠĠ Ġval Ġsignal Ġ= ĠCount DownLatch ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġread String FromJson ( app , ĠR . raw . budget _ valid ) ĊĠĠĠĠĠĠĠ Ġmock Server . dispatcher Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠDispatcher () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdispatch ( request : ĠRe corded Request ): ĠMock Response Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request . trimmed Path Ġ== ĠBudget s API . URL _ BU D GET S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Response Code ( 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Body ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠMock Response (). set Response Code ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġdatabase . budget s (). insert ( test Budget ResponseData ( bud getId Ġ= Ġ 7 ). to Budget ()) ĊĠĠĠĠĠĠĠ Ġdatabase . budget Periods (). insert ( test Budget Period ResponseData ( budget Period Id Ġ= Ġ 4 5 6 , Ġb ud getId Ġ= Ġ 7 ). to Budget Period ()) ĊĠĠĠĠĠĠĠ Ġdatabase . budget Periods (). insert ( test Budget Period ResponseData ( budget Period Id Ġ= Ġ 4 5 7 , Ġb ud getId Ġ= Ġ 7 ). to Budget Period ()) ĊĊĠĠĠĠĠĠĠ Ġbudget s . fetch Budget ( bud getId Ġ= Ġ 7 ). test (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait Value () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 7 L , Ġvalue (). data ?. bud getId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbudget s . fetch Budget Periods ( bud getId Ġ= Ġ 7 ). test (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait Value () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġvalue (). data ?. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 5 6 L , Ġvalue (). data ?. get ( 0 )?. budget Period Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 4 5 7 L , Ġvalue (). data ?. get ( 1 )?. budget Period Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbudget s . refresh Budget s Ġ{ Ġresource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Result . Status . SUCCESS , Ġresource . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( resource . error ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbudget s . fetch Budget s (). test (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġvalue (). data ?. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbudget s . fetch Budget ( bud getId Ġ= Ġ 7 ). test (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbudget s . fetch Budget Periods ( 7 L ). test (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġvalue (). data ?. size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbudget s . fetch Budget Period ( budget Period Id Ġ= Ġ 4 5 6 ). test (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbudget s . fetch Budget Period ( budget Period Id Ġ= Ġ 4 5 7 ). test (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( value (). data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignal . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsignal . await ( 3 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠ ĠtearDown () ĊĠĠĠ Ġ} Ċ } Ċ