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  };