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