백엔드/Strapi

자동화 테스트 1차 완성

STUFIT 2022. 11. 3. 13:47
반응형

1차적으로 ui 테스트를 위한 코드를 작성 완료하였다.

strapi 로 logging 기능을 개발하여 프론트에서 테스트 실행 시, 백엔드쪽에서 테스트가 돌아가고 만약 오류가 생기게 된다면 validation 처리를 하여 로그에 쌓이도록 개발완료한 상태이다.

이번에 logging 기능을 개발하면서 strapi 의 relation 에 대해 공부를 하였는데 relation에 대해서는 따로 기술하도록 하겠다.

이번 포스팅은 내가 작성한 코드에 대해서만 기록하도록 하겠다.

'use strict';

/**
 * testcase controller
 */

const { createCoreController } = require('@strapi/strapi').factories;
const {
  errorLog,
  testResultLog,
} = require('../../../modules/logging/loggingInfo');
const {
  userInfoService,
  createOrUpdatedUser,
} = require('../../../modules/logging/userlog');

const populateInfo = {
  TESTCASE_ELEMENTS: { filters: { USE_YN: 'Y' } },
  LOGGINGS: '*',
  CREATED_USER: '*',
  UPDATED_USER: '*',
};

module.exports = createCoreController(
  'api::testcase.testcase',
  ({ strapi }) => ({
    async catchUpdateStatusAndRuntime(ctx, runtimeDate) {
      const testcaseId = ctx.request.query;
      await strapi
        .service('api::testcase.testcase')
        .update(`${testcaseId.id}`, {
          data: {
            LAST_RUNTIME: runtimeDate,
            LAST_STATUS: 'F',
          },
        });
    },
    async tryUpdateStatusAndRuntime(ctx, runtimeDate, result) {
      const testcaseId = ctx.request.query;
      await strapi
        .service('api::testcase.testcase')
        .update(`${testcaseId.id}`, {
          data: {
            LAST_RUNTIME: runtimeDate,
            LAST_STATUS:
              String(result).includes('success') === true ? 'S' : 'F',
          },
        });
    },
    async testcaseList(ctx) {
      const entity = await strapi.entityService.findMany(
        'api::testcase.testcase',
        {
          filters: { USE_YN: 'Y' },
          sort: { id: 'DESC' },
          populate: populateInfo,
        }
      );
      const data = await this.sanitizeOutput(entity, ctx);
      return { data };
    },
    async findTestcase(ctx) {
      const requestParams = ctx.request.params;
      const testcaseId = requestParams.id;
      const entity = await strapi.entityService.findMany(
        'api::testcase.testcase',
        {
          filters: { id: `${testcaseId}`, USE_YN: 'Y' },
          populate: populateInfo,
        }
      );
      const data = await this.sanitizeOutput(entity, ctx);
      return { data };
    },

    // [1] : 테스트케이스 생성 api
    async createTestcase(ctx) {
      const userInfo = await userInfoService();
      try {
        const request_body = ctx.request.body.data;
        // 항상 data로 감싸야함.
        const reqeust_data = {
          data: {
            SERVICE_NM: request_body.SERVICE_NM,
            SELECT_SUB: request_body.SELECT_SUB,
            TEST_NM: request_body.TEST_NM,
          },
        };
        const entity = await strapi
          .service('api::testcase.testcase')
          .create(reqeust_data);
        // DB에 저장될 때 sanitizedEntity 사용
        // const sanitizedEntity = await this.sanitizeInput(entity, ctx);
        // DB에 저장된 값
        const sanitizedEntity = await this.sanitizeOutput(entity, ctx);
        // 테스트케이스 생성한 유져 정보 삽입
        await createOrUpdatedUser(sanitizedEntity, userInfo, ctx);
        const result = sanitizedEntity;
        // ctx.send({ result });
        return { result };
      } catch (error) {
        // return { data, meta };
        console.log(error);
        return { error };
      }
    },

    // [2] : 테스트케이스 수정 api
    async update(ctx) {
      const userInfo = await userInfoService();
      const requestParams = ctx.request.params;
      const testcaseId = requestParams.id;

      try {
        const request_body = ctx.request.body.data;
        const update_data = {
          SERVICE_NM: request_body.SERVICE_NM,
          SELECT_SUB: request_body.SELECT_SUB,
          TEST_NM: request_body.TEST_NM,
        };
        // 정의되지 않은 필드값 들어올 시 Validation
        if (
          JSON.stringify(Object.keys(request_body)) !==
          JSON.stringify(Object.keys(update_data))
        ) {
          return ctx.response.badRequest('정의되지 않은 필드가 존재합니다.');
        }
        // 테스트케이스가 존재하지 않을 경우
        const findTestCase = await strapi
          .service('api::testcase.testcase')
          .findOne(`${testcaseId}`);
        if (!findTestCase) {
          return ctx.response.badRequest('테스트케이스가 존재하지 않습니다.');
        }
        // 업데이트
        const entity = await strapi
          .service('api::testcase.testcase')
          .update(`${testcaseId}`, { data: update_data });

        const sanitizedEntity = await this.sanitizeOutput(entity, ctx);
        await createOrUpdatedUser(sanitizedEntity, userInfo, ctx);
        const result = sanitizedEntity;
        return { result };
      } catch (error) {
        console.log(error);
        return { error };
      }
    },

    // [3] : 테스트케이스 삭제 api
    async delete(ctx) {
      // const findUser = await userModule.findUser(ctx);
      userInfoService();
      const requestParams = ctx.request.params;
      const testcaseId = requestParams.id;
      const { meta } = await super.find(ctx);
      try {
        const findTestCase = await strapi
          .service('api::testcase.testcase')
          .findOne(`${testcaseId}`);
        if (!findTestCase) {
          return ctx.response.badRequest('테스트케이스가 존재하지 않습니다.');
        }
        const entity = await strapi
          .service('api::testcase.testcase')
          .delete(testcaseId);
        const sanitizedEntity = await this.sanitizeOutput(entity, ctx);
        meta.result = `${sanitizedEntity.SERVICE_NM}이(가) 정상적으로 삭제되었습니다.`;
        // loggerModule.createLogger(ctx, testcaseId, findUser);
        return { meta };
      } catch (error) {
        return { error };
      }
    },

    async deleteTestcase(ctx) {
      const userInfo = await userInfoService();
      const requestParams = ctx.request.params;
      const testcaseId = requestParams.id;
      const { meta } = await super.find(ctx);
      try {
        const findTestCase = await strapi
          .service('api::testcase.testcase')
          .findOne(`${testcaseId}`);
        if (!findTestCase) {
          return ctx.response.badRequest('테스트케이스가 존재하지 않습니다.');
        }
        const entity = await strapi
          .service('api::testcase.testcase')
          .update(`${testcaseId}`, { data: { USE_YN: 'N' } });
        const sanitizedEntity = await this.sanitizeOutput(entity, ctx);
        await createOrUpdatedUser(sanitizedEntity, userInfo, ctx);
        meta.result = `${sanitizedEntity.SERVICE_NM}이(가) 정상적으로 삭제되었습니다.`;
        return { meta };
      } catch (error) {
        return { error };
      }
    },

    /* 커스텀 테스트케이스 목록들*/

    // [1] : 마켓봄 테스트 api
    async bomOrderTest(ctx) {
      const userInfo = await userInfoService();
      const { meta } = await super.find(ctx);
      try {
        const requestQuery = ctx.request.query;
        const result = await strapi
          .service('api::testcase.testcase')
          .bomOrderTest(requestQuery);
        if (result === 'error') {
          return ctx.response.badRequest('오우쉣');
        }
        const sanitizedEntity = await this.sanitizeOutput(result, ctx);
        meta.result = sanitizedEntity;
        await createOrUpdatedUser(sanitizedEntity, userInfo, ctx);
        ctx.send({ sanitizedEntity });
        await testResultLog(sanitizedEntity, userInfo, ctx, result);
        return { meta };
      } catch (error) {
        const testcaseId = ctx.request.query;
        ctx.response.status === 404
          ? ctx.response.notFound('실패', `${error}`)
          : ctx.response.badRequest('실패', `${error}`);
        const date = new Date().toString().slice(0, -32);
        const path = `./src/screenshot/${date}.png`;
        await errorLog(testcaseId, userInfo, ctx, path);
        return error;
      }
    },

    // [2] : 마켓봄프로 테스트 api
    async proEnroll(ctx) {
      const userInfo = await userInfoService();
      const testcaseId = ctx.request.query;
      try {
        const result = await strapi
          .service('api::testcase.testcase')
          .proEnroll(ctx, testcaseId);
        //ctx.send({ result });
        const runtimeDate = new Date(new Date().getTime());
        //const sanitizedEntity = await this.sanitizeOutput(result, ctx);
        await this.tryUpdateStatusAndRuntime(ctx, runtimeDate, result);
        await createOrUpdatedUser(testcaseId, userInfo, ctx);
        await testResultLog(testcaseId, userInfo, ctx, result);

        return { result };
      } catch (error) {
        const testcaseId = ctx.request.query;
        const screenshotName = new Date().getTime();
        const path = `./src/screenshot/${ctx.response.body.error.message}.png`;
        const runtimeDate = new Date(screenshotName);
        await this.catchUpdateStatusAndRuntime(ctx, runtimeDate);
        await errorLog(testcaseId, userInfo, ctx, path);
        return error;
      }
    },
  })
);
반응형