refactor: update imports to use ES module syntax and improve test structure (#1350)

- Changed import statements across multiple files to use the .js extension for ES module compatibility.
- Refactored test files to utilize jest's unstable_mockModule for mocking core actions.
- Removed unnecessary spy instances in tests, replacing them with direct mocked function calls.
- Updated TypeScript configuration to target ES2022 and use NodeNext module resolution.
- Removed the tsconfig.spec.json file and adjusted the main tsconfig.json to exclude test files.
This commit is contained in:
Chiranjib Swain
2026-07-23 15:39:34 -05:00
committed by GitHub
parent 1e223db275
commit eaf9131fae
122 changed files with 67910 additions and 55239 deletions
+8 -7
View File
@@ -1,10 +1,11 @@
import {Issue} from '../src/classes/issue';
import {IIssue} from '../src/interfaces/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {StateMock} from './classes/state-mock';
import {beforeEach, describe, expect, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssue} from '../src/interfaces/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {StateMock} from './classes/state-mock.js';
let issuesProcessorBuilder: IssuesProcessorBuilder;
let issuesProcessor: IssuesProcessorMock;
+7 -6
View File
@@ -1,9 +1,10 @@
import {Issue} from '../src/classes/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {beforeEach, describe, expect, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
interface ITestData {
id: number;
+7 -7
View File
@@ -1,10 +1,10 @@
import {Issue} from '../../src/classes/issue';
import {IssuesProcessor} from '../../src/classes/issues-processor';
import {IComment} from '../../src/interfaces/comment';
import {IIssuesProcessorOptions} from '../../src/interfaces/issues-processor-options';
import {IPullRequest} from '../../src/interfaces/pull-request';
import {IState} from '../../src/interfaces/state/state';
import {IIssueEvent} from '../../src/interfaces/issue-event';
import {Issue} from '../../src/classes/issue.js';
import {IssuesProcessor} from '../../src/classes/issues-processor.js';
import {IComment} from '../../src/interfaces/comment.js';
import {IIssuesProcessorOptions} from '../../src/interfaces/issues-processor-options.js';
import {IPullRequest} from '../../src/interfaces/pull-request.js';
import {IState} from '../../src/interfaces/state/state.js';
import {IIssueEvent} from '../../src/interfaces/issue-event.js';
export class IssuesProcessorMock extends IssuesProcessor {
constructor(
+2 -2
View File
@@ -1,5 +1,5 @@
import {IState} from '../../src/interfaces/state/state';
import {IIssue} from '../../src/interfaces/issue';
import {IState} from '../../src/interfaces/state/state.js';
import {IIssue} from '../../src/interfaces/issue.js';
export class StateMock implements IState {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -1,4 +1,4 @@
import {IIssuesProcessorOptions} from '../../src/interfaces/issues-processor-options';
import {IIssuesProcessorOptions} from '../../src/interfaces/issues-processor-options.js';
// Default options for use in tests.
// Mirrors the defaults defined in action.yml
+9 -8
View File
@@ -1,11 +1,12 @@
import {Issue} from '../src/classes/issue';
import {IIssue} from '../src/interfaces/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IPullRequest} from '../src/interfaces/pull-request';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {beforeEach, describe, expect, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssue} from '../src/interfaces/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IPullRequest} from '../src/interfaces/pull-request.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
let issuesProcessorBuilder: IssuesProcessorBuilder;
let issuesProcessor: IssuesProcessorMock;
+1 -1
View File
@@ -1,4 +1,4 @@
import {IIssue} from '../../src/interfaces/issue';
import {IIssue} from '../../src/interfaces/issue.js';
export function generateIIssue(
partialIssue?: Readonly<Partial<IIssue>>
+4 -4
View File
@@ -1,7 +1,7 @@
import {Issue} from '../../src/classes/issue';
import {IUserAssignee} from '../../src/interfaces/assignee';
import {IIssuesProcessorOptions} from '../../src/interfaces/issues-processor-options';
import {IsoDateString} from '../../src/types/iso-date-string';
import {Issue} from '../../src/classes/issue.js';
import {IUserAssignee} from '../../src/interfaces/assignee.js';
import {IIssuesProcessorOptions} from '../../src/interfaces/issues-processor-options.js';
import {IsoDateString} from '../../src/types/iso-date-string.js';
export function generateIssue(
options: IIssuesProcessorOptions,
+8 -7
View File
@@ -1,11 +1,12 @@
import {jest, expect, it, test} from '@jest/globals';
import * as github from '@actions/github';
import {Issue} from '../src/classes/issue';
import {IComment} from '../src/interfaces/comment';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {Issue} from '../src/classes/issue.js';
import {IComment} from '../src/interfaces/comment.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
test('processing an issue with no label will make it stale and close it, if it is old enough only if days-before-close is set to 0', async () => {
const opts: IIssuesProcessorOptions = {
+7 -6
View File
@@ -1,9 +1,10 @@
import {Issue} from '../src/classes/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {beforeEach, describe, expect, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
interface ITestData {
isPullRequest: boolean;
+7 -6
View File
@@ -1,9 +1,10 @@
import {Issue} from '../src/classes/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {describe, expect, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
describe('only-issue-types option', () => {
test('should only process issues with allowed type', async () => {
+8 -7
View File
@@ -1,10 +1,11 @@
import {Issue} from '../src/classes/issue';
import {IIssue} from '../src/interfaces/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {beforeEach, describe, expect, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssue} from '../src/interfaces/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
let issuesProcessorBuilder: IssuesProcessorBuilder;
let issuesProcessor: IssuesProcessorMock;
+8 -7
View File
@@ -1,10 +1,11 @@
import {Issue} from '../src/classes/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IsoDateString} from '../src/types/iso-date-string';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock, StateMock} from './classes/state-mock';
import {beforeEach, describe, expect, it, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IsoDateString} from '../src/types/iso-date-string.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock, StateMock} from './classes/state-mock.js';
describe('operations-per-run option', (): void => {
let sut: SUT;
@@ -1,12 +1,13 @@
import {Issue} from '../src/classes/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {IState} from '../src/interfaces/state/state';
import {IIssueEvent} from '../src/interfaces/issue-event';
import {IssuesProcessor} from '../src/classes/issues-processor';
import {afterEach, beforeEach, describe, expect, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
import {IState} from '../src/interfaces/state/state.js';
import {IIssueEvent} from '../src/interfaces/issue-event.js';
import {IssuesProcessor} from '../src/classes/issues-processor.js';
describe('remove-stale-when-updated with stale label events', (): void => {
const markedStaleOn = '2025-01-01T00:00:00Z';
+9 -8
View File
@@ -1,11 +1,12 @@
import {Issue} from '../src/classes/issue';
import {IIssue} from '../src/interfaces/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {ILabel} from '../src/interfaces/label';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {beforeEach, describe, expect, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssue} from '../src/interfaces/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {ILabel} from '../src/interfaces/label.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
let issuesProcessorBuilder: IssuesProcessorBuilder;
let issuesProcessor: IssuesProcessorMock;
+48 -29
View File
@@ -1,12 +1,31 @@
import {IStateStorage} from '../src/interfaces/state/state-storage';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {Issue} from '../src/classes/issue';
import {generateIssue} from './functions/generate-issue';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {IssueID, State} from '../src/classes/state/state';
import {IState} from '../src/interfaces/state/state';
import * as core from '@actions/core';
import {jest, afterEach, describe, expect, it} from '@jest/globals';
import type {IStateStorage} from '../src/interfaces/state/state-storage.js';
import type {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {Issue} from '../src/classes/issue.js';
import {generateIssue} from './functions/generate-issue.js';
import type {IState} from '../src/interfaces/state/state.js';
jest.unstable_mockModule('@actions/core', () => ({
debug: jest.fn(),
info: jest.fn(),
warning: jest.fn(),
error: jest.fn(),
setFailed: jest.fn(),
getInput: jest.fn(),
group: jest
.fn()
.mockImplementation((...args: unknown[]) =>
(args[1] as () => Promise<unknown>)()
)
}));
const {State} = await import('../src/classes/state/state.js');
const {IssuesProcessorMock} =
await import('./classes/issues-processor-mock.js');
const core = await import('@actions/core');
type IssueID = number;
const stateStorage: IStateStorage = {
restore(): Promise<string> {
@@ -21,17 +40,7 @@ const getProcessedIssuesIDs = (state: IState): Set<IssueID> =>
(state as unknown as {processedIssuesIDs: Set<IssueID>}).processedIssuesIDs;
describe('state', (): void => {
let debugSpy: jest.SpyInstance;
let infoSpy: jest.SpyInstance;
let warningSpy: jest.SpyInstance;
beforeEach(() => {
debugSpy = jest.spyOn(core, 'debug');
infoSpy = jest.spyOn(core, 'info');
warningSpy = jest.spyOn(core, 'warning');
});
afterEach(() => {
jest.resetAllMocks();
jest.clearAllMocks();
});
@@ -85,8 +94,10 @@ describe('state', (): void => {
expect(addIssueToProcessedSpy).toHaveBeenCalledTimes(1);
expect(addIssueToProcessedSpy).toHaveBeenCalledWith(testIssue1);
expect(debugSpy).toHaveBeenCalledWith('state: reset');
expect(debugSpy).toHaveBeenCalledWith('state: mark 1 as processed');
expect(jest.mocked(core.debug)).toHaveBeenCalledWith('state: reset');
expect(jest.mocked(core.debug)).toHaveBeenCalledWith(
'state: mark 1 as processed'
);
});
it('issueProcessor should skip the issue marked as proceeded', async () => {
@@ -109,7 +120,7 @@ describe('state', (): void => {
const TestIssueList: Issue[] = [testIssue1, testIssue2];
const state = new State(stateStorage, opts);
state.addIssueToProcessed(testIssue1);
debugSpy.mockClear();
jest.mocked(core.debug).mockClear();
const addIssueToProcessedSpy = jest.spyOn(state, 'addIssueToProcessed');
const isIssueProcessedSpy = jest.spyOn(state, 'isIssueProcessed');
const processor = new IssuesProcessorMock(
@@ -129,8 +140,10 @@ describe('state', (): void => {
expect(processor.staleIssues.length).toStrictEqual(1);
expect(processor.closedIssues.length).toStrictEqual(1);
expect(debugSpy).toHaveBeenCalledWith('state: reset');
expect(debugSpy).toHaveBeenCalledWith('state: mark 2 as processed');
expect(jest.mocked(core.debug)).toHaveBeenCalledWith('state: reset');
expect(jest.mocked(core.debug)).toHaveBeenCalledWith(
'state: mark 2 as processed'
);
});
it('state should not be reset if not all issues are proceeded', async () => {
@@ -164,12 +177,14 @@ describe('state', (): void => {
await processor.processIssues(1);
// make sure not all issues are proceeded
expect(warningSpy.mock.calls[2][0]).toContain(
expect(jest.mocked(core.warning).mock.calls[2][0]).toContain(
'No more operations left! Exiting...'
);
expect(resetSpy).toHaveBeenCalledTimes(0);
expect(debugSpy).toHaveBeenCalledWith('state: mark 1 as processed');
expect(jest.mocked(core.debug)).toHaveBeenCalledWith(
'state: mark 1 as processed'
);
});
it('state should be reset if all issues are proceeded', async () => {
@@ -202,12 +217,16 @@ describe('state', (): void => {
await processor.processIssues(1);
// make sure all issues are proceeded
expect(infoSpy.mock.calls[71][0]).toContain(
expect(jest.mocked(core.info).mock.calls[71][0]).toContain(
'No more issues found to process. Exiting...'
);
expect(resetSpy).toHaveBeenCalledTimes(1);
expect(debugSpy).toHaveBeenCalledWith('state: mark 1 as processed');
expect(debugSpy).toHaveBeenCalledWith('state: mark 2 as processed');
expect(jest.mocked(core.debug)).toHaveBeenCalledWith(
'state: mark 1 as processed'
);
expect(jest.mocked(core.debug)).toHaveBeenCalledWith(
'state: mark 2 as processed'
);
});
});
+8 -7
View File
@@ -1,10 +1,11 @@
import {Issue} from '../src/classes/issue';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
import {IsoDateString} from '../src/types/iso-date-string';
import {IssuesProcessorMock} from './classes/issues-processor-mock';
import {DefaultProcessorOptions} from './constants/default-processor-options';
import {generateIssue} from './functions/generate-issue';
import {alwaysFalseStateMock} from './classes/state-mock';
import {beforeEach, describe, expect, it, test} from '@jest/globals';
import {Issue} from '../src/classes/issue.js';
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options.js';
import {IsoDateString} from '../src/types/iso-date-string.js';
import {IssuesProcessorMock} from './classes/issues-processor-mock.js';
import {DefaultProcessorOptions} from './constants/default-processor-options.js';
import {generateIssue} from './functions/generate-issue.js';
import {alwaysFalseStateMock} from './classes/state-mock.js';
describe('ignore-updates options', (): void => {
let sut: SUT;