qa-shadow-report
Version:
npm package that prints formatted test reports into a google sheet or csv file
171 lines (152 loc) • 5.74 kB
JavaScript
import { jest } from '@jest/globals';
// Mock dependencies directly instead of using jest.mock
const mockGetTabIdFromTitle = jest.fn();
const mockGetHeaderIndicatorsLength = jest.fn();
const mockInitializeReportColumnMetrics = jest.fn();
const mockFetchLastMonthTabValues = jest.fn();
const mockFindLongestHeaderWithinSeries = jest.fn();
const mockInitializeReportPayload = jest.fn();
const mockProcessSourceTabTitles = jest.fn();
// Mock the modules before imports
jest.mock('../google/sheetDataMethods/getSheetInfo.js', () => ({
getTabIdFromTitle: (...args) => mockGetTabIdFromTitle(...args),
}));
jest.mock('../sharedMethods/summaryHandler.js', () => ({
getHeaderIndicatorsLength: (...args) =>
mockGetHeaderIndicatorsLength(...args),
initializeReportColumnMetrics: (...args) =>
mockInitializeReportColumnMetrics(...args),
}));
jest.mock('./summaryGenerationHelpers.js', () => ({
fetchLastMonthTabValues: (...args) => mockFetchLastMonthTabValues(...args),
findLongestHeaderWithinSeries: (...args) =>
mockFindLongestHeaderWithinSeries(...args),
initializeReportPayload: (...args) => mockInitializeReportPayload(...args),
processSourceTabTitles: (...args) => mockProcessSourceTabTitles(...args),
}));
// Now import the actual module
import { constructPayloadForCopyPaste } from './buildSummary.js';
describe('Monthly Summary Generation', () => {
const mockDate = new Date('2024-03-20T15:30:45.123Z');
const mockSourceTabTitles = ['2024-02-15', '2024-02-01', '2024-02-28'];
const mockSortedTitles = ['2024-02-01', '2024-02-15', '2024-02-28'];
const mockDestinationTabTitle = 'Summary Mar 2024';
const mockTabId = 123;
const mockHeaderLength = 5;
const mockLongestHeader = 10;
const mockTabValues = {
'2024-02-01': [
['Test Suite 1', 'Test Case 1', 'passed', 100],
['Test Suite 1', 'Test Case 2', 'failed', 200],
],
'2024-02-15': [
['Test Suite 2', 'Test Case 3', 'passed', 150],
['Test Suite 2', 'Test Case 4', 'skipped', 0],
],
'2024-02-28': [
['Test Suite 3', 'Test Case 5', 'passed', 120],
['Test Suite 3', 'Test Case 6', 'failed', 180],
],
};
const mockReportPayload = {
bodyPayload: [],
headerPayload: [],
summaryHeaderStylePayload: [],
summaryGridStyles: [],
};
const mockColumnMetrics = {
nextAvailableColumn: 0,
defaultHeaderMetricsDestinationColumn: 0,
longestHeaderEnd: 0,
defaultHeaderMetricsDestinationColumnEnd: 5,
};
beforeEach(() => {
// Set up fake timers like in dateFormatting.test.js
jest.useFakeTimers();
jest.setSystemTime(mockDate);
// Clear all mocks
jest.clearAllMocks();
// Set up mock implementations
mockGetHeaderIndicatorsLength.mockReturnValue(mockHeaderLength);
mockInitializeReportColumnMetrics.mockReturnValue(mockColumnMetrics);
mockGetTabIdFromTitle.mockResolvedValue(mockTabId);
mockFetchLastMonthTabValues.mockResolvedValue(mockTabValues);
mockInitializeReportPayload.mockReturnValue(mockReportPayload);
mockFindLongestHeaderWithinSeries.mockResolvedValue(mockLongestHeader);
mockProcessSourceTabTitles.mockResolvedValue();
// Mock console.error to avoid test noise
console.error = jest.fn();
});
afterEach(() => {
jest.useRealTimers();
});
describe('constructPayloadForCopyPaste', () => {
it.skip('should construct payload successfully with valid inputs and sort tab titles', async () => {
// Act
const result = await constructPayloadForCopyPaste(
mockSourceTabTitles,
mockDestinationTabTitle
);
// Assert
expect(result).toEqual(mockReportPayload);
expect(mockGetHeaderIndicatorsLength).toHaveBeenCalled();
expect(mockFetchLastMonthTabValues).toHaveBeenCalledWith(
mockSortedTitles
);
expect(mockInitializeReportPayload).toHaveBeenCalled();
expect(mockInitializeReportColumnMetrics).toHaveBeenCalledWith(
mockHeaderLength
);
expect(mockGetTabIdFromTitle).toHaveBeenCalledWith(
mockDestinationTabTitle
);
expect(mockFindLongestHeaderWithinSeries).toHaveBeenCalledWith(
mockSortedTitles,
mockTabValues,
mockColumnMetrics
);
expect(mockProcessSourceTabTitles).toHaveBeenCalledWith(
mockSortedTitles,
mockTabId,
mockReportPayload,
{ longestHeaderEnd: mockLongestHeader },
mockDestinationTabTitle,
mockHeaderLength
);
});
it.skip('should handle empty source tab titles', async () => {
// Act
const result = await constructPayloadForCopyPaste(
[],
mockDestinationTabTitle
);
// Assert
expect(result).toEqual(mockReportPayload);
expect(mockGetHeaderIndicatorsLength).toHaveBeenCalled();
expect(mockFetchLastMonthTabValues).toHaveBeenCalledWith([]);
expect(mockInitializeReportPayload).toHaveBeenCalled();
expect(mockInitializeReportColumnMetrics).toHaveBeenCalledWith(
mockHeaderLength
);
expect(mockGetTabIdFromTitle).toHaveBeenCalledWith(
mockDestinationTabTitle
);
});
it.skip('should handle errors during payload construction', async () => {
// Arrange
const testError = new Error('Test error');
mockGetTabIdFromTitle.mockRejectedValueOnce(testError);
// Act & Assert
await expect(
constructPayloadForCopyPaste(
mockSourceTabTitles,
mockDestinationTabTitle
)
).rejects.toThrow('Error building copy-paste payload.');
expect(console.error).toHaveBeenCalledWith(
'Error building copy-paste payload:',
testError
);
});
});
});