import cStringIO
from twisted.spread import pb
from twisted.trial import unittest
from twisted.test import proto_helpers

class Document(pb.Root):

    def remote_convert(self, props):
        self.props = props


class DocTestCase(unittest.TestCase):

    def setUp(self):
        self.doc = Document()
        factory = pb.PBServerFactory(self.doc)
        self.broker = factory.buildProtocol(('127.0.0.1', 0))

        self.props = {'name': 'MyDoc',
                      'path': '/path/'}

        serialized_props = self.broker.serialize(self.props)
        self.msg = ('message', 1, 'root', 'convert', 1,
                    ['tuple', serialized_props], ['dictionary'])

    def test_convert1(self):
        self.broker.currentDialect = 'pb'
        self.broker.setPrefixLimit(64)
        self.broker.transport = proto_helpers.StringTransport()

        io = cStringIO.StringIO()
        self.broker._encode(self.msg, io.write)
        self.broker.dataReceived(io.getvalue())

        self.assertEqual(self.props, self.doc.props)

    def test_convert2(self):
        self.tr = proto_helpers.StringTransport()
        self.broker.makeConnection(self.tr)

        io = cStringIO.StringIO()
        self.broker._encode(self.msg, io.write)
        self.broker.dataReceived(io.getvalue())

        self.assertEqual(self.props, self.doc.props)