package Ġcom . source for g ery . t ach ik oma . m ta Ċ Ċ import Ġcom . fasterxml . jackson . databind . node . JsonNode Factory Ċ import Ġcom . source for g ery . t ach ik oma . Database Binder Ċ import Ġcom . source for g ery . t ach ik oma . Test Binder Ċ import Ġcom . source for g ery . t ach ik oma . auth . Authentication Mock Ċ import Ġcom . source for g ery . t ach ik oma . common . Authentication Role Ċ import Ġcom . source for g ery . t ach ik oma . common . Email Ċ import Ġcom . source for g ery . t ach ik oma . common . to Timestamp Ċ import Ġcom . source for g ery . t ach ik oma . config . Database Config Ċ import Ġcom . source for g ery . t ach ik oma . database . dao . Account DAO Ċ import Ġcom . source for g ery . t ach ik oma . database . objects . Account DB O Ċ import Ġcom . source for g ery . t ach ik oma . database . objects . Authentication DB O Ċ import Ġcom . source for g ery . t ach ik oma . database . objects . Email DB O Ċ import Ġcom . source for g ery . t ach ik oma . database . objects . Email Send Transaction DB O Ċ import Ġcom . source for g ery . t ach ik oma . database . objects . id Ċ import Ġcom . source for g ery . t ach ik oma . grpc . Queue Stream Observer Ċ import Ġcom . source for g ery . t ach ik oma . hk 2 . get Ċ import Ġcom . source for g ery . t ach ik oma . hk 2 . located Ċ import Ġcom . source for g ery . t ach ik oma . identifiers . Mail Domain Ċ import Ġcom . source for g ery . t ach ik oma . identifiers . MessageId Ċ import Ġcom . source for g ery . t ach ik oma . mq . MQ Sender Mock Ċ import Ġcom . source for g ery . t ach ik oma . mq . MQ Sequence Factory Mock Ċ import Ġcom . source for g ery . t ach ik oma . mq . Outgoing Email Message Ċ import Ġcom . source for g ery . t ach ik oma . mq . Queue Message Wrap Ċ import Ġio . e bean . E bean Server Ċ import Ġjava . time . Clock Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNotNull Ċ import Ġorg . glass fish . hk 2 . api . Service Locator Ċ import Ġorg . glass fish . hk 2 . utilities . Service Locator Utilities Ċ import Ġorg . jetbrains . spe k . api . Spe k Ċ import Ġorg . jetbrains . spe k . api . dsl . describe Ċ import Ġorg . jetbrains . spe k . api . dsl . it Ċ import Ġorg . junit . platform . runner . JUnit Platform Ċ import Ġorg . junit . runner . RunWith Ċ Ċ @ RunWith ( JUnit Platform :: class ) Ċ class ĠM TA Email Queue Service Spec Ġ: ĠSpe k ({ ĊĠĠĠ Ġlateinit Ġvar Ġservice Locator : ĠService Locator ĊĠĠĠ Ġval Ġm ta Email Queue Service : Ġ() Ġ-> ĠM TA Email Queue Service Ġ= Ġlocated Ġ{ Ġservice Locator Ġ} ĊĠĠĠ Ġval Ġauthentication : Ġ() Ġ-> ĠAuthentication Mock Ġ= Ġlocated Ġ{ Ġservice Locator Ġ} ĊĠĠĠ Ġval Ġe bean Server : Ġ() Ġ-> ĠE bean Server Ġ= Ġlocated Ġ{ Ġservice Locator Ġ} ĊĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠ Ġservice Locator Ġ= ĠService Locator Utilities . bind ( Test Binder (), ĠDatabase Binder ()) !! ĊĠĠĠ Ġ} ĊĠĠĠ ĠafterEach Test Ġ{ Ġservice Locator . shutdown () Ġ} ĊĊĠĠĠ Ġfun Ġcreate Authentication ( domain : ĠString ): ĠAuthentication DB O Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccount DB O Ġ= ĠAccount DB O ( Mail Domain ( domain )) ĊĠĠĠĠĠĠĠ Ġe bean Server (). save ( account DB O ) ĊĊĠĠĠĠĠĠĠ Ġval Ġauthentication DB O Ġ= ĠAuthentication DB O ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Ġ= Ġdomain , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Password Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapi Token Ġ= ĠUUID . randomUUID (). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrole Ġ= ĠAuthentication Role . BACKEND , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Ġ= Ġaccount DB O ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġe bean Server (). save ( authentication DB O ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġauthentication DB O ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" MT A Ġqueue Ġservice Ġtest ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm q Sequence Factory Mock : Ġ() Ġ-> ĠMQ Sequence Factory Mock Ġ= Ġlocated Ġ{ Ġservice Locator Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġm q Sender Mock : Ġ() Ġ-> ĠMQ Sender Mock Ġ= Ġlocated Ġ{ Ġservice Locator Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġclock : Ġ() Ġ-> ĠClock Ġ= Ġlocated Ġ{ Ġservice Locator Ġ} ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġauthentication DB O : ĠAuthentication DB O ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġemail : ĠEmail DB O ĊĊĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Authentication (" example . net ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdatabase Config : ĠDatabase Config Ġ= Ġservice Locator . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount DAO : ĠAccount DAO Ġ= Ġservice Locator . get () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSetup Ġauth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Ġ= Ġaccount DAO . getBy Mail Domain ( database Config . mail Domain ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication DB O Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount . auth entic ations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Ġ{ Ġit . role Ġ== ĠAuthentication Role . BACKEND Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication (). from ( authentication DB O ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail Ġ= ĠEmail DB O ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Ġ= ĠEmail (" foo @ example . net "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecipient Name Ġ= Ġ" N obody ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmessageId Ġ= ĠMessage Id (" sd jk lf jk ls df kl @ example . net "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmetaData Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction Ġ= ĠEmail Send Transaction DB O ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Request Ġ= ĠJsonNode Factory . instance . object Node (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Email Ġ= ĠEmail (" food sj kl ff @ example . net "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthentication Ġ= Ġauthentication DB O , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmetaData Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemail . body Ġ= Ġ"${ UUID . randomUUID () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe bean Server (). save ( email ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" Create Ġemail Ġtest ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Observer Ġ= ĠQueue Stream Observer < Email Message >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ta Email Queue Service (). get Emails ( response Observer , Ġauthentication (). mail Domain ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm q Sequence Factory Mock (). outgoing Emails . add ( Queue Message Wrap ( Outgoing Email Message . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Creation Timestamp ( clock (). instant (). to Timestamp ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Email Id ( email . id . email Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġm q Sequence Factory Mock (). outgoing Emails . offer ( Queue Message Wrap ( null ), Ġ 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm q Sequence Factory Mock (). outgoing Emails . offer ( Queue Message Wrap ( null ), Ġ 1 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġresponse Observer . queue . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġemail Message Ġ= Ġresponse Observer . queue . take (). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" Should Ġnot Ġbe Ġa ĠonComplete Ġevent ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( response Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( email Message . body , Ġemail . body ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( email Message . email Address , Ġemail . recipient . address ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( email Message . email Id , Ġemail . id . email Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" Receive Ġqueue Ġmessage ") Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Observer Ġ= ĠQueue Stream Observer < Email Message >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Stream Observer Ġ= Ġm ta Email Queue Service (). get Emails ( response Observer , Ġauthentication (). mail Domain ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Stream Observer . onNext ( MT A Queued Notification . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Email Id ( email . id . email Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Queue Id (" foobar Queue Id ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Recipient EmailAddress ( email . body !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Success ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm q Sequence Factory Mock (). outgoing Emails . offer ( Queue Message Wrap ( null ), Ġ 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm q Sequence Factory Mock (). outgoing Emails . offer ( Queue Message Wrap ( null ), Ġ 1 , ĠTimeUnit . SECONDS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġm q Sender Mock (). delivery Notifications . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe bean Server (). refresh ( email ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" foobar Queue Id ", Ġemail . m ta Queue Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġm q Sender Mock (). delivery Notifications . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġm q Sender Mock (). delivery Notifications . take () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( email . id . email Id , Ġnotification . email MessageId ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