Switch our test suite to use Jest test runner.

* Fix javascript test to use new eslint rule format.
* Cleanup dependencies, configure runInBand because we are messing with processes and this leads to inconsisten test results / failures
* Add test-ci shortcut to make tests more predictable and simpler (no process magic) on travis.
* Add missing files
* Fix testMatch
* Fix test and test-no-coverage commands
* Fix default value in manifestjson to be the same key as in the parsedJSON later
* Simplify addons linter test
* Add some optimizations
* Rewrite cli-process test to not rely on shell js and make it work with jest.
* Lots of cleanups, fix toThrow tests to check for messages again.
* re-add eslint, remove more stuff from Gruntfile
* Add proper eslintignore file
* Lots of cleanups, fix all remaining eslint problems.
* Do not test our workaround, that'll be a mess...
* Add test that checks for importSchemas to skip certain files.
* activate jest environment, remove custom global entries
* add collectCoverageFrom config
* remove some old, removed, uncovered code.
* more test fixes
* add missing file
This commit is contained in:
Christopher Grebs 2017-06-08 17:31:25 +08:00
Родитель eb318f5040
Коммит 1947ffd7fb
77 изменённых файлов: 1632 добавлений и 1590 удалений

4
.eslintignore Normal file
Просмотреть файл

@ -0,0 +1,4 @@
dist
coverage
tests/fixtures/jslibs
tests/**/*.json

Просмотреть файл

@ -1,5 +1,6 @@
{
"parser": "babel-eslint",
"plugins": ["jest"],
"extends": [
"eslint:recommended",
],
@ -8,6 +9,7 @@
"browser": true,
"es6": true,
"mocha": true,
"jest": true,
},
"ecmaFeatures": {
"arrowFunctions": true,
@ -76,7 +78,12 @@
"spaced-comment": ["error", "always"],
"strict": ["error", "never"],
"valid-typeof": "error",
"wrap-iife": ["error", "inside"]
"wrap-iife": ["error", "inside"],
"jest/no-disabled-tests": "warn",
"jest/no-focused-tests": "error",
"jest/no-identical-title": "error",
"jest/valid-expect": "error",
},
"parserOptions": {
"sourceType": "module"

Просмотреть файл

@ -2,7 +2,7 @@ language: node_js
sudo: false
node_js:
- '6'
script: npm test
script: npm run test-ci
notifications:
irc:
channels:
@ -10,6 +10,9 @@ notifications:
on_success: change
on_failure: always
after_script: npm run publish-coverage
cache:
directories:
- node_modules
deploy:
provider: npm
email: addons-dev-automation+npm@mozilla.com

Просмотреть файл

@ -51,20 +51,4 @@ module.exports = function(grunt) {
grunt.log.writeln('Skipping rules publication.');
}
});
grunt.registerTask('test', [
'clean',
'webpack:build',
'webpack:coverage',
'mochaTest:coverage',
'newer:eslint',
]);
grunt.registerTask('test-no-coverage', [
'clean',
'webpack:build',
'webpack:test',
'mochaTest:test',
'newer:eslint',
]);
};

38
jest.config.js Normal file
Просмотреть файл

@ -0,0 +1,38 @@
module.exports = {
coveragePathIgnorePatterns: [
'<rootDir>/node_modules/',
'<rootDir>/tests/',
'<rootDir>/config/',
],
collectCoverageFrom: ['src/**/*.js'],
moduleDirectories: [
'src',
'node_modules',
],
moduleFileExtensions: [
'js',
'json',
],
moduleNameMapper: {
// Alias tests for tests to be able to import helpers.
'^tests/(.*)$': '<rootDir>/tests/$1',
},
setupTestFrameworkScriptFile: '<rootDir>/tests/setup.js',
testPathIgnorePatterns: [
'<rootDir>/node_modules/',
'<rootDir>/tests/fixtures/',
'<rootDir>/(bin|coverage|dist|docs|src)/',
],
testMatch: [
'<rootDir>/**/[Tt]est(*).js?(x)',
'<rootDir>/**/__tests__/**/*.js?(x)',
],
transform: {
'^.+\\.js$': 'babel-jest',
},
transformIgnorePatterns: [
'<rootDir>/node_modules/',
],
testEnvironment: 'node',
verbose: false,
};

Просмотреть файл

