Skip to content

Commit

Permalink
devex: added some tests to cover several additional logic branches to…
Browse files Browse the repository at this point in the history
… bring branch coverage to 100
  • Loading branch information
jimlerza committed Dec 17, 2024
1 parent 3abbe0c commit 77ee254
Show file tree
Hide file tree
Showing 4 changed files with 193 additions and 78 deletions.
2 changes: 1 addition & 1 deletion scripts/elasticsearch/check-reindex-complete.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ export const areAllReindexTasksFinished = async ({
(task: { action: string }) =>
task.action === 'indices:data/write/reindex',
);
const numReindexTasks = reindexTasks ? reindexTasks.length : 0;
const numReindexTasks = reindexTasks.length;
console.log(`found ${numReindexTasks} reindex tasks running`);
return numReindexTasks === 0;
}
Expand Down
136 changes: 133 additions & 3 deletions scripts/helpers/parseArgsAndEnvVars.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import {
} from './parseArgsAndEnvVars';
import { cloneDeep } from 'lodash';

const mockScriptConfig: ScriptConfig = {
const ogScriptConfig: ScriptConfig = {
description: 'some script',
environment: {
env: 'ENV',
Expand All @@ -32,6 +32,7 @@ const mockScriptConfig: ScriptConfig = {
},
},
};
const mockScriptConfig = cloneDeep(ogScriptConfig);

const mockExit = jest.spyOn(process, 'exit').mockImplementation(() => {
// prevent upstream from continuing by throwing an error
Expand Down Expand Up @@ -132,6 +133,86 @@ describe('parseArgsAndEnvVars', () => {
'Usage: some-script.ts <eventCode> [ -f -y <year> -v ]\n',
);
});
it('generates a usage example with required and optional parameters in long and short form', () => {
const itsScriptConfig = cloneDeep(mockScriptConfig);
delete itsScriptConfig.description;
delete itsScriptConfig.environment;
delete itsScriptConfig.parameters!.fiscal.short;
delete itsScriptConfig.parameters!.year.short;
itsScriptConfig.parameters!.year.required = true;
itsScriptConfig.parameters!.judge = {
required: true,
short: 'j',
type: 'string',
};
process.argv = ['ts-node', 'some-script.ts', '-h'];
try {
parseArgsAndEnvVars(itsScriptConfig);
} catch (err: any) {
expect(err.toString()).toEqual('Error: caught process.exit');
}
expect(mockConsoleLog).toHaveBeenNthCalledWith(
1,
'Usage: some-script.ts <eventCode> --year <year> -j <judge> [ --fiscal -v ]\n',
);
});
it('generates a usage example with optional positionals and no optional parameters', () => {
const itsScriptConfig = cloneDeep(ogScriptConfig);
delete itsScriptConfig.description;
delete itsScriptConfig.environment;
delete itsScriptConfig.parameters!.fiscal;
delete itsScriptConfig.parameters!.year;
itsScriptConfig.parameters!.veryCool = {
position: 1,
short: 'v', // this tricks it into not adding the verbose param
type: 'string',
};
process.argv = ['ts-node', 'some-script.ts', '-h'];
try {
parseArgsAndEnvVars(itsScriptConfig);
} catch (err: any) {
expect(err.toString()).toEqual('Error: caught process.exit');
}
expect(mockConsoleLog).toHaveBeenNthCalledWith(
1,
'Usage: some-script.ts <eventCode> [ <veryCool> ]\n',
);
});
it('generates a usage example with no optional parameters', () => {
const itsScriptConfig = cloneDeep(ogScriptConfig);
delete itsScriptConfig.description;
delete itsScriptConfig.environment;
delete itsScriptConfig.parameters!.fiscal;
delete itsScriptConfig.parameters!.year;
itsScriptConfig.parameters!.veryCool = {
required: true,
short: 'v',
type: 'string',
};
process.argv = ['ts-node', 'some-script.ts', '-h'];
try {
parseArgsAndEnvVars(itsScriptConfig);
} catch (err: any) {
expect(err.toString()).toEqual('Error: caught process.exit');
}
expect(mockConsoleLog).toHaveBeenNthCalledWith(
1,
'Usage: some-script.ts <eventCode> -v <veryCool>\n',
);
});
it('does not add the help flag if another flag uses -h', () => {
const itsScriptConfig = cloneDeep(ogScriptConfig);
itsScriptConfig.parameters!.hostname = {
required: true,
short: 'h',
type: 'string',
};
process.argv.push('-h');
process.argv.push('jest');
const result = parseArgsAndEnvVars(itsScriptConfig);
expect(result.hostname).toEqual('jest');
expect(mockConsoleLog).not.toHaveBeenCalled();
});
});
describe('--verbose flag', () => {
it('prints verbose output after validating parameters and does not exit', () => {
Expand Down Expand Up @@ -160,6 +241,35 @@ describe('parseArgsAndEnvVars', () => {
);
expect(usageCalls.length).toEqual(1);
});
it('does not add the verbose flag if another flag uses -v', () => {
const itsScriptConfig = cloneDeep(ogScriptConfig);
itsScriptConfig.parameters!.veryCool = {
default: false,
short: 'v',
type: 'boolean',
};
process.argv.push('-v');
const result = parseArgsAndEnvVars(itsScriptConfig);
expect(result.veryCool).toBeTruthy();
const shortArgs = Object.keys(result);
expect(shortArgs).not.toContain('verbose');
expect(shortArgs).toContain('veryCool');
});
it('prints verbose help output if both the verbose and help flags are set', () => {
process.argv.push('-v');
process.argv.push('-h');
try {
parseArgsAndEnvVars(mockScriptConfig);
} catch (err: any) {
expect(err.toString()).toEqual('Error: caught process.exit');
}
expect(mockConsoleLog).toHaveBeenNthCalledWith(
1,
'Verbose output enabled\n',
);
expect(mockConsoleLog).toHaveBeenCalledTimes(7);
expect(mockExit).toHaveBeenCalledWith(0);
});
});
describe('parameter validation', () => {
it('can be called without any parameters', () => {
Expand All @@ -171,7 +281,7 @@ describe('parseArgsAndEnvVars', () => {
});
it('throws if positionals are provided when no positionals are defined', () => {
const itsScriptConfig = cloneDeep(mockScriptConfig);
delete itsScriptConfig.parameters!.eventCode;
delete itsScriptConfig.parameters;
process.argv.push('anotherPositional');
try {
parseArgsAndEnvVars(itsScriptConfig);
Expand Down Expand Up @@ -418,7 +528,21 @@ describe('parseArgsAndEnvVars', () => {
});
});
describe('Environment Variables', () => {
it('exits if required environment variables are not set', () => {
it('exits if a required environment variable is not set', () => {
const itsScriptConfig = cloneDeep(mockScriptConfig);
itsScriptConfig.environment!.missing = 'MISSINGVAR';
try {
parseArgsAndEnvVars(itsScriptConfig);
} catch (err: any) {
expect(err.toString()).toEqual('Error: caught process.exit');
}
expect(mockConsoleLog).toHaveBeenNthCalledWith(
1,
'Missing environment variable: MISSINGVAR\n',
);
expect(mockExit).toHaveBeenCalledWith(1);
});
it('exits if multiple required environment variables are not set', () => {
const itsScriptConfig = cloneDeep(mockScriptConfig);
itsScriptConfig.environment!.missing = 'MISSINGVAR';
itsScriptConfig.environment!.notSet = 'NOTAREALVAR';
Expand All @@ -437,5 +561,11 @@ describe('parseArgsAndEnvVars', () => {
const { env } = parseArgsAndEnvVars(mockScriptConfig);
expect(env).toEqual('jest');
});
it('can be called without any environment variables', () => {
const itsScriptConfig = cloneDeep(mockScriptConfig);
delete itsScriptConfig.environment;
parseArgsAndEnvVars(itsScriptConfig);
expect(mockExit).not.toHaveBeenCalled();
});
});
});
Loading

0 comments on commit 77ee254

Please sign in to comment.