department-of-veterans-affairs/vets-website

View on GitHub
src/applications/check-in/travel-claim/pages/complete/Complete.unit.spec.jsx

Summary

Maintainability
A
0 mins
Test Coverage
/* eslint-disable camelcase */
import React from 'react';
import { expect } from 'chai';
import { render } from '@testing-library/react';
import MockDate from 'mockdate';
import sinon from 'sinon';
import Complete from './index';
import { setupI18n, teardownI18n } from '../../../utils/i18n/i18n';
import CheckInProvider from '../../../tests/unit/utils/CheckInProvider';
import * as usePostTravelOnlyClaimModule from '../../../hooks/usePostTravelOnlyClaim';
import * as useUpdateErrorModule from '../../../hooks/useUpdateError';
import * as useStorageModule from '../../../hooks/useStorage';
import { api } from '../../../api';

describe('Check-in experience', () => {
  beforeEach(() => {
    setupI18n();
  });
  afterEach(() => {
    teardownI18n();
  });
  describe('travel-claim components', () => {
    describe('Complete', () => {
      const sandbox = sinon.createSandbox();
      const { v2 } = api;
      const store = {
        appointmentToFile: {
          startTime: '2024-03-12T10:18:02.422Z',
          timezone: 'America/Los_Angeles',
        },
        travelAddress: 'yes',
        travelVehicle: 'yes',
        travelReview: 'yes',
      };
      afterEach(() => {
        sandbox.restore();
        MockDate.reset();
      });
      it('renders loading while loading', () => {
        sandbox
          .stub(usePostTravelOnlyClaimModule, 'usePostTravelOnlyClaim')
          .returns({
            travelPayClaimError: false,
            isLoading: true,
          });
        const { getByTestId } = render(
          <CheckInProvider>
            <Complete />
          </CheckInProvider>,
        );
        expect(getByTestId('loading-indicator')).to.exist;
      });
      it('renders page when complete', () => {
        sandbox
          .stub(usePostTravelOnlyClaimModule, 'usePostTravelOnlyClaim')
          .returns({
            travelPayClaimError: false,
            isLoading: false,
          });
        const { getByTestId } = render(
          <CheckInProvider store={store}>
            <Complete />
          </CheckInProvider>,
        );
        expect(getByTestId('header')).to.exist;
        expect(getByTestId('travel-info-external-link')).to.exist;
        expect(getByTestId('travel-complete-content')).to.exist;
      });
      it('calls travel API via hook', () => {
        sandbox.stub(v2, 'postTravelOnlyClaim').resolves({});
        render(
          <CheckInProvider store={store}>
            <Complete />
          </CheckInProvider>,
        );
        sandbox.assert.calledOnce(v2.postTravelOnlyClaim);
      });
      it('dispatches error on API error', () => {
        const updateErrorSpy = sinon.spy();
        sandbox.stub(useUpdateErrorModule, 'useUpdateError').returns({
          updateError: updateErrorSpy,
        });
        sandbox
          .stub(usePostTravelOnlyClaimModule, 'usePostTravelOnlyClaim')
          .returns({
            travelPayClaimError: true,
            isLoading: false,
          });
        render(
          <CheckInProvider store={store}>
            <Complete />
          </CheckInProvider>,
        );
        expect(updateErrorSpy.calledOnce).to.be.true;
      });
      it('redirects to intro if questions are skipped', () => {
        const skippedQuestionsStore = {
          appointmentToFile: {
            startTime: '2024-03-12T10:18:02.422Z',
            timezone: 'America/Los_Angeles',
          },
          travelAddress: '',
          travelVehicle: '',
          travelReview: '',
        };
        const push = sinon.spy();
        render(
          <CheckInProvider store={skippedQuestionsStore} router={{ push }}>
            <Complete />
          </CheckInProvider>,
        );
        expect(push.calledOnce).to.be.true;
      });
      it('does not call API on reload or already filed', () => {
        MockDate.set('2024-03-12T10:18:02.422Z');
        sandbox.stub(useStorageModule, 'useStorage').returns({
          getTravelPaySent: () => '2024-03-12T10:18:02.422Z',
        });
        sandbox.stub(v2, 'postTravelOnlyClaim').resolves({});
        render(
          <CheckInProvider store={store}>
            <Complete />
          </CheckInProvider>,
        );
        sandbox.assert.notCalled(v2.postTravelOnlyClaim);
      });
      it('does call API if filed before today', () => {
        sandbox.stub(useStorageModule, 'useStorage').returns({
          getTravelPaySent: () => '2024-03-10T15:18:02.422Z',
        });
        sandbox.stub(v2, 'postTravelOnlyClaim').resolves({});
        render(
          <CheckInProvider store={store}>
            <Complete />
          </CheckInProvider>,
        );
        sandbox.assert.calledOnce(v2.postTravelOnlyClaim);
      });
    });
  });
});