@ -9,8 +9,11 @@
"scripts": {
"start": "grunt start",
"build": "grunt build",
"test": "grunt test",
"test-no-coverage": "grunt test-no-coverage",
"eslint": "eslint .",
"test": "jest tests/ --runInBand --coverage",
"test-no-coverage": "jest tests/ --runInBand",
"test-ci": "npm run test && cat ./coverage/lcov.info | coveralls",
"lint": "npm run eslint",
"publish-rules": "grunt copy build-rules-html publish-rules",
"publish-coverage": "grunt coveralls"
},
@ -27,29 +30,27 @@
"devDependencies": {
"babel-core": "6.25.0",
"babel-eslint": "7.2.3",
"babel-istanbul": "0.12.2",
"babel-istanbul-loader": "0.1.0",
"babel-jest": "20.0.3",
"babel-loader": "7.0.0",
"babel-plugin-transform-class-properties": "6.24.1",
"babel-plugin-transform-es2015-modules-commonjs": "6.24.1",
"babel-preset-env": "1.5.2",
"babel-preset-es2015": "6.24.1",
"babel-preset-stage-2": "6.24.1",
"chai": "4.0.1",
"comment-json": "1.1.3",
"coveralls": "2.13.1",
"deepmerge": "1.3.2",
"eslint-plugin-jest": "20.0.3",
"gfm.css": "1.1.1",
"grunt": "1.0.1",
"grunt-contrib-clean": "1.1.0",
"grunt-contrib-copy": "1.0.0",
"grunt-coveralls": "1.0.1",
"grunt-eslint": "19.0.0",
"grunt-gh-pages": "2.0.0",
"grunt-mocha-test": "0.13.2",
"grunt-newer": "1.3.0",
"grunt-webpack": "3.0.0",
"hashish": "0.0.4",
"isparta": "4.0.0",
"jest": "20.0.4",
"json-loader": "0.5.4",
"load-grunt-configs": "1.0.0",
"load-grunt-tasks": "3.5.2",
@ -58,10 +59,7 @@
"markdown-it": "8.3.1",
"markdown-it-anchor": "4.0.0",
"markdown-it-emoji": "1.3.0",
"mocha": "3.4.2",
"mocha-multi": "0.11.0",
"request": "2.81.0",
"shelljs": "0.7.8",
"sinon": "2.3.4",
"tar": "3.1.5",
"webpack": "2.6.1",

Просмотреть файл

@ -2,7 +2,7 @@ import argv from 'yargs';
import log from 'logger';
import { singleLineString } from 'utils';
import { version } from 'json-loader!../package';
import { version } from '../package.json';
export function getConfig({useCLI=true} = {}) {

Просмотреть файл

@ -25,7 +25,7 @@ export default class ManifestJSONParser extends JSONParser {
// Set up some defaults in case parsing fails.
if (typeof this.parsedJSON === 'undefined' || this.isValid === false) {
this.parsedJSON = {
manifestVersion: null,
manifest_version: null,
name: null,
type: PACKAGE_EXTENSION,
version: null,

Просмотреть файл

@ -1 +0,0 @@
export * from './categories';

Просмотреть файл

@ -1,2 +1,51 @@
/*
This is a hack to workaround our tests running with Jest.
Jest does not provide `require.context` because dynamic imports don't work
with it's --watch feature.
So we're working around that and implementing `require.context` ourselves.
*/
/* istanbul ignore next */
if (typeof require.context === 'undefined') {
const fs = require('fs');
const path = require('path');
require.context = function(
base = '.', scanSubDirectories = false, regularExpression = /\.js$/) {
const files = {};
function readDirectory(directory) {
fs.readdirSync(directory).forEach((file) => {
const fullPath = path.resolve(directory, file);
if (fs.statSync(fullPath).isDirectory()) {
if (scanSubDirectories) {
readDirectory(fullPath);
}
return;
}
if (!regularExpression.test(fullPath)) {
return;
}
files[fullPath] = true;
});
}
readDirectory(path.resolve(__dirname, base));
function Module(file) {
return require(file);
}
Module.keys = () => Object.keys(files);
return Module;
};
}
const req = require.context('./', false, /\.json$/);
export default req.keys().map((key) => req(key));

Просмотреть файл

@ -1,11 +0,0 @@
module.exports = {
js: {
src: [
'tests/**/*.js*',
'!tests/fixtures/jslibs/**.js',
'!tests/**/*.json',
'src/**/*.js',
'Gruntfile.js',
],
},
};

Просмотреть файл

@ -6,11 +6,11 @@ function getDeployMessage() {
ret += 'missing env vars for travis-ci';
return ret;
}
ret += 'branch: ' + process.env.TRAVIS_BRANCH + '\n';
ret += 'SHA: ' + process.env.TRAVIS_COMMIT + '\n';
ret += 'range SHA: ' + process.env.TRAVIS_COMMIT_RANGE + '\n';
ret += 'build id: ' + process.env.TRAVIS_BUILD_ID + '\n';
ret += 'build number: ' + process.env.TRAVIS_BUILD_NUMBER + '\n';
ret += `branch: ${process.env.TRAVIS_BRANCH}\n`;
ret += `SHA: ${process.env.TRAVIS_COMMIT}\n`;
ret += `range SHA: ${process.env.TRAVIS_COMMIT_RANGE}\n`;
ret += `build id: ${process.env.TRAVIS_BUILD_ID}\n`;
ret += `build number: ${process.env.TRAVIS_BUILD_NUMBER}\n`;
return ret;
}
@ -28,7 +28,7 @@ module.exports = {
email: process.env.GH_EMAIL,
},
repo: 'https://' + process.env.GH_TOKEN + '@github.com/mozilla/addons-linter.git', // eslint-disable-line
message: 'Publish rules (auto)' + getDeployMessage(),
message: `Publish rules (auto)${getDeployMessage()}`,
},
src: ['**'],
},

Просмотреть файл

@ -1,52 +0,0 @@
const path = require('path');
const defaultOptions = {
// Timeout is long due to tests that check *all* rules have been run.
timeout: 15000,
require: [
function() {
/*eslint-disable */
// Monkey-patch mocha colors.
// Change 90 to 38 so solarized users can see
// stack-traces etc.
var colors = require('mocha/lib/reporters/base').colors;
colors['error stack'] = 38;
colors['pass'] = 38;
colors['diff gutter'] = 38;
colors['fast'] = 38;
colors['light'] = 38;
assert = require('chai').assert;
sinon = require('sinon');
/*eslint-enable */
},
],
reporter: 'mocha-multi',
reporterOptions: {
spec: '-',
},
};
// global.appRoot should point to the repository root and is normaly defined
// in bin/addons-linter.
const absoluteAppRoot = path.join(path.resolve(__dirname), '..');
global.appRoot = path.relative(process.cwd(), absoluteAppRoot);
const allFiles = ['dist/tests.js'];
const coverageReporterModulePath = path.resolve(
path.join(__dirname, '../tests', 'coverage-reporter.js')
);
module.exports = {
test: {
options: defaultOptions,
src: allFiles,
},
coverage: {
options: Object.assign({}, defaultOptions, {
reporterOptions: Object.assign({}, defaultOptions.reporterOptions, {
[coverageReporterModulePath]: '-',
}),
}),
src: allFiles,
},
};

Просмотреть файл

@ -1,4 +1,3 @@
var path = require('path');
var webpackConfig = require('../webpack.config.js');
var defaultResolve = webpackConfig.resolve;
@ -10,14 +9,6 @@ function noddyClone(obj) {
var buildResolve = noddyClone(defaultResolve);
buildResolve.modules.push('src/');
var testConfig = {
entry: './tests/runner.js',
output: {
path: path.join(__dirname, '../dist'),
filename: 'tests.js',
},
};
module.exports = {
options: webpackConfig,
build: {
@ -29,25 +20,4 @@ module.exports = {
keepalive: true,
resolve: buildResolve,
},
test: {
entry: testConfig.entry,
output: testConfig.output,
resolve: buildResolve,
},
coverage: {
entry: testConfig.entry,
output: testConfig.output,
resolve: buildResolve,
module: {
rules: [
{
use: 'babel-istanbul-loader',
// babel options are in .babelrc
exclude: /(node_modules|bower_components|tests)/,
enforce: 'pre',
test: /\.js$/,
},
],
},
},
};

Просмотреть файл

@ -1,6 +1,7 @@
import fs from 'fs';
import { assert } from 'assert';
import isMatchWith from 'lodash.ismatchwith';
import { Readable } from 'stream';
import Hash from 'hashish';
import { PACKAGE_EXTENSION } from 'const';
import { singleLineString } from 'utils';
@ -48,24 +49,6 @@ export function metadataPassCheck(contents, filename, {addonMetadata=null}={}) {
return [];
}
export function validChromeManifest(contents=[
'category JavaScript-DOM-class foo bar',
'category JavaScript-DOM-interface foo bar',
], {includeBoilerplate=true}={}) {
var rstream = new Readable();
if (includeBoilerplate === true) {
rstream.push('content necko jar:comm.jar!/content/necko/\n');
}
contents.forEach((line) => {
rstream.push(`${line}\n`);
});
rstream.push(null);
return rstream;
}
export function validHTML(contents='') {
return singleLineString`<!DOCTYPE html>
<html>
@ -125,9 +108,83 @@ function isMatch(target, expected) {
}
export function assertHasMatchingError(errors, expected) {
assert.ok(Array.isArray(errors), 'errors must be an array');
assert.ok(errors.length > 0, sinon.format(errors));
assert.ok(
errors.some((error) => isMatch(error, expected)),
`expected ${sinon.format(expected)} to be in ${sinon.format(errors)}`);
expect(Array.isArray(errors)).toBeTruthy();
expect(errors.length).toBeGreaterThan(0);
expect(errors.some((error) => isMatch(error, expected))).toBeTruthy();
}
/* `checkOutput` is copied and modified directly from yargs test helpers */
export function checkOutput(func, argv, callback) {
var exitCode = null;
var _exit = process.exit;
var _emit = process.emit;
var _env = process.env;
var _argv = process.argv;
var _error = console.error; // eslint-disable-line
var _log = console.log; // eslint-disable-line
var _warn = console.warn; // eslint-disable-line
process.exit = function(code) { exitCode = code; };
process.env = Hash.merge(process.env, { _: 'node' });
process.argv = argv || [ './usage' ];
var errors = [];
var logs = [];
var warnings = [];
console.error = function (msg) { errors.push(msg); }; // eslint-disable-line
console.log = function (msg) { logs.push(msg); }; // eslint-disable-line
console.warn = function (msg) { warnings.push(msg); }; // eslint-disable-line
var result;
function reset() {
process.exit = _exit;
process.emit = _emit;
process.env = _env;
process.argv = _argv;
console.error = _error; // eslint-disable-line
console.log = _log; // eslint-disable-line
console.warn = _warn; // eslint-disable-line
}
function done() {
reset();
return {
errors: errors,
logs: logs,
warnings: warnings,
exitCode: exitCode,
result: result,
};
}
if (typeof cb === 'function') {
process.exit = function(code) {
exitCode = code;
callback(null, done());
};
process.emit = function(ev, value) {
if (ev === 'uncaughtException') {
done();
callback(value);
return true;
}
return _emit.apply(this, arguments);
};
func();
} else {
try {
result = func();
} finally {
reset();
}
return done();
}
}

Просмотреть файл

@ -1,3 +1,5 @@
import sinon from 'sinon';
import { IOBase } from 'io/base';
import { unexpectedSuccess } from '../helpers';
@ -8,11 +10,11 @@ describe('io.IOBase()', function() {
it('should init class props as expected', () => {
var io = new IOBase('foo/bar');
assert.equal(io.path, 'foo/bar');
assert.equal(io.entries.length, 0);
assert.equal(Object.keys(io.files).length, 0);
assert.equal(typeof io.files, 'object');
assert.equal(io.maxSizeBytes, 104857600);
expect(io.path).toEqual('foo/bar');
expect(io.entries.length).toEqual(0);
expect(Object.keys(io.files).length).toEqual(0);
expect(typeof io.files).toEqual('object');
expect(io.maxSizeBytes).toEqual(104857600);
});
it('should reject calling getFiles()', () => {
@ -21,8 +23,8 @@ describe('io.IOBase()', function() {
return io.getFiles()
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.equal(err.message, 'getFiles is not implemented');
expect(err).toBeInstanceOf(Error);
expect(err.message).toEqual('getFiles is not implemented');
});
});
@ -32,19 +34,19 @@ describe('io.IOBase()', function() {
return io.getFileAsString()
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.equal(err.message, 'getFileAsString is not implemented');
expect(err).toBeInstanceOf(Error);
expect(err.message).toEqual('getFileAsString is not implemented');
});
});
it('should reject calling getFileAsString()', () => {
it('should reject calling getFileAsStream()', () => {
var io = new IOBase('foo/bar');
return io.getFileAsStream()
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.equal(err.message, 'getFileAsStream is not implemented');
expect(err).toBeInstanceOf(Error);
expect(err.message).toEqual('getFileAsStream is not implemented');
});
});
@ -54,8 +56,8 @@ describe('io.IOBase()', function() {
return io.getChunkAsBuffer()
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.equal(err.message, 'getChunkAsBuffer is not implemented');
expect(err).toBeInstanceOf(Error);
expect(err.message).toEqual('getChunkAsBuffer is not implemented');
});
});
@ -63,46 +65,46 @@ describe('io.IOBase()', function() {
var io = new IOBase('foo/bar');
io.getFileAsStream = sinon.stub();
io.getFile('get-a-stream', 'stream');
assert.ok(io.getFileAsStream.calledWith('get-a-stream'));
expect(io.getFileAsStream.calledWith('get-a-stream')).toBeTruthy();
});
it('should call getFileAsString method via getFile()', () => {
var io = new IOBase('foo/bar');
io.getFileAsString = sinon.stub();
io.getFile('get-a-string', 'string');
assert.ok(io.getFileAsString.calledWith('get-a-string'));
expect(io.getFileAsString.calledWith('get-a-string')).toBeTruthy();
});
it('should call getChunkAsBuffer method via getFile()', () => {
var io = new IOBase('foo/bar');
io.getChunkAsBuffer = sinon.stub();
io.getFile('get-a-chunk-as-buffer', 'chunk');
assert.ok(io.getChunkAsBuffer.calledWith('get-a-chunk-as-buffer',
FLAGGED_FILE_MAGIC_NUMBERS_LENGTH));
expect(io.getChunkAsBuffer.calledWith('get-a-chunk-as-buffer',
FLAGGED_FILE_MAGIC_NUMBERS_LENGTH)).toBeTruthy();
});
it('should scan all files by default', () => {
const io = new IOBase('foo/bar');
assert.ok(io.shouldScanFile('install.rdf'));
assert.ok(io.shouldScanFile('manifest.json'));
expect(io.shouldScanFile('install.rdf')).toBeTruthy();
expect(io.shouldScanFile('manifest.json')).toBeTruthy();
});
it('should allow configuration of which files can be scanned', () => {
const io = new IOBase('foo/bar');
io.setScanFileCallback((fileName) => fileName !== 'install.rdf');
assert.notOk(io.shouldScanFile('install.rdf'));
assert.ok(io.shouldScanFile('manifest.json'));
expect(io.shouldScanFile('install.rdf')).toBeFalsy();
expect(io.shouldScanFile('manifest.json')).toBeTruthy();
});
it('should ignore undefined scan file callbacks', () => {
const io = new IOBase('foo/bar');
io.setScanFileCallback(undefined);
assert.ok(io.shouldScanFile('manifest.json'));
expect(io.shouldScanFile('manifest.json')).toBeTruthy();
});
it('should ignore a non-function scan file callback', () => {
const io = new IOBase('foo/bar');
io.setScanFileCallback(42); // this is not a function
assert.ok(io.shouldScanFile('manifest.json'));
expect(io.shouldScanFile('manifest.json')).toBeTruthy();
});
});

Просмотреть файл

@ -1,3 +1,5 @@
import sinon from 'sinon';
import { ZipFile } from 'yauzl';
import { Crx } from 'io';
@ -56,7 +58,7 @@ describe('Crx.open()', function() {
var myCrx = new Crx('tests/fixtures/extension.crx');
return myCrx.open()
.then((zipfile) => {
assert.instanceOf(zipfile, ZipFile);
expect(zipfile).toBeInstanceOf(ZipFile);
});
});
@ -89,9 +91,9 @@ describe('crx.getFiles()', function() {
it('should init class props as expected', () => {
var myCrx = new Crx('foo/bar', this.fakeZipLib);
assert.equal(myCrx.path, 'foo/bar');
assert.equal(typeof myCrx.files, 'object');
assert.equal(Object.keys(myCrx.files).length, 0);
expect(myCrx.path).toEqual('foo/bar');
expect(typeof myCrx.files).toEqual('object');
expect(Object.keys(myCrx.files).length).toEqual(0);
});
it('should return cached data when available', () => {
@ -102,8 +104,8 @@ describe('crx.getFiles()', function() {
};
return myCrx.getFiles()
.then((files) => {
assert.deepEqual(files, myCrx.files);
assert.notOk(this.fromBufferStub.called);
expect(files).toEqual(myCrx.files);
expect(this.fromBufferStub.called).toBeFalsy();
});
});
@ -138,7 +140,7 @@ describe('crx.getFiles()', function() {
return myCrx.getFiles(onEventsSubscribed)
.then((files) => {
assert.deepEqual(files, expected);
expect(files).toEqual(expected);
});
});
@ -158,8 +160,8 @@ describe('crx.getFiles()', function() {
return myCrx.getFiles(onEventsSubscribed)
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.include(err.message, 'DuplicateZipEntry');
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('DuplicateZipEntry');
});
});
@ -172,7 +174,7 @@ describe('crx.getFiles()', function() {
return myCrx.getFiles()
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'open test');
expect(err.message).toContain('open test');
});
});
@ -186,7 +188,7 @@ describe('crx.getFiles()', function() {
return myCrx.getFiles()
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'open test');
expect(err.message).toContain('open test');
});
});
@ -201,7 +203,7 @@ describe('crx.getFiles()', function() {
return myCrx.getFiles()
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'open test');
expect(err.message).toContain('open test');
});
});
});

Просмотреть файл

@ -1,3 +1,5 @@
import sinon from 'sinon';
import { EventEmitter } from 'events';
import { Directory } from 'io';
@ -20,8 +22,8 @@ describe('Directory.getFiles()', function() {
return myDirectory.getFiles(fakeWalkPromise)
.then((files) => {
assert.deepEqual(files, myDirectory.files);
assert.notOk(fakeWalkPromise.called);
expect(files).toEqual(myDirectory.files);
expect(fakeWalkPromise.called).toBeFalsy();
});
});
@ -31,9 +33,9 @@ describe('Directory.getFiles()', function() {
return myDirectory.getFiles()
.then((files) => {
var fileNames = Object.keys(files);
assert.include(fileNames, 'dir1/file1.txt');
assert.include(fileNames, 'dir2/file2.txt');
assert.include(fileNames, 'dir2/dir3/file3.txt');
expect(fileNames).toContain('dir1/file1.txt');
expect(fileNames).toContain('dir2/file2.txt');
expect(fileNames).toContain('dir2/dir3/file3.txt');
});
});
@ -46,9 +48,9 @@ describe('Directory.getFiles()', function() {
return myDirectory.getFiles()
.then((files) => {
var fileNames = Object.keys(files);
assert.include(fileNames, 'dir1/file1.txt');
assert.notInclude(fileNames, 'dir2/file2.txt');
assert.notInclude(fileNames, 'dir2/dir3/file3.txt');
expect(fileNames).toContain('dir1/file1.txt');
expect(fileNames).not.toContain('dir2/file2.txt');
expect(fileNames).not.toContain('dir2/dir3/file3.txt');
});
});
@ -64,9 +66,9 @@ describe('Directory.getFiles()', function() {
return myDirectory.getFiles()
.then((files) => {
var fileNames = Object.keys(files);
assert.notInclude(fileNames, 'dir1/file1.txt');
assert.notInclude(fileNames, 'dir2/file2.txt');
assert.include(fileNames, 'dir2/dir3/file3.txt');
expect(fileNames).not.toContain('dir1/file1.txt');
expect(fileNames).not.toContain('dir2/file2.txt');
expect(fileNames).toContain('dir2/dir3/file3.txt');
});
});
@ -81,8 +83,9 @@ describe('Directory._getPath()', function() {
return myDirectory.getPath('whatever')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(
err.message, '"whatever" does not exist in this dir.');
expect(err.message).toContain(
'"whatever" does not exist in this dir.'
);
});
});
});
@ -95,7 +98,7 @@ describe('Directory._getPath()', function() {
return myDirectory.getPath('../file1.txt')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'Path argument must be relative');
expect(err.message).toContain('Path argument must be relative');
});
});
@ -107,7 +110,7 @@ describe('Directory._getPath()', function() {
return myDirectory.getPath('/file1.txt')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'Path argument must be relative');
expect(err.message).toContain('Path argument must be relative');
});
});
@ -139,7 +142,7 @@ describe('Directory.getFileAsStream()', function() {
});
})
.then((content) => {
assert.equal(content, '123\n');
expect(content).toEqual('123\n');
});
});
@ -158,8 +161,7 @@ describe('Directory.getFileAsStream()', function() {
return myDirectory.getFileAsStream('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(
err.message, 'File "install.rdf" is too large');
expect(err.message).toContain('File "install.rdf" is too large');
});
});
@ -175,7 +177,7 @@ describe('Directory.getFileAsString()', function() {
return myDirectory.getFileAsString('dir3/foo.txt');
})
.then((content) => {
assert.notOk(content.charCodeAt(0) === 0xFEFF);
expect(content.charCodeAt(0)).not.toEqual(0xFEFF);
});
});
@ -186,7 +188,7 @@ describe('Directory.getFileAsString()', function() {
return myDirectory.getFileAsString('dir2/dir3/file3.txt');
})
.then((string) => {
assert.equal(string, '123\n');
expect(string).toEqual('123\n');
});
});
@ -209,7 +211,7 @@ describe('Directory.getFileAsString()', function() {
return myDirectory.getFileAsString('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, '¡hola!');
expect(err.message).toContain('¡hola!');
});
});
@ -226,8 +228,7 @@ describe('Directory.getFileAsString()', function() {
return myDirectory.getFileAsString('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(
err.message, 'File "install.rdf" is too large');
expect(err.message).toContain('File "install.rdf" is too large');
});
});
@ -252,7 +253,7 @@ describe('Directory.getChunkAsBuffer()', function() {
.then((buffer) => {
// The file contains: 123\n. This tests that we are getting just
// the first two characters in the buffer.
assert.equal(buffer.toString(), '12');
expect(buffer.toString()).toEqual('12');
});
});

Просмотреть файл

@ -6,18 +6,18 @@ describe('io.utils.walkPromise()', function() {
return walkPromise('tests/fixtures/io/')
.then((files) => {
var fileNames = Object.keys(files);
assert.include(fileNames, 'dir1/file1.txt');
assert.include(fileNames, 'dir2/file2.txt');
assert.include(fileNames, 'dir2/dir3/file3.txt');
expect(fileNames).toContain('dir1/file1.txt');
expect(fileNames).toContain('dir2/file2.txt');
expect(fileNames).toContain('dir2/dir3/file3.txt');
});
});
it('should return the correct size data', () => {
return walkPromise('tests/fixtures/io/')
.then((files) => {
assert.equal(files['dir1/file1.txt'].size, 2);
assert.equal(files['dir2/file2.txt'].size, 3);
assert.equal(files['dir2/dir3/file3.txt'].size, 4);
expect(files['dir1/file1.txt'].size).toEqual(2);
expect(files['dir2/file2.txt'].size).toEqual(3);
expect(files['dir2/dir3/file3.txt'].size).toEqual(4);
});
});
@ -30,9 +30,9 @@ describe('io.utils.walkPromise()', function() {
})
.then((files) => {
var fileNames = Object.keys(files);
assert.include(fileNames, 'dir1/file1.txt');
assert.notInclude(fileNames, 'dir2/file2.txt');
assert.notInclude(fileNames, 'dir2/dir3/file3.txt');
expect(fileNames).toContain('dir1/file1.txt');
expect(fileNames).not.toContain('dir2/file2.txt');
expect(fileNames).not.toContain('dir2/dir3/file3.txt');
});
});
@ -45,8 +45,8 @@ describe('io.utils.walkPromise()', function() {
})
.then((files) => {
var fileNames = Object.keys(files);
assert.notInclude(fileNames, 'dir2/file2.txt');
assert.include(fileNames, 'dir2/dir3/file3.txt');
expect(fileNames).not.toContain('dir2/file2.txt');
expect(fileNames).toContain('dir2/dir3/file3.txt');
});
});
@ -60,7 +60,7 @@ describe('io.utils.walkPromise()', function() {
})
.then((files) => {
var fileNames = Object.keys(files);
assert.deepEqual(fileNames, []);
expect(fileNames).toEqual([]);
});
});

Просмотреть файл

@ -1,3 +1,5 @@
import sinon from 'sinon';
import { Readable } from 'stream';
import { EventEmitter } from 'events';
@ -66,7 +68,7 @@ describe('Xpi.open()', function() {
this.openStub.yieldsAsync(null, this.fakeZipFile);
return myXpi.open()
.then((zipfile) => {
assert.equal(zipfile.testprop, 'I am the fake zip');
expect(zipfile.testprop).toEqual('I am the fake zip');
});
});
@ -77,7 +79,7 @@ describe('Xpi.open()', function() {
return myXpi.open()
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'open() test');
expect(err.message).toContain('open() test');
});
});
@ -107,9 +109,9 @@ describe('xpi.getFiles()', function() {
it('should init class props as expected', () => {
var myXpi = new Xpi('foo/bar', this.fakeZipLib);
assert.equal(myXpi.path, 'foo/bar');
assert.equal(typeof myXpi.files, 'object');
assert.equal(Object.keys(myXpi.files).length, 0);
expect(myXpi.path).toEqual('foo/bar');
expect(typeof myXpi.files).toEqual('object');
expect(Object.keys(myXpi.files).length).toEqual(0);
});
it('should return cached data when available', () => {
@ -120,8 +122,8 @@ describe('xpi.getFiles()', function() {
};
return myXpi.getFiles()
.then((files) => {
assert.deepEqual(files, myXpi.files);
assert.notOk(this.openStub.called);
expect(files).toEqual(myXpi.files);
expect(this.openStub.called).toBeFalsy();
});
});
@ -153,7 +155,7 @@ describe('xpi.getFiles()', function() {
return myXpi.getFiles(onEventsSubscribed)
.then((files) => {
assert.deepEqual(files, expected);
expect(files).toEqual(expected);
});
});
@ -181,8 +183,8 @@ describe('xpi.getFiles()', function() {
});
return myXpi.getFiles(onEventsSubscribed)
.then((files) => {
assert.equal(files['chrome.manifest'], chromeManifestEntry);
assert.isUndefined(files['install.rdf']);
expect(files['chrome.manifest']).toEqual(chromeManifestEntry);
expect(files['install.rdf']).not.toBeDefined();
});
});
@ -205,8 +207,8 @@ describe('xpi.getFiles()', function() {
});
return myXpi.getFiles()
.then((files) => {
assert.equal(files['chrome.manifest'], chromeManifestEntry);
assert.isUndefined(files['install.rdf']);
expect(files['chrome.manifest']).toEqual(chromeManifestEntry);
expect(files['install.rdf']).not.toBeDefined();
});
});
@ -223,8 +225,8 @@ describe('xpi.getFiles()', function() {
return myXpi.getFiles(onEventsSubscribed)
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.include(err.message, 'DuplicateZipEntry');
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('DuplicateZipEntry');
});
});
@ -235,7 +237,7 @@ describe('xpi.getFiles()', function() {
return myXpi.getFiles()
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'open test');
expect(err.message).toContain('open test');
});
});
});
@ -245,9 +247,9 @@ describe('Xpi.getFile()', function() {
it('should throw if fileStreamType is incorrect', () => {
var myXpi = new Xpi('foo/bar', this.fakeZipLib);
assert.throw(() => {
expect(() => {
myXpi.getFile('whatever-file', 'whatever');
}, Error, /Unexpected fileStreamType value "whatever"/);
}).toThrowError('Unexpected fileStreamType value "whatever"');
});
it('should call getFileAsString', () => {
@ -255,7 +257,7 @@ describe('Xpi.getFile()', function() {
var fakeFile = 'fakeFile';
myXpi.getFileAsString = sinon.stub();
myXpi.getFile(fakeFile, 'string');
assert.ok(myXpi.getFileAsString.calledWith(fakeFile));
expect(myXpi.getFileAsString.calledWith(fakeFile)).toBeTruthy();
});
it('should call getFileAsStream', () => {
@ -263,7 +265,7 @@ describe('Xpi.getFile()', function() {
var fakeFile = 'fakeFile';
myXpi.getFileAsStream = sinon.stub();
myXpi.getFile(fakeFile, 'stream');
assert.ok(myXpi.getFileAsStream.calledWith(fakeFile));
expect(myXpi.getFileAsStream.calledWith(fakeFile)).toBeTruthy();
});
});
@ -280,7 +282,7 @@ describe('Xpi.checkPath()', function() {
return myXpi.getFileAsStream('whatever')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'Path "whatever" does not exist');
expect(err.message).toContain('Path "whatever" does not exist');
});
});
@ -298,8 +300,7 @@ describe('Xpi.checkPath()', function() {
return myXpi.getFileAsStream('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(
err.message, 'File "install.rdf" is too large');
expect(err.message).toContain('File "install.rdf" is too large');
});
});
@ -317,8 +318,7 @@ describe('Xpi.checkPath()', function() {
return myXpi.getFileAsString('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(
err.message, 'File "install.rdf" is too large');
expect(err.message).toContain('File "install.rdf" is too large');
});
});
@ -359,7 +359,7 @@ describe('Xpi.getChunkAsBuffer()', function() {
return myXpi.getChunkAsBuffer('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'getChunkAsBuffer openReadStream test');
expect(err.message).toContain('getChunkAsBuffer openReadStream test');
});
});
@ -382,7 +382,7 @@ describe('Xpi.getChunkAsBuffer()', function() {
.then((buffer) => {
// The file contains: 123\n. This tests that we are getting just
// the first two characters in the buffer.
assert.equal(buffer.toString(), '12');
expect(buffer.toString()).toEqual('12');
});
});
@ -418,7 +418,7 @@ describe('Xpi.getFileAsStream()', function() {
return myXpi.getFileAsStream('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'getFileAsStream openReadStream test');
expect(err.message).toContain('getFileAsStream openReadStream test');
});
});
@ -458,8 +458,8 @@ describe('Xpi.getFileAsStream()', function() {
})
.then((chunks) => {
var [chunk1, chunk2] = chunks.split('\n');
assert.equal(chunk1, 'line one');
assert.equal(chunk2, 'line two');
expect(chunk1).toEqual('line one');
expect(chunk2).toEqual('line two');
});
});
});
@ -482,7 +482,7 @@ describe('Xpi.getFileAsStream()', function() {
return myXpi.getFileAsString('install.rdf')
.then((string) => {
assert.equal(string, 'line one\nline two');
expect(string).toEqual('line one\nline two');
});
});
@ -500,7 +500,7 @@ describe('Xpi.getFileAsStream()', function() {
return myXpi.getFileAsString('install.rdf')
.then((string) => {
assert.notOk(string.charCodeAt(0) === 0xFEFF);
expect(string.charCodeAt(0) === 0xFEFF).toBeFalsy();
});
});
@ -518,7 +518,7 @@ describe('Xpi.getFileAsStream()', function() {
return myXpi.getFileAsString('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'getFileAsString openReadStream test');
expect(err.message).toContain('getFileAsString openReadStream test');
});
});
@ -541,7 +541,7 @@ describe('Xpi.getFileAsStream()', function() {
return myXpi.getFileAsString('install.rdf')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, '¡hola!');
expect(err.message).toContain('¡hola!');
});
});
@ -566,12 +566,12 @@ describe('Xpi.getFilesByExt()', function() {
return myXpi.getFilesByExt('.js')
.then((jsFiles) => {
assert.equal(jsFiles.length, 2);
assert.equal(jsFiles[0], 'main.js');
assert.equal(jsFiles[1], 'secondary.js');
expect(jsFiles.length).toEqual(2);
expect(jsFiles[0]).toEqual('main.js');
expect(jsFiles[1]).toEqual('secondary.js');
for (let i = 0; i < jsFiles.length; i++) {
assert.ok(jsFiles[i].endsWith('.js'));
expect(jsFiles[i].endsWith('.js')).toBeTruthy();
}
});
});
@ -587,12 +587,12 @@ describe('Xpi.getFilesByExt()', function() {
return myXpi.getFilesByExt('.css')
.then((cssFiles) => {
assert.equal(cssFiles.length, 2);
assert.equal(cssFiles[0], 'other.css');
assert.equal(cssFiles[1], 'styles.css');
expect(cssFiles.length).toEqual(2);
expect(cssFiles[0]).toEqual('other.css');
expect(cssFiles[1]).toEqual('styles.css');
for (let i = 0; i < cssFiles.length; i++) {
assert.ok(cssFiles[i].endsWith('.css'));
expect(cssFiles[i].endsWith('.css')).toBeTruthy();
}
});
});
@ -610,14 +610,14 @@ describe('Xpi.getFilesByExt()', function() {
return myXpi.getFilesByExt('.html', '.htm')
.then((htmlFiles) => {
assert.equal(htmlFiles.length, 3);
assert.equal(htmlFiles[0], 'index.html');
assert.equal(htmlFiles[1], 'second.htm');
assert.equal(htmlFiles[2], 'third.html');
expect(htmlFiles.length).toEqual(3);
expect(htmlFiles[0]).toEqual('index.html');
expect(htmlFiles[1]).toEqual('second.htm');
expect(htmlFiles[2]).toEqual('third.html');
for (let i = 0; i < htmlFiles.length; i++) {
assert.ok(htmlFiles[i].endsWith('.html') ||
htmlFiles[i].endsWith('.htm'));
expect(htmlFiles[i].endsWith('.html') ||
htmlFiles[i].endsWith('.htm')).toBeTruthy();
}
});
});
@ -627,7 +627,7 @@ describe('Xpi.getFilesByExt()', function() {
return myXpi.getFilesByExt('css')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'File extension must start with');
expect(err.message).toContain('File extension must start with');
});
});

Просмотреть файл

@ -24,7 +24,7 @@ describe('InstallRdfParser._getAddonType()', function() {
})
.then(unexpectedSuccess)
.catch((err) => {
assert.equal(err.message, 'Multiple <em:type> elements found');
expect(err.message).toEqual('Multiple <em:type> elements found');
});
});
@ -40,8 +40,8 @@ describe('InstallRdfParser._getAddonType()', function() {
})
.then(() => {
var errors = addonLinter.collector.errors;
assert.equal(errors.length, 1);
assert.equal(errors[0].code, messages.RDF_TYPE_INVALID.code);
expect(errors.length).toEqual(1);
expect(errors[0].code).toEqual(messages.RDF_TYPE_INVALID.code);
});
});
@ -57,7 +57,7 @@ describe('InstallRdfParser._getAddonType()', function() {
})
.then((type) => {
// Type 2 maps to 1 PACKAGE_EXTENSION
assert.equal(type, constants.PACKAGE_EXTENSION);
expect(type).toEqual(constants.PACKAGE_EXTENSION);
});
});
@ -73,7 +73,7 @@ describe('InstallRdfParser._getAddonType()', function() {
})
.then((type) => {
// Type 128 (experiments) maps to 1 PACKAGE_EXTENSION
assert.equal(type, constants.PACKAGE_EXTENSION);
expect(type).toEqual(constants.PACKAGE_EXTENSION);
});
});
@ -90,8 +90,8 @@ describe('InstallRdfParser._getAddonType()', function() {
})
.then(() => {
var notices = addonLinter.collector.notices;
assert.equal(notices.length, 1);
assert.equal(notices[0].code, messages.RDF_TYPE_MISSING.code);
expect(notices.length).toEqual(1);
expect(notices[0].code).toEqual(messages.RDF_TYPE_MISSING.code);
});
});
});
@ -107,7 +107,7 @@ describe('InstallRdfParser._getVersion()', function() {
return installRdfParser._getVersion();
})
.then((name) => {
assert.equal(name, '1.0');
expect(name).toEqual('1.0');
});
});
@ -123,8 +123,8 @@ describe('InstallRdfParser._getVersion()', function() {
})
.then(() => {
var errors = addonLinter.collector.errors;
assert.equal(errors.length, 1);
assert.equal(errors[0].code, messages.RDF_VERSION_MISSING.code);
expect(errors.length).toEqual(1);
expect(errors[0].code).toEqual(messages.RDF_VERSION_MISSING.code);
});
});
});
@ -140,7 +140,7 @@ describe('InstallRdfParser._getName()', function() {
return installRdfParser._getName();
})
.then((name) => {
assert.equal(name, 'my-awesome-ext');
expect(name).toEqual('my-awesome-ext');
});
});
@ -156,8 +156,8 @@ describe('InstallRdfParser._getName()', function() {
})
.then(() => {
var errors = addonLinter.collector.errors;
assert.equal(errors.length, 1);
assert.equal(errors[0].code, messages.RDF_NAME_MISSING.code);
expect(errors.length).toEqual(1);
expect(errors[0].code).toEqual(messages.RDF_NAME_MISSING.code);
});
});
});
@ -173,8 +173,8 @@ describe('InstallRdfParser._getGUID()', function() {
return installRdfParser._getGUID();
})
.then((guid) => {
assert.typeOf(guid, 'string');
assert.equal(guid, 'myid');
expect(typeof guid).toBe('string');
expect(guid).toEqual('myid');
});
});
@ -189,7 +189,7 @@ describe('InstallRdfParser._getGUID()', function() {
return installRdfParser._getGUID();
})
.then((guid) => {
assert.equal(guid, null);
expect(guid).toEqual(null);
});
});
@ -203,7 +203,7 @@ describe('InstallRdfParser._getGUID()', function() {
return installRdfParser._getGUID();
})
.then((guid) => {
assert.equal(guid, 'hai');
expect(guid).toEqual('hai');
});
});
@ -220,9 +220,9 @@ describe('InstallRdfParser._getGUID()', function() {
})
.then((guid) => {
var errors = addonLinter.collector.errors;
assert.equal(guid, longGUID);
assert.equal(errors.length, 1);
assert.equal(errors[0].code, messages.RDF_GUID_TOO_LONG.code);
expect(guid).toEqual(longGUID);
expect(errors.length).toEqual(1);
expect(errors[0].code).toEqual(messages.RDF_GUID_TOO_LONG.code);
});
});
@ -238,8 +238,8 @@ describe('InstallRdfParser._getIsBootstrapped()', () => {
return installRdfParser._getIsBootstrapped();
})
.then((bootstrap) => {
assert.typeOf(bootstrap, 'boolean');
assert.equal(bootstrap, true);
expect(typeof bootstrap).toBe('boolean');
expect(bootstrap).toEqual(true);
});
});
@ -252,8 +252,8 @@ describe('InstallRdfParser._getIsBootstrapped()', () => {
return installRdfParser._getIsBootstrapped();
})
.then((bootstrap) => {
assert.typeOf(bootstrap, 'boolean');
assert.equal(bootstrap, false);
expect(typeof bootstrap).toBe('boolean');
expect(bootstrap).toEqual(false);
});
});
@ -267,8 +267,8 @@ describe('InstallRdfParser._getIsBootstrapped()', () => {
return installRdfParser._getIsBootstrapped();
})
.then((bootstrap) => {
assert.typeOf(bootstrap, 'boolean');
assert.equal(bootstrap, true);
expect(typeof bootstrap).toBe('boolean');
expect(bootstrap).toEqual(true);
});
});
@ -281,8 +281,8 @@ describe('InstallRdfParser._getIsBootstrapped()', () => {
return installRdfParser._getIsBootstrapped();
})
.then((bootstrap) => {
assert.typeOf(bootstrap, 'boolean');
assert.equal(bootstrap, false);
expect(typeof bootstrap).toBe('boolean');
expect(bootstrap).toEqual(false);
});
});
});
@ -300,8 +300,9 @@ describe('InstallRdfParser._getDescriptionNode()', function() {
})
.then(unexpectedSuccess)
.catch((err) => {
assert.equal(err.message,
'RDF node should only have a single descendant <Description>');
expect(err.message).toEqual(
'RDF node should only have a single descendant <Description>'
);
});
});
});
@ -319,7 +320,7 @@ describe('InstallRdfParser._getRDFNode()', function() {
})
.then(unexpectedSuccess)
.catch((err) => {
assert.equal(err.message, 'RDF Node is not defined');
expect(err.message).toEqual('RDF Node is not defined');
});
});
@ -333,7 +334,7 @@ describe('InstallRdfParser._getRDFNode()', function() {
})
.then(unexpectedSuccess)
.catch((err) => {
assert.equal(err.message, 'Multiple RDF tags found');
expect(err.message).toEqual('Multiple RDF tags found');
});
});

Просмотреть файл

@ -1,5 +1,6 @@
import Linter from 'linter';
import JSONParser from 'parsers/json';
import sinon from 'sinon';
import * as messages from 'messages';
import { singleLineString } from 'utils';
@ -13,12 +14,12 @@ describe('JSONParser', function() {
var jsonParser = new JSONParser('blah', addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, false);
expect(jsonParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors.length, 1);
assert.equal(errors[0].code, messages.JSON_INVALID.code);
assert.include(errors[0].message, 'Your JSON is not valid.');
assert.include(errors[0].description, 'Unexpected token b');
expect(errors.length).toEqual(1);
expect(errors[0].code).toEqual(messages.JSON_INVALID.code);
expect(errors[0].message).toContain('Your JSON is not valid.');
expect(errors[0].description).toContain('Unexpected token b');
});
});
@ -47,13 +48,13 @@ describe('JSONParser duplicate keys', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, false);
expect(jsonParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.lengthOf(errors, 1);
assert.equal(errors[0].code, messages.JSON_DUPLICATE_KEY.code);
assert.include(errors[0].message, 'Duplicate keys are not allowed');
assert.equal(errors[0].line, 6);
assert.include(errors[0].description, 'Duplicate key: name found');
expect(errors.length).toBe(1);
expect(errors[0].code).toEqual(messages.JSON_DUPLICATE_KEY.code);
expect(errors[0].message).toContain('Duplicate keys are not allowed');
expect(errors[0].line).toEqual(6);
expect(errors[0].description).toContain('Duplicate key: name found');
});
it('should report all dupes if multiple duplicate keys are found', () => {
@ -76,16 +77,16 @@ describe('JSONParser duplicate keys', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, false);
expect(jsonParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.lengthOf(errors, 3);
assert.equal(errors[0].code, messages.JSON_DUPLICATE_KEY.code);
expect(errors.length).toBe(3);
expect(errors[0].code).toEqual(messages.JSON_DUPLICATE_KEY.code);
// We expect the duplicate error messages to be in the order of the
// dupliate keys in the manifest.
assert.include(errors[0].message, 'Duplicate keys are not allowed');
assert.include(errors[0].description, 'Duplicate key: name found');
assert.include(errors[1].description, 'Duplicate key: version found');
assert.include(errors[2].description, 'Duplicate key: name found');
expect(errors[0].message).toContain('Duplicate keys are not allowed');
expect(errors[0].description).toContain('Duplicate key: name found');
expect(errors[1].description).toContain('Duplicate key: version found');
expect(errors[2].description).toContain('Duplicate key: name found');
});
it('should not expose other RJSON errors', () => {
@ -106,7 +107,7 @@ describe('JSONParser duplicate keys', function() {
'}'].join('\n');
/* eslint-enable indent */
var fakeRJSON = { parse: () => {} };
var parseStub = sinon.stub(fakeRJSON, 'parse', () => {
var parseStub = sinon.stub(fakeRJSON, 'parse').callsFake(() => {
throw {
warnings: [
{
@ -124,15 +125,16 @@ describe('JSONParser duplicate keys', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse(fakeRJSON);
assert.equal(jsonParser.isValid, false);
assert.ok(parseStub.called);
expect(jsonParser.isValid).toEqual(false);
expect(parseStub.called).toBeTruthy();
var errors = addonLinter.collector.errors;
assert.lengthOf(errors, 1);
assert.equal(errors[0].code, messages.JSON_DUPLICATE_KEY.code);
assert.include(errors[0].message, 'Duplicate keys are not allowed');
assert.equal(errors[0].line, 1);
assert.include(errors[0].description,
'Duplicate key: not actually found but this is a test');
expect(errors.length).toBe(1);
expect(errors[0].code).toEqual(messages.JSON_DUPLICATE_KEY.code);
expect(errors[0].message).toContain('Duplicate keys are not allowed');
expect(errors[0].line).toEqual(1);
expect(errors[0].description).toContain(
'Duplicate key: not actually found but this is a test'
);
});
it('should not be invalid if unknown RJSON errors', () => {
@ -142,7 +144,7 @@ describe('JSONParser duplicate keys', function() {
var json = '{}';
var fakeRJSON = { parse: () => {} };
var parseStub = sinon.stub(fakeRJSON, 'parse', () => {
var parseStub = sinon.stub(fakeRJSON, 'parse').callsFake(() => {
throw {
warnings: [
{
@ -159,10 +161,10 @@ describe('JSONParser duplicate keys', function() {
// If RJSON throws an error we don't recognise, we should ignore it and
// continue on like the JSON is valid. Regular parsing errors will be
// picked up earlier in the process.
assert.equal(jsonParser.isValid, true);
assert.ok(parseStub.called);
expect(jsonParser.isValid).toEqual(true);
expect(parseStub.called).toBeTruthy();
var errors = addonLinter.collector.errors;
assert.lengthOf(errors, 0);
expect(errors.length).toBe(0);
});
});
@ -174,7 +176,7 @@ describe('JSONParser with comments', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, true);
expect(jsonParser.isValid).toEqual(true);
});
// Chrome will accept multiline /* */ comments, but Firefox will not and
@ -185,13 +187,13 @@ describe('JSONParser with comments', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, false);
expect(jsonParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
// There should not be another error; a file with block-level comments
// will throw that specific error and not a parse error.
assert.lengthOf(errors, 1);
assert.equal(errors[0].code, messages.JSON_BLOCK_COMMENTS.code);
assert.equal(errors[0].message, messages.JSON_BLOCK_COMMENTS.message);
expect(errors.length).toBe(1);
expect(errors[0].code).toEqual(messages.JSON_BLOCK_COMMENTS.code);
expect(errors[0].message).toEqual(messages.JSON_BLOCK_COMMENTS.message);
});
it('parses the example from Chrome developer docs', () => {
@ -209,8 +211,8 @@ describe('JSONParser with comments', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, true);
assert.notInclude(jsonParser._jsonString, 'semvar.org');
expect(jsonParser.isValid).toEqual(true);
expect(jsonParser._jsonString).not.toContain('semvar.org');
});
it('returns the correct error for malformed JSON', () => {
@ -219,10 +221,10 @@ describe('JSONParser with comments', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, false);
expect(jsonParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.JSON_INVALID.code);
assert.include(errors[0].message, 'Your JSON is not valid.');
expect(errors[0].code).toEqual(messages.JSON_INVALID.code);
expect(errors[0].message).toContain('Your JSON is not valid.');
});
it("doesn't evaluate JS code in comments", () => {
@ -231,12 +233,12 @@ describe('JSONParser with comments', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, false);
expect(jsonParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.JSON_INVALID.code);
assert.include(errors[0].message, 'Your JSON is not valid.');
assert.notInclude(jsonParser._jsonString, 'var bla');
assert.notInclude(jsonParser._jsonString, 'eval');
expect(errors[0].code).toEqual(messages.JSON_INVALID.code);
expect(errors[0].message).toContain('Your JSON is not valid.');
expect(jsonParser._jsonString).not.toContain('var bla');
expect(jsonParser._jsonString).not.toContain('eval');
});
it("doesn't evaluate JS code even though esprima is used", () => {
@ -253,9 +255,9 @@ describe('JSONParser with comments', function() {
var jsonParser = new JSONParser(json, addonLinter.collector);
jsonParser.parse();
assert.equal(jsonParser.isValid, false);
expect(jsonParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.JSON_INVALID.code);
assert.include(errors[0].message, 'Your JSON is not valid.');
expect(errors[0].code).toEqual(messages.JSON_INVALID.code);
expect(errors[0].message).toContain('Your JSON is not valid.');
});
});

Просмотреть файл

@ -11,16 +11,16 @@ describe('ManifestJSONParser', function() {
var addonLinter = new Linter({_: ['bar']});
var manifestJSONParser = new ManifestJSONParser('blah',
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors.length, 1);
assert.equal(errors[0].code, messages.JSON_INVALID.code);
assert.include(errors[0].message, 'Your JSON is not valid.');
expect(errors.length).toEqual(1);
expect(errors[0].code).toEqual(messages.JSON_INVALID.code);
expect(errors[0].message).toContain('Your JSON is not valid.');
var metadata = manifestJSONParser.getMetadata();
assert.equal(metadata.manifestVersion, null);
assert.equal(metadata.name, null);
assert.equal(metadata.version, null);
expect(metadata.manifestVersion).toEqual(null);
expect(metadata.name).toEqual(null);
expect(metadata.version).toEqual(null);
});
describe('id', function() {
@ -30,9 +30,9 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON();
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var metadata = manifestJSONParser.getMetadata();
assert.equal(metadata.id, '{daf44bf7-a45e-4450-979c-91cf07434c3d}');
expect(metadata.id).toEqual('{daf44bf7-a45e-4450-979c-91cf07434c3d}');
});
it('should fail on invalid id', () => {
@ -42,7 +42,7 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({applications: {gecko: {id: 'wat'}}});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
assertHasMatchingError(addonLinter.collector.errors, {
code: messages.JSON_INVALID.code,
message: /"\/applications\/gecko\/id" should match pattern/,
@ -54,9 +54,9 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({applications: {}});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var metadata = manifestJSONParser.getMetadata();
assert.equal(metadata.id, null);
expect(metadata.id).toEqual(null);
});
});
@ -68,11 +68,11 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({manifest_version: 'whatever'});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors.length, 1);
assert.equal(errors[0].code, messages.MANIFEST_FIELD_INVALID.code);
assert.include(errors[0].message, '/manifest_version');
expect(errors.length).toEqual(1);
expect(errors[0].code).toEqual(messages.MANIFEST_FIELD_INVALID.code);
expect(errors[0].message).toContain('/manifest_version');
});
it('should collect an error with numeric string value', () => {
@ -80,10 +80,10 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({manifest_version: '1'});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.MANIFEST_FIELD_INVALID.code);
assert.include(errors[0].message, '/manifest_version');
expect(errors[0].code).toEqual(messages.MANIFEST_FIELD_INVALID.code);
expect(errors[0].message).toContain('/manifest_version');
});
it('should have the right manifestVersion', () => {
@ -91,9 +91,9 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON();
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var metadata = manifestJSONParser.getMetadata();
assert.equal(metadata.manifestVersion, VALID_MANIFEST_VERSION);
expect(metadata.manifestVersion).toEqual(VALID_MANIFEST_VERSION);
});
});
@ -111,9 +111,9 @@ describe('ManifestJSONParser', function() {
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var warnings = addonLinter.collector.warnings;
assert.lengthOf(addonLinter.collector.errors, 0);
expect(addonLinter.collector.errors.length).toBe(0);
assertHasMatchingError(warnings, {
code: messages.MANIFEST_PERMISSIONS.code,
message: /Unknown permissions "fileSystem"/,
@ -133,10 +133,10 @@ describe('ManifestJSONParser', function() {
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.MANIFEST_BAD_PERMISSION.code);
assert.include(errors[0].message, 'should be string');
expect(errors[0].code).toEqual(messages.MANIFEST_BAD_PERMISSION.code);
expect(errors[0].message).toContain('should be string');
});
it('should error if permission is duplicated', () => {
@ -150,10 +150,10 @@ describe('ManifestJSONParser', function() {
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.MANIFEST_BAD_PERMISSION.code);
assert.include(errors[0].message, 'should NOT have duplicate items');
expect(errors[0].code).toEqual(messages.MANIFEST_BAD_PERMISSION.code);
expect(errors[0].message).toContain('should NOT have duplicate items');
});
});
@ -167,9 +167,9 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON();
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var metadata = manifestJSONParser.getMetadata();
assert.equal(metadata.type, PACKAGE_EXTENSION);
expect(metadata.type).toEqual(PACKAGE_EXTENSION);
});
it('should not allow the type to be user-specified', () => {
@ -177,9 +177,9 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({type: 'whatevs'});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var metadata = manifestJSONParser.getMetadata();
assert.equal(metadata.type, PACKAGE_EXTENSION);
expect(metadata.type).toEqual(PACKAGE_EXTENSION);
});
});
@ -198,7 +198,7 @@ describe('ManifestJSONParser', function() {
var parser = new ManifestJSONParser(validManifestJSON(),
addonLinter.collector);
var message = parser.errorLookup({dataPath: ''});
assert.equal(message.code, messages.JSON_INVALID.code);
expect(message.code).toEqual(messages.JSON_INVALID.code);
});
}
@ -207,7 +207,7 @@ describe('ManifestJSONParser', function() {
var parser = new ManifestJSONParser(validManifestJSON(),
addonLinter.collector);
var message = parser.errorLookup({dataPath: '', keyword: 'required'});
assert.equal(message.code, messages.MANIFEST_FIELD_REQUIRED.code);
expect(message.code).toEqual(messages.MANIFEST_FIELD_REQUIRED.code);
});
it('should return invalid for wrong type', () => {
@ -215,7 +215,7 @@ describe('ManifestJSONParser', function() {
var parser = new ManifestJSONParser(validManifestJSON(),
addonLinter.collector);
var message = parser.errorLookup({dataPath: '', keyword: 'type'});
assert.equal(message.code, messages.MANIFEST_FIELD_INVALID.code);
expect(message.code).toEqual(messages.MANIFEST_FIELD_INVALID.code);
});
it('should return permission for wrong type', () => {
@ -223,7 +223,7 @@ describe('ManifestJSONParser', function() {
var parser = new ManifestJSONParser(validManifestJSON(),
addonLinter.collector);
var message = parser.errorLookup({dataPath: '/permissions/0'});
assert.equal(message.code, messages.MANIFEST_PERMISSIONS.code);
expect(message.code).toEqual(messages.MANIFEST_PERMISSIONS.code);
});
});
@ -235,12 +235,13 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({permissions: ['tabs', 'wat']});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var warnings = addonLinter.collector.warnings;
assert.equal(warnings.length, 1);
assert.equal(warnings[0].code, messages.MANIFEST_PERMISSIONS.code);
assert.include(warnings[0].message,
'/permissions: Unknown permissions "wat" at 1.');
expect(warnings.length).toEqual(1);
expect(warnings[0].code).toEqual(messages.MANIFEST_PERMISSIONS.code);
expect(warnings[0].message).toContain(
'/permissions: Unknown permissions "wat" at 1.'
);
});
});
@ -253,9 +254,9 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({name: 'my-awesome-ext'});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var metadata = manifestJSONParser.getMetadata();
assert.equal(metadata.name, 'my-awesome-ext');
expect(metadata.name).toEqual('my-awesome-ext');
});
it('should collect an error on missing name value', () => {
@ -263,10 +264,10 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({name: undefined});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.MANIFEST_FIELD_REQUIRED.code);
assert.include(errors[0].message, '/name');
expect(errors[0].code).toEqual(messages.MANIFEST_FIELD_REQUIRED.code);
expect(errors[0].message).toContain('/name');
});
it('should collect an error on non-string name value', () => {
@ -274,10 +275,10 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({name: 1});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.MANIFEST_FIELD_INVALID.code);
assert.include(errors[0].message, '/name');
expect(errors[0].code).toEqual(messages.MANIFEST_FIELD_INVALID.code);
expect(errors[0].message).toContain('/name');
});
});
@ -289,9 +290,9 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({version: '1.0'});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var metadata = manifestJSONParser.getMetadata();
assert.equal(metadata.version, '1.0');
expect(metadata.version).toEqual('1.0');
});
it('should collect an error on missing version value', () => {
@ -299,10 +300,10 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({version: undefined});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.MANIFEST_FIELD_REQUIRED.code);
assert.include(errors[0].message, '/version');
expect(errors[0].code).toEqual(messages.MANIFEST_FIELD_REQUIRED.code);
expect(errors[0].message).toContain('/version');
});
it('should collect an error on non-string version value', () => {
@ -310,10 +311,10 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({version: 1});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.MANIFEST_FIELD_INVALID.code);
assert.include(errors[0].message, '/version');
expect(errors[0].code).toEqual(messages.MANIFEST_FIELD_INVALID.code);
expect(errors[0].message).toContain('/version');
});
it('should collect a notice on toolkit version values', () => {
@ -321,10 +322,10 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({version: '1.0.0.0pre0'});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var notices = addonLinter.collector.notices;
assert.equal(notices[0].code, messages.PROP_VERSION_TOOLKIT_ONLY.code);
assert.include(notices[0].message, 'version');
expect(notices[0].code).toEqual(messages.PROP_VERSION_TOOLKIT_ONLY.code);
expect(notices[0].message).toContain('version');
});
});
@ -336,10 +337,10 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({content_security_policy: 'wat?'});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var warnings = addonLinter.collector.warnings;
assert.equal(warnings[0].code, messages.MANIFEST_CSP.code);
assert.include(warnings[0].message, 'content_security_policy');
expect(warnings[0].code).toEqual(messages.MANIFEST_CSP.code);
expect(warnings[0].message).toContain('content_security_policy');
});
});
@ -355,10 +356,10 @@ describe('ManifestJSONParser', function() {
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector,
{selfHosted: false});
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
var notices = addonLinter.collector.notices;
assert.equal(notices[0].code, messages.MANIFEST_UNUSED_UPDATE.code);
assert.include(notices[0].message, 'update_url');
expect(notices[0].code).toEqual(messages.MANIFEST_UNUSED_UPDATE.code);
expect(notices[0].message).toContain('update_url');
});
// applications.gecko.update_url isn't allowed if the add-on is being
@ -375,10 +376,10 @@ describe('ManifestJSONParser', function() {
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector,
{selfHosted: false});
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.MANIFEST_UPDATE_URL.code);
assert.include(errors[0].message, 'update_url');
expect(errors[0].code).toEqual(messages.MANIFEST_UPDATE_URL.code);
expect(errors[0].message).toContain('update_url');
});
it('is not an issue if self-hosted', () => {
@ -394,8 +395,8 @@ describe('ManifestJSONParser', function() {
addonLinter.collector,
{selfHosted: true});
manifestJSONParser.selfHosted = true;
assert.equal(manifestJSONParser.isValid, true);
assert.lengthOf(addonLinter.collector.warnings, 0);
expect(manifestJSONParser.isValid).toEqual(true);
expect(addonLinter.collector.warnings.length).toBe(0);
});
});
@ -407,7 +408,7 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({background: {script: ['background.js']}});
var manifestJSONParser = new ManifestJSONParser(json,
addonLinter.collector);
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assertHasMatchingError(errors, {
code: messages.JSON_INVALID.code,
@ -423,9 +424,9 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({default_locale: 'fr'});
var manifestJSONParser = new ManifestJSONParser(
json, addonLinter.collector, {io: {files: {}}});
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.NO_MESSAGES_FILE.code);
expect(errors[0].code).toEqual(messages.NO_MESSAGES_FILE.code);
});
it('valid if not specified', () => {
@ -433,7 +434,7 @@ describe('ManifestJSONParser', function() {
var json = validManifestJSON({});
var manifestJSONParser = new ManifestJSONParser(
json, addonLinter.collector);
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
});
it('valid if file present', () => {
@ -442,7 +443,7 @@ describe('ManifestJSONParser', function() {
var manifestJSONParser = new ManifestJSONParser(
json, addonLinter.collector,
{io: {files: {'_locales/fr/messages.json': {}}}});
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
});
it('error if default_locale missing but messages.json present', () => {
@ -451,9 +452,9 @@ describe('ManifestJSONParser', function() {
var manifestJSONParser = new ManifestJSONParser(
json, addonLinter.collector,
{io: {files: {'_locales/fr/messages.json': {}}}});
assert.equal(manifestJSONParser.isValid, false);
expect(manifestJSONParser.isValid).toEqual(false);
var errors = addonLinter.collector.errors;
assert.equal(errors[0].code, messages.NO_DEFAULT_LOCALE.code);
expect(errors[0].code).toEqual(messages.NO_DEFAULT_LOCALE.code);
});
let messages_paths = [
@ -473,7 +474,7 @@ describe('ManifestJSONParser', function() {
var manifestJSONParser = new ManifestJSONParser(
json, addonLinter.collector,
{io: {files: files}});
assert.equal(manifestJSONParser.isValid, true);
expect(manifestJSONParser.isValid).toEqual(true);
});
}
});
@ -485,7 +486,7 @@ describe('ManifestJSONParser', function() {
delete json.icons;
const manifestJSONParser = new ManifestJSONParser(
json, linter.collector, {io: {files: []}});
assert.ok(manifestJSONParser.isValid);
expect(manifestJSONParser.isValid).toBeTruthy();
});
it('does not add errors if the icons are in the package', () => {
@ -502,7 +503,7 @@ describe('ManifestJSONParser', function() {
};
const manifestJSONParser = new ManifestJSONParser(
json, addonLinter.collector, {io: {files}});
assert.ok(manifestJSONParser.isValid);
expect(manifestJSONParser.isValid).toBeTruthy();
});
it('adds an error if the icon is not in the package', () => {
@ -518,7 +519,7 @@ describe('ManifestJSONParser', function() {
};
const manifestJSONParser = new ManifestJSONParser(
json, addonLinter.collector, {io: {files}});
assert.notOk(manifestJSONParser.isValid);
expect(manifestJSONParser.isValid).toBeFalsy();
assertHasMatchingError(addonLinter.collector.errors, {
code: messages.MANIFEST_ICON_NOT_FOUND,
message:

Просмотреть файл

@ -43,11 +43,10 @@ describe('CSS Rule General', () => {
return cssScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].message, 'Unclosed comment');
assert.equal(linterMessages[0].code,
messages.CSS_SYNTAX_ERROR.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].message).toEqual('Unclosed comment');
expect(linterMessages[0].code).toEqual(messages.CSS_SYNTAX_ERROR.code);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
});

Просмотреть файл

@ -19,10 +19,11 @@ describe('CSS Rule InvalidNesting', () => {
return cssScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.INVALID_SELECTOR_NESTING.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.INVALID_SELECTOR_NESTING.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -37,7 +38,7 @@ describe('CSS Rule InvalidNesting', () => {
return cssScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -54,10 +55,11 @@ describe('CSS Rule InvalidNesting', () => {
return cssScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.INVALID_SELECTOR_NESTING.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.INVALID_SELECTOR_NESTING.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});

Просмотреть файл

@ -16,10 +16,9 @@ describe('deprecated_entities', () => {
.then(({linterMessages}) => {
linterMessages = linterMessages.sort();
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
entity.error.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(entity.error.code);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -30,10 +29,9 @@ describe('deprecated_entities', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
entity.error.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(entity.error.code);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -43,10 +41,9 @@ describe('deprecated_entities', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
entity.error.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(entity.error.code);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -56,7 +53,7 @@ describe('deprecated_entities', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -66,7 +63,7 @@ describe('deprecated_entities', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -76,7 +73,7 @@ describe('deprecated_entities', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -86,7 +83,7 @@ describe('deprecated_entities', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
}

Просмотреть файл

@ -3,15 +3,14 @@ import { existsSync, readdirSync } from 'fs';
import { ESLINT_RULE_MAPPING } from 'const';
import * as jsRules from 'rules/javascript';
import { ignorePrivateFunctions, singleLineString } from 'utils';
import { ignorePrivateFunctions } from 'utils';
describe('Eslint rules object', () => {
it('should have keys that match the file names', () => {
for (let jsRule in ignorePrivateFunctions(jsRules)) {
var jsFilePath = path.join('src/rules/javascript/', `${jsRule}.js`);
assert.ok(existsSync(jsFilePath),
`key "${jsRule}" doesn't exist at "${jsFilePath}"`);
expect(existsSync(jsFilePath)).toBeTruthy();
}
});
@ -19,9 +18,9 @@ describe('Eslint rules object', () => {
var files = readdirSync('src/rules/javascript')
.filter((fileName) => fileName !== 'index.js');
for (let fileName of files) {
assert.ok(ESLINT_RULE_MAPPING.hasOwnProperty(path.parse(fileName).name),
singleLineString`fileName "${fileName}" does not have a
matching key in the eslint rules object.`);
expect(
ESLINT_RULE_MAPPING.hasOwnProperty(path.parse(fileName).name)
).toBeTruthy();
}
});
});

