Mailspring/spec/stores/focused-perspective-store-spec.coffee
Juan Tejada 3d69ebbabb fix+🎨(notifs): Cleanup, handle nonexistent thread when opening notification
Notifications now check to see the thread they are supposed to open
exists.

Also, clean up FocusedContentStore._onFocus so that it doesn't have the side
effect of dispatching another action and messay logic.
Instead, added Actions.ensureCategoryFocused, to focus any category, and which
should be used separately from focusing content (notifications now use
this action for "opening" the thread)
Also, convert FocusedPerspectiveStore to ES6
2016-10-01 00:08:19 -07:00

135 lines
6.4 KiB
CoffeeScript

_ = require 'underscore'
Actions = require '../../src/flux/actions'
Category = require '../../src/flux/models/category'
MailboxPerspective = require '../../src/mailbox-perspective'
CategoryStore = require '../../src/flux/stores/category-store'
AccountStore = require '../../src/flux/stores/account-store'
FocusedPerspectiveStore = require('../../src/flux/stores/focused-perspective-store').default
describe "FocusedPerspectiveStore", ->
beforeEach ->
spyOn(FocusedPerspectiveStore, 'trigger')
FocusedPerspectiveStore._current = MailboxPerspective.forNothing()
@account = AccountStore.accounts()[0]
@inboxCategory = new Category(id: 'id-123', name: 'inbox', displayName: "INBOX", accountId: @account.id)
@inboxPerspective = MailboxPerspective.forCategory(@inboxCategory)
@userCategory = new Category(id: 'id-456', name: null, displayName: "MyCategory", accountId: @account.id)
@userPerspective = MailboxPerspective.forCategory(@userCategory)
spyOn(CategoryStore, "getStandardCategory").andReturn @inboxCategory
spyOn(CategoryStore, "byId").andCallFake (aid, cid) =>
return {id: 'A'} if aid is 1 and cid is 'A'
return @inboxCategory if cid is @inboxCategory.id
return @userCategory if cid is @userCategory.id
return null
describe "_initializeFromSavedState", ->
beforeEach ->
@default = MailboxPerspective.forCategory(@inboxCategory)
spyOn(AccountStore, 'accountIds').andReturn([1, 2])
spyOn(MailboxPerspective, 'fromJSON').andCallFake (json) -> json
spyOn(FocusedPerspectiveStore, '_defaultPerspective').andReturn @default
spyOn(FocusedPerspectiveStore, '_setPerspective')
it "uses default perspective when no perspective has been saved", ->
NylasEnv.savedState.sidebarAccountIds = undefined
NylasEnv.savedState.perspective = undefined
FocusedPerspectiveStore._initializeFromSavedState()
expect(FocusedPerspectiveStore._setPerspective).toHaveBeenCalledWith(@default, @default.accountIds)
it "uses default if the saved perspective has account ids no longer present", ->
NylasEnv.savedState.sidebarAccountIds = [1, 2, 3]
NylasEnv.savedState.perspective =
accountIds: [1, 2, 3],
categories: => [{accountId: 1, id: 'A'}],
FocusedPerspectiveStore._initializeFromSavedState()
expect(FocusedPerspectiveStore._setPerspective).toHaveBeenCalledWith(@default, @default.accountIds)
NylasEnv.savedState.sidebarAccountIds = [1, 2, 3]
NylasEnv.savedState.perspective =
accountIds: [3]
categories: => [{accountId: 3, id: 'A'}]
FocusedPerspectiveStore._initializeFromSavedState()
expect(FocusedPerspectiveStore._setPerspective).toHaveBeenCalledWith(@default, @default.accountIds)
it "uses default if the saved perspective has category ids no longer present", ->
NylasEnv.savedState.sidebarAccountIds = [2]
NylasEnv.savedState.perspective =
accountIds: [2]
categories: => [{accountId: 2, id: 'C'}]
FocusedPerspectiveStore._initializeFromSavedState()
expect(FocusedPerspectiveStore._setPerspective).toHaveBeenCalledWith(@default, @default.accountIds)
it "does not honor sidebarAccountIds if it includes account ids no longer present", ->
NylasEnv.savedState.sidebarAccountIds = [1, 2, 3]
NylasEnv.savedState.perspective =
accountIds: [1]
categories: => [{accountId: 1, id: 'A'}]
FocusedPerspectiveStore._initializeFromSavedState()
expect(FocusedPerspectiveStore._setPerspective).toHaveBeenCalledWith(NylasEnv.savedState.perspective, [1])
it "uses the saved perspective if it is still valid", ->
NylasEnv.savedState.sidebarAccountIds = [1, 2]
NylasEnv.savedState.perspective =
accountIds: [1, 2]
categories: => [{accountId: 1, id: 'A'}]
FocusedPerspectiveStore._initializeFromSavedState()
expect(FocusedPerspectiveStore._setPerspective).toHaveBeenCalledWith(NylasEnv.savedState.perspective, [1, 2])
NylasEnv.savedState.sidebarAccountIds = [1, 2]
NylasEnv.savedState.perspective =
accountIds: [1]
categories: => []
type: 'DraftsMailboxPerspective'
FocusedPerspectiveStore._initializeFromSavedState()
expect(FocusedPerspectiveStore._setPerspective).toHaveBeenCalledWith(NylasEnv.savedState.perspective, [1, 2])
NylasEnv.savedState.sidebarAccountIds = [1]
NylasEnv.savedState.perspective =
accountIds: [1]
categories: => []
type: 'DraftsMailboxPerspective'
FocusedPerspectiveStore._initializeFromSavedState()
expect(FocusedPerspectiveStore._setPerspective).toHaveBeenCalledWith(NylasEnv.savedState.perspective, [1])
describe "_onCategoryStoreChanged", ->
it "should try to initialize if the current perspective is `nothing`", ->
spyOn(FocusedPerspectiveStore, '_initializeFromSavedState')
FocusedPerspectiveStore._current = @inboxPerspective
FocusedPerspectiveStore._onCategoryStoreChanged()
expect(FocusedPerspectiveStore._initializeFromSavedState).not.toHaveBeenCalled()
FocusedPerspectiveStore._current = MailboxPerspective.forNothing()
FocusedPerspectiveStore._onCategoryStoreChanged()
expect(FocusedPerspectiveStore._initializeFromSavedState).toHaveBeenCalled()
it "should set the current category to default when the current category no longer exists in the CategoryStore", ->
defaultPerspective = @inboxPerspective
spyOn(FocusedPerspectiveStore, '_defaultPerspective').andReturn(defaultPerspective)
otherAccountInbox = @inboxCategory.clone()
otherAccountInbox.serverId = 'other-id'
FocusedPerspectiveStore._current = MailboxPerspective.forCategory(otherAccountInbox)
FocusedPerspectiveStore._onCategoryStoreChanged()
expect(FocusedPerspectiveStore.current()).toEqual(defaultPerspective)
describe "_onFocusPerspective", ->
it "should focus the category and trigger", ->
FocusedPerspectiveStore._onFocusPerspective(@userPerspective)
expect(FocusedPerspectiveStore.trigger).toHaveBeenCalled()
expect(FocusedPerspectiveStore.current().categories()).toEqual([@userCategory])
describe "_setPerspective", ->
it "should not trigger if the perspective is already focused", ->
FocusedPerspectiveStore._setPerspective(@inboxPerspective)
FocusedPerspectiveStore.trigger.reset()
FocusedPerspectiveStore._setPerspective(@inboxPerspective)
expect(FocusedPerspectiveStore.trigger).not.toHaveBeenCalled()