Home Reference Source Test

test/1_unitTests/6_misc/streamWalker.test.ts

/* eslint-disable @typescript-eslint/explicit-function-return-type */
import {Event} from '../../../src'
import {StreamWalker} from '../../../src/StreamWalker'
import * as assert from 'assert'

describe('Async iterator test', (): void => {
  const testData: Event[] = []

  before(() => {
    let count = 0
    const eventNameList = [
      'EventA',
      'EventB',
      'EventC',
      'EventD',
      'EventE',
      'EventF',
      'EventG',
      'EventH',
      'EventI',
      'EventJ'
    ]
    for (let x = 0, xMax = 1000; x < xMax; x++) {
      eventNameList.forEach((name) => {
        testData.push(new Event(name, {count}))
        count++
      })
    }
  })

  let generator = async function*() {
    for (let x = 0, xMax = testData.length; x < xMax; x++) {
      yield testData[x]
    }
  }

  beforeEach(async () => {
    generator = async function*() {
      for (let x = 0, xMax = testData.length; x < xMax; x++) {
        yield testData[x]
      }
    }
  })

  it('can iterate through', async (): Promise<void> => {
    const walker = new StreamWalker(generator())

    let checkCounter = 0
    for await (const value of walker) {
      assert.strictEqual(value.name, testData[checkCounter].name)
      checkCounter++
    }
    assert.strictEqual(checkCounter, testData.length)
  })

  it('can filter events', async (): Promise<void> => {
    const walker = new StreamWalker(generator())

    let checkCounter = 0
    for await (const value of walker.filter((event) => event.name != 'EventB')) {
      assert.notEqual(value.name, 'EventB')
      checkCounter++
    }
    assert.strictEqual(checkCounter, testData.length - 1000)
  })

  it('can reduce events to single value', async (): Promise<void> => {
    const walker = new StreamWalker(generator())
    const result = await walker.reduce((accumulator: number) => {
      accumulator++
      return accumulator
    }, 0)
    assert.strictEqual(result, testData.length)
  })

  it('can transform to array', async (): Promise<void> => {
    const walker = new StreamWalker(generator())
    const result = await walker.toArray()
    assert.strictEqual(JSON.stringify(result), JSON.stringify(testData))
  })

  it('can test all entries and return global result true', async (): Promise<void> => {
    const walker = new StreamWalker(generator())
    const result = await walker.every((event) => event.name.startsWith('Event'))
    assert.strictEqual(result, true)
  })

  it('can test all entries and return global result true', async (): Promise<void> => {
    const walker = new StreamWalker(generator())
    const result = await walker.every((event) => event.name.startsWith('EventA'))
    assert.strictEqual(result, false)
  })

  it('can combine filter and forEach', async (): Promise<void> => {
    const walker = new StreamWalker(generator())

    let checkCounter = 0
    await walker
      .filter((event) => event.name != 'EventB')
      .forEach((event) => {
        assert.notEqual(event.name, 'EventB')
        checkCounter++
      })

    assert.strictEqual(checkCounter, testData.length - 1000)
  })

  it('can combine filter, map and to array', async (): Promise<void> => {
    const walker = new StreamWalker(generator())

    const result = await walker
      .filter((event) => event.name != 'EventB')
      .map((event) => {
        event.name = 'NewName'
        return event
      })
      .toArray()
    assert.strictEqual(result.length, testData.length - 1000)
    assert.strictEqual(
      result.every((event: Event) => {
        return event.name === 'NewName'
      }),
      true
    )
  })

  it('throws on none function at filter', async () => {
    const walker = new StreamWalker(generator())

    try {
      await walker.filter(null)
      assert.fail('has not thrown')
    } catch (err) {
      assert.strictEqual(err.name, 'EventstoreImplementationError')
    }
  })

  it('throws on none function at map', async () => {
    const walker = new StreamWalker(generator())

    try {
      await walker.map(null)
      assert.fail('has not thrown')
    } catch (err) {
      assert.strictEqual(err.name, 'EventstoreImplementationError')
    }
  })

  it('throws on none function at forEach', async () => {
    const walker = new StreamWalker(generator())

    try {
      await walker.forEach(null)
      assert.fail('has not thrown')
    } catch (err) {
      assert.strictEqual(err.name, 'EventstoreImplementationError')
    }
  })

  it('throws on none function at reduce', async () => {
    const walker = new StreamWalker(generator())

    try {
      await walker.reduce(null)
      assert.fail('has not thrown')
    } catch (err) {
      assert.strictEqual(err.name, 'EventstoreImplementationError')
    }
  })

  it('throws on none function at every', async () => {
    const walker = new StreamWalker(generator())

    try {
      await walker.every(null)
      assert.fail('has not thrown')
    } catch (err) {
      assert.strictEqual(err.name, 'EventstoreImplementationError')
    }
  })
})