Skip to content

Commit

Permalink
Merge pull request #872 from Green-Software-Foundation/if-check-error
Browse files Browse the repository at this point in the history
Update If-check to support CI/CD
  • Loading branch information
narekhovhannisyan authored Jul 2, 2024
2 parents f587f19 + bddf47e commit 9991d09
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 45 deletions.
2 changes: 1 addition & 1 deletion src/__tests__/unit/util/helpers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -678,7 +678,7 @@ description: mock-description
expect.assertions(2);

expect(logSpy).toHaveBeenCalledWith(
`if-check could not verify ${mockFilename}. The re-executed file does not match the original.\n`
`if-check could not verify ${mockFilename}. The re-executed file does not match the original.\n`
);

expect(logSpy).toHaveBeenCalledWith('mock error message');
Expand Down
70 changes: 32 additions & 38 deletions src/__tests__/unit/util/npm.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import * as fs from 'fs/promises';
import * as fsSync from 'fs';
import * as path from 'path';

jest.mock('fs/promises', () => require('../../../__mocks__/fs'));
Expand All @@ -15,6 +14,29 @@ jest.mock('../../../util/logger', () => ({
},
}));

jest.mock('../../../util/helpers', () => {
const originalModule = jest.requireActual('../../../util/helpers');
return {
...originalModule,
execPromise: async (param: any) => {
switch (process.env.NPM_INSTALL) {
case 'true':
expect(param).toEqual('npm install @grnsft/[email protected]');
break;
case 'npm init -y':
expect(param).toEqual('npm init -y');
break;
case 'if-check':
expect(param).toEqual(
"npm run if-env -- -m ./src/__mocks__/mock-manifest.yaml && npm run if-run -- -m ./src/__mocks__/mock-manifest.yaml -o src/__mocks__/re-mock-manifest && node -p 'Boolean(process.stdout.isTTY)' | npm run if-diff -- -s src/__mocks__/re-mock-manifest.yaml -t ./src/__mocks__/mock-manifest.yaml"
);
break;
}
return;
},
};
});

