import InstitutionalReducer, {
  fetchHistoricalReports,
  getComplianceClientId,
  getComplianceProjectId,
  getComplianceTenantSubdomain,
  getComplianceHistoricalReports,
  getComplianceReportsInProgress,
  getInstitutionalConnectRequests,
  complianceActivated,
  getComplianceReportsInProgressByAddress,
  generateComplianceReport,
} from './institutional';

const mockSyncReportsInProgress = jest.fn();
const mockGenerateComplianceReport = jest.fn();

jest.mock('../../store/institutional/institution-background', () => ({
  mmiActionsFactory: () => ({
    generateComplianceReport: mockGenerateComplianceReport,
    getComplianceHistoricalReportsByAddress: jest.fn(),
    syncReportsInProgress: mockSyncReportsInProgress,
  }),
}));

describe('Institutional Duck', () => {
  const initState = {
    historicalReports: {},
    complianceProjectId: '',
    complianceClientId: '',
    reportsInProgress: {},
  };

  describe('InstitutionalReducer', () => {
    it('should initialize state', () => {
      expect(InstitutionalReducer(undefined, {})).toStrictEqual(initState);
    });

    it('should correctly return all getters values', async () => {
      const state = {
        metamask: {
          institutionalFeatures: {
            complianceProjectId: 'complianceProjectId',
            complianceClientId: 'complianceClientId',
            complianceTenantSubdomain: 'subdomain',
            reportsInProgress: { id: [{ reportId: 'id' }] },
            connectRequests: [{ id: 'id' }],
            historicalReports: { id: [{ reportId: 'id' }] },
          },
        },
      };
      expect(getComplianceProjectId(state)).toBe('complianceProjectId');
      expect(getComplianceClientId(state)).toBe('complianceClientId');
      expect(getComplianceTenantSubdomain(state)).toBe('subdomain');
      expect(getComplianceHistoricalReports(state).id[0].reportId).toBe('id');
      expect(getComplianceReportsInProgress(state).id).toHaveLength(1);
      expect(getInstitutionalConnectRequests(state)).toHaveLength(1);
      expect(complianceActivated(state)).toBe(true);
      expect(getComplianceReportsInProgressByAddress('id')(state)).toHaveLength(
        1,
      );
      await fetchHistoricalReports('0xAddress', 'projectId')(
        jest.fn().mockReturnValue({ items: [{ status: 'test' }] }),
        () => state,
      );
      expect(mockSyncReportsInProgress).toHaveBeenCalled();
      await generateComplianceReport('0xAddress')(jest.fn(), () => state);
      expect(mockGenerateComplianceReport).toHaveBeenCalled();
    });
  });
});