diff options
author | David Rousselie <dax@happycoders.org> | 2008-03-07 14:09:59 +0300 |
---|---|---|
committer | David Rousselie <dax@happycoders.org> | 2008-03-07 14:09:59 +0300 |
commit | 9f4768a96d128a2b397335a811d641d956f945e9 (patch) | |
tree | af1e8b742c552b62865610098c28df0926524252 | |
parent | 392169732f1d50e3be968f1d2038b5411f7590b5 (diff) |
Finish 'get-email' ad-hoc command implementation
Support browsing emails through multiple pages
Handle error in get-email command
darcs-hash:20080307110959-86b55-5657eb6fa1e38bee46cfcc8b7482ffff16963ec6.gz
-rw-r--r-- | src/jmc/jabber/command.py | 77 | ||||
-rw-r--r-- | src/jmc/jabber/tests/command.py | 182 | ||||
-rw-r--r-- | src/jmc/jabber/tests/component.py | 24 |
3 files changed, 224 insertions, 59 deletions
diff --git a/src/jmc/jabber/command.py b/src/jmc/jabber/command.py index 67d6003..561b881 100644 --- a/src/jmc/jabber/command.py +++ b/src/jmc/jabber/command.py @@ -27,7 +27,7 @@ from pyxmpp.jabber.dataforms import Form import jcl.model.account as account import jcl.jabber.command as command -from jcl.jabber.command import JCLCommandManager +from jcl.jabber.command import JCLCommandManager, CommandError from jmc.model.account import MailAccount from jmc.jabber.feeder import MailSender @@ -58,8 +58,6 @@ class MailCommandManager(JCLCommandManager): self.add_actions(command_node, [command.ACTION_NEXT]) bare_from_jid = info_query.get_from().bare() account_name = info_query.get_to().node - print str(bare_from_jid) - print str(account_name) _account = account.get_account(bare_from_jid, account_name, MailAccount) if _account is not None: @@ -122,42 +120,60 @@ class MailCommandManager(JCLCommandManager): execute_force_check_2 = execute_force_check_1 - def execute_get_email_1(self, info_query, session_context, - command_node, lang_class): + def execute_get_email(self, info_query, session_context, + command_node, lang_class): self.__logger.debug("Executing command 'get-email' step 1") - self.add_actions(command_node, [command.ACTION_COMPLETE]) - bare_from_jid = info_query.get_from().bare() - account_name = info_query.get_to().node - _account = account.get_account(bare_from_jid, account_name) - if _account is not None: - result_form = Form(\ - xmlnode_or_type="form", - title=lang_class.command_get_email, - instructions=lang_class.command_get_email_1_description) - email_list = _account.get_mail_list_summary() - field = result_form.add_field(name="emails", - field_type="list-multi", - label=lang_class.field_email_subject) - for (email_index, email_subject) in email_list: - field.add_option(label=email_subject, values=[email_index]) - result_form.add_field(name="fetch_more", - field_type="boolean", - label=lang_class.field_select_more_emails) - result_form.as_xml(command_node) - return (result_form, []) + if "fetch_more" in session_context \ + and session_context["fetch_more"][-1] == "0": + return self.execute_get_email_last(info_query, session_context, + command_node, lang_class) else: - # TODO Error - return (None, []) + self.add_actions(command_node, [command.ACTION_COMPLETE]) + bare_from_jid = info_query.get_from().bare() + account_name = info_query.get_to().node + _account = account.get_account(bare_from_jid, account_name) + if _account is not None: + result_form = Form(\ + xmlnode_or_type="form", + title=lang_class.command_get_email, + instructions=lang_class.command_get_email_1_description) + if not "start_index" in session_context: + session_context["start_index"] = 1 + self.__logger.debug("Checking email list summary from index " + + str(session_context["start_index"]) + " to " + + str(session_context["start_index"] + 10)) + _account.connect() + email_list = _account.get_mail_list_summary(\ + start_index=session_context["start_index"], + end_index=session_context["start_index"] + 9) + _account.disconnect() + session_context["start_index"] += 10 + field = result_form.add_field(name="emails", + field_type="list-multi", + label=lang_class.field_email_subject) + for (email_index, email_subject) in email_list: + field.add_option(label=email_subject, values=[email_index]) + if len(email_list) == 10: + result_form.add_field(name="fetch_more", + field_type="boolean", + label=lang_class.field_select_more_emails) + else: + session_context["fetch_more"] = ["0"] + result_form.as_xml(command_node) + return (result_form, []) + else: + raise CommandError("item-not-found") - def execute_get_email_2(self, info_query, session_context, - command_node, lang_class): - self.__logger.debug("Executing command 'get-email' step 2") + def execute_get_email_last(self, info_query, session_context, + command_node, lang_class): + self.__logger.debug("Executing command 'get-email' last step") result = [] mail_sender = MailSender(self.component) bare_from_jid = info_query.get_from().bare() account_name = info_query.get_to().node _account = account.get_account(bare_from_jid, account_name) if _account is not None: + _account.connect() for email_index in session_context["emails"]: (email_body, email_from) = _account.get_mail(email_index) result.append(\ @@ -166,6 +182,7 @@ class MailCommandManager(JCLCommandManager): lang_class.mail_subject % (email_from), email_body, _account)) + _account.disconnect() result_form = Form(\ xmlnode_or_type="form", title=lang_class.command_get_email, diff --git a/src/jmc/jabber/tests/command.py b/src/jmc/jabber/tests/command.py index aff299f..372d745 100644 --- a/src/jmc/jabber/tests/command.py +++ b/src/jmc/jabber/tests/command.py @@ -228,31 +228,51 @@ class MailCommandManagerGetEmailCommand_TestCase(MailCommandManagerTestCase): def check_step_1(self, result, options="<option label=\"mail 1\">" \ + "<value>1</value></option>" \ + "<option label=\"mail 2\">" \ - + "<value>2</value></option>"): + + "<value>2</value></option>" \ + + "<option label=\"mail 3\">" \ + + "<value>3</value></option>" \ + + "<option label=\"mail 4\">" \ + + "<value>4</value></option>" \ + + "<option label=\"mail 5\">" \ + + "<value>5</value></option>" \ + + "<option label=\"mail 6\">" \ + + "<value>6</value></option>" \ + + "<option label=\"mail 7\">" \ + + "<value>7</value></option>" \ + + "<option label=\"mail 8\">" \ + + "<value>8</value></option>" \ + + "<option label=\"mail 9\">" \ + + "<value>9</value></option>" \ + + "<option label=\"mail 10\">" \ + + "<value>10</value></option>", + last_page=False): """ Check first step result of get-email ad-hoc command """ result_iq = result[0].xmlnode result_iq.setNs(None) - self.assertTrue(jcl.tests.is_xml_equal(\ - u"<iq from='account11@" + unicode(self.comp.jid) - + "' to='test1@test.com' type='result'>" - + "<command xmlns='http://jabber.org/protocol/commands'" - + "status='executing'>" - + "<actions execute='complete'><complete/></actions>" - + "<x xmlns='jabber:x:data' type='form'>" - + "<title>" + Lang.en.command_get_email + "</title>" - + "<instructions>" + Lang.en.command_get_email_1_description - + "</instructions>" - + "<field var='emails' type='list-multi' label='" - + Lang.en.field_email_subject + "'>" - + options - + "</field><field var='fetch_more' type='boolean' label='" + xml_ref = u"<iq from='account11@" + unicode(self.comp.jid) \ + + "' to='test1@test.com' type='result'>" \ + + "<command xmlns='http://jabber.org/protocol/commands'" \ + + "status='executing'>" \ + + "<actions execute='complete'><complete/></actions>" \ + + "<x xmlns='jabber:x:data' type='form'>" \ + + "<title>" + Lang.en.command_get_email + "</title>" \ + + "<instructions>" + Lang.en.command_get_email_1_description \ + + "</instructions>" \ + + "<field var='emails' type='list-multi' label='" \ + + Lang.en.field_email_subject + "'>" \ + + options + if not last_page: + xml_ref += "</field><field var='fetch_more' type='boolean' label='" \ + Lang.en.field_select_more_emails + "'>" - + "</field></x></command></iq>", - result_iq, True)) + xml_ref += "</field></x></command></iq>" + self.assertTrue(jcl.tests.is_xml_equal(xml_ref, result_iq, True)) session_id = result_iq.children.prop("sessionid") self.assertNotEquals(session_id, None) + self.assertTrue(self.account11.has_connected) + self.assertFalse(self.account11.connected) + self.account11.has_connected = False return session_id def check_email_message(self, result_iq, index): @@ -271,7 +291,7 @@ class MailCommandManagerGetEmailCommand_TestCase(MailCommandManagerTestCase): + "</addresses>" + "</message>", result_iq, True, test_sibling=False)) - + def test_execute_get_email(self): """ Test single email retrieval @@ -301,6 +321,8 @@ class MailCommandManagerGetEmailCommand_TestCase(MailCommandManagerTestCase): info_query, "jmc#get-email", "execute") + self.assertTrue(self.account11.has_connected) + self.assertFalse(self.account11.connected) self.assertEquals(len(result), 2) result_iq = result[0].xmlnode result_iq.setNs(None) @@ -347,6 +369,8 @@ class MailCommandManagerGetEmailCommand_TestCase(MailCommandManagerTestCase): info_query, "jmc#get-email", "execute") + self.assertTrue(self.account11.has_connected) + self.assertFalse(self.account11.connected) self.assertEquals(len(result), 3) result_iq = result[0].xmlnode result_iq.setNs(None) @@ -395,10 +419,26 @@ class MailCommandManagerGetEmailCommand_TestCase(MailCommandManagerTestCase): info_query, "jmc#get-email", "execute") - self.check_step_1(result, options="<option label=\"mail 3\">" \ - + "<value>3</value></option>" \ - + "<option label=\"mail 4\">" \ - + "<value>4</value></option>") + self.check_step_1(result, options="<option label=\"mail 11\">" \ + + "<value>11</value></option>" \ + + "<option label=\"mail 12\">" \ + + "<value>12</value></option>" \ + + "<option label=\"mail 13\">" \ + + "<value>13</value></option>" \ + + "<option label=\"mail 14\">" \ + + "<value>14</value></option>" \ + + "<option label=\"mail 15\">" \ + + "<value>15</value></option>" \ + + "<option label=\"mail 16\">" \ + + "<value>16</value></option>" \ + + "<option label=\"mail 17\">" \ + + "<value>17</value></option>" \ + + "<option label=\"mail 18\">" \ + + "<value>18</value></option>" \ + + "<option label=\"mail 19\">" \ + + "<value>19</value></option>" \ + + "<option label=\"mail 20\">" \ + + "<value>20</value></option>") # Third step info_query = jcl.jabber.tests.command.prepare_submit(\ @@ -408,7 +448,7 @@ class MailCommandManagerGetEmailCommand_TestCase(MailCommandManagerTestCase): to_jid="account11@jmc.test.com", fields=[Field(field_type="list-multi", name="emails", - values=["3", "4"]), + values=["13", "14"]), Field(field_type="boolean", name="fetch_more", value=False)], @@ -417,6 +457,8 @@ class MailCommandManagerGetEmailCommand_TestCase(MailCommandManagerTestCase): info_query, "jmc#get-email", "execute") + self.assertTrue(self.account11.has_connected) + self.assertFalse(self.account11.connected) self.assertEquals(len(result), 5) result_iq = result[0].xmlnode result_iq.setNs(None) @@ -436,9 +478,99 @@ class MailCommandManagerGetEmailCommand_TestCase(MailCommandManagerTestCase): result_iq = result[2].xmlnode self.check_email_message(result_iq, 2) result_iq = result[3].xmlnode - self.check_email_message(result_iq, 3) + self.check_email_message(result_iq, 13) result_iq = result[4].xmlnode - self.check_email_message(result_iq, 4) + self.check_email_message(result_iq, 14) + + def test_execute_get_emails_last_page(self): + """ + Test that field fetch_more does not exist if number of emails < 10 + """ + class MockIMAPAccount2(MockIMAPAccount): + """ """ + def get_mail_list_summary(self, start_index=1, end_index=20): + return [("1", "mail 1"), + ("2", "mail 2")] + + get_email_func = self.account11.get_mail + MockIMAPAccount2.createTable(ifNotExists=True) + self.account11.destroySelf() + self.account11 = MockIMAPAccount2(user=self.user1, + name="account11", + jid="account11@" + unicode(self.comp.jid)) + self.account11.__dict__["get_mail"] = get_email_func + self.info_query.set_from("test1@test.com") + self.info_query.set_to("account11@" + unicode(self.comp.jid)) + result = self.command_manager.apply_command_action(\ + self.info_query, + "jmc#get-email", + "execute") + session_id = self.check_step_1(result, options="<option label=\"mail 1\">" \ + + "<value>1</value></option>" \ + + "<option label=\"mail 2\">" \ + + "<value>2</value></option>", + last_page=True) + self.assertTrue("fetch_more" in + self.command_manager.sessions[session_id][1]) + self.assertEquals(\ + self.command_manager.sessions[session_id][1]["fetch_more"][-1], + "0") + + # Second step + info_query = jcl.jabber.tests.command.prepare_submit(\ + node="jmc#get-email", + session_id=session_id, + from_jid="test1@test.com", + to_jid="account11@jmc.test.com", + fields=[Field(field_type="list-multi", + name="emails", + values=["1"])], + action="complete") + result = self.command_manager.apply_command_action(\ + info_query, + "jmc#get-email", + "execute") + self.assertTrue(self.account11.has_connected) + self.assertFalse(self.account11.connected) + self.assertEquals(len(result), 2) + result_iq = result[0].xmlnode + result_iq.setNs(None) + self.assertTrue(jcl.tests.is_xml_equal(\ + u"<iq from='account11@" + unicode(self.comp.jid) + + "' to='test1@test.com' type='result'>" + + "<command xmlns='http://jabber.org/protocol/commands' " + + "status='completed'>" + + "<x xmlns='jabber:x:data' type='form'>" + + "<title>" + Lang.en.command_get_email + "</title>" + + "<instructions>" + Lang.en.command_get_email_2_description + % (1) + "</instructions>" + + "</x></command></iq>", + result_iq, True, test_sibling=False)) + result_iq = result[1].xmlnode + self.check_email_message(result_iq, 1) + MockIMAPAccount2.dropTable(ifExists=True) + + def test_execute_get_email_error(self): + """ + Test single email retrieval + """ + self.info_query.set_from("test1@test.com") + self.info_query.set_to("unknown@" + unicode(self.comp.jid)) + result = self.command_manager.apply_command_action(\ + self.info_query, + "jmc#get-email", + "execute") + result_iq = result[0].xmlnode + self.assertTrue(jcl.tests.is_xml_equal(\ + u"<iq from='unknown@" + unicode(self.comp.jid) + + "' to='test1@test.com' type='error' " + + "xmlns='http://pyxmpp.jabberstudio.org/xmlns/common'>" + + "<command xmlns='http://jabber.org/protocol/commands' " + + "node='jmc#get-email' />" + + "<error type='cancel'>" + + "<item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas' />" + + "</error></iq>", + result_iq, True)) def suite(): test_suite = unittest.TestSuite() diff --git a/src/jmc/jabber/tests/component.py b/src/jmc/jabber/tests/component.py index cfaa61a..edcee63 100644 --- a/src/jmc/jabber/tests/component.py +++ b/src/jmc/jabber/tests/component.py @@ -156,14 +156,30 @@ class MockIMAPAccount(MockMailAccount, IMAPAccount): return [("1", "mail 1"), ("2", "mail 2")] - def get_mail_list_summary(self): + def get_mail_list_summary(self, start_index=1, end_index=20): if self.get_mail_list_summary_called: - return [("3", "mail 3"), - ("4", "mail 4")] + return [("11", "mail 11"), + ("12", "mail 12"), + ("13", "mail 13"), + ("14", "mail 14"), + ("15", "mail 15"), + ("16", "mail 16"), + ("17", "mail 17"), + ("18", "mail 18"), + ("19", "mail 19"), + ("20", "mail 20")] else: self.get_mail_list_summary_called = True return [("1", "mail 1"), - ("2", "mail 2")] + ("2", "mail 2"), + ("3", "mail 3"), + ("4", "mail 4"), + ("5", "mail 5"), + ("6", "mail 6"), + ("7", "mail 7"), + ("8", "mail 8"), + ("9", "mail 9"), + ("10", "mail 10")] class MockPOP3Account(MockMailAccount, POP3Account): |