React = require "react/addons" ReactTestUtils = React.addons.TestUtils _ = require 'underscore' {AccountStore, Thread, Contact, Message} = require 'nylas-exports' ThreadListParticipants = require '../lib/thread-list-participants' describe "ThreadListParticipants", -> it "renders into the document", -> @participants = ReactTestUtils.renderIntoDocument( ) expect(ReactTestUtils.isCompositeComponentWithType(@participants, ThreadListParticipants)).toBe true it "renders unread contacts with .unread-true", -> ben = new Contact(email: 'ben@nylas.com', name: 'ben') ben.unread = true thread = new Thread() thread.metadata = [new Message(from: [ben], unread:true)] @participants = ReactTestUtils.renderIntoDocument( ) unread = ReactTestUtils.scryRenderedDOMComponentsWithClass(@participants, 'unread-true') expect(unread.length).toBe(1) describe "getParticipants", -> beforeEach -> @ben = new Contact(email: 'ben@nylas.com', name: 'ben') @evan = new Contact(email: 'evan@nylas.com', name: 'evan') @evanAgain = new Contact(email: 'evan@nylas.com', name: 'evan') @michael = new Contact(email: 'michael@nylas.com', name: 'michael') @kavya = new Contact(email: 'kavya@nylas.com', name: 'kavya') @phab1 = new Contact(email: 'no-reply@phab.nylas.com', name: 'Ben') @phab2 = new Contact(email: 'no-reply@phab.nylas.com', name: 'MG') describe "when thread.messages is available", -> it "correctly produces items for display in a wide range of scenarios", -> scenarios = [{ name: 'single read email' in: [ new Message(unread: false, from: [@ben]), ] out: [{contact: @ben, unread: false}] },{ name: 'single read email and draft' in: [ new Message(unread: false, from: [@ben]), new Message(from: [@ben], draft: true), ] out: [{contact: @ben, unread: false}] },{ name: 'single unread email' in: [ new Message(unread: true, from: [@evan]), ] out: [{contact: @evan, unread: true}] },{ name: 'single unread response' in: [ new Message(unread: false, from: [@ben]), new Message(unread: true, from: [@evan]), ] out: [{contact: @ben, unread: false}, {contact: @evan, unread: true}] },{ name: 'two unread responses' in: [ new Message(unread: false, from: [@ben]), new Message(unread: true, from: [@evan]), new Message(unread: true, from: [@kavya]), ] out: [{contact: @ben, unread: false}, {contact: @evan, unread: true}, {contact: @kavya, unread: true}] },{ name: 'two unread responses (repeated participants)' in: [ new Message(unread: false, from: [@ben]), new Message(unread: true, from: [@evan]), new Message(unread: true, from: [@evanAgain]), ] out: [{contact: @ben, unread: false}, {contact: @evan, unread: true}] },{ name: 'three unread responses (repeated participants)' in: [ new Message(unread: false, from: [@ben]), new Message(unread: true, from: [@evan]), new Message(unread: true, from: [@michael]), new Message(unread: true, from: [@evanAgain]), ] out: [{contact: @ben, unread: false}, {spacer: true}, {contact: @michael, unread: true}, {contact: @evanAgain, unread: true}] },{ name: 'three unread responses' in: [ new Message(unread: false, from: [@ben]), new Message(unread: true, from: [@evan]), new Message(unread: true, from: [@michael]), new Message(unread: true, from: [@kavya]), ] out: [{contact: @ben, unread: false}, {spacer: true}, {contact: @michael, unread: true}, {contact: @kavya, unread: true}] },{ name: 'three unread responses to long thread' in: [ new Message(unread: false, from: [@ben]), new Message(unread: false, from: [@evan]), new Message(unread: false, from: [@michael]), new Message(unread: false, from: [@ben]), new Message(unread: true, from: [@evanAgain]), new Message(unread: true, from: [@michael]), new Message(unread: true, from: [@evanAgain]), ] out: [{contact: @ben, unread: false}, {spacer: true}, {contact: @michael, unread: true}, {contact: @evanAgain, unread: true}] },{ name: 'single unread responses to long thread' in: [ new Message(unread: false, from: [@ben]), new Message(unread: false, from: [@evan]), new Message(unread: false, from: [@michael]), new Message(unread: false, from: [@ben]), new Message(unread: true, from: [@evanAgain]), ] out: [{contact: @ben, unread: false}, {spacer: true}, {contact: @ben, unread: false}, {contact: @evanAgain, unread: true}] },{ name: 'long read thread' in: [ new Message(unread: false, from: [@ben]), new Message(unread: false, from: [@evan]), new Message(unread: false, from: [@michael]), new Message(unread: false, from: [@ben]), ] out: [{contact: @ben, unread: false}, {spacer: true}, {contact: @michael, unread: false}, {contact: @ben, unread: false}] },{ name: 'thread with different participants with the same email address' in: [ new Message(unread: false, from: [@phab1]), new Message(unread: false, from: [@phab2]) ] out: [{contact: @phab1, unread: false}, {contact: @phab2, unread: false}] }] for scenario in scenarios thread = new Thread() thread.metadata = scenario.in participants = ReactTestUtils.renderIntoDocument( ) expect(participants.getParticipants()).toEqual(scenario.out) # Slightly misuse jasmine to get the output we want to show if (!_.isEqual(participants.getParticipants(), scenario.out)) expect(scenario.name).toBe('correct') describe "when getParticipants() called and current user is only sender", -> beforeEach -> @me = AccountStore.current().me() @ben = new Contact(email: 'ben@nylas.com', name: 'ben') @evan = new Contact(email: 'evan@nylas.com', name: 'evan') @evanCapitalized = new Contact(email: 'EVAN@nylas.com', name: 'evan') @michael = new Contact(email: 'michael@nylas.com', name: 'michael') @kavya = new Contact(email: 'kavya@nylas.com', name: 'kavya') getParticipants = (threadMetadata) -> thread = new Thread() thread.metadata = threadMetadata participants = ReactTestUtils.renderIntoDocument( ) participants.getParticipants() it "shows only recipients for emails sent from me to different recipients", -> input = [new Message(unread: false, from: [@me], to: [@ben]) new Message(unread: false, from: [@me], to: [@evan]) new Message(unread: false, from: [@me], to: [@ben])] actualOut = getParticipants input expectedOut = [{contact: @ben, unread: false} {contact: @evan, unread: false} {contact: @ben, unread: false}] expect(actualOut).toEqual expectedOut it "is case insensitive", -> input = [new Message(unread: false, from: [@me], to: [@evan]) new Message(unread: false, from: [@me], to: [@evanCapitalized])] actualOut = getParticipants input expectedOut = [{contact: @evan, unread: false}] expect(actualOut).toEqual expectedOut it "shows only first, spacer, second to last, and last recipients if recipients count > 3", -> input = [new Message(unread: false, from: [@me], to: [@ben]) new Message(unread: false, from: [@me], to: [@evan]) new Message(unread: false, from: [@me], to: [@michael]) new Message(unread: false, from: [@me], to: [@kavya])] actualOut = getParticipants input expectedOut = [{contact: @ben, unread: false} {spacer: true} {contact: @michael, unread: false} {contact: @kavya, unread: false}] expect(actualOut).toEqual expectedOut it "shows correct recipients even if only one email", -> input = [new Message(unread: false, from: [@me], to: [@ben, @evan, @michael, @kavya])] actualOut = getParticipants input expectedOut = [{contact: @ben, unread: false} {spacer: true} {contact: @michael, unread: false} {contact: @kavya, unread: false}] expect(actualOut).toEqual expectedOut it "shows only one recipient if the sender only sent to one recipient", -> input = [new Message(unread: false, from: [@me], to: [@evan]) new Message(unread: false, from: [@me], to: [@evan]) new Message(unread: false, from: [@me], to: [@evan]) new Message(unread: false, from: [@me], to: [@evan])] actualOut = getParticipants input expectedOut = [{contact: @evan, unread: false}] expect(actualOut).toEqual expectedOut it "shows only the recipient for one sent email", -> input = [new Message(unread: false, from: [@me], to: [@evan])] actualOut = getParticipants input expectedOut = [{contact: @evan, unread: false}] expect(actualOut).toEqual expectedOut it "shows unread email as well", -> input = [new Message(unread: false, from: [@me], to: [@evan]) new Message(unread: false, from: [@me], to: [@ben]) new Message(unread: true, from: [@me], to: [@kavya]) new Message(unread: true, from: [@me], to: [@michael])] actualOut = getParticipants input expectedOut = [{contact: @evan, unread: false}, {spacer: true}, {contact: @kavya, unread: true}, {contact: @michael, unread: true}] expect(actualOut).toEqual expectedOut describe "when thread.messages is not available", -> it "correctly produces items for display in a wide range of scenarios", -> me = AccountStore.current().me() scenarios = [{ name: 'one participant' in: [@ben] out: [{contact: @ben, unread: false}] },{ name: 'one participant (me)' in: [me] out: [{contact: me, unread: false}] },{ name: 'two participants' in: [@evan, @ben] out: [{contact: @evan, unread: false}, {contact: @ben, unread: false}] },{ name: 'two participants (me)' in: [@ben, me] out: [{contact: @ben, unread: false}] },{ name: 'lots of participants' in: [@ben, @evan, @michael, @kavya] out: [{contact: @ben, unread: false}, {spacer: true}, {contact: @michael, unread: false}, {contact: @kavya, unread: false}] }] for scenario in scenarios thread = new Thread() thread.participants = scenario.in participants = ReactTestUtils.renderIntoDocument( ) expect(participants.getParticipants()).toEqual(scenario.out) # Slightly misuse jasmine to get the output we want to show if (!_.isEqual(participants.getParticipants(), scenario.out)) expect(scenario.name).toBe('correct')