jquery-ias-es6
Version:
A jQuery plugin that turns your server-side pagination into an infinite scrolling one using AJAX
253 lines (196 loc) • 5.99 kB
JavaScript
buster.spec.expose();
describe("IAS", function () {
before(function() {
this.timeout = 10000;
window.scrollTo(0, 0);
});
after(function() {
jQuery.ias('destroy');
});
it("should call load listeners when loading", function() {
var deferred = when.defer();
var spy0 = this.spy();
var spy1 = this.spy();
var spy2 = this.spy();
// first method to set a listener, directly after the instantiation
jQuery.ias({
container : '.listing',
item: '.post',
pagination: '.navigation',
next: '.next-posts a'
}).on('load', spy0);
// another method to set a listener later on
jQuery.ias('on', 'load', spy1);
// yet another method to set a listener
jQuery.ias().on('load', spy2);
scrollDown().then(function() {
wait(2000).then(function() {
expect(spy0).toHaveBeenCalledOnce();
expect(spy1).toHaveBeenCalledOnce();
expect(spy2).toHaveBeenCalledOnce();
deferred.resolve();
});
});
return deferred.promise;
});
it("should allow url to be changed in load event", function() {
var deferred = when.defer();
jQuery.ias({
container : '.listing',
item: '.post',
pagination: '.navigation',
next: '.next-posts a'
});
// first listener changes the url
jQuery.ias().on('load', function (loadEvent) {
// assert that it isn't already there
buster.refute.contains(loadEvent.url, "ajax=1");
loadEvent.url = loadEvent.url + "?ajax=1";
});
// second listener asserts the url is changed
jQuery.ias().on('load', function (loadEvent) {
buster.assert.contains(loadEvent.url, "ajax=1");
});
scrollDown().then(function() {
wait(2000).then(function() {
deferred.resolve();
});
});
return deferred.promise;
});
it("should call render listeners when render is complete", function() {
var deferred = when.defer();
var spy1 = this.spy();
jQuery.ias({
container : '.listing',
item: '.post',
pagination: '.navigation',
next: '.next-posts a'
})
// register listener
.on('render', spy1);
// scroll to page 1
scrollDown().then(function() {
wait(2000).then(function() {
expect(spy1).toHaveBeenCalledOnce();
// page 2
scrollDown().then(function() {
wait(2000).then(function() {
expect(spy1).toHaveBeenCalledTwice();
deferred.resolve();
});
});
});
});
return deferred.promise;
});
it("should call scroll listeners when scrolling", function() {
var deferred = when.defer();
var spy1 = this.spy();
jQuery.ias({
container : '.listing',
item: '.post',
pagination: '.navigation',
next: '.next-posts a'
})
// register listener
.on('scroll', spy1);
// scroll to page 1
scrollDown().then(function() {
wait(2000).then(function() {
expect(spy1).toHaveBeenCalled();
deferred.resolve();
});
});
return deferred.promise;
});
it("should set listener owner as this", function() {
var deferred = when.defer();
var self = jQuery.ias({
container : '.listing',
item: '.post',
pagination: '.navigation',
next: '.next-posts a'
})
// register listener
.on('load', function() {
expect(this).toBe(self);
})
;
// scroll to page 1
scrollDown().then(function() {
wait(2000).then(function() {
deferred.resolve();
});
});
return deferred.promise;
});
it("should call noneLeft listeners when on last page", function() {
var deferred = when.defer();
var spy1 = this.spy();
jQuery.ias({
container : '.listing',
item: '.post',
pagination: '.navigation',
next: '.next-posts a'
})
// register listener
.on('noneLeft', spy1);
expect(spy1).not.toHaveBeenCalled();
// scroll to page 2
scrollDown().then(function() {
wait(2000).then(function() {
expect(spy1).not.toHaveBeenCalled();
// scroll to page 3
scrollDown().then(function() {
wait(1500).then(function() {
expect(spy1).toHaveBeenCalledOnce();
deferred.resolve();
});
});
});
});
return deferred.promise;
});
it("should call noneLeft listeners when content is short without next (before init)", function() {
var deferred = when.defer();
var spy1 = this.spy();
jQuery.ias('destroy');
loadFixture("short-without-next.html", function() {
var ias = jQuery.ias({
container : '.listing',
item: '.post',
pagination: '.navigation',
next: '.next-posts a',
initialize: false
});
// register listener
ias.on('noneLeft', spy1);
expect(spy1).not.toHaveBeenCalled();
ias.initialize();
expect(spy1).toHaveBeenCalledOnce();
deferred.resolve();
});
return deferred.promise;
});
it("should call noneLeft listeners when content is short without next (after init)", function() {
var deferred = when.defer();
var spy1 = this.spy();
jQuery.ias('destroy');
loadFixture("short-without-next.html", function() {
var ias = jQuery.ias({
container : '.listing',
item: '.post',
pagination: '.navigation',
next: '.next-posts a',
initialize: false
});
ias.initialize();
// register listener
ias.on('noneLeft', spy1);
expect(spy1).toHaveBeenCalledOnce();
deferred.resolve();
});
return deferred.promise;
});
});