###
ownCloud - News
@author Bernhard Posselt
@copyright 2012 Bernhard Posselt nukeawhale@gmail.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 .
###
describe 'FolderBusinessLayer', ->
beforeEach module 'News'
beforeEach =>
angular.module('News').factory 'Persistence', =>
@persistence =
createFolder: ->
createFeed: ->
openFolder: ->
beforeEach inject (@FolderBusinessLayer, @FolderModel, @FeedModel, @ShowAll,
@ActiveFeed, @FeedType, @_ExistsError) =>
@ShowAll.setShowAll(false)
@ActiveFeed.handle({type: @FeedType.Feed, id:0})
it 'should delete folders', =>
@FolderModel.removeById = jasmine.createSpy('remove')
@persistence.deleteFolder = jasmine.createSpy('deletequery')
@FolderBusinessLayer.delete(3)
expect(@FolderModel.removeById).toHaveBeenCalledWith(3)
expect(@persistence.deleteFolder).toHaveBeenCalledWith(3)
it 'should return true when folder has feeds', =>
@FeedModel.add({id: 5, unreadCount:2, folderId: 2, urlHash: 'a1'})
expect(@FolderBusinessLayer.hasFeeds(3)).toBeFalsy()
@FeedModel.add({id: 2, unreadCount:35, folderId: 3, urlHash: 'a2'})
expect(@FolderBusinessLayer.hasFeeds(3)).toBeTruthy()
it 'should toggle folder', =>
@persistence.openFolder = jasmine.createSpy('open')
@persistence.collapseFolder = jasmine.createSpy('collapse')
@FolderModel.add({id: 3, opened: false, name: 'ho'})
@FolderBusinessLayer.toggleFolder(4)
expect(@FolderModel.getById(3).opened).toBeFalsy()
@FolderBusinessLayer.toggleFolder(3)
expect(@FolderModel.getById(3).opened).toBeTruthy()
expect(@persistence.openFolder).toHaveBeenCalledWith(3)
@FolderBusinessLayer.toggleFolder(3)
expect(@FolderModel.getById(3).opened).toBeFalsy()
expect(@persistence.collapseFolder).toHaveBeenCalledWith(3)
it 'should mark folder as read', =>
@persistence.setFeedRead = jasmine.createSpy('setFeedRead')
@FeedModel.add({id: 3, unreadCount:134, folderId: 3, urlHash: 'a1'})
@FeedModel.add({id: 5, unreadCount:2, folderId: 2, urlHash: 'a2'})
@FeedModel.add({id: 1, unreadCount:12, folderId: 3, urlHash: 'a3'})
@FolderBusinessLayer.markFolderRead(3)
expect(@FeedModel.getById(3).unreadCount).toBe(0)
expect(@FeedModel.getById(1).unreadCount).toBe(0)
expect(@FeedModel.getById(5).unreadCount).toBe(2)
it 'should get the correct unread count', =>
@FeedModel.add({id: 5, unreadCount:2, folderId: 2, urlHash: 'a1'})
@FeedModel.add({id: 6, unreadCount:3, folderId: 3, urlHash: 'a2'})
@FeedModel.add({id: 7, unreadCount:4, folderId: 2, urlHash: 'a3'})
expect(@FolderBusinessLayer.getUnreadCount(2)).toBe(6)
it 'should be visible if show all is true', =>
expect(@FolderBusinessLayer.isVisible(3)).toBe(false)
@ShowAll.setShowAll(true)
expect(@FolderBusinessLayer.isVisible(3)).toBe(true)
it 'should be visible if its active', =>
@ActiveFeed.handle({type: @FeedType.Folder, id:3})
expect(@FolderBusinessLayer.isVisible(3)).toBe(true)
it 'should be visible if one of its subfeeds is active', =>
@FeedModel.add({id: 5, unreadCount:0, folderId: 2, urlHash: 'a1'})
@FeedModel.add({id: 6, unreadCount:0, folderId: 3, urlHash: 'a2'})
@FeedModel.add({id: 7, unreadCount:0, folderId: 2, urlHash: 'a3'})
@ActiveFeed.handle({type: @FeedType.Feed, id:6})
expect(@FolderBusinessLayer.isVisible(3)).toBe(true)
it 'should be visible if showAll is false and it has unread items', =>
@FeedModel.add({id: 5, unreadCount:2, folderId: 2, urlHash: 'a1'})
@FeedModel.add({id: 6, unreadCount:3, folderId: 3, urlHash: 'a2'})
@FeedModel.add({id: 7, unreadCount:4, folderId: 2, urlHash: 'a3'})
@ActiveFeed.handle({type: @FeedType.Folder, id:2})
expect(@FolderBusinessLayer.isVisible(3)).toBe(true)
it 'should return all folders', =>
item1 = {id: 3, open: false, name: 'ho'}
item2 = {id: 4, open: true, name: 'hod'}
@FolderModel.add(item1)
@FolderModel.add(item2)
expect(@FolderBusinessLayer.getAll()).toContain(item1)
expect(@FolderBusinessLayer.getAll()).toContain(item2)
it 'should not create a folder if it already exists', =>
item1 = {id: 4, open: true, name: 'john'}
@FolderModel.add(item1)
expect =>
@FolderBusinessLayer.create('john')
.toThrow(new @_ExistsError())
expect =>
@FolderBusinessLayer.create('johns')
.not.toThrow(new @_ExistsError())
it 'should not create folders that are empty', =>
expect =>
@FolderBusinessLayer.create(' ')
.toThrow(new Error())
it 'should create a folder before theres a response from the server', =>
@FolderBusinessLayer.create('johns')
expect(@FolderModel.size()).toBe(1)
expect(@FolderModel.getByName('johns').opened).toBe(true)
it 'should make a create folder request', =>
@persistence.createFolder = jasmine.createSpy('add folder')
@FolderBusinessLayer.create(' johns ')
expect(@persistence.createFolder).toHaveBeenCalledWith('johns', 0,
jasmine.any(Function))
it 'should call the onSuccess function on response status ok', =>
onSuccess = jasmine.createSpy('Success')
@persistence.createFolder = jasmine.createSpy('add folder')
@persistence.createFolder.andCallFake (folderName, parentId, success) =>
@response =
status: 'ok'
data: 'jooo'
success(@response)
@FolderBusinessLayer.create(' johns ', onSuccess)
expect(onSuccess).toHaveBeenCalledWith(@response.data)
it 'should call the handle a response error when creating a folder', =>
onSuccess = jasmine.createSpy('Success')
onFailure = jasmine.createSpy('Failure')
@persistence.createFolder = jasmine.createSpy('add folder')
@persistence.createFolder.andCallFake (folderName, parentId, success) =>
@response =
status: 'error'
msg: 'this is an error'
success(@response)
@FolderBusinessLayer.create(' johns ', onSuccess, onFailure)
expect(onSuccess).not.toHaveBeenCalled()
expect(onFailure).toHaveBeenCalled()
expect(@FolderModel.getByName('johns').error).toBe(@response.msg)
it 'should mark a folder error as read by removing it', =>
@FolderModel.add({id: 3, name: 'john'})
@FolderBusinessLayer.markErrorRead('John')
expect(@FolderModel.size()).toBe(0)
expect(@FolderModel.getByName('john')).toBe(undefined)
it 'should return the corret folder for id', =>
item = {id: 3, name: 'john'}
@FolderModel.add(item)
expect(@FolderBusinessLayer.getById(3)).toBe(item)
it 'should open a folder', =>
@persistence.openFolder = jasmine.createSpy('open')
@FolderModel.add({id: 3, opened: false, name: 'ho'})
@FolderBusinessLayer.open(3)
expect(@FolderModel.getById(3).opened).toBeTruthy()
expect(@persistence.openFolder).toHaveBeenCalledWith(3)
it 'should not import on empty opml', =>
@persistence.createFolder = jasmine.createSpy('create folder')
@persistence.createFeed = jasmine.createSpy('create feed')
xml = '
NewsBlur Feeds
2013-03-14 16:44:01.356965
2013-03-14 16:44:01.356965
'
@FolderBusinessLayer.import(xml)
expect(@persistence.createFolder).not.toHaveBeenCalled()
expect(@persistence.createFeed).not.toHaveBeenCalled()
it 'should import a folder', =>
@persistence.createFolder = jasmine.createSpy('create folder')
@persistence.createFeed = jasmine.createSpy('create feed')
xml = '
NewsBlur Feeds
2013-03-14 16:44:01.356965
2013-03-14 16:44:01.356965
'
@FolderBusinessLayer.import(xml)
expect(@persistence.createFolder).toHaveBeenCalledWith('test', 0,
jasmine.any(Function))
expect(@persistence.createFeed).not.toHaveBeenCalled()
it 'should import a feed', =>
@persistence.createFolder = jasmine.createSpy('create folder')
@persistence.createFeed = jasmine.createSpy('create feed')
xml = '
NewsBlur Feeds
2013-03-14 16:44:01.356965
2013-03-14 16:44:01.356965
'
@FolderBusinessLayer.import(xml)
expect(@persistence.createFolder).not.toHaveBeenCalled()
expect(@persistence.createFeed).toHaveBeenCalledWith(
'http://worrydream.com/feed.xml', 0, jasmine.any(Function))
it 'should import nested folders', =>
@persistence.createFolder = jasmine.createSpy('create folder')
@persistence.createFolder.andCallFake (name, parentId, onSuccess) =>
data =
data:
folders: [
{id: 3}
]
onSuccess(data)
@persistence.createFeed = jasmine.createSpy('create feed')
xml = '
NewsBlur Feeds
2013-03-14 16:44:01.356965
2013-03-14 16:44:01.356965
'
@FolderBusinessLayer.import(xml)
expect(@persistence.createFolder).toHaveBeenCalledWith('Design', 0,
jasmine.any(Function))
expect(@persistence.createFeed).toHaveBeenCalledWith(
'http://worrydream.com/feed.xml', 3, jasmine.any(Function))
it 'should use an existing folder when importing a folder', =>
@persistence.createFolder = jasmine.createSpy('create folder')
@persistence.createFeed = jasmine.createSpy('create feed')
@persistence.openFolder = jasmine.createSpy('open folder')
folder = {id: 2, name: 'design', opened: false}
@FolderModel.add(folder)
xml = '
NewsBlur Feeds
2013-03-14 16:44:01.356965
2013-03-14 16:44:01.356965
'
@FolderBusinessLayer.import(xml)
expect(@persistence.createFolder).not.toHaveBeenCalled()
expect(@persistence.createFeed).toHaveBeenCalledWith(
'http://worrydream.com/feed.xml', 2, jasmine.any(Function))
expect(folder.opened).toBe(true)
expect(@persistence.openFolder).toHaveBeenCalled()
it 'should not import a feed if it already exists', =>
@persistence.createFolder = jasmine.createSpy('create folder')
@persistence.createFeed = jasmine.createSpy('create feed')
@FeedModel.add({urlHash: hex_md5('http://worrydream.com/feed.xml')})
xml = '
NewsBlur Feeds
2013-03-14 16:44:01.356965
2013-03-14 16:44:01.356965
'
@FolderBusinessLayer.import(xml)
expect(@persistence.createFolder).not.toHaveBeenCalled()
expect(@persistence.createFeed).not.toHaveBeenCalled()