Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions messages/common.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
FEEDBACK_SURVEY_BANNER: `What do you think of Salesforce Code Analyzer? Take our feedback survey at https://research.net/r/SalesforceCA.`
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a new common messages file instead of putting the banner as a constant.

};
3 changes: 2 additions & 1 deletion src/commands/scanner/rule/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Messages.importMessagesDirectory(__dirname);
// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core,
// or any library that is using the messages framework can also be loaded this way.
const messages = Messages.loadMessages('@salesforce/sfdx-scanner', 'add');

const commonMessages = Messages.loadMessages('@salesforce/sfdx-scanner', 'common');

export default class Add extends SfdxCommand {

Expand Down Expand Up @@ -41,6 +41,7 @@ export default class Add extends SfdxCommand {

public async run(): Promise<AnyJson> {
this.validateFlags();
this.ux.styledHeader(commonMessages.getMessage('FEEDBACK_SURVEY_BANNER'));

const language = this.flags.language as string;
const paths = this.resolvePaths();
Expand Down
2 changes: 2 additions & 0 deletions src/commands/scanner/rule/describe.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Messages.importMessagesDirectory(__dirname);
// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core,
// or any library that is using the messages framework can also be loaded this way.
const messages = Messages.loadMessages('@salesforce/sfdx-scanner', 'describe');
const commonMessages = Messages.loadMessages('@salesforce/sfdx-scanner', 'common');

type DescribeStyledRule = Rule & {
enabled: boolean;
Expand Down Expand Up @@ -41,6 +42,7 @@ export default class Describe extends ScannerCommand {
};

public async run(): Promise<AnyJson> {
this.ux.styledHeader(commonMessages.getMessage('FEEDBACK_SURVEY_BANNER'));
const ruleFilters = this.buildRuleFilters();
// It's possible for this line to throw an error, but that's fine because the error will be an SfdxError that we can
// allow to boil over.
Expand Down
2 changes: 2 additions & 0 deletions src/commands/scanner/rule/list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Messages.importMessagesDirectory(__dirname);
// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core,
// or any library that is using the messages framework can also be loaded this way.
const messages = Messages.loadMessages('@salesforce/sfdx-scanner', 'list');
const commonMessages = Messages.loadMessages('@salesforce/sfdx-scanner', 'common');
const columns = [messages.getMessage('columnNames.name'),
messages.getMessage('columnNames.languages'),
messages.getMessage('columnNames.categories'),
Expand Down Expand Up @@ -64,6 +65,7 @@ export default class List extends ScannerCommand {
};

public async run(): Promise<Rule[]> {
this.ux.styledHeader(commonMessages.getMessage('FEEDBACK_SURVEY_BANNER'));
const ruleFilters = this.buildRuleFilters();
// It's possible for this line to throw an error, but that's fine because the error will be an SfdxError that we can
// allow to boil over.
Expand Down
2 changes: 2 additions & 0 deletions src/commands/scanner/rule/remove.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Messages.importMessagesDirectory(__dirname);
// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core,
// or any library that is using the messages framework can also be loaded this way.
const messages = Messages.loadMessages('@salesforce/sfdx-scanner', 'remove');
const commonMessages = Messages.loadMessages('@salesforce/sfdx-scanner', 'common');

export default class Remove extends ScannerCommand {
// These determine what's displayed when the --help/-h flag is supplied.
Expand Down Expand Up @@ -44,6 +45,7 @@ export default class Remove extends ScannerCommand {
};

public async run(): Promise<AnyJson> {
this.ux.styledHeader(commonMessages.getMessage('FEEDBACK_SURVEY_BANNER'));
// Step 1: Validate our input.
this.validateFlags();

Expand Down
2 changes: 2 additions & 0 deletions src/lib/ScannerRunCommand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Messages.importMessagesDirectory(__dirname);
// Load the specific messages for this file. Messages from @salesforce/command, @salesforce/core,
// or any library that is using the messages framework can also be loaded this way.
const messages = Messages.loadMessages('@salesforce/sfdx-scanner', 'run');
const commonMessages = Messages.loadMessages('@salesforce/sfdx-scanner', 'common');
// This code is used for internal errors.
export const INTERNAL_ERROR_CODE = 1;

Expand All @@ -22,6 +23,7 @@ export abstract class ScannerRunCommand extends ScannerCommand {
public async run(): Promise<AnyJson> {
// First, do any validations that can't be handled with out-of-the-box stuff.
await this.validateFlags();
this.ux.styledHeader(commonMessages.getMessage('FEEDBACK_SURVEY_BANNER'));

// If severity-threshold is used, that implicitly normalizes the severity.
const normalizeSeverity: boolean = (this.flags['normalize-severity'] || this.flags['severity-threshold']) as boolean;
Expand Down
9 changes: 8 additions & 1 deletion test/TestUtils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import fs = require('fs');
import path = require('path');
import { test } from '@salesforce/command/lib/test';
import { test, expect } from '@salesforce/command/lib/test';
import * as CommonMessages from '../messages/common.js';
import * as TestOverrides from './test-related-lib/TestOverrides';
import Sinon = require('sinon');
import LocalCatalog from '../src/lib/services/LocalCatalog';
Expand All @@ -15,6 +16,12 @@ export function prettyPrint(obj: any): string {
return JSON.stringify(obj, null, 2);
}

export function stripExtraneousOutput(stdout: string): string {
const splitOutput = stdout.split('\n');
expect(splitOutput[0]).to.equal('=== ' + CommonMessages.FEEDBACK_SURVEY_BANNER);
return splitOutput.slice(1).join('\n');
}

export function stubCatalogFixture(): void {
// Make sure all catalogs exist where they're supposed to.
if (!fs.existsSync(CATALOG_FIXTURE_PATH)) {
Expand Down
8 changes: 5 additions & 3 deletions test/commands/scanner/rule/list.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {expect} from '@salesforce/command/lib/test';
import {setupCommandTest} from '../../../TestUtils';
import {setupCommandTest, stripExtraneousOutput} from '../../../TestUtils';
import {Rule} from '../../../../src/types';
import {CATALOG_FILE, ENGINE} from '../../../../src/Constants';
import fs = require('fs');
Expand Down Expand Up @@ -56,7 +56,8 @@ describe('scanner:rule:list', () => {

// Split the output table by newline and throw out the first two rows, since they just contain header information. That
// should leave us with the actual data.
const rows = ctx.stdout.trim().split('\n');
const output = stripExtraneousOutput(ctx.stdout);
const rows = output.trim().split('\n');
rows.shift();
rows.shift();
expect(rows).to.have.lengthOf(totalRuleCount, 'All rules should have been returned');
Expand Down Expand Up @@ -306,7 +307,8 @@ describe('scanner:rule:list', () => {
.command(['scanner:rule:list', '--category', 'Beebleborp'])
.it('Without --json flag, an empty table is printed', ctx => {
// Split the result by newline, and make sure there are two rows.
const rows = ctx.stdout.trim().split('\n');
const output = stripExtraneousOutput(ctx.stdout);
const rows = output.trim().split('\n');
expect(rows).to.have.lengthOf(2, 'Only the header rows should have been printed');
});

Expand Down
72 changes: 37 additions & 35 deletions test/commands/scanner/run.severity.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {expect} from '@salesforce/command/lib/test';
import {setupCommandTest} from '../../TestUtils';
import {setupCommandTest, stripExtraneousOutput} from '../../TestUtils';
import {Messages} from '@salesforce/core';
import path = require('path');

Expand Down Expand Up @@ -31,12 +31,12 @@ describe('scanner:run', function () {
'--severity-threshold', '1'
])
.it('When no violations are found equal to or greater than flag value, no error is thrown', ctx => {

const output = JSON.parse(ctx.stdout);
const output = stripExtraneousOutput(ctx.stdout);
const outputJson = JSON.parse(output);
// check that test file still has severities of 3
for (let i=0; i<output.length; i++) {
for (let j=0; j<output[i].violations.length; j++) {
expect(output[i].violations[j].normalizedSeverity).to.equal(3);
for (let i=0; i<outputJson.length; i++) {
for (let j=0; j<outputJson[i].violations.length; j++) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(3);
}
}

Expand All @@ -51,12 +51,12 @@ describe('scanner:run', function () {
'--severity-threshold', '3'
])
.it('When violations are found equal to or greater than flag value, an error is thrown', ctx => {

const output = JSON.parse(ctx.stdout);
const output = stripExtraneousOutput(ctx.stdout);
const outputJson = JSON.parse(output);
// check that test file still has severities of 3
for (let i=0; i<output.length; i++) {
for (let j=0; j<output[i].violations.length; j++) {
expect(output[i].violations[j].normalizedSeverity).to.equal(3);
for (let i=0; i<outputJson.length; i++) {
for (let j=0; j<outputJson[i].violations.length; j++) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(3);
}
}
expect(ctx.stderr).to.contain(runMessages.getMessage('output.sevThresholdSummary', ['3']));
Expand Down Expand Up @@ -94,27 +94,28 @@ describe('scanner:run', function () {
'--normalize-severity'
])
.it('Ensure normalized severity is correct', ctx => {
const output = JSON.parse(ctx.stdout);

for (let i=0; i<output.length; i++) {
for (let j=0; j<output[i].violations.length; j++) {
if (output[i].engine.includes("pmd")){
if (output[i].violations[j].severity == 1) {
expect(output[i].violations[j].normalizedSeverity).to.equal(1);
} else if (output[i].violations[j].severity == 2) {
expect(output[i].violations[j].normalizedSeverity).to.equal(2);
} else if (output[i].violations[j].severity == 3) {
expect(output[i].violations[j].normalizedSeverity).to.equal(3);
} else if (output[i].violations[j].severity == 4) {
expect(output[i].violations[j].normalizedSeverity).to.equal(3);
} else if (output[i].violations[j].severity == 5) {
expect(output[i].violations[j].normalizedSeverity).to.equal(3);
const output = stripExtraneousOutput(ctx.stdout);
const outputJson = JSON.parse(output);

for (let i=0; i<outputJson.length; i++) {
for (let j=0; j<outputJson[i].violations.length; j++) {
if (outputJson[i].engine.includes("pmd")){
if (outputJson[i].violations[j].severity == 1) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(1);
} else if (outputJson[i].violations[j].severity == 2) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(2);
} else if (outputJson[i].violations[j].severity == 3) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(3);
} else if (outputJson[i].violations[j].severity == 4) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(3);
} else if (outputJson[i].violations[j].severity == 5) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(3);
}
} else if (output[i].engine.includes("eslint")) {
if (output[i].violations[j].severity == 1) {
expect(output[i].violations[j].normalizedSeverity).to.equal(2);
} else if (output[i].violations[j].severity == 2) {
expect(output[i].violations[j].normalizedSeverity).to.equal(1);
} else if (outputJson[i].engine.includes("eslint")) {
if (outputJson[i].violations[j].severity == 1) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(2);
} else if (outputJson[i].violations[j].severity == 2) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(1);
}
}

Expand All @@ -128,11 +129,12 @@ describe('scanner:run', function () {
'--format', 'json'
])
.it('Ensure normalized severity is not outputted when --normalize-severity not provided', ctx => {
const output = JSON.parse(ctx.stdout);
const output = stripExtraneousOutput(ctx.stdout);
const outputJson = JSON.parse(output);

for (let i=0; i<output.length; i++) {
for (let j=0; j<output[i].violations.length; j++) {
expect(output[i].violations[j].normalizedSeverity).to.equal(undefined);
for (let i=0; i<outputJson.length; i++) {
for (let j=0; j<outputJson[i].violations.length; j++) {
expect(outputJson[i].violations[j].normalizedSeverity).to.equal(undefined);
}
}
});
Expand Down
6 changes: 3 additions & 3 deletions test/commands/scanner/run.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {expect} from '@salesforce/command/lib/test';
import {setupCommandTest} from '../../TestUtils';
import {setupCommandTest, stripExtraneousOutput} from '../../TestUtils';
import {Messages} from '@salesforce/core';
import fs = require('fs');
import path = require('path');
Expand Down Expand Up @@ -214,8 +214,8 @@ describe('scanner:run', function () {
'--format', 'csv'
])
.it('Properly writes CSV to console', ctx => {
// Split the output by newline characters and throw away the first entry, so we're left with just the rows.
validateCsvOutput(ctx.stdout, false);
const output = stripExtraneousOutput(ctx.stdout);
validateCsvOutput(output, false);
});

setupCommandTest
Expand Down