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