package Ġorg . fn ives . keep ass . android . storage Ċ Ċ import Ġjava . io . File Ċ import Ġjava . util . UUID Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . fn ives . keep ass . android . storage . exception . Authentication Exception Ċ import Ġorg . fn ives . keep ass . android . storage . internal . Actual K ee Pass Repository Ċ import Ġorg . fn ives . keep ass . android . storage . model . Credentials Ċ import Ġorg . fn ives . keep ass . android . storage . model . Entry Ċ import Ġorg . fn ives . keep ass . android . storage . model . Entry Detailed Ċ import Ġorg . fn ives . keep ass . android . storage . model . Group Ċ import Ġorg . fn ives . keep ass . android . storage . model . GroupId Ċ import Ġorg . fn ives . keep ass . android . storage . model . Group Or Entry Ċ import Ġorg . fn ives . keep ass . android . storage . model . K Icon Ċ import Ġorg . fn ives . keep ass . android . storage . testutil . Test Dispatcher Holder Ċ import Ġorg . fn ives . keep ass . android . storage . testutil . copy Resource Ċ import Ġorg . junit . jupiter . api . After Each Ċ import Ġorg . junit . jupiter . api . Assertions Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . DisplayName Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠSearch ByName IntegrationTest Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsut : ĠK ee Pass Repository ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtest Dispatcher Holder : ĠTest Dispatcher Holder ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatabase File : ĠFile ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Dispatcher Holder Ġ= ĠTest Dispatcher Holder ( start Paused Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġdatabase File Ġ= Ġcopy Resource (" empty . k db x ") ĊĠĠĠĠĠĠĠ Ġsut Ġ= ĠActual K ee Pass Repository . getInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatcher Holder Ġ= Ġtest Dispatcher Holder . dispatcher Holder ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtest Dispatcher Holder . single . resume Dispatcher () ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġsut . authenticate ( Credentials ( database File , Ġ" test 1 ")) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After Each ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase File . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġempty Ġdatabase ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġnothing Ġis Ġreturned ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġempty DB Search () Ġ= Ġrun Blocking Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . search (" bl ab la ") ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( emptyList < Group Or Entry >(), Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġnon Ex istent Group ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġnothing Ġis Ġreturned ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnon Ex istent Group Search () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . search (" bl ab la ", Ġscope Ġ= ĠGroup Id ( UUID ( 2 , Ġ 4 ))) ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( emptyList < Group Or Entry >(), Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġdatabase Ġwith Ġnon - matching Ġgroup Ġand Ġentry ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġnothing Ġis Ġreturned ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnon Matching () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), ĠGroup Id . ROOT _ ID ) ĊĠĠĠĠĠĠĠ Ġsut . add Entry ( Entry Detailed ( entry Name Ġ= Ġ" 2 ", ĠuserName Ġ= Ġ"", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĠGroup Id . ROOT _ ID ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . search (" bl ab la ") ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( emptyList < Group Or Entry >(), Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġdatabase Ġwith Ġmatching Ġgroup Ġand Ġentry ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġthey Ġare Ġreturned ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmatching Flat () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠgroupId Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 3 "), ĠGroup Id . ROOT _ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġentry Id Ġ= Ġsut . add Entry ( Entry Detailed ( entry Name Ġ= Ġ" 1 2 ", ĠuserName Ġ= Ġ" a ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĠGroup Id . ROOT _ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGroup ( id Ġ= ĠgroupId , ĠgroupName Ġ= Ġ" 1 3 ", Ġicon Ġ= ĠK Icon . Folder , Ġentry Or Group Count Ġ= Ġ 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry ( id Ġ= Ġentry Id , Ġentry Name Ġ= Ġ" 1 2 ", Ġicon Ġ= ĠK Icon . Key , ĠuserName Ġ= Ġ" a ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . search (" 1 ") ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( expected , Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġentry Ġmatching Ġby Ġother Ġattributes ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġnothing Ġis Ġreturned ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġmatching By Other Attribute () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġsut . add Entry ( Entry Detailed ( entry Name Ġ= Ġ" xxx ", ĠuserName Ġ= Ġ" 1 2 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĠGroup Id . ROOT _ ID ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . search (" 1 ") ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( emptyList < Group Or Entry >(), Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġdatabase Ġwith Ġmatching Ġby Ġother Ġattribute Ġentry ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġnothing Ġis Ġreturned ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdeep Group And Entry Search () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠgroupId Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), ĠGroup Id . ROOT _ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġgroup To Find 1 Id Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" xx YY xx ", Ġicon Ġ= ĠK Icon . Folder Open ), ĠgroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġsub GroupId Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), ĠgroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġentry To Find 1 Ġ= Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" zz YY xx ", ĠuserName Ġ= Ġ" 1 2 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ"", Ġicon Ġ= ĠK Icon . World Star ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub GroupId ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsub GroupId 2 Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), Ġsub GroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġgroup To Find 2 Id Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" xx YYY xx "), Ġsub GroupId 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġentry To Find 2 Ġ= Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" zz YY xx ", ĠuserName Ġ= Ġ" 1 2 3 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup To Find 2 Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" a ", ĠuserName Ġ= Ġ" 1 2 4 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup To Find 2 Id ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGroup ( id Ġ= Ġgroup To Find 1 Id , ĠgroupName Ġ= Ġ" xx YY xx ", Ġicon Ġ= ĠK Icon . Folder Open ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGroup ( id Ġ= Ġgroup To Find 2 Id , ĠgroupName Ġ= Ġ" xx YYY xx ", Ġicon Ġ= ĠK Icon . Folder , Ġentry Or Group Count Ġ= Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry ( id Ġ= Ġentry To Find 1 , Ġentry Name Ġ= Ġ" zz YY xx ", Ġicon Ġ= ĠK Icon . World Star , ĠuserName Ġ= Ġ" 1 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry ( id Ġ= Ġentry To Find 2 , Ġentry Name Ġ= Ġ" zz YY xx ", Ġicon Ġ= ĠK Icon . Key , ĠuserName Ġ= Ġ" 1 2 3 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . search (" yy ") ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( expected , Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġdatabase Ġwith Ġmatching Ġby Ġother Ġattribute Ġentry ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġnothing Ġis Ġreturned ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdeep Scoped Group And Entry Search () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠgroupId Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), ĠGroup Id . ROOT _ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġgroup To Find 1 Id Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" xx YY xx ", Ġicon Ġ= ĠK Icon . Folder Open ), ĠgroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġsub GroupId Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), ĠgroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġentry To Find 1 Ġ= Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" zz YY xx ", ĠuserName Ġ= Ġ" 1 2 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ"", Ġicon Ġ= ĠK Icon . World Star ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub GroupId ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsub GroupId 2 Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), Ġsub GroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġgroup To Find 2 Id Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" xx YYY xx "), Ġsub GroupId 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġentry To Find 2 Ġ= Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" zz YY xx ", ĠuserName Ġ= Ġ" 1 2 3 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup To Find 2 Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" a ", ĠuserName Ġ= Ġ" 1 2 4 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup To Find 2 Id ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry ( id Ġ= Ġentry To Find 2 , Ġentry Name Ġ= Ġ" zz YY xx ", Ġicon Ġ= ĠK Icon . Key , ĠuserName Ġ= Ġ" 1 2 3 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . search (" yy ", Ġscope Ġ= Ġgroup To Find 2 Id ) ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( expected , Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġdatabase Ġwith Ġmatching Ġby Ġother Ġattribute Ġentry ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġnothing Ġis Ġreturned ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdeep Scoped Group Multiple Match And Entry Search () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠgroupId Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), ĠGroup Id . ROOT _ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġgroup To Find 1 Id Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" xx YY xx ", Ġicon Ġ= ĠK Icon . Folder Open ), ĠgroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġsub GroupId Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), ĠgroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġentry To Find 1 Ġ= Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" zz YY xx ", ĠuserName Ġ= Ġ" 1 2 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ"", Ġicon Ġ= ĠK Icon . World Star ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub GroupId ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsub GroupId 2 Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" 1 "), Ġsub GroupId ) ĊĠĠĠĠĠĠĠ Ġval Ġgroup To Find 2 Id Ġ= Ġsut . addGroup ( Group ( groupName Ġ= Ġ" xx YYY xx "), Ġsub GroupId 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġentry To Find 2 Ġ= Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" zz YY xx ", ĠuserName Ġ= Ġ" 1 2 3 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup To Find 2 Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsut . add Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry Detailed ( entry Name Ġ= Ġ" a ", ĠuserName Ġ= Ġ" 1 2 4 ", Ġpassword Ġ= Ġ"", Ġurl Ġ= Ġ"", Ġnotes Ġ= Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup To Find 2 Id ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGroup ( id Ġ= Ġgroup To Find 2 Id , ĠgroupName Ġ= Ġ" xx YYY xx ", Ġicon Ġ= ĠK Icon . Folder , Ġentry Or Group Count Ġ= Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEntry ( id Ġ= Ġentry To Find 2 , Ġentry Name Ġ= Ġ" zz YY xx ", Ġicon Ġ= ĠK Icon . Key , ĠuserName Ġ= Ġ" 1 2 3 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġsut . search (" yy ", Ġscope Ġ= Ġsub GroupId 2 ) ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals ( expected , Ġactual ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ DisplayName (" G IV EN Ġun authenticated ĠDB ĠWHEN Ġsearching Ġby Ġname ĠTHEN Ġexception Ġis Ġthrown ") ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġun authenticated () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġsut . disconnect () Ġ} ĊĠĠĠĠĠĠĠ Ġdatabase File Ġ= Ġcopy Resource (" empty . k db x ") ĊĠĠĠĠĠĠĠ Ġval Ġactual Ġ= ĠAssertions . assert Throws ( Authentication Exception :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġsut . search ( name Ġ= Ġ"") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAssertions . assertEquals (" Database Ġis Ġnot Ġinitialized Ġ/ Ġauthenticated ", Ġactual . message ) ĊĠĠĠ Ġ} Ċ } Ċ