# Nokkel Testing Library

A typescript testing library for Koa APIs or Cypress e2e testing. This library provides useful helper Typescript Jest configuration, functions and classes for mocking and generating values for your tests.

## Using this library

You can install this library using the following command

```bash
npm add -D @nokkel/testing jest jest-junit ts-jest ts-node
```

It is also recommended to install the following typing for your typescript project

```bash
npm add -D @types/jsonwebtoken @types/jest @types/koa @types/node
```

Once installed you can configure Jest by adding the following files to your project

`jest.config.ts`

```typescript
import type { Config } from 'jest';
import { pathsToModuleNameMapper } from 'ts-jest';

import baseConfig from '@nokkel/testing/dist/jest.config';

import { compilerOptions } from './tsconfig.json';

const config: Config = {
  ...baseConfig,
  moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths),
  modulePaths: [compilerOptions.baseUrl],
};

export default config;

```

### Testing with kafka

In your test file where you need to test for events, add the following test case:

```typescript
import { KafkaClient, KafkaMessage } from '@nokkel/testing';
import Chance from 'chance';


const EXPECTED_EVENTS: any[] = [];

const KAFKA = new KafkaClient(
  {
    clientId: config.event.clientId,
    brokers: config.event.brokers,
    logLevel: config.event.logLevel,
  },
  {
    groupId: CHANCE.string(),
  }
);

const CONSUMER = KAFKA.client;

describe(`${YOUR_EVENT_TOPIC} events`, () => {
  beforeEach(async () => {
    await KAFKA.setupClient([YOUR_EVENT_TOPIC]);
    await CONSUMER.connect();
  });

  afterAll(async () => {
    await KAFKA.tearDownTopics([YOUR_EVENT_TOPIC]);
    await CONSUMER.disconnect();
    await CONSUMER.stop();
  }, 10000);

  it('should have been published', async () => {
    const messages: KafkaMessage[] = [];

    KAFKA.consumeMessages(messages);
    await KAFKA.waitForMessages(messages);

    expect(messages).toEqual(
      expect.arrayContaining(
        EXPECTED_EVENTS.map(userPersona => {
          return {
            topic: YOUR_EVENT_TOPIC,
            message: expect.objectContaining({
              value: userPersona,
            }),
          };
        })
      )
    );
  }, 10000);
});
```

Where your `default.yaml` config file should have this:
```yaml
event:
  clientId: account-api
  brokers:
    - localhost:9092
  logLevel: 0 # 0 = NOTHING, 1 = ERROR, 2 = WARN, 4 = INFO, 5 = DEBUG
  ssl: false
```

and `custom-environment-variables.yaml` should have this:
```yaml
event:
  clientId: APP_NAME
  brokers:
    __name: EVENT_BROKERS
    __format: json
  ssl: EVENT_SSL
  logLevel: EVENT_LOG_LEVEL
```