package Ġcom . ako ch dev . data . repository Ċ Ċ import Ġcom . ako ch dev . data . database . model . Character Detail DB Model Ċ import Ġcom . ako ch dev . data . database . model . Character ListItem DB Model Ċ import Ġcom . ako ch dev . data . datasource . Local DB Datasource Ċ import Ġcom . ako ch dev . data . datasource . Remote DataSource Ċ import Ġcom . ako ch dev . data . mapper . Character Database Mapper Ċ import Ġcom . ako ch dev . data . mapper . Character Response Mapper Ċ import Ġcom . ako ch dev . data . mapper . RESPONSE _ URL _ COM IC _ JSON _ KEY Ċ import Ġcom . ako ch dev . data . mapper . RESPONSE _ URL _ DETAIL _ JSON _ KEY Ċ import Ġcom . ako ch dev . data . mapper . RESPONSE _ URL _ WI KI _ JSON _ KEY Ċ import Ġcom . ako ch dev . data . model . Character Detail Response Model Ċ import Ġcom . ako ch dev . data . model . Character ListResponse Model Ċ import Ġcom . ako ch dev . data . model . Com ics Ċ import Ġcom . ako ch dev . data . model . Data Ċ import Ġcom . ako ch dev . data . model . Events Ċ import Ġcom . ako ch dev . data . model . Items Ċ import Ġcom . ako ch dev . data . model . Results Ċ import Ġcom . ako ch dev . data . model . Series Ċ import Ġcom . ako ch dev . data . model . St ories Ċ import Ġcom . ako ch dev . data . model . Thumbnail Ċ import Ġcom . ako ch dev . data . model . Urls Ċ import Ġcom . ako ch dev . domain . model . Character Detail Model Ċ import Ġcom . ako ch dev . domain . model . Result Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any OrNull Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . never Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Test Ċ Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Mockito Ċ import Ġorg . mockito . junit . Mockito JUnit Runner Ċ Ċ @ RunWith ( Mockito JUnit Runner :: class ) Ċ class ĠMar vel Repository Impl Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġremote DataSource : ĠRemote DataSource Ġ= ĠMockito . mock ( Remote DataSource :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġlocal DataSource : ĠLocal DB Datasource Ġ= ĠMockito . mock ( Local DB Datasource :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġresponse Mapper : ĠCharacter Response Mapper Ġ= ĊĠĠĠĠĠĠĠ ĠMockito . mock ( Character Response Mapper :: class . java ) ĊĠĠĠ Ġprivate Ġval Ġdatabase Mapper : ĠCharacter Database Mapper Ġ= ĊĠĠĠĠĠĠĠ ĠMockito . mock ( Character Database Mapper :: class . java ) ĊĊĠĠĠ Ġprivate Ġval Ġrepository Ġ= ĠMar vel Repository Impl ( ĊĠĠĠĠĠĠĠ Ġremote DataSource , ĊĠĠĠĠĠĠĠ Ġlocal DataSource , ĊĠĠĠĠĠĠĠ Ġresponse Mapper , ĊĠĠĠĠĠĠĠ Ġdatabase Mapper ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Mar vel Characters Not Cached () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( local DataSource . get Mar vel Characters ( limit , Ġoffset )). thenReturn ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote DataSource . get Mar vel Characters ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). thenReturn ( Result . Success < Character ListResponse Model >( null )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Mar vel Characters ( limit , Ġoffset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local DataSource ). get Mar vel Characters ( any (), Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( remote DataSource ). get Mar vel Characters ( any (), Ġany (), Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( response Mapper ). to Character List Domain ( any OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local DataSource ). insert Mar vel Characters ( any ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database Mapper ). to Character ListItem Db ( any ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Mar vel Characters Cached () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlimit Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( local DataSource . get Mar vel Characters ( limit , Ġoffset )). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter Database Model List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Mar vel Characters ( limit , Ġoffset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local DataSource ). get Mar vel Characters ( any (), Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( remote DataSource , Ġnever ()). get Mar vel Characters ( any (), Ġany (), Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( response Mapper , Ġnever ()). to Character List Domain ( any OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database Mapper ). to Character List Domain ( character Database Model List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Mar vel Character Details Not Cached () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacter Id Ġ= Ġ" character Id " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( local DataSource . find Character Detail ( any OrNull ())). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( response Mapper . to Character Detail Domain ( any OrNull ())). thenReturn ( character Detail Model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremote DataSource . get Character Detail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). thenReturn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow Of ( Result . Success ( character Detail Response )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Mar vel Character Details ( character Id ). collect Ġ{ Ġ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local DataSource ). find Character Detail ( any ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( remote DataSource ). get Character Detail ( any (), Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( response Mapper ). to Character Detail Domain ( any OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local DataSource ). insert Character Detail ( any OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database Mapper ). to Character Detail Db ( any OrNull ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Mar vel Character Details Cached () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacter Id Ġ= Ġ" character Id " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( local DataSource . find Character Detail ( any OrNull ())). thenReturn ( character Detail Db ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Mar vel Character Details ( character Id ). collect Ġ{ Ġ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local DataSource ). find Character Detail ( any ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( remote DataSource , Ġnever ()). get Character Detail ( any (), Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( response Mapper , Ġnever ()). to Character Detail Domain ( any OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local DataSource , Ġnever ()). insert Character Detail ( any OrNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( database Mapper , Ġnever ()). to Character Detail Db ( any OrNull ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġid Domain 1 Ġ= Ġ" id Domain 1 " ĊĠĠĠ Ġprivate Ġval Ġname Domain 1 Ġ= Ġ" name Domain 1 " ĊĠĠĠ Ġprivate Ġval Ġdescription Domain 1 Ġ= Ġ" description Domain 1 " ĊĠĠĠ Ġprivate Ġval Ġpicture Url Domain 1 Ġ= Ġ" picture Url Domain 1 " ĊĊĠĠĠ Ġprivate Ġval Ġid Domain 2 Ġ= Ġ" id Domain 2 " ĊĠĠĠ Ġprivate Ġval Ġname Domain 2 Ġ= Ġ" name Domain 2 " ĊĠĠĠ Ġprivate Ġval Ġdescription Domain 2 Ġ= Ġ" description Domain 2 " ĊĠĠĠ Ġprivate Ġval Ġpicture Url Domain 2 Ġ= Ġ" picture Url Domain 2 " ĊĊĠĠĠ Ġprivate Ġval Ġcharacter Database Model List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠCharacter ListItem DB Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid Domain 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname Domain 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription Domain 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicture Url Ġ= Ġpicture Url Domain 1 ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ ĠCharacter ListItem DB Model ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid Domain 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname Domain 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription Domain 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicture Url Ġ= Ġpicture Url Domain 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġid Detail Domain Ġ= Ġ" id Detail Domain " ĊĠĠĠ Ġprivate Ġval Ġname Detail Domain Ġ= Ġ" name Detail Domain " ĊĠĠĠ Ġprivate Ġval Ġdescription Detail Domain Ġ= Ġ" description Detail Domain " ĊĠĠĠ Ġprivate Ġval Ġpicture Url Detail Domain Ġ= Ġ" picture Url Detail Domain " ĊĠĠĠ Ġprivate Ġval Ġcom ics Detail Domain Ġ= ĠlistOf (" com ics Detail Domain ") ĊĠĠĠ Ġprivate Ġval Ġseries Detail Domain Ġ= ĠlistOf (" series Detail Domain ") ĊĠĠĠ Ġprivate Ġval Ġstories Detail Domain Ġ= ĠlistOf (" stories Detail Domain ") ĊĠĠĠ Ġprivate Ġval Ġdetail Url Detail Domain Ġ= Ġ" detail Url Detail Domain " ĊĠĠĠ Ġprivate Ġval Ġcom ic Link Detail Domain Ġ= Ġ" com ic Link Detail Domain " ĊĠĠĠ Ġprivate Ġval Ġwiki Link Detail Domain Ġ= Ġ" wiki Link Detail Domain " ĊĊĠĠĠ Ġprivate Ġval Ġpicture Url Domain Extension Ġ= Ġ" jpg " ĊĊĠĠĠ Ġprivate Ġval Ġcharacter Detail Response Result Ġ= ĠResults ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid Detail Domain , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname Detail Domain , ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription Detail Domain , ĊĠĠĠĠĠĠĠ Ġmodified Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġresource URI Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġurls Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUrl s ( type Ġ= ĠRESP ONSE _ URL _ COM IC _ JSON _ KEY , Ġurl Ġ= Ġcom ic Link Detail Domain ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUrl s ( type Ġ= ĠRESP ONSE _ URL _ DETAIL _ JSON _ KEY , Ġurl Ġ= Ġdetail Url Detail Domain ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUrl s ( type Ġ= ĠRESP ONSE _ URL _ WI KI _ JSON _ KEY , Ġurl Ġ= Ġwiki Link Detail Domain ) ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġthumbnail Ġ= ĠThumb nail ( picture Url Detail Domain , Ġpicture Url Domain Extension ), ĊĠĠĠĠĠĠĠ Ġcom ics Ġ= ĠCom ics ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"", Ġ"", Ġ"", ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItems ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource URI Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġcom ics Detail Domain . first (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġstories Ġ= ĠSt ories ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"", Ġ"", Ġ"", ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItems ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource URI Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġstories Detail Domain . first (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġevents Ġ= ĠEvents ("", Ġ"", Ġ"", ĠlistOf ()), ĊĠĠĠĠĠĠĠ Ġseries Ġ= ĠSeries ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"", Ġ"", Ġ"", ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItems ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource URI Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġseries Detail Domain . first (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġcharacter Detail ResponseData Ġ= ĠData ( ĊĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġtotal Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġresults Ġ= ĠlistOf ( character Detail Response Result ), ĊĠĠĠ Ġ) ĊĊĊĠĠĠ Ġprivate Ġval Ġcharacter Detail Response Ġ= ĠCharacter Detail Response Model ( ĊĠĠĠĠĠĠĠ Ġcode Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġstatus Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġcopyright Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġat tribution Text Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġat tribution HTML Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġdata Ġ= Ġcharacter Detail ResponseData , ĊĠĠĠĠĠĠĠ Ġet ag Ġ= Ġ"" ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġcharacter Detail Model Ġ= ĠCharacter Detail Model ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid Detail Domain , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname Detail Domain , ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription Detail Domain , ĊĠĠĠĠĠĠĠ Ġpicture Url Ġ= Ġ"$ picture Url Detail Domain .$ picture Url Domain Extension ", ĊĠĠĠĠĠĠĠ Ġcom ics Ġ= Ġcom ics Detail Domain , ĊĠĠĠĠĠĠĠ Ġseries Ġ= Ġseries Detail Domain , ĊĠĠĠĠĠĠĠ Ġstories Ġ= Ġstories Detail Domain , ĊĠĠĠĠĠĠĠ Ġdetail Url Ġ= Ġdetail Url Detail Domain , ĊĠĠĠĠĠĠĠ Ġcom ic Link Url Ġ= Ġcom ic Link Detail Domain , ĊĠĠĠĠĠĠĠ Ġwiki Link Url Ġ= Ġwiki Link Detail Domain ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġcharacter Detail Db Ġ= ĠCharacter Detail DB Model ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġid Detail Domain , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname Detail Domain , ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġdescription Detail Domain , ĊĠĠĠĠĠĠĠ Ġpicture Url Ġ= Ġpicture Url Detail Domain , ĊĠĠĠĠĠĠĠ Ġcom ics Ġ= Ġcom ics Detail Domain , ĊĠĠĠĠĠĠĠ Ġseries Ġ= Ġseries Detail Domain , ĊĠĠĠĠĠĠĠ Ġstories Ġ= Ġstories Detail Domain , ĊĠĠĠĠĠĠĠ Ġdetail Url Ġ= Ġdetail Url Detail Domain , ĊĠĠĠĠĠĠĠ Ġcom ic Link Url Ġ= Ġcom ic Link Detail Domain , ĊĠĠĠĠĠĠĠ Ġwiki Link Url Ġ= Ġwiki Link Detail Domain ĊĠĠĠ Ġ) Ċ } Ċ