package Ġorg . v accine impact . order ly web . tests . unit _ tests Ċ Ċ import Ġcom . n ha ar man . mockito _ kotlin .* Ċ import Ġorg . assertj . core . api . Assertions Ċ import Ġorg . junit . Test Ċ import Ġorg . assertj . core . api . Assertions . assertThat Ċ import Ġorg . mockito . Argument Captor Ċ import Ġorg . pac 4 j . core . authorization . author izer . Author izer Ċ import Ġorg . v accine impact . order ly web .* Ċ import Ġorg . v accine impact . order ly web . controllers . Controller Ċ import Ġorg . pac 4 j . spark java . Security Filter Ċ import Ġorg . pac 4 j . core . config . Config Ċ import Ġorg . pac 4 j . core . profile . Common Profile Ċ import Ġorg . v accine impact . order ly web . models . Permission Requirement Ċ import Ġorg . v accine impact . order ly web . security . API Security Config Factory Ċ import Ġspark . Filter Ċ import Ġspark . route . HttpMethod Ċ Ċ class ĠAPI Endpoint Tests Ċ { ĊĠĠĠ Ġprivate Ġclass ĠTest Controller ( action Context : ĠAction Context ) Ġ: ĠController ( action Context ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` adds Ġheaders Ġfilter Ġif Ġcontent Ġtype Ġis Ġjson `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Spark Ġ= Ġmock < Spark Wrapper >() ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠContent Types . json , Ġspark Ġ= Ġmock Spark ) ĊĊĠĠĠĠĠĠĠ Ġsut . additional Setup ("/ test ") ĊĊĠĠĠĠĠĠĠ Ġval Ġfilter Arg Ġ: ĠArgument Captor < Filter > Ġ= ĠArgument Captor . for Class ( Filter :: class . java ) ĊĠĠĠĠĠĠĠ Ġverify ( mock Spark ). after ( eq ("/ test "), Ġeq ( Content Types . json ), Ġcapture ( filter Arg )) ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġfilter Arg . value ĊĠĠĠĠĠĠĠ ĠassertThat ( filter Ġis ĠDefault Headers Filter ). isTrue () ĊĠĠĠĠĠĠĠ ĠassertThat (( filter Ġas ĠDefault Headers Filter ). contentType ). isEqualTo (" application / json ; Ġcharset = utf - 8 ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` does Ġnot Ġadd Ġheaders Ġfilter Ġif Ġcontent Ġtype Ġis Ġnot Ġjson `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Spark Ġ= Ġmock < Spark Wrapper >() ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠContent Types . binary data , Ġspark Ġ= Ġmock Spark ) ĊĊĠĠĠĠĠĠĠ Ġsut . additional Setup ("/ test ") ĊĊĠĠĠĠĠĠĠ Ġverify ( mock Spark , Ġtimes ( 0 )). after ( any (), Ġany (), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` adds Ġsecurity Ġfilter Ġif Ġsecure , Ġboth Ġauthentication Ġflags Ġare Ġfalse `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Spark Ġ= Ġmock < Spark Wrapper >() ĊĠĠĠĠĠĠĠ Ġval Ġmock Author izer Ġ= Ġmock < Author izer < Common Profile >>() ĊĠĠĠĠĠĠĠ Ġval Ġmock Config Ġ= Ġmock < Config > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġauthor izers Ġ} Ġdo Return Ġmap Of (" dummy Author izer " Ġto Ġmock Author izer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmock Config Factory Ġ= Ġmock < API Security Config Factory > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġall Clients () Ġ} Ġdo Return (" test clients ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġbuild () Ġ} Ġdo Return ( mock Config ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( mock Config Factory . set Required Permissions ( any ())). do Return ( mock Config Factory ) ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Config Factory . allow Parameter Authentication ()). do Return ( mock Config Factory ) ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Config Factory . external Authentication ()). do Return ( mock Config Factory ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpermission Requirement Ġ= ĠPermission Requirement . parse (" */ test perm ") ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠContent Types . binary data , Ġsecure Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Permissions Ġ= ĠlistOf ( permission Requirement ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspark Ġ= Ġmock Spark , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Factory Ġ= Ġmock Config Factory ) ĊĊĠĠĠĠĠĠĠ Ġsut . additional Setup ("/ test ") ĊĊĠĠĠĠĠĠĠ Ġ// Verify Ġall Ġexpected Ġmethods Ġwere Ġcalled Ġor Ġnot Ġcalled ĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory ). set Required Permissions ( check Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . size ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . first ()). isEqualTo ( permission Requirement ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory ). build () ĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory ). all Clients () ĊĊĠĠĠĠĠĠĠ Ġval Ġsecurity Filter Arg : ĠArgument Captor < Security Filter > Ġ= ĠArgument Captor . for Class ( Security Filter :: class . java ) ĊĠĠĠĠĠĠĠ Ġverify ( mock Spark ). before ( eq ("/ test "), Ġeq ( Content Types . binary data ), Ġeq ( HttpMethod . get ), Ġcapture ( security Filter Arg )) ĊĊĠĠĠĠĠĠĠ Ġ// verify Ġthe Ġsecurity Ġfilter Ġhas Ġbeen Ġcreated Ġas Ġexpected ĊĠĠĠĠĠĠĠ Ġval Ġsecurity Filter Class Ġ= ĠSecurity Filter :: class . java ĊĠĠĠĠĠĠĠ Ġval Ġsecurity Filter Ġ= Ġsecurity Filter Arg . value ĊĊĠĠĠĠĠĠĠ Ġvar Ġfield Ġ= Ġsecurity Filter Class . getDeclared Field (" config ") ĊĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġfield . get ( security Filter ) ĊĠĠĠĠĠĠĠ ĠassertThat ( config ). isEqualTo ( mock Config ) ĊĊĠĠĠĠĠĠĠ Ġfield Ġ= Ġsecurity Filter Class . getDeclared Field (" clients ") ĊĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġclients Ġ= Ġfield . get ( security Filter ) ĊĠĠĠĠĠĠĠ ĠassertThat ( clients ). isEqualTo (" test clients ") ĊĊĠĠĠĠĠĠĠ Ġval Ġauthor izers Ġ= Ġsecurity Filter . author izers ĊĠĠĠĠĠĠĠ ĠAssertions . assertThat ( author izers ). isEqualTo (" dummy Author izer ") ĊĊĠĠĠĠĠĠĠ Ġval Ġmatch ers Ġ= Ġsecurity Filter . matchers ĊĠĠĠĠĠĠĠ ĠAssertions . assertThat ( matchers ). isEqualTo (" Skip Options ") ĊĊĠĠĠĠĠĠĠ Ġ// Should Ġnot Ġhave Ġcalled Ġthese Ġmethods ĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory , Ġtimes ( 0 )). allow Parameter Authentication () ĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory , Ġtimes ( 0 )). external Authentication () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` adds Ġsecurity Ġfilter Ġif Ġsecure , Ġboth Ġauthentication Ġflags Ġare Ġtrue `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Spark Ġ= Ġmock < Spark Wrapper >() ĊĠĠĠĠĠĠĠ Ġval Ġmock Config Ġ= Ġmock < Config > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġauthor izers Ġ} Ġdo Return Ġmap Of () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmock Config Factory Ġ= Ġmock < API Security Config Factory > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġall Clients () Ġ} Ġdo Return ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġbuild () Ġ} Ġdo Return ( mock Config ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( mock Config Factory . set Required Permissions ( any ())). do Return ( mock Config Factory ) ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Config Factory . allow Parameter Authentication ()). do Return ( mock Config Factory ) ĊĠĠĠĠĠĠĠ Ġwhenever ( mock Config Factory . external Authentication ()). do Return ( mock Config Factory ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpermission Requirement Ġ= ĠPermission Requirement . parse (" */ test perm ") ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠContent Types . binary data , Ġsecure Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Permissions Ġ= ĠlistOf ( permission Requirement ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallow Parameter Authentication Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthenticate With External Provider Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspark Ġ= Ġmock Spark , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig Factory Ġ= Ġmock Config Factory ) ĊĊĠĠĠĠĠĠĠ Ġsut . additional Setup ("/ test ") ĊĊĠĠĠĠĠĠĠ Ġ// Verify Ġall Ġexpected t Ġmethods Ġwere Ġcalled Ġor Ġnot Ġcalled ĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory ). set Required Permissions ( check Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . size ). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( it . first ()). isEqualTo ( permission Requirement ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory ). build () ĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory ). all Clients () ĊĊĠĠĠĠĠĠĠ Ġval Ġsecurity Filter Arg : ĠArgument Captor < Security Filter > Ġ= ĠArgument Captor . for Class ( Security Filter :: class . java ) ĊĠĠĠĠĠĠĠ Ġverify ( mock Spark ). before ( eq ("/ test "), Ġeq ( Content Types . binary data ), Ġeq ( HttpMethod . get ), Ġcapture ( security Filter Arg )) ĊĊĠĠĠĠĠĠĠ Ġ// verify Ġthe Ġsecurity Ġfilter Ġhas Ġbeen Ġcreated Ġwith Ġmock Config ĊĠĠĠĠĠĠĠ Ġval Ġsecurity Filter Class Ġ= ĠSecurity Filter :: class . java ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġsecurity Filter Class . getDeclared Field (" config ") ĊĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġfield . get ( security Filter Arg . value ) ĊĠĠĠĠĠĠĠ ĠassertThat ( config ). isEqualTo ( mock Config ) ĊĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory ). allow Parameter Authentication () ĊĠĠĠĠĠĠĠ Ġverify ( mock Config Factory ). external Authentication () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` does Ġnot Ġadd Ġsecurity Ġfilter Ġif Ġnot Ġsecure `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Spark Ġ= Ġmock < Spark Wrapper >() ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠContent Types . json , Ġsecure = false , Ġspark Ġ= Ġmock Spark ) ĊĊĠĠĠĠĠĠĠ Ġsut . additional Setup ("/ test ") ĊĊĠĠĠĠĠĠĠ Ġverify ( mock Spark , Ġtimes ( 0 )). before ( any (), any (), Ġany (), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġset Ġallow Parameter Authentication `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( sut . allow Parameter Authentication ). isFalse () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsut . allow Parameter Authentication () ĊĠĠĠĠĠĠĠ ĠassertThat ( result . allow Parameter Authentication ). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġsecure `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( sut . secure ). isFalse () ĊĠĠĠĠĠĠĠ ĠassertThat ( sut . required Permissions . count ()). isEqualTo ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsut . secure ( set Of (" */ test perm ")) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result . secure ). isTrue () ĊĠĠĠĠĠĠĠ ĠassertThat ( result . required Permissions . count ()). isEqualTo ( 1 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . required Permissions . first (). name ). isEqualTo (" test perm ") ĊĠĠĠĠĠĠĠ ĠassertThat ( result . required Permissions . first (). scope Requirement . toString ()). isEqualTo ("* ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġset Ġtransform `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( sut . transform ). isFalse () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsut . transform () ĊĠĠĠĠĠĠĠ ĠassertThat ( result . transform ). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġset Ġjson Ġcontent Ġtype `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( sut . contentType ). isEqualTo (" application / octet - stream ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsut . json () ĊĠĠĠĠĠĠĠ ĠassertThat ( result . contentType ). isEqualTo (" application / json ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġset Ġhtml Ġcontent Ġtype `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsut . html () ĊĠĠĠĠĠĠĠ ĠassertThat ( result . contentType ). isEqualTo (" text / html ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġset Ġexternal Ġauthentication `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( sut . authenticate With External Provider ). isFalse () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsut . external Auth () ĊĠĠĠĠĠĠĠ ĠassertThat ( result . authenticate With External Provider ). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` can Ġset Ġpost `() ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsut Ġ= ĠAPI Endpoint ( url Fragment Ġ= Ġ"/ test ", Ġaction Name Ġ= Ġ" test ", Ġcontroller Ġ= ĠTest Controller :: class ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( sut . method ). isEqualTo ( HttpMethod . get ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsut . post () ĊĠĠĠĠĠĠĠ ĠassertThat ( result . method ). isEqualTo ( HttpMethod . post ) ĊĠĠĠ Ġ} Ċ }