1414
1515'use strict' ;
1616
17- const Client = require ( 'composer-client' ) ;
18- const Admin = require ( 'composer-admin' ) ;
19- const Common = require ( 'composer-common' ) ;
20- const BusinessNetworkConnection = Client . BusinessNetworkConnection ;
21- const BusinessNetworkDefinition = Admin . BusinessNetworkDefinition ;
22- const Serializer = Common . Serializer ;
23- const Resource = Common . Resource ;
24-
25- const Submit = require ( '../../lib/cmds/transaction/submitCommand.js' ) ;
17+ const { BusinessNetworkConnection } = require ( 'composer-client' ) ;
18+ const { BusinessNetworkDefinition } = require ( 'composer-common' ) ;
2619const CmdUtil = require ( '../../lib/cmds/utils/cmdutils.js' ) ;
20+ const Pretty = require ( 'prettyjson' ) ;
21+ const Submit = require ( '../../lib/cmds/transaction/submitCommand.js' ) ;
2722
2823const chai = require ( 'chai' ) ;
29- const sinon = require ( 'sinon' ) ;
30-
3124chai . should ( ) ;
3225chai . use ( require ( 'chai-things' ) ) ;
3326chai . use ( require ( 'chai-as-promised' ) ) ;
27+ const sinon = require ( 'sinon' ) ;
3428
35- const NAMESPACE = 'net.biz.TestNetwork' ;
3629const ENROLL_SECRET = 'SuccessKidWin' ;
3730
38-
39-
4031describe ( 'composer transaction submit CLI unit tests' , ( ) => {
4132 let sandbox ;
4233 let mockBusinessNetworkConnection ;
43- let mockBusinessNetwork ;
44- let mockSerializer ;
45- let mockResource ;
34+ let businessNetworkDefinition ;
35+ let modelManager ;
36+ let factory ;
37+ let spyPretty ;
4638
4739 beforeEach ( ( ) => {
4840 sandbox = sinon . sandbox . create ( ) ;
41+
42+ businessNetworkDefinition = new BusinessNetworkDefinition ( '[email protected] ' ) ; 43+ modelManager = businessNetworkDefinition . getModelManager ( ) ;
44+ modelManager . addModelFile ( `
45+ namespace org.acme
46+ concept MyConcept {
47+ o String value
48+ }
49+ transaction MyTransaction {
50+ o Boolean success
51+ }` ) ;
52+ factory = businessNetworkDefinition . getFactory ( ) ;
53+
4954 mockBusinessNetworkConnection = sinon . createStubInstance ( BusinessNetworkConnection ) ;
50- mockBusinessNetwork = sinon . createStubInstance ( BusinessNetworkDefinition ) ;
51- mockSerializer = sinon . createStubInstance ( Serializer ) ;
52- mockResource = sinon . createStubInstance ( Resource ) ;
53- mockBusinessNetworkConnection . getBusinessNetwork . returns ( mockBusinessNetwork ) ;
55+ mockBusinessNetworkConnection . getBusinessNetwork . returns ( businessNetworkDefinition ) ;
5456 mockBusinessNetworkConnection . connect . resolves ( ) ;
55- mockBusinessNetwork . getSerializer . returns ( mockSerializer ) ;
56- mockSerializer . fromJSON . returns ( mockResource ) ;
57- mockResource . getIdentifier . returns ( 'SuccessKid' ) ;
5857
5958 sandbox . stub ( CmdUtil , 'createBusinessNetworkConnection' ) . returns ( mockBusinessNetworkConnection ) ;
6059 sandbox . stub ( process , 'exit' ) ;
60+ spyPretty = sandbox . spy ( Pretty , 'render' ) ;
6161 } ) ;
6262
6363 afterEach ( ( ) => {
@@ -66,71 +66,124 @@ describe('composer transaction submit CLI unit tests', () => {
6666
6767 describe ( '#hander' , ( ) => {
6868
69- it ( 'should not error when all requred params (card based) are specified' , ( ) => {
69+ it ( 'should not error when all requred params (card based) are specified' , async ( ) => {
70+ sandbox . stub ( CmdUtil , 'prompt' ) . resolves ( ENROLL_SECRET ) ;
71+
72+ let argv = {
73+ card : 'cardname' ,
74+ data : '{"$class": "org.acme.MyTransaction", "success": true}'
75+ } ;
76+
77+ await Submit . handler ( argv ) ;
78+ sinon . assert . calledWith ( mockBusinessNetworkConnection . connect , 'cardname' ) ;
79+ } ) ;
80+
81+ it ( 'should not error when the transaction returns a primitive value' , async ( ) => {
82+ mockBusinessNetworkConnection . submitTransaction . resolves ( 'foobar' ) ;
83+ sandbox . stub ( CmdUtil , 'prompt' ) . resolves ( ENROLL_SECRET ) ;
84+
85+ let argv = {
86+ card : 'cardname' ,
87+ data : '{"$class": "org.acme.MyTransaction", "success": true}'
88+ } ;
89+
90+ await Submit . handler ( argv ) ;
91+ sinon . assert . calledWith ( mockBusinessNetworkConnection . connect , 'cardname' ) ;
92+ sinon . assert . calledOnce ( spyPretty ) ;
93+ sinon . assert . calledWith ( spyPretty , 'foobar' ) ;
94+ } ) ;
95+
96+ it ( 'should not error when the transaction returns an array of primitive values' , async ( ) => {
97+ mockBusinessNetworkConnection . submitTransaction . resolves ( [ 'foobar' , 'doge' , 'cat' ] ) ;
7098 sandbox . stub ( CmdUtil , 'prompt' ) . resolves ( ENROLL_SECRET ) ;
7199
72100 let argv = {
73101 card : 'cardname' ,
74- data : '{"$class": "' + NAMESPACE + ' ", "success": true}'
102+ data : '{"$class": "org.acme.MyTransaction ", "success": true}'
75103 } ;
76104
77- return Submit . handler ( argv )
78- . then ( ( res ) => {
79- sinon . assert . calledWith ( mockBusinessNetworkConnection . connect , 'cardname' ) ;
105+ await Submit . handler ( argv ) ;
106+ sinon . assert . calledWith ( mockBusinessNetworkConnection . connect , 'cardname' ) ;
107+ sinon . assert . calledOnce ( spyPretty ) ;
108+ sinon . assert . calledWith ( spyPretty , [ 'foobar' , 'doge' , 'cat' ] ) ;
109+ } ) ;
110+
111+ it ( 'should not error when the transaction returns a concept value' , async ( ) => {
112+ const concept = factory . newConcept ( 'org.acme' , 'MyConcept' ) ;
113+ concept . value = 'foobar' ;
114+ mockBusinessNetworkConnection . submitTransaction . resolves ( concept ) ;
115+ sandbox . stub ( CmdUtil , 'prompt' ) . resolves ( ENROLL_SECRET ) ;
116+
117+ let argv = {
118+ card : 'cardname' ,
119+ data : '{"$class": "org.acme.MyTransaction", "success": true}'
120+ } ;
80121
81- } ) ;
122+ await Submit . handler ( argv ) ;
123+ sinon . assert . calledWith ( mockBusinessNetworkConnection . connect , 'cardname' ) ;
124+ sinon . assert . calledOnce ( spyPretty ) ;
125+ sinon . assert . calledWith ( spyPretty , { $class : 'org.acme.MyConcept' , value : 'foobar' } ) ;
82126 } ) ;
83127
84- it ( 'should error when can not parse the json (card based)' , ( ) => {
85- sandbox . stub ( JSON , 'parse' ) . throws ( new Error ( 'failure' ) ) ;
128+ it ( 'should not error when the transaction returns an array of concept values' , async ( ) => {
129+ const concept1 = factory . newConcept ( 'org.acme' , 'MyConcept' ) ;
130+ concept1 . value = 'foobar' ;
131+ const concept2 = factory . newConcept ( 'org.acme' , 'MyConcept' ) ;
132+ concept2 . value = 'doge' ;
133+ const concept3 = factory . newConcept ( 'org.acme' , 'MyConcept' ) ;
134+ concept3 . value = 'cat' ;
135+ mockBusinessNetworkConnection . submitTransaction . resolves ( [ concept1 , concept2 , concept3 ] ) ;
136+ sandbox . stub ( CmdUtil , 'prompt' ) . resolves ( ENROLL_SECRET ) ;
137+
138+ let argv = {
139+ card : 'cardname' ,
140+ data : '{"$class": "org.acme.MyTransaction", "success": true}'
141+ } ;
142+
143+ await Submit . handler ( argv ) ;
144+ sinon . assert . calledWith ( mockBusinessNetworkConnection . connect , 'cardname' ) ;
145+ sinon . assert . calledOnce ( spyPretty ) ;
146+ sinon . assert . calledWith ( spyPretty , [ { $class : 'org.acme.MyConcept' , value : 'foobar' } , { $class : 'org.acme.MyConcept' , value : 'doge' } , { $class : 'org.acme.MyConcept' , value : 'cat' } ] ) ;
147+ } ) ;
86148
149+ it ( 'should error when can not parse the json (card based)' , async ( ) => {
87150 let argv = {
88151 card : 'cardname' ,
89- data : '{"$class": "' + NAMESPACE + ' ", "success": true} '
152+ data : '{"$class": "org.acme.MyTransaction ", "success": true'
90153 } ;
91154
92- return Submit . handler ( argv ) . should . be . rejectedWith ( / J S O N e r r o r / ) ;
155+ await Submit . handler ( argv ) . should . be . rejectedWith ( / J S O N e r r o r / ) ;
93156 } ) ;
94157
95- it ( 'should error when the transaction fails to submit' , ( ) => {
158+ it ( 'should error when the transaction fails to submit' , async ( ) => {
96159 let argv = {
97160 card : 'cardname' ,
98- data : '{"$class": "' + NAMESPACE + ' ", "success": true}'
161+ data : '{"$class": "org.acme.MyTransaction ", "success": true}'
99162 } ;
100163
101164 mockBusinessNetworkConnection . submitTransaction . rejects ( new Error ( 'some error' ) ) ;
102- return Submit . handler ( argv )
103- . then ( ( res ) => {
104- // sinon.assert.calledWith(process.exit, 1);
105- } ) . catch ( ( error ) => {
106- error . toString ( ) . should . equal ( 'Error: some error' ) ;
107- } ) ;
165+ await Submit . handler ( argv )
166+ . should . be . rejectedWith ( / s o m e e r r o r / ) ;
108167 } ) ;
109168
110- it ( 'should error if data is not a string' , ( ) => {
169+ it ( 'should error if data is not a string' , async ( ) => {
111170 let argv = {
112171 card : 'cardname' ,
113172 data : { }
114173 } ;
115174
116- return Submit . handler ( argv )
117- . then ( ( res ) => {
118- } ) . catch ( ( error ) => {
119- error . toString ( ) . should . equal ( 'Error: Data must be a string' ) ;
120- } ) ;
175+ await Submit . handler ( argv )
176+ . should . be . rejectedWith ( / D a t a m u s t b e a s t r i n g / ) ;
121177 } ) ;
122178
123- it ( 'should error if data class is not supplied' , ( ) => {
179+ it ( 'should error if data class is not supplied' , async ( ) => {
124180 let argv = {
125181 card : 'cardname' ,
126182 data : '{"success": true}'
127183 } ;
128184
129- return Submit . handler ( argv )
130- . then ( ( res ) => {
131- } ) . catch ( ( error ) => {
132- error . toString ( ) . should . equal ( 'Error: $class attribute not supplied' ) ;
133- } ) ;
185+ await Submit . handler ( argv )
186+ . should . be . rejectedWith ( / \$ c l a s s a t t r i b u t e n o t s u p p l i e d / ) ;
134187 } ) ;
135188 } ) ;
136189} ) ;
0 commit comments