src/app/routes/utils/fetchDataFromBFF/index.test.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Agent } from 'http';
import fetchDataFromBFF from '.';
import {
  ARTICLE_PAGE,
  CPS_ASSET,
  HOME_PAGE,
  MOST_READ_PAGE,
  TOPIC_PAGE,
} from '../pageTypes';
import * as fetchPageData from '../fetchPageData';

jest.mock('../fetchPageData', () =>
  jest.fn().mockImplementation(() => {
    return {
      json: { data: {} },
      status: 200,
    };
  }),
);

const mockAgent = { cert: 'cert', ca: 'ca', key: 'key' };

jest.mock('../../../../server/utilities/getAgent', () =>
  jest.fn(() => Promise.resolve(mockAgent as unknown as Agent)),
);

const localTimeout = 60000;

describe('Fetch Data from BFF', () => {
  beforeEach(() => {
    process.env.BFF_PATH = 'https://mock-bff-path';
  });
  afterEach(() => {
    jest.clearAllMocks();
    delete process.env.SIMORGH_APP_ENV;
    delete process.env.BFF_PATH;
  });

  describe('for an article', () => {
    const url = '/pidgin/articles/cwl08rd38p6o';

    it.each`
      environment | pathname                      | path                                                                                        | agent        | optHeaders
      ${'local'}  | ${url}                        | ${'http://localhost/pidgin/articles/cwl08rd38p6o'}                                          | ${undefined} | ${undefined}
      ${'local'}  | ${`${url}?renderer_env=test`} | ${'https://mock-bff-path/?id=cwl08rd38p6o&service=pidgin&pageType=article&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'local'}  | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=cwl08rd38p6o&service=pidgin&pageType=article&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'test'}   | ${url}                        | ${'https://mock-bff-path/?id=cwl08rd38p6o&service=pidgin&pageType=article&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'test'}   | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=cwl08rd38p6o&service=pidgin&pageType=article&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'live'}   | ${url}                        | ${'https://mock-bff-path/?id=cwl08rd38p6o&service=pidgin&pageType=article&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
    `(
      'when environment is $environment and pathname is $pathname, should invoke the BFF with the expected params',
      async ({ environment, path, agent, optHeaders, pathname }) => {
        const fetchPageDataSpy = jest.spyOn(fetchPageData, 'default');
        process.env.SIMORGH_APP_ENV = environment;

        await fetchDataFromBFF({
          pathname,
          pageType: ARTICLE_PAGE,
          service: 'pidgin',
        });

        expect(fetchPageDataSpy).toHaveBeenCalledWith({
          pageType: ARTICLE_PAGE,
          path,
          agent,
          optHeaders,
          timeout:
            environment === 'local' && !pathname.includes('renderer_env')
              ? localTimeout
              : undefined,
        });
      },
    );
  });

  describe('for a CPS Asset', () => {
    const url = '/pidgin/12345678';

    it.each`
      environment | pathname                      | path                                                                                              | agent        | optHeaders
      ${'local'}  | ${url}                        | ${'http://localhost/pidgin/12345678'}                                                             | ${undefined} | ${undefined}
      ${'local'}  | ${`${url}?renderer_env=test`} | ${'https://mock-bff-path/?id=pidgin%2F12345678&service=pidgin&pageType=cpsAsset&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'local'}  | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=pidgin%2F12345678&service=pidgin&pageType=cpsAsset&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'test'}   | ${url}                        | ${'https://mock-bff-path/?id=pidgin%2F12345678&service=pidgin&pageType=cpsAsset&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'test'}   | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=pidgin%2F12345678&service=pidgin&pageType=cpsAsset&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'live'}   | ${url}                        | ${'https://mock-bff-path/?id=pidgin%2F12345678&service=pidgin&pageType=cpsAsset&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
    `(
      'when environment is $environment and pathname is $pathname, should invoke the BFF with the expected params',
      async ({ environment, path, agent, optHeaders, pathname }) => {
        const fetchPageDataSpy = jest.spyOn(fetchPageData, 'default');
        process.env.SIMORGH_APP_ENV = environment;

        await fetchDataFromBFF({
          pathname,
          pageType: CPS_ASSET,
          service: 'pidgin',
        });

        expect(fetchPageDataSpy).toHaveBeenCalledWith({
          pageType: CPS_ASSET,
          path,
          agent,
          optHeaders,
          timeout:
            environment === 'local' && !pathname.includes('renderer_env')
              ? localTimeout
              : undefined,
        });
      },
    );
  });

  describe('for a topic page', () => {
    const url = '/pidgin/topics/c0000000000t';

    it.each`
      environment | pathname                      | path                                                                                      | agent        | optHeaders
      ${'local'}  | ${url}                        | ${'http://localhost/pidgin/topics/c0000000000t'}                                          | ${undefined} | ${undefined}
      ${'local'}  | ${`${url}?renderer_env=test`} | ${'https://mock-bff-path/?id=c0000000000t&service=pidgin&pageType=topic&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'local'}  | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=c0000000000t&service=pidgin&pageType=topic&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'test'}   | ${url}                        | ${'https://mock-bff-path/?id=c0000000000t&service=pidgin&pageType=topic&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'test'}   | ${`${url}?renderer_env=test`} | ${'https://mock-bff-path/?id=c0000000000t&service=pidgin&pageType=topic&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'test'}   | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=c0000000000t&service=pidgin&pageType=topic&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'live'}   | ${url}                        | ${'https://mock-bff-path/?id=c0000000000t&service=pidgin&pageType=topic&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
    `(
      'when environment is $environment and pathname is $pathname, should invoke the BFF with the expected params',
      async ({ environment, path, agent, optHeaders, pathname }) => {
        const fetchPageDataSpy = jest.spyOn(fetchPageData, 'default');
        process.env.SIMORGH_APP_ENV = environment;

        await fetchDataFromBFF({
          pathname,
          pageType: TOPIC_PAGE,
          service: 'pidgin',
        });

        expect(fetchPageDataSpy).toHaveBeenCalledWith({
          pageType: TOPIC_PAGE,
          path,
          agent,
          optHeaders,
          timeout:
            environment === 'local' && !pathname.includes('renderer_env')
              ? localTimeout
              : undefined,
        });
      },
    );
  });

  describe('for a most read page', () => {
    const url = '/pidgin/popular/read';

    it.each`
      environment | pathname                      | path                                                                                     | agent        | optHeaders
      ${'local'}  | ${url}                        | ${'http://localhost/pidgin/mostread'}                                                    | ${undefined} | ${undefined}
      ${'local'}  | ${`${url}?renderer_env=test`} | ${'https://mock-bff-path/?id=mostRead&service=pidgin&pageType=mostRead&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'local'}  | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=mostRead&service=pidgin&pageType=mostRead&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'test'}   | ${url}                        | ${'https://mock-bff-path/?id=mostRead&service=pidgin&pageType=mostRead&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'test'}   | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=mostRead&service=pidgin&pageType=mostRead&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'live'}   | ${url}                        | ${'https://mock-bff-path/?id=mostRead&service=pidgin&pageType=mostRead&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
    `(
      'when environment is $environment and pathname is $pathname, should invoke the BFF with the expected params',
      async ({ environment, path, agent, optHeaders, pathname }) => {
        const fetchPageDataSpy = jest.spyOn(fetchPageData, 'default');
        process.env.SIMORGH_APP_ENV = environment;

        await fetchDataFromBFF({
          pathname,
          pageType: MOST_READ_PAGE,
          service: 'pidgin',
        });

        expect(fetchPageDataSpy).toHaveBeenCalledWith({
          pageType: MOST_READ_PAGE,
          path,
          agent,
          optHeaders,
          timeout:
            environment === 'local' && !pathname.includes('renderer_env')
              ? localTimeout
              : undefined,
        });
      },
    );
  });

  describe('for a home page', () => {
    const url = '/pidgin';

    it.each`
      environment | pathname                      | path                                                                                     | agent        | optHeaders
      ${'local'}  | ${url}                        | ${'http://localhost/pidgin/tipohome'}                                                    | ${undefined} | ${undefined}
      ${'local'}  | ${`${url}?renderer_env=test`} | ${'https://mock-bff-path/?id=c93v2kkz841t&service=pidgin&pageType=home&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'local'}  | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=ck3yk9nz25qt&service=pidgin&pageType=home&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'test'}   | ${url}                        | ${'https://mock-bff-path/?id=c93v2kkz841t&service=pidgin&pageType=home&serviceEnv=test'} | ${mockAgent} | ${{ 'ctx-service-env': 'test' }}
      ${'test'}   | ${`${url}?renderer_env=live`} | ${'https://mock-bff-path/?id=ck3yk9nz25qt&service=pidgin&pageType=home&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
      ${'live'}   | ${url}                        | ${'https://mock-bff-path/?id=ck3yk9nz25qt&service=pidgin&pageType=home&serviceEnv=live'} | ${mockAgent} | ${{ 'ctx-service-env': 'live' }}
    `(
      'when environment is $environment and pathname is $pathname, should invoke the BFF with the expected params',
      async ({ environment, path, agent, optHeaders, pathname }) => {
        const fetchPageDataSpy = jest.spyOn(fetchPageData, 'default');
        process.env.SIMORGH_APP_ENV = environment;

        await fetchDataFromBFF({
          pathname,
          pageType: HOME_PAGE,
          service: 'pidgin',
        });

        expect(fetchPageDataSpy).toHaveBeenCalledWith({
          pageType: HOME_PAGE,
          path,
          agent,
          optHeaders,
          timeout:
            environment === 'local' && !pathname.includes('renderer_env')
              ? localTimeout
              : undefined,
        });
      },
    );
  });
});