import sys
import time
import threading

from sleekxmpp.test import *
from sleekxmpp.xmlstream import ElementBase


class TestStreamExtendedDisco(SleekTest):

    """
    Test using the XEP-0128 plugin.
    """

    def tearDown(self):
        sys.excepthook = sys.__excepthook__
        self.stream_close()

    def testUsingExtendedInfo(self):
        self.stream_start(mode='client',
                          jid='tester@localhost',
                          plugins=['xep_0030',
                                   'xep_0004',
                                   'xep_0128'])

        form = self.xmpp['xep_0004'].makeForm(ftype='result')
        form.addField(var='FORM_TYPE', ftype='hidden', value='testing')

        info_ns = 'http://jabber.org/protocol/disco#info'
        self.xmpp['xep_0030'].add_identity(node='test',
                                           category='client',
                                           itype='bot')
        self.xmpp['xep_0030'].add_feature(node='test', feature=info_ns)
        self.xmpp['xep_0128'].set_extended_info(node='test', data=form)

        self.recv("""
          <iq type="get" id="test" to="tester@localhost">
            <query xmlns="http://jabber.org/protocol/disco#info"
                   node="test" />
          </iq>
        """)

        self.send("""
          <iq type="result" id="test">
            <query xmlns="http://jabber.org/protocol/disco#info"
                   node="test">
              <identity category="client" type="bot" />
              <feature var="http://jabber.org/protocol/disco#info" />
              <x xmlns="jabber:x:data" type="result">
                <field var="FORM_TYPE" type="hidden">
                  <value>testing</value>
                </field>
              </x>
            </query>
          </iq>
        """)

    def testUsingMultipleExtendedInfo(self):
        self.stream_start(mode='client',
                          jid='tester@localhost',
                          plugins=['xep_0030',
                                   'xep_0004',
                                   'xep_0128'])

        form1 = self.xmpp['xep_0004'].makeForm(ftype='result')
        form1.addField(var='FORM_TYPE', ftype='hidden', value='testing')

        form2 = self.xmpp['xep_0004'].makeForm(ftype='result')
        form2.addField(var='FORM_TYPE', ftype='hidden', value='testing_2')

        info_ns = 'http://jabber.org/protocol/disco#info'
        self.xmpp['xep_0030'].add_identity(node='test',
                                           category='client',
                                           itype='bot')
        self.xmpp['xep_0030'].add_feature(node='test', feature=info_ns)
        self.xmpp['xep_0128'].set_extended_info(node='test', data=[form1, form2])

        self.recv("""
          <iq type="get" id="test" to="tester@localhost">
            <query xmlns="http://jabber.org/protocol/disco#info"
                   node="test" />
          </iq>
        """)

        self.send("""
          <iq type="result" id="test">
            <query xmlns="http://jabber.org/protocol/disco#info"
                   node="test">
              <identity category="client" type="bot" />
              <feature var="http://jabber.org/protocol/disco#info" />
              <x xmlns="jabber:x:data" type="result">
                <field var="FORM_TYPE" type="hidden">
                  <value>testing</value>
                </field>
              </x>
              <x xmlns="jabber:x:data" type="result">
                <field var="FORM_TYPE" type="hidden">
                  <value>testing_2</value>
                </field>
              </x>
            </query>
          </iq>
        """)


suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamExtendedDisco)