From 86a6df80b0e40855097fcf836cf11bd4808882f6 Mon Sep 17 00:00:00 2001 From: Filipp Lepalaan Date: Mon, 23 Sep 2013 17:35:54 +0300 Subject: Added support for multiple error messages --- gsxws/core.py | 34 +++++++++++++++++++++++++--------- tests/fixtures/multierror.xml | 22 ++++++++++++++++++++++ tests/test_gsxws.py | 19 +++++++++++++++++-- 3 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 tests/fixtures/multierror.xml diff --git a/gsxws/core.py b/gsxws/core.py index 9791850..eaf241d 100644 --- a/gsxws/core.py +++ b/gsxws/core.py @@ -145,23 +145,39 @@ def get_format(locale=GSX_LOCALE): class GsxError(Exception): def __init__(self, message=None, xml=None, url=None): - self.code = "" - self.message = message + self.codes = [] + self.messages = [] if xml is not None: logging.debug(url) logging.debug(xml) - el = ET.fromstring(xml) - self.code = el.findtext("*//faultcode") - self.message = el.findtext("*//faultstring") + root = ET.fromstring(xml) + + for el in root.findall('*//faultcode'): + self.codes.append(el.text) + for el in root.findall('*//faultstring'): + self.messages.append(el.text) + for el in root.findall('*//code'): + self.codes.append(el.text) + for el in root.findall('*//message'): + self.messages.append(el.text) super(Exception, self).__init__(self.message) - def __unicode__(self): - return self.message + @property + def code(self): + return self.codes[0] - def __str__(self): - return self.message + @property + def message(self): + return unicode(self) + + @property + def errors(self): + return dict(zip(self.codes, self.messages)) + + def __unicode__(self): + return u' '.join(self.messages) class GsxCache(object): diff --git a/tests/fixtures/multierror.xml b/tests/fixtures/multierror.xml new file mode 100644 index 0000000..bedb975 --- /dev/null +++ b/tests/fixtures/multierror.xml @@ -0,0 +1,22 @@ + + + + + GSX.SYS.003 + Multiple error messages exist. Please check the detail section. + + iZETtEmzsD82QJs0P1hBgfJ + + + RPR.ONS.025 + This unit is not eligible for an Onsite repair from GSX. + + + RPR.ONS.026 + At least one part should be eligible for Onsite. + + + + + + diff --git a/tests/test_gsxws.py b/tests/test_gsxws.py index 6146a2c..59c0662 100644 --- a/tests/test_gsxws.py +++ b/tests/test_gsxws.py @@ -8,14 +8,29 @@ from unittest import main, skip, TestCase from gsxws.objectify import parse from gsxws.products import Product -from gsxws import repairs, escalations +from gsxws import repairs, escalations, GsxError class RemoteTestCase(TestCase): def setUp(self): from gsxws.core import connect logging.basicConfig(level=logging.DEBUG) - connect(env['GSX_USER'], env['GSX_PASSWORD'], env['GSX_SOLDTO'], env['GSX_ENV']) + connect(env['GSX_USER'], + env['GSX_PASSWORD'], + env['GSX_SOLDTO'], + env['GSX_ENV']) + + +class TestErrorFunctions(TestCase): + def setUp(self): + xml = open('tests/fixtures/multierror.xml', 'r').read() + self.data = GsxError(xml=xml) + + def test_code(self): + self.assertEqual(self.data.errors['RPR.ONS.025'], + 'This unit is not eligible for an Onsite repair from GSX.') + def test_message(self): + self.assertRegexpMatches(self.data.message, 'Multiple error messages exist.') class TestEscalationFunctions(RemoteTestCase): -- cgit v1.2.3