mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-12-29 03:43:16 +08:00
190 lines
8.1 KiB
CoffeeScript
190 lines
8.1 KiB
CoffeeScript
_ = require 'underscore'
|
|
Thread = require('../../src/flux/models/thread').default
|
|
Folder = require('../../src/flux/models/folder').default
|
|
Label = require('../../src/flux/models/label').default
|
|
Message = require('../../src/flux/models/message').default
|
|
FocusedContentStore = require('../../src/flux/stores/focused-content-store').default
|
|
FocusedPerspectiveStore = require('../../src/flux/stores/focused-perspective-store').default
|
|
MessageStore = require('../../src/flux/stores/message-store').default
|
|
DatabaseStore = require('../../src/flux/stores/database-store').default
|
|
ChangeUnreadTask = require('../../src/flux/tasks/change-unread-task').default
|
|
Actions = require('../../src/flux/actions').default
|
|
|
|
testThread = new Thread(id: '123', accountId: TEST_ACCOUNT_ID)
|
|
testMessage1 = new Message(folder: new Folder(role: 'all'), id: 'a', body: '123', files: [], accountId: TEST_ACCOUNT_ID)
|
|
testMessage2 = new Message(folder: new Folder(role: 'all'), id: 'b', body: '123', files: [], accountId: TEST_ACCOUNT_ID)
|
|
testMessage3 = new Message(folder: new Folder(role: 'all'), id: 'c', body: '123', files: [], accountId: TEST_ACCOUNT_ID)
|
|
|
|
describe "MessageStore", ->
|
|
describe "when the receiving focus changes from the FocusedContentStore", ->
|
|
beforeEach ->
|
|
if MessageStore._onFocusChangedTimer
|
|
clearTimeout(MessageStore._onFocusChangedTimer)
|
|
MessageStore._onFocusChangedTimer = null
|
|
spyOn(MessageStore, '_onApplyFocusChange')
|
|
|
|
afterEach ->
|
|
if MessageStore._onFocusChangedTimer
|
|
clearTimeout(MessageStore._onFocusChangedTimer)
|
|
MessageStore._onFocusChangedTimer = null
|
|
|
|
describe "if no change has happened in the last 100ms", ->
|
|
it "should apply immediately", ->
|
|
FocusedContentStore.trigger(impactsCollection: (c) -> true )
|
|
expect(MessageStore._onApplyFocusChange).toHaveBeenCalled()
|
|
|
|
describe "if a change has happened in the last 100ms", ->
|
|
it "should not apply immediately", ->
|
|
noop = =>
|
|
MessageStore._onFocusChangedTimer = setTimeout(noop, 100)
|
|
FocusedContentStore.trigger(impactsCollection: (c) -> true )
|
|
expect(MessageStore._onApplyFocusChange).not.toHaveBeenCalled()
|
|
|
|
it "should apply 100ms after the last focus change and reset", ->
|
|
FocusedContentStore.trigger(impactsCollection: (c) -> true )
|
|
expect(MessageStore._onApplyFocusChange.callCount).toBe(1)
|
|
advanceClock(50)
|
|
FocusedContentStore.trigger(impactsCollection: (c) -> true )
|
|
expect(MessageStore._onApplyFocusChange.callCount).toBe(1)
|
|
advanceClock(50)
|
|
FocusedContentStore.trigger(impactsCollection: (c) -> true )
|
|
expect(MessageStore._onApplyFocusChange.callCount).toBe(1)
|
|
advanceClock(150)
|
|
FocusedContentStore.trigger(impactsCollection: (c) -> true )
|
|
expect(MessageStore._onApplyFocusChange.callCount).toBe(3)
|
|
advanceClock(150)
|
|
FocusedContentStore.trigger(impactsCollection: (c) -> true )
|
|
expect(MessageStore._onApplyFocusChange.callCount).toBe(5)
|
|
|
|
describe "items", ->
|
|
beforeEach ->
|
|
MessageStore._showingHiddenItems = false
|
|
MessageStore._items = [
|
|
new Message(folder: new Folder(role: 'trash'), labels: [new Label(displayName: 'bla')]),
|
|
new Message(folder: new Folder(role: 'all'), labels: [new Label(role: 'inbox')]),
|
|
new Message(folder: new Folder(role: 'spam'), labels: [new Label(displayName: 'bla')]),
|
|
new Message(folder: new Folder(role: 'all'), labels: []),
|
|
new Message(folder: new Folder(role: 'all'), labels: [], draft: true),
|
|
]
|
|
|
|
describe "when showing hidden items", ->
|
|
it "should return the entire items array", ->
|
|
MessageStore._showingHiddenItems = true
|
|
expect(MessageStore.items().length).toBe(5)
|
|
|
|
describe "when in trash or spam", ->
|
|
it "should show only the message which are in trash or spam, and drafts", ->
|
|
spyOn(FocusedPerspectiveStore, 'current').andReturn({categoriesSharedRole: => 'trash'})
|
|
expect(MessageStore.items()).toEqual([
|
|
MessageStore._items[0],
|
|
MessageStore._items[2],
|
|
MessageStore._items[4],
|
|
])
|
|
|
|
describe "when in another folder", ->
|
|
it "should hide all of the messages which are in trash or spam", ->
|
|
spyOn(FocusedPerspectiveStore, 'current').andReturn({categoriesSharedRole: => 'inbox'})
|
|
expect(MessageStore.items()).toEqual([
|
|
MessageStore._items[1],
|
|
MessageStore._items[3],
|
|
MessageStore._items[4],
|
|
])
|
|
|
|
describe "when applying focus changes", ->
|
|
beforeEach ->
|
|
MessageStore._lastLoadedThreadId = null
|
|
|
|
@focus = null
|
|
spyOn(FocusedContentStore, 'focused').andCallFake (collection) =>
|
|
if collection is 'thread'
|
|
@focus
|
|
else
|
|
null
|
|
|
|
spyOn(FocusedContentStore, 'focusedId').andCallFake (collection) =>
|
|
if collection is 'thread'
|
|
@focus?.id
|
|
else
|
|
null
|
|
|
|
spyOn(DatabaseStore, 'findAll').andCallFake ->
|
|
include: -> @
|
|
where: -> @
|
|
then: (callback) -> callback([testMessage1, testMessage2])
|
|
|
|
it "should retrieve the focused thread", ->
|
|
@focus = testThread
|
|
MessageStore._thread = null
|
|
MessageStore._onApplyFocusChange()
|
|
expect(DatabaseStore.findAll).toHaveBeenCalled()
|
|
expect(DatabaseStore.findAll.mostRecentCall.args[0]).toBe(Message)
|
|
|
|
describe "when the thread is already focused", ->
|
|
it "should do nothing", ->
|
|
@focus = testThread
|
|
MessageStore._thread = @focus
|
|
MessageStore._onApplyFocusChange()
|
|
expect(DatabaseStore.findAll).not.toHaveBeenCalled()
|
|
|
|
describe "when the thread is unread", ->
|
|
beforeEach ->
|
|
@focus = null
|
|
MessageStore._onApplyFocusChange()
|
|
testThread.unread = true
|
|
spyOn(Actions, 'queueTask')
|
|
spyOn(AppEnv.config, 'get').andCallFake (key) =>
|
|
if key is 'core.reading.markAsReadDelay'
|
|
return 600
|
|
|
|
it "should queue a task to mark the thread as read", ->
|
|
@focus = testThread
|
|
MessageStore._onApplyFocusChange()
|
|
advanceClock(500)
|
|
expect(Actions.queueTask).not.toHaveBeenCalled()
|
|
advanceClock(500)
|
|
expect(Actions.queueTask).toHaveBeenCalled()
|
|
expect(Actions.queueTask.mostRecentCall.args[0] instanceof ChangeUnreadTask).toBe(true)
|
|
|
|
it "should not queue a task to mark the thread as read if the thread is no longer selected 500msec later", ->
|
|
@focus = testThread
|
|
MessageStore._onApplyFocusChange()
|
|
advanceClock(500)
|
|
expect(Actions.queueTask).not.toHaveBeenCalled()
|
|
@focus = null
|
|
MessageStore._onApplyFocusChange()
|
|
advanceClock(500)
|
|
expect(Actions.queueTask).not.toHaveBeenCalled()
|
|
|
|
it "should not re-mark the thread as read when made unread", ->
|
|
@focus = testThread
|
|
testThread.unread = false
|
|
MessageStore._onApplyFocusChange()
|
|
advanceClock(500)
|
|
expect(Actions.queueTask).not.toHaveBeenCalled()
|
|
|
|
# This simulates a DB change or some attribute changing on the
|
|
# thread.
|
|
testThread.unread = true
|
|
MessageStore._fetchFromCache()
|
|
advanceClock(500)
|
|
expect(Actions.queueTask).not.toHaveBeenCalled()
|
|
|
|
describe "when toggling expansion of all messages", ->
|
|
beforeEach ->
|
|
MessageStore._items = [testMessage1, testMessage2, testMessage3]
|
|
spyOn(MessageStore, '_fetchExpandedAttachments')
|
|
|
|
it 'should expand all when at default state', ->
|
|
MessageStore._itemsExpanded = {c: 'default'}
|
|
Actions.toggleAllMessagesExpanded()
|
|
expect(MessageStore._itemsExpanded).toEqual a: 'explicit', b: 'explicit', c: 'explicit'
|
|
|
|
it 'should expand all when at least one item is collapsed', ->
|
|
MessageStore._itemsExpanded = {b: 'explicit', c: 'explicit'}
|
|
Actions.toggleAllMessagesExpanded()
|
|
expect(MessageStore._itemsExpanded).toEqual a: 'explicit', b: 'explicit', c: 'explicit'
|
|
|
|
it 'should collapse all except the latest message when all expanded', ->
|
|
MessageStore._itemsExpanded = {a: 'explicit', b: 'explicit', c: 'explicit'}
|
|
Actions.toggleAllMessagesExpanded()
|
|
expect(MessageStore._itemsExpanded).toEqual c: 'explicit'
|