Adjust core unit tests for unload/reload cases

This commit is contained in:
Vincent Petry 2016-03-23 10:53:40 +01:00
parent d00f95578b
commit 06e7856400
2 changed files with 43 additions and 6 deletions

View File

@ -1448,10 +1448,10 @@ function initCore() {
$('html').addClass('edge'); $('html').addClass('edge');
} }
$(window).on('unload', function() { $(window).on('unload.main', function() {
OC._unloadCalled = true; OC._unloadCalled = true;
}); });
$(window).on('beforeunload', function() { $(window).on('beforeunload.main', function() {
// super-trick thanks to http://stackoverflow.com/a/4651049 // super-trick thanks to http://stackoverflow.com/a/4651049
// in case another handler displays a confirmation dialog (ex: navigating away // in case another handler displays a confirmation dialog (ex: navigating away
// during an upload), there are two possible outcomes: user clicked "ok" or // during an upload), there are two possible outcomes: user clicked "ok" or

View File

@ -20,6 +20,15 @@
*/ */
describe('Core base tests', function() { describe('Core base tests', function() {
afterEach(function() {
// many tests call window.initCore so need to unregister global events
// ideally in the future we'll need a window.unloadCore() function
$(document).off('ajaxError.main');
$(document).off('unload.main');
$(document).off('beforeunload.main');
OC._userIsNavigatingAway = false;
OC._reloadCalled = false;
});
describe('Base values', function() { describe('Base values', function() {
it('Sets webroots', function() { it('Sets webroots', function() {
expect(OC.webroot).toBeDefined(); expect(OC.webroot).toBeDefined();
@ -925,9 +934,10 @@ describe('Core base tests', function() {
}); });
}); });
describe('global ajax errors', function() { describe('global ajax errors', function() {
var reloadStub, ajaxErrorStub; var reloadStub, ajaxErrorStub, clock;
beforeEach(function() { beforeEach(function() {
clock = sinon.useFakeTimers();
reloadStub = sinon.stub(OC, 'reload'); reloadStub = sinon.stub(OC, 'reload');
// unstub the error processing method // unstub the error processing method
ajaxErrorStub = OC._processAjaxError; ajaxErrorStub = OC._processAjaxError;
@ -936,15 +946,17 @@ describe('Core base tests', function() {
}); });
afterEach(function() { afterEach(function() {
reloadStub.restore(); reloadStub.restore();
$(document).off('ajaxError'); clock.restore();
}); });
it('reloads current page in case of auth error', function () { it('reloads current page in case of auth error', function() {
var dataProvider = [ var dataProvider = [
[200, false], [200, false],
[400, false], [400, false],
[0, true],
[401, true], [401, true],
[302, true], [302, true],
[303, true],
[307, true] [307, true]
]; ];
@ -953,9 +965,13 @@ describe('Core base tests', function() {
var expectedCall = dataProvider[i][1]; var expectedCall = dataProvider[i][1];
reloadStub.reset(); reloadStub.reset();
OC._reloadCalled = false;
$(document).trigger(new $.Event('ajaxError'), xhr); $(document).trigger(new $.Event('ajaxError'), xhr);
// trigger timers
clock.tick(1000);
if (expectedCall) { if (expectedCall) {
expect(reloadStub.calledOnce).toEqual(true); expect(reloadStub.calledOnce).toEqual(true);
} else { } else {
@ -963,6 +979,27 @@ describe('Core base tests', function() {
} }
} }
}); });
}) it('reload only called once in case of auth error', function() {
var xhr = { status: 401 };
$(document).trigger(new $.Event('ajaxError'), xhr);
$(document).trigger(new $.Event('ajaxError'), xhr);
// trigger timers
clock.tick(1000);
expect(reloadStub.calledOnce).toEqual(true);
});
it('does not reload the page if the user was navigating away', function() {
var xhr = { status: 0 };
OC._userIsNavigatingAway = true;
clock.tick(100);
$(document).trigger(new $.Event('ajaxError'), xhr);
clock.tick(1000);
expect(reloadStub.notCalled).toEqual(true);
});
});
}); });