2017-09-22 19:51:03 +02:00
/**
* @license
* Copyright Google Inc. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
2017-01-19 16:24:47 -08:00
describe ( 'validate-commit-message.js' , function () {
var validateMessage = require ( './validate-commit-message' );
2018-01-09 13:46:19 -08:00
var SCOPES = validateMessage . config . scopes . join ( ', ' );
2017-01-19 16:24:47 -08:00
var errors = [];
var logs = [];
var VALID = true ;
var INVALID = false ;
beforeEach ( function () {
errors . length = 0 ;
logs . length = 0 ;
spyOn ( console , 'error' ). and . callFake ( function ( msg ) {
errors . push ( msg . replace ( /\x1B\[\d+m/g , '' )); // uncolor
});
spyOn ( console , 'log' ). and . callFake ( function ( msg ) {
logs . push ( msg . replace ( /\x1B\[\d+m/g , '' )); // uncolor
});
});
describe ( 'validateMessage' , function () {
it ( 'should be valid' , function () {
expect ( validateMessage ( 'fix(core): something' )). toBe ( VALID );
expect ( validateMessage ( 'feat(common): something' )). toBe ( VALID );
expect ( validateMessage ( 'docs(compiler): something' )). toBe ( VALID );
expect ( validateMessage ( 'style(http): something' )). toBe ( VALID );
expect ( validateMessage ( 'refactor(platform-webworker): something' )). toBe ( VALID );
expect ( validateMessage ( 'test(language-service): something' )). toBe ( VALID );
expect ( validateMessage ( 'test(packaging): something' )). toBe ( VALID );
2017-10-26 11:00:13 -07:00
expect ( validateMessage ( 'release: something' )). toBe ( VALID );
expect ( validateMessage ( 'release(packaging): something' )). toBe ( VALID );
2017-01-19 16:24:47 -08:00
expect ( errors ). toEqual ([]);
});
it ( 'should fail when scope is invalid' , function () {
expect ( validateMessage ( 'fix(Compiler): something' )). toBe ( INVALID );
expect ( validateMessage ( 'feat(bah): something' )). toBe ( INVALID );
expect ( validateMessage ( 'style(webworker): something' )). toBe ( INVALID );
expect ( validateMessage ( 'refactor(security): something' )). toBe ( INVALID );
expect ( validateMessage ( 'refactor(docs): something' )). toBe ( INVALID );
[ 'INVALID COMMIT MSG: "fix(Compiler): something"\n' +
' => ERROR: "Compiler" is not an allowed scope.\n' +
2018-01-09 13:46:19 -08:00
' => SCOPES: ' + SCOPES ,
2017-01-19 16:24:47 -08:00
'INVALID COMMIT MSG: "feat(bah): something"\n' +
' => ERROR: "bah" is not an allowed scope.\n' +
2018-01-09 13:46:19 -08:00
' => SCOPES: ' + SCOPES ,
2017-01-19 16:24:47 -08:00
'INVALID COMMIT MSG: "style(webworker): something"\n' +
' => ERROR: "webworker" is not an allowed scope.\n' +
2018-01-09 13:46:19 -08:00
' => SCOPES: ' + SCOPES ,
2017-01-19 16:24:47 -08:00
'INVALID COMMIT MSG: "refactor(security): something"\n' +
' => ERROR: "security" is not an allowed scope.\n' +
2018-01-09 13:46:19 -08:00
' => SCOPES: ' + SCOPES ,
2017-01-19 16:24:47 -08:00
'INVALID COMMIT MSG: "refactor(docs): something"\n' +
' => ERROR: "docs" is not an allowed scope.\n' +
2018-01-09 13:46:19 -08:00
' => SCOPES: ' + SCOPES ,
]. forEach (( expectedErrorMessage , index ) => {
expect ( expectedErrorMessage ). toEqual ( errors [ index ]);
});
2017-10-26 11:00:13 -07:00
expect ( validateMessage ( 'release(angular): something' )). toBe ( INVALID );
2017-01-19 16:24:47 -08:00
});
it ( 'should validate 100 characters length' , function () {
var msg =
2017-10-30 15:05:35 -07:00
'fix(compiler): something super mega extra giga tera long, maybe even longer and longer and longer and longer and longer and longer... ' ;
2017-01-19 16:24:47 -08:00
expect ( validateMessage ( msg )). toBe ( INVALID );
expect ( errors ). toEqual ([
2017-10-30 15:05:35 -07:00
'INVALID COMMIT MSG: "fix(compiler): something super mega extra giga tera long, maybe even longer and longer and longer and longer and longer and longer... "\n => ERROR: The commit message is longer than 120 characters'
2017-01-19 16:24:47 -08:00
]);
});
it ( 'should validate "<type>(<scope>): <subject>" format' , function () {
var msg = 'not correct format' ;
expect ( validateMessage ( msg )). toBe ( INVALID );
expect ( errors ). toEqual ([
'INVALID COMMIT MSG: "not correct format"\n => ERROR: The commit message does not match the format of "<type>(<scope>): <subject> OR revert: type(<scope>): <subject>"'
]);
});
it ( 'should support "revert: type(scope):" syntax and reject "revert(scope):" syntax' , function () {
let correctMsg = 'revert: fix(compiler): reduce generated code payload size by 65%' ;
expect ( validateMessage ( correctMsg )). toBe ( VALID );
let incorretMsg = 'revert(compiler): reduce generated code payload size by 65%' ;
expect ( validateMessage ( incorretMsg )). toBe ( INVALID );
expect ( errors ). toEqual ([
'INVALID COMMIT MSG: "revert(compiler): reduce generated code payload size by 65%"\n => ERROR: The commit message does not match the format of "<type>(<scope>): <subject> OR revert: type(<scope>): <subject>"'
]);
});
it ( 'should validate type' , function () {
expect ( validateMessage ( 'weird($filter): something' )). toBe ( INVALID );
expect ( errors ). toEqual (
[ 'INVALID COMMIT MSG: "weird($filter): something"\n' +
' => ERROR: weird is not an allowed type.\n' +
2017-10-26 11:00:13 -07:00
' => TYPES: build, ci, docs, feat, fix, perf, refactor, release, style, test' ]);
2017-01-19 16:24:47 -08:00
});
it ( 'should allow empty scope' ,
function () { expect ( validateMessage ( 'fix: blablabla' )). toBe ( VALID ); });
// we don't want to allow WIP. it's ok to fail the PR build in this case to show that there is
// work still to be done.
it ( 'should not ignore msg prefixed with "WIP: "' ,
function () { expect ( validateMessage ( 'WIP: bullshit' )). toBe ( INVALID ); });
});
2017-09-22 19:51:03 +02:00
});