Skip to content
This repository has been archived by the owner on Oct 17, 2023. It is now read-only.

[Test] Events #30

Closed
9 of 10 tasks
deman4ik opened this issue Aug 7, 2020 · 3 comments · Fixed by #36
Closed
9 of 10 tasks

[Test] Events #30

deman4ik opened this issue Aug 7, 2020 · 3 comments · Fixed by #36

Comments

@deman4ik
Copy link
Owner

deman4ik commented Aug 7, 2020

  • Поставить локально Redis минимум 5ой версии

  • Ознакомиться с документацией Redis Streams

  • Ознакомиться с документация ioredis

  • Попробовать написать 2 небольших скрипта для отправки и приема сообщение через redis streams (с использованием consumer group и без)

  • К модулю libs/events составить тест план для

    • end to end тестирования используя локальный редис
    • unit-тестирования с mockами redisa
  • Согласовать тест план и оценить время выполнения

  • Реализовать тесты по плану

  • Дописать комментарии для методов модуля events и внутри них если что-то покажется не очевидным

@VanillinT
Copy link

Прилож на базе ioredis со стримами и группами: https://github.com/VanillinT/ioredis-nodejs

@VanillinT
Copy link

E2E тест

Проверяется поведение объектов класса Events в условиях, приближенным к реальным. Сервисы в данном контексте представляют собой объекты со свойством events: Events

Ожидается, что описанные ниже шаги происходят по порядку и без ошибок. Ошибка при выполнении хотя бы одного шага приводит к неуспешному завершению теста.

  1. На машине локально запускается процесс redis;
    порт, на котором запущен процесс, запоминается – через него происходит коммуникация сервисов с redis.
    Неудачное соединение к redis ведёт к прекращению теста.

  2. В node определяются и запускаются сервисы, создающие несколько стримов, стримы заполняются данными через метод emit.

  3. Вызовом функции в node для некоторых стримов создаются группы.

  4. Вызовом функции симулируются неудачные попытки обработки данных вызовом xreadgroup → xpending(...) вернёт непустой ответ

  5. В node определяются и запускаются сервисы-обработчики, каждый из них определённым образом обрабатывает отдельную группу/стрим.
    В некоторых из них при обработке целенаправленно возникают ошибки.
    При ошибке обработки выводится лог сервиса и вызывается другой обработчик.

  6. Запускается ещё несколько сервисов-обработчиков, каждый из которых подписывается на обработку только новых данных (id = ">")

  7. Сервисы из шага 2) добавляют новые данные в соответствующие стримы

  8. Сервисы из шага 6) обрабатывают новые данные

  9. Тест завершается

@VanillinT
Copy link

VanillinT commented Aug 12, 2020

Unit тесты

Проверяется работа публичных методов класса Events.

  1. _parseObjectResponse(reply: StreamMsgVals)
    _parseMessageResponse(reply: StreamMessage[])
    _parseStreamResponse(reply: [string, StreamMessage[]][])
    _parsePendingResponse(reply: string[][])

    1. Корректно преобразовывают массивы в соответствующие объекты.
  2. _parseEvents(rawEvents: { msgId: string; data: { [key: string]: any } }[])

    1. Корректно преобразовает валидный массив объектов вида
      { msgId: string; data: { [key: string]: any } }[]
      в объект класса CloudEventV1.
    2. Для невалидного массива данных кидает ошибку.
  3. _createGroup(topic: string, group: string)

    1. Создаёт группу с указанными названиями стрима и группы, инициализирует стрим.
    2. Если указанная группа уже существует, не кидает ошибку.
subscribe(events: {
        [key: string]: {
            group?: string;
            unbalanced?: boolean;
            handler: (event: Event) => Promise<void>;
            schema?: ValidationSchema;
        };
    })
  1. Для валидного параметра без ошибок добавляет событие в соответствующее свойство (grouped, unbalanced) свойства #catalog

  2. Для невалидного параметра кидает ошибку

  3. _receiveMessagesTick(topic: string)
    _receiveGroupMessagesTick(topic: string, group: string)
    Для объекта класса Events, у которого корректно инициализированы все необходимые свойства:

    1. Соответствующей командой получает указанное в соответствующем count количество последних сообщений из указанной группы и/или стрима.
    2. Полученные данные обрабатываются всеми определёнными в #catalog хэндлерами.
      3. В log добавляются все определённые методом сообщения.
    3. При возникновении ошибки она корректно обрабатывается.
  4. _receivePendingGroupMessagesTick(topic: string, group: string)
    Для объекта класса Events, у которого корректно инициализированы все необходимые свойства:

    1. Командой `xclaim' из указанной группы и стрима присваивает и получает указанное количество последних сообщений, находящихся в неактивном состоянии указанное время.
    2. Полученные данные обрабатываются всеми определёнными в #catalog хэндлерами.
      3. В log добавляются все определённые методом сообщения.
    3. При возникновении ошибки она корректно обрабатывается.
  5. emit<T>(event: NewEvent<T>)
    При корректном параметре event:

    1. Командой xadd в соответствующий стрим добавляется сообщение с указанными параметрами
      2. В log добавляются все определённые методом сообщения.
  6. start

    1. Для всех подписок в #catalog инициализируются все необходимые поля в объектах unbalanced и grouped.
    2. Для каждого типа сообщений вызываются соответствующие методы получения/обработки сообщений.
      3. В log добавляются все определённые методом сообщения.

@VanillinT VanillinT linked a pull request Aug 15, 2020 that will close this issue
@deman4ik deman4ik mentioned this issue Sep 7, 2020
3 tasks
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants