github.com/kaleido-io/firefly@v0.0.0-20210622132723-8b4b6aacb971/kat/src/test/ethereum/assets/unauthored/private/described-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 assert from 'assert'; 16 import { createHash, randomBytes } from 'crypto'; 17 import nock from 'nock'; 18 import request from 'supertest'; 19 import { v4 as uuidV4 } from 'uuid'; 20 import { IDBAssetDefinition, IDBAssetInstance, IDBBatch, IEventAssetDefinitionCreated, IEventAssetInstanceBatchCreated, BatchRecordType } from '../../../../../lib/interfaces'; 21 import * as utils from '../../../../../lib/utils'; 22 import { app, mockEventStreamWebSocket } from '../../../../common'; 23 import { testContent, testDescription } from '../../../../samples'; 24 25 export const testUnauthoredPrivateDescribedStructured = () => { 26 27 describe('Assets: unauthored - private - described - structured', async () => { 28 29 const assetDefinitionID = '9ac02d4e-e0a3-4e9e-9d97-be0a41595425'; 30 const timestamp = utils.getTimestamp(); 31 32 let batchMaxRecordsToRestore: number; 33 beforeEach(() => { 34 nock.cleanAll(); 35 // Force batches to close immediately 36 batchMaxRecordsToRestore = utils.constants.BATCH_MAX_RECORDS; 37 utils.constants.BATCH_MAX_RECORDS = 1; 38 }); 39 40 afterEach(() => { 41 assert.deepStrictEqual(nock.pendingMocks(), []); 42 utils.constants.BATCH_MAX_RECORDS = batchMaxRecordsToRestore; 43 }); 44 45 describe('Asset definition', async () => { 46 47 it('Checks that the event stream notification for confirming the asset definition creation is handled', async () => { 48 49 nock('https://ipfs.kaleido.io') 50 .get('/ipfs/QmbGq3hw6r5C3yUkGvqJHq7c67pyMHXxQJ6XBHUh9kf5Ex') 51 .reply(200, { 52 assetDefinitionID: assetDefinitionID, 53 name: 'unauthored - private - described - structured', 54 isContentPrivate: true, 55 isContentUnique: true, 56 descriptionSchema: testDescription.schema.object, 57 contentSchema: testContent.schema.object 58 }); 59 60 const eventPromise = new Promise<void>((resolve) => { 61 mockEventStreamWebSocket.once('send', message => { 62 assert.strictEqual(message, '{"type":"ack","topic":"dev"}'); 63 resolve(); 64 }) 65 }); 66 const data: IEventAssetDefinitionCreated = { 67 author: '0x0000000000000000000000000000000000000002', 68 assetDefinitionHash: '0xc02d4bc2c162538e1ca45d20c472b608520d99d6d3988383251d626b8a3411d9', 69 timestamp: timestamp.toString() 70 }; 71 mockEventStreamWebSocket.emit('message', JSON.stringify([{ 72 signature: utils.contractEventSignatures.ASSET_DEFINITION_CREATED, 73 data, 74 blockNumber: '123', 75 transactionHash: '0x0000000000000000000000000000000000000000000000000000000000000000' 76 }])); 77 await eventPromise; 78 }); 79 80 it('Checks that the asset definition is confirmed', async () => { 81 const getAssetDefinitionsResponse = await request(app) 82 .get('/api/v1/assets/definitions') 83 .expect(200); 84 const assetDefinition = getAssetDefinitionsResponse.body.find((assetDefinition: IDBAssetDefinition) => assetDefinition.name === 'unauthored - private - described - structured'); 85 assert.strictEqual(assetDefinition.assetDefinitionID, assetDefinitionID); 86 assert.strictEqual(assetDefinition.author, '0x0000000000000000000000000000000000000002'); 87 assert.deepStrictEqual(assetDefinition.descriptionSchema, testDescription.schema.object); 88 assert.deepStrictEqual(assetDefinition.contentSchema,testContent.schema.object); 89 assert.strictEqual(assetDefinition.isContentPrivate, true); 90 assert.strictEqual(assetDefinition.name, 'unauthored - private - described - structured'); 91 assert.strictEqual(assetDefinition.timestamp, timestamp); 92 assert.strictEqual(assetDefinition.submitted, undefined); 93 assert.strictEqual(assetDefinition.receipt, undefined); 94 assert.strictEqual(assetDefinition.blockNumber, 123); 95 assert.strictEqual(assetDefinition.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000000'); 96 97 const getAssetDefinitionResponse = await request(app) 98 .get(`/api/v1/assets/definitions/${assetDefinitionID}`) 99 .expect(200); 100 assert.deepStrictEqual(assetDefinition, getAssetDefinitionResponse.body); 101 }); 102 103 }); 104 105 describe('Asset instances', async () => { 106 107 const assetInstanceID = 'e07f4682-71d1-4a76-8084-8adbc97ef99c'; 108 const batchHashSha256 = '0x' + createHash('sha256').update(randomBytes(10)).digest().toString('hex'); 109 const batchHashIPFSMulti = utils.sha256ToIPFSHash(batchHashSha256); 110 111 it('Checks that the event stream notification for confirming the asset instance creation is handled', async () => { 112 113 const testBatch: IDBBatch = { 114 author: '0x0000000000000000000000000000000000000002', 115 batchID: uuidV4(), 116 completed: Date.now() - 100, 117 created: Date.now() - 200, 118 type: 'asset-instances', 119 records: [{ 120 recordType: BatchRecordType.assetInstance, 121 assetDefinitionID, 122 assetInstanceID, 123 author: '0x0000000000000000000000000000000000000002', 124 description: testDescription.sample.object, 125 descriptionHash: '0x' + utils.getSha256(JSON.stringify(testDescription.sample.object)), 126 contentHash: '0x' + utils.getSha256(JSON.stringify(testContent.sample.object)), 127 isContentPrivate: true 128 }], 129 }; 130 131 nock('https://ipfs.kaleido.io') 132 .get(`/ipfs/${batchHashIPFSMulti}`) 133 .reply(200, testBatch) 134 135 const eventPromise = new Promise<void>((resolve) => { 136 mockEventStreamWebSocket.once('send', message => { 137 assert.strictEqual(message, '{"type":"ack","topic":"dev"}'); 138 resolve(); 139 }) 140 }); 141 const data: IEventAssetInstanceBatchCreated = { 142 batchHash: batchHashSha256, 143 author: '0x0000000000000000000000000000000000000002', 144 timestamp: timestamp.toString() 145 }; 146 mockEventStreamWebSocket.emit('message', JSON.stringify([{ 147 signature: utils.contractEventSignatures.ASSET_INSTANCE_BATCH_CREATED, 148 data, 149 blockNumber: '123', 150 transactionHash: '0x0000000000000000000000000000000000000000000000000000000000000000' 151 }])); 152 await eventPromise; 153 }); 154 155 it('Checks that the asset instance is confirmed', async () => { 156 const getAssetInstancesResponse = await request(app) 157 .get(`/api/v1/assets/${assetDefinitionID}`) 158 .expect(200); 159 const assetInstance = getAssetInstancesResponse.body.find((assetInstance: IDBAssetInstance) => assetInstance.assetInstanceID === assetInstanceID); 160 assert.strictEqual(assetInstance.author, '0x0000000000000000000000000000000000000002'); 161 assert.strictEqual(assetInstance.assetDefinitionID, assetDefinitionID); 162 assert.strictEqual(assetInstance.descriptionHash, '0x' + utils.getSha256(JSON.stringify(testDescription.sample.object))); 163 assert.deepStrictEqual(assetInstance.description, testDescription.sample.object); 164 assert.strictEqual(assetInstance.contentHash, '0x' + utils.getSha256(JSON.stringify(testContent.sample.object))); 165 assert.deepStrictEqual(assetInstance.content, undefined); 166 assert.strictEqual(assetInstance.submitted, undefined); 167 assert.strictEqual(assetInstance.receipt, undefined); 168 assert.strictEqual(assetInstance.timestamp, timestamp); 169 assert.strictEqual(assetInstance.blockNumber, 123); 170 assert.strictEqual(assetInstance.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000000'); 171 172 const getAssetInstanceResponse = await request(app) 173 .get(`/api/v1/assets/${assetDefinitionID}/${assetInstanceID}`) 174 .expect(200); 175 assert.deepStrictEqual(assetInstance, getAssetInstanceResponse.body); 176 }); 177 178 }); 179 180 }); 181 };