Skip to content

Instantly share code, notes, and snippets.

@stephenfuqua
Created July 10, 2020 14:15
Show Gist options
  • Save stephenfuqua/0793d5a1c05eee0f38601bfb6010c449 to your computer and use it in GitHub Desktop.
Save stephenfuqua/0793d5a1c05eee0f38601bfb6010c449 to your computer and use it in GitHub Desktop.
const globby = require('globby');
const execa = require('execa');
const perf = require('execution-time')();
const colors = require('colors/safe');
function runSqlLintOnFile(file, writer) {
let numFailures = 0;
perf.start(file);
writer.testStarted(file);
try {
execa.sync(`npx sql-lint --driver="postgres" --format json ${file}`);
} catch (err) {
const {error, line} = JSON.parse(err.stdout);
writer.testFailure(file, error, line);
numFailures = 1;
}
const {time} = perf.stop(file);
writer.testFinished(file, time);
return numFailures;
}
const cliWriter = {
// Default writer
testSuiteStarted: (testSuiteName) => console.log(`sql-lint started`), // TODO: write the sql-lint version
testStarted: (testName) => null,
testFailure: (testName, msg, line) => {
console.log(colors.red(' X'), testName);
console.log(colors.red(` Error Message: ${msg}`));
console.log(colors.red(` Stack Trace: line ${line}`));
},
testFinished: (testName, duration) => null,
testSuiteFinished: (testSuiteName, duration, numTests, numFailures) => {
if (numFailures) {
console.log(colors.red('Test Run Failed.'));
}
console.log(`Total tests: ${numTests}`);
console.log(colors.green(` Passed: ${numTests-numFailures}`));
console.log(colors.red(` Failed: ${numFailures}`));
console.log(` Total time: ${duration/1000} seconds`);
}
};
const teamCityWriter = {
// Will be used when running in TeamCity
testSuiteStarted: (testSuiteName) => console.log(`##teamcity[testSuiteStarted name='${testSuiteName}']`),
testStarted: (testName) => console.log(`##teamcity[testStarted name='${testName}']`),
testFailure: (testName, msg, line) => console.log(`##teamcity[testFailed name='${testName}' message='${msg}' details='failure on line ${line}']`),
testFinished: (testName, duration) => console.log(`##teamcity[testFinished name='${testName}' duration='${duration}']`),
testSuiteFinished: (testSuiteName, duration, numTests, numFailures) => console.log(`##teamcity[testSuiteFinished name='${testSuiteName}' duration='${duration}']`),
};
(async () => {
let writer = cliWriter;
if (process.env.CI==="true" && process.env.TEAMCITY_VERSION) {
writer = teamCityWriter;
}
const testSuiteName = "edfi.fif.database";
writer.testSuiteStarted(testSuiteName);
perf.start(testSuiteName);
const paths = await globby(['migrations/**/*.sql']);
let numFailures = 0;
paths.forEach((item, index) => {
numFailures += runSqlLintOnFile(item, writer)
});
const {time} = perf.stop(testSuiteName);
writer.testSuiteFinished(testSuiteName, time, paths.length, numFailures);
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment