123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- /**
- * ownCloud
- *
- * @author Vincent Petry
- * @copyright 2014 Vincent Petry <pvince81@owncloud.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- describe('OCA.Files.App tests', function() {
- var App = OCA.Files.App;
- var pushStateStub;
- var replaceStateStub;
- var parseUrlQueryStub;
- var oldLegacyFileActions;
- beforeEach(function() {
- $('#testArea').append(
- '<div id="content" class="app-files">' +
- '<div id="app-navigation">' +
- '<ul><li data-id="files"><a>Files</a></li>' +
- '<li data-id="other"><a>Other</a></li>' +
- '</div>' +
- '<div id="app-content">' +
- '<div id="app-content-files" class="hidden">' +
- '</div>' +
- '<div id="app-content-other" class="hidden">' +
- '</div>' +
- '</div>' +
- '</div>' +
- '</div>'
- );
- oldLegacyFileActions = window.FileActions;
- window.FileActions = new OCA.Files.FileActions();
- OCA.Files.legacyFileActions = window.FileActions;
- OCA.Files.fileActions = new OCA.Files.FileActions();
- pushStateStub = sinon.stub(OC.Util.History, 'pushState');
- replaceStateStub = sinon.stub(OC.Util.History, 'replaceState');
- parseUrlQueryStub = sinon.stub(OC.Util.History, 'parseUrlQuery');
- parseUrlQueryStub.returns({});
- App.initialize();
- });
- afterEach(function() {
- App.destroy();
- window.FileActions = oldLegacyFileActions;
- pushStateStub.restore();
- replaceStateStub.restore();
- parseUrlQueryStub.restore();
- });
- describe('initialization', function() {
- it('initializes the default file list with the default file actions', function() {
- expect(App.fileList).toBeDefined();
- expect(App.fileList.fileActions.actions.all).toBeDefined();
- expect(App.fileList.$el.is('#app-content-files')).toEqual(true);
- });
- it('merges the legacy file actions with the default ones', function() {
- var legacyActionStub = sinon.stub();
- var actionStub = sinon.stub();
- // legacy action
- window.FileActions.register(
- 'all',
- 'LegacyTest',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- legacyActionStub
- );
- // legacy action to be overwritten
- window.FileActions.register(
- 'all',
- 'OverwriteThis',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- legacyActionStub
- );
- // regular file actions
- OCA.Files.fileActions.register(
- 'all',
- 'RegularTest',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub
- );
- // overwrite
- OCA.Files.fileActions.register(
- 'all',
- 'OverwriteThis',
- OC.PERMISSION_READ,
- OC.imagePath('core', 'actions/test'),
- actionStub
- );
- App.initialize();
- var actions = App.fileList.fileActions.actions;
- var context = { fileActions: sinon.createStubInstance(OCA.Files.FileActions) };
- actions.all.OverwriteThis.action('testFileName', context);
- expect(actionStub.calledOnce).toBe(true);
- expect(context.fileActions._notifyUpdateListeners.callCount).toBe(2);
- expect(context.fileActions._notifyUpdateListeners.getCall(0).calledWith('beforeTriggerAction')).toBe(true);
- expect(context.fileActions._notifyUpdateListeners.getCall(1).calledWith('afterTriggerAction')).toBe(true);
- actions.all.LegacyTest.action('testFileName', context);
- expect(legacyActionStub.calledOnce).toBe(true);
- expect(context.fileActions._notifyUpdateListeners.callCount).toBe(4);
- expect(context.fileActions._notifyUpdateListeners.getCall(2).calledWith('beforeTriggerAction')).toBe(true);
- expect(context.fileActions._notifyUpdateListeners.getCall(3).calledWith('afterTriggerAction')).toBe(true);
- actions.all.RegularTest.action('testFileName', context);
- expect(actionStub.calledTwice).toBe(true);
- expect(context.fileActions._notifyUpdateListeners.callCount).toBe(6);
- expect(context.fileActions._notifyUpdateListeners.getCall(4).calledWith('beforeTriggerAction')).toBe(true);
- expect(context.fileActions._notifyUpdateListeners.getCall(5).calledWith('afterTriggerAction')).toBe(true);
- // default one still there
- expect(actions.dir.Open.action).toBeDefined();
- });
- });
- describe('URL handling', function() {
- it('pushes the state to the URL when current app changed directory', function() {
- $('#app-content-files').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
- expect(pushStateStub.calledOnce).toEqual(true);
- var params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
- expect(params.dir).toEqual('sub dir');
- expect(params.view).not.toBeDefined();
- $('li[data-id=other]>a').click();
- pushStateStub.reset();
- $('#app-content-other').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
- expect(pushStateStub.calledOnce).toEqual(true);
- params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
- expect(params.dir).toEqual('sub dir');
- expect(params.view).toEqual('other');
- });
- it('replaces the state to the URL when fileid is known', function() {
- $('#app-content-files').trigger(new $.Event('changeDirectory', {dir: 'sub dir'}));
- expect(pushStateStub.calledOnce).toEqual(true);
- var params = OC.parseQueryString(pushStateStub.getCall(0).args[0]);
- expect(params.dir).toEqual('sub dir');
- expect(params.view).not.toBeDefined();
- expect(replaceStateStub.notCalled).toEqual(true);
- parseUrlQueryStub.returns({dir: 'sub dir'});
- $('#app-content-files').trigger(new $.Event('afterChangeDirectory', {dir: 'sub dir', fileId: 123}));
- expect(pushStateStub.calledOnce).toEqual(true);
- expect(replaceStateStub.calledOnce).toEqual(true);
- params = OC.parseQueryString(replaceStateStub.getCall(0).args[0]);
- expect(params.dir).toEqual('sub dir');
- expect(params.view).not.toBeDefined();
- expect(params.fileid).toEqual('123');
- });
- describe('onpopstate', function() {
- it('sends "urlChanged" event to current app', function() {
- var handler = sinon.stub();
- $('#app-content-files').on('urlChanged', handler);
- App._onPopState({view: 'files', dir: '/somedir'});
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].view).toEqual('files');
- expect(handler.getCall(0).args[0].dir).toEqual('/somedir');
- });
- it('sends "show" event to current app and sets navigation', function() {
- var showHandlerFiles = sinon.stub();
- var showHandlerOther = sinon.stub();
- var hideHandlerFiles = sinon.stub();
- var hideHandlerOther = sinon.stub();
- $('#app-content-files').on('show', showHandlerFiles);
- $('#app-content-files').on('hide', hideHandlerFiles);
- $('#app-content-other').on('show', showHandlerOther);
- $('#app-content-other').on('hide', hideHandlerOther);
- App._onPopState({view: 'other', dir: '/somedir'});
- expect(showHandlerFiles.notCalled).toEqual(true);
- expect(hideHandlerFiles.calledOnce).toEqual(true);
- expect(showHandlerOther.calledOnce).toEqual(true);
- expect(hideHandlerOther.notCalled).toEqual(true);
- showHandlerFiles.reset();
- showHandlerOther.reset();
- hideHandlerFiles.reset();
- hideHandlerOther.reset();
- App._onPopState({view: 'files', dir: '/somedir'});
- expect(showHandlerFiles.calledOnce).toEqual(true);
- expect(hideHandlerFiles.notCalled).toEqual(true);
- expect(showHandlerOther.notCalled).toEqual(true);
- expect(hideHandlerOther.calledOnce).toEqual(true);
- expect(App.navigation.getActiveItem()).toEqual('files');
- expect($('#app-content-files').hasClass('hidden')).toEqual(false);
- expect($('#app-content-other').hasClass('hidden')).toEqual(true);
- });
- it('does not send "show" or "hide" event to current app when already visible', function() {
- var showHandler = sinon.stub();
- var hideHandler = sinon.stub();
- $('#app-content-files').on('show', showHandler);
- $('#app-content-files').on('hide', hideHandler);
- App._onPopState({view: 'files', dir: '/somedir'});
- expect(showHandler.notCalled).toEqual(true);
- expect(hideHandler.notCalled).toEqual(true);
- });
- it('state defaults to files app with root dir', function() {
- var handler = sinon.stub();
- parseUrlQueryStub.returns({});
- $('#app-content-files').on('urlChanged', handler);
- App._onPopState();
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].view).toEqual('files');
- expect(handler.getCall(0).args[0].dir).toEqual('/');
- });
- it('activates files app if invalid view is passed', function() {
- App._onPopState({view: 'invalid', dir: '/somedir'});
- expect(App.navigation.getActiveItem()).toEqual('files');
- expect($('#app-content-files').hasClass('hidden')).toEqual(false);
- });
- });
- describe('navigation', function() {
- it('switches the navigation item and panel visibility when onpopstate', function() {
- App._onPopState({view: 'other', dir: '/somedir'});
- expect(App.navigation.getActiveItem()).toEqual('other');
- expect($('#app-content-files').hasClass('hidden')).toEqual(true);
- expect($('#app-content-other').hasClass('hidden')).toEqual(false);
- expect($('li[data-id=files] > a').hasClass('active')).toEqual(false);
- expect($('li[data-id=other] > a').hasClass('active')).toEqual(true);
- App._onPopState({view: 'files', dir: '/somedir'});
- expect(App.navigation.getActiveItem()).toEqual('files');
- expect($('#app-content-files').hasClass('hidden')).toEqual(false);
- expect($('#app-content-other').hasClass('hidden')).toEqual(true);
- expect($('li[data-id=files] > a').hasClass('active')).toEqual(true);
- expect($('li[data-id=other] > a').hasClass('active')).toEqual(false);
- });
- it('clicking on navigation switches the panel visibility', function() {
- $('li[data-id=other] > a').click();
- expect(App.navigation.getActiveItem()).toEqual('other');
- expect($('#app-content-files').hasClass('hidden')).toEqual(true);
- expect($('#app-content-other').hasClass('hidden')).toEqual(false);
- expect($('li[data-id=files] > a').hasClass('active')).toEqual(false);
- expect($('li[data-id=other] > a').hasClass('active')).toEqual(true);
- $('li[data-id=files] > a').click();
- expect(App.navigation.getActiveItem()).toEqual('files');
- expect($('#app-content-files').hasClass('hidden')).toEqual(false);
- expect($('#app-content-other').hasClass('hidden')).toEqual(true);
- expect($('li[data-id=files] > a').hasClass('active')).toEqual(true);
- expect($('li[data-id=other] > a').hasClass('active')).toEqual(false);
- });
- it('clicking on navigation sends "show" and "urlChanged" event', function() {
- var handler = sinon.stub();
- var showHandler = sinon.stub();
- $('#app-content-other').on('urlChanged', handler);
- $('#app-content-other').on('show', showHandler);
- $('li[data-id=other] > a').click();
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].view).toEqual('other');
- expect(handler.getCall(0).args[0].dir).toEqual('/');
- expect(showHandler.calledOnce).toEqual(true);
- });
- it('clicking on activate navigation only sends "urlChanged" event', function() {
- var handler = sinon.stub();
- var showHandler = sinon.stub();
- $('#app-content-files').on('urlChanged', handler);
- $('#app-content-files').on('show', showHandler);
- $('li[data-id=files] > a').click();
- expect(handler.calledOnce).toEqual(true);
- expect(handler.getCall(0).args[0].view).toEqual('files');
- expect(handler.getCall(0).args[0].dir).toEqual('/');
- expect(showHandler.notCalled).toEqual(true);
- });
- });
- describe('viewer mode', function() {
- it('toggles the sidebar when viewer mode is enabled', function() {
- $('#app-content-files').trigger(
- new $.Event('changeViewerMode', {viewerModeEnabled: true}
- ));
- expect($('#app-navigation').hasClass('hidden')).toEqual(true);
- expect($('.app-files').hasClass('viewer-mode no-sidebar')).toEqual(true);
- $('#app-content-files').trigger(
- new $.Event('changeViewerMode', {viewerModeEnabled: false}
- ));
- expect($('#app-navigation').hasClass('hidden')).toEqual(false);
- expect($('.app-files').hasClass('viewer-mode no-sidebar')).toEqual(false);
- });
- });
- });
- });
|