Home Reference Source Test

test/2_integrationTests/3_event/3_linkedEvent.test.ts

import {Eventstore, Event, Stream} from '../../../src'
import * as assert from 'assert'
import * as sinon from 'sinon'

describe('Linked event', (): void => {
  const es = new Eventstore({
    uri: 'discover://restrictedUser:restrictedOnlyUserPassword@cluster1.escluster.net:2112',
    clientId: 'ts-client-test',
    useSSL: true
  })
  let sandbox = sinon.createSandbox()
  before(
    async (): Promise<void> => {
      await es.connect()
    }
  )

  after(
    async (): Promise<void> => {
      await es.disconnect()
    }
  )

  afterEach(
    (): void => {
      sandbox.restore()
    }
  )

  it('resolves linked event', async (): Promise<void> => {
    const walker = await es.fromStream('$ce-teneventsstream').walkStreamForward(0, false)
    await walker.forEach(
      async (eventEntry): Promise<void> => {
        assert.strictEqual(eventEntry.isLink(), true)
        assert.strictEqual(typeof eventEntry.metadata, 'object')
        const event = await es.resolveLink(eventEntry, true, {
          username: 'restrictedUser',
          password: 'restrictedOnlyUserPassword'
        })
        if (event) {
          assert.strictEqual(event.isLink(), false)
        }
      }
    )
    assert.ok('ok')
  })

  it('returns same event if not link', async (): Promise<void> => {
    const event = new Event('testEvent')
    const resolvedEvent = await es.resolveLink(event)
    assert.strictEqual(event, resolvedEvent)
  })

  it('throws NotFoundError', async (): Promise<void> => {
    class TestClass extends Event {
      public constructor() {
        super('testEvent')
      }

      public get data(): string {
        return '0@fakeStream'
      }

      public isLink(): boolean {
        return true
      }
    }

    sandbox.stub(Stream.prototype, 'getEventByNumber').resolves(null)
    const event = new TestClass()

    try {
      await es.resolveLink(event)
      assert.fail('has not thrown')
    } catch (err) {
      console.log(err)
      assert.strictEqual(err.name, 'EventstoreNotFoundError')
    }
  })

  it('throws ProtocolError', async (): Promise<void> => {
    sandbox.stub(Stream.prototype, 'getEventByNumber').resolves({data: false})
    sandbox.stub(Event.prototype, 'isLink').returns(true)
    const event = new Event('testEvent')
    try {
      await es.resolveLink(event)
      assert.fail('has not thrown')
    } catch (err) {
      assert.strictEqual(err.name, 'EventstoreProtocolError')
    }
  })
})