Просмотреть файл

@ -10,10 +10,11 @@ describe('event_listener_fourth', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.EVENT_LISTENER_FOURTH.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.EVENT_LISTENER_FOURTH.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -23,7 +24,7 @@ describe('event_listener_fourth', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -33,10 +34,11 @@ describe('event_listener_fourth', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.EVENT_LISTENER_FOURTH.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.EVENT_LISTENER_FOURTH.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -46,7 +48,7 @@ describe('event_listener_fourth', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -57,10 +59,11 @@ describe('event_listener_fourth', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.EVENT_LISTENER_FOURTH.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.EVENT_LISTENER_FOURTH.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -71,57 +74,59 @@ describe('event_listener_fourth', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
it('should not allow a true identifier', () => {
it('should not allow a window identifier', () => {
var code = singleLineString`var foo = window;
foo.addEventListener("click", function(){}, false, false);`;
var jsScanner = new JavaScriptScanner(code, 'badcode.js');
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
it('should not allow a true identifier', () => {
it('should not allow a hidden addEventListener identifier', () => {
var code = singleLineString`var foo = window.addEventListener;
foo("click", function(){}, false, false);`;
var jsScanner = new JavaScriptScanner(code, 'badcode.js');
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
it('should not allow a true identifier', () => {
it('should not allow a true identifier with untrusted argument', () => {
var code = singleLineString`var foo = window;
foo.addEventListener("click", function(){}, false, true);`;
var jsScanner = new JavaScriptScanner(code, 'badcode.js');
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.EVENT_LISTENER_FOURTH.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.EVENT_LISTENER_FOURTH.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
it('should not allow a true identifier', () => {
it('should not allow a true identifier hidden with arg', () => {
var code = singleLineString`var foo = window.addEventListener;
foo("click", function(){}, false, true);`;
var jsScanner = new JavaScriptScanner(code, 'badcode.js');
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.EVENT_LISTENER_FOURTH.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.EVENT_LISTENER_FOURTH.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});

Просмотреть файл

@ -10,9 +10,9 @@ describe('mozindexeddb', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, messages.MOZINDEXEDDB.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.MOZINDEXEDDB.code);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});

Просмотреть файл

@ -14,10 +14,11 @@ describe('mozindexeddb_property', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.MOZINDEXEDDB_PROPERTY.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.MOZINDEXEDDB_PROPERTY.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -27,10 +28,11 @@ describe('mozindexeddb_property', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.MOZINDEXEDDB_PROPERTY.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.MOZINDEXEDDB_PROPERTY.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -40,10 +42,11 @@ describe('mozindexeddb_property', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.MOZINDEXEDDB_PROPERTY.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.MOZINDEXEDDB_PROPERTY.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});

Просмотреть файл

@ -29,7 +29,7 @@ describe('no_eval', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
}
@ -116,16 +116,17 @@ describe('no_eval', () => {
.then(({linterMessages}) => {
linterMessages = linterMessages.sort();
assert.equal(linterMessages.length, code.message.length);
expect(linterMessages.length).toEqual(code.message.length);
code.message.forEach((expectedMessage, idx) => {
assert.equal(linterMessages[idx].message, expectedMessage);
assert.equal(linterMessages[idx].type, VALIDATION_WARNING);
expect(linterMessages[idx].message).toEqual(expectedMessage);
expect(linterMessages[idx].type).toEqual(VALIDATION_WARNING);
});
code.description.forEach((expectedDescription, idx) => {
assert.equal(
linterMessages[idx].description, expectedDescription);
expect(linterMessages[idx].description).toEqual(
expectedDescription
);
});
});
});

Просмотреть файл

@ -57,7 +57,7 @@ describe('no_implied_eval', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
}
@ -144,16 +144,17 @@ describe('no_implied_eval', () => {
.then(({linterMessages}) => {
linterMessages = linterMessages.sort();
assert.equal(linterMessages.length, code.message.length);
expect(linterMessages.length).toEqual(code.message.length);
code.message.forEach((expectedMessage, idx) => {
assert.equal(linterMessages[idx].message, expectedMessage);
assert.equal(linterMessages[idx].type, VALIDATION_WARNING);
expect(linterMessages[idx].message).toEqual(expectedMessage);
expect(linterMessages[idx].type).toEqual(VALIDATION_WARNING);
});
code.description.forEach((expectedDescription, idx) => {
assert.equal(
linterMessages[idx].description, expectedDescription);
expect(linterMessages[idx].description).toEqual(
expectedDescription
);
});
});
});

Просмотреть файл

@ -17,7 +17,7 @@ describe('no_new_func', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
}
@ -43,16 +43,17 @@ describe('no_new_func', () => {
.then(({linterMessages}) => {
linterMessages = linterMessages.sort();
assert.equal(linterMessages.length, code.message.length);
expect(linterMessages.length).toEqual(code.message.length);
code.message.forEach((expectedMessage, idx) => {
assert.equal(linterMessages[idx].message, expectedMessage);
assert.equal(linterMessages[idx].type, VALIDATION_WARNING);
expect(linterMessages[idx].message).toEqual(expectedMessage);
expect(linterMessages[idx].type).toEqual(VALIDATION_WARNING);
});
code.description.forEach((expectedDescription, idx) => {
assert.equal(
linterMessages[idx].description, expectedDescription);
expect(linterMessages[idx].description).toEqual(
expectedDescription
);
});
});
});

Просмотреть файл

@ -63,7 +63,7 @@ describe('no_unsafe_innerhtml', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
}
@ -196,16 +196,17 @@ describe('no_unsafe_innerhtml', () => {
.then(({linterMessages}) => {
linterMessages = linterMessages.sort();
assert.equal(linterMessages.length, code.message.length);
expect(linterMessages.length).toEqual(code.message.length);
code.message.forEach((expectedMessage, idx) => {
assert.equal(linterMessages[idx].message, expectedMessage);
assert.equal(linterMessages[idx].type, VALIDATION_WARNING);
expect(linterMessages[idx].message).toEqual(expectedMessage);
expect(linterMessages[idx].type).toEqual(VALIDATION_WARNING);
});
code.description.forEach((expectedDescription, idx) => {
assert.equal(
linterMessages[idx].description, expectedDescription);
expect(linterMessages[idx].description).toEqual(
expectedDescription
);
});
});
});

Просмотреть файл

@ -11,10 +11,11 @@ describe('opendialog_nonlit_uri', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.OPENDIALOG_NONLIT_URI.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.OPENDIALOG_NONLIT_URI.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
});

Просмотреть файл

@ -16,11 +16,10 @@ describe('opendialog_remote_uri', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 6);
expect(linterMessages.length).toEqual(6);
for (let message of linterMessages) {
assert.equal(message.code,
messages.OPENDIALOG_REMOTE_URI.code);
assert.equal(message.type, VALIDATION_WARNING);
expect(message.code).toEqual(messages.OPENDIALOG_REMOTE_URI.code);
expect(message.type).toEqual(VALIDATION_WARNING);
}
});
});
@ -34,7 +33,7 @@ describe('opendialog_remote_uri', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});

Просмотреть файл

@ -9,12 +9,11 @@ describe('unsupported browser APIs', () => {
});
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(
linterMessages.length, 1);
assert.equal(
linterMessages[0].message,
'gcm.register is not supported');
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].message).toEqual(
'gcm.register is not supported'
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -25,12 +24,11 @@ describe('unsupported browser APIs', () => {
});
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(
linterMessages.length, 1);
assert.equal(
linterMessages[0].message,
'gcm.register is not supported');
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].message).toEqual(
'gcm.register is not supported'
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -41,7 +39,7 @@ describe('unsupported browser APIs', () => {
});
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -53,11 +51,12 @@ describe('unsupported browser APIs', () => {
});
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
// We only test the first two levels for now.
// eslint-disable-next-line jest/no-disabled-tests
it.skip('flags when 3 levels of nesting is unsupported', () => {
const code =
'browser.privacy.websites.unsupportedSetting.get({}, () => {})';
@ -66,7 +65,7 @@ describe('unsupported browser APIs', () => {
});
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
expect(linterMessages.length).toEqual(1);
});
});
});

Просмотреть файл

@ -16,10 +16,11 @@ describe('widget_module', () => {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.UNEXPECTED_GLOGAL_ARG.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.UNEXPECTED_GLOGAL_ARG.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});

Просмотреть файл

@ -15,10 +15,11 @@ describe('RDF: mustNotExist', () => {
return rdfScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.TAG_NOT_ALLOWED_HIDDEN.code);
assert.equal(linterMessages[0].type, VALIDATION_ERROR);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.TAG_NOT_ALLOWED_HIDDEN.code
);
expect(linterMessages[0].type).toEqual(VALIDATION_ERROR);
});
});
@ -29,11 +30,11 @@ describe('RDF: mustNotExist', () => {
return rdfScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 2);
expect(linterMessages.length).toEqual(2);
for (let message of linterMessages) {
assert.equal(message.code, messages.TAG_NOT_ALLOWED_HIDDEN.code);
assert.equal(message.type, VALIDATION_ERROR);
expect(message.code).toEqual(messages.TAG_NOT_ALLOWED_HIDDEN.code);
expect(message.type).toEqual(VALIDATION_ERROR);
}
});
});
@ -46,10 +47,10 @@ describe('RDF: mustNotExist', () => {
return rdfScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
expect(linterMessages.length).toEqual(1);
for (let message of linterMessages) {
assert.equal(message.code, messages.TAG_NOT_ALLOWED_UPDATEURL.code);
assert.equal(message.type, VALIDATION_ERROR);
expect(message.code).toEqual(messages.TAG_NOT_ALLOWED_UPDATEURL.code);
expect(message.type).toEqual(VALIDATION_ERROR);
}
});
});
@ -61,7 +62,7 @@ describe('RDF: mustNotExist', () => {
return rdfScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -72,18 +73,17 @@ describe('RDF: mustNotExist', () => {
return rdfScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 3);
expect(linterMessages.length).toEqual(3);
for (let message of linterMessages) {
assert.equal(message.type, VALIDATION_WARNING);
expect(message.type).toEqual(VALIDATION_WARNING);
}
assert.equal(linterMessages[0].code,
messages.TAG_OBSOLETE_FILE.code);
assert.equal(linterMessages[1].code,
messages.TAG_OBSOLETE_REQUIRES.code);
assert.equal(linterMessages[2].code,
messages.TAG_OBSOLETE_SKIN.code);
expect(linterMessages[0].code).toEqual(messages.TAG_OBSOLETE_FILE.code);
expect(linterMessages[1].code).toEqual(
messages.TAG_OBSOLETE_REQUIRES.code
);
expect(linterMessages[2].code).toEqual(messages.TAG_OBSOLETE_SKIN.code);
});
});
@ -103,10 +103,9 @@ describe('RDF: mustNotExist', () => {
});
})
.then((linterMessages) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.TAG_OBSOLETE_FILE.code);
assert.equal(linterMessages[0].type, VALIDATION_NOTICE);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.TAG_OBSOLETE_FILE.code);
expect(linterMessages[0].type).toEqual(VALIDATION_NOTICE);
});
});
});

Просмотреть файл

@ -1,7 +0,0 @@
// Webpack tests entry point. Bundles all the test files
// into a single file.
import 'babel-polyfill';
const context = require.context('.', true, /.*?test\..*?.js$/);
context.keys().forEach(context);

Просмотреть файл

