~divmod-dev/divmod.org/remove-third-level-2038

« back to all changes in this revision

Viewing changes to Quotient/xquotient/test/test_message.py

  • Committer: moe
  • Date: 2007-03-26 13:47:56 UTC
  • Revision ID: svn-v4:866e43f7-fbfc-0310-8f2a-ec88d1da2979:trunk:11894
merge msg-detail-actions-1373-8.  splits message detail actions UI into a separate fragment.  author: moe, reviewer: exarkun.  closes #1373

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
from axiom.item import Item
7
7
from axiom.attributes import text, inmemory, AND
8
8
from axiom.dependency import installOn
 
9
from axiom.userbase import LoginMethod
9
10
 
10
11
from nevow.testutil import AccumulatingFakeRequest as makeRequest
11
12
from nevow.test.test_rend import deferredRender
18
19
                              _addMessageSource, getMessageSources,
19
20
                              MessageSourceFragment, SENDER_RELATION,
20
21
                              MessageDisplayPreferenceCollection,
21
 
                              MessageBodyFragment)
 
22
                              MessageBodyFragment, Correspondent,
 
23
                              REPLIED_STATUS)
22
24
 
23
25
from xquotient.quotientapp import QuotientPreferenceCollection
24
 
from xquotient import mimeutil
 
26
from xquotient import mimeutil, smtpout, inbox, compose
25
27
from xquotient.actions import SenderPersonFragment
26
28
from xquotient.test.util import (MIMEReceiverMixin, PartMaker,
27
29
                                 DummyMessageImplWithABunchOfAddresses)
28
 
from xquotient.exmess import Correspondent
 
30
from xquotient.test.test_inbox import testMessageFactory
 
31
from xquotient.mimepart import Header, MIMEPart
 
32
 
 
33
 
 
34
class ComposeActionsTestCase(TestCase):
 
35
    """
 
36
    Tests for the compose-related actions of L{xquotient.exmess.MessageDetail}
 
37
    (reply, forward, etc) and related functionality
 
38
    """
 
39
 
 
40
    def setUp(self):
 
41
        self.store = Store()
 
42
 
 
43
        LoginMethod(store=self.store, internal=False, protocol=u'email',
 
44
                localpart=u'recipient', domain=u'host', verified=True,
 
45
                account=self.store)
 
46
 
 
47
        fromAddr = smtpout.FromAddress(
 
48
            address=u'recipient@host', store=self.store)
 
49
        installOn(inbox.Inbox(store=self.store), self.store)
 
50
        installOn(compose.Composer(store=self.store), self.store)
 
51
 
 
52
        self.msg = testMessageFactory(
 
53
                    store=self.store,
 
54
                    spam=False,
 
55
                    impl=DummyMessageImplWithABunchOfAddresses(store=self.store))
 
56
        installOn(self.msg, self.store)
 
57
        self.msgDetail = MessageDetail(self.msg)
 
58
 
 
59
    def _recipientsToStrings(self, recipients):
 
60
        """
 
61
        Convert a mapping of "strings to lists of
 
62
        L{xquotient.mimeutil.EmailAddress} instances" into a mapping of
 
63
        "strings to lists of string email addresses"
 
64
        """
 
65
        result = {}
 
66
        for (k, v) in recipients.iteritems():
 
67
            result[k] = list(e.email for e in v)
 
68
        return result
 
69
 
 
70
    def test_replyToAll(self):
 
71
        """
 
72
        Test L{xquotient.exmess.MessageDetail.replyAll}
 
73
        """
 
74
        self.assertEquals(
 
75
            self._recipientsToStrings(
 
76
                self.msgDetail.replyAll().recipients),
 
77
            {'bcc': ['blind-copy@host'],
 
78
             'cc': ['copy@host'],
 
79
             'to': ['sender@host', 'recipient2@host']})
 
80
 
 
81
 
 
82
    def test_replyToAllFromAddress(self):
 
83
        """
 
84
        Test that L{xquotient.exmess.MessageDetail.replyAll} doesn't include
 
85
        addresses of L{xquotient.smtpout.FromAddress} items that exist in the
 
86
        same store as the message that is being replied to
 
87
        """
 
88
        addrs = set(u'blind-copy@host copy@host sender@host recipient2@host'.split())
 
89
        for addr in addrs:
 
90
            fromAddr = smtpout.FromAddress(address=addr, store=self.msg.store)
 
91
            gotAddrs = set()
 
92
            for l in self.msgDetail.replyAll().recipients.itervalues():
 
93
                gotAddrs.update(e.email for e in l)
 
94
            self.assertEquals(
 
95
                gotAddrs,
 
96
                addrs - set([addr]))
 
97
            fromAddr.deleteFromStore()
 
98
 
 
99
 
 
100
 
 
101
class MoreComposeActionsTestCase(TestCase):
 
102
    """
 
103
    Test compose-action related stuff that requires an on-disk store.
 
104
    """
 
105
 
 
106
    def setUp(self):
 
107
        self.store = Store(dbdir=self.mktemp())
 
108
 
 
109
        installOn(inbox.Inbox(store=self.store), self.store)
 
110
        self.composer = compose.Composer(store=self.store)
 
111
        installOn(self.composer, self.store)
 
112
 
 
113
        LoginMethod(store=self.store, internal=False, protocol=u'email',
 
114
                localpart=u'recipient', domain=u'host', verified=True,
 
115
                account=self.store)
 
116
 
 
117
        self.msg = testMessageFactory(
 
118
                    store=self.store,
 
119
                    spam=False,
 
120
                    impl=DummyMessageImplWithABunchOfAddresses(store=self.store))
 
121
        self.msgDetail = MessageDetail(self.msg)
 
122
 
 
123
 
 
124
 
 
125
    def test_setStatus(self):
 
126
        """
 
127
        Test that statuses requested for parent messages get set after
 
128
        the created message is sent.
 
129
        """
 
130
        self.composer.__dict__['sendMessage'] = lambda fromA, toA, msg: None
 
131
        class MsgStub:
 
132
            impl = MIMEPart()
 
133
            statuses = None
 
134
            def addStatus(self, status):
 
135
                if self.statuses is None:
 
136
                    self.statuses = [status]
 
137
                else:
 
138
                    self.statuses.append(status)
 
139
 
 
140
        parent = MsgStub()
 
141
        parent.impl.headers = [Header("message-id", "<msg99@example.com>"),
 
142
                               Header("references", "<msg98@example.com>"),
 
143
                               Header("references", "<msg97@example.com>")]
 
144
 
 
145
        toAddresses = [mimeutil.EmailAddress(
 
146
            'testuser@example.com',
 
147
            mimeEncoded=False)]
 
148
        cf = self.msgDetail._composeSomething(
 
149
            toAddresses,
 
150
            u'Sup dood', u'A body', [], parent, REPLIED_STATUS)
 
151
        cf._sendOrSave(self.store.findFirst(smtpout.FromAddress),
 
152
                       toAddresses, u'Sup dood', u'A body',
 
153
                       [], [], [], False)
 
154
        self.assertEqual(parent.statuses, [REPLIED_STATUS])
 
155
 
 
156
 
29
157
 
30
158
class UtilityTestCase(TestCase):
31
159
    """