diff options
author | Vincent Petry <pvince81@owncloud.com> | 2016-02-02 15:13:45 +0100 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2016-02-02 18:01:15 +0100 |
commit | 03f4b49eccc381deda4ad17fe7d74817b14b165a (patch) | |
tree | f597d45bbc26fc4eb98269f72762c80e01dbc463 /apps/comments | |
parent | 9028457ea2a150a586e63421382379f14cebd648 (diff) | |
download | nextcloud-server-03f4b49eccc381deda4ad17fe7d74817b14b165a.tar.gz nextcloud-server-03f4b49eccc381deda4ad17fe7d74817b14b165a.zip |
Added JS unit tests for comments
Diffstat (limited to 'apps/comments')
-rw-r--r-- | apps/comments/js/commentcollection.js | 10 | ||||
-rw-r--r-- | apps/comments/js/commentstabview.js | 2 | ||||
-rw-r--r-- | apps/comments/tests/js/commentscollectionSpec.js | 104 | ||||
-rw-r--r-- | apps/comments/tests/js/commentstabviewSpec.js | 198 |
4 files changed, 308 insertions, 6 deletions
diff --git a/apps/comments/js/commentcollection.js b/apps/comments/js/commentcollection.js index 055752f327c..f39eeb020fa 100644 --- a/apps/comments/js/commentcollection.js +++ b/apps/comments/js/commentcollection.js @@ -13,14 +13,14 @@ var NS_OWNCLOUD = 'http://owncloud.org/ns'; /** - * @class OCA.Comments.CommentsCollection + * @class OCA.Comments.CommentCollection * @classdesc * * Collection of comments assigned to a file * */ - var CommentsCollection = OC.Backbone.Collection.extend( - /** @lends OCA.Comments.CommentsCollection.prototype */ { + var CommentCollection = OC.Backbone.Collection.extend( + /** @lends OCA.Comments.CommentCollection.prototype */ { sync: OC.Backbone.davSync, @@ -82,7 +82,7 @@ options = _.extend({ remove: false, data: body, - davProperties: CommentsCollection.prototype.model.prototype.davProperties, + davProperties: CommentCollection.prototype.model.prototype.davProperties, success: function(resp) { if (resp.length <= self._limit) { // no new entries, end reached @@ -105,6 +105,6 @@ } }); - OCA.Comments.CommentsCollection = CommentsCollection; + OCA.Comments.CommentCollection = CommentCollection; })(OC, OCA); diff --git a/apps/comments/js/commentstabview.js b/apps/comments/js/commentstabview.js index fd6b7b07dcb..463ac2d76ef 100644 --- a/apps/comments/js/commentstabview.js +++ b/apps/comments/js/commentstabview.js @@ -57,7 +57,7 @@ initialize: function() { OCA.Files.DetailTabView.prototype.initialize.apply(this, arguments); - this.collection = new OCA.Comments.CommentsCollection(); + this.collection = new OCA.Comments.CommentCollection(); this.collection.on('request', this._onRequest, this); this.collection.on('sync', this._onEndRequest, this); this.collection.on('add', this._onAddModel, this); diff --git a/apps/comments/tests/js/commentscollectionSpec.js b/apps/comments/tests/js/commentscollectionSpec.js new file mode 100644 index 00000000000..0dc68cc167c --- /dev/null +++ b/apps/comments/tests/js/commentscollectionSpec.js @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2016 + * + * This file is licensed under the Affero General Public License comment 3 + * or later. + * + * See the COPYING-README file. + * + */ +describe('OCA.Comments.CommentCollection', function() { + var CommentCollection = OCA.Comments.CommentCollection; + var collection, syncStub; + var comment1, comment2, comment3; + + beforeEach(function() { + syncStub = sinon.stub(CommentCollection.prototype, 'sync'); + collection = new CommentCollection(); + collection.setObjectId(5); + + comment1 = { + id: 1, + actorType: 'users', + actorId: 'user1', + actorDisplayName: 'User One', + objectType: 'files', + objectId: 5, + message: 'First', + creationDateTime: Date.UTC(2016, 1, 3, 10, 5, 0) + }; + comment2 = { + id: 2, + actorType: 'users', + actorId: 'user2', + actorDisplayName: 'User Two', + objectType: 'files', + objectId: 5, + message: 'Second\nNewline', + creationDateTime: Date.UTC(2016, 1, 3, 10, 0, 0) + }; + comment3 = { + id: 3, + actorType: 'users', + actorId: 'user3', + actorDisplayName: 'User Three', + objectType: 'files', + objectId: 5, + message: 'Third', + creationDateTime: Date.UTC(2016, 1, 3, 5, 0, 0) + }; + }); + afterEach(function() { + syncStub.restore(); + }); + + it('fetches the next page', function() { + collection._limit = 2; + collection.fetchNext(); + + expect(syncStub.calledOnce).toEqual(true); + expect(syncStub.lastCall.args[0]).toEqual('REPORT'); + var options = syncStub.lastCall.args[2]; + expect(options.remove).toEqual(false); + + var parser = new DOMParser(); + var doc = parser.parseFromString(options.data, "application/xml"); + expect(doc.getElementsByTagNameNS('http://owncloud.org/ns', 'limit')[0].textContent).toEqual('3'); + expect(doc.getElementsByTagNameNS('http://owncloud.org/ns', 'offset')[0].textContent).toEqual('0'); + + syncStub.yieldTo('success', [comment1, comment2, comment3]); + + expect(collection.length).toEqual(2); + expect(collection.hasMoreResults()).toEqual(true); + + collection.fetchNext(); + + expect(syncStub.calledTwice).toEqual(true); + options = syncStub.lastCall.args[2]; + doc = parser.parseFromString(options.data, "application/xml"); + expect(doc.getElementsByTagNameNS('http://owncloud.org/ns', 'limit')[0].textContent).toEqual('3'); + expect(doc.getElementsByTagNameNS('http://owncloud.org/ns', 'offset')[0].textContent).toEqual('2'); + + syncStub.yieldTo('success', [comment3]); + + expect(collection.length).toEqual(3); + expect(collection.hasMoreResults()).toEqual(false); + + collection.fetchNext(); + + // no further requests + expect(syncStub.calledTwice).toEqual(true); + }); + it('resets page counted when calling reset', function() { + collection.fetchNext(); + + syncStub.yieldTo('success', [comment1]); + + expect(collection.hasMoreResults()).toEqual(false); + + collection.reset(); + + expect(collection.hasMoreResults()).toEqual(true); + }); +}); + diff --git a/apps/comments/tests/js/commentstabviewSpec.js b/apps/comments/tests/js/commentstabviewSpec.js new file mode 100644 index 00000000000..0fb5eec0653 --- /dev/null +++ b/apps/comments/tests/js/commentstabviewSpec.js @@ -0,0 +1,198 @@ +/** +* ownCloud +* +* @author Vincent Petry +* @copyright 2016 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 +* comment 3 of the License, or any later comment. +* +* 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.Comments.CommentsTabView tests', function() { + var view, fileInfoModel; + var fetchStub; + var testComments; + var clock; + + beforeEach(function() { + clock = sinon.useFakeTimers(Date.UTC(2016, 1, 3, 10, 5, 9)); + fetchStub = sinon.stub(OCA.Comments.CommentCollection.prototype, 'fetchNext'); + view = new OCA.Comments.CommentsTabView(); + fileInfoModel = new OCA.Files.FileInfoModel({ + id: 5, + name: 'One.txt', + mimetype: 'text/plain', + permissions: 31, + path: '/subdir', + size: 123456789, + etag: 'abcdefg', + mtime: Date.UTC(2016, 1, 0, 0, 0, 0) + }); + view.render(); + var comment1 = new OCA.Comments.CommentModel({ + id: 1, + actorType: 'users', + actorId: 'user1', + actorDisplayName: 'User One', + objectType: 'files', + objectId: 5, + message: 'First', + creationDateTime: Date.UTC(2016, 1, 3, 10, 5, 0) + }); + var comment2 = new OCA.Comments.CommentModel({ + id: 2, + actorType: 'users', + actorId: 'user2', + actorDisplayName: 'User Two', + objectType: 'files', + objectId: 5, + message: 'Second\nNewline', + creationDateTime: Date.UTC(2016, 1, 3, 10, 0, 0) + }); + + testComments = [comment1, comment2]; + }); + afterEach(function() { + view.remove(); + view = undefined; + fetchStub.restore(); + clock.restore(); + }); + describe('rendering', function() { + it('reloads matching comments when setting file info model', function() { + view.setFileInfo(fileInfoModel); + expect(fetchStub.calledOnce).toEqual(true); + }); + + it('renders loading icon while fetching comments', function() { + view.setFileInfo(fileInfoModel); + view.collection.trigger('request'); + + expect(view.$el.find('.loading').length).toEqual(1); + expect(view.$el.find('.comments li').length).toEqual(0); + }); + + it('renders comments', function() { + + view.setFileInfo(fileInfoModel); + view.collection.set(testComments); + + var $comments = view.$el.find('.comments>li'); + expect($comments.length).toEqual(2); + var $item = $comments.eq(0); + expect($item.find('.author').text()).toEqual('User One'); + expect($item.find('.date').text()).toEqual('seconds ago'); + expect($item.find('.message').text()).toEqual('First'); + + $item = $comments.eq(1); + expect($item.find('.author').text()).toEqual('User Two'); + expect($item.find('.date').text()).toEqual('5 minutes ago'); + expect($item.find('.message').html()).toEqual('Second<br>Newline'); + }); + }); + describe('more comments', function() { + var hasMoreResultsStub; + + beforeEach(function() { + view.collection.set(testComments); + hasMoreResultsStub = sinon.stub(OCA.Comments.CommentCollection.prototype, 'hasMoreResults'); + }); + afterEach(function() { + hasMoreResultsStub.restore(); + }); + + it('shows "More comments" button when more comments are available', function() { + hasMoreResultsStub.returns(true); + view.collection.trigger('sync'); + + expect(view.$el.find('.showMore').hasClass('hidden')).toEqual(false); + }); + it('does not show "More comments" button when more comments are available', function() { + hasMoreResultsStub.returns(false); + view.collection.trigger('sync'); + + expect(view.$el.find('.showMore').hasClass('hidden')).toEqual(true); + }); + it('fetches and appends the next page when clicking the "More" button', function() { + hasMoreResultsStub.returns(true); + + expect(fetchStub.notCalled).toEqual(true); + + view.$el.find('.showMore').click(); + + expect(fetchStub.calledOnce).toEqual(true); + }); + it('appends comment to the list when added to collection', function() { + var comment3 = new OCA.Comments.CommentModel({ + id: 3, + actorType: 'users', + actorId: 'user3', + actorDisplayName: 'User Three', + objectType: 'files', + objectId: 5, + message: 'Third', + creationDateTime: Date.UTC(2016, 1, 3, 5, 0, 0) + }); + + view.collection.add(comment3); + + expect(view.$el.find('.comments>li').length).toEqual(3); + + var $item = view.$el.find('.comments>li').eq(2); + expect($item.find('.author').text()).toEqual('User Three'); + expect($item.find('.date').text()).toEqual('5 hours ago'); + expect($item.find('.message').html()).toEqual('Third'); + }); + }); + describe('posting comments', function() { + var createStub; + var currentUserStub; + + beforeEach(function() { + view.collection.set(testComments); + createStub = sinon.stub(OCA.Comments.CommentCollection.prototype, 'create'); + currentUserStub = sinon.stub(OC, 'getCurrentUser'); + currentUserStub.returns({ + uid: 'testuser', + displayName: 'Test User' + }); + }); + afterEach(function() { + createStub.restore(); + currentUserStub.restore(); + }); + + it('creates a new comment when clicking post button', function() { + view.$el.find('.message').val('New message'); + view.$el.find('form').submit(); + + expect(createStub.calledOnce).toEqual(true); + expect(createStub.lastCall.args[0]).toEqual({ + actorId: 'testuser', + actorDisplayName: 'Test User', + actorType: 'users', + verb: 'comment', + message: 'New message', + creationDateTime: Date.UTC(2016, 1, 3, 10, 5, 9) + }); + }); + it('does not create a comment if the field is empty', function() { + view.$el.find('.message').val(' '); + view.$el.find('form').submit(); + + expect(createStub.notCalled).toEqual(true); + }); + + }); +}); |