/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠSh rey as ĠPat il Ċ Ġ* Ċ Ġ* Ġ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 Ġdev . sh rey as pat il . not y . view . view model Ċ Ċ import Ġdev . sh rey as pat il . not y . base . ViewModel Behavior Spec Ċ import Ġdev . sh rey as pat il . not y . core . model . Auth Credential Ċ import Ġdev . sh rey as pat il . not y . core . repository . Either Ċ import Ġdev . sh rey as pat il . not y . core . repository . Not y UserRepository Ċ import Ġdev . sh rey as pat il . not y . core . session . Session Manager Ċ import Ġdev . sh rey as pat il . not y . test Utils . currentState ShouldBe Ċ import Ġdev . sh rey as pat il . not y . test Utils . with State Ċ import Ġdev . sh rey as pat il . not y . view . state . Login State Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠLogin ViewModel Test Ġ: ĠViewModel Behavior Spec ({ ĊĊĠĠĠ Ġval Ġrepository : ĠNot y UserRepository Ġ= Ġmock k () ĊĠĠĠ Ġval Ġsession Manager : ĠSession Manager Ġ= Ġmock k ( relax Unit Fun Ġ= Ġtrue ) ĊĊĠĠĠ Ġval ĠviewModel Ġ= ĠLogin ViewModel ( repository , Ġsession Manager ) ĊĊĠĠĠ ĠGiven (" The ĠViewModel ") Ġ{ ĊĠĠĠĠĠĠĠ ĠWhen (" Initialized ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected State Ġ= ĠLogin State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis LoggedIn Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Username Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Password Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Initial Ġstate Ġshould Ġbe Ġvalid ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Ġcurrent State ShouldBe Ġexpected State ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠGiven (" A Ġusername Ġand Ġpassword ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġ" john doe " ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġ" e od n ho j " ĊĊĠĠĠĠĠĠĠ ĠWhen (" Username Ġis Ġset ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Username ( username ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Username Ġshould Ġbe Ġupdated Ġin Ġthe Ġcurrent Ġstate ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . with State Ġ{ Ġthis . username ĠshouldBe Ġusername Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠWhen (" Password Ġis Ġset ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Password ( password ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Password Ġshould Ġbe Ġupdated Ġin Ġthe Ġcurrent Ġstate ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . with State Ġ{ Ġthis . password ĠshouldBe Ġpassword Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠGiven (" A Ġuser Ġcredentials ") Ġ{ ĊĠĠĠĠĠĠĠ ĠAnd (" The Ġuser Ġprovides Ġincomplete Ġcredentials ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġ" john " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġ" e od " ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Username ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Password ( password ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen (" User Ġlogs Ġin ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . login () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Credentials Ġshould Ġbe Ġvalidated Ġand Ġstate Ġshould Ġbe Ġupdated ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . with State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Username ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Password ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" User Ġshould ĠNOT Ġbe Ġget Ġretrieved ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . getUser By Username And Password ( username , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAnd (" User Ġuses Ġvalid Ġcredentials ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġ" john doe 1 2 3 4 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġ" 4 3 2 1 e od n ho j " ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Username ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Password ( password ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġ" Bearer ĠTOKEN _ ABC " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository . getUser By Username And Password ( username , Ġpassword ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Either . success ( Auth Credential ( token ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen (" User Ġlogs Ġin ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . login () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" User Ġshould Ġbe Ġget Ġretrieved ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġrepository . getUser By Username And Password ( username , Ġpassword ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Authentication Ġtoken Ġshould Ġbe Ġget Ġsaved ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Ġ{ Ġsession Manager . save Token ( eq ( token )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Credentials Ġshould Ġbe Ġvalidated ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . with State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Username ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Password ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" Valid ĠUI Ġstates Ġshould Ġbe Ġupdated ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . with State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisLoading ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis LoggedIn ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ĠshouldBe Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAnd (" Repository Ġfails Ġto Ġful fil Ġthe Ġrequest ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġ" john doe 1 2 3 4 5 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġ" 5 4 3 2 1 e od n ho j " ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Username ( username ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . set Password ( password ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository . getUser By Username And Password ( username , Ġpassword ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( Either . error (" User Ġnot Ġexist ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen (" User Ġlogs Ġin ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . login () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" User Ġshould Ġbe Ġget Ġretrieved ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġrepository . getUser By Username And Password ( username , Ġpassword ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThen (" State Ġshould Ġcontain Ġerror ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . with State Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis LoggedIn ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror ĠshouldBe Ġ" User Ġnot Ġexist " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