package Ġkey monitor . signup Ċ Ċ import Ġcom . fasterxml . jackson . core . Json Factory Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġkey monitor . common . PhoneNumber Ċ import Ġorg . apache . commons . validator . rout ines . Email Validator Ċ 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 . jetbrains . spe k . api . dsl . on Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . FileReader Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ import Ġkotlin . test . assertNotNull Ċ Ċ fun Ġassert Parsing Fails ( parsing : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġassert Fails With ( Json Parsing Exception :: class , Ġparsing ) Ċ } Ċ Ċ fun Ġparse Json File ( file : ĠFile ): ĠCollection < Registration Message > Ġ{ ĊĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( FileReader ( file )) ĊĠĠĠ Ġreturn Ġparse Json ( reader ) Ċ } Ċ Ċ class ĠJson Parsing Test Ġ: ĠSpe k ({ ĊĠĠĠ Ġdescribe (" signal - cli ĠJSON Ġoutput Ġparsing ") Ġ{ ĊĠĠĠĠĠĠĠ Ġon (" parsing Ġan Ġentire Ġfile ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest FilePath Ġ= ĠJson Parsing Test :: class . java . getResource (" good _ log . txt "). to URI () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠRuntimeException (" can 't Ġfind Ġtest Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgood File Ġ= ĠFile ( test FilePath ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= Ġparse Json File ( good File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" is Ġable Ġto Ġparse Ġit Ġinto Ġmessages ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( messages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" gets Ġthe Ġright Ġnumber Ġof Ġmessages ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġmessages . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" extract s Ġthe Ġphone Ġnumber Ġfrom Ġa Ġmessage ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Message : ĠRegistration Message Ġ= Ġmessages . take ( 1 )[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( PhoneNumber ("+ 1 4 1 5 5 5 5 0 1 2 3 "), Ġa Message . phoneNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" extract s Ġthe Ġemail Ġfrom Ġa Ġmessage ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Message : ĠRegistration Message Ġ= Ġmessages . take ( 1 )[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" test @ example . com ", Ġa Message . email ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" parsing Ġa Ġsingle Ġline ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Parser Ġ= ĠObjectMapper ( Json Factory ()) ĊĠĠĠĠĠĠĠ Ġval Ġemail Validator Ġ= ĠEmail Validator . getInstance () ĊĊĠĠĠĠĠĠĠ Ġit (" reject s Ġinit Ġdebug Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Parsing Fails Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Line ( json Parser , Ġemail Validator , Ġ"{\" init \": true }, ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" reject s Ġdone Ġdebug Ġstatements ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Parsing Fails Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Line ( json Parser , Ġemail Validator , Ġ"{\" done \": true }] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" reject s Ġthe Ġold Ġstyle Ġof ĠJSON Ġoutput ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Parsing Fails Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ""" {" envelope ":{" legacy Message ": true ," from ":{" number ":" + 1 4 1 5 5 5 5 0 1 2 3 "," device ": 1 }," type ":{" number ": 3 ," name ":" pre key "}," timestamp ":" 2 0 1 7 - 0 6 - 1 2 T 2 3 : 2 8 : 4 2 . 6 3 0 Z "}," data ":{" body ":" Ġtest @ example . com Ġ Ġ\ n \ n \ n \ n "," timestamp ": 1 4 9 7 3 1 0 1 2 2 6 3 0 }}, """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Line ( json Parser , Ġemail Validator , Ġline ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" correct ly Ġparses Ġa Ġmessage ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ""" {" envelope ":{" source ":" + 1 4 1 5 5 5 5 0 1 2 3 "," source Device ": 1 ," relay ": null ," timestamp ": 1 4 9 8 4 9 5 9 7 1 9 2 8 ," is Receipt ": false ," data Message ":{" timestamp ": 1 4 9 8 4 9 5 9 7 1 9 2 8 ," message ":" Ġtest @ example . com Ġ Ġ\ n \ n "," expires InSeconds ": 0 ," attachments ":[ ]," group Info ": null }," sync Message ": null ," call Message ": null }} """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġparse Line ( json Parser , Ġemail Validator , Ġline ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( PhoneNumber ("+ 1 4 1 5 5 5 5 0 1 2 3 "), Ġresult . phoneNumber ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" test @ example . com ", Ġresult . email ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" fails Ġif Ġthe Ġline Ġisn 't ĠJSON ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Parsing Fails Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Line ( json Parser , Ġemail Validator , Ġ" blah Ġbl ah Ġbl ah ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" fails Ġif Ġthe ĠJSON Ġis Ġmissing Ġfields ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Parsing Fails Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ""" {" envelope ": Ġ{" data Message ":{" message ":" Ġtest @ example . com Ġ Ġ\ n \ n \ n \ n "," timestamp ": 1 4 9 7 3 1 0 1 2 2 6 3 0 }} """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Line ( json Parser , Ġemail Validator , Ġline ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Parsing Fails Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ""" {" envelope ":{" source ":" + 1 4 1 5 5 5 5 0 1 2 3 "," source Device ": 1 ," relay ": null ," timestamp ": 1 4 9 8 4 9 5 9 7 1 9 2 8 ," is Receipt ": false } """ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Line ( json Parser , Ġemail Validator , Ġline ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