featherlight
Version:
Featherlight is a very lightweight jQuery lightbox plugin. It's simple yet flexible and easy to use. Featherlight has minimal css and uses no inline styles, everything is name-spaced, it's completely customizable via configuration object and offers image,
211 lines (194 loc) • 8.39 kB
JavaScript
var expect = chai.expect;
(function($) {
var $htmlFixtures = null;
var resetFixtures = function(){
if (!$htmlFixtures) $htmlFixtures = $('#fixtures').detach();
$('body >:not(#mocha)').remove()
$('body').append($htmlFixtures.clone(true));
};
var triggerKeyCode = function(keyCode) {
$(window).trigger($.Event("keyup", { keyCode: keyCode }));
};
$.fx.off = true;
$.fn.toJSON = function() { return 'jQuery: ' + this.selector + ' (' + this.length + ')' };
describe('Featherlight Gallery', function() {
beforeEach(resetFixtures);
after(resetFixtures);
it ('works as expected', function(done) {
$('#basic-test a').featherlightGallery();
$('#basic-test a').eq(2).click();
patiently(done, [function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?2/);
$('.featherlight').trigger('next');
}, function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?3/);
$('.featherlight-next').click();
}, function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?0/);
$('.featherlight').trigger('previous');
}, function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?3/);
}]);
});
it ('can be navigated using arrow keys', function(done) {
$('#basic-test a').featherlightGallery();
$('#basic-test a').eq(2).click();
patiently(done, [function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?2/);
triggerKeyCode(39);
}, function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?3/);
triggerKeyCode(39);
}, function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?0/);
triggerKeyCode(37);
}, function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?3/);
}]);
});
it ('will keep modified background intact', function(done) {
$('#basic-test a').featherlightGallery({
afterOpen: function() {
this.$instance.find('.featherlight-content').append('<div class="something"/>');
}
});
$('#basic-test a').eq(2).click();
patiently(done, [function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?2/);
expect($('.featherlight-content *:last-child')).to.have.class('something');
$('.featherlight').trigger('next');
}, function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?3/);
expect($('.featherlight-content *:last-child')).to.have.class('something');
}]);
});
it ('can be setup without JS', function(done) {
$('#full-auto a:last').click();
patiently(done, [function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?auto_1/);
$('.featherlight').trigger('next');
}, function() {
expect($('.featherlight img')).to.have.attr('src').match(/photo_large.jpg\?auto_0/);
}]);
});
it ('is chainable', function() {
var $anchors = $('#basic-test a');
expect($anchors.featherlight()).to.equal($anchors);
});
it ('triggers afterContent after each slide', function(done) {
var lastCurrent = null;
$('#basic-test a').featherlightGallery({
afterContent: function() { lastCurrent = this.$currentTarget; }
});
$('#basic-test a').eq(2).click();
patiently(done, [function(){
expect(lastCurrent).to.not.be.null
expect(lastCurrent).to.have.attr('href').match(/photo_large.jpg\?2/);
$('.featherlight').trigger('next');
}, function() {
expect(lastCurrent).to.have.attr('href').match(/photo_large.jpg\?3/);
}]);
});
describe('$.featherlightGallery', function() {
it ('can be called directly', function(done) {
var lastCurrent = null;
var imgs = '<img src="fixtures/photo.jpeg?direct_1"/>' +
'<img src="fixtures/photo.jpeg?direct_2"/>' +
'<img src="fixtures/photo.jpeg?direct_3"/>';
$.featherlightGallery($(imgs), {
targetAttr: 'src',
afterContent: function(){ lastCurrent = this.$currentTarget }
});
patiently(done, [function(){
expect($('.featherlight img')).to.have.attr('src').match(/direct_1$/);
$('.featherlight').trigger('previous');
}, function() {
expect(lastCurrent).to.have.attr('src').match(/direct_3$/);
}]);
});
});
describe('$.featherlightGallery', function() {
it ('does not get confused with same images', function(done) {
var imgs = '<img src="fixtures/photo.jpeg"/>' +
'<img src="fixtures/photo.jpeg"/>' +
'<img src="fixtures/photo.jpeg?direct_3"/>';
$.featherlightGallery($(imgs), { targetAttr: 'src' });
$.fx.off = false
patiently(done, [function(){
expect($('.featherlight img')).to.have.attr('src').match(/photo.jpeg$/);
$('.featherlight').trigger('next');
},
function(){
expect($('.featherlight img')).to.have.css('opacity').lessThan(1);
},
function(){
expect($('.featherlight img')).to.have.css('opacity').equal('1');
$('.featherlight').trigger('next');
},
function() {
expect($('.featherlight img')).to.have.attr('src').match(/direct_3$/);
$.fx.off = true;
}]);
});
});
it ('accepts config as data-attributes', function(done) {
var $cur;
$('#extra-test').featherlightGallery();
$('#extra-test a:first').click();
patiently(done, [function(){
$cur = $.featherlightGallery.current()
expect($cur).to.be.an.instanceof($.featherlightGallery)
expect($cur).to.have.property('called', true);
$('.featherlight').trigger('next');
}, function(){
expect($('.featherlight')).to.contain('Hello');
expect($('.featherlight img')).to.not.be.visible;
}]);
});
it('can specify callbacks to track the progress of the dialog', function(done) {
var callbacks = ['beforeOpen', 'beforeContent', 'afterContent', 'afterOpen', 'beforeClose', 'afterClose'],
lastCallback = undefined,
options = {targetAttr: 'src'};
$.each(callbacks, function(i, cb){
options[cb] = function() {
expect(lastCallback).to.equal(callbacks[i-1]);
lastCallback = cb;
}
});
$.featherlightGallery($('<img src="fixtures/photo.jpeg?direct_1"/>'), options);
patiently(done, [function(){
expect(lastCallback).to.equal('afterOpen');
$.featherlight.current().close();
}, function(){
expect(lastCallback).to.equal('afterClose');
}]);
});
it ('sets last-slide and first-slide classes', function(done) {
$('#basic-test a').featherlightGallery();
$('#basic-test a').eq(3).click();
patiently(done, [function() {
expect($('.featherlight')).to.not.have.class('featherlight-first-slide');
expect($('.featherlight')).to.have.class('featherlight-last-slide');
$('.featherlight').trigger('next');
}, function() {
expect($('.featherlight')).to.have.class('featherlight-first-slide');
expect($('.featherlight')).to.not.have.class('featherlight-last-slide');
$('.featherlight-next').click();
}, function() {
expect($('.featherlight')).to.not.have.class('featherlight-first-slide');
expect($('.featherlight')).to.not.have.class('featherlight-last-slide');
$('.featherlight').trigger('previous');
}, function() {
expect($('.featherlight')).to.have.class('featherlight-first-slide');
expect($('.featherlight')).to.not.have.class('featherlight-last-slide');
}]);
});
describe('.current', function() {
it ('only returns actual featherlight gallery instances', function() {
$.featherlight('<p>This is a test<p>');
expect($.featherlight.current()).to.not.be.null;
expect($.featherlightGallery.current()).to.be.null;
});
});
});
}(jQuery));