summaryrefslogtreecommitdiffstats
path: root/js
diff options
context:
space:
mode:
authorBernhard Posselt <nukeawhale@gmail.com>2013-04-18 17:47:03 +0200
committerBernhard Posselt <nukeawhale@gmail.com>2013-04-18 17:47:03 +0200
commit402c534ee6453e28e5902f3d4f3a21b534309d24 (patch)
tree483a79a7cc528cb88200db40ff12c526bb542b4c /js
parent97452a5f5e98e33981eeac1eb89402fc13b13cb2 (diff)
remove clientside hashing, fix #72
Diffstat (limited to 'js')
-rw-r--r--js/Gruntfile.coffee4
-rw-r--r--js/app/services/businesslayer/feedbusinesslayer.coffee10
-rw-r--r--js/app/services/models/feedmodel.coffee38
-rw-r--r--js/config/testacular_conf.js1
-rw-r--r--js/public/app.js56
-rw-r--r--js/test-results.xml186
-rw-r--r--js/tests/services/businesslayer/feedbusinesslayerSpec.coffee68
-rw-r--r--js/tests/services/businesslayer/folderbusinesslayerSpec.coffee30
-rw-r--r--js/tests/services/businesslayer/itembusinesslayerSpec.coffee2
-rw-r--r--js/tests/services/businesslayer/subsriptionsbusinesslayerSpec.coffee8
-rw-r--r--js/tests/services/models/feedmodelSpec.coffee44
-rw-r--r--js/tests/services/models/itemmodelSpec.coffee2
-rw-r--r--js/vendor/md5js/md5.js379
13 files changed, 314 insertions, 514 deletions
diff --git a/js/Gruntfile.coffee b/js/Gruntfile.coffee
index c12a5f322..02bb03d7d 100644
--- a/js/Gruntfile.coffee
+++ b/js/Gruntfile.coffee
@@ -66,8 +66,8 @@ module.exports = (grunt) ->
src: '<%= meta.production %>app.js'
dest: ''
wrapper: [
- '(function(angular, $, hex_md5, moment, undefined){\n\n'
- '\n})(window.angular, window.jQuery, window.hex_md5, window.moment);'
+ '(function(angular, $, moment, undefined){\n\n'
+ '\n})(window.angular, window.jQuery, window.moment);'
]
coffeelint:
diff --git a/js/app/services/businesslayer/feedbusinesslayer.coffee b/js/app/services/businesslayer/feedbusinesslayer.coffee
index a5176452e..f02252618 100644
--- a/js/app/services/businesslayer/feedbusinesslayer.coffee
+++ b/js/app/services/businesslayer/feedbusinesslayer.coffee
@@ -92,7 +92,7 @@ FeedModel, NewLoading, _ExistsError, Utils) ->
@_feedModel.update({
id: feedId,
folderId: folderId,
- urlHash: feed.urlHash})
+ url: feed.url})
@_persistence.moveFeed(feedId, folderId)
@@ -139,15 +139,13 @@ FeedModel, NewLoading, _ExistsError, Utils) ->
throw new Error('Url must not be empty')
url = url.trim()
- urlHash = hex_md5(url)
- if @_feedModel.getByUrlHash(urlHash)
+ if @_feedModel.getByUrl(url)
throw new _ExistsError('Exists already')
feed =
title: url
url: url
- urlHash: urlHash
folderId: parentId
unreadCount: 0
faviconLink: 'url('+@_utils.imagePath('core', 'loading.gif')+')'
@@ -164,8 +162,8 @@ FeedModel, NewLoading, _ExistsError, Utils) ->
@_persistence.createFeed(url, parentId, success)
- markErrorRead: (urlHash) ->
- @_feedModel.removeByUrlHash(urlHash)
+ markErrorRead: (url) ->
+ @_feedModel.removeByUrl(url)
updateFeeds: ->
diff --git a/js/app/services/models/feedmodel.coffee b/js/app/services/models/feedmodel.coffee
index feaeffee0..4c925b94c 100644
--- a/js/app/services/models/feedmodel.coffee
+++ b/js/app/services/models/feedmodel.coffee
@@ -27,12 +27,12 @@ angular.module('News').factory 'FeedModel',
class FeedModel extends _Model
constructor: (@_utils) ->
- @_urlHash = {}
+ @_url = {}
super()
clear: ->
- @_urlHash = {}
+ @_url = {}
super()
@@ -48,7 +48,7 @@ angular.module('News').factory 'FeedModel',
an id, we have to update the existing item without id
###
- item = @_urlHash[data.urlHash]
+ item = @_url[data.url]
# update in the following cases:
# * the id is defined and the item exists
@@ -56,15 +56,15 @@ angular.module('News').factory 'FeedModel',
updateById = angular.isDefined(data.id) and
angular.isDefined(@getById(data.id))
- updateByUrlHash = angular.isDefined(item) and
+ updateByUrl = angular.isDefined(item) and
angular.isUndefined(item.id)
- if updateById or updateByUrlHash
+ if updateById or updateByUrl
@update(data, clearCache)
else
- if angular.isDefined(data.urlHash)
+ if angular.isDefined(data.url)
# if the item is not yet in the name cache it must be added
- @_urlHash[data.urlHash] = data
+ @_url[data.url] = data
# in case there is an id it can go through the normal add method
if angular.isDefined(data.id)
@@ -80,8 +80,8 @@ angular.module('News').factory 'FeedModel',
update: (data, clearCache=true) ->
# only when the id on the updated item does not exist we wish
# to update by name, otherwise we always update by id
- if angular.isDefined(data.urlHash)
- item = @_urlHash[data.urlHash]
+ if angular.isDefined(data.url)
+ item = @_url[data.url]
# update by name
if angular.isUndefined(data.id) and angular.isDefined(item)
@@ -100,21 +100,21 @@ angular.module('News').factory 'FeedModel',
# we need to fix the name cache if the name was changed
itemWithId = @getById(data.id)
if angular.isDefined(itemWithId) and
- itemWithId.urlHash != data.urlHash
- delete @_urlHash[itemWithId.urlHash]
- @_urlHash[data.urlHash] = itemWithId
+ itemWithId.url != data.url
+ delete @_url[itemWithId.url]
+ @_url[data.url] = itemWithId
super(data, clearCache)
removeById: (id) ->
item = @getById(id)
- delete @_urlHash[item.urlHash]
+ delete @_url[item.url]
super(id)
- getByUrlHash: (urlHash) ->
- return @_urlHash[urlHash]
+ getByUrl: (url) ->
+ return @_url[url]
getUnreadCount: ->
@@ -148,21 +148,21 @@ angular.module('News').factory 'FeedModel',
return @get(query)
- removeByUrlHash: (urlHash, clearCache=true) ->
+ removeByUrl: (url, clearCache=true) ->
###
Remove an entry by id
###
# remove from data map
for key, value of @_dataMap
- if @_dataMap[key].urlHash == urlHash
+ if @_dataMap[key].url == url
delete @_dataMap[key]
break
for entry, counter in @_data
- if entry.urlHash == urlHash
+ if entry.url == url
@_data.splice(counter, 1)
- delete @_urlHash[urlHash]
+ delete @_url[url]
if clearCache
@_invalidateCache()
diff --git a/js/config/testacular_conf.js b/js/config/testacular_conf.js
index 17c654805..d5cb87ba0 100644
--- a/js/config/testacular_conf.js
+++ b/js/config/testacular_conf.js
@@ -36,7 +36,6 @@ files = [
'vendor/angular/angular.js',
'vendor/angular/angular-mocks.js',
'vendor/angular-ui/angular-ui.js',
- 'vendor/md5js/md5.js',
'vendor/momentjs/moment.js',
'../../appframework/js/tests/stubs/owncloud.js',
'../../appframework/js/public/app.js',
diff --git a/js/public/app.js b/js/public/app.js
index 7e4393d94..855bcd895 100644
--- a/js/public/app.js
+++ b/js/public/app.js
@@ -1,4 +1,4 @@
-(function(angular, $, hex_md5, moment, undefined){
+(function(angular, $, moment, undefined){
/**
* ownCloud News App - v0.0.1
@@ -794,7 +794,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
this._feedModel.update({
id: feedId,
folderId: folderId,
- urlHash: feed.urlHash
+ url: feed.url
});
return this._persistence.moveFeed(feedId, folderId);
}
@@ -837,7 +837,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
};
FeedBusinessLayer.prototype.create = function(url, parentId, onSuccess, onFailure) {
- var feed, success, urlHash,
+ var feed, success,
_this = this;
if (parentId == null) {
@@ -856,14 +856,12 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
throw new Error('Url must not be empty');
}
url = url.trim();
- urlHash = hex_md5(url);
- if (this._feedModel.getByUrlHash(urlHash)) {
+ if (this._feedModel.getByUrl(url)) {
throw new _ExistsError('Exists already');
}
feed = {
title: url,
url: url,
- urlHash: urlHash,
folderId: parentId,
unreadCount: 0,
faviconLink: 'url(' + this._utils.imagePath('core', 'loading.gif') + ')'
@@ -880,8 +878,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
return this._persistence.createFeed(url, parentId, success);
};
- FeedBusinessLayer.prototype.markErrorRead = function(urlHash) {
- return this._feedModel.removeByUrlHash(urlHash);
+ FeedBusinessLayer.prototype.markErrorRead = function(url) {
+ return this._feedModel.removeByUrl(url);
};
FeedBusinessLayer.prototype.updateFeeds = function() {
@@ -1598,17 +1596,17 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
function FeedModel(_utils) {
this._utils = _utils;
- this._urlHash = {};
+ this._url = {};
FeedModel.__super__.constructor.call(this);
}
FeedModel.prototype.clear = function() {
- this._urlHash = {};
+ this._url = {};
return FeedModel.__super__.clear.call(this);
};
FeedModel.prototype.add = function(data, clearCache) {
- var item, updateById, updateByUrlHash;
+ var item, updateById, updateByUrl;
if (clearCache == null) {
clearCache = true;
@@ -1624,14 +1622,14 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
an id, we have to update the existing item without id
*/
- item = this._urlHash[data.urlHash];
+ item = this._url[data.url];
updateById = angular.isDefined(data.id) && angular.isDefined(this.getById(data.id));
- updateByUrlHash = angular.isDefined(item) && angular.isUndefined(item.id);
- if (updateById || updateByUrlHash) {
+ updateByUrl = angular.isDefined(item) && angular.isUndefined(item.id);
+ if (updateById || updateByUrl) {
return this.update(data, clearCache);
} else {
- if (angular.isDefined(data.urlHash)) {
- this._urlHash[data.urlHash] = data;
+ if (angular.isDefined(data.url)) {
+ this._url[data.url] = data;
if (angular.isDefined(data.id)) {
return FeedModel.__super__.add.call(this, data, clearCache);
} else {
@@ -1650,8 +1648,8 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
if (clearCache == null) {
clearCache = true;
}
- if (angular.isDefined(data.urlHash)) {
- item = this._urlHash[data.urlHash];
+ if (angular.isDefined(data.url)) {
+ item = this._url[data.url];
}
if (angular.isUndefined(data.id) && angular.isDefined(item)) {
return angular.extend(item, data);
@@ -1661,9 +1659,9 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
this._dataMap[data.id] = item;
}
itemWithId = this.getById(data.id);
- if (angular.isDefined(itemWithId) && itemWithId.urlHash !== data.urlHash) {
- delete this._urlHash[itemWithId.urlHash];
- this._urlHash[data.urlHash] = itemWithId;
+ if (angular.isDefined(itemWithId) && itemWithId.url !== data.url) {
+ delete this._url[itemWithId.url];
+ this._url[data.url] = itemWithId;
}
return FeedModel.__super__.update.call(this, data, clearCache);
}
@@ -1673,12 +1671,12 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
var item;
item = this.getById(id);
- delete this._urlHash[item.urlHash];
+ delete this._url[item.url];
return FeedModel.__super__.removeById.call(this, id);
};
- FeedModel.prototype.getByUrlHash = function(urlHash) {
- return this._urlHash[urlHash];
+ FeedModel.prototype.getByUrl = function(url) {
+ return this._url[url];
};
FeedModel.prototype.getUnreadCount = function() {
@@ -1725,7 +1723,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
return this.get(query);
};
- FeedModel.prototype.removeByUrlHash = function(urlHash, clearCache) {
+ FeedModel.prototype.removeByUrl = function(url, clearCache) {
var counter, entry, key, value, _i, _len, _ref, _ref1, _results;
if (clearCache == null) {
@@ -1738,7 +1736,7 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
_ref = this._dataMap;
for (key in _ref) {
value = _ref[key];
- if (this._dataMap[key].urlHash === urlHash) {
+ if (this._dataMap[key].url === url) {
delete this._dataMap[key];
break;
}
@@ -1747,9 +1745,9 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
_results = [];
for (counter = _i = 0, _len = _ref1.length; _i < _len; counter = ++_i) {
entry = _ref1[counter];
- if (entry.urlHash === urlHash) {
+ if (entry.url === url) {
this._data.splice(counter, 1);
- delete this._urlHash[urlHash];
+ delete this._url[url];
if (clearCache) {
this._invalidateCache();
}
@@ -2977,4 +2975,4 @@ License along with this library. If not, see <http://www.gnu.org/licenses/>.
}).call(this);
-})(window.angular, window.jQuery, window.hex_md5, window.moment); \ No newline at end of file
+})(window.angular, window.jQuery, window.moment); \ No newline at end of file
diff --git a/js/test-results.xml b/js/test-results.xml
new file mode 100644
index 000000000..c6fcaac7d
--- /dev/null
+++ b/js/test-results.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0"?>
+<testsuites>
+ <testsuite name="PhantomJS 1.9 (Linux)" package="undefined" timestamp="2013-04-18T14:48:48" id="0" hostname="archtop" tests="175" errors="0" failures="0" time="0.409">
+ <properties>
+ <property name="browser.fullName" value="Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.0 Safari/534.34"/>
+ </properties>
+ <testcase name="isAddingFolder should return false in the beginning" time="0.023" classname="PhantomJS 1.9 (Linux).FeedController"/>
+ <testcase name="isAddingFeed should return false in the beginning" time="0.003" classname="PhantomJS 1.9 (Linux).FeedController"/>
+ <testcase name="should make unreadCountFormatter available" time="0.002" classname="PhantomJS 1.9 (Linux).FeedController"/>
+ <testcase name="should make FeedBusinessLayer available" time="0.002" classname="PhantomJS 1.9 (Linux).FeedController"/>
+ <testcase name="should make FolderBusinessLayer available" time="0.008" classname="PhantomJS 1.9 (Linux).FeedController"/>
+ <testcase name="should make SubscriptionsBusinessLayer available" time="0.002" classname="PhantomJS 1.9 (Linux).FeedController"/>
+ <testcase name="should make StarredBusinessLayer available" time="0.002" classname="PhantomJS 1.9 (Linux).FeedController"/>
+ <testcase name="should not add folders that have no name" time="0.003" classname="PhantomJS 1.9 (Linux).FeedController"/>
+ <testcase name="should make ItemBusinessLayer availabe" time="0.002" classname="PhantomJS 1.9 (Linux).ItemController"/>
+ <testcase name="should make FeedBusinessLayer availabe" time="0.002" classname="PhantomJS 1.9 (Linux).ItemController"/>
+ <testcase name="should make FeedBl available" time="0.002" classname="PhantomJS 1.9 (Linux).SettingsController"/>
+ <testcase name="should show an error if the xml import failed" time="0.003" classname="PhantomJS 1.9 (Linux).SettingsController"/>
+ <testcase name="should set showall to true if importing" time="0.002" classname="PhantomJS 1.9 (Linux).SettingsController"/>
+ <testcase name="should be Subscriptions by default" time="0.001" classname="PhantomJS 1.9 (Linux).ActiveFeed"/>
+ <testcase name="should set the correct feed id" time="0.001" classname="PhantomJS 1.9 (Linux).ActiveFeed"/>
+ <testcase name="should set the correct feed type" time="0.001" classname="PhantomJS 1.9 (Linux).ActiveFeed"/>
+ <testcase name="should reset the item cache when a different feed is being loaded" time="0.002" classname="PhantomJS 1.9 (Linux).BusinessLayer"/>
+ <testcase name="should send a get all items query when feed changed" time="0.003" classname="PhantomJS 1.9 (Linux).BusinessLayer"/>
+ <testcase name="should be active when its selected" time="0.001" classname="PhantomJS 1.9 (Linux).BusinessLayer"/>
+ <testcase name="should delete feeds" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should return the number of unread feeds" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should return all feeds of a folder" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should get the correct unread count for folders" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should mark feed as read" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should mark feed as read and set 0 if as highest id if its not active" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should mark all as read" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should get the correct unread count for subscribtions" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should return the correct number of feeds" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should be visible if its active" time="0.008" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should be visible if show all is true" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should be visible if unreadcount bigger than 0" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should not move the feed to a new folder" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should not move the feed to the same folder" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should set the show all setting" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should set the hide read setting" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should return all feeds" time="0.001" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should return if ShowAll is set" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should return all feeds of a folder" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should return the correct feed link" time="0.001" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should not create a feed if it already exists" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should not create feeds that are empty" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should create a feed before theres a response from the server" time="0.001" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should set a title and an url hash to the newly crated feed" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should make a create feed request" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should call the onSuccess function on response status ok" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should call the handle a response error when creating a folder" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should mark a feed error as read by removing it" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should update all feeds" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should not update feeds without ids" time="0.002" classname="PhantomJS 1.9 (Linux).FeedBusinessLayer"/>
+ <testcase name="should delete folders" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should return true when folder has feeds" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should toggle folder" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should mark folder as read" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should get the correct unread count" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should be visible if show all is true" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should be visible if its active" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should be visible if one of its subfeeds is active" time="0.009" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should be visible if showAll is false and it has unread items" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should return all folders" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should not create a folder if it already exists" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should not create folders that are empty" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should create a folder before theres a response from the server" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should make a create folder request" time="0.001" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should call the onSuccess function on response status ok" time="0.001" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should call the handle a response error when creating a folder" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should mark a folder error as read by removing it" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should return the corret folder for id" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should open a folder" time="0.002" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should not import on empty opml" time="0.006" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should import a folder" time="0.004" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should import a feed" time="0.003" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should import nested folders" time="0.004" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should use an existing folder when importing a folder" time="0.003" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should not import a feed if it already exists" time="0.004" classname="PhantomJS 1.9 (Linux).FolderBusinessLayer"/>
+ <testcase name="should return all items" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should tell if no feed is active" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should return the correct feed title" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should set an item unstarred" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should set an item starred" time="0.001" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should set an item read" time="0.001" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should not set an item read if its kept unread" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should no set an item read if its already read" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should return false when item kept unread does not exist" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should return false if an item is not kept unread" time="0.001" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should toggle an item as kept unread" time="0.011" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should set an item as unread" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should not set an item as unread if its unread" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should set item as unread if kept unread is toggled and it is read" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should lower the unread count of a feed when its items get read" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should increase the unread count of a feed when its items get unread" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should load the next items" time="0.002" classname="PhantomJS 1.9 (Linux).ItemBusinessLayer"/>
+ <testcase name="should not be visible if starredCount is 0" time="0.002" classname="PhantomJS 1.9 (Linux).StarredBusinessLayer"/>
+ <testcase name="should always be visible if its the active feed" time="0.002" classname="PhantomJS 1.9 (Linux).StarredBusinessLayer"/>
+ <testcase name="should get the correct unread count" time="0.002" classname="PhantomJS 1.9 (Linux).StarredBusinessLayer"/>
+ <testcase name="should increase the starred count" time="0.001" classname="PhantomJS 1.9 (Linux).StarredBusinessLayer"/>
+ <testcase name="should decrease the starred count" time="0.001" classname="PhantomJS 1.9 (Linux).StarredBusinessLayer"/>
+ <testcase name="should be visible shows all items is set to true and there are feeds" time="0.003" classname="PhantomJS 1.9 (Linux).SubscriptionsBusinessLayer"/>
+ <testcase name="should not be visible if there are no feeds" time="0.002" classname="PhantomJS 1.9 (Linux).SubscriptionsBusinessLayer"/>
+ <testcase name="should not be visible if showall is false + there are no unread" time="0.002" classname="PhantomJS 1.9 (Linux).SubscriptionsBusinessLayer"/>
+ <testcase name="should always be visible if its the active feed" time="0.002" classname="PhantomJS 1.9 (Linux).SubscriptionsBusinessLayer"/>
+ <testcase name="should mark all feeds as read" time="0.002" classname="PhantomJS 1.9 (Linux).SubscriptionsBusinessLayer"/>
+ <testcase name="should get the correct unread count" time="0.005" classname="PhantomJS 1.9 (Linux).SubscriptionsBusinessLayer"/>
+ <testcase name="should have the correct folder number" time="0.002" classname="PhantomJS 1.9 (Linux).FeedType"/>
+ <testcase name="should have the correct folder number" time="0.002" classname="PhantomJS 1.9 (Linux).FeedType"/>
+ <testcase name="should have the correct folder number" time="0.001" classname="PhantomJS 1.9 (Linux).FeedType"/>
+ <testcase name="should have the correct folder number" time="0.002" classname="PhantomJS 1.9 (Linux).FeedType"/>
+ <testcase name="should have the correct folder number" time="0.001" classname="PhantomJS 1.9 (Linux).FeedType"/>
+ <testcase name="should be en by default" time="0.002" classname="PhantomJS 1.9 (Linux).Language"/>
+ <testcase name="should set the correct language" time="0.007" classname="PhantomJS 1.9 (Linux).Language"/>
+ <testcase name="should only set the first part of the language if not available" time="0.003" classname="PhantomJS 1.9 (Linux).Language"/>
+ <testcase name="should default to en" time="0.001" classname="PhantomJS 1.9 (Linux).Language"/>
+ <testcase name="should support languages" time="0.002" classname="PhantomJS 1.9 (Linux).Language"/>
+ <testcase name="should extend _Model" time="0.002" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should bind an imagepath to the item if the url is empty" time="0.001" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should add feeds without id" time="0.002" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should clear the url cache" time="0.001" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should delete items from the fodername cache" time="0.002" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should update the id if an update comes in with an id" time="0.002" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should update normally" time="0.001" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should clear invalidate the query cache on adding folder with name" time="0.002" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should only update feeds that contain only an id but no url" time="0.001" classname="PhantomJS 1.9 (Linux).FeedModel"/>
+ <testcase name="should extend model" time="0.001" classname="PhantomJS 1.9 (Linux).FolderModel"/>
+ <testcase name="should add folders without id but name if they dont exist yet" time="0.002" classname="PhantomJS 1.9 (Linux).FolderModel"/>
+ <testcase name="should clear the fodername cache" time="0.001" classname="PhantomJS 1.9 (Linux).FolderModel"/>
+ <testcase name="should delete items from the fodername cache" time="0.002" classname="PhantomJS 1.9 (Linux).FolderModel"/>
+ <testcase name="should update by foldername" time="0.001" classname="PhantomJS 1.9 (Linux).FolderModel"/>
+ <testcase name="should update the id if an update comes in with an id" time="0.012" classname="PhantomJS 1.9 (Linux).FolderModel"/>
+ <testcase name="should update normally" time="0.002" classname="PhantomJS 1.9 (Linux).FolderModel"/>
+ <testcase name="should clear invalidate the query cache on adding folder with name" time="0.001" classname="PhantomJS 1.9 (Linux).FolderModel"/>
+ <testcase name="should extend model" time="0.002" classname="PhantomJS 1.9 (Linux).ItemModel"/>
+ <testcase name="should also update items with the same feed id and guidhash" time="0.002" classname="PhantomJS 1.9 (Linux).ItemModel"/>
+ <testcase name="should also remove the feed from the url cache when its removed" time="0.002" classname="PhantomJS 1.9 (Linux).ItemModel"/>
+ <testcase name="should bind the correct isRead() method to the item" time="0.001" classname="PhantomJS 1.9 (Linux).ItemModel"/>
+ <testcase name="should bind the correct set unread method to the item" time="0.001" classname="PhantomJS 1.9 (Linux).ItemModel"/>
+ <testcase name="should bind the correct set starred method to the item" time="0.002" classname="PhantomJS 1.9 (Linux).ItemModel"/>
+ <testcase name="should bind the correct set unstarred method to the item" time="0.001" classname="PhantomJS 1.9 (Linux).ItemModel"/>
+ <testcase name="should return the lowest id" time="0.002" classname="PhantomJS 1.9 (Linux).ItemModel"/>
+ <testcase name="should return only the root folder when parsing empty OPML" time="0.004" classname="PhantomJS 1.9 (Linux).OPMLParser"/>
+ <testcase name="should parse folders" time="0.003" classname="PhantomJS 1.9 (Linux).OPMLParser"/>
+ <testcase name="should parse feeds" time="0.003" classname="PhantomJS 1.9 (Linux).OPMLParser"/>
+ <testcase name="should nest feeds" time="0.004" classname="PhantomJS 1.9 (Linux).OPMLParser"/>
+ <testcase name="should send a autopaging request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should send a load newest items request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct get starred items request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct star item request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct unstar item request" time="0.001" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct read item request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct unread item request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should get all feeds" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="create a correct request for moving a feed" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="shoud send a correct request for marking all items read" time="0.001" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct feed update request" time="0.001" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct get active feed request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct feed delete request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct feed create request" time="0.001" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should do a proper get all folders request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct collapse folder request" time="0.001" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="send a correct open folder request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should do a proper folder create request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should do a proper folder delete request" time="0.001" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should do a proper folder rename request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should have an export request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should do a proper get user settings read request" time="0.001" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should do a proper user settings read show request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should do a proper user settings read hide request" time="0.002" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should do a proper user settings language request" time="0.011" classname="PhantomJS 1.9 (Linux).Persistence"/>
+ <testcase name="should be false by default" time="0.002" classname="PhantomJS 1.9 (Linux).ShowAll"/>
+ <testcase name="should set the correct ShowAll value" time="0.001" classname="PhantomJS 1.9 (Linux).ShowAll"/>
+ <testcase name="should provide a set Showall setter" time="0.001" classname="PhantomJS 1.9 (Linux).ShowAll"/>
+ <testcase name="should be 0 by default" time="0.002" classname="PhantomJS 1.9 (Linux).StarredCount"/>
+ <testcase name="should set the correct StarredCount count" time="0.001" classname="PhantomJS 1.9 (Linux).StarredCount"/>
+ <testcase name="should provide a setter" time="0.001" classname="PhantomJS 1.9 (Linux).StarredCount"/>
+ <testcase name="should have the correct status flags" time="0.002" classname="PhantomJS 1.9 (Linux).StatusFlag"/>
+ <testcase name="should return the normal count if its below 999" time="0.001" classname="PhantomJS 1.9 (Linux).unreadCountFormatter"/>
+ <testcase name="should set the count to 999+ if the count is over 999" time="0.001" classname="PhantomJS 1.9 (Linux).unreadCountFormatter"/>
+ <system-out><![CDATA[
+]]></system-out>
+ <system-err/>
+ </testsuite>
+</testsuites>
diff --git a/js/tests/services/businesslayer/feedbusinesslayerSpec.coffee b/js/tests/services/businesslayer/feedbusinesslayerSpec.coffee
index 1b9f009d5..f867443c7 100644
--- a/js/tests/services/businesslayer/feedbusinesslayerSpec.coffee
+++ b/js/tests/services/businesslayer/feedbusinesslayerSpec.coffee
@@ -58,16 +58,16 @@ describe 'FeedBusinessL