/* global LazyLoader */
'use strict';
require('/shared/js/lazy_loader.js');
require('/shared/js/html_imports.js');
suite('lazy loader', function() {
function countStyles() {
return document.querySelectorAll('link').length;
}
function addNodeToLazyLoad() {
document.body.innerHTML = [
'
',
'',
'
'
].join('');
}
suiteSetup(function() {
window.jsCount = 0;
});
suiteTeardown(function() {
delete window.jsCount;
});
var stub;
setup(function() {
stub = sinon.stub();
});
test('everything looks ok', function() {
assert.equal(window.jsCount, 0);
assert.typeOf(LazyLoader, 'object');
assert.typeOf(LazyLoader.load, 'function');
assert.typeOf(LazyLoader.getJSON, 'function');
});
test('load json', function(done) {
LazyLoader.getJSON('/apps/sharedtest/test/unit/support/test.json')
.then(function(json) {
done(function() {
assert.notStrictEqual(json, null);
assert.equal('org' in json, true);
assert.equal(json.org, 'Mozilla');
});
});
});
test('load malformed json', function(done) {
LazyLoader.getJSON('/apps/sharedtest/test/unit/support/malformedJson')
.then(function(json) {
done(new Error('A resolve promise was returned.' +
' Expected Reject promise'));
}, function(error) {
done(function() {
assert.instanceOf(error, Error);
assert.equal(error.message,
'No valid JSON object was found (200 OK)');
});
});
});
test('load inexisting json', function(done) {
LazyLoader.getJSON('/apps/sharedtest/test/unit/support/non_existant.json')
.then(function(json) {
done(new Error('Resolve promise was returned.' +
' Expected Reject promise'));
}, function(error) {
done(function() {
assert.instanceOf(error, Error);
assert.equal(error.message,
'No valid JSON object was found (404 Not Found)');
});
});
});
test('append single js script', function(done) {
LazyLoader.load('support/inc.js', stub).then(function() {
assert.equal(window.jsCount, 1);
sinon.assert.calledOnce(stub);
}).then(done, done);
});
test('append the same js script', function(done) {
LazyLoader.load('support/inc.js', stub).then(function() {
assert.equal(window.jsCount, 1);
sinon.assert.calledOnce(stub);
}).then(done, done);
});
test('append css script', function(done) {
var numStyles = countStyles();
LazyLoader.load('support/styles.css', stub).then(function() {
assert.equal(countStyles(), (numStyles + 1));
sinon.assert.calledOnce(stub);
}).then(done, done);
});
test('lazyload HTML node', function(done) {
addNodeToLazyLoad();
var parent = document.getElementById('parent');
LazyLoader.load(parent, stub).then(function() {
assert.equal(
document.getElementById('lazyload-me').toString(),
'[object HTMLDivElement]'
);
sinon.assert.calledOnce(stub);
}).then(done, done);
});
test('lazyload the same HTML node', function(done) {
var parent = document.getElementById('parent');
var child = document.getElementById('lazyload-me');
child.innerHTML = 'New Content';
LazyLoader.load(parent, stub).then(function() {
assert.equal(child.innerHTML, 'New Content');
sinon.assert.calledOnce(stub);
}).then(done, done);
});
test('append the same css script', function(done) {
var numStyles = countStyles();
LazyLoader.load('support/styles.css', stub).then(function() {
assert.equal(countStyles(), numStyles);
sinon.assert.calledOnce(stub);
}).then(done, done);
});
test('Loaded callback is invoked correctly if node already exists on the DOM',
function(done) {
Promise.all([
LazyLoader.load(['support/long_load.js'], stub),
LazyLoader.load(['support/long_load.js'], stub)
]).then(function() {
assert.equal(window.totalResult, 10000);
sinon.assert.calledTwice(stub);
}).then(done, done);
});
test('appending multiple nodes works', function(done) {
var numStyles = countStyles();
// Manually reset LazyLoader._loaded
LazyLoader._loaded = {};
// Remove nodes from DOM
var style = document.querySelector('link[href="support/styles.css"]');
style.parentNode.removeChild(style);
var script = document.querySelector('script[src="support/inc.js"]');
script.parentNode.removeChild(script);
addNodeToLazyLoad();
var parent = document.getElementById('parent');
LazyLoader.load([
'support/styles.css',
'support/inc.js',
parent
], stub).then(function() {
assert.equal(window.jsCount, 2);
assert.equal(countStyles(), numStyles);
assert.equal(
document.getElementById('lazyload-me').toString(),
'[object HTMLDivElement]'
);
sinon.assert.calledOnce(stub);
}).then(done, done);
});
test('populate web components', function(done) {
document.body.innerHTML = [
' ',
''
].join('');
var wrapper = document.getElementById('wrapper');
LazyLoader.load(wrapper, stub).then(function() {
assert.equal(wrapper.innerHTML, 'hello.');
sinon.assert.calledOnce(stub);
}).then(done, done);
});
});