diff --git a/js/models/folder.js b/js/models/folder.js index bf44dcfcf9..d8459df3e1 100644 --- a/js/models/folder.js +++ b/js/models/folder.js @@ -17,20 +17,28 @@ define(function(require) { * @class Folder */ var Folder = Backbone.Model.extend({ + messages: undefined, defaults: { open: false, - folders: [], - messages: [] + folders: [] }, initialize: function() { var FolderCollection = require('models/foldercollection'); var MessageCollection = require('models/messagecollection'); this.set('folders', new FolderCollection(this.get('folders'))); - this.set('messages', new MessageCollection(this.get('messages'))); + this.messages = new MessageCollection(); }, toggleOpen: function() { this.set({open: !this.get('open')}); }, + /** + * @param {Message} message + * @returns {undefined} + */ + addMessage: function(message) { + message.folder = this; + this.messages.add(message); + }, toJSON: function() { var data = Backbone.Model.prototype.toJSON.call(this); if (data.folders && data.folders.toJSON) { diff --git a/js/service/messageservice.js b/js/service/messageservice.js index ba5e6172df..1e9de4003e 100644 --- a/js/service/messageservice.js +++ b/js/service/messageservice.js @@ -65,11 +65,10 @@ define(function(require) { // Load cached version if available var messageList = require('cache').getMessageList(account, folder); if (!options.force && messageList) { - var collection = folder.get('messages'); _.each(messageList, function(msg) { - collection.add(msg); + folder.addMessage(msg); }); - defer.resolve(collection, true); + defer.resolve(folder.messages, true); return defer.promise(); } } @@ -80,7 +79,7 @@ define(function(require) { folderId: folder.get('id') }); - // TODO: folder.get('messages').fetch() + // TODO: folder.messages.fetch() messageListXhr = $.ajax(url, { data: { @@ -92,12 +91,12 @@ define(function(require) { if (options.replace || options.cache) { require('cache').addMessageList(account, folder, messages); } - var collection = folder.get('messages'); + var collection = folder.messages; if (options.replace) { collection.reset(); } _.each(messages, function(msg) { - collection.add(msg); + folder.addMessage(msg); }); defer.resolve(collection, false); }, diff --git a/js/tests/models_folder_spec.js b/js/tests/models_folder_spec.js index 51de052889..553070c11c 100644 --- a/js/tests/models_folder_spec.js +++ b/js/tests/models_folder_spec.js @@ -18,18 +18,42 @@ */ define([ - 'models/foldercollection', - 'models/folder' -], function(FolderCollection, Folder) { - describe('FolderCollection', function() { - var collection; + 'models/folder', + 'models/messagecollection', + 'models/message' +], function(Folder, MessageCollection, Message) { + describe('Folder', function() { + var folder; beforeEach(function() { - collection = new FolderCollection(); + folder = new Folder(); }); - it('contains folders', function() { - expect(collection.model).toBe(Folder); + it('has messages', function() { + expect(folder.messages instanceof MessageCollection).toBe(true); + }); + + it('toggles open', function() { + expect(folder.get('open')).toBe(false); + + folder.toggleOpen(); + + expect(folder.get('open')).toBe(true); + + folder.toggleOpen(); + + expect(folder.get('open')).toBe(false); + }); + + it('assigns itself to added messages', function() { + var message = new Message(); + + expect(folder.messages.length).toBe(0); + + folder.addMessage(message); + + expect(folder.messages.length).toBe(1); + expect(message.folder).toBe(folder); }); }); -}); \ No newline at end of file +}); diff --git a/js/tests/models_foldercollection_spec.js b/js/tests/models_foldercollection_spec.js new file mode 100644 index 0000000000..51de052889 --- /dev/null +++ b/js/tests/models_foldercollection_spec.js @@ -0,0 +1,35 @@ +/** + * @author Christoph Wurst + * + * Mail + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program 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, version 3, + * along with this program. If not, see + * + */ + +define([ + 'models/foldercollection', + 'models/folder' +], function(FolderCollection, Folder) { + describe('FolderCollection', function() { + var collection; + + beforeEach(function() { + collection = new FolderCollection(); + }); + + it('contains folders', function() { + expect(collection.model).toBe(Folder); + }); + }); +}); \ No newline at end of file diff --git a/js/views/foldercontent.js b/js/views/foldercontent.js index 3d0f9777d6..a6b8e2b069 100644 --- a/js/views/foldercontent.js +++ b/js/views/foldercontent.js @@ -74,7 +74,7 @@ define(function(require) { }, onShow: function() { this.messages.show(new MessagesView({ - collection: this.folder.get('messages'), + collection: this.folder.messages, searchQuery: this.searchQuery })); },