github.com/kaleido-io/firefly@v0.0.0-20210622132723-8b4b6aacb971/kat/src/test/ethereum/members/registration.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 nock from 'nock';
    17  import request from 'supertest';
    18  import assert from 'assert';
    19  import { IEventMemberRegistered, IDBMember } from '../../../lib/interfaces';
    20  import * as utils from '../../../lib/utils';
    21  
    22  export const testMemberRegistration = async () => {
    23  
    24  describe('Members - registration', async () => {
    25  
    26    const timestampCreation = utils.getTimestamp();
    27    const timestampUpdate = utils.getTimestamp();
    28  
    29    it('Checks that adding a member sends a request to API Gateway and updates the database', async () => {
    30  
    31      nock('https://apigateway.kaleido.io')
    32        .post('/registerMember?kld-from=0x0000000000000000000000000000000000000011&kld-sync=false')
    33        .reply(200);
    34      const addMemberResponse = await request(app)
    35        .put('/api/v1/members')
    36        .send({
    37          address: '0x0000000000000000000000000000000000000011',
    38          name: 'Member 1'
    39        })
    40        .expect(200);
    41      assert.deepStrictEqual(addMemberResponse.body, { status: 'submitted' });
    42  
    43      const getMemberResponse = await request(app)
    44        .get('/api/v1/members')
    45        .expect(200);
    46      const member = getMemberResponse.body.find((member: IDBMember) => member.address === '0x0000000000000000000000000000000000000011');
    47      assert.strictEqual(member.address, '0x0000000000000000000000000000000000000011');
    48      assert.strictEqual(member.name, 'Member 1');
    49      assert.strictEqual(member.assetTrailInstanceID, 'service-id');
    50      assert.strictEqual(member.app2appDestination, 'kld://app2app/internal');
    51      assert.strictEqual(member.docExchangeDestination, 'kld://docstore/dest');
    52      assert.strictEqual(typeof member.submitted, 'number');
    53  
    54      const getMemberByAddressResponse = await request(app)
    55        .get('/api/v1/members/0x0000000000000000000000000000000000000011')
    56        .expect(200);
    57      assert.deepStrictEqual(member, getMemberByAddressResponse.body);
    58    });
    59  
    60    it('Checks that event stream notification for confirming member registrations is handled', async () => {
    61  
    62      const eventPromise = new Promise<void>((resolve) => {
    63        mockEventStreamWebSocket.once('send', message => {
    64          assert.strictEqual(message, '{"type":"ack","topic":"dev"}');
    65          resolve();
    66        })
    67      });
    68  
    69      const data: IEventMemberRegistered = {
    70        member: '0x0000000000000000000000000000000000000011',
    71        name: 'Member 1',
    72        assetTrailInstanceID: 'service-id',
    73        app2appDestination: 'kld://app2app/internal',
    74        docExchangeDestination: 'kld://docstore/dest',
    75        timestamp: timestampCreation
    76      };
    77      mockEventStreamWebSocket.emit('message', JSON.stringify([{
    78        signature: utils.contractEventSignatures.MEMBER_REGISTERED,
    79        data,
    80        blockNumber: '123',
    81        transactionHash: '0x0000000000000000000000000000000000000000000000000000000000000000'
    82      }]));
    83      await eventPromise;
    84    });
    85  
    86    it('Get member should return the confirmed member', async () => {
    87      const getMemberResponse = await request(app)
    88        .get('/api/v1/members')
    89        .expect(200);
    90      const member = getMemberResponse.body.find((member: IDBMember) => member.address === '0x0000000000000000000000000000000000000011');
    91      assert.strictEqual(member.address, '0x0000000000000000000000000000000000000011');
    92      assert.strictEqual(member.name, 'Member 1');
    93      assert.strictEqual(member.assetTrailInstanceID, 'service-id');
    94      assert.strictEqual(member.app2appDestination, 'kld://app2app/internal');
    95      assert.strictEqual(member.docExchangeDestination, 'kld://docstore/dest');
    96      assert.strictEqual(member.blockNumber, 123);
    97      assert.strictEqual(member.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000000');
    98      assert.strictEqual(member.timestamp, timestampCreation);
    99  
   100      const getMemberByAddressResponse = await request(app)
   101        .get('/api/v1/members/0x0000000000000000000000000000000000000011')
   102        .expect(200);
   103      assert.deepStrictEqual(member, getMemberByAddressResponse.body);
   104    });
   105  
   106    it('Checks that updating a member sends a request to API Gateway and updates the database', async () => {
   107      nock('https://apigateway.kaleido.io')
   108        .post('/registerMember?kld-from=0x0000000000000000000000000000000000000011&kld-sync=false')
   109        .reply(200);
   110      const addMemberResponse = await request(app)
   111        .put('/api/v1/members')
   112        .send({
   113          address: '0x0000000000000000000000000000000000000011',
   114          name: 'Member 2'
   115        })
   116        .expect(200);
   117      assert.deepStrictEqual(addMemberResponse.body, { status: 'submitted' });
   118  
   119      const getMemberResponse = await request(app)
   120        .get('/api/v1/members')
   121        .expect(200);
   122      const member = getMemberResponse.body.find((member: IDBMember) => member.address === '0x0000000000000000000000000000000000000011');
   123      assert.strictEqual(member.address, '0x0000000000000000000000000000000000000011');
   124      assert.strictEqual(member.name, 'Member 2');
   125      assert.strictEqual(member.assetTrailInstanceID, 'service-id');
   126      assert.strictEqual(member.app2appDestination, 'kld://app2app/internal');
   127      assert.strictEqual(member.docExchangeDestination, 'kld://docstore/dest');
   128      assert.strictEqual(member.blockNumber, 123);
   129      assert.strictEqual(member.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000000');
   130      assert.strictEqual(typeof member.timestamp, 'number');
   131  
   132      const getMemberByAddressResponse = await request(app)
   133        .get('/api/v1/members/0x0000000000000000000000000000000000000011')
   134        .expect(200);
   135      assert.deepStrictEqual(member, getMemberByAddressResponse.body);
   136    });
   137  
   138    it('Checks that event stream notification for confirming member registrations are handled', async () => {
   139  
   140      const eventPromise = new Promise<void>((resolve) => {
   141        mockEventStreamWebSocket.once('send', message => {
   142          assert.strictEqual(message, '{"type":"ack","topic":"dev"}');
   143          resolve();
   144        })
   145      });
   146  
   147      const data: IEventMemberRegistered = {
   148        member: '0x0000000000000000000000000000000000000011',
   149        name: 'Member 2',
   150        assetTrailInstanceID: 'service-id',
   151        app2appDestination: 'kld://app2app/internal',
   152        docExchangeDestination: 'kld://docstore/dest',
   153        timestamp: timestampUpdate
   154      };
   155      mockEventStreamWebSocket.emit('message', JSON.stringify([{
   156        signature: utils.contractEventSignatures.MEMBER_REGISTERED,
   157        data,
   158        blockNumber: '456',
   159        transactionHash: '0x0000000000000000000000000000000000000000000000000000000000000001'
   160      }]));
   161      await eventPromise;
   162    });
   163  
   164    it('Get member should return the confirmed member', async () => {
   165      const getMemberResponse = await request(app)
   166        .get('/api/v1/members')
   167        .expect(200);
   168      const member = getMemberResponse.body.find((member: IDBMember) => member.address === '0x0000000000000000000000000000000000000011');
   169      assert.strictEqual(member.address, '0x0000000000000000000000000000000000000011');
   170      assert.strictEqual(member.name, 'Member 2');
   171      assert.strictEqual(member.assetTrailInstanceID, 'service-id');
   172      assert.strictEqual(member.app2appDestination, 'kld://app2app/internal');
   173      assert.strictEqual(member.docExchangeDestination, 'kld://docstore/dest');
   174      assert.strictEqual(member.blockNumber, 456);
   175      assert.strictEqual(member.transactionHash, '0x0000000000000000000000000000000000000000000000000000000000000001');
   176      assert.strictEqual(member.timestamp, timestampUpdate);
   177  
   178      const getMemberByAddressResponse = await request(app)
   179        .get('/api/v1/members/0x0000000000000000000000000000000000000011')
   180        .expect(200);
   181      assert.deepStrictEqual(member, getMemberByAddressResponse.body);
   182    });
   183  
   184  });
   185  };