package Ġcom . j pp . mp movie details Ċ Ċ import Ġandroid . view . View Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġcom . j pp . mp design . mapped . Movie Genre Item Ċ import Ġcom . j pp . mp domain . Movie Detail Ċ import Ġcom . j pp . mp domain . Movie Genre Ċ import Ġcom . j pp . mp domain . use case . Get Movie Detail UseCase Ċ import Ġcom . j pp . mp domain . use case . Try Ċ import Ġcom . j pp . mp test utils . Coroutine Test Extension Ċ import Ġcom . j pp . mp test utils . Instant Task Executor Extension Ċ import Ġcom . j pp . mp test utils . observe With Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . impl . annotations . Rel ax ed Mock K Ċ import Ġio . mock k . junit 5 . Mock K Extension Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertNotNull Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ Ċ @ Experimental Cor outines Api Ċ @ Extend With ( ĊĠĠĠ ĠMock K Extension :: class , ĊĠĠĠ ĠInstant Task Executor Extension :: class , ĊĠĠĠ ĠCor outine Test Extension :: class Ċ ) Ċ class ĠMovie Details ViewModel Test Ġ{ ĊĊĠĠĠ Ġ@ Rel ax ed Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġget Movie Detail UseCase : ĠGet Movie Detail UseCase ĊĊĠĠĠ Ġ@ Rel ax ed Mock K ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnavigator : ĠMovie Details Navigator ĊĊĠĠĠ Ġprivate Ġval Ġsaved State Handle : ĠSaved State Handle Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠSaved State Handle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsubject : ĠMovie Details ViewModel ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubject Ġ= ĠMovie Details ViewModel ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Movie Detail UseCase , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigator , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCor outine Test Extension . test Dispatcher , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsaved State Handle ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġpost Ġno Ġconnectivity Ġerror Ġwhen Ġdisconnected `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġview State Posted : ĠMovie Detail ViewState ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġget Movie Detail UseCase . execute ( any ()) Ġ} Ġreturns ĠTry . Failure ( Try . Failure Cause . No Connectivity ) ĊĊĠĠĠĠĠĠĠ Ġsubject . view State . observe With Ġ{ Ġview State Ġ-> Ġview State Posted Ġ= Ġview State Ġ} ĊĠĠĠĠĠĠĠ Ġsubject . on Init ( Movie Details Param ( 1 0 . 0 , Ġ" a Movie ", Ġ" a Url ")) ĊĊĠĠĠĠĠĠĠ ĠassertNotNull ( view State Posted ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( View . IN VISIBLE , Ġview State Posted ?. loading Visibility ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( View . IN VISIBLE , Ġview State Posted ?. content ViewState ?. visibility ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( View . VISIBLE , Ġview State Posted ?. error ViewState ?. visibility ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( true , Ġview State Posted ?. error ViewState ?. is Connectivity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġpost Ġerror Ġwhen Ġfailing Ġto Ġfetch Ġuser Ġaccount Ġdata `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġview State Posted : ĠMovie Detail ViewState ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġget Movie Detail UseCase . execute ( any ()) Ġ} Ġreturns ĠTry . Failure ( Try . Failure Cause . Unknown ) ĊĊĠĠĠĠĠĠĠ Ġsubject . view State . observe With Ġ{ Ġview State Ġ-> Ġview State Posted Ġ= Ġview State Ġ} ĊĠĠĠĠĠĠĠ Ġsubject . on Init ( Movie Details Param ( 1 0 . 0 , Ġ" a Movie ", Ġ" a Url ")) ĊĊĠĠĠĠĠĠĠ ĠassertNotNull ( view State Posted ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( View . IN VISIBLE , Ġview State Posted ?. loading Visibility ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( View . IN VISIBLE , Ġview State Posted ?. content ViewState ?. visibility ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( View . VISIBLE , Ġview State Posted ?. error ViewState ?. visibility ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( false , Ġview State Posted ?. error ViewState ?. is Connectivity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġexecute ĠGet Movie Details UseCase , Ġadapt Ġresult Ġto ĠUI Ġmodel Ġand Ġpost Ġvalue Ġon Ġinit `() Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġview State Posted : ĠMovie Detail ViewState ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġmovie Detail Id Ġ= Ġ 1 2 . 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġdomain Detail Ġ= ĠMovie Detail ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġmovie Detail Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" a Title ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverview Ġ= Ġ" an Overview ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease _ date Ġ= Ġ" a Release Date ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvote _ count Ġ= Ġ 1 2 . toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvote _ average Ġ= Ġ 1 5 F , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpop ularity Ġ= Ġ 1 7 8 F , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposter _ path Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen res Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie Genre ( 2 8 , Ġ" Action "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie Genre ( 2 7 , Ġ" Hor ror ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠMovie Detail ViewState . show Loading (" a Title ", Ġ" a Url "). show Details ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovie ImageUrl Ġ= Ġ" a Url ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverview Ġ= Ġdomain Detail . overview , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Date Ġ= Ġdomain Detail . release _ date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvote Count Ġ= Ġdomain Detail . vote _ count . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpop ularity Ġ= Ġdomain Detail . pop ularity . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgen res Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie Genre Item . Action , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie Genre Item . Hor ror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġget Movie Detail UseCase . execute ( movie Detail Id ) Ġ} Ġreturns ĠTry . Success ( domain Detail ) ĊĊĠĠĠĠĠĠĠ Ġsubject . view State . observe With Ġ{ Ġview State Ġ-> Ġview State Posted Ġ= Ġview State Ġ} ĊĠĠĠĠĠĠĠ Ġsubject . on Init ( Movie Details Param ( movie Detail Id , Ġ" a Title ", Ġ" a Url ")) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġview State Posted ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġnavigate Ġto Ġuser Ġaccount Ġwhen Ġlogin Ġrequested `() Ġ{ ĊĠĠĠĠĠĠĠ Ġsubject . on User Requested Login () ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġnavigator . navigate To Login () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġnavigate Ġto Ġcredits `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmovie Id Ġ= Ġ 1 0 . toDouble () ĊĠĠĠĠĠĠĠ Ġval Ġmovie Title Ġ= Ġ" a Movie " ĊĠĠĠĠĠĠĠ Ġ// Ġpre - condition ĊĠĠĠĠĠĠĠ Ġsubject . on Init ( Movie Details Param ( movie Id , Ġmovie Title , Ġ" a Url ")) ĊĠĠĠĠĠĠĠ Ġsubject . on Movie Credits Selected () ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġnavigator . navigate To Movie Credits ( movie Id , Ġmovie Title ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġnavigate Ġto Ġrate Ġmovie `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmovie Id Ġ= Ġ 1 0 . toDouble () ĊĠĠĠĠĠĠĠ Ġval Ġmovie Title Ġ= Ġ" a Movie " ĊĠĠĠĠĠĠĠ Ġval Ġmovie ImageUrl Ġ= Ġ" a Url " ĊĊĠĠĠĠĠĠĠ Ġ// Ġpre - condition ĊĠĠĠĠĠĠĠ Ġsubject . on Init ( Movie Details Param ( movie Id , Ġmovie Title , Ġmovie ImageUrl )) ĊĠĠĠĠĠĠĠ Ġsubject . on Rate Movie Selected () ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġnavigator . navigate To Rate Movie ( movie Id , Ġmovie ImageUrl , Ġmovie Title ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