diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-18 17:47:03 +0200 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-18 17:47:03 +0200 |
commit | 402c534ee6453e28e5902f3d4f3a21b534309d24 (patch) | |
tree | 483a79a7cc528cb88200db40ff12c526bb542b4c /js | |
parent | 97452a5f5e98e33981eeac1eb89402fc13b13cb2 (diff) |
remove clientside hashing, fix #72
Diffstat (limited to 'js')
-rw-r--r-- | js/Gruntfile.coffee | 4 | ||||
-rw-r--r-- | js/app/services/businesslayer/feedbusinesslayer.coffee | 10 | ||||
-rw-r--r-- | js/app/services/models/feedmodel.coffee | 38 | ||||
-rw-r--r-- | js/config/testacular_conf.js | 1 | ||||
-rw-r--r-- | js/public/app.js | 56 | ||||
-rw-r--r-- | js/test-results.xml | 186 | ||||
-rw-r--r-- | js/tests/services/businesslayer/feedbusinesslayerSpec.coffee | 68 | ||||
-rw-r--r-- | js/tests/services/businesslayer/folderbusinesslayerSpec.coffee | 30 | ||||
-rw-r--r-- | js/tests/services/businesslayer/itembusinesslayerSpec.coffee | 2 | ||||
-rw-r--r-- | js/tests/services/businesslayer/subsriptionsbusinesslayerSpec.coffee | 8 | ||||
-rw-r--r-- | js/tests/services/models/feedmodelSpec.coffee | 44 | ||||
-rw-r--r-- | js/tests/services/models/itemmodelSpec.coffee | 2 | ||||
-rw-r--r-- | js/vendor/md5js/md5.js | 379 |
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 re |