class TestXmlDeserializer(TestCase):

    def __init__(self, methodName='runTest'):
        super(TestXmlDeserializer, self).__init__(methodName)
        self._deserializer = XmlDeserializer()

    def test_simple_object(self):
        source = '<simple_object><id>666</id><data>IDDQD</data></simple_object>'
        expected = TestXmlDeserializer.SimpleObject(666, 'IDDQD')
        actual = self._deserializer.deserialize(TestXmlDeserializer.SimpleObject, source)
        self._check_simple_object(expected, actual)

    def test_bad_simple_object_source(self):
        source = '<simple_object id="666"><data>IDDQD</data></simple_object>'
        self.assertRaises(TypeError, lambda: self._deserializer.deserialize(TestXmlDeserializer.SimpleObject, source))

    def test_data_packet_with_single_item(self):
        source = '<data_packet user_id="83cf01c6-2284-11e2-9494-08002703af71">' +\
                 '<data_item><source>source1</source><category>cat1</category><timemarker>2012-12-21 23:59:59</timemarker><data>IDDQD</data></data_item>' +\
                 '</data_packet>'
        expected = StatDataPacket(uuid.UUID('83cf01c6-2284-11e2-9494-08002703af71'),
            [StatDataItem('source1', 'cat1', str_2_time('2012-12-21 23:59:59'), 'IDDQD')])
        actual = self._deserializer.deserialize(StatDataPacket, source)
        check_stat_data_packet(self, expected, actual)

    def test_data_packet_with_several_item(self):
        source = '<data_packet user_id="83cf01c6-2284-11e2-9494-08002703af71">' +\
                 '<data_item><source>source1</source><category>cat1</category><timemarker>2012-12-21 23:59:59</timemarker><data>IDDQD</data></data_item>' +\
                 '<data_item><source>source2</source><category>cat2</category><timemarker>2013-01-01 11:11:11</timemarker><data>IDKFA</data></data_item>' +\
                 '</data_packet>'
        expected = StatDataPacket(uuid.UUID('83cf01c6-2284-11e2-9494-08002703af71'),
            [StatDataItem('source1', 'cat1', str_2_time('2012-12-21 23:59:59'), 'IDDQD'),
             StatDataItem('source2', 'cat2', str_2_time('2013-01-01 11:11:11'), 'IDKFA')])
        actual = self._deserializer.deserialize(StatDataPacket, source)
        check_stat_data_packet(self, expected, actual)

    class SimpleObject(object):

        def __init__(self, id=None, data=None):
            self._id = id
            self._data = data

        @property
        def id(self):
            return self._id

        @id.setter
        def id(self, value):
            self._id = value

        @property
        def data(self):
            return self._data

        @data.setter
        def data(self, value):
            self._data = value

        @staticmethod
        def create(internal_repr):
            body = internal_repr['simple_object']
            id = int(body['id'][''])
            data = body['data']['']
            return TestXmlDeserializer.SimpleObject(id, data)

    # spec: SimpleObject, SimpleObject -> None
    def _check_simple_object(self, expected, actual):
        self.assertIsNotNone(actual)
        self.assertEqual(expected.id, actual.id)
        self.assertEqual(expected.data, actual.data)
 def __init__(self, methodName='runTest'):
     super(TestXmlDeserializer, self).__init__(methodName)
     self._deserializer = XmlDeserializer()