Ошибка Jest-Supertest Random при тестировании на контейнере docker - PullRequest
0 голосов
/ 06 мая 2020

Мое приложение запускает стек NEST JS -ARANGODB. Я провожу тесты e2e, используя jest и supertest. В моей локальной среде все тесты проходят. У нас есть конвейер, в котором мы используем изображение docker, предоставленное arangodb, например:

FROM arangodb/arangodb:3.6.1

COPY . .

RUN arangod \
      --server.endpoint tcp://127.0.0.1:8529 \
      --server.authentication false \
      --log.file /tmp/init-log \
      --log.foreground-tty false & \
    sleep 5 && \
    sh arangoconf.sh root password
EXPOSE 8529

CMD ["arangod"]

, где arangoconf. sh - это короткий скрипт для заполнения базы данных с помощью ara gosh. Чтобы развернуть изображение docker, мы запускаем следующие команды:

docker build -t dbname .

docker run -e ARANGO_ROOT_PASSWORD=password -p 8529:8529 dbname

Затем мы запускаем тесты e2e. У нас есть 11 модулей, у каждого есть тестовый файл e2e. При первом запуске тестов один из них случайно не проходит. Ошибка имеет следующий вид:

enter image description here

Ошибка входа, как на изображении, но все файлы используют одни и те же учетные данные. Я пробовал добавить опцию -runInBand в Jest, но это не сработало. А в моем локальном все отлично работает. Думаю, что-то не так с конфигурацией aran go. Я также отправляю тестовый файл e2e.

import * as request from 'supertest';
import { Test } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import { EventModule } from '../../../../src/modules/session/event/event.module';
import { TreatmentModule } from '../../../../src/modules/session/treatment/treatment.module';
import { AuthModule } from '../../../../src/modules/auth/auth.module';
import { EventService } from '../../../../src/modules/session/event/services/event.service';
import { TreatmentService } from '../../../../src/modules/session/treatment/services/treatment.service';
import { EventDataMock } from '../../../mocks/session/event/event-data.mock';
import { TreatmentDataMock } from '../../../mocks/session/treatment/treatment-data.mock';
import { AuthDataMock } from '../../../mocks/auth/auth-data.mock';
import { GenericResponses } from '../../../../src/constants/generic-responses';
import { EventTreatmentService } from '../../../../src/modules/session/event/services/event-treatment.service';

describe('Events', () => {

  let app: INestApplication;
  let service: EventService;
  let treatmentService: TreatmentService;
  let eventTreatmentService: EventTreatmentService;
  let eventDataMock: EventDataMock;
  let treatmentDataMock: TreatmentDataMock;
  let authDataMock: AuthDataMock;
  let eventRequest;
  let eventResponse;
  let treatmentStartResponse;
  const keysList: string[] = new Array();
  const treatmentKey: string[] = new Array();
  let userToken: string;

  beforeAll(async (done) => {
    const module = await Test.createTestingModule({
      imports: [EventModule, TreatmentModule, AuthModule],
    }).compile();
    app = module.createNestApplication();
    service = module.get<EventService>(EventService);
    treatmentService = module.get<TreatmentService>(TreatmentService);
    eventTreatmentService = module.get<EventTreatmentService>(EventTreatmentService);
    eventDataMock = new EventDataMock();
    treatmentDataMock = new TreatmentDataMock();
    authDataMock = new AuthDataMock();
    eventRequest = JSON.parse(JSON.stringify(eventDataMock.newEvent));
    eventResponse = JSON.parse(JSON.stringify(eventDataMock.newEventResponse));
    treatmentStartResponse = JSON.parse(JSON.stringify(treatmentDataMock.startResponse));
    await app.init();
    request(app.getHttpServer()).post('/').end( () => done() );
  });

  it('Login', () => {
    return request(app.getHttpServer())
      .post('/auth/login/user')
      .send(authDataMock.userLoginData)
      .expect( (res) => {
        expect(res.body.data).toHaveProperty('accessToken');
        userToken = res.body.data.accessToken;
      });
  });

  it('/Start a new treatment return ok response and the treatment with the SUID', () => {
    return request(app.getHttpServer())
      .post('/treatment/start')
      .set('Accept', 'application/json')
      .set('Authorization', 'Bearer ' + userToken)
      .send(treatmentDataMock.startRequest)
      .expect((response) => {
        expect(response.body).toHaveProperty('data');
        expect(response.body.data).toHaveProperty('treatment');
        expect(response.body.data.treatment).toHaveProperty('_key');
        expect(response.body.data.treatment).toHaveProperty('SUID');
        const key = response.body.data.treatment._key;
        const SUID = response.body.data.treatment.SUID;
        treatmentKey.push(key);
        treatmentStartResponse._key = key;
        treatmentStartResponse.SUID = SUID;
        eventRequest.SUID = SUID;
        eventResponse.SUID = SUID;
      });
  });

  it('/Add event must return ok response and the new event', () => {
    return request(app.getHttpServer())
      .post('/event')
      .set('Accept', 'application/json')
      .set('Authorization', 'Bearer ' + userToken)
      .send(eventRequest)
      .expect((response) => {
        expect(response.body).toHaveProperty('data');
        expect(response.body.data).toHaveProperty('event');
        expect(response.body.data.event).toHaveProperty('_key');
        expect(response.body.data.event).toHaveProperty('SUID');
        const key = response.body.data.event._key;
        keysList.push(key);
        eventResponse._key = key;
      });
  });

  it('/Post event without SUID returns bad request', () => {
    const requestBody = JSON.parse(JSON.stringify(eventRequest));
    delete requestBody.SUID;
    return request(app.getHttpServer())
      .post('/event')
      .set('Accept', 'application/json')
      .set('Authorization', 'Bearer ' + userToken)
      .send(requestBody)
      .expect(GenericResponses.GENERIC_BAD_REQUEST('"SUID" is required'));
  });

  it('/Post event with wrong SUID returns treatment not found', () => {
    const requestBody = JSON.parse(JSON.stringify(eventRequest));
    requestBody.SUID = '923174891724897';
    return request(app.getHttpServer())
      .post('/event')
      .set('Accept', 'application/json')
      .set('Authorization', 'Bearer ' + userToken)
      .send(requestBody)
      .expect(GenericResponses.GENERIC_NOT_FOUND('treatment'));
  });

  afterAll(async () => {
    await service.deleteByKeys(keysList);
    await treatmentService.deleteByKeys(treatmentKey);
    const eventTreatmentList = await eventTreatmentService.getAllEdges(`events/${keysList[0]}`);
    await eventTreatmentService.deleteByKeys(eventTreatmentList);
    await app.close();
  });

});
...