package Ġcom . pk ul ak . memo . api Ċ Ċ import Ġcom . pk ul ak . memo . ACCOUNT Ċ import Ġcom . pk ul ak . memo . ACCOUNT 2 Ċ import Ġcom . pk ul ak . memo . BLOCK _ ID Ċ import Ġcom . pk ul ak . memo . PRIVATE _ KEY Ċ import Ġcom . pk ul ak . memo . PRIVATE _ KEY 2 Ċ import Ġcom . pk ul ak . memo . get Ċ import Ġcom . pk ul ak . memo . init Ċ import Ġcom . pk ul ak . memo . init Db Ċ import Ġcom . pk ul ak . memo . reset Db Ċ import Ġcom . pk ul ak . memo . storage . Block Storage Ċ import Ġcom . pk ul ak . memo . util . bytes Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . ktor . application . Application Ċ import Ġio . ktor . http . HttpHeaders Ċ import Ġio . ktor . http . HttpMethod Ċ import Ġio . ktor . http . HttpStatusCode Ċ import Ġio . ktor . server . testing . handle Request Ċ import Ġio . ktor . server . testing . set Body Ċ import Ġio . ktor . server . testing . with Test Application Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . serialization . encode ToString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġorg . junit . jupiter . api . Before All Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . Test Instance Ċ import Ġuk . oc z ad ly . kar l . jn ano . util . Crypto Util Ċ Ċ val ĠSIG Ġ= Ġ" 6 F 0 E 5 8 9 A 4 1 0 AE 0 4 4 E BB 2 ED 6 9 4 2 E 6 6 7 B 2 9 7 8 9 BBB CB D CA 2 0 B 8 5 BD 0 1 8 B 9 2 AB 5 9 5 7 4 4 7 3 7 2 A 3 E BB 9 F 5 C 9 D 4 ADA 7 E 8 E 0 E 5 EF 1 3 C 7 3 9 0 8 7 E 2 5 C " Ġ+ ĊĠĠĠĠĠĠĠ Ġ" 0 BA 2 D 2 D 6 1 2 9 8 E 7 0 9 9 1 F 4 0 3 " Ċ Ċ @ Test Instance ( Test Instance . Lifecycle . PER _ CLASS ) Ċ class ĠBlock Test Ġ{ ĊĠĠĠ Ġ@ Before All ĊĠĠĠ Ġfun Ġsetup () Ġ= Ġwith Test Application ( Application :: init ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Db () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġreset () Ġ= Ġwith Test Application ( Application :: init ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreset Db () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġblock Creation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbad Sig Ġ= Ġ" AB 6 C 2 AC 9 EA ED 6 9 DB A 2 3 B 0 7 9 0 B 9 7 D 8 D DB B 5 D 0 0 5 5 7 0 EF 7 9 3 3 7 3 FF C 5 0 1 1 CD 3 2 8 D 8 D 7 E 4 7 7 8 BE 3 DE 9 1 6 0 3 F 4 3 0 AD 4 6 6 C 6 FE 9 2 " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" FD 7 F 6 4 4 C AB 9 1 2 C 6 4 E BC 2 AD 0 9 4 6 B FA EE 0 B " ĊĊĠĠĠĠĠĠĠ Ġcreate Block ( SIG ) ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠ Ġcreate Block ( bad Sig ) ĠshouldBe ĠHttpStatusCode . Unauthorized ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġduplicate Block Creation () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Block ( SIG ) ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠĠĠĠĠ Ġcreate Block ( SIG ) ĠshouldBe ĠHttpStatusCode . BadRequest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Block ( signature : ĠString ): ĠHttpStatusCode Ġ= Ġwith Test Application ({ Ġinit (); Ġblock () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Object Ġ= ĠBlock Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ= ĠBLOCK _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Ġ= ĠAC COUNT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlink Ġ= ĠAC COUNT 2 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemo Ġ= Ġ" P izza ! Ġ\ uD 8 3 C \ u DF 5 5 " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Bytes Ġ= ĠJson . encode ToString ( body Object ). toByteArray () ĊĊĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġhandle Request ( HttpMethod . Post , Ġ"/ blocks ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . ContentType , Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Content Length , Ġbody Bytes . size . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Signature Ġ$ signature ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Body ( body Bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresp . response . status () !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġblock Retrie val () Ġ= Ġwith Test Application ({ Ġinit (); Ġblock () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġget < Block Storage >(). insert Block ( BLOCK _ ID , ĠAC COUNT , ĠAC COUNT 2 , Ġ" A Ġnew Ġbi ke ... Ġwow ! Ġ\ uD 8 3 D \ u DEB 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġsign Ġthe Ġfull Ġpath Ġfor Ġauthorization ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ"/ blocks /$ BLOCK _ ID / memo ? account =$ ACCOUNT " ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= ĠCrypto Util . sign ( path . toByteArray (), ĠPRIVATE _ KEY 2 . bytes ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġhandle Request ( HttpMethod . Get , Ġpath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Signature Ġ$ signature ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresp . response . status () ĠshouldBe ĠHttpStatusCode . OK ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresp . response . content ĠshouldBe Ġ" A Ġnew Ġbi ke ... Ġwow ! Ġ\ uD 8 3 D \ u DEB 4 " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġblock Retrie val Bad Sig () Ġ= Ġwith Test Application ({ Ġinit (); Ġblock () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġget < Block Storage >(). insert Block ( BLOCK _ ID , ĠAC COUNT , ĠAC COUNT 2 , Ġ" A Ġnew Ġbi ke ... Ġwow ! Ġ\ uD 8 3 D \ u DEB 4 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġhandle Request ( HttpMethod . Get , Ġ"/ blocks /$ BLOCK _ ID / memo ? account =$ ACCOUNT ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Signature ĠBD 7 9 CE 8 5 C 8 AF 7 9 4 FD 5 6 7 C 5 D 5 D 9 F 6 F BB 5 9 3 5 3 DE 1 E 2 AF 4 3 E 7 DB 1 1 4 8 2 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresp . response . status () ĠshouldBe ĠHttpStatusCode . Unauthorized ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġblock Retrie val As Sender () Ġ= Ġwith Test Application ({ Ġinit (); Ġblock () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġget < Block Storage >(). insert Block ( BLOCK _ ID , ĠAC COUNT , ĠAC COUNT 2 , Ġ" A Ġnew Ġbi ke ... Ġwow ! Ġ\ uD 8 3 D \ u DEB 4 ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġwe Ġuse Ġthe Ġ_ sender _ Ġprivate Ġkey ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ"/ blocks /$ BLOCK _ ID / memo " ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= ĠCrypto Util . sign ( path . toByteArray (), ĠPRIVATE _ KEY . bytes ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġresp Ġ= Ġhandle Request ( HttpMethod . Get , Ġpath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Header ( HttpHeaders . Authorization , Ġ" Signature Ġ$ signature ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresp . response . status () ĠshouldBe ĠHttpStatusCode . OK ĊĠĠĠ Ġ} Ċ } Ċ