summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2015-02-23 15:29:25 +0100
committerVincent Petry <pvince81@owncloud.com>2015-02-23 15:29:25 +0100
commite144d3aa49a1e4a3bb487ada9d83a2b4c81e6630 (patch)
tree9bff13d230fd5b28f745cc5c23e9e6165380903b
parent3632962000311e67447f5e3c97cd33095281c7ba (diff)
downloadnextcloud-server-e144d3aa49a1e4a3bb487ada9d83a2b4c81e6630.tar.gz
nextcloud-server-e144d3aa49a1e4a3bb487ada9d83a2b4c81e6630.zip
Added unit test for app filter
-rw-r--r--core/css/apps.css3
-rw-r--r--settings/js/apps.js122
-rw-r--r--settings/tests/js/appsSpec.js101
-rw-r--r--tests/karma.config.js6
4 files changed, 175 insertions, 57 deletions
diff --git a/core/css/apps.css b/core/css/apps.css
index 08877402a4b..fa30c9bbc83 100644
--- a/core/css/apps.css
+++ b/core/css/apps.css
@@ -484,6 +484,9 @@ button.loading {
color: #555;
border-top: 1px solid #ddd;
}
+.section.hidden {
+ display: none !important;
+}
/* no top border for first settings item */
#app-content > .section:first-child {
border-top: none;
diff --git a/settings/js/apps.js b/settings/js/apps.js
index 6e78ce2a6e8..c15d6a0f74d 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -334,7 +334,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
filter: function(query) {
query = query.toLowerCase();
- $('#apps-list').find('.section').hide();
+ $('#apps-list').find('.section').addClass('hidden');
var apps = _.filter(OC.Settings.Apps.State.apps, function (app) {
return app.name.toLowerCase().indexOf(query) !== -1;
@@ -347,77 +347,87 @@ OC.Settings.Apps = OC.Settings.Apps || {
apps = _.uniq(apps, function(app){return app.id;});
_.each(apps, function (app) {
- $('#app-' + app.id).show();
+ $('#app-' + app.id).removeClass('hidden');
});
$('#searchresults').hide();
- }
-};
+ },
-OC.Settings.Apps.Search = {
- attach: function (search) {
- search.setFilter('settings', OC.Settings.Apps.filter);
- }
-};
+ /**
+ * Initializes the apps list
+ */
+ initialize: function($el) {
+ OC.Plugins.register('OCA.Search', OC.Settings.Apps.Search);
+ OC.Settings.Apps.loadCategories();
-$(document).ready(function () {
- OC.Plugins.register('OCA.Search', OC.Settings.Apps.Search);
- OC.Settings.Apps.loadCategories();
+ $(document).on('click', 'ul#apps-categories li', function () {
+ var categoryId = $(this).data('categoryId');
+ OC.Settings.Apps.loadCategory(categoryId);
+ });
- $(document).on('click', 'ul#apps-categories li', function () {
- var categoryId = $(this).data('categoryId');
- OC.Settings.Apps.loadCategory(categoryId);
- });
+ $(document).on('click', '#apps-list input.enable', function () {
+ var appId = $(this).data('appid');
+ var element = $(this);
+ var active = $(this).data('active');
- $(document).on('click', '#apps-list input.enable', function () {
- var appId = $(this).data('appid');
- var element = $(this);
- var active = $(this).data('active');
+ OC.Settings.Apps.enableApp(appId, active, element);
+ });
- OC.Settings.Apps.enableApp(appId, active, element);
- });
+ $(document).on('click', '#apps-list input.uninstall', function () {
+ var appId = $(this).data('appid');
+ var element = $(this);
- $(document).on('click', '#apps-list input.uninstall', function () {
- var appId = $(this).data('appid');
- var element = $(this);
+ OC.Settings.Apps.uninstallApp(appId, element);
+ });
- OC.Settings.Apps.uninstallApp(appId, element);
- });
+ $(document).on('click', '#apps-list input.update', function () {
+ var appId = $(this).data('appid');
+ var element = $(this);
- $(document).on('click', '#apps-list input.update', function () {
- var appId = $(this).data('appid');
- var element = $(this);
+ OC.Settings.Apps.updateApp(appId, element);
+ });
- OC.Settings.Apps.updateApp(appId, element);
- });
+ $(document).on('change', '#group_select', function() {
+ var element = $(this).parent().find('input.enable');
+ var groups = $(this).val();
+ if (groups && groups !== '') {
+ groups = groups.split(',');
+ } else {
+ groups = [];
+ }
- $(document).on('change', '#group_select', function() {
- var element = $(this).parent().find('input.enable');
- var groups = $(this).val();
- if (groups && groups !== '') {
- groups = groups.split(',');
- } else {
- groups = [];
- }
+ var appId = element.data('appid');
+ if (appId) {
+ OC.Settings.Apps.enableApp(appId, false, element, groups);
+ OC.Settings.Apps.State.apps[appId].groups = groups;
+ }
+ });
- var appId = element.data('appid');
- if (appId) {
- OC.Settings.Apps.enableApp(appId, false, element, groups);
- OC.Settings.Apps.State.apps[appId].groups = groups;
- }
- });
+ $(document).on('change', ".groups-enable", function() {
+ var $select = $(this).parent().find('#group_select');
+ $select.val('');
- $(document).on('change', ".groups-enable", function() {
- var $select = $(this).parent().find('#group_select');
- $select.val('');
+ if (this.checked) {
+ OC.Settings.Apps.setupGroupsSelect($select);
+ } else {
+ $select.select2('destroy');
+ }
- if (this.checked) {
- OC.Settings.Apps.setupGroupsSelect($select);
- } else {
- $select.select2('destroy');
- }
+ $select.change();
+ });
- $select.change();
- });
+ }
+};
+OC.Settings.Apps.Search = {
+ attach: function (search) {
+ search.setFilter('settings', OC.Settings.Apps.filter);
+ }
+};
+
+$(document).ready(function () {
+ // HACK: FIXME: use plugin approach
+ if (!window.TESTING) {
+ OC.Settings.Apps.initialize($('#apps-list'));
+ }
});
diff --git a/settings/tests/js/appsSpec.js b/settings/tests/js/appsSpec.js
new file mode 100644
index 00000000000..39329c19246
--- /dev/null
+++ b/settings/tests/js/appsSpec.js
@@ -0,0 +1,101 @@
+/**
+* ownCloud
+*
+* @author Vincent Petry
+* @copyright 2015 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('OC.Settings.Apps tests', function() {
+ var Apps;
+
+ beforeEach(function() {
+ var $el = $('<div id="apps-list"></div>' +
+ '<div id="app-template">' +
+ // dummy template for testing
+ '<div id="app-{{id}}" data-id="{{id}}" class="section">{{name}}</div>' +
+ '</div>'
+ );
+ $('#testArea').append($el);
+
+ Apps = OC.Settings.Apps;
+ });
+ afterEach(function() {
+ Apps.State.apps = null;
+ Apps.State.currentCategory = null;
+ });
+
+ describe('Filtering apps', function() {
+ var oldApps;
+
+ function loadApps(appList) {
+ Apps.State.apps = appList;
+
+ _.each(appList, function(appSpec) {
+ Apps.renderApp(appSpec);
+ });
+ }
+
+ function getResultsFromDom() {
+ var results = [];
+ $('#apps-list .section:not(.hidden)').each(function() {
+ results.push($(this).attr('data-id'));
+ });
+ return results;
+ }
+
+ beforeEach(function() {
+ loadApps([
+ {id: 'appone', name: 'App One', description: 'The first app'},
+ {id: 'apptwo', name: 'App Two', description: 'The second app'},
+ {id: 'appthree', name: 'App Three', description: 'Third app'},
+ {id: 'somestuff', name: 'Some Stuff', description: 'whatever'}
+ ]);
+ });
+
+ it('does not filter when no query passed', function() {
+ Apps.filter('');
+ expect(getResultsFromDom().length).toEqual(4);
+ });
+ it('returns no results when query does not match anything', function() {
+ Apps.filter('absurdity');
+ expect(getResultsFromDom().length).toEqual(0);
+ });
+ it('returns relevant results when query matches name', function() {
+ var results;
+ Apps.filter('app');
+ results = getResultsFromDom();
+ expect(results.length).toEqual(3);
+ expect(results[0]).toEqual('appone');
+ expect(results[1]).toEqual('apptwo');
+ expect(results[2]).toEqual('appthree');
+ });
+ it('returns relevant result when query matches name', function() {
+ var results;
+ Apps.filter('TWO');
+ results = getResultsFromDom();
+ expect(results.length).toEqual(1);
+ expect(results[0]).toEqual('apptwo');
+ });
+ it('returns relevant result when query matches description', function() {
+ var results;
+ Apps.filter('ever');
+ results = getResultsFromDom();
+ expect(results.length).toEqual(1);
+ expect(results[0]).toEqual('somestuff');
+ });
+ });
+});
diff --git a/tests/karma.config.js b/tests/karma.config.js
index e4f8b3ea68f..e5febb15aaa 100644
--- a/tests/karma.config.js
+++ b/tests/karma.config.js
@@ -71,9 +71,13 @@ module.exports = function(config) {
{
name: 'settings',
srcFiles: [
+ 'settings/js/apps.js',
'settings/js/users/deleteHandler.js'
],
- testFiles: ['settings/tests/js/users/deleteHandlerSpec.js']
+ testFiles: [
+ 'settings/tests/js/appsSpec.js',
+ 'settings/tests/js/users/deleteHandlerSpec.js'
+ ]
}
];
}