package Ġcom . template Ċ Ċ import Ġcom . template . flows . Issue Flow Ċ import Ġcom . template . states . E UC State Ċ import Ġnet . cord a . core . flows . Flow Exception Ċ import Ġnet . cord a . core . identity . C ord a X 5 0 0 Name Ċ import Ġnet . cord a . core . node . services . query By Ċ import Ġnet . cord a . core . utilities . get OrThrow Ċ import Ġnet . cord a . testing . core . single Identity Ċ import Ġnet . cord a . testing . node . Mock Network Ċ import Ġnet . cord a . testing . node . Mock Network Parameters Ċ import Ġnet . cord a . testing . node . Started Mock Node Ċ import Ġnet . cord a . testing . node . Test C ord app Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ Ċ class ĠFlow Tests Ġ{ ĊĠĠĠ Ġprivate Ġval Ġnetwork Ġ= ĠMock Network ( Mock Network Parameters ( cord apps ForAll Nodes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠTest C ord app . find C ord app (" com . template . contracts "), ĊĠĠĠĠĠĠĠ ĠTest C ord app . find C ord app (" com . template . flows ") ĊĠĠĠ Ġ))) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġimporter : ĠStarted Mock Node ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġexporter : ĠStarted Mock Node ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġend User : ĠStarted Mock Node ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmod : ĠStarted Mock Node ĊĠĠĠ Ġprivate Ġval Ġitem Desc Ġ= Ġ" AK - 4 7 " ĊĠĠĠ Ġprivate Ġval Ġitem Qty Ġ= Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġval Ġtotal Value Ġ= Ġ 1 0 0 0 0 0 . 0 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġe uc State : ĠE UC State ĊĠĠĠ Ġ// ĠData Ġfor Ġemb argo ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġemb Importer : ĠStarted Mock Node ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġemb End User : ĠStarted Mock Node ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġemb MOD : ĠStarted Mock Node ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġemb E UC State : ĠE UC State ĊĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġimporter Ġ= Ġnetwork . create Party Node ( C ord a X 5 0 0 Name (" Importer ", Ġ" Br us se ls ", Ġ" BE ")) ĊĠĠĠĠĠĠĠ Ġexporter Ġ= Ġnetwork . create Party Node ( C ord a X 5 0 0 Name (" Exporter ", Ġ" Stock hol m ", Ġ" SE ")) ĊĠĠĠĠĠĠĠ Ġend User Ġ= Ġnetwork . create Party Node ( C ord a X 5 0 0 Name (" End ĠUser ", Ġ" Br us se ls ", Ġ" BE ")) ĊĠĠĠĠĠĠĠ Ġmod Ġ= Ġnetwork . create Party Node ( C ord a X 5 0 0 Name (" MOD ", Ġ" Br us se ls ", Ġ" BE ")) ĊĠĠĠĠĠĠĠ Ġe uc State Ġ= ĠE UC State ( importer . info . single Identity (), Ġexporter . info . single Identity (), Ġend User . info . single Identity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġitem Desc , Ġitem Qty , Ġtotal Value ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠData Ġfor Ġemb argo ĊĠĠĠĠĠĠĠ Ġemb Importer Ġ= Ġnetwork . create Party Node ( C ord a X 5 0 0 Name (" emb ĠImport er ", Ġ" M og ad ish u ", Ġ" SO ")) ĊĠĠĠĠĠĠĠ Ġemb End User Ġ= Ġnetwork . create Party Node ( C ord a X 5 0 0 Name (" emb ĠEnd ĠUser ", Ġ" M og ad ish u ", Ġ" SO ")) ĊĠĠĠĠĠĠĠ Ġemb MOD Ġ= Ġnetwork . create Party Node ( C ord a X 5 0 0 Name (" MOD ", Ġ" M og ad ish u ", Ġ" SO ")) ĊĠĠĠĠĠĠĠ Ġemb E UC State Ġ= ĠE UC State ( emb Importer . info . single Identity (), Ġexporter . info . single Identity (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemb End User . info . single Identity (), Ġitem Desc , Ġitem Qty , Ġtotal Value ) ĊĊĠĠĠĠĠĠĠ ĠlistOf ( exporter , Ġend User , Ġmod , Ġemb Importer , Ġemb End User ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . register Initi ated Flow ( Issue Flow . Responder :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ= Ġnetwork . stop Nodes () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ISSUE Ġflow Ġcan Ġonly Ġbe Ġinitiated Ġby Ġthe Ġimporter `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠIssue Flow . Init iator ( e uc State ) ĊĠĠĠĠĠĠĠ Ġ// ĠHere , Ġthe Ġexporter Ġis Ġiniti ating Ġthe Ġflow ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġexporter . start Flow ( flow ) ĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġflow Ġshould Ġthrow Ġthe Ġfollowing Ġexception : Ġnet . cord a . core . flows . Flow Exception ĊĠĠĠĠĠĠĠ Ġ// ĠFailed Ġrequirement : ĠOnly Ġthe Ġimporter Ġcan Ġinitiate Ġthe Ġflow . ĊĠĠĠĠĠĠĠ Ġassert Fails With < Flow Exception > Ġ{ Ġfuture . get OrThrow () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ISSUE Ġtransaction Ġis Ġsigned Ġby Ġthe Ġimporter , Ġexporter , Ġend Ġuser , Ġand ĠMOD `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠIssue Flow . Init iator ( e uc State ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġimporter . start Flow ( flow ) ĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĠĠĠĠĠĠĠ Ġval Ġsigned Tx Ġ= Ġfuture . get OrThrow () ĊĠĠĠĠĠĠĠ Ġsigned Tx . verify Required Signatures () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ISSUE Ġflow Ġrecords Ġa Ġtransaction Ġin Ġall Ġsign ers ' Ġtransaction Ġstorage `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠIssue Flow . Init iator ( e uc State ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġimporter . start Flow ( flow ) ĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĠĠĠĠĠĠĠ Ġval Ġsigned Tx Ġ= Ġfuture . get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin ĠlistOf ( importer , Ġexporter , Ġend User , Ġmod )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( signed Tx , Ġnode . services . validated Transactions . getTransaction ( signed Tx . id )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ISSUE Ġflow Ġrecorded Ġtransaction Ġhas Ġno Ġinputs Ġand Ġone ĠE UC Ġoutput `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠIssue Flow . Init iator ( e uc State ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġimporter . start Flow ( flow ) ĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĠĠĠĠĠĠĠ Ġval Ġsigned Tx Ġ= Ġfuture . get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcheck Ġthe Ġrecorded Ġtransaction Ġin Ġall Ġsign ers ' Ġtransaction Ġstorage ĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin ĠlistOf ( importer , Ġexporter , Ġend User , Ġmod )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecorded Tx Ġ= Ġnode . services . validated Transactions . getTransaction ( signed Tx . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( re corded Tx !!. tx . inputs . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe uc Outputs Ġ= Ġrecorded Tx . tx . outputs . filter Ġ{ Ġit . data Ġis ĠE UC State Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e uc Outputs . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( e uc Outputs . single (). data Ġ== Ġe uc State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ISSUE Ġflow Ġrecords Ġthe Ġcorrect ĠE UC Ġstate Ġin Ġparticipants ' Ġvault s `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠIssue Flow . Init iator ( e uc State ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġimporter . start Flow ( flow ) ĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĠĠĠĠĠĠĠ Ġfuture . get OrThrow () ĊĊĠĠĠĠĠĠĠ Ġimporter . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy E UC States Ġ= Ġimporter . services . vault Service . query By < E UC State >(). states ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( my E UC States . size , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecorded State Ġ= Ġmy E UC States . single (). state . data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . importer , Ġimporter . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . exporter , Ġexporter . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . end User , Ġend User . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . item Desc , Ġitem Desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . item Qty , Ġitem Qty ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . total Value , Ġtotal Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġexporter . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy E UC States Ġ= Ġexporter . services . vault Service . query By < E UC State >(). states ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( my E UC States . size , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecorded State Ġ= Ġmy E UC States . single (). state . data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . importer , Ġimporter . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . exporter , Ġexporter . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . end User , Ġend User . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . item Desc , Ġitem Desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . item Qty , Ġitem Qty ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . total Value , Ġtotal Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġend User . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy E UC States Ġ= Ġend User . services . vault Service . query By < E UC State >(). states ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( my E UC States . size , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecorded State Ġ= Ġmy E UC States . single (). state . data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . importer , Ġimporter . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . exporter , Ġexporter . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . end User , Ġend User . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . item Desc , Ġitem Desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . item Qty , Ġitem Qty ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . total Value , Ġtotal Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġin Ġour Ġimplementation Ġ" Min ist ry Ġof ĠDef ence " Ġwasn 't Ġpart Ġof Ġthe Ġparticipants Ġlist ĊĠĠĠĠĠĠĠ Ġ// Ġ( i . e . Ġit Ġwasn 't Ġpart Ġof Ġthe Ġnodes Ġthat Ġthe Ġfinal ization Ġflow Ġtakes Ġin Ġconsideration Ġwhen Ġsaving ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġstate Ġin Ġtheir Ġvault s ); Ġso Ġthis Ġmeans Ġ" Min ist ry Ġof ĠDef ence " Ġwas Ġonly Ġan Ġobserver Ġthat Ġwas Ġrequired ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġsign Ġthe Ġ" Issue " Ġcommand Ġas Ġa Ġsign Ġof Ġvalidation Ġand Ġapproval . ĊĠĠĠĠĠĠĠ Ġ// ĠSo Ġif Ġwe Ġuncomment Ġthe Ġbelow Ġsection ; Ġthe Ġtest Ġwill Ġfail , Ġbecause ĠMOD 's Ġvault Ġdoesn 't Ġhave Ġthis Ġstate . ĊĊĠĠĠĠĠĠĠ Ġ/* mod . transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy E UC States Ġ= Ġmod . services . vault Service . query By < E UC State >(). states ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( my E UC States . size , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecorded State Ġ= Ġmy E UC States . single (). state . data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . importer , Ġimporter . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . exporter , Ġexporter . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . end User , Ġend User . info . single Identity ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . item Desc , Ġitem Desc ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . item Qty , Ġitem Qty ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( re corded State . total Value , Ġtotal Value ) ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` ISSUE Ġflow Ġcannot Ġbe Ġapproved Ġfor Ġemb argo ed Ġimport ers Ġor Ġend Ġusers `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflow Ġ= ĠIssue Flow . Init iator ( emb E UC State ) ĊĠĠĠĠĠĠĠ Ġval Ġfuture Ġ= Ġemb Importer . start Flow ( flow ) ĊĠĠĠĠĠĠĠ Ġnetwork . run Network () ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġflow Ġshould Ġthrow Ġthe Ġfollowing Ġexception : Ġnet . cord a . core . flows . Flow Exception ĊĠĠĠĠĠĠĠ Ġ// ĠFailed Ġrequirement : ĠThe Ġimporter Ġand Ġend Ġuser Ġcannot Ġbe Ġon Ġthe Ġemb argo ed Ġcountries Ġlist . ĊĠĠĠĠĠĠĠ Ġassert Fails With < Flow Exception > Ġ{ Ġfuture . get OrThrow () Ġ} ĊĠĠĠ Ġ} Ċ Ċ }