api/src/__tests__/scriptMutations.test.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import { graphqlRequest } from '../db/connection';
import { brandFactory, formFactory, integrationFactory } from '../db/factories';
import { Brands, Forms, Integrations, Scripts, Users } from '../db/models';

import './setup.ts';

describe('scriptMutations', () => {
  let doc;
  let lead;
  let messenger;
  let brand;

  beforeEach(async () => {
    // Creating test data
    const form = await formFactory();

    brand = await brandFactory();
    lead = await integrationFactory({
      formId: form._id,
      kind: 'lead',
      brandId: brand._id
    });
    messenger = await integrationFactory({
      kind: 'messenger',
      brandId: brand._id
    });

    doc = {
      name: 'name',
      messengerId: messenger._id,
      leadIds: [lead._id],
      kbTopicId: 'kbTopicId'
    };
  });

  afterEach(async () => {
    // Clearing test data
    await Users.deleteMany({});
    await Scripts.deleteMany({});
    await Integrations.deleteMany({});
    await Forms.deleteMany({});
    await Brands.deleteMany({});
  });

  const commonParamDefs = `
    $name: String!
    $messengerId: String
    $kbTopicId: String
    $leadIds: [String]
  `;

  const commonParams = `
    name: $name
    messengerId: $messengerId
    kbTopicId: $kbTopicId
    leadIds: $leadIds
  `;

  test('scriptsAdd', async () => {
    const mutation = `
      mutation scriptsAdd(${commonParamDefs}) {
        scriptsAdd(${commonParams}) {
          name
          messengerId
          leadIds
          kbTopicId
        }
      }
    `;

    const script = await graphqlRequest(mutation, 'scriptsAdd', doc);

    expect(script.name).toBe(doc.name);
    expect(script.messengerId).toBe(doc.messengerId);
    expect(script.leadIds[0]).toBe(doc.leadIds[0]);
    expect(script.kbTopicId).toBe(doc.kbTopicId);
  });

  test('scriptsEdit', async () => {
    const mutation = `
      mutation scriptsEdit($_id: String! ${commonParamDefs}){
        scriptsEdit(_id: $_id ${commonParams}) {
          _id
          name
          messengerId
          leadIds
          kbTopicId
        }
      }
    `;

    const newScript = await Scripts.create(doc);
    const integration = (messenger = await integrationFactory({
      kind: 'messenger',
      brandId: brand._id
    }));

    const updateDoc = {
      name: 'name_updated',
      messengerId: integration._id,
      leadIds: [lead._id],
      kbTopicId: 'kbTopicId_updated'
    };

    const script = await graphqlRequest(mutation, 'scriptsEdit', {
      _id: newScript._id,
      ...updateDoc
    });

    expect(script.name).toBe(updateDoc.name);
    expect(script.messengerId).toBe(updateDoc.messengerId);
    expect(script.leadIds[0]).toBe(updateDoc.leadIds[0]);
    expect(script.kbTopicId).toBe(updateDoc.kbTopicId);
  });

  test('scriptsRemove', async () => {
    const mutation = `
      mutation scriptsRemove($_id: String!) {
        scriptsRemove(_id: $_id)
      }
    `;

    const script = await Scripts.create(doc);
    await graphqlRequest(mutation, 'scriptsRemove', { _id: script._id });

    expect(await Scripts.find({}).countDocuments()).toBe(0);
  });
});