github.com/kaleido-io/firefly@v0.0.0-20210622132723-8b4b6aacb971/kat/src/test/ethereum/assets/authored/private/structured.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 { testContent } from '../../../../samples'; 17 import nock from 'nock'; 18 import request from 'supertest'; 19 import assert from 'assert'; 20 import { IDBAssetDefinition, IDBAssetInstance, IEventAssetDefinitionCreated, IEventAssetInstanceCreated } from '../../../../../lib/interfaces'; 21 import * as utils from '../../../../../lib/utils'; 22 23 export const testAuthoredPrivateStructured = () => { 24 25 describe('Assets: authored - structured', async () => { 26 27 let assetDefinitionID: string; 28 const assetDefinitionName = 'authored - private - structured'; 29 const timestamp = utils.getTimestamp(); 30 31 describe('Create asset definition', () => { 32 33 it('Checks that the asset definition can be added', async () => { 34 35 nock('https://apigateway.kaleido.io') 36 .post('/createAssetDefinition?kld-from=0x0000000000000000000000000000000000000001&kld-sync=false') 37 .reply(200, { id: 'my-receipt-id' }); 38 39 nock('https://ipfs.kaleido.io') 40 .post('/api/v0/add') 41 .reply(200, { Hash: 'Qmf71q7zspRmzvH6yVhkrpWCnK54rvxyj6XSTJ5tgBiZfV' }); 42 43 const result = await request(app) 44 .post('/api/v1/assets/definitions') 45 .send({ 46 name: assetDefinitionName, 47 author: '0x0000000000000000000000000000000000000001', 48 isContentPrivate: true, 49 isContentUnique: true, 50 contentSchema: testContent.schema.object 51 }) 52 .expect(200); 53 assert.deepStrictEqual(result.body.status, 'submitted'); 54 assetDefinitionID = result.body.assetDefinitionID; 55 56 const getAssetDefinitionsResponse = await request(app) 57 .get('/api/v1/assets/definitions') 58 .expect(200); 59 const assetDefinition = getAssetDefinitionsResponse.body.find((assetDefinition: IDBAssetDefinition) => assetDefinition.name === 'authored - private - structured'); 60 assert.strictEqual(assetDefinition.assetDefinitionID, assetDefinitionID); 61 assert.strictEqual(assetDefinition.author, '0x0000000000000000000000000000000000000001'); 62 assert.strictEqual(assetDefinition.isContentPrivate, true); 63 assert.strictEqual(assetDefinition.isContentUnique, true); 64 assert.deepStrictEqual(assetDefinition.contentSchema, testContent.schema.object); 65 assert.strictEqual(assetDefinition.name, 'authored - private - structured'); 66 assert.strictEqual(assetDefinition.receipt, 'my-receipt-id'); 67 assert.strictEqual(typeof assetDefinition.submitted, 'number'); 68 }); 69 70 it('Checks that the event stream notification for confirming the asset definition creation is handled', async () => { 71 const eventPromise = new Promise<void>((resolve) => { 72 mockEventStreamWebSocket.once('send', message => { 73 assert.strictEqual(message, '{"type":"ack","topic":"dev"}'); 74 resolve(); 75 }) 76 }); 77 78 nock('https://ipfs.kaleido.io') 79 .get('/ipfs/Qmf71q7zspRmzvH6yVhkrpWCnK54rvxyj6XSTJ5tgBiZfV') 80 .reply(200, { 81 assetDefinitionID: assetDefinitionID, 82 name: assetDefinitionName, 83 isContentPrivate: true, 84 isContentUnique: true, 85 contentSchema: testContent.schema.object 86 }); 87 const data: IEventAssetDefinitionCreated = { 88 author: '0x0000000000000000000000000000000000000001', 89 assetDefinitionHash: '0xf9186d8e20d9e6786aa5e99e8c83be79ef719ddb1482ddcdf3dccf98bf24cd60', 90 timestamp: timestamp.toString() 91 }; 92 mockEventStreamWebSocket.emit('message', JSON.stringify([{ 93 signature: utils.contractEventSignatures.ASSET_DEFINITION_CREATED, 94 data, 95 blockNumber: '123', 96 transactionHash: '0x0000000000000000000000000000000000000000000000000000000000000000' 97 }])); 98 await eventPromise; 99 }); 100 101 it('Checks that the asset definition is confirmed', async () => { 102 const getAssetDefinitionsResponse = await request(app) 103 .get('/api/v1/assets/definitions') 104 .expect(200); 105 const assetDefinition = getAssetDefinitionsResponse.body.find((assetDefinition: IDBAssetDefinition) => assetDefinition.name === 'authored - private - structured'); 106 assert.strictEqual(assetDefinition.assetDefinitionID, assetDefinitionID); 107 assert.strictEqual(assetDefinition.author, '0x0000000000000000000000000000000000000001'); 108 assert.strictEqual(assetDefinition.isContentPrivate, true); 109 assert.strictEqual(assetDefinition.isContentUnique, true); 110 assert.deepStrictEqual(assetDefinition.contentSchema, testContent.schema.object); 111 assert.strictEqual(assetDefinition.name, 'authored - private - structured'); 112 assert.strictEqual(typeof assetDefinition.submitted, 'number'); 113 assert.strictEqual(assetDefinition.timestamp, timestamp); 114 assert.strictEqual(assetDefinition.receipt, 'my-receipt-id'); 115 assert.strictEqual(assetDefinition.blockNumber, 123); 116 assert.strictEqual(assetDefinition.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000000'); 117 118 const getAssetDefinitionResponse = await request(app) 119 .get(`/api/v1/assets/definitions/${assetDefinitionID}`) 120 .expect(200); 121 assert.deepStrictEqual(assetDefinition, getAssetDefinitionResponse.body); 122 }); 123 124 }); 125 126 describe('Asset instances', async () => { 127 128 let assetInstanceID: string; 129 130 it('Checks that an asset instance can be created', async () => { 131 132 nock('https://apigateway.kaleido.io') 133 .post('/createAssetInstance?kld-from=0x0000000000000000000000000000000000000001&kld-sync=false') 134 .reply(200, { id: 'my-receipt-id' }); 135 136 const result = await request(app) 137 .post(`/api/v1/assets/${assetDefinitionID}`) 138 .send({ 139 author: '0x0000000000000000000000000000000000000001', 140 content: testContent.sample.object 141 }) 142 .expect(200); 143 assert.deepStrictEqual(result.body.status, 'submitted'); 144 assetInstanceID = result.body.assetInstanceID; 145 146 const getAssetInstancesResponse = await request(app) 147 .get(`/api/v1/assets/${assetDefinitionID}`) 148 .expect(200); 149 const assetInstance = getAssetInstancesResponse.body.find((assetInstance: IDBAssetInstance) => assetInstance.assetInstanceID === assetInstanceID); 150 assert.strictEqual(assetInstance.author, '0x0000000000000000000000000000000000000001'); 151 assert.strictEqual(assetInstance.assetDefinitionID, assetDefinitionID); 152 assert.strictEqual(assetInstance.contentHash, testContent.sample.docExchangeSha256); 153 assert.deepStrictEqual(assetInstance.content, testContent.sample.object); 154 // assert.strictEqual(assetInstance.receipt, 'my-receipt-id'); 155 assert.strictEqual(typeof assetInstance.submitted, 'number'); 156 157 const getAssetInstanceResponse = await request(app) 158 .get(`/api/v1/assets/${assetDefinitionID}/${assetInstanceID}`) 159 .expect(200); 160 assert.deepStrictEqual(assetInstance, getAssetInstanceResponse.body); 161 162 }); 163 164 it('Checks that the event stream notification for confirming the asset instance creation is handled', async () => { 165 const eventPromise = new Promise<void>((resolve) => { 166 mockEventStreamWebSocket.once('send', message => { 167 assert.strictEqual(message, '{"type":"ack","topic":"dev"}'); 168 resolve(); 169 }) 170 }); 171 const data: IEventAssetInstanceCreated = { 172 assetDefinitionID: utils.uuidToHex(assetDefinitionID), 173 author: '0x0000000000000000000000000000000000000001', 174 assetInstanceID: utils.uuidToHex(assetInstanceID), 175 contentHash: testContent.sample.docExchangeSha256, 176 timestamp: timestamp.toString(), 177 isContentPrivate: true 178 }; 179 mockEventStreamWebSocket.emit('message', JSON.stringify([{ 180 signature: utils.contractEventSignatures.ASSET_INSTANCE_CREATED, 181 data, 182 blockNumber: '123', 183 transactionHash: '0x0000000000000000000000000000000000000000000000000000000000000000' 184 }])); 185 await eventPromise; 186 }); 187 188 it('Checks that the asset instance is confirmed', async () => { 189 const getAssetInstancesResponse = await request(app) 190 .get(`/api/v1/assets/${assetDefinitionID}`) 191 .expect(200); 192 const assetInstance = getAssetInstancesResponse.body.find((assetInstance: IDBAssetInstance) => assetInstance.assetInstanceID === assetInstanceID); 193 assert.strictEqual(assetInstance.author, '0x0000000000000000000000000000000000000001'); 194 assert.strictEqual(assetInstance.assetDefinitionID, assetDefinitionID); 195 assert.strictEqual(assetInstance.contentHash, testContent.sample.docExchangeSha256); 196 assert.deepStrictEqual(assetInstance.content, testContent.sample.object); 197 assert.strictEqual(assetInstance.timestamp, timestamp); 198 assert.strictEqual(typeof assetInstance.submitted, 'number'); 199 assert.strictEqual(assetInstance.blockNumber, 123); 200 assert.strictEqual(assetInstance.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000000'); 201 202 const getAssetInstanceResponse = await request(app) 203 .get(`/api/v1/assets/${assetDefinitionID}/${assetInstanceID}`) 204 .expect(200); 205 assert.deepStrictEqual(assetInstance, getAssetInstanceResponse.body); 206 }); 207 208 }); 209 210 }); 211 };