Jam3/adviser

View on GitHub
__tests__/core/rules.test.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict';

const rules = require('../../src/core/config/rules');
const InvalidRuleError = require('../../src/core/errors/exceptions/invalid-rule-error');

const AdviserRule = require('../../src/core/external/rule');
class MockAdviserRule extends AdviserRule {}

describe('Rules', () => {
  beforeEach(() => {
    rules.reset();
  });

  test('Add empty rule', () => {
    expect(() => {
      rules.add('', '', '', MockAdviserRule, {});
    }).toThrow(InvalidRuleError);
  });

  test('Add and get rule', () => {
    const ruleName = 'warning-min-test';

    rules.add(ruleName, ruleName, '', MockAdviserRule, {});
    expect(rules.get(ruleName)).toBeDefined();
  });

  test('Add rule with invalid definition', () => {
    const ruleName = 'warning-min-test';

    function add() {
      rules.add(ruleName, ruleName, '', null, {});
    }

    expect(add).toThrow(InvalidRuleError);
    expect(add).toThrow('Rule definition is invalid');
  });

  test('Get many rules', () => {
    for (let index = 0; index < 5; index++) {
      rules.add(`warning-min-test-${index}`, `warning-min-test-${index}`, 'plugin-name', MockAdviserRule, {});
    }

    expect(Object.keys(rules.getAll()).length).toBe(5);
  });

  test('Severity is normalized correctly', () => {
    expect(rules._normalizeSeverity(0)).toBe('off');
    expect(rules._normalizeSeverity('off')).toBe('off');
    expect(rules._normalizeSeverity(1)).toBe('warn');
    expect(rules._normalizeSeverity('warn')).toBe('warn');
    expect(rules._normalizeSeverity(2)).toBe('error');
    expect(rules._normalizeSeverity('error')).toBe('error');
  });

  test('Empty settings are only including severity', () => {
    const settingWarn = 'warn';
    const settingNumeric = 1;

    expect(rules._normalizeSettings(settingWarn)).toMatchObject({
      severity: 'warn'
    });

    expect(rules._normalizeSettings(settingNumeric)).toMatchObject({
      severity: 'warn'
    });
  });

  test('Settings with options are parsed correctly', () => {
    const settingWarn = ['warn', { 'test-a': 'test', 'test-b': 'test' }];

    expect(rules._normalizeSettings(settingWarn)).toMatchObject({
      severity: 'warn',
      options: { 'test-a': 'test', 'test-b': 'test' }
    });
  });
});

