import {ApiVersion, Session} from '@shopify/shopify-api';

import type {AdminApiContext} from '../clients';

import {TEST_SHOP} from './const';
import {mockExternalRequest} from './request-mock';

export function expectAdminApiClient(
  factory: () => Promise<{
    admin: AdminApiContext;
    expectedSession: Session;
    actualSession: Session;
  }>,
) {
  describe('Graphql client', () => {
    it('can perform requests', async () => {
      // GIVEN
      const {admin, actualSession} = await factory();
      await mockExternalRequest({
        request: new Request(
          `https://${TEST_SHOP}/admin/api/${ApiVersion.July25}/graphql.json`,
          {
            method: 'POST',
            headers: {'X-Shopify-Access-Token': actualSession.accessToken!},
          },
        ),
        response: new Response(
          JSON.stringify({data: {shop: {name: 'Test shop'}}}),
        ),
      });

      // WHEN
      const response = await admin.graphql('{ shop { name } }');

      // THEN
      expect(response.status).toEqual(200);
      expect(await response.json()).toEqual({
        data: {shop: {name: 'Test shop'}},
        headers: {'Content-Type': ['application/json']},
      });
    });

    it('returns a session object as part of the context', async () => {
      // GIVEN
      const {expectedSession, actualSession} = await factory();

      // THEN
      expect(expectedSession).toEqual(actualSession);
    });
  });
}