@ -14,34 +14,32 @@ class BaseScannerWithContents extends BaseScanner {
describe('Base Scanner Class', function() {
it('scannerName not defined by default', () => {
assert.throws(
() => { BaseScanner.scannerName; },
Error,
'scannerName is not implemented'
);
expect(() => {
BaseScanner.scannerName;
}).toThrow('scannerName is not implemented');
});
it('should thrown an error without a filename', () => {
assert.throws(() => {
expect(() => {
var baseScanner = new BaseScanner(''); // eslint-disable-line
}, Error, 'Filename is required');
}).toThrow('Filename is required');
assert.throws(() => {
expect(() => {
// An empty filename doesn't count either.
var baseScanner = new BaseScanner('', ''); // eslint-disable-line
}, Error, 'Filename is required');
}).toThrow('Filename is required');
});
it('should have an options property', () => {
var baseScanner = new BaseScanner('', 'filename.txt');
assert.equal(typeof baseScanner.options, 'object');
expect(typeof baseScanner.options).toEqual('object');
// This test assures us the options can be accessed like an object.
assert.equal(typeof baseScanner.options.someUndefinedProp, 'undefined');
expect(typeof baseScanner.options.someUndefinedProp).toEqual('undefined');
var baseScannerWithOptions = new BaseScanner('', 'filename.txt', {
foo: 'bar',
});
assert.equal(baseScannerWithOptions.options.foo, 'bar');
expect(baseScannerWithOptions.options.foo).toEqual('bar');
});
it('should reject when _getContents is not implemented', () => {
@ -49,11 +47,11 @@ describe('Base Scanner Class', function() {
return baseScanner.scan()
.then(() => {
assert.fail(null, null, 'Unexpected success');
expect(false).toBe(true);
})
.catch((err) => {
assert.instanceOf(err, Error);
assert.equal(err.message, '_getContents is not implemented');
expect(err).toBeInstanceOf(Error);
expect(err.message).toEqual('_getContents is not implemented');
});
});
@ -67,8 +65,8 @@ describe('Base Scanner Class', function() {
return baseScanner.scan(fakeRules)
.then(() => {
assert.ok(fakeRules.iAmAFakeRule.calledOnce);
assert.ok(fakeRules.iAmAAnotherFakeRule.calledOnce);
expect(fakeRules.iAmAFakeRule.calledOnce).toBeTruthy();
expect(fakeRules.iAmAAnotherFakeRule.calledOnce).toBeTruthy();
});
});
@ -76,7 +74,7 @@ describe('Base Scanner Class', function() {
var fakeRules = { metadataPassedCheck: () => {} };
// This rule calls assert.fail() if no metadata is passed to it.
sinon.stub(fakeRules, 'metadataPassedCheck', metadataPassCheck);
sinon.stub(fakeRules, 'metadataPassedCheck').callsFake(metadataPassCheck);
var scanner = new BaseScannerWithContents('', 'fake.zip', {
addonMetadata: validMetadata({guid: 'snowflake'}),
@ -84,8 +82,8 @@ describe('Base Scanner Class', function() {
return scanner.scan(fakeRules)
.then(({linterMessages}) => {
assert.ok(fakeRules.metadataPassedCheck.called);
assert.equal(linterMessages.length, 0);
expect(fakeRules.metadataPassedCheck.called).toBeTruthy();
expect(linterMessages.length).toEqual(0);
});
});
@ -98,8 +96,8 @@ describe('Base Scanner Class', function() {
return baseScanner.scan(fakeRules)
.then(() => {
assert.ok(fakeRules.iAmAFakeRule.calledOnce);
assert.notOk(fakeRules._iAmAPrivateFunction.calledOnce);
expect(fakeRules.iAmAFakeRule.calledOnce).toBeTruthy();
expect(fakeRules._iAmAPrivateFunction.calledOnce).toBeFalsy();
});
});
@ -113,12 +111,13 @@ describe('Base Scanner Class', function() {
return baseScanner.scan(fakeRules)
.then(() => {
assert.equal(baseScanner._rulesProcessed,
Object.keys(ignorePrivateFunctions(fakeRules)).length);
expect(
baseScanner._rulesProcessed
).toEqual(Object.keys(ignorePrivateFunctions(fakeRules)).length);
});
});
it('should ask for a string', () => {
assert(BaseScanner.fileResultType, 'string');
expect(BaseScanner.fileResultType).toBeTruthy();
});
});

Просмотреть файл

@ -10,7 +10,7 @@ describe('Binary', function() {
return scanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -21,20 +21,20 @@ describe('Binary', function() {
return scanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(
linterMessages[0].code,
messages.FLAGGED_FILE_TYPE.code);
assert.equal(linterMessages[0].file, 'wat.txt');
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.FLAGGED_FILE_TYPE.code
);
expect(linterMessages[0].file).toEqual('wat.txt');
});
}
});
it('should ask for a chunk', () => {
assert.equal(BinaryScanner.fileStreamType, 'chunk');
expect(BinaryScanner.fileStreamType).toEqual('chunk');
});
it('should report a proper scanner name', () => {
assert.equal(BinaryScanner.scannerName, 'binary');
expect(BinaryScanner.scannerName).toEqual('binary');
});
});

Просмотреть файл

@ -1,3 +1,5 @@
import sinon from 'sinon';
import * as messages from 'messages';
import { VALIDATION_WARNING } from 'const';
import CSSScanner from 'scanners/css';
@ -9,7 +11,7 @@ import { ignorePrivateFunctions, singleLineString } from 'utils';
describe('CSSScanner', () => {
it('should report a proper scanner name', () => {
assert.equal(CSSScanner.scannerName, 'css');
expect(CSSScanner.scannerName).toEqual('css');
});
it('should add CSS_SYNTAX_ERROR with invalid css', () => {
@ -18,14 +20,13 @@ describe('CSSScanner', () => {
return cssScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.CSS_SYNTAX_ERROR.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
assert.equal(linterMessages[0].message, 'Unclosed block');
assert.equal(linterMessages[0].line, 1);
assert.equal(linterMessages[0].column, 1);
assert.equal(linterMessages[0].file, 'fakeFile.css');
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.CSS_SYNTAX_ERROR.code);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
expect(linterMessages[0].message).toEqual('Unclosed block');
expect(linterMessages[0].line).toEqual(1);
expect(linterMessages[0].column).toEqual(1);
expect(linterMessages[0].file).toEqual('fakeFile.css');
});
});
@ -36,7 +37,7 @@ describe('CSSScanner', () => {
var fakeRules = { metadataPassCheck: () => {} };
// This rule calls assert.fail() if no metadata is passed to it.
sinon.stub(fakeRules, 'metadataPassCheck', metadataPassCheck);
sinon.stub(fakeRules, 'metadataPassCheck').callsFake(metadataPassCheck);
var scanner = new CSSScanner(code, 'fake.css', {
addonMetadata: validMetadata({guid: 'snowflake'}),
@ -44,8 +45,8 @@ describe('CSSScanner', () => {
return scanner.scan(fakeRules)
.then(({linterMessages}) => {
assert.ok(fakeRules.metadataPassCheck.called);
assert.equal(linterMessages.length, 0);
expect(fakeRules.metadataPassCheck.called).toBeTruthy();
expect(linterMessages.length).toEqual(0);
});
});
@ -67,11 +68,11 @@ describe('CSSScanner', () => {
return cssScanner.scan();
})
.then(() => {
assert.fail(null, null, 'unexpected success');
expect(false).toBe(true);
})
.catch((err) => {
assert.instanceOf(err, TypeError);
assert.equal(err.message, 'Awooga');
expect(err).toBeInstanceOf(TypeError);
expect(err.message).toEqual('Awooga');
});
});
@ -82,13 +83,13 @@ describe('CSSScanner', () => {
.myClass { background: #000; }`;
var cssScanner = new CSSScanner(code, 'fakeFile.css');
assert.equal(ruleFiles.length,
Object.keys(ignorePrivateFunctions(rules)).length);
expect(ruleFiles.length).toEqual(
Object.keys(ignorePrivateFunctions(rules)).length);
return cssScanner.scan()
.then(() => {
assert.equal(cssScanner._rulesProcessed,
Object.keys(ignorePrivateFunctions(rules)).length);
expect(cssScanner._rulesProcessed).toEqual(
Object.keys(ignorePrivateFunctions(rules)).length);
});
});
@ -97,7 +98,7 @@ describe('CSSScanner', () => {
var cssScanner = new CSSScanner(code, 'fakeFile.css');
return cssScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -107,7 +108,7 @@ describe('CSSScanner', () => {
var cssScanner = new CSSScanner(code, 'fakeFile.css');
return cssScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
});

Просмотреть файл

@ -7,7 +7,7 @@ import * as messages from 'messages';
describe('FilenameScanner', function() {
it('should report a proper scanner name', () => {
assert.equal(FilenameScanner.scannerName, 'filename');
expect(FilenameScanner.scannerName).toEqual('filename');
});
it('should warn when finding a hidden file', () => {
@ -15,9 +15,9 @@ describe('FilenameScanner', function() {
return filenameScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, messages.HIDDEN_FILE.code);
assert.equal(linterMessages[0].file, '__MACOSX/foo.txt');
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.HIDDEN_FILE.code);
expect(linterMessages[0].file).toEqual('__MACOSX/foo.txt');
});
});
@ -26,9 +26,9 @@ describe('FilenameScanner', function() {
return filenameScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, messages.FLAGGED_FILE.code);
assert.equal(linterMessages[0].file, 'Thumbs.db');
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.FLAGGED_FILE.code);
expect(linterMessages[0].file).toEqual('Thumbs.db');
});
});
@ -37,10 +37,11 @@ describe('FilenameScanner', function() {
return filenameScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.FLAGGED_FILE_EXTENSION.code);
assert.equal(linterMessages[0].file, 'wat.exe');
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(
messages.FLAGGED_FILE_EXTENSION.code
);
expect(linterMessages[0].file).toEqual('wat.exe');
});
});
@ -49,9 +50,9 @@ describe('FilenameScanner', function() {
return filenameScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, messages.ALREADY_SIGNED.code);
assert.equal(linterMessages[0].file, 'META-INF/manifest.mf');
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.ALREADY_SIGNED.code);
expect(linterMessages[0].file).toEqual('META-INF/manifest.mf');
});
});
@ -60,8 +61,8 @@ describe('FilenameScanner', function() {
return filenameScanner.scan()
.catch((err) => {
assert.instanceOf(err, Error);
assert.include(err.message, 'wat.txt');
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('wat.txt');
});
});
@ -76,8 +77,7 @@ describe('Hidden and Flagged File Regexes', function() {
for (const filePath of matchingHiddenFiles) {
it(`should match ${filePath} as a hidden file`, () => {
assert.isOk(filePath.match(constants.HIDDEN_FILE_REGEX),
`${filePath} should match hidden file regex`);
expect(filePath.match(constants.HIDDEN_FILE_REGEX)).toBeTruthy();
});
}
@ -88,8 +88,7 @@ describe('Hidden and Flagged File Regexes', function() {
for (const filePath of nonMatchingHiddenFiles) {
it(`should not match ${filePath} as a hidden file`, () => {
assert.isNotOk(filePath.match(constants.HIDDEN_FILE_REGEX),
`${filePath} should not match hidden file regex`);
expect(filePath.match(constants.HIDDEN_FILE_REGEX)).toBeFalsy();
});
}
@ -105,8 +104,7 @@ describe('Hidden and Flagged File Regexes', function() {
for (const filePath of matchingFlaggedFiles) {
it(`should match ${filePath} as a flagged file`, () => {
assert.isOk(filePath.match(constants.FLAGGED_FILE_REGEX),
`${filePath} should match flagged file regex`);
expect(filePath.match(constants.FLAGGED_FILE_REGEX)).toBeTruthy();
});
}
@ -121,8 +119,7 @@ describe('Hidden and Flagged File Regexes', function() {
for (const filePath of nonMatchingFlaggedFiles) {
it(`should not match ${filePath} as a flagged file`, () => {
assert.isNotOk(filePath.match(constants.FLAGGED_FILE_REGEX),
`${filePath} should not match flagged file regex`);
expect(filePath.match(constants.FLAGGED_FILE_REGEX)).toBeFalsy();
});
}
@ -139,9 +136,9 @@ describe('Hidden and Flagged File Regexes', function() {
for (const filePath of matchingFlaggedFileExtensions) {
it(`should match ${filePath} as a flagged file extensions`, () => {
assert.isOk(
constants.FLAGGED_FILE_EXTENSIONS.includes(extname(filePath)),
`${filePath} should not match flagged file extension regex`);
expect(
constants.FLAGGED_FILE_EXTENSIONS.includes(extname(filePath))
).toBeTruthy();
});
}
@ -152,9 +149,9 @@ describe('Hidden and Flagged File Regexes', function() {
for (const filePath of nonMatchingFlaggedFileExtensions) {
it(`should not match ${filePath} as a flagged file extension`, () => {
assert.isNotOk(
constants.FLAGGED_FILE_EXTENSIONS.includes(extname(filePath)),
`${filePath} should not match flagged file extension regex`);
expect(
constants.FLAGGED_FILE_EXTENSIONS.includes(extname(filePath))
).toBeFalsy();
});
}
@ -166,8 +163,7 @@ describe('Hidden and Flagged File Regexes', function() {
for (const filePath of nonMatchingSignedFileExtensions) {
it(`should not match ${filePath} as a signed extension`, () => {
assert.isNotOk(filePath.match(constants.ALREADY_SIGNED_REGEX),
`${filePath} should not match already signed regex`);
expect(filePath.match(constants.ALREADY_SIGNED_REGEX)).toBeFalsy();
});
}
});

Просмотреть файл

@ -12,7 +12,7 @@ import { ignorePrivateFunctions, singleLineString } from 'utils';
describe('HTML', function() {
it('should report a proper scanner name', () => {
assert.equal(HTMLScanner.scannerName, 'html');
expect(HTMLScanner.scannerName).toEqual('html');
});
it('should not warn when we validate a good HTML file', () => {
@ -21,7 +21,7 @@ describe('HTML', function() {
return htmlScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -31,7 +31,7 @@ describe('HTML', function() {
return htmlScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -41,10 +41,9 @@ describe('HTML', function() {
return htmlScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code,
messages.INLINE_SCRIPT.code);
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.INLINE_SCRIPT.code);
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
@ -55,7 +54,7 @@ describe('HTML', function() {
return htmlScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -77,7 +76,7 @@ describe('HTML', function() {
return htmlScanner.getContents();
})
.then(() => {
assert.ok(cheerio.load.calledOnce);
expect(cheerio.load.calledOnce).toBeTruthy();
});
});
@ -86,13 +85,15 @@ describe('HTML', function() {
var contents = validHTML();
var htmlScanner = new HTMLScanner(contents, 'index.html');
assert.equal(ruleFiles.length,
Object.keys(ignorePrivateFunctions(rules)).length);
expect(ruleFiles.length).toEqual(
Object.keys(ignorePrivateFunctions(rules)).length
);
return htmlScanner.scan()
.then(() => {
assert.equal(htmlScanner._rulesProcessed,
Object.keys(ignorePrivateFunctions(rules)).length);
expect(htmlScanner._rulesProcessed).toEqual(
Object.keys(ignorePrivateFunctions(rules)).length
);
});
});

Просмотреть файл

@ -1,4 +1,5 @@
import ESLint from 'eslint';
import sinon from 'sinon';
import {
DEPRECATED_APIS, ESLINT_ERROR, ESLINT_RULE_MAPPING, TEMPORARY_APIS,
@ -15,25 +16,25 @@ import { fakeMessageData, getRuleFiles, getVariable, unexpectedSuccess,
describe('JavaScript Scanner', function() {
it('should report a proper scanner name', () => {
assert.equal(JavaScriptScanner.scannerName, 'javascript');
expect(JavaScriptScanner.scannerName).toEqual('javascript');
});
it('should thrown an error without a filename', () => {
assert.throws(() => {
expect(() => {
var jsScanner = new JavaScriptScanner(''); // eslint-disable-line
}, Error, 'Filename is required');
}).toThrow('Filename is required');
});
it('should have an options property', () => {
var jsScanner = new JavaScriptScanner('', 'filename.txt');
assert.equal(typeof jsScanner.options, 'object');
expect(typeof jsScanner.options).toEqual('object');
// This test assures us the options can be accessed like an object.
assert.equal(typeof jsScanner.options.someUndefinedProp, 'undefined');
expect(typeof jsScanner.options.someUndefinedProp).toEqual('undefined');
var jsScannerWithOptions = new JavaScriptScanner('', 'filename.txt', {
foo: 'bar',
});
assert.equal(jsScannerWithOptions.options.foo, 'bar');
expect(jsScannerWithOptions.options.foo).toEqual('bar');
});
it('should pass when async/await is used', () => {
@ -42,73 +43,7 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
});
});
// TODO: Not sure how to test for this one yet; it's pretty messy.
it.skip(singleLineString`should warn when mozIndexedDB is assembled into
literal with +=`,
() => {
var code = singleLineString`var foo = "m";
foo += "o";
foo += "zIndexedDB";
var myDatabase = window[foo];`;
var jsScanner = new JavaScriptScanner(code, 'badcode.js');
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].id, 'OBFUSCATION');
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
});
});
it.skip('should warn when mozIndexedDB is assembled into literal', () => {
var code = singleLineString`var foo = "m";
foo += "o";
foo = foo + "zIndexedDB";
var myDatabase = window[foo];`;
var jsScanner = new JavaScriptScanner(code, 'badcode.js');
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].id, 'OBFUSCATION');
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
});
});
it.skip('should warn when mozIndexedDB is assembled into literal (2)', () => {
var code = singleLineString`var foo = "m";
foo += "o";
var test = "zIndexedDB";
foo = foo + test;
var myDatabase = window[foo];`;
var jsScanner = new JavaScriptScanner(code, 'badcode.js');
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].id, 'OBFUSCATION');
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
});
});
it.skip('should warn when mozIndexedDB is assembled into literal (3)', () => {
var code = singleLineString`var m = "m";
var o = "o";
var z = "z";
var idb = "IndexedDB";
var tricksterVariable = m + o + z + idb;
var myDatabase = window[tricksterVariable];`;
var jsScanner = new JavaScriptScanner(code, 'badcode.js');
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].id, 'OBFUSCATION');
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(0);
});
});
@ -118,8 +53,8 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages[0].code, messages.JS_SYNTAX_ERROR.code);
assert.equal(linterMessages[0].type, VALIDATION_ERROR);
expect(linterMessages[0].code).toEqual(messages.JS_SYNTAX_ERROR.code);
expect(linterMessages[0].type).toEqual(VALIDATION_ERROR);
// Test another error for good measure.
code = 'var aVarThatDoesnt != exist;';
@ -127,9 +62,10 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages: moreValidationMessages}) => {
assert.equal(moreValidationMessages[0].code,
messages.JS_SYNTAX_ERROR.code);
assert.equal(moreValidationMessages[0].type, VALIDATION_ERROR);
expect(moreValidationMessages[0].code).toEqual(
messages.JS_SYNTAX_ERROR.code);
expect(moreValidationMessages[0].type).toEqual(
VALIDATION_ERROR);
});
});
});
@ -164,7 +100,7 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan(FakeESLint)
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'JS rules must pass a valid message');
expect(err.message).toContain('JS rules must pass a valid message');
});
});
@ -175,8 +111,8 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, messages.MOZINDEXEDDB.code);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.MOZINDEXEDDB.code);
});
});
@ -187,8 +123,8 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, messages.MOZINDEXEDDB.code);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(messages.MOZINDEXEDDB.code);
});
});
@ -203,7 +139,7 @@ describe('JavaScript Scanner', function() {
return {
Program: function() {
var windowVar = getVariable(context.getScope(), 'window');
assert.notOk(windowVar.eslintExplicitGlobal);
expect(windowVar.eslintExplicitGlobal).toBeFalsy();
ok = true;
},
@ -211,7 +147,7 @@ describe('JavaScript Scanner', function() {
}});
eslint.verify('/*eslint-env browser*/', config, {allowInlineConfig: false});
assert(ok);
expect(ok).toBeTruthy();
});
// This is just a precaution against disabling environments in ESLint, which
@ -225,7 +161,7 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -241,7 +177,7 @@ describe('JavaScript Scanner', function() {
return {
Program: function() {
var foo = getVariable(context.getScope(), 'foo');
assert.notOk(foo);
expect(foo).toBeFalsy();
ok = true;
},
@ -249,11 +185,11 @@ describe('JavaScript Scanner', function() {
}});
eslint.verify('/* global foo */', config, {allowInlineConfig: false});
assert(ok);
expect(ok).toBeTruthy();
});
it('should pass addon metadata to rules', () => {
var fakeRules = { metadata_not_passed: () => {} };
var fakeRules = { 'metadata-not-passed': { create: () => {} } };
var fakeMessages = {
METADATA_NOT_PASSED: Object.assign({}, fakeMessageData, {
@ -264,10 +200,11 @@ describe('JavaScript Scanner', function() {
}),
};
var fakeMetadata = { addonMetadata: validMetadata({guid: 'snowflake'}) };
var fakeESLintMapping = { metadata_not_passed: ESLINT_ERROR };
var fakeESLintMapping = { 'metadata-not-passed': ESLINT_ERROR };
// Create a rule that
sinon.stub(fakeRules, 'metadata_not_passed', (context) => {
sinon.stub(
fakeRules['metadata-not-passed'], 'create'
).callsFake((context) => {
return {
Identifier: () => {
var metadata = context.settings.addonMetadata;
@ -291,27 +228,23 @@ describe('JavaScript Scanner', function() {
_ruleMapping: fakeESLintMapping,
_messages: fakeMessages,
}).then(() => {
assert.ok(fakeRules.metadata_not_passed.called);
expect(fakeRules['metadata-not-passed'].create.called).toBeTruthy();
});
});
it('should export all rules in rules/javascript', () => {
// We skip the "run" check here for now as that's handled by ESLint.
var ruleFiles = getRuleFiles('javascript');
var externalRulesCount = Object.keys(EXTERNAL_RULE_MAPPING).length;
assert.equal(
ruleFiles.length + Object.keys(EXTERNAL_RULE_MAPPING).length,
Object.keys(ESLINT_RULE_MAPPING).length
);
expect(ruleFiles.length + externalRulesCount).toEqual(
Object.keys(ESLINT_RULE_MAPPING).length);
var jsScanner = new JavaScriptScanner('', 'badcode.js');
return jsScanner.scan()
.then(() => {
assert.equal(
jsScanner._rulesProcessed,
Object.keys(rules).length
);
expect(jsScanner._rulesProcessed).toEqual(Object.keys(rules).length);
});
});
@ -322,9 +255,9 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, apiToMessage(api));
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(apiToMessage(api));
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
}
@ -337,9 +270,9 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, apiToMessage(api));
assert.equal(linterMessages[0].type, VALIDATION_WARNING);
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual(apiToMessage(api));
expect(linterMessages[0].type).toEqual(VALIDATION_WARNING);
});
});
}
@ -352,7 +285,7 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
}
@ -373,9 +306,9 @@ describe('JavaScript Scanner', function() {
return jsScanner.scan(undefined, { _rules, _ruleMapping })
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 1);
assert.equal(linterMessages[0].code, 'this is the message');
assert.equal(linterMessages[0].message, 'this is the message');
expect(linterMessages.length).toEqual(1);
expect(linterMessages[0].code).toEqual('this is the message');
expect(linterMessages[0].message).toEqual('this is the message');
});
});
});

Просмотреть файл

@ -1,3 +1,5 @@
import sinon from 'sinon';
import Linter from 'linter';
import JSONScanner from 'scanners/json';
@ -7,7 +9,7 @@ import { unexpectedSuccess } from '../helpers';
describe('JSONScanner', function() {
it('should report a proper scanner name', () => {
assert.equal(JSONScanner.scannerName, 'json');
expect(JSONScanner.scannerName).toEqual('json');
});
it('should throw an error if getContents fails', () => {
@ -15,14 +17,14 @@ describe('JSONScanner', function() {
var jsonScanner = new JSONScanner('{}', 'test.json', {
collector: addonsLinter.collector});
sinon.stub(jsonScanner, 'getContents', () => {
sinon.stub(jsonScanner, 'getContents').callsFake(() => {
return Promise.reject('Explode!');
});
return jsonScanner.scan()
.then(unexpectedSuccess)
.catch((err) => {
assert.equal(err, 'Explode!');
expect(err).toEqual('Explode!');
});
});

Просмотреть файл

@ -13,7 +13,7 @@ import { ignorePrivateFunctions } from 'utils';
describe('RDF', function() {
it('should report a proper scanner name', () => {
assert.equal(RDFScanner.scannerName, 'rdf');
expect(RDFScanner.scannerName).toEqual('rdf');
});
it('should not warn when we validate a good RDF file', () => {
@ -22,19 +22,19 @@ describe('RDF', function() {
return rdfScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
it('should init with the default namespace and accept a new one', () => {
var rdfScanner = new RDFScanner('', 'filename.txt');
assert.equal(rdfScanner.options.namespace, RDF_DEFAULT_NAMESPACE);
expect(rdfScanner.options.namespace).toEqual(RDF_DEFAULT_NAMESPACE);
var namespace = 'https://tofumatt.name/coffee.xml#';
var rdfScannerWithNewNS = new RDFScanner('', 'filename.txt', {
namespace: namespace,
});
assert.equal(rdfScannerWithNewNS.options.namespace, namespace);
expect(rdfScannerWithNewNS.options.namespace).toEqual(namespace);
});
it('should handle unicode characters', () => {
@ -43,7 +43,7 @@ describe('RDF', function() {
return rdfScanner.scan()
.then(({linterMessages}) => {
assert.equal(linterMessages.length, 0);
expect(linterMessages.length).toEqual(0);
});
});
@ -58,7 +58,7 @@ describe('RDF', function() {
return rdfScanner.getContents();
})
.then(() => {
assert.ok(XMLDom.DOMParser.calledOnce);
expect(XMLDom.DOMParser.calledOnce).toBeTruthy();
XMLDom.DOMParser.restore();
});
});
@ -69,11 +69,11 @@ describe('RDF', function() {
return rdfScanner.scan()
.then(() => {
assert.fail(null, null, 'Unexpected success');
expect(false).toBe(true);
})
.catch((err) => {
assert.instanceOf(err, Error);
assert.include(err.message, 'RDFParseError');
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('RDFParseError');
});
});
@ -82,13 +82,13 @@ describe('RDF', function() {
var contents = validRDF();
var rdfScanner = new RDFScanner(contents, 'install.rdf');
assert.equal(ruleFiles.length,
Object.keys(ignorePrivateFunctions(rules)).length);
expect(ruleFiles.length).toEqual(
Object.keys(ignorePrivateFunctions(rules)).length);
return rdfScanner.scan()
.then(() => {
assert.equal(rdfScanner._rulesProcessed,
Object.keys(ignorePrivateFunctions(rules)).length);
expect(rdfScanner._rulesProcessed).toEqual(
Object.keys(ignorePrivateFunctions(rules)).length);
});
});

Просмотреть файл

@ -0,0 +1,37 @@
[
{
"namespace": "manifest",
"types": [
{
"id": "NativeHostManifest",
"type": "object",
"description": "Represents a native host manifest file",
"properties": {
"name": {
"type": "string",
"pattern": "^\\w+(\\.\\w+)*$"
},
"description": {
"type": "string"
},
"path": {
"type": "string"
},
"type": {
"type": "string",
"enum": [
"stdio"
]
},
"allowed_extensions": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "manifest.ExtensionID"
}
}
}
}
]
}
]

Просмотреть файл

@ -8,7 +8,7 @@ describe('/applications/*', () => {
var manifest = cloneDeep(validManifest);
manifest.applications = undefined;
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
});
@ -18,39 +18,44 @@ describe('/applications/gecko/*', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko = undefined;
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('should be invalid due to invalid update_url', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.update_url = 'whatevs';
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/applications/gecko/update_url');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual(
'/applications/gecko/update_url'
);
});
it('should be invalid because http update_url', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.update_url = 'http://foo.com';
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/applications/gecko/update_url');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual(
'/applications/gecko/update_url'
);
});
it('should be valid because https update_url', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.update_url = 'https://foo.com';
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('should be invalid due to invalid strict_min_version type', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.strict_min_version = 42;
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath,
'/applications/gecko/strict_min_version');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual(
'/applications/gecko/strict_min_version'
);
});
// For the following tests I copied versions from:
@ -60,7 +65,7 @@ describe('/applications/gecko/*', () => {
var manifest = cloneDeep(validManifest);
it(`${version} should be a valid strict_min_version`, () => {
manifest.applications.gecko.strict_min_version = version;
assert.ok(validate(manifest));
expect(validate(manifest)).toBeTruthy();
});
}
@ -70,9 +75,10 @@ describe('/applications/gecko/*', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.strict_min_version = version;
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath,
'/applications/gecko/strict_min_version');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual(
'/applications/gecko/strict_min_version'
);
});
}
@ -80,9 +86,10 @@ describe('/applications/gecko/*', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.strict_max_version = 42;
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath,
'/applications/gecko/strict_max_version');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual(
'/applications/gecko/strict_max_version'
);
});
const validMaxVersions = validMinVersions.slice();
@ -91,57 +98,55 @@ describe('/applications/gecko/*', () => {
it(`${version} should be a valid strict_max_version`, () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.strict_max_version = version;
assert.ok(validate(manifest));
expect(validate(manifest)).toBeTruthy();
});
}
it('should be invalid due to invalid strict_max_version', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.strict_max_version = 'fifty';
assert.notOk(validate(manifest));
expect(validate(manifest)).toBeFalsy();
});
it('should be a valid id (email-like format)', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.id = 'extensionname@example.org';
assert.ok(validate(manifest));
expect(validate(manifest)).toBeTruthy();
});
it('should be a valid id @whatever', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.id = '@example.org';
assert.ok(validate(manifest));
expect(validate(manifest)).toBeTruthy();
});
it('should be a valid id (guid format)', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.id = '{daf44bf7-a45e-4450-979c-91cf07434c3d}';
assert.ok(validate(manifest));
expect(validate(manifest)).toBeTruthy();
});
it('should be invalid for a number', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.id = 10;
validate(manifest);
assert.ok(validate.errors.length >= 1);
assert.equal(validate.errors[0].dataPath,
'/applications/gecko/id');
expect(validate.errors.length >= 1).toBeTruthy();
expect(validate.errors[0].dataPath).toEqual('/applications/gecko/id');
});
it('should be invalid id format', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.id = 'whatevs';
validate(manifest);
assert.ok(validate.errors.length >= 1);
assert.equal(validate.errors[0].dataPath,
'/applications/gecko/id');
expect(validate.errors.length >= 1).toBeTruthy();
expect(validate.errors[0].dataPath).toEqual('/applications/gecko/id');
});
it('should accept an add-on without an id', () => {
var manifest = cloneDeep(validManifest);
manifest.applications.gecko.id = undefined;
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
});