import {
installDependencies,
initPackageJsonIfNotExists,
Expand All @@ -31,33 +53,17 @@ import {ManifestPlugin} from '../../../types/npm';
const {INITIALIZING_PACKAGE_JSON, INSTALLING_NPM_PACKAGES} = STRINGS;

describe('util/npm: ', () => {
const helpers = require('../../../util/helpers');
const folderPath = path.resolve(__dirname, 'npm-test');

beforeAll(() => {
if (!fsSync.existsSync(folderPath)) {
fsSync.mkdirSync(folderPath, {recursive: true});
}
});

afterAll(() => {
if (fsSync.existsSync(folderPath)) {
fsSync.rmSync(folderPath, {recursive: true, force: true});
}
});

describe('initPackageJsonIfNotExists(): ', () => {
it('initializes package.json if it does not exist.', async () => {
const spyExecPromise = jest.spyOn(helpers, 'execPromise');
process.env.NPM_INSTALL = 'npm init -y';
isFileExists('true');

await initPackageJsonIfNotExists(folderPath);

expect.assertions(2);
expect(mockInfo).toHaveBeenCalledWith(INITIALIZING_PACKAGE_JSON);
expect(spyExecPromise).toHaveBeenCalledWith('npm init -y', {
cwd: folderPath,
});
});

it('returns the package.json path if it exists.', async () => {
Expand All @@ -66,7 +72,7 @@ describe('util/npm: ', () => {

const result = await initPackageJsonIfNotExists(folderPath);

expect.assertions(1);
expect.assertions(2);
expect(result).toBe(packageJsonPath);
});
});
Expand All @@ -77,17 +83,11 @@ describe('util/npm: ', () => {
};

it('calls execPromise with the correct arguments.', async () => {
const spyExecPromise = jest.spyOn(helpers, 'execPromise');
const formattedDependencies = ['@grnsft/[email protected]'];
process.env.NPM_INSTALL = 'true';
expect.assertions(1);

await installDependencies(folderPath, dependencies);

expect(spyExecPromise).toHaveBeenCalledWith(
`npm install ${formattedDependencies.join(' ')}`,
{cwd: folderPath}
);
}, 30000);
});

it('logs the installation message.', async () => {
const dependencies = {
Expand All @@ -96,7 +96,7 @@ describe('util/npm: ', () => {

await installDependencies(folderPath, dependencies);

expect.assertions(1);
expect.assertions(2);
expect(mockInfo).toHaveBeenCalledWith(INSTALLING_NPM_PACKAGES);
});
});
Expand Down Expand Up @@ -250,22 +250,16 @@ describe('util/npm: ', () => {

describe('executeCommands(): ', () => {
it('successfully executes with correct commands.', async () => {
process.env.NPM_INSTALL = 'if-check';
const manifest = './src/__mocks__/mock-manifest.yaml';
const reManifest = 'src/__mocks__/re-mock-manifest.yaml';
const logSpy = jest.spyOn(global.console, 'log');

jest.spyOn(fs, 'unlink').mockResolvedValue();

await executeCommands(manifest, false);

expect.assertions(1);
expect.assertions(2);
expect(logSpy).toHaveBeenCalledWith(
'if-check successfully verified mock-manifest.yaml\n'
'if-check successfully verified mock-manifest.yaml\n'
);

const packageJsonPath = 'src/__mocks__/package.json';
fsSync.unlink(path.resolve(process.cwd(), reManifest), () => {});
fsSync.unlink(path.resolve(process.cwd(), packageJsonPath), () => {});
}, 70000);
});
});
});
24 changes: 21 additions & 3 deletions src/check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,13 @@ import {getYamlFiles, removeFileIfExists} from './util/fs';
import {STRINGS} from './config';
import {executeCommands} from './util/npm';

const {CHECKING, DIRECTORY_YAML_FILES_NOT_FOUND} = STRINGS;
const {
CHECKING,
DIRECTORY_YAML_FILES_NOT_FOUND,
IF_CHECK_VERIFICATION_FAILURES,
IF_CHECK_SUMMARY_LOG,
IF_CHECK_EXECUTING,
} = STRINGS;

const IfCheck = async () => {
const commandArgs = await parseIfCheckArgs();
Expand All @@ -35,6 +41,7 @@ const IfCheck = async () => {
await removeFileIfExists(executedFile);
}
} else {
const failedLogs = {count: 0, message: ''};
const directory = commandArgs.directory;
const files = await getYamlFiles(directory!);

Expand All @@ -45,7 +52,7 @@ const IfCheck = async () => {

for await (const file of files) {
const fileName = path.basename(file);
console.log(fileName);
console.log(IF_CHECK_EXECUTING(fileName));

try {
await executeCommands(file, true);
Expand All @@ -55,11 +62,22 @@ const IfCheck = async () => {
.replace(fileName, `re-${fileName}`)
.replace('yml', 'yaml');

logStdoutFailMessage(error, fileName);
const failedFilesLog = logStdoutFailMessage(error, fileName);
failedLogs.message = failedLogs.message.concat(failedFilesLog);
failedLogs.count++;

await removeFileIfExists(executedFile);
}
}

if (failedLogs.count > 0) {
const passedFilesCount = files.length - failedLogs.count;

console.log(IF_CHECK_VERIFICATION_FAILURES);
console.log(failedLogs.message);
console.log(IF_CHECK_SUMMARY_LOG(passedFilesCount, files.length));
process.exit(1);
}
}
};

Expand Down
11 changes: 9 additions & 2 deletions src/config/strings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,17 @@ ${error}`,
DIRECTORY_NOT_FOUND: 'Directory not found.',
DIRECTORY_YAML_FILES_NOT_FOUND:
'The directory does not contain any YAML/YML files.\n',
IF_CHECK_EXECUTING: (filename: string) => `Executing \`${filename}\``,
IF_CHECK_VERIFICATION_FAILURES:
'---------\nif-check verification failures:\n',
IF_CHECK_FAILED: (filename: string) =>
`if-check could not verify ${filename}. The re-executed file does not match the original.\n`,
`if-check could not verify ${filename}. The re-executed file does not match the original.\n`,
IF_CHECK_VERIFIED: (filename: string) =>
`if-check successfully verified ${filename}\n`,
`✔ if-check successfully verified ${filename}\n`,
IF_CHECK_SUMMARY_ERROR_MESSAGE: (filename: string, message: string) =>
`Executing \`${filename}\`\n✖ ${message}`,
IF_CHECK_SUMMARY_LOG: (passedCount: number, totalCount: number) =>
`---------\nCheck summary:\n${passedCount} of ${totalCount} files are passed.\n`,
ZERO_DIVISION: (moduleName: string, index: number) =>
`-- SKIPPING -- DivisionByZero: you are attempting to divide by zero in ${moduleName} plugin : inputs[${index}]\n`,
};
4 changes: 3 additions & 1 deletion src/util/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ const {
FAILURE_MESSAGE_DEPENDENCIES,
} = IF_ENV;

const {UNSUPPORTED_ERROR, IF_CHECK_FAILED} = STRINGS;
const {UNSUPPORTED_ERROR, IF_CHECK_FAILED, IF_CHECK_SUMMARY_ERROR_MESSAGE} =
STRINGS;
const {MissingPluginDependenciesError} = ERRORS;

/**
Expand Down Expand Up @@ -280,4 +281,5 @@ export const logStdoutFailMessage = (error: any, fileName: string) => {
const failMessage = logs[logs.length - 1];

console.log(failMessage);
return IF_CHECK_SUMMARY_ERROR_MESSAGE(fileName, failMessage);
};

0 comments on commit 9991d09

Please sign in to comment.