Skip to content

Commit

Permalink
Merge pull request #18 from enb-bem/#11
Browse files Browse the repository at this point in the history
#11 Add tests for i18n-lang-js technology
  • Loading branch information
blond committed May 20, 2015
2 parents 512a6d6 + 132e6af commit faf52ad
Show file tree
Hide file tree
Showing 10 changed files with 243 additions and 19 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
node_modules
coverage
3 changes: 2 additions & 1 deletion .jscs.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
module.exports = {
excludeFiles: [
'node_modules',
'exlib'
'exlib',
'coverage'
],
requireSpaceAfterKeywords: ['if', 'else', 'for', 'while', 'do', 'switch', 'return', 'try', 'catch'],
requireSpaceBeforeBlockStatements: true,
Expand Down
1 change: 1 addition & 0 deletions .jshintignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
node_modules
exlib
coverage
2 changes: 2 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
.*
node_modules
test
coverage
14 changes: 12 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
sudo: false

language: node_js

node_js:
- "0.10"
matrix:
include:
- node_js: iojs-v1
- node_js: iojs-v2
- node_js: "0.10"
- node_js: "0.12"
env: COVERALLS=1

after_success:
- if [ "x$COVERALLS" = "x1" ]; then npm run coveralls; fi
17 changes: 12 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
{
"name": "Marat Dulin",
"email": "mdevils@yandex.ru"
},
{
"name": "Andrey Kuznetsov",
"email": "andrey.kuznetsov48@yandex.ru"
}
],
"engines": {
Expand All @@ -34,15 +38,18 @@
},
"devDependencies": {
"enb": ">= 0.11.0 < 1.0.0",
"jscs": "1.10.0",
"jshint": "2.6.0",
"mocha": "2.2.1",
"mock-fs": "2.5.0",
"istanbul": "0.3.14",
"jscs": "1.13.1",
"jshint": "2.7.0",
"mocha": "2.2.4",
"mock-fs": "2.7.0",
"must": "0.12.0"
},
"scripts": {
"test": "npm run lint && npm run unit",
"lint": "jshint . && jscs -c .jscs.js .",
"unit": "mocha test/techs/*.test.js"
"unit": "mocha -R spec",
"cover": "istanbul cover _mocha",
"coveralls": "npm i coveralls && npm run cover -- --report lcovonly && cat ./coverage/lcov.info | coveralls"
}
}
36 changes: 26 additions & 10 deletions techs/i18n-lang-js.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
* ]);
* ```
*/
var tanker = require('../exlib/tanker'),
var path = require('path'),
tanker = require('../exlib/tanker'),
asyncRequire = require('enb/lib/fs/async-require'),
dropRequireCache = require('enb/lib/fs/drop-require-cache');

module.exports = require('enb/lib/build-flow').create()
Expand All @@ -30,17 +32,31 @@ module.exports = require('enb/lib/build-flow').create()
.useSourceFilename('keysetsFile', '?.keysets.{lang}.js')
.optionAlias('keysetsFile', 'keysetsTarget')
.builder(function (keysetsFilename) {
dropRequireCache(require, keysetsFilename);
var node = this.node,
cache = node.getNodeCache(this._target),
basename = path.basename(keysetsFilename),
cacheKey = 'keysets-file-' + basename,
promise;

var keysets = require(keysetsFilename),
_this = this,
lang = this._lang,
res = [];
if (cache.needRebuildFile(cacheKey, keysetsFilename)) {
dropRequireCache(require, keysetsFilename);
promise = asyncRequire(keysetsFilename)
.then(function (keysets) {
cache.cacheFileInfo(cacheKey, keysetsFilename);
return keysets;
});
} else {
promise = asyncRequire(keysetsFilename);
}

Object.keys(keysets).sort().forEach(function (keysetName) {
res.push(_this.__self.getKeysetBuildResult(keysetName, keysets[keysetName], lang));
});
return this.getPrependJs(lang) + res.join('\n\n') + this.getAppendJs(lang);
return promise.then(function (keysets) {
var lang = this._lang,
res = Object.keys(keysets).sort().reduce(function (prev, keysetName) {
prev.push(this.__self.getKeysetBuildResult(keysetName, keysets[keysetName], lang));
return prev;
}.bind(this), []);
return this.getPrependJs(lang) + res.join('\n\n') + this.getAppendJs(lang);
}, this);
})
.methods({
getPrependJs: function (lang) {
Expand Down
3 changes: 2 additions & 1 deletion test/mocha.opts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
test/**/*.test.js
--ui bdd
--reporter spec
--reporter dot
--require must
185 changes: 185 additions & 0 deletions test/techs/i18n-lang-js.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
var mockFs = require('mock-fs'),
TestNode = require('enb/lib/test/mocks/test-node'),
Tech = require('../../techs/i18n-lang-js');

describe('i18n-lang-js', function () {
afterEach(function () {
mockFs.restore();
});

it('must get valid *.lang from *.keyset file', function () {
var keysets = [
{
'lang.js': {
scope1: {
key11: 'val11',
key12: 'val12'
},
scope2: {
key21: 'val21',
key22: 'val22'
}
}
}
],
expected = [
'if (typeof BEM !== \'undefined\' && BEM.I18N) {BEM.I18N.decl(\'scope1\', {',
' "key11": \'val11\',',
' "key12": \'val12\'',
'}, {',
'"lang": "lang"',
'});',
'',
'BEM.I18N.decl(\'scope2\', {',
' "key21": \'val21\',',
' "key22": \'val22\'',
'}, {',
'"lang": "lang"',
'});',
'',
'BEM.I18N.lang(\'lang\');',
'',
'}',
''
].join('\n');

return build(keysets, 'lang')
.then(function (res) {
res.must.eql(expected);
});
});

it('must get valid *.lang from empty *.keyset file', function () {
var keysets = [
{
'lang.js': {}
}
],
expected = [
'if (typeof BEM !== \'undefined\' && BEM.I18N) {',
'',
'BEM.I18N.lang(\'lang\');',
'',
'}',
''
].join('\n');

return build(keysets, 'lang')
.then(function (res) {
res.must.eql(expected);
});
});

it('must provide core', function () {
var keysets = [
{
'all.js': {
'': 'core'
}
}
];

return build(keysets, 'all')
.then(function (res) {
res.must.be('core');
});
});

describe('cache', function () {
it('must get keyset from cache', function () {
var time = new Date(1),
initial = { val: 'val', mtime: time },
modified = { val: 'val2', mtime: time },
expected = [
'if (typeof BEM !== \'undefined\' && BEM.I18N) {BEM.I18N.decl(\'scope\', {',
' "key": \'val\'',
'}, {',
'"lang": "lang"',
'});',
'',
'BEM.I18N.lang(\'lang\');',
'',
'}',
''
].join('\n');

return buildWithCache(initial, modified, 'lang')
.then(function (res) {
res.must.eql(expected);
});
});

it('must ignore outdated cache', function () {
var initial = { val: 'val', mtime: new Date(1) },
modified = { val: 'val2', mtime: new Date(2) },
expected = [
'if (typeof BEM !== \'undefined\' && BEM.I18N) {BEM.I18N.decl(\'scope\', {',
' "key": \'val2\'',
'}, {',
'"lang": "lang"',
'});',
'',
'BEM.I18N.lang(\'lang\');',
'',
'}',
''
].join('\n');

return buildWithCache(initial, modified, 'lang')
.then(function (res) {
res.must.eql(expected);
});
});
});
});

function build(keysets, lang) {
var fsScheme = {
bundle: {}
};

for (var i = 0; i < keysets.length; ++i) {
var keyset = keysets[i],
basename = Object.keys(keyset)[0],
data = keyset[basename];

fsScheme.bundle['bundle.keysets.' + basename] = 'module.exports = ' + JSON.stringify(data) + ';';
}

mockFs(fsScheme);

var bundle = new TestNode('bundle');

return bundle.runTechAndGetContent(Tech, { lang: lang })
.spread(function (res) {
return res.toString();
});
}

function buildWithCache(initial, modified, lang) {
function buildScheme(data) {
return {
bundle: {
'bundle.keysets.lang.js': mockFs.file({
content: 'module.exports = { scope: { key: "' + data.val + '" } };',
mtime: data.mtime
})
}
};
}

mockFs(buildScheme(initial));

var bundle = new TestNode('bundle');

return bundle.runTechAndGetContent(Tech, { lang: lang })
.then(function () {
return mockFs(buildScheme(modified));
})
.then(function () {
return bundle.runTechAndGetContent(Tech, { lang: lang });
})
.then(function (res) {
return res.toString();
});
}
File renamed without changes.

0 comments on commit faf52ad

Please sign in to comment.