aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/tests/js/appSpec.js
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2014-05-08 22:06:30 +0200
committerVincent Petry <pvince81@owncloud.com>2014-05-15 17:51:04 +0200
commit9d38e3602b2faf37d861729c52690ce51b8fee97 (patch)
tree5da63d26db4a4e8ec356dee45fc8f7804c6fe38a /apps/files/tests/js/appSpec.js
parentfb10bf4048aaf5b2a9665fc9dff217c790efe005 (diff)
downloadnextcloud-server-9d38e3602b2faf37d861729c52690ce51b8fee97.tar.gz
nextcloud-server-9d38e3602b2faf37d861729c52690ce51b8fee97.zip
Namespacing for FileList, FileActions and trashbin app
- FileList is now an instantiable class - FileActions is now in namespace - added App class for trashbin app - moved trashbin overrides into classes extending FileList - replaced many static calls with "this." or "self." to make the classes reusable/extendable - new URL parameter "view" to specify which view is shown, for example "files" or "trashbin" - added OC.Util.History utility class in core for handling history - moved URL handling/routing to OCA.Files.App - popstate will correctly update the current view and notify the view of the URL change so it can update the current dir - added JS unitt tests for the trashbin app - fixed public app to work with the new namespaces
Diffstat (limited to 'apps/files/tests/js/appSpec.js')
-rw-r--r--apps/files/tests/js/appSpec.js169
1 files changed, 169 insertions, 0 deletions
diff --git a/apps/files/tests/js/appSpec.js b/apps/files/tests/js/appSpec.js
new file mode 100644
index 00000000000..315f11f4b5b
--- /dev/null
+++ b/apps/files/tests/js/appSpec.js
@@ -0,0 +1,169 @@
+/**
+* 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 parseUrlQueryStub;
+
+ beforeEach(function() {
+ $('#testArea').append(
+ '<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>'
+ );
+
+ pushStateStub = sinon.stub(OC.Util.History, 'pushState');
+ parseUrlQueryStub = sinon.stub(OC.Util.History, 'parseUrlQuery');
+ parseUrlQueryStub.returns({});
+
+ App.initialize();
+ });
+ afterEach(function() {
+ App.navigation = null;
+ App.fileList = null;
+ App.files = null;
+ App.fileActions.clear();
+ App.fileActions = null;
+
+ pushStateStub.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);
+ });
+ });
+
+ 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: 'subdir'}));
+ expect(pushStateStub.calledOnce).toEqual(true);
+ expect(pushStateStub.getCall(0).args[0].dir).toEqual('subdir');
+ expect(pushStateStub.getCall(0).args[0].view).not.toBeDefined();
+
+ $('li[data-id=other]>a').click();
+ pushStateStub.reset();
+
+ $('#app-content-other').trigger(new $.Event('changeDirectory', {dir: 'subdir'}));
+ expect(pushStateStub.calledOnce).toEqual(true);
+ expect(pushStateStub.getCall(0).args[0].dir).toEqual('subdir');
+ expect(pushStateStub.getCall(0).args[0].view).toEqual('other');
+ });
+ 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 handlerFiles = sinon.stub();
+ var handlerOther = sinon.stub();
+ $('#app-content-files').on('show', handlerFiles);
+ $('#app-content-other').on('show', handlerOther);
+ App._onPopState({view: 'other', dir: '/somedir'});
+ expect(handlerFiles.notCalled).toEqual(true);
+ expect(handlerOther.calledOnce).toEqual(true);
+
+ handlerFiles.reset();
+ handlerOther.reset();
+
+ App._onPopState({view: 'files', dir: '/somedir'});
+ expect(handlerFiles.calledOnce).toEqual(true);
+ expect(handlerOther.notCalled).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" event to current app when already visible', function() {
+ var handler = sinon.stub();
+ $('#app-content-files').on('show', handler);
+ App._onPopState({view: 'files', dir: '/somedir'});
+ expect(handler.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('/');
+ });
+ });
+ 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]').hasClass('selected')).toEqual(false);
+ expect($('li[data-id=other]').hasClass('selected')).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]').hasClass('selected')).toEqual(true);
+ expect($('li[data-id=other]').hasClass('selected')).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]').hasClass('selected')).toEqual(false);
+ expect($('li[data-id=other]').hasClass('selected')).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]').hasClass('selected')).toEqual(true);
+ expect($('li[data-id=other]').hasClass('selected')).toEqual(false);
+ });
+ it('clicking on navigation sends "urlChanged" event', function() {
+ var handler = sinon.stub();
+ $('#app-content-other').on('urlChanged', handler);
+ $('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('/');
+ });
+ });
+ });
+});