describe('Rules by Tags', () => {
  beforeEach(() => {
    rules.reset();
  });

  test('Filter rules by Metatags', () => {
    const rawRules = [
      {
        name: 'warning-min-test-1',
        core: {
          meta: {
            tags: ['fast', 'perf']
          }
        }
      },
      {
        name: 'warning-min-test-2',
        core: {
          meta: {
            tags: ['slow', 'perf']
          }
        }
      },
      {
        name: 'warning-min-test-3',
        core: {
          meta: {
            tags: ['testing', 'noperf', 'slow']
          }
        }
      }
    ];

    rawRules.forEach(rule => {
      rules.add(rule.name, rule.name, '', rule.core, {});
    });

    expect(rules._getRulesFilteredByMetaTags(['fast']).length).toBe(1);
    expect(rules._getRulesFilteredByMetaTags(['noperf']).length).toBe(1);
    expect(rules._getRulesFilteredByMetaTags(['slow']).length).toBe(2);
    expect(rules._getRulesFilteredByMetaTags(['perf']).length).toBe(2);
    expect(rules._getRulesFilteredByMetaTags(['fast', 'perf']).length).toBe(2);
    expect(rules._getRulesFilteredByMetaTags(['fast', 'perf', 'none']).length).toBe(2);
    expect(rules._getRulesFilteredByMetaTags(['slow', 'perf', 'none', 'null', 'true', 'false']).length).toBe(3);
    expect(rules._getRulesFilteredByMetaTags(['none', 'null', 'true', 'false']).length).toBe(0);
    expect(rules._getRulesFilteredByMetaTags([]).length).toBe(0);
  });

  test('Filter rules by Settings tags', () => {
    const rawRules = [
      {
        name: 'warning-min-test-1',
        core: {}
      },
      {
        name: 'warning-min-test-2',
        core: {}
      },
      {
        name: 'warning-min-test-3',
        core: {}
      }
    ];

    rawRules.forEach(rule => {
      rules.add(rule.name, rule.name, '', rule.core, {});
    });

    expect(rules._getRulesFilteredBySettingTags(['fast'], { fast: ['warning-min-test-3'] }).length).toBe(1);
    expect(rules._getRulesFilteredBySettingTags(['perf'], { fast: ['warning-min-test-3'] }).length).toBe(0);
    expect(
      rules._getRulesFilteredBySettingTags(['quick'], {
        quick: ['warning-min-test-3', 'warning-min-test-2', 'warning-min-test-1']
      }).length
    ).toBe(3);
    expect(
      rules._getRulesFilteredBySettingTags(['test', 'another', 'quick'], {
        quick: ['warning-min-test-3', 'warning-min-test-2', 'warning-min-test-1']
      }).length
    ).toBe(3);
    expect(
      rules._getRulesFilteredBySettingTags(['test', 'another', 'quick'], {
        quick: ['warning-min-test-3', 'warning-min-test-2', 'warning-min-test-1'],
        another: ['warning-min-test-3', 'warning-min-test-1'],
        diff: ['warning-min-test-3', 'warning-min-test-2', 'warning-min-test-1']
      }).length
    ).toBe(3);
    expect(
      rules._getRulesFilteredBySettingTags(['diff', 'another', 'quick'], {
        quick: ['warning-min-test-3'],
        another: ['warning-min-test-3', 'warning-min-test-1'],
        diff: ['warning-min-test-2', 'warning-min-test-1']
      }).length
    ).toBe(3);
    expect(
      rules._getRulesFilteredBySettingTags(['diff', 'another', 'quick'], {
        diff: ['warning-min-test-y', 'warning-min-test-x']
      }).length
    ).toBe(0);
    expect(
      rules._getRulesFilteredBySettingTags(['diff', 'another', 'quick'], {
        diff: []
      }).length
    ).toBe(0);
    expect(rules._getRulesFilteredBySettingTags(['diff', 'another', 'quick'], {}).length).toBe(0);
  });

  test('Get by Tags', () => {
    const rawRules = [
      {
        name: 'warning-min-test-1',
        core: {
          meta: {
            tags: ['fast', 'perf']
          }
        }
      },
      {
        name: 'warning-min-test-2',
        core: {
          meta: {
            tags: ['slow', 'perf', 'another']
          }
        }
      },
      {
        name: 'warning-min-test-3',
        core: {
          meta: {
            tags: ['testing', 'noperf', 'slow']
          }
        }
      }
    ];

    rawRules.forEach(rule => {
      rules.add(rule.name, rule.name, '', rule.core, {});
    });

    expect(rules.getByTag(['diff', 'another', 'slow'], {}).length).toBe(2);
    expect(
      rules.getByTag(['diff', 'another', 'slow'], { slow: ['warning-min-test-y', 'warning-min-test-x'] }).length
    ).toBe(1);
    expect(
      rules.getByTag(['diff', 'another', 'slow'], { slow: ['warning-min-test-y', 'warning-min-test-3'] }).length
    ).toBe(2);
    expect(
      rules.getByTag(['diff', 'another', 'slow'], { slow: ['warning-min-test-y', 'warning-min-test-1'] }).length
    ).toBe(2);
    expect(
      rules.getByTag(['testing', 'another', 'null'], {
        slow: ['warning-min-test-1', 'warning-min-test-3'],
        null: ['warning-min-test-2'],
        testing: ['warning-min-test-2']
      }).length
    ).toBe(1);
    expect(
      rules.getByTag(['testing'], {
        testing: ['warning-min-test-x']
      }).length
    ).toBe(0);
    expect(
      rules.getByTag(['testing'], {
        testing: ['warning-min-test-2']
      }).length
    ).toBe(1);
  });

  test('Override meta tags with settings', () => {
    const rawRules = [
      {
        name: 'warning-min-test-1',
        core: {
          meta: {
            tags: ['fast', 'perf']
          }
        }
      },
      {
        name: 'warning-min-test-2',
        core: {
          meta: {
            tags: ['slow', 'perf', 'another']
          }
        }
      }
    ];

    rawRules.forEach(rule => {
      rules.add(rule.name, rule.name, '', rule.core, {});
    });

    expect(rules.getByTag(['fast'], { fast: ['warning-min-test-2'] }).length).toBe(1);
    expect(rules.getByTag(['slow'], { fast: ['warning-min-test-2'] }).length).toBe(1);
    expect(rules.getByTag(['nonexist'], { fast: ['warning-min-test-2'] }).length).toBe(0);
  });
});