Просмотреть файл

@ -9,15 +9,15 @@ describe('/author', () => {
var manifest = cloneDeep(validManifest);
manifest.author = 'some string';
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('should be invalid if not a string', () => {
var manifest = cloneDeep(validManifest);
manifest.author = {};
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/author');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/author');
});
});

Просмотреть файл

@ -21,21 +21,21 @@ describe('/background', () => {
var manifest = cloneDeep(validManifest);
manifest.background = {scripts: ['js/jquery.js', '/js/jquery.js']};
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('script relative URL with path should be valid', () => {
var manifest = cloneDeep(validManifest);
manifest.background = {scripts: ['foo.png']};
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('scripts supports persistent', () => {
var manifest = cloneDeep(validManifest);
manifest.background = {scripts: ['/js/foo.js'], persistent: true};
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('page absolute URL should be invalid', () => {
@ -52,14 +52,14 @@ describe('/background', () => {
var manifest = cloneDeep(validManifest);
manifest.background = {page: 'foo.png'};
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('page supports persistent', () => {
var manifest = cloneDeep(validManifest);
manifest.background = {page: 'foo.png', persistent: true};
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
});

Просмотреть файл

@ -8,43 +8,43 @@ import {
describe('browserApis', () => {
describe('hasBrowserApi', () => {
it('is false when the API is unknown', () => {
assert.notOk(hasBrowserApi('foo', 'notAnApi'));
expect(hasBrowserApi('foo', 'notAnApi')).toBeFalsy();
});
it('is true when it supports an API', () => {
assert.ok(hasBrowserApi('cookies', 'get'));
expect(hasBrowserApi('cookies', 'get')).toBeTruthy();
});
it('has the API when it is temporary', () => {
const [namespace, property] = TEMPORARY_APIS[0].split('.');
assert.ok(hasBrowserApi(namespace, property));
expect(hasBrowserApi(namespace, property)).toBeTruthy();
});
it('has the API when it is deprecated', () => {
const [namespace, property] = DEPRECATED_APIS[0].split('.');
assert.ok(hasBrowserApi(namespace, property));
expect(hasBrowserApi(namespace, property)).toBeTruthy();
});
});
describe('isDeprecatedApi', () => {
it('is not deprecated if it is unknown', () => {
assert.notOk(isDeprecatedApi('foo', 'notAnApi'));
expect(isDeprecatedApi('foo', 'notAnApi')).toBeFalsy();
});
it('is deprecated if it is in DEPRECATED_APIS', () => {
assert.include(DEPRECATED_APIS, 'app.getDetails');
assert.ok(isDeprecatedApi('app', 'getDetails'));
expect(DEPRECATED_APIS).toContain('app.getDetails');
expect(isDeprecatedApi('app', 'getDetails')).toBeTruthy();
});
});
describe('isTemporaryApi', () => {
it('is not temporary if it is unknown', () => {
assert.notOk(isTemporaryApi('foo', 'notAnApi'));
expect(isTemporaryApi('foo', 'notAnApi')).toBeFalsy();
});
it('is temporary if it is in TEMPORARY_APIS', () => {
assert.include(TEMPORARY_APIS, 'identity.getRedirectURL');
assert.ok(isTemporaryApi('identity', 'getRedirectURL'));
expect(TEMPORARY_APIS).toContain('identity.getRedirectURL');
expect(isTemporaryApi('identity', 'getRedirectURL')).toBeTruthy();
});
});
});

Просмотреть файл

@ -11,7 +11,7 @@ describe('/commands', () => {
all: { suggested_key: { default: 'Ctrl+Shift+A' } },
};
validate(manifest);
assert.notOk(validate.errors);
expect(validate.errors).toBeFalsy();
});
it('should allow unknown platforms', () => {
@ -20,7 +20,7 @@ describe('/commands', () => {
all: { suggested_key: { notAPlatform: 'Modifier+9' } },
};
validate(manifest);
assert.notOk(validate.errors);
expect(validate.errors).toBeFalsy();
});
it('should validate the key string', function() {

Просмотреть файл

@ -15,7 +15,7 @@ describe('/content_scripts', () => {
},
];
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('supports run_at', () => {
@ -28,7 +28,7 @@ describe('/content_scripts', () => {
},
];
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('catches invalid run_at', () => {

Просмотреть файл

@ -1,6 +1,7 @@
import fs from 'fs';
import path from 'path';
import stream from 'stream';
import sinon from 'sinon';
import request from 'request';
import tar from 'tar';
@ -55,7 +56,7 @@ describe('firefox schema import', () => {
baz: ['baz', 'BAZ'],
required: [],
};
assert.deepEqual(rewriteOptionalToRequired(obj), obj);
expect(rewriteOptionalToRequired(obj)).toEqual(obj);
});
it('converts optional to required', () => {
@ -64,7 +65,7 @@ describe('firefox schema import', () => {
bar: { type: 'array', optional: false },
baz: { type: 'boolean' },
};
assert.deepEqual(rewriteOptionalToRequired(obj), {
expect(rewriteOptionalToRequired(obj)).toEqual({
foo: { type: 'string' },
bar: { type: 'array' },
baz: { type: 'boolean' },
@ -78,7 +79,7 @@ describe('firefox schema import', () => {
bar: { type: 'array', optional: true },
baz: { type: 'boolean', optional: true },
};
assert.deepEqual(rewriteOptionalToRequired(obj), {
expect(rewriteOptionalToRequired(obj)).toEqual({
foo: { type: 'string' },
bar: { type: 'array' },
baz: { type: 'boolean' },
@ -97,7 +98,7 @@ describe('firefox schema import', () => {
},
baz: { type: 'boolean' },
};
assert.deepEqual(rewriteOptionalToRequired(obj), {
expect(rewriteOptionalToRequired(obj)).toEqual({
foo: { type: 'string' },
bar: {
allOf: [
@ -121,7 +122,7 @@ describe('firefox schema import', () => {
},
baz: { type: 'boolean' },
};
assert.deepEqual(rewriteOptionalToRequired(obj), {
expect(rewriteOptionalToRequired(obj)).toEqual({
foo: { type: 'string' },
bar: { allOf: [
{ $ref: '#/types/Whatever' },
@ -149,7 +150,7 @@ describe('firefox schema import', () => {
},
},
};
assert.deepEqual(rewriteValue('MyType', schema), {
expect(rewriteValue('MyType', schema)).toEqual({
additionalProperties: true,
properties: {
foo: { type: 'string' },
@ -168,57 +169,57 @@ describe('firefox schema import', () => {
});
it('removes ids', () => {
assert.equal(rewriteValue('id', 'foo'), undefined);
expect(rewriteValue('id', 'foo')).toEqual(undefined);
});
it('removes type: any', () => {
assert.equal(rewriteValue('type', 'any'), undefined);
assert.equal(rewriteValue('type', 'string'), 'string');
expect(rewriteValue('type', 'any')).toEqual(undefined);
expect(rewriteValue('type', 'string')).toEqual('string');
});
describe('pattern rewriting', () => {
const originalPattern = '(?i)foo';
before(() => {
beforeAll(() => {
FLAG_PATTERN_REWRITES[originalPattern] = 'sup';
});
after(() => {
afterAll(() => {
delete FLAG_PATTERN_REWRITES[originalPattern];
});
it('throws on an unknown pattern with flags', () => {
assert.throws(
() => rewriteValue('pattern', '(?i)^abc$'),
'pattern (?i)^abc$ must be rewritten');
expect(
() => rewriteValue('pattern', '(?i)^abc$')
).toThrow('pattern (?i)^abc$ must be rewritten');
});
it('rewrites known patterns', () => {
assert.equal(rewriteValue('pattern', originalPattern), 'sup');
expect(rewriteValue('pattern', originalPattern)).toEqual('sup');
});
it('does not rewrite unknown patterns without flags', () => {
assert.equal(rewriteValue('pattern', 'abc(?i)def'), 'abc(?i)def');
expect(rewriteValue('pattern', 'abc(?i)def')).toEqual('abc(?i)def');
});
});
it('updates $ref to JSON pointer', () => {
assert.equal(rewriteValue('$ref', 'Manifest'), '#/types/Manifest');
assert.equal(
rewriteValue('$ref', 'extension_types.Timer'),
'extension_types#/types/Timer');
expect(rewriteValue('$ref', 'Manifest')).toEqual('#/types/Manifest');
expect(
rewriteValue('$ref', 'extension_types.Timer')
).toEqual('extension_types#/types/Timer');
});
it("doesn't update $refs that have been updated already", () => {
const $ref = 'manifest#/types/UnrecognizedProperty';
assert.strictEqual(rewriteValue('$ref', $ref), $ref);
expect(rewriteValue('$ref', $ref)).toBe($ref);
});
it('handles arrays', () => {
const original = [{ type: 'string' }, { type: 'any' }, { $ref: 'Foo' }];
assert.deepEqual(
rewriteValue('anyOf', original),
[{ type: 'string' }, {}, { $ref: '#/types/Foo' }]);
expect(rewriteValue('anyOf', original)).toEqual(
[{ type: 'string' }, {}, { $ref: '#/types/Foo' }]
);
});
it('writes out a required when needed', () => {
@ -232,7 +233,7 @@ describe('firefox schema import', () => {
properties: { foo: { type: 'string' }, bar: { type: 'number' } },
required: ['bar'],
};
assert.deepEqual(rewriteValue('foo', original), expected);
expect(rewriteValue('foo', original)).toEqual(expected);
});
it('omits required when it is empty', () => {
@ -245,7 +246,7 @@ describe('firefox schema import', () => {
const expected = {
properties: { foo: { type: 'string' }, bar: { type: 'number' } },
};
assert.deepEqual(rewriteValue('foo', original), expected);
expect(rewriteValue('foo', original)).toEqual(expected);
});
it('fixes $ref with other properties', () => {
@ -265,19 +266,19 @@ describe('firefox schema import', () => {
},
],
};
assert.deepEqual(rewriteValue('foo', original), expected);
expect(rewriteValue('foo', original)).toEqual(expected);
});
it('leaves $ref objects that only have an extra optional property', () => {
const original = { $ref: 'Foo', optional: true };
const expected = { $ref: '#/types/Foo', optional: true };
assert.deepEqual(rewriteValue('foo', original), expected);
expect(rewriteValue('foo', original)).toEqual(expected);
});
it('strips UnrecognizedProperty in additionalProperties', () => {
assert.equal(
rewriteValue('additionalProperties', { $ref: 'UnrecognizedProperty' }),
undefined);
expect(
rewriteValue('additionalProperties', { $ref: 'UnrecognizedProperty' })
).toEqual(undefined);
});
describe('known refs that are not specific', () => {
@ -285,20 +286,20 @@ describe('firefox schema import', () => {
afterEach(() => { delete refMap.SomeType; });
it('get rewritten to good paths', () => {
assert.equal(
rewriteValue('$ref', 'SomeType'),
'manifest#/types/SomeType');
expect(rewriteValue('$ref', 'SomeType')).toEqual(
'manifest#/types/SomeType'
);
});
});
});
describe('rewriteKey', () => {
it('rewrites choices to anyOf', () => {
assert.equal(rewriteKey('choices'), 'anyOf');
expect(rewriteKey('choices')).toEqual('anyOf');
});
it('leaves other values unchanged', () => {
assert.equal(rewriteKey('properties'), 'properties');
expect(rewriteKey('properties')).toEqual('properties');
});
});
@ -310,26 +311,25 @@ describe('firefox schema import', () => {
isUndefined: undefined,
keepMe: 'yay',
};
assert.deepEqual(inner.rewriteObject(schema),
{ anyOf: [{ type: 'string' }, { type: 'number' }], keepMe: 'yay' });
expect(inner.rewriteObject(schema)).toEqual(
{ anyOf: [{ type: 'string' }, { type: 'number' }], keepMe: 'yay' }
);
});
});
describe('loadTypes', () => {
it('converts the types array to an object', () => {
assert.deepEqual(
loadTypes([
{ id: 'Foo', type: 'object' },
{ id: 'Bar', type: 'string' },
]),
{
Foo: { id: 'Foo', type: 'object' },
Bar: { id: 'Bar', type: 'string' },
});
expect(loadTypes([
{ id: 'Foo', type: 'object' },
{ id: 'Bar', type: 'string' },
])).toEqual({
Foo: { id: 'Foo', type: 'object' },
Bar: { id: 'Bar', type: 'string' },
});
});
it('handles there not being any types', () => {
assert.deepEqual(loadTypes(undefined), {});
expect(loadTypes(undefined)).toEqual({});
});
});
@ -354,27 +354,25 @@ describe('firefox schema import', () => {
somethingElse: 'foo',
},
];
assert.deepEqual(
inner.normalizeSchema(schemas, 'cookies.json'),
{
id: 'cookies',
types: {
Cookie: { id: 'Cookie', type: 'string' },
CookieJar: { id: 'CookieJar', type: 'object' },
expect(inner.normalizeSchema(schemas, 'cookies.json')).toEqual({
id: 'cookies',
types: {
Cookie: { id: 'Cookie', type: 'string' },
CookieJar: { id: 'CookieJar', type: 'object' },
},
somethingElse: 'foo',
definitions: {
WebExtensionManifest: {
choices: [ { type: 'string', enum: ['cookies'] } ],
},
somethingElse: 'foo',
definitions: {
WebExtensionManifest: {
choices: [ { type: 'string', enum: ['cookies'] } ],
},
},
refs: {
'cookies#/definitions/WebExtensionManifest': {
namespace: 'manifest',
type: 'WebExtensionManifest',
},
refs: {
'cookies#/definitions/WebExtensionManifest': {
namespace: 'manifest',
type: 'WebExtensionManifest',
},
},
});
},
});
});
it('handles the manifest schema', () => {
@ -384,14 +382,12 @@ describe('firefox schema import', () => {
types: [{ id: 'Permission', type: 'string' }],
},
];
assert.deepEqual(
inner.normalizeSchema(schemas, 'manifest.json'),
{
id: 'manifest',
types: { Permission: { id: 'Permission', type: 'string' } },
definitions: {},
refs: {},
});
expect(inner.normalizeSchema(schemas, 'manifest.json')).toEqual({
id: 'manifest',
types: { Permission: { id: 'Permission', type: 'string' } },
definitions: {},
refs: {},
});
});
it('handles manifest extensions without a schema', () => {
@ -408,25 +404,23 @@ describe('firefox schema import', () => {
}],
},
];
assert.deepEqual(
inner.normalizeSchema(schemas, 'url_overrides.json'),
{
id: 'url_overrides',
types: {},
definitions: {
WebExtensionManifest: {
properties: {
chrome_url_overrides: { type: 'object' },
},
expect(inner.normalizeSchema(schemas, 'url_overrides.json')).toEqual({
id: 'url_overrides',
types: {},
definitions: {
WebExtensionManifest: {
properties: {
chrome_url_overrides: { type: 'object' },
},
},
refs: {
'url_overrides#/definitions/WebExtensionManifest': {
namespace: 'manifest',
type: 'WebExtensionManifest',
},
},
refs: {
'url_overrides#/definitions/WebExtensionManifest': {
namespace: 'manifest',
type: 'WebExtensionManifest',
},
});
},
});
});
});
@ -440,8 +434,9 @@ describe('firefox schema import', () => {
.stub(inner, 'rewriteObject')
.withArgs({ normalized: true })
.returns({ rewritten: true });
assert.deepEqual(
inner.loadSchema({ the: 'schema' }), { id: 'Foo', rewritten: true });
expect(inner.loadSchema({ the: 'schema' })).toEqual(
{ id: 'Foo', rewritten: true }
);
});
it('adds a $ref for the manifest namespace', () => {
@ -453,13 +448,11 @@ describe('firefox schema import', () => {
.stub(inner, 'rewriteObject')
.withArgs({ normalized: true })
.returns({ rewritten: true });
assert.deepEqual(
inner.loadSchema({ id: 'manifest' }),
{
id: 'manifest',
$ref: '#/types/WebExtensionManifest',
rewritten: true,
});
expect(inner.loadSchema({ id: 'manifest' })).toEqual({
id: 'manifest',
$ref: '#/types/WebExtensionManifest',
rewritten: true,
});
});
});
@ -481,12 +474,10 @@ describe('firefox schema import', () => {
.stub(inner, 'mapExtendToRef')
.withArgs({ mergeSchemas: 'done' })
.returns({ mapExtendToRef: 'done' });
assert.deepEqual(
processSchemas([
{ file: 'one', schema: firstSchema },
{ file: 'two', schema: secondSchema },
]),
{ mapExtendToRef: 'done' });
expect(processSchemas([
{ file: 'one', schema: firstSchema },
{ file: 'two', schema: secondSchema },
])).toEqual({ mapExtendToRef: 'done' });
});
});
@ -513,34 +504,32 @@ describe('firefox schema import', () => {
}],
}];
assert.deepEqual(
processSchemas(schemas),
{
foo: {
file: 'foo.json',
schema: {
id: 'foo',
definitions: {},
refs: {},
types: {
Foo: { type: 'string' },
FooBar: { type: 'number' },
},
properties: {
bar: { properties: { thing: {} }, required: ['thing'] },
},
expect(processSchemas(schemas)).toEqual({
foo: {
file: 'foo.json',
schema: {
id: 'foo',
definitions: {},
refs: {},
types: {
Foo: { type: 'string' },
FooBar: { type: 'number' },
},
properties: {
bar: { properties: { thing: {} }, required: ['thing'] },
},
},
bar: {
file: 'bar.json',
schema: {
id: 'bar',
definitions: {},
refs: {},
types: { Bar: { type: 'string' } },
},
},
bar: {
file: 'bar.json',
schema: {
id: 'bar',
definitions: {},
refs: {},
types: { Bar: { type: 'string' } },
},
});
},
});
});
});
@ -624,78 +613,76 @@ describe('firefox schema import', () => {
},
},
});
assert.deepEqual(
inner.mapExtendToRef(schemas),
{
manifest: {
file: 'manifest.json',
schema: {
types: {
Permission: {
anyOf: [
{ type: 'string', enum: ['downloads'] },
{ type: 'string' },
{ $ref: 'cookies#/definitions/Permission' },
],
},
WebExtensionManifest: {
allOf: [
{
properties: {
version: { type: 'number' },
},
required: ['version'],
expect(inner.mapExtendToRef(schemas)).toEqual({
manifest: {
file: 'manifest.json',
schema: {
types: {
Permission: {
anyOf: [
{ type: 'string', enum: ['downloads'] },
{ type: 'string' },
{ $ref: 'cookies#/definitions/Permission' },
],
},
WebExtensionManifest: {
allOf: [
{
properties: {
version: { type: 'number' },
},
{ $ref: 'i18n#/definitions/WebExtensionManifest' },
{ $ref: 'foo#/definitions/WebExtensionManifest' },
],
},
required: ['version'],
},
{ $ref: 'i18n#/definitions/WebExtensionManifest' },
{ $ref: 'foo#/definitions/WebExtensionManifest' },
],
},
refs: {},
},
refs: {},
},
cookies: {
file: 'cookies.json',
schema: {
definitions: {
Permission: { type: 'string', enum: ['cookies'] },
},
refs: {
'cookies#/definitions/Permission': {
namespace: 'manifest',
type: 'Permission',
},
},
cookies: {
file: 'cookies.json',
schema: {
definitions: {
Permission: { type: 'string', enum: ['cookies'] },
},
refs: {
'cookies#/definitions/Permission': {
namespace: 'manifest',
type: 'Permission',
},
},
},
i18n: {
file: 'i18n.json',
schema: {
definitions: {
WebExtensionManifest: {
properties: { default_locale: { type: 'string' } },
},
},
i18n: {
file: 'i18n.json',
schema: {
definitions: {
WebExtensionManifest: {
properties: { default_locale: { type: 'string' } },
},
refs: {
'i18n#/definitions/WebExtensionManifest': {
namespace: 'manifest',
type: 'WebExtensionManifest',
},
},
refs: {
'i18n#/definitions/WebExtensionManifest': {
namespace: 'manifest',
type: 'WebExtensionManifest',
},
},
},
foo: {
file: 'foo.json',
schema: {
refs: {
'foo#/definitions/WebExtensionManifest': {
namespace: 'manifest',
type: 'WebExtensionManifest',
},
},
foo: {
file: 'foo.json',
schema: {
refs: {
'foo#/definitions/WebExtensionManifest': {
namespace: 'manifest',
type: 'WebExtensionManifest',
},
},
},
});
},
});
});
});
@ -722,7 +709,7 @@ describe('firefox schema import', () => {
},
types: {},
};
assert.deepEqual(rewriteExtend(schemas, 'foo'), expected);
expect(rewriteExtend(schemas, 'foo')).toEqual(expected);
});
it('returns types in an object of types', () => {
@ -740,7 +727,7 @@ describe('firefox schema import', () => {
Yo: { properties: { hey: { type: 'string' } } },
},
};
assert.deepEqual(rewriteExtend(schemas, 'foo'), expected);
expect(rewriteExtend(schemas, 'foo')).toEqual(expected);
});
it('rewrites the extend for $refs defined in the object', () => {
@ -788,7 +775,7 @@ describe('firefox schema import', () => {
},
types: { KeyName: { type: 'string' } },
};
assert.deepEqual(rewriteExtend(original, 'browserAction'), expected);
expect(rewriteExtend(original, 'browserAction')).toEqual(expected);
});
it('throws if there is no $extend or id', () => {
@ -798,13 +785,24 @@ describe('firefox schema import', () => {
properties: { uhoh: { type: 'number' } },
}],
}];
assert.throws(
() => rewriteExtend(schemas, 'foo'),
'$extend or id is required');
expect(
() => rewriteExtend(schemas, 'foo')
).toThrow('$extend or id is required');
});
});
describe('updateWithAddonsLinterData', () => {
function makeSchemaWithType(name, type) {
return Object.freeze({
manifest: {
file: 'manifest.json',
schema: {
types: { [name]: type },
},
},
});
}
it('updates the firefox schemas with addons-linter data', () => {
const firefoxSchemas = {
manifest: {
@ -858,23 +856,10 @@ describe('firefox schema import', () => {
},
},
};
assert.deepEqual(
inner.updateWithAddonsLinterData(firefoxSchemas, ourSchemas),
expected);
expect(
inner.updateWithAddonsLinterData(firefoxSchemas, ourSchemas)
).toEqual(expected);
});
});
describe('updateWithAddonsLinterData', () => {
function makeSchemaWithType(name, type) {
return Object.freeze({
manifest: {
file: 'manifest.json',
schema: {
types: { [name]: type },
},
},
});
}
it('merges in new values', () => {
const original = makeSchemaWithType('FirefoxSpecificProperties', {
@ -898,9 +883,9 @@ describe('firefox schema import', () => {
foo: { type: 'string', pattern: '[fF][oO]{2}' },
},
});
assert.deepEqual(
inner.updateWithAddonsLinterData(original, linterUpdates),
expected);
expect(
inner.updateWithAddonsLinterData(original, linterUpdates)
).toEqual(expected);
});
it('overwrites existing values', () => {
@ -925,9 +910,9 @@ describe('firefox schema import', () => {
foo: { type: 'string' },
},
});
assert.deepEqual(
inner.updateWithAddonsLinterData(original, linterUpdates),
expected);
expect(
inner.updateWithAddonsLinterData(original, linterUpdates)
).toEqual(expected);
});
it('extends arrays', () => {
@ -952,9 +937,9 @@ describe('firefox schema import', () => {
name: { type: 'string', enum: ['foo', 'bar', 'baz'] },
},
});
assert.deepEqual(
inner.updateWithAddonsLinterData(original, linterUpdates),
expected);
expect(
inner.updateWithAddonsLinterData(original, linterUpdates)
).toEqual(expected);
});
it('updates the first item of an allOf array', () => {
@ -1000,14 +985,16 @@ describe('firefox schema import', () => {
$ref: 'commands#/definitions/WebExtensionManifest',
}],
});
assert.deepEqual(
inner.updateWithAddonsLinterData(original, linterUpdates),
expected);
expect(
inner.updateWithAddonsLinterData(original, linterUpdates)
).toEqual(expected);
});
});
describe('from filesystem', () => {
const schemaFiles = ['manifest.json', 'cookies.json'];
const schemaFiles = [
'manifest.json', 'cookies.json',
];
const firefoxPath = 'tests/schema/firefox';
const ourPath = 'tests/schema/updates';
const outputPath = 'tests/schema/imported';
@ -1024,11 +1011,25 @@ describe('firefox schema import', () => {
it('imports schemas from filesystem', () => {
importSchemas(firefoxPath, ourPath, outputPath);
schemaFiles.forEach((file) => {
assert.deepEqual(
JSON.parse(fs.readFileSync(path.join(outputPath, file))),
JSON.parse(fs.readFileSync(path.join(expectedPath, file))));
expect(
JSON.parse(fs.readFileSync(path.join(outputPath, file)))
).toEqual(JSON.parse(fs.readFileSync(path.join(expectedPath, file))));
});
});
it('skips native_host_manifest.json', () => {
importSchemas(firefoxPath, ourPath, outputPath);
expect(
fs.exists(path.join(expectedPath, 'native_host_manifest.json'))
).toBeFalsy();
// Dummy test to make sure we join correctly and the import
// actually worked
expect(
fs.exists(path.join(expectedPath, 'manifest.json'))
).toBeFalsy();
});
});
describe('fetchSchemas', () => {
@ -1036,23 +1037,21 @@ describe('firefox schema import', () => {
const expectedTarballPath = 'tmp/FIREFOX_AURORA_54_BASE.tar.gz';
beforeEach(() => {
assert.notOk(
fs.existsSync(expectedTarballPath),
`Tar file already exists at ${expectedTarballPath}`);
expect(fs.existsSync(expectedTarballPath)).toBeFalsy();
createDir(outputPath);
});
afterEach(() => {
assert.notOk(
fs.existsSync(expectedTarballPath),
`Tar file was not cleaned up ${expectedTarballPath}`);
expect(fs.existsSync(expectedTarballPath)).toBeFalsy();
removeDir(outputPath);
});
it('rejects if there is no inputPath or version', () => {
return fetchSchemas({}).then(
() => assert.ok(false, 'expected rejection'),
(err) => assert.equal(err.message, 'inputPath or version is required'));
() => expect(false).toBeTruthy(),
(err) => expect(err.message).toEqual(
'inputPath or version is required'
));
});
it('downloads the firefox source and extracts the schemas', () => {
@ -1069,10 +1068,10 @@ describe('firefox schema import', () => {
.stub(request, 'get')
.withArgs('https://hg.mozilla.org/mozilla-central/archive/FIREFOX_AURORA_54_BASE.tar.gz')
.returns(tarball);
assert.deepEqual(fs.readdirSync(outputPath), []);
expect(fs.readdirSync(outputPath)).toEqual([]);
return fetchSchemas({ version: 54, outputPath })
.then(() => {
assert.deepEqual(fs.readdirSync(outputPath), ['manifest.json']);
expect(fs.readdirSync(outputPath)).toEqual(['manifest.json']);
});
});
@ -1094,10 +1093,10 @@ describe('firefox schema import', () => {
.stub(fs, 'unlinkSync')
.withArgs('mozilla-central.tgz')
.returns(undefined);
assert.deepEqual(fs.readdirSync(outputPath), []);
expect(fs.readdirSync(outputPath)).toEqual([]);
return fetchSchemas({ inputPath: 'mozilla-central.tgz', outputPath })
.then(() => {
assert.deepEqual(fs.readdirSync(outputPath), ['manifest.json']);
expect(fs.readdirSync(outputPath)).toEqual(['manifest.json']);
});
});
@ -1117,12 +1116,12 @@ describe('firefox schema import', () => {
sandbox
.stub(tar, 'Parse')
.returns(extractedStream);
assert.deepEqual(fs.readdirSync(outputPath), []);
expect(fs.readdirSync(outputPath)).toEqual([]);
return fetchSchemas({ inputPath: 'mozilla-central.tgz', outputPath })
.then(() => {
assert.notOk(true, 'unexpected success');
expect(true).toBeFalsy();
}, () => {
assert.ok(true, 'error was propagated');
expect(true).toBeTruthy();
});
});
@ -1136,14 +1135,14 @@ describe('firefox schema import', () => {
.stub(request, 'get')
.withArgs('https://hg.mozilla.org/mozilla-central/archive/FIREFOX_AURORA_54_BASE.tar.gz')
.returns(mockStream);
assert.deepEqual(fs.readdirSync(outputPath), []);
expect(fs.readdirSync(outputPath)).toEqual([]);
return fetchSchemas({ version: 54, outputPath })
.then(() => {
assert.notOk(true, 'unexpected success');
expect(true).toBeFalsy();
}, () => {
// Manually remove the tar file since it doesn't get cleaned up.
fs.unlinkSync('tmp/FIREFOX_AURORA_54_BASE.tar.gz');
assert.ok(true, 'error was propagated');
expect(true).toBeTruthy();
});
});
@ -1167,12 +1166,12 @@ describe('firefox schema import', () => {
.stub(fs, 'createWriteStream')
.withArgs('tmp/FIREFOX_AURORA_54_BASE.tar.gz')
.returns(mockStream);
assert.deepEqual(fs.readdirSync(outputPath), []);
expect(fs.readdirSync(outputPath)).toEqual([]);
return fetchSchemas({ version: 54, outputPath })
.then(() => {
assert.notOk(true, 'unexpected success');
expect(true).toBeFalsy();
}, () => {
assert.ok(true, 'error was propagated');
expect(true).toBeTruthy();
});
});
});
@ -1184,12 +1183,10 @@ describe('firefox schema import', () => {
'moz/toolkit/components/extensions/schemas/manifest.json',
'moz/toolkit/components/extensions/schemas/Schemas.jsm',
];
assert.deepEqual(
files.filter((f) => inner.isBrowserSchema(f)),
[
'moz/browser/components/extensions/schemas/bookmarks.json',
'moz/toolkit/components/extensions/schemas/manifest.json',
]);
expect(files.filter((f) => inner.isBrowserSchema(f))).toEqual([
'moz/browser/components/extensions/schemas/bookmarks.json',
'moz/toolkit/components/extensions/schemas/manifest.json',
]);
});
});
@ -1201,7 +1198,7 @@ describe('firefox schema import', () => {
];
// Copy the schemas so we can verify they're unchanged and un-mutated.
const expectedSchemas = schemas.map((schema) => ({ ...schema }));
assert.deepEqual(foldSchemas(schemas), expectedSchemas);
expect(foldSchemas(schemas)).toEqual(expectedSchemas);
});
it('folds matching schemas, maintaining types at top-level', () => {
@ -1226,7 +1223,7 @@ describe('firefox schema import', () => {
{ namespace: 'privacy.websites',
properties: { thirdPartyCookiesAllowed: {} } },
];
assert.deepEqual(foldSchemas(schemas), [
expect(foldSchemas(schemas)).toEqual([
{ namespace: 'manifest' },
{ namespace: 'privacy',
permissions: ['privacy'],
@ -1260,7 +1257,7 @@ describe('firefox schema import', () => {
{ namespace: 'privacy.websites',
properties: { thirdPartyCookiesAllowed: {} } },
];
assert.deepEqual(foldSchemas(schemas), [
expect(foldSchemas(schemas)).toEqual([
{ namespace: 'manifest' },
{ namespace: 'privacy',
permissions: ['privacy'],
@ -1284,7 +1281,7 @@ describe('firefox schema import', () => {
{ namespace: 'privacy.websites',
properties: { thirdPartyCookiesAllowed: {} } },
];
assert.deepEqual(foldSchemas(schemas), [
expect(foldSchemas(schemas)).toEqual([
{ namespace: 'manifest' },
{ namespace: 'privacy',
properties: {
@ -1306,7 +1303,7 @@ describe('firefox schema import', () => {
properties: {} },
];
const expectedSchemas = schemas.map((schema) => ({ ...schema }));
assert.deepEqual(foldSchemas(schemas), expectedSchemas);
expect(foldSchemas(schemas)).toEqual(expectedSchemas);
});
it('throws if there is more than two levels of nesting', () => {
@ -1314,9 +1311,9 @@ describe('firefox schema import', () => {
{ namespace: 'devtools.panels.sidebars',
properties: { createSidebar: {} } },
];
assert.throws(
() => foldSchemas(schemas),
/may only have one level of nesting/);
expect(
() => foldSchemas(schemas)
).toThrow(/may only have one level of nesting/);
});
it('throws if there is more than one matching namespace', () => {
@ -1330,7 +1327,7 @@ describe('firefox schema import', () => {
properties: { createBar: {} },
}),
]);
assert.throws(() => foldSchemas(schemas), /matching namespaces/);
expect(() => foldSchemas(schemas)).toThrow(/matching namespaces/);
});
it('throws if there is more than one base namespace', () => {
@ -1344,16 +1341,16 @@ describe('firefox schema import', () => {
properties: { createBar: {} },
}),
]);
assert.throws(() => foldSchemas(schemas), /matching namespaces/);
expect(() => foldSchemas(schemas)).toThrow(/matching namespaces/);
});
});
describe('filterSchemas', () => {
before(() => {
beforeAll(() => {
ignoredSchemas.push('some_namespace');
});
after(() => {
afterAll(() => {
ignoredSchemas.pop();
});
@ -1366,36 +1363,36 @@ describe('firefox schema import', () => {
goodSchema,
{ namespace: 'some_namespace', properties: { foo: {} } },
];
assert.deepEqual(filterSchemas(schemas), [goodSchema]);
expect(filterSchemas(schemas)).toEqual([goodSchema]);
});
it('does not remove anything if there are no ignored schemas', () => {
const schemas = Object.freeze([
Object.freeze({ namespace: 'alarms', permissions: ['alarms'] }),
]);
assert.deepEqual(filterSchemas(schemas), schemas);
expect(filterSchemas(schemas)).toEqual(schemas);
});
});
describe('stripTrailingNullByte', () => {
it('strips a trailing null byte if present at the end', () => {
const str = 'foo\u0000';
assert.equal(stripTrailingNullByte(str), 'foo');
expect(stripTrailingNullByte(str)).toEqual('foo');
});
it('returns the string unchanged if not present', () => {
const str = 'bar';
assert.strictEqual(stripTrailingNullByte(str), str);
expect(stripTrailingNullByte(str)).toBe(str);
});
it('returns the string unchanged if not at the end', () => {
const str = 'b\u0000az';
assert.strictEqual(stripTrailingNullByte(str), str);
expect(stripTrailingNullByte(str)).toBe(str);
});
it('handles empty strings', () => {
const str = '';
assert.strictEqual(stripTrailingNullByte(str), str);
expect(stripTrailingNullByte(str)).toBe(str);
});
});
});

Просмотреть файл

@ -32,13 +32,13 @@ describe('formats.isValidVersionString', () => {
for (let validVersionString of validVersionStrings) {
it(`should find ${validVersionString} to be valid`, () => {
assert.ok(isValidVersionString(validVersionString));
expect(isValidVersionString(validVersionString)).toBeTruthy();
});
}
for (let invalidVersionString of invalidVersionStrings) {
it(`should find ${invalidVersionString} to be invalid`, () => {
assert.notOk(isValidVersionString(invalidVersionString));
expect(isValidVersionString(invalidVersionString)).toBeFalsy();
});
}
});
@ -54,7 +54,7 @@ describe('formats.isRelativeURL', () => {
for (let notRelativeURL of notRelativeURLs) {
it(`${notRelativeURL} should be invalid`, () => {
assert.notOk(isRelativeURL(notRelativeURL));
expect(isRelativeURL(notRelativeURL)).toBeFalsy();
});
}
@ -66,7 +66,7 @@ describe('formats.isRelativeURL', () => {
for (let relativeURL of relativeURLs) {
it(`${relativeURL} should be valid`, () => {
assert.isOk(isRelativeURL(relativeURL));
expect(isRelativeURL(relativeURL)).toBeTruthy();
});
}

Просмотреть файл

@ -18,7 +18,7 @@ describe('/homepage_url', () => {
var manifest = cloneDeep(validManifest);
manifest.homepage_url = validURL;
validate(manifest);
assert.isNull(validate.errors, sinon.format(validate.errors));
expect(validate.errors).toBeNull();
});
}

Просмотреть файл

@ -10,25 +10,26 @@ describe('/icons', () => {
var manifest = cloneDeep(validManifest);
manifest.icons = {48: 'icon.png', 96: 'bigger.png'};
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('should fail on integer value', () => {
var manifest = cloneDeep(validManifest);
manifest.icons = {48: 1};
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/icons/48');
assert.equal(validate.errors[0].message, 'should be string');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/icons/48');
expect(validate.errors[0].message).toEqual('should be string');
});
it('should fail on non-number key', () => {
var manifest = cloneDeep(validManifest);
manifest.icons = {wat: 'foo'};
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/icons/wat');
assert.equal(validate.errors[0].message,
'should NOT have additional properties');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/icons/wat');
expect(validate.errors[0].message).toEqual(
'should NOT have additional properties'
);
});
});

Просмотреть файл

@ -11,7 +11,7 @@ describe('/incognito', () => {
var manifest = cloneDeep(validManifest);
manifest.incognito = 'spanning';
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('not "spanning" should be invalid', () => {

Просмотреть файл

@ -9,17 +9,19 @@ describe('/manifest_version', () => {
var manifest = cloneDeep(validManifest);
manifest.manifest_version = 1;
validate(manifest);
assert.equal(validate.errors[0].dataPath, '/manifest_version');
assert.equal(validate.errors.length, 1);
expect(validate.errors[0].dataPath).toEqual('/manifest_version');
expect(validate.errors.length).toEqual(1);
});
it('should be invalid due to missing manifest_version', () => {
var manifest = cloneDeep(validManifest);
manifest.manifest_version = undefined;
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/manifest_version');
assert.equal(validate.errors[0].params.missingProperty, 'manifest_version');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/manifest_version');
expect(validate.errors[0].params.missingProperty).toEqual(
'manifest_version'
);
});
});

Просмотреть файл

@ -9,25 +9,25 @@ describe('/name', () => {
var manifest = cloneDeep(validManifest);
manifest.name = 'a'.repeat(46);
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/name');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/name');
});
it('should be invalid due to name < 2 chars', () => {
var manifest = cloneDeep(validManifest);
manifest.name = 'a';
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/name');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/name');
});
it('should be invalid due to missing a name', () => {
var manifest = cloneDeep(validManifest);
manifest.name = undefined;
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/name');
assert.equal(validate.errors[0].params.missingProperty, 'name');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/name');
expect(validate.errors[0].params.missingProperty).toEqual('name');
});
});

Просмотреть файл

@ -11,7 +11,7 @@ describe('/permissions', () => {
var manifest = cloneDeep(validManifest);
manifest.permissions = ['tabs'];
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
it('should not allow duplicate permissions', () => {
@ -46,7 +46,7 @@ describe('/permissions', () => {
var manifest = cloneDeep(validManifest);
manifest.permissions = [matchPattern];
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
}

Просмотреть файл

@ -6,7 +6,7 @@ describe('Schema JSON', () => {
it('should be valid against the reference schema', () => {
var isValid = validate(validManifest);
assert.ok(isValid);
expect(isValid).toBeTruthy();
});
});

Просмотреть файл

@ -9,24 +9,24 @@ describe('/version', () => {
var manifest = cloneDeep(validManifest);
manifest.version = '01';
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/version');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/version');
});
it('should be invalid due to missing version', () => {
var manifest = cloneDeep(validManifest);
manifest.version = undefined;
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/version');
assert.equal(validate.errors[0].params.missingProperty, 'version');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/version');
expect(validate.errors[0].params.missingProperty).toEqual('version');
});
it('should be valid if it is a toolkit version', () => {
var manifest = cloneDeep(validManifest);
manifest.version = '1.0.0.0pre0';
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
});

Просмотреть файл

@ -10,25 +10,25 @@ describe('/web_accessible_resources', () => {
var manifest = cloneDeep(validManifest);
manifest.web_accessible_resources = 'foo.png';
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/web_accessible_resources');
assert.equal(validate.errors[0].message, 'should be array');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/web_accessible_resources');
expect(validate.errors[0].message).toEqual('should be array');
});
it('should fail if not an array of strings', () => {
var manifest = cloneDeep(validManifest);
manifest.web_accessible_resources = ['foo.png', 1];
validate(manifest);
assert.equal(validate.errors.length, 1);
assert.equal(validate.errors[0].dataPath, '/web_accessible_resources/1');
assert.equal(validate.errors[0].message, 'should be string');
expect(validate.errors.length).toEqual(1);
expect(validate.errors[0].dataPath).toEqual('/web_accessible_resources/1');
expect(validate.errors[0].message).toEqual('should be string');
});
it('should be array of strings', () => {
var manifest = cloneDeep(validManifest);
manifest.web_accessible_resources = ['foo.png', 'bar.css'];
validate(manifest);
assert.isNull(validate.errors);
expect(validate.errors).toBeNull();
});
});

0
tests/setup.js Normal file
Просмотреть файл

Просмотреть файл

@ -1,74 +1,85 @@
/*
* Tests running the process via the CLI.
*
*/
import shell from 'shelljs';
import { checkOutput } from './helpers';
import { singleLineString } from 'utils';
import { getConfig } from 'cli';
import { createInstance } from 'main';
describe('Process', function() {
this.slow(5000);
it('should exit with exit code 0 when no errors.', () => {
const args = ['tests/fixtures/good.zip', '--output json'];
it('should exit with exit code 0 when no errors.', (done) => {
let cmd = 'bin/addons-linter tests/fixtures/good.zip --output json';
shell.exec(cmd, {silent: true}, (code, output) => {
assert.doesNotThrow(() => {
JSON.parse(output);
});
assert.equal(code, 0, output);
done();
checkOutput(() => {
createInstance({config: getConfig({useCLI: true}).argv});
}, args, (output) => {
expect(() => {
JSON.parse(output.result);
}).not.toThrow();
expect(output.exitCode).toEqual(0);
});
});
it('should exit with exit code 1 when errors found.', (done) => {
let cmd = singleLineString`bin/addons-linter
tests/fixtures/webextension_bad_permissions.zip --output json`;
shell.exec(cmd, {silent: true}, (code, output) => {
assert.doesNotThrow(() => {
JSON.parse(output);
});
assert.equal(code, 1, output);
done();
it('should exit with exit code 1 when errors found.', () => {
let args = [
'tests/fixtures/webextension_bad_permissions.zip',
'--output json',
];
checkOutput(() => {
createInstance({config: getConfig({useCLI: true}).argv});
}, args, (output) => {
expect(() => {
JSON.parse(output.result);
}).not.toThrow();
expect(output.exitCode).toEqual(1);
});
});
it( singleLineString`should exit with exit code 1 when warnings found
and --warnings-as-errors is used.`, (done) => {
let cmd = singleLineString`bin/addons-linter
tests/fixtures/webextension_warnings.zip
--warnings-as-errors --output json`;
shell.exec(cmd, {silent: true}, (code, output) => {
assert.doesNotThrow(() => {
JSON.parse(output);
});
assert.equal(code, 1, output);
done();
it(singleLineString`should exit with exit code 1 when warnings found
and --warnings-as-errors is used.`, () => {
let args = [
'tests/fixtures/webextension_warnings.zip',
'--warnings-as-errors',
'--output json'];
checkOutput(() => {
createInstance({config: getConfig({useCLI: true}).argv});
}, args, (output) => {
expect(() => {
JSON.parse(output.result);
}).not.toThrow();
expect(output.exitCode).toEqual(1);
});
});
it('should exit with exit code 0 when no errors for metadata.', (done) => {
let cmd = 'bin/addons-linter tests/fixtures/good.zip --metadata';
shell.exec(cmd, {silent: true}, (code, output) => {
assert.doesNotThrow(() => {
JSON.parse(output);
});
assert.equal(code, 0, output);
done();
it('should exit with exit code 0 when no errors for metadata.', () => {
let args = ['tests/fixtures/good.zip', '--metadata'];
checkOutput(() => {
createInstance({config: getConfig({useCLI: true}).argv});
}, args, (output) => {
expect(() => {
JSON.parse(output.result);
}).not.toThrow();
expect(output.exitCode).toEqual(0);
});
});
it('should exit with exit code 1 when errors for metadata', (done) => {
let cmd = 'bin/addons-linter tests/fixtures/badmeta.xpi --metadata';
shell.exec(cmd, {silent: true}, (code, output) => {
assert.doesNotThrow(() => {
JSON.parse(output);
});
assert.equal(code, 1, output);
done();
it('should exit with exit code 1 when errors for metadata', () => {
let args = ['tests/fixtures/badmeta.xpi', '--metadata'];
checkOutput(() => {
createInstance({config: getConfig({useCLI: true}).argv});
}, args, (output) => {
expect(() => {
JSON.parse(output.result);
}).not.toThrow();
expect(output.exitCode).toEqual(1);
});
});
});

Просмотреть файл

@ -1,3 +1,5 @@
import sinon from 'sinon';
import { getConfig, terminalWidth } from 'cli';
@ -15,107 +17,106 @@ describe('Basic CLI tests', function() {
it('should default logLevel type to "fatal"', () => {
// This means by default there won't be any output.
var args = cli.parse(['foo/bar.zip']);
assert.equal(args.logLevel, 'fatal');
assert.equal(args['log-level'], 'fatal');
expect(args.logLevel).toEqual('fatal');
expect(args['log-level']).toEqual('fatal');
});
it('should default metadata option to false', () => {
var args = cli.parse(['foo/bar.zip']);
assert.equal(args.metadata, false);
expect(args.metadata).toEqual(false);
});
it('should default add-on output to "text"', () => {
var args = cli.parse(['foo/bar.zip']);
assert.equal(args.output, 'text');
assert.equal(args.o, 'text');
expect(args.output).toEqual('text');
expect(args.o).toEqual('text');
});
it('should default stack to false', () => {
var args = cli.parse(['foo/bar.zip']);
assert.equal(args.stack, false);
expect(args.stack).toEqual(false);
});
it('should default pretty to false', () => {
var args = cli.parse(['foo/bar.zip']);
assert.equal(args.pretty, false);
expect(args.pretty).toEqual(false);
});
it('should default boring to false', () => {
var args = cli.parse(['foo/bar.zip']);
assert.equal(args.boring, false);
expect(args.boring).toEqual(false);
});
it('should support a --scan-file option', () => {
var args = cli.parse(['foo/', '--scan-file', 'dir/test1.txt']);
assert.equal(args.scanFile, 'dir/test1.txt');
expect(args.scanFile).toEqual('dir/test1.txt');
var args = cli.parse([
'foo/', '--scan-file', 'dir/test1.txt',
'--scan-file', 'dir/test2.txt',
]);
assert.deepEqual(args.scanFile, ['dir/test1.txt', 'dir/test2.txt']);
expect(args.scanFile).toEqual(['dir/test1.txt', 'dir/test2.txt']);
args = cli.parse(['foo/']);
assert.equal(args.scanFile, undefined);
expect(args.scanFile).toEqual(undefined);
});
it('should default warnings-as-errors to false', () => {
var args = cli.parse(['foo/bar.zip']);
assert.equal(args.warningsAsErrors, false);
expect(args.warningsAsErrors).toEqual(false);
});
it('should show error on missing xpi', () => {
cli.parse([]);
assert.ok(this.fakeFail.calledWithMatch(
'Not enough non-option arguments'));
expect(this.fakeFail.calledWithMatch(
'Not enough non-option arguments')).toBeTruthy();
});
it('should show error if incorrect output', () => {
cli.parse(['-o', 'false', 'whatevs']);
assert.ok(
this.fakeFail.calledWithMatch(
'Invalid values:\n Argument: output, Given: "false"'));
expect(this.fakeFail.calledWithMatch(
'Invalid values:\n Argument: output, Given: "false"')).toBeTruthy();
});
it('should use 78 as a width if process.stdout.columns is undefined', () => {
var fakeProcess = null;
assert.equal(terminalWidth(fakeProcess), 78);
expect(terminalWidth(fakeProcess)).toEqual(78);
fakeProcess = {stdout: null};
assert.equal(terminalWidth(fakeProcess), 78);
expect(terminalWidth(fakeProcess)).toEqual(78);
fakeProcess = {stdout: {columns: null}};
assert.equal(terminalWidth(fakeProcess), 78);
expect(terminalWidth(fakeProcess)).toEqual(78);
});
it('should always use a positive terminal width', () => {
var fakeProcess = {stdout: {columns: 1}};
assert.equal(terminalWidth(fakeProcess), 10);
expect(terminalWidth(fakeProcess)).toEqual(10);
});
it('should not use a width under 10 columns', () => {
var fakeProcess = {stdout: {columns: 12}};
assert.equal(terminalWidth(fakeProcess), 10);
expect(terminalWidth(fakeProcess)).toEqual(10);
fakeProcess = {stdout: {columns: 11}};
assert.equal(terminalWidth(fakeProcess), 10);
expect(terminalWidth(fakeProcess)).toEqual(10);
fakeProcess = {stdout: {columns: 79}};
assert.equal(terminalWidth(fakeProcess), 77);
expect(terminalWidth(fakeProcess)).toEqual(77);
});
it('should use a terminal width of $COLUMNS - 2', () => {
var fakeProcess = {stdout: {columns: 170}};
assert.equal(terminalWidth(fakeProcess), 168);
expect(terminalWidth(fakeProcess)).toEqual(168);
});
it('should have a default config when called via CLI', () => {
let config = getConfig({useCLI: true}).argv;
assert.isAbove(Object.keys(config).length, 0);
expect(Object.keys(config).length).toBeGreaterThan(0);
});
it('should error when requesting CLI config in library mode', () => {
assert.throws(() => {
expect(() => {
getConfig({useCLI: false});
}, 'Cannot request config from CLI in library mode');
}).toThrow('Cannot request config from CLI in library mode');
});
});

Просмотреть файл

@ -1,78 +1,80 @@
import sinon from 'sinon';
import { default as Collector } from 'collector';
import { fakeMessageData } from './helpers';
describe('Collector', function() {
it('should be thrown an error if Message is created without a type', () => {
assert.throws(() => {
expect(() => {
var collection = new Collector();
collection._addMessage();
}, Error, /Message type "undefined" is not/);
}).toThrow(/Message type "undefined" is not/);
});
it('should be thrown an error if Message is created with bad type', () => {
assert.throws(() => {
expect(() => {
var collection = new Collector();
collection._addMessage('whatevs');
}, Error, /Message type "whatevs" is not/);
}).toThrow(/Message type "whatevs" is not/);
});
it('should be throw an error type is not collected', () => {
assert.throws(() => {
expect(() => {
var FakeMessage = sinon.stub();
var collection = new Collector();
collection._addMessage('whatevar', fakeMessageData, FakeMessage);
}, Error, /Message type "whatevar" not currently collected/);
}).toThrow(/Message type "whatevar" not currently collected/);
});
it('length should start at 0', () => {
var collection = new Collector();
assert.equal(collection.length, 0);
expect(collection.length).toEqual(0);
});
it('length should reflect number of messages', () => {
var collection = new Collector();
assert.equal(collection.length, 0);
expect(collection.length).toEqual(0);
collection.addError(fakeMessageData);
assert.equal(collection.length, 1);
expect(collection.length).toEqual(1);
collection.addNotice(fakeMessageData);
assert.equal(collection.length, 2);
expect(collection.length).toEqual(2);
collection.addWarning(fakeMessageData);
assert.equal(collection.length, 3);
expect(collection.length).toEqual(3);
});
it('should create an error message', () => {
var collection = new Collector();
collection.addError(fakeMessageData);
assert.equal(collection.errors[0].type, 'error');
assert.equal(collection.notices.length, 0);
assert.equal(collection.warnings.length, 0);
expect(collection.errors[0].type).toEqual('error');
expect(collection.notices.length).toEqual(0);
expect(collection.warnings.length).toEqual(0);
});
it('should create a notice message', () => {
var collection = new Collector();
collection.addNotice(fakeMessageData);
assert.equal(collection.notices[0].type, 'notice');
assert.equal(collection.errors.length, 0);
assert.equal(collection.warnings.length, 0);
expect(collection.notices[0].type).toEqual('notice');
expect(collection.errors.length).toEqual(0);
expect(collection.warnings.length).toEqual(0);
});
it('should create a warning message', () => {
var collection = new Collector();
collection.addWarning(fakeMessageData);
assert.equal(collection.warnings[0].type, 'warning');
assert.equal(collection.errors.length, 0);
assert.equal(collection.notices.length, 0);
expect(collection.warnings[0].type).toEqual('warning');
expect(collection.errors.length).toEqual(0);
expect(collection.notices.length).toEqual(0);
});
it('should not add a duplicate message with a dataPath', () => {
var collection = new Collector();
collection.addWarning({ ...fakeMessageData, dataPath: '/foo' });
collection.addWarning({ ...fakeMessageData, dataPath: '/foo' });
assert.equal(collection.warnings.length, 1);
assert.equal(collection.warnings[0].type, 'warning');
assert.equal(collection.errors.length, 0);
assert.equal(collection.notices.length, 0);
expect(collection.warnings.length).toEqual(1);
expect(collection.warnings[0].type).toEqual('warning');
expect(collection.errors.length).toEqual(0);
expect(collection.notices.length).toEqual(0);
});
it('should not add duplicate files to scannedFiles', () => {
@ -82,7 +84,7 @@ describe('Collector', function() {
collection.recordScannedFile('foo.js', 'test');
collection.recordScannedFile('foo.js', 'new-test');
assert.deepEqual(collection.scannedFiles, {
expect(collection.scannedFiles).toEqual({
'foo.js': ['test', 'new-test'],
});
});
@ -101,11 +103,11 @@ describe('Collector', function() {
file: 'foo.js',
line: 26,
});
assert.equal(collection.warnings.length, 2);
assert.equal(collection.warnings[0].line, 25);
assert.equal(collection.warnings[1].line, 26);
assert.equal(collection.errors.length, 0);
assert.equal(collection.notices.length, 0);
expect(collection.warnings.length).toEqual(2);
expect(collection.warnings[0].line).toEqual(25);
expect(collection.warnings[1].line).toEqual(26);
expect(collection.errors.length).toEqual(0);
expect(collection.notices.length).toEqual(0);
});
it('should add a message that differs on one prop', () => {
@ -116,10 +118,10 @@ describe('Collector', function() {
dataPath: '/foo',
message: 'Foo message',
});
assert.equal(collection.warnings.length, 2);
assert.equal(collection.warnings[1].message, 'Foo message');
assert.equal(collection.errors.length, 0);
assert.equal(collection.notices.length, 0);
expect(collection.warnings.length).toEqual(2);
expect(collection.warnings[1].message).toEqual('Foo message');
expect(collection.errors.length).toEqual(0);
expect(collection.notices.length).toEqual(0);
});
it('should filter message by filename if config.scanFile is defined', () => {
@ -127,64 +129,64 @@ describe('Collector', function() {
scanFile: ['test.js', 'no-match-file.js'],
});
assert.equal(collection.length, 0);
expect(collection.length).toEqual(0);
// Test linting error without a file.
collection.addError({
...fakeMessageData,
});
assert.equal(collection.length, 1);
expect(collection.length).toEqual(1);
assert.equal(collection.errors.length, 1);
assert.equal(collection.warnings.length, 0);
assert.equal(collection.notices.length, 0);
assert.equal(collection.errors[0].code, fakeMessageData.code);
expect(collection.errors.length).toEqual(1);
expect(collection.warnings.length).toEqual(0);
expect(collection.notices.length).toEqual(0);
expect(collection.errors[0].code).toEqual(fakeMessageData.code);
// Test linting error with an excluded file.
collection.addError({
...fakeMessageData,
file: 'non-test.js',
});
assert.equal(collection.length, 1);
expect(collection.length).toEqual(1);
// Test linting error with an included file.
collection.addError({
...fakeMessageData,
file: 'test.js',
});
assert.equal(collection.length, 2);
expect(collection.length).toEqual(2);
// Test filtered warnings.
collection.addWarning({
...fakeMessageData,
file: 'test.js',
});
assert.equal(collection.length, 3);
expect(collection.length).toEqual(3);
// Test filtered notices.
collection.addNotice({
...fakeMessageData,
file: 'test.js',
});
assert.equal(collection.length, 4);
expect(collection.length).toEqual(4);
assert.equal(collection.errors.length, 2);
assert.equal(collection.warnings.length, 1);
assert.equal(collection.notices.length, 1);
expect(collection.errors.length).toEqual(2);
expect(collection.warnings.length).toEqual(1);
expect(collection.notices.length).toEqual(1);
assert.equal(collection.errors[1].code, fakeMessageData.code);
assert.equal(collection.errors[1].file, 'test.js');
assert.equal(collection.warnings[0].code, fakeMessageData.code);
assert.equal(collection.warnings[0].file, 'test.js');
assert.equal(collection.notices[0].code, fakeMessageData.code);
assert.equal(collection.notices[0].file, 'test.js');
expect(collection.errors[1].code).toEqual(fakeMessageData.code);
expect(collection.errors[1].file).toEqual('test.js');
expect(collection.warnings[0].code).toEqual(fakeMessageData.code);
expect(collection.warnings[0].file).toEqual('test.js');
expect(collection.notices[0].code).toEqual(fakeMessageData.code);
expect(collection.notices[0].file).toEqual('test.js');
});
it('should throw when getting messages for an undefined dataPath', () => {
var collection = new Collector();
assert.throws(() => {
expect(() => {
collection.messagesAtDataPath(undefined);
}, /dataPath is required/);
}).toThrow(/dataPath is required/);
});
});

Просмотреть файл

@ -5,6 +5,8 @@ import Linter from 'linter';
import * as constants from 'const';
import * as messages from 'messages';
import sinon from 'sinon';
import ManifestJSONParser from 'parsers/manifestjson';
import BinaryScanner from 'scanners/binary';
import CSSScanner from 'scanners/css';
@ -56,8 +58,8 @@ describe('Linter', function() {
return addonLinter.checkFileExists(addonLinter.packagePath, fakeLstat)
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.include(err.message, 'Path "foo" is not a file');
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('Path "foo" is not a file');
});
});
@ -71,8 +73,8 @@ describe('Linter', function() {
return addonLinter.checkFileExists(addonLinter.packagePath, fakeLstat)
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, TypeError);
assert.include(err.message, 'soz');
expect(err).toBeInstanceOf(TypeError);
expect(err.message).toContain('soz');
});
});
@ -95,9 +97,9 @@ describe('Linter', function() {
return addonLinter.checkFileExists(addonLinter.packagePath, fakeLstat)
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.include(err.message, 'Path "bar" is not a file or directory');
assert.equal(isFileSpy.callCount, 1);
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('Path "bar" is not a file or directory');
expect(isFileSpy.callCount).toEqual(1);
});
});
@ -105,22 +107,22 @@ describe('Linter', function() {
var addonLinter = new Linter({_: ['bar']});
addonLinter.collector.addError(fakeMessageData);
var output = addonLinter.output;
assert.equal(output.count, 1);
assert.equal(output.summary.errors, 1);
assert.equal(output.summary.notices, 0);
assert.equal(output.summary.warnings, 0);
expect(output.count).toEqual(1);
expect(output.summary.errors).toEqual(1);
expect(output.summary.notices).toEqual(0);
expect(output.summary.warnings).toEqual(0);
});
it('should collect an error when not an xpi/zip', () => {
var addonLinter = new Linter({_: ['tests/fixtures/not-a-zip.zip']});
// Stub print to prevent output.
addonLinter.print = sinon.stub();
assert.equal(addonLinter.collector.errors.length, 0);
expect(addonLinter.collector.errors.length).toEqual(0);
return addonLinter.scan()
.catch(() => {
assert.equal(addonLinter.collector.errors.length, 1);
assert.equal(addonLinter.collector.errors[0].code,
messages.BAD_ZIPFILE.code);
expect(addonLinter.collector.errors.length).toEqual(1);
expect(addonLinter.collector.errors[0].code).toEqual(
messages.BAD_ZIPFILE.code);
});
});
@ -130,11 +132,11 @@ describe('Linter', function() {
// Stub print to prevent output.
addonLinter.print = sinon.stub();
assert.equal(addonLinter.collector.warnings.length, 0);
expect(addonLinter.collector.warnings.length).toEqual(0);
return addonLinter.scan()
.then(() => {
assert.isAbove(addonLinter.collector.warnings.length, 0);
expect(addonLinter.collector.warnings.length).toBeGreaterThan(0);
});
});
@ -158,10 +160,10 @@ describe('Linter', function() {
return addonLinter.scan()
.then(() => {
assert.ok(getFileSpy.calledWith('components/main.js'));
assert.ok(getFileSpy.calledWith('components/secondary.js'));
assert.ok(getFileSpy.calledWith('install.rdf'));
assert.ok(getFileSpy.calledWith('prefs.html'));
expect(getFileSpy.calledWith('components/main.js')).toBeTruthy();
expect(getFileSpy.calledWith('components/secondary.js')).toBeTruthy();
expect(getFileSpy.calledWith('install.rdf')).toBeTruthy();
expect(getFileSpy.calledWith('prefs.html')).toBeTruthy();
});
});
@ -177,9 +179,9 @@ describe('Linter', function() {
return addonLinter.scan()
.then(() => {
assert.notOk(getFileSpy.calledWith('index.js'));
assert.ok(getFileSpy.calledWith('manifest.json'));
assert.ok(getFileSpy.calledWith('subdir/test.js'));
expect(getFileSpy.calledWith('index.js')).toBeFalsy();
expect(getFileSpy.calledWith('manifest.json')).toBeTruthy();
expect(getFileSpy.calledWith('subdir/test.js')).toBeTruthy();
});
});
@ -193,7 +195,7 @@ describe('Linter', function() {
return addonLinter.scan()
.then(() => {
assert.deepEqual(addonLinter.collector.scannedFiles, {
expect(addonLinter.collector.scannedFiles).toEqual({
'index.js': ['javascript'],
'bower_components/bar.js': ['javascript'],
'node_modules/foo.js': ['javascript'],
@ -214,10 +216,10 @@ describe('Linter', function() {
return addonLinter.scan()
.then(() => {
assert.notOk(getFileSpy.calledWith('index.js'));
assert.ok(getFileSpy.calledWith('manifest.json'));
assert.ok(getFileSpy.calledWith('subdir/test.js'));
assert.ok(getFileSpy.calledWith('subdir/test2.js'));
expect(getFileSpy.calledWith('index.js')).toBeFalsy();
expect(getFileSpy.calledWith('manifest.json')).toBeTruthy();
expect(getFileSpy.calledWith('subdir/test.js')).toBeTruthy();
expect(getFileSpy.calledWith('subdir/test2.js')).toBeTruthy();
});
});
@ -231,10 +233,11 @@ describe('Linter', function() {
addonLinter.print = sinon.stub();
return addonLinter.scan().then(() => {
assert.fail('Expected rejection not receives');
expect(false).toBe(true);
}, (err) => {
assert.equal(err.message,
`Selected file(s) not found: ${files.join(', ')}`);
expect(err.message).toEqual(
`Selected file(s) not found: ${files.join(', ')}`
);
});
});
@ -255,7 +258,7 @@ describe('Linter', function() {
return addonLinter.scanFile('whatever')
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'message.type must be defined');
expect(err.message).toContain('message.type must be defined');
});
});
@ -278,8 +281,8 @@ describe('Linter', function() {
return addonLinter.scan({_Xpi: FakeXpi})
.then(unexpectedSuccess)
.catch((err) => {
assert.instanceOf(err, Error);
assert.include(err.message, 'scanFiles explosion');
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('scanFiles explosion');
});
});
@ -300,28 +303,27 @@ describe('Linter', function() {
return addonLinter.scan({_Xpi: FakeXpi})
.then(unexpectedSuccess)
.catch(() => {
assert.ok(
addonLinter.collector.addError.calledWith(
messages.DUPLICATE_XPI_ENTRY));
assert.ok(addonLinter.print.called);
expect(addonLinter.collector.addError.calledWith(
messages.DUPLICATE_XPI_ENTRY)).toBeTruthy();
expect(addonLinter.print.called).toBeTruthy();
});
});
it('should return the correct chalk func', () => {
var addonLinter = new Linter({_: ['bar']});
assert.deepEqual(addonLinter.colorize(
constants.VALIDATION_ERROR)._styles, ['red']);
assert.deepEqual(addonLinter.colorize(
constants.VALIDATION_NOTICE)._styles, ['blue']);
assert.deepEqual(addonLinter.colorize(
constants.VALIDATION_WARNING)._styles, ['yellow']);
expect(addonLinter.colorize(
constants.VALIDATION_ERROR)._styles).toEqual(['red']);
expect(addonLinter.colorize(
constants.VALIDATION_NOTICE)._styles).toEqual(['blue']);
expect(addonLinter.colorize(
constants.VALIDATION_WARNING)._styles).toEqual(['yellow']);
});
it('should throw if invalid type is passed to colorize', () => {
var addonLinter = new Linter({_: ['bar']});
assert.throws(() => {
expect(() => {
addonLinter.colorize('whatever');
}, Error, /colorize passed invalid type/);
}).toThrow(/colorize passed invalid type/);
});
});
@ -331,19 +333,19 @@ describe('Linter.getScanner()', function() {
it('should return BinaryScanner', () => {
var addonLinter = new Linter({_: ['foo']});
var Scanner = addonLinter.getScanner('foo.whatever');
assert.deepEqual(Scanner, BinaryScanner);
expect(Scanner).toEqual(BinaryScanner);
});
it('should return CSSScanner', function() {
var addonLinter = new Linter({_: ['foo']});
var Scanner = addonLinter.getScanner('foo.css');
assert.deepEqual(Scanner, CSSScanner);
expect(Scanner).toEqual(CSSScanner);
});
it('should return JSONScanner', function() {
var addonLinter = new Linter({_: ['foo']});
var Scanner = addonLinter.getScanner('locales/en.json');
assert.deepEqual(Scanner, JSONScanner);
expect(Scanner).toEqual(JSONScanner);
});
var shouldBeFilenameScanned = [
@ -356,7 +358,7 @@ describe('Linter.getScanner()', function() {
it(`should return FilenameScanner for ${filename}`, () => {
var addonLinter = new Linter({_: ['foo']});
var Scanner = addonLinter.getScanner(filename);
assert.deepEqual(Scanner, FilenameScanner);
expect(Scanner).toEqual(FilenameScanner);
});
}
@ -374,7 +376,7 @@ describe('Linter.handleError()', function() {
error: sinon.stub(),
};
addonLinter.handleError(fakeError, fakeConsole);
assert.ok(fakeConsole.error.calledWith(fakeError.stack));
expect(fakeConsole.error.calledWith(fakeError.stack)).toBeTruthy();
});
it('should show colorized error ', () => {
@ -387,8 +389,8 @@ describe('Linter.handleError()', function() {
error: sinon.stub(),
};
addonLinter.handleError(fakeError, fakeConsole);
assert.ok(fakeConsole.error.called);
assert.ok(addonLinter.chalk.red.calledWith('Errol the error'));
expect(fakeConsole.error.called).toBeTruthy();
expect(addonLinter.chalk.red.calledWith('Errol the error')).toBeTruthy();
});
});
@ -403,8 +405,8 @@ describe('Linter.print()', function() {
log: sinon.stub(),
};
addonLinter.print(fakeConsole);
assert.ok(addonLinter.toJSON.called);
assert.ok(fakeConsole.log.called);
expect(addonLinter.toJSON.called).toBeTruthy();
expect(fakeConsole.log.called).toBeTruthy();
});
it('should print as json when config.output is text', () => {
@ -415,8 +417,8 @@ describe('Linter.print()', function() {
log: sinon.stub(),
};
addonLinter.print(fakeConsole);
assert.ok(addonLinter.textOutput.called);
assert.ok(fakeConsole.log.called);
expect(addonLinter.textOutput.called).toBeTruthy();
expect(fakeConsole.log.called).toBeTruthy();
});
it('should not print anything if config.output is none', () => {
@ -427,9 +429,9 @@ describe('Linter.print()', function() {
log: sinon.stub(),
};
addonLinter.print(fakeConsole);
assert.ok(!addonLinter.textOutput.called);
assert.ok(!addonLinter.toJSON.called);
assert.ok(!fakeConsole.log.called);
expect(!addonLinter.textOutput.called).toBeTruthy();
expect(!addonLinter.toJSON.called).toBeTruthy();
expect(!fakeConsole.log.called).toBeTruthy();
});
it('should print scanFile if any', () => {
@ -446,9 +448,9 @@ describe('Linter.print()', function() {
log: sinon.spy((...args) => logData += `${args.join(' ')}\n`),
};
addonLinter.print(fakeConsole);
assert.ok(textOutputSpy.called);
assert.ok(fakeConsole.log.called);
assert.include(logData, 'Selected files: testfile.js');
expect(textOutputSpy.called).toBeTruthy();
expect(fakeConsole.log.called).toBeTruthy();
expect(logData).toContain('Selected files: testfile.js');
});
});
@ -462,7 +464,9 @@ describe('Linter.toJSON()', function() {
stringify: sinon.stub(),
};
addonLinter.toJSON({pretty: true, _JSON: fakeJSON});
assert.ok(fakeJSON.stringify.calledWith(sinon.match.any, null, 4));
expect(
fakeJSON.stringify.calledWith(sinon.match.any, null, 4)
).toBeTruthy();
});
it('should output metadata when config.output is json', () => {
@ -475,7 +479,7 @@ describe('Linter.toJSON()', function() {
stringify: sinon.stub(),
};
addonLinter.toJSON({pretty: true, _JSON: fakeJSON});
assert.equal(fakeJSON.stringify.firstCall.args[0].metadata.meta, 'data');
expect(fakeJSON.stringify.firstCall.args[0].metadata.meta).toEqual('data');
});
it('should pass correct args to JSON.stringify for normal printing', () => {
@ -484,8 +488,8 @@ describe('Linter.toJSON()', function() {
stringify: sinon.stub(),
};
addonLinter.toJSON({pretty: false, _JSON: fakeJSON});
assert.equal(fakeJSON.stringify.getCall(0).args[1], undefined);
assert.equal(fakeJSON.stringify.getCall(0).args[2], undefined);
expect(fakeJSON.stringify.getCall(0).args[1]).toEqual(undefined);
expect(fakeJSON.stringify.getCall(0).args[2]).toEqual(undefined);
});
it('should provide JSON via toJSON()', () => {
@ -493,10 +497,10 @@ describe('Linter.toJSON()', function() {
addonLinter.collector.addError(fakeMessageData);
var json = addonLinter.toJSON();
var parsedJSON = JSON.parse(json);
assert.equal(parsedJSON.count, 1);
assert.equal(parsedJSON.summary.errors, 1);
assert.equal(parsedJSON.summary.notices, 0);
assert.equal(parsedJSON.summary.warnings, 0);
expect(parsedJSON.count).toEqual(1);
expect(parsedJSON.summary.errors).toEqual(1);
expect(parsedJSON.summary.notices).toEqual(0);
expect(parsedJSON.summary.warnings).toEqual(0);
});
});
@ -529,11 +533,11 @@ describe('Linter.textOutput()', function() {
description: 'whatever error description',
});
var text = addonLinter.textOutput(terminalWidth);
assert.equal(addonLinter.output.summary.errors, 1);
assert.include(text, 'Validation Summary:');
assert.include(text, 'WHATEVER_ERROR');
assert.include(text, 'whatever error message');
assert.include(text, 'whatever error description');
expect(addonLinter.output.summary.errors).toEqual(1);
expect(text).toContain('Validation Summary:');
expect(text).toContain('WHATEVER_ERROR');
expect(text).toContain('whatever error message');
expect(text).toContain('whatever error description');
});
it('should have notice message in textOutput()', () => {
@ -544,11 +548,11 @@ describe('Linter.textOutput()', function() {
description: 'whatever notice description',
});
var text = addonLinter.textOutput(terminalWidth);
assert.equal(addonLinter.output.summary.notices, 1);
assert.include(text, 'Validation Summary:');
assert.include(text, 'WHATEVER_NOTICE');
assert.include(text, 'whatever notice message');
assert.include(text, 'whatever notice description');
expect(addonLinter.output.summary.notices).toEqual(1);
expect(text).toContain('Validation Summary:');
expect(text).toContain('WHATEVER_NOTICE');
expect(text).toContain('whatever notice message');
expect(text).toContain('whatever notice description');
});
it('should have warning in textOutput()', () => {
@ -559,11 +563,11 @@ describe('Linter.textOutput()', function() {
description: 'whatever warning description',
});
var text = addonLinter.textOutput(terminalWidth);
assert.equal(addonLinter.output.summary.warnings, 1);
assert.include(text, 'Validation Summary:');
assert.include(text, 'WHATEVER_WARNING');
assert.include(text, 'whatever warning message');
assert.include(text, 'whatever warning description');
expect(addonLinter.output.summary.warnings).toEqual(1);
expect(text).toContain('Validation Summary:');
expect(text).toContain('WHATEVER_WARNING');
expect(text).toContain('whatever warning message');
expect(text).toContain('whatever warning description');
});
it('should remove description when terminal is <78 columns wide', () => {
@ -574,9 +578,9 @@ describe('Linter.textOutput()', function() {
description: 'whatever error description',
});
var text = addonLinter.textOutput(mediumTerminalWidth);
assert.equal(addonLinter.output.summary.errors, 1);
assert.notInclude(text, 'Description');
assert.notInclude(text, 'whatever error description');
expect(addonLinter.output.summary.errors).toEqual(1);
expect(text).not.toContain('Description');
expect(text).not.toContain('whatever error description');
});
it(singleLineString`should remove columns, description, and lines when
@ -590,13 +594,13 @@ describe('Linter.textOutput()', function() {
line: 20,
});
var text = addonLinter.textOutput(smallTerminalWidth);
assert.equal(addonLinter.output.summary.errors, 1);
assert.notInclude(text, 'Description');
assert.notInclude(text, 'whatever error description');
assert.notInclude(text, 'Column');
assert.notInclude(text, '5');
assert.notInclude(text, 'Line');
assert.notInclude(text, '20');
expect(addonLinter.output.summary.errors).toEqual(1);
expect(text).not.toContain('Description');
expect(text).not.toContain('whatever error description');
expect(text).not.toContain('Column');
expect(text).not.toContain('5');
expect(text).not.toContain('Line');
expect(text).not.toContain('20');
});
it('should survive even a 1 column terminal', () => {
@ -610,9 +614,9 @@ describe('Linter.textOutput()', function() {
});
try {
addonLinter.textOutput(uselesslyTinyTerminalWidth);
assert.equal(addonLinter.output.summary.errors, 1);
expect(addonLinter.output.summary.errors).toEqual(1);
} catch (e) {
assert.fail(null, null, 'Should not error on tiny terminal');
expect(false).toBe(true);
}
});
});
@ -627,14 +631,14 @@ describe('Linter.getAddonMetadata()', function() {
addonLinter.print = sinon.stub();
assert.typeOf(addonLinter.addonMetadata, 'null');
expect(addonLinter.addonMetadata).toBe(null);
return addonLinter.scan()
.then(() => {
return addonLinter.getAddonMetadata();
})
.then((metadata) => {
assert.isAbove(Object.keys(metadata).length, 0);
expect(Object.keys(metadata).length).toBeGreaterThan(0);
});
});
@ -660,14 +664,14 @@ describe('Linter.getAddonMetadata()', function() {
return getMetadata()
.then(() => {
assert.isFalse(fakeLog.debug.called);
assert.typeOf(addonLinter.addonMetadata, 'object');
expect(fakeLog.debug.called).toBe(false);
expect(typeof addonLinter.addonMetadata).toBe('object');
})
.then(() => getMetadata())
.then(() => {
assert.isTrue(fakeLog.debug.called);
assert.isTrue(fakeLog.debug.calledWith(
'Metadata already set; returning cached metadata.'));
expect(fakeLog.debug.called).toBe(true);
expect(fakeLog.debug.calledWith(
'Metadata already set; returning cached metadata.')).toBe(true);
});
});
@ -685,7 +689,7 @@ describe('Linter.getAddonMetadata()', function() {
};
return addonLinter.getAddonMetadata()
.then((metadata) => {
assert.equal(metadata.type, constants.PACKAGE_EXTENSION);
expect(metadata.type).toEqual(constants.PACKAGE_EXTENSION);
});
});
@ -707,8 +711,8 @@ describe('Linter.getAddonMetadata()', function() {
ManifestJSONParser: FakeManifestParser,
})
.then(() => {
assert.equal(FakeManifestParser.called, true);
assert.equal(FakeManifestParser.firstCall.args[2].selfHosted, true);
expect(FakeManifestParser.called).toEqual(true);
expect(FakeManifestParser.firstCall.args[2].selfHosted).toEqual(true);
});
});
@ -725,9 +729,9 @@ describe('Linter.getAddonMetadata()', function() {
return addonLinter.getAddonMetadata()
.then(() => {
var errors = addonLinter.collector.errors;
assert.equal(errors.length, 2);
assert.equal(errors[0].code, messages.MULTIPLE_MANIFESTS.code);
assert.equal(errors[1].code, messages.TYPE_NOT_DETERMINED.code);
expect(errors.length).toEqual(2);
expect(errors[0].code).toEqual(messages.MULTIPLE_MANIFESTS.code);
expect(errors[1].code).toEqual(messages.TYPE_NOT_DETERMINED.code);
});
});
@ -741,9 +745,9 @@ describe('Linter.getAddonMetadata()', function() {
return addonLinter.getAddonMetadata()
.then(() => {
var notices = addonLinter.collector.notices;
assert.equal(notices.length, 2);
assert.equal(notices[0].code, messages.TYPE_NO_MANIFEST_JSON.code);
assert.equal(notices[1].code, messages.TYPE_NO_INSTALL_RDF.code);
expect(notices.length).toEqual(2);
expect(notices[0].code).toEqual(messages.TYPE_NO_MANIFEST_JSON.code);
expect(notices[1].code).toEqual(messages.TYPE_NO_INSTALL_RDF.code);
});
});
@ -788,8 +792,8 @@ describe('Linter.extractMetadata()', function() {
_Directory: FakeDirectory,
_console: fakeConsole,
}).then((metadata) => {
assert.deepEqual(metadata, fakeMetadata);
assert.instanceOf(addonLinter.io, FakeDirectory);
expect(metadata).toEqual(fakeMetadata);
expect(addonLinter.io).toBeInstanceOf(FakeDirectory);
});
});
@ -816,8 +820,8 @@ describe('Linter.extractMetadata()', function() {
return addonLinter.extractMetadata({_Crx: FakeCrx, _console: fakeConsole})
.then((metadata) => {
assert.deepEqual(metadata, fakeMetadata);
assert.instanceOf(addonLinter.io, FakeCrx);
expect(metadata).toEqual(fakeMetadata);
expect(addonLinter.io).toBeInstanceOf(FakeCrx);
});
});
@ -861,13 +865,14 @@ describe('Linter.extractMetadata()', function() {
return addonLinter.extractMetadata({_Directory: FakeDirectory})
.then(() => {
assert.instanceOf(addonLinter.io, FakeDirectory);
assert.equal(setScanFileCallback.called, true);
assert.equal(typeof setScanFileCallback.firstCall.args[0],
'function');
assert.equal(shouldScanFile.called, false);
expect(addonLinter.io).toBeInstanceOf(FakeDirectory);
expect(setScanFileCallback.called).toEqual(true);
expect(typeof setScanFileCallback.firstCall.args[0]).toEqual(
'function'
);
expect(shouldScanFile.called).toEqual(false);
setScanFileCallback.firstCall.args[0]();
assert.equal(shouldScanFile.called, true);
expect(shouldScanFile.called).toEqual(true);
});
});
@ -896,7 +901,7 @@ describe('Linter.extractMetadata()', function() {
_Xpi: FakeXpi,
_console: fakeConsole,
}).then((metadata) => {
assert.deepEqual(metadata, fakeMetadata);
expect(metadata).toEqual(fakeMetadata);
});
});
@ -933,12 +938,12 @@ describe('Linter.extractMetadata()', function() {
_Xpi: FakeXpi,
_console: fakeConsole,
}).then(() => {
assert.ok(addonLinter.toJSON.called);
expect(addonLinter.toJSON.called).toBeTruthy();
var inputObject = addonLinter.toJSON.firstCall.args[0].input;
assert.equal(inputObject.hasErrors, true);
assert.deepEqual(inputObject.metadata, fakeMetadata);
assert.equal(inputObject.errors.length, 1);
assert.equal(inputObject.errors[0].code, 'FAKE_METADATA_ERROR');
expect(inputObject.hasErrors).toEqual(true);
expect(inputObject.metadata).toEqual(fakeMetadata);
expect(inputObject.errors.length).toEqual(1);
expect(inputObject.errors[0].code).toEqual('FAKE_METADATA_ERROR');
});
});
@ -961,8 +966,8 @@ describe('Linter.extractMetadata()', function() {
return addonLinter.extractMetadata({_console: fakeConsole})
.then((metadata) => {
assert.ok(markEmptyFilesSpy.called);
assert.deepEqual(metadata.emptyFiles, ['data/empty.js']);
expect(markEmptyFilesSpy.called).toBeTruthy();
expect(metadata.emptyFiles).toEqual(['data/empty.js']);
});
});
@ -985,9 +990,9 @@ describe('Linter.extractMetadata()', function() {
return addonLinter.extractMetadata({_console: fakeConsole})
.then((metadata) => {
assert.ok(markJSFilesSpy.called);
assert.equal(Object.keys(metadata.jsLibs).length, 1);
assert.deepEqual(metadata.jsLibs, {
expect(markJSFilesSpy.called).toBeTruthy();
expect(Object.keys(metadata.jsLibs).length).toEqual(1);
expect(metadata.jsLibs).toEqual({
'data/jquery-3.2.1.min.js': 'jquery.3.2.1.jquery.min.js',
});
});
@ -1029,15 +1034,15 @@ describe('Linter.extractMetadata()', function() {
_console: fakeConsole,
_Xpi: FakeXpi,
}).then((metadata) => {
assert.ok(markJSFilesSpy.called);
assert.equal(Object.keys(metadata.jsLibs).length, 1);
assert.deepEqual(metadata.jsLibs, {
expect(markJSFilesSpy.called).toBeTruthy();
expect(Object.keys(metadata.jsLibs).length).toEqual(1);
expect(metadata.jsLibs).toEqual({
'my/nested/library/path/j.js': 'jquery.3.2.1.jquery.min.js',
});
var notices = addonLinter.collector.notices;
assert.equal(notices.length, 3);
assert.equal(notices[2].code, messages.KNOWN_LIBRARY.code);
expect(notices.length).toEqual(3);
expect(notices[2].code).toEqual(messages.KNOWN_LIBRARY.code);
});
});
@ -1073,7 +1078,7 @@ describe('Linter.extractMetadata()', function() {
_console: fakeConsole,
_Xpi: FakeXpi,
}).then(() => {
assert.lengthOf(addonLinter.collector.warnings, 0);
expect(addonLinter.collector.warnings.length).toBe(0);
});
});
@ -1097,16 +1102,16 @@ describe('Linter.extractMetadata()', function() {
return addonLinter.extractMetadata({_console: fakeConsole})
.then((metadata) => {
assert.ok(markBannedSpy.called);
assert.equal(Object.keys(metadata.jsLibs).length, 2);
assert.deepEqual(metadata.jsLibs, {
expect(markBannedSpy.called).toBeTruthy();
expect(Object.keys(metadata.jsLibs).length).toEqual(2);
expect(metadata.jsLibs).toEqual({
'data/angular-1.2.28.min.js': 'angularjs.1.2.28.angular.min.js',
'data/jquery-3.2.1.min.js': 'jquery.3.2.1.jquery.min.js',
});
var errors = addonLinter.collector.errors;
assert.equal(errors.length, 1);
assert.equal(errors[0].code, messages.BANNED_LIBRARY.code);
expect(errors.length).toEqual(1);
expect(errors[0].code).toEqual(messages.BANNED_LIBRARY.code);
});
});
@ -1123,15 +1128,15 @@ describe('Linter.extractMetadata()', function() {
};
addonLinter._markBannedLibs(fakeMetadata, fakeUnadvisedLibs);
assert.equal(Object.keys(fakeMetadata.jsLibs).length, 2);
assert.deepEqual(fakeMetadata.jsLibs, {
expect(Object.keys(fakeMetadata.jsLibs).length).toEqual(2);
expect(fakeMetadata.jsLibs).toEqual({
'data/unadvised_fake_lib.js': 'test_unadvised_fake_lib.js',
'data/jquery-3.2.1.min.js': 'jquery.3.2.1.jquery.min.js',
});
var warnings = addonLinter.collector.warnings;
assert.equal(warnings.length, 1);
assert.equal(warnings[0].code, messages.UNADVISED_LIBRARY.code);
expect(warnings.length).toEqual(1);
expect(warnings[0].code).toEqual(messages.UNADVISED_LIBRARY.code);
});
it('should use size attribute if uncompressedSize is undefined', () => {
@ -1162,8 +1167,8 @@ describe('Linter.extractMetadata()', function() {
_Directory: FakeDirectory,
_console: fakeConsole,
}).then((metadata) => {
assert.ok(markEmptyFilesSpy.called);
assert.deepEqual(metadata.emptyFiles, ['whatever']);
expect(markEmptyFilesSpy.called).toBeTruthy();
expect(metadata.emptyFiles).toEqual(['whatever']);
});
});
@ -1184,8 +1189,8 @@ describe('Linter.extractMetadata()', function() {
}
return addonLinter.scan({_Xpi: FakeXpi, _console: fakeConsole})
.catch((err) => {
assert.ok(markEmptyFilesSpy.called);
assert.equal(err.message, 'No size available for whatever');
expect(markEmptyFilesSpy.called).toBeTruthy();
expect(err.message).toEqual('No size available for whatever');
});
});
@ -1217,10 +1222,11 @@ describe('Linter.extractMetadata()', function() {
}
return addonLinter.scan({_Xpi: FakeXpi, _console: fakeConsole})
.then(() => {
assert.equal(addonLinter.collector.errors[0].code,
messages.FILE_TOO_LARGE.code);
expect(addonLinter.collector.errors[0].code).toEqual(
messages.FILE_TOO_LARGE.code
);
// CSS and JS files that are too large should be flagged.
assert.lengthOf(addonLinter.collector.errors, 2);
expect(addonLinter.collector.errors.length).toBe(2);
});
});
@ -1252,7 +1258,7 @@ describe('Linter.extractMetadata()', function() {
}
return addonLinter.scan({_Xpi: FakeXpi, _console: fakeConsole})
.then(() => {
assert.lengthOf(addonLinter.collector.errors, 0);
expect(addonLinter.collector.errors.length).toBe(0);
});
});
@ -1279,7 +1285,7 @@ describe('Linter.run()', function() {
addonLinter.checkMinNodeVersion = () => {
return Promise.resolve();
};
sinon.stub(addonLinter, 'markSpecialFiles', (addonMetadata) => {
sinon.stub(addonLinter, 'markSpecialFiles').callsFake((addonMetadata) => {
return Promise.resolve(addonMetadata);
});
@ -1288,11 +1294,11 @@ describe('Linter.run()', function() {
return addonLinter.run({_Xpi: FakeXpi, _console: fakeConsole})
.then(() => {
assert.ok(addonLinter.toJSON.called);
assert.ok(addonLinter.markSpecialFiles.called);
assert.deepEqual(
addonLinter.toJSON.firstCall.args[0].input,
{hasErrors: false, metadata: fakeMetadata});
expect(addonLinter.toJSON.called).toBeTruthy();
expect(addonLinter.markSpecialFiles.called).toBeTruthy();
expect(addonLinter.toJSON.firstCall.args[0].input).toEqual(
{hasErrors: false, metadata: fakeMetadata}
);
});
});
@ -1304,7 +1310,7 @@ describe('Linter.run()', function() {
return addonLinter.run({_console: fakeConsole})
.then(() => {
assert.ok(addonLinter.scan.called);
expect(addonLinter.scan.called).toBeTruthy();
});
});
@ -1329,9 +1335,9 @@ describe('Linter.run()', function() {
return addonLinter.run({_Xpi: FakeXpi, _console: fakeConsole})
.then(unexpectedSuccess)
.catch((err) => {
assert.ok(addonLinter.handleError.called);
assert.instanceOf(err, Error);
assert.include(err.message, 'metadata explosion');
expect(addonLinter.handleError.called).toBeTruthy();
expect(err).toBeInstanceOf(Error);
expect(err.message).toContain('metadata explosion');
});
});
@ -1343,7 +1349,7 @@ describe('Linter.run()', function() {
return addonLinter.run({_console: fakeConsole})
.then((result) => {
assert.deepEqual(result, addonLinter.output);
expect(result).toEqual(addonLinter.output);
});
});
@ -1355,7 +1361,7 @@ describe('Linter.run()', function() {
return addonLinter.run({_console: fakeConsole})
.then((result) => {
assert.deepEqual(result, addonLinter.output);
expect(result).toEqual(addonLinter.output);
});
});

Просмотреть файл

@ -3,14 +3,14 @@ import { createLogger } from 'logger';
describe('logger.createLogger()', function() {
it('should throw if LOG_LEVEL is not an expected value', () => {
assert.throws(() => {
expect(() => {
var fakeProcess = {
env: {
LOG_LEVEL: 'whatever',
},
};
createLogger(fakeProcess);
}, Error, /LOG_LEVEL must be one of/);
}).toThrow(/LOG_LEVEL must be one of/);
});
});

Просмотреть файл

@ -5,23 +5,23 @@ import { createInstance, isRunFromCLI } from 'main';
describe('Main module tests', function() {
it('should error when used as library without explicit config', () => {
assert.throws(() => {
expect(() => {
createInstance({
config: getConfig({useCLI: isRunFromCLI(null)}).argv,
});
}, 'Cannot request config from CLI in library mode');
}).toThrow('Cannot request config from CLI in library mode');
});
it('getConfig should not error when called via CLI', () => {
assert.doesNotThrow(() => {
expect(() => {
createInstance({
config: getConfig({useCLI: true}).argv,
});
});
}).not.toThrow();
});
it("should return false when modules don't match up", () => {
assert.isFalse(isRunFromCLI(null));
expect(isRunFromCLI(null)).toBe(false);
});
});

Просмотреть файл

@ -6,15 +6,15 @@ import { fakeMessageData } from './helpers';
describe('Message', function() {
it('should throw on missing type', () => {
assert.throws(() => {
expect(() => {
var MyMessage = new Message();
}, Error, /Message type "undefined" is not/);
}).toThrow(/Message type "undefined" is not/);
});
it('should throw on invalid type', () => {
assert.throws(() => {
expect(() => {
var MyMessage = new Message('awooga');
}, Error, /Message type "awooga" is not/);
}).toThrow(/Message type "awooga" is not/);
});
it('should define all expected props', () => {
@ -24,34 +24,34 @@ describe('Message', function() {
}
var MyMessage = new Message('error', fakeData);
for (let prop of props) {
assert.equal(MyMessage[prop], prop);
expect(MyMessage[prop]).toEqual(prop);
}
});
it ("shouldn't define random opts", () => {
var MyMessage = new Message('error',
Object.assign({}, fakeMessageData, {random: 'foo'}));
assert.notEqual(MyMessage.random, 'foo');
expect(MyMessage.random).not.toEqual('foo');
});
it('should throw on missing required prop', () => {
assert.throws(() => {
expect(() => {
var MyMessage = new Message('error',
Object.assign({}, {description: 'foo'}));
}, Error, /Message data object is missing the following props/);
}).toThrow(/Message data object is missing the following props/);
});
it('should throw on incorrect file prop filename', () => {
assert.throws(() => {
expect(() => {
var MyMessage = new Message('error',
Object.assign({}, {filename: 'foo'}));
}, Error, /The key for the file is "file"/);
}).toThrow(/The key for the file is "file"/);
});
describe('matches', () => {
let fakeData;
before(() => {
beforeAll(() => {
fakeData = props.reduce((obj, prop) => ({
...obj,
[prop]: prop,
@ -61,13 +61,13 @@ describe('Message', function() {
it('is a match if the props are all the same', () => {
var message = new Message('error', { ...fakeData });
var other = new Message('error', { ...fakeData });
assert.ok(message.matches(other));
expect(message.matches(other)).toBeTruthy();
});
it('is not a match with props the same except type', () => {
var message = new Message('error', { ...fakeData });
var other = new Message('warning', { ...fakeData });
assert.notOk(message.matches(other));
expect(message.matches(other)).toBeFalsy();
});
it('is not a match with different props', () => {
@ -76,7 +76,7 @@ describe('Message', function() {
...fakeData,
message: 'different message',
});
assert.notOk(message.matches(other));
expect(message.matches(other)).toBeFalsy();
});
});

Просмотреть файл

@ -1,7 +1,6 @@
import { readFileSync } from 'fs';
import * as messages from 'messages';
import { singleLineString } from 'utils';
describe('Messages', function() {
@ -15,21 +14,19 @@ describe('Messages', function() {
it(`should have code length <= 25 for ${code}`, () => {
// Otherwise the ansi color sequences will be borked
// as columnify doesn't handle them when wrapping text.
assert.isBelow(code.length, 26, `code ${code} is too long`);
expect(code.length).toBeLessThan(26);
});
}
if (description) {
it(`should not have any newlines in description for ${code}`, () => {
assert.equal(description.split('\n').length, 1,
`The description for ${code} should not have newlines`);
expect(description.split('\n').length).toEqual(1);
});
}
if (msg) {
it(`should not have any newlines in message for ${code}`, () => {
assert.equal(msg.split('\n').length, 1,
`The message for ${code} should not have newlines`);
expect(msg.split('\n').length).toEqual(1);
});
}
}
@ -38,13 +35,13 @@ describe('Messages', function() {
var vegetarianTag = messages._tagNotAllowed('steak');
var teslaTag = messages._tagObsolete('petrol');
assert.equal(vegetarianTag.code, 'TAG_NOT_ALLOWED_STEAK');
assert.include(vegetarianTag.message, 'steak');
assert.include(vegetarianTag.description, 'steak');
expect(vegetarianTag.code).toEqual('TAG_NOT_ALLOWED_STEAK');
expect(vegetarianTag.message).toContain('steak');
expect(vegetarianTag.description).toContain('steak');
assert.equal(teslaTag.code, 'TAG_OBSOLETE_PETROL');
assert.include(teslaTag.message, 'petrol');
assert.include(teslaTag.description, 'petrol');
expect(teslaTag.code).toEqual('TAG_OBSOLETE_PETROL');
expect(teslaTag.message).toContain('petrol');
expect(teslaTag.description).toContain('petrol');
});
it('should have updated rules.md with new message codes', () => {
@ -55,8 +52,7 @@ describe('Messages', function() {
// Asserting using indexOf rather than assert.include
// to avoid inclusion of the whole rules.md as part
// of the error.
assert.ok(markdown.indexOf(code) > -1,
`code ${code} is not present in rules.md`);
expect(markdown.indexOf(code) > -1).toBeTruthy();
}
}
});
@ -67,11 +63,7 @@ describe('Messages', function() {
var legacyCode = messages[message].legacyCode;
if ((legacyCode instanceof Array && legacyCode.length !== 3) ||
(!(legacyCode instanceof Array) && legacyCode !== null)) {
assert.fail(null, null, singleLineString`A valide legacyCode could
not be found for code: "${messages[message].code}". Should be
an Array with 3 values based on the amo-validator err_id or null.
A null value is an explicit way to say the old err_id tuple is not
useful e.g. a matching code doesn't exist or it's not unique.`);
expect(false).toBe(true);
}
}
}

Просмотреть файл

@ -1,4 +1,5 @@
import * as utils from 'utils';
import sinon from 'sinon';
import { unexpectedSuccess } from './helpers';
@ -8,7 +9,7 @@ describe('utils.singleLineString()', function() {
var output = utils.singleLineString`foo
bar
baz`;
assert.equal(output, 'foo bar baz');
expect(output).toEqual('foo bar baz');
});
it('should still do subs', () => {
@ -18,7 +19,7 @@ describe('utils.singleLineString()', function() {
var output = utils.singleLineString`one ${foo}
two ${bar}
three ${baz}`;
assert.equal(output, 'one 1 two 2 three 3');
expect(output).toEqual('one 1 two 2 three 3');
});
it('should still work with tabs', () => {
@ -28,9 +29,8 @@ describe('utils.singleLineString()', function() {
var output = utils.singleLineString`So here is us, on the
${raggedy} edge. Don't push ${me},
and I won't push ${you}.`;
assert.equal(output,
'So here is us, on the raggedy edge. ' +
"Don't push me, and I won't push you.");
expect(output).toEqual('So here is us, on the raggedy edge. ' +
"Don't push me, and I won't push you.");
});
});
@ -67,7 +67,7 @@ describe('utils.getRootExpression()', function() {
it('should verify that the root node is what was expected', () => {
var root = utils.getRootExpression(node);
assert.equal(root.name, 'pref');
expect(root.name).toEqual('pref');
});
});
@ -113,14 +113,14 @@ describe('utils.getNodeReference()', () => {
var ref = { name: 'foo' };
var val = utils.getNodeReference(context, ref);
assert.equal(val.name, 'bar');
expect(val.name).toEqual('bar');
});
it('should return the name of the reference if not in scope', () => {
var ref = { name: 'doesNotExist' };
var val = utils.getNodeReference(context, ref);
assert.equal(val.name, ref.name);
expect(val.name).toEqual(ref.name);
});
});
@ -163,18 +163,18 @@ describe('utils.getVariable()', function() {
it('should return the correct variable in the given context.', () => {
var foo = utils.getVariable(context, 'foo');
assert.equal(foo.type, 'Literal');
assert.equal(foo.value, 'bar');
expect(foo.type).toEqual('Literal');
expect(foo.value).toEqual('bar');
});
it("should return undefined if the variable doesn't exist.", () => {
var undef = utils.getVariable(context, 'doesNotExist');
assert.equal(typeof undef, 'undefined');
expect(typeof undef).toEqual('undefined');
});
it("should return undefined if the init property isn't on the parent", () => {
var undef = utils.getVariable(contextWithoutParent, 'foo');
assert.equal(typeof undef, 'undefined');
expect(typeof undef).toEqual('undefined');
});
});
@ -189,12 +189,12 @@ describe('utils.checkOtherReferences', function() {
it('should return the node if reference is a Literal', () => {
var literal = utils.getNodeReference(context, {type: 'Literal'});
assert.equal(literal.type, 'Literal');
expect(literal.type).toEqual('Literal');
});
it('should return the node if reference is undefined', () => {
var undef = utils.getNodeReference(context, {type: 'undefined'});
assert.equal(undef.type, 'undefined');
expect(undef.type).toEqual('undefined');
});
});
@ -202,31 +202,31 @@ describe('utils.checkOtherReferences', function() {
describe('utils.ensureFilenameExists()', function() {
it('should throw error when filename is not a string', () => {
assert.throws(() => {
expect(() => {
utils.ensureFilenameExists();
}, Error, 'Filename is required');
assert.throws(() => {
}).toThrow('Filename is required');
expect(() => {
utils.ensureFilenameExists(0);
}, Error, 'Filename is required');
assert.throws(() => {
}).toThrow('Filename is required');
expect(() => {
utils.ensureFilenameExists(undefined);
}, Error, 'Filename is required');
assert.throws(() => {
}).toThrow('Filename is required');
expect(() => {
utils.ensureFilenameExists(null);
}, Error, 'Filename is required');
}).toThrow('Filename is required');
});
it('should throw error when filename is empty', () => {
assert.throws(() => {
expect(() => {
utils.ensureFilenameExists('');
}, Error, 'Filename is required');
}).toThrow('Filename is required');
});
it('should accept filenames', () => {
assert.doesNotThrow(() => {
expect(() => {
utils.ensureFilenameExists('foo.js');
utils.ensureFilenameExists('0');
}, Error);
}).not.toThrow();
});
});
@ -241,7 +241,7 @@ describe('utils.checkMinNodeVersion()', function() {
return utils.checkMinNodeVersion('0.12.7', fakeProcess)
.then(unexpectedSuccess)
.catch((err) => {
assert.include(err.message, 'Node version must be 0.12.7 or greater');
expect(err.message).toContain('Node version must be 0.12.7 or greater');
});
});
@ -266,10 +266,10 @@ describe('utils.ignorePrivateFunctions()', function() {
};
var publicFunctions = utils.ignorePrivateFunctions(listOfRuleFunctions);
assert.typeOf(publicFunctions, 'object');
assert.lengthOf(Object.keys(publicFunctions), 3);
assert.notInclude(Object.keys(publicFunctions), '_parseEvalPossibility');
assert.notInclude(Object.keys(publicFunctions), '__checkForFunctions');
expect(typeof publicFunctions).toBe('object');
expect(Object.keys(publicFunctions).length).toBe(3);
expect(Object.keys(publicFunctions)).not.toContain('_parseEvalPossibility');
expect(Object.keys(publicFunctions)).not.toContain('__checkForFunctions');
});
it('should return an empty object when given only private functions', () => {
@ -279,8 +279,8 @@ describe('utils.ignorePrivateFunctions()', function() {
};
var publicFunctions = utils.ignorePrivateFunctions(listOfRuleFunctions);
assert.typeOf(publicFunctions, 'object');
assert.lengthOf(Object.keys(publicFunctions), 0);
expect(typeof publicFunctions).toBe('object');
expect(Object.keys(publicFunctions).length).toBe(0);
});
it('should return only functions', () => {
@ -292,7 +292,7 @@ describe('utils.ignorePrivateFunctions()', function() {
var publicFunctions = utils.ignorePrivateFunctions(listOfRuleFunctions);
for (let functionName in publicFunctions) {
assert.equal(typeof publicFunctions[functionName], 'function');
expect(typeof publicFunctions[functionName]).toEqual('function');
}
});
@ -302,23 +302,23 @@ describe('utils.ignorePrivateFunctions()', function() {
describe('utils.getPackageTypeAsString()', function() {
it('should look up a package type when passed a number', () => {
assert.equal(utils.getPackageTypeAsString(2), 'PACKAGE_THEME');
expect(utils.getPackageTypeAsString(2)).toEqual('PACKAGE_THEME');
});
it('should look up a package type when passed a string', () => {
assert.equal(utils.getPackageTypeAsString('2'), 'PACKAGE_THEME');
expect(utils.getPackageTypeAsString('2')).toEqual('PACKAGE_THEME');
});
it('should throw if given a non-existent package type value', () => {
assert.throws(() => {
expect(() => {
utils.getPackageTypeAsString(127);
}, Error, 'Invalid package type constant "127"');
}).toThrow('Invalid package type constant "127"');
});
it('should throw if given a bogus package type value', () => {
assert.throws(() => {
expect(() => {
utils.getPackageTypeAsString('whatevs');
}, Error, 'Invalid package type constant "whatevs"');
}).toThrow('Invalid package type constant "whatevs"');
});
});
@ -327,30 +327,30 @@ describe('utils.getPackageTypeAsString()', function() {
describe('utils.isLocalUrl', () => {
it('should not match remote urls', () => {
assert.notOk(utils.isLocalUrl('http://foo.com'));
assert.notOk(utils.isLocalUrl('https://foo.com'));
assert.notOk(utils.isLocalUrl('ftp://foo.com'));
assert.notOk(utils.isLocalUrl('//foo.com'));
expect(utils.isLocalUrl('http://foo.com')).toBeFalsy();
expect(utils.isLocalUrl('https://foo.com')).toBeFalsy();
expect(utils.isLocalUrl('ftp://foo.com')).toBeFalsy();
expect(utils.isLocalUrl('//foo.com')).toBeFalsy();
});
it('should not match data uri', () => {
assert.notOk(utils.isLocalUrl('data:image/gif;base64,R0' +
'lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'));
expect(utils.isLocalUrl('data:image/gif;base64,R0' +
'lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7')).toBeFalsy();
});
it('should match chrome protocol', () => {
assert.ok(utils.isLocalUrl('chrome://bar/foo'));
expect(utils.isLocalUrl('chrome://bar/foo')).toBeTruthy();
});
it('should match resource protocol', () => {
assert.ok(utils.isLocalUrl('resource://bar/foo'));
expect(utils.isLocalUrl('resource://bar/foo')).toBeTruthy();
});
it('should match non-remote urls starting with /', () => {
assert.ok(utils.isLocalUrl('/bar/foo'));
expect(utils.isLocalUrl('/bar/foo')).toBeTruthy();
});
it('should match non-remote urls starting with alpha', () => {
assert.ok(utils.isLocalUrl('bar'));
expect(utils.isLocalUrl('bar')).toBeTruthy();
});
});

Просмотреть файл

@ -11,7 +11,7 @@ fs.readdirSync('node_modules')
return ['.bin'].indexOf(x) === -1;
})
.forEach(function(mod) {
nodeModules[mod] = 'commonjs ' + mod;
nodeModules[mod] = `commonjs ${mod}`;
});