github.com/kaleido-io/firefly@v0.0.0-20210622132723-8b4b6aacb971/kat/src/test/ethereum/payments/authored-described.ts (about) 1 // Copyright © 2021 Kaleido, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 import { app, mockEventStreamWebSocket } from '../../common'; 16 import { testDescription } from '../../samples'; 17 import nock from 'nock'; 18 import request from 'supertest'; 19 import assert from 'assert'; 20 import { IDBPaymentDefinition, IDBPaymentInstance, IEventPaymentDefinitionCreated, IEventPaymentInstanceCreated } from '../../../lib/interfaces'; 21 import * as utils from '../../../lib/utils'; 22 23 export const testAuthoredDescribed = async () => { 24 25 describe('Payment definitions: authored - described', async () => { 26 27 let paymentDefinitionID: string; 28 const timestamp = utils.getTimestamp(); 29 30 describe('Create described payment definition', () => { 31 32 it('Checks that the payment definition can be added', async () => { 33 34 nock('https://apigateway.kaleido.io') 35 .post('/createDescribedPaymentDefinition?kld-from=0x0000000000000000000000000000000000000001&kld-sync=false') 36 .reply(200, { id: 'my-receipt-id' }); 37 38 nock('https://ipfs.kaleido.io') 39 .post('/api/v0/add') 40 .reply(200, { Hash: testDescription.schema.ipfsMultiHash }); 41 42 const result = await request(app) 43 .post('/api/v1/payments/definitions') 44 .send({ 45 name: 'authored - described', 46 author: '0x0000000000000000000000000000000000000001', 47 descriptionSchema: testDescription.schema.object 48 }) 49 .expect(200); 50 assert.deepStrictEqual(result.body.status, 'submitted'); 51 paymentDefinitionID = result.body.paymentDefinitionID; 52 53 const getPaymentDefinitionsResponse = await request(app) 54 .get('/api/v1/payments/definitions') 55 .expect(200); 56 const paymentDefinition = getPaymentDefinitionsResponse.body.find((paymentDefinition: IDBPaymentDefinition) => paymentDefinition.name === 'authored - described'); 57 assert.strictEqual(paymentDefinition.paymentDefinitionID, paymentDefinitionID); 58 assert.strictEqual(paymentDefinition.author, '0x0000000000000000000000000000000000000001'); 59 assert.deepStrictEqual(paymentDefinition.descriptionSchema, testDescription.schema.object); 60 assert.strictEqual(paymentDefinition.name, 'authored - described'); 61 assert.strictEqual(paymentDefinition.receipt, 'my-receipt-id'); 62 assert.strictEqual(typeof paymentDefinition.submitted, 'number'); 63 64 const getPaymentDefinitionResponse = await request(app) 65 .get(`/api/v1/payments/definitions/${paymentDefinitionID}`) 66 .expect(200); 67 assert.deepStrictEqual(paymentDefinition, getPaymentDefinitionResponse.body); 68 }); 69 70 it('Checks that the event stream notification for confirming the payment definition creation is handled', async () => { 71 nock('https://ipfs.kaleido.io') 72 .get(`/ipfs/${testDescription.schema.ipfsMultiHash}`) 73 .reply(200, testDescription.schema.object); 74 75 const eventPromise = new Promise<void>((resolve) => { 76 mockEventStreamWebSocket.once('send', message => { 77 assert.strictEqual(message, '{"type":"ack","topic":"dev"}'); 78 resolve(); 79 }) 80 }); 81 const data: IEventPaymentDefinitionCreated = { 82 paymentDefinitionID: utils.uuidToHex(paymentDefinitionID), 83 author: '0x0000000000000000000000000000000000000001', 84 name: 'authored - described', 85 descriptionSchemaHash: testDescription.schema.ipfsSha256, 86 timestamp: timestamp.toString() 87 }; 88 mockEventStreamWebSocket.emit('message', JSON.stringify([{ 89 signature: utils.contractEventSignatures.DESCRIBED_PAYMENT_DEFINITION_CREATED, 90 data, 91 blockNumber: '123', 92 transactionHash: '0x0000000000000000000000000000000000000000000000000000000000000000' 93 }])); 94 await eventPromise; 95 }); 96 97 it('Checks that the payment definition is confirmed', async () => { 98 const getPaymentDefinitionsResponse = await request(app) 99 .get('/api/v1/payments/definitions') 100 .expect(200); 101 const paymentDefinition = getPaymentDefinitionsResponse.body.find((paymentDefinition: IDBPaymentDefinition) => paymentDefinition.name === 'authored - described'); 102 assert.strictEqual(paymentDefinition.paymentDefinitionID, paymentDefinitionID); 103 assert.strictEqual(paymentDefinition.author, '0x0000000000000000000000000000000000000001'); 104 assert.deepStrictEqual(paymentDefinition.descriptionSchema, testDescription.schema.object); 105 assert.strictEqual(paymentDefinition.name, 'authored - described'); 106 assert.strictEqual(paymentDefinition.timestamp, timestamp); 107 assert.strictEqual(paymentDefinition.receipt, 'my-receipt-id'); 108 assert.strictEqual(typeof paymentDefinition.submitted, 'number'); 109 assert.strictEqual(paymentDefinition.blockNumber, 123); 110 assert.strictEqual(paymentDefinition.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000000'); 111 112 const getPaymentDefinitionResponse = await request(app) 113 .get(`/api/v1/payments/definitions/${paymentDefinitionID}`) 114 .expect(200); 115 assert.deepStrictEqual(paymentDefinition, getPaymentDefinitionResponse.body); 116 }); 117 118 }); 119 120 describe('Payment instances', async () => { 121 122 let paymentInstanceID: string; 123 124 it('Checks that a payment instance can be created', async () => { 125 126 nock('https://apigateway.kaleido.io') 127 .post('/createDescribedPaymentInstance?kld-from=0x0000000000000000000000000000000000000001&kld-sync=false') 128 .reply(200, { id: 'my-receipt-id' }); 129 130 nock('https://ipfs.kaleido.io') 131 .post('/api/v0/add') 132 .reply(200, { Hash: testDescription.sample.ipfsMultiHash }) 133 134 const result = await request(app) 135 .post('/api/v1/payments/instances') 136 .send({ 137 paymentDefinitionID, 138 author: '0x0000000000000000000000000000000000000001', 139 description: testDescription.sample.object, 140 member: '0x0000000000000000000000000000000000000002', 141 amount: 10 142 }) 143 .expect(200); 144 assert.deepStrictEqual(result.body.status, 'submitted'); 145 paymentInstanceID = result.body.paymentInstanceID; 146 147 const getPaymentInstancesResponse = await request(app) 148 .get('/api/v1/payments/instances') 149 .expect(200); 150 const paymentInstance = getPaymentInstancesResponse.body.find((paymentInstance: IDBPaymentInstance) => paymentInstance.paymentInstanceID === paymentInstanceID); 151 assert.strictEqual(paymentInstance.author, '0x0000000000000000000000000000000000000001'); 152 assert.strictEqual(paymentInstance.paymentDefinitionID, paymentDefinitionID); 153 assert.strictEqual(paymentInstance.descriptionHash, testDescription.sample.ipfsSha256); 154 assert.deepStrictEqual(paymentInstance.description, testDescription.sample.object); 155 assert.strictEqual(paymentInstance.member, '0x0000000000000000000000000000000000000002'); 156 assert.strictEqual(paymentInstance.amount, 10); 157 assert.strictEqual(paymentInstance.receipt, 'my-receipt-id'); 158 assert.strictEqual(typeof paymentInstance.submitted, 'number'); 159 160 const getPaymentInstanceResponse = await request(app) 161 .get(`/api/v1/payments/instances/${paymentInstanceID}`) 162 .expect(200); 163 assert.deepStrictEqual(paymentInstance, getPaymentInstanceResponse.body); 164 165 }); 166 167 it('Checks that the event stream notification for confirming the payment instance creation is handled', async () => { 168 const eventPromise = new Promise<void>((resolve) => { 169 mockEventStreamWebSocket.once('send', message => { 170 assert.strictEqual(message, '{"type":"ack","topic":"dev"}'); 171 resolve(); 172 }) 173 }); 174 const data: IEventPaymentInstanceCreated = { 175 paymentDefinitionID: utils.uuidToHex(paymentDefinitionID), 176 author: '0x0000000000000000000000000000000000000001', 177 paymentInstanceID: utils.uuidToHex(paymentInstanceID), 178 descriptionHash: testDescription.sample.ipfsSha256, 179 amount: '10', 180 member: '0x0000000000000000000000000000000000000002', 181 timestamp: timestamp.toString() 182 }; 183 mockEventStreamWebSocket.emit('message', JSON.stringify([{ 184 signature: utils.contractEventSignatures.DESCRIBED_PAYMENT_INSTANCE_CREATED, 185 data, 186 blockNumber: '123', 187 transactionHash: '0x0000000000000000000000000000000000000000000000000000000000000000' 188 }])); 189 await eventPromise; 190 }); 191 192 it('Checks that the payment instance is confirmed', async () => { 193 const getAssetInstancesResponse = await request(app) 194 .get('/api/v1/payments/instances') 195 .expect(200); 196 const paymentInstance = getAssetInstancesResponse.body.find((paymentInstance: IDBPaymentInstance) => paymentInstance.paymentInstanceID === paymentInstanceID); 197 assert.strictEqual(paymentInstance.author, '0x0000000000000000000000000000000000000001'); 198 assert.strictEqual(paymentInstance.member, '0x0000000000000000000000000000000000000002'); 199 assert.strictEqual(paymentInstance.paymentDefinitionID, paymentDefinitionID); 200 assert.strictEqual(paymentInstance.descriptionHash, testDescription.sample.ipfsSha256); 201 assert.deepStrictEqual(paymentInstance.description, testDescription.sample.object); 202 assert.strictEqual(paymentInstance.amount, 10); 203 assert.strictEqual(paymentInstance.timestamp, timestamp); 204 assert.strictEqual(paymentInstance.receipt, 'my-receipt-id'); 205 assert.strictEqual(typeof paymentInstance.submitted, 'number'); 206 assert.strictEqual(paymentInstance.blockNumber, 123); 207 assert.strictEqual(paymentInstance.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000000'); 208 209 const getAssetInstanceResponse = await request(app) 210 .get(`/api/v1/payments/instances/${paymentInstanceID}`) 211 .expect(200); 212 assert.deepStrictEqual(paymentInstance, getAssetInstanceResponse.body); 213 }); 214 215 }); 216 217 }); 218 };