Skip to content
Snippets Groups Projects
Commit 4b4c94ab authored by Robert Habermann's avatar Robert Habermann
Browse files

extend tests

parent 48ad7941
No related branches found
No related tags found
No related merge requests found
......@@ -70,7 +70,7 @@ class SessionIDFileError(PyOTRSError):
pass
class TicketDynamicFieldsNoRequestedError(PyOTRSError):
class TicketDynamicFieldsNotRequestedError(PyOTRSError):
pass
......@@ -102,16 +102,12 @@ class Article(object):
"""PyOTRS Article class """
def __init__(self, dct):
self.ArticleID = None
for key, value in dct.items():
logger.debug("Parse Article: {0} <==> {1}".format(key, value))
if isinstance(value, dict):
dct[key] = Article(value)
logger.debug("Parse Article: {0} --> {1}".format(key, value))
self.__dict__ = dct
def __repr__(self):
return "<{0} - ArticleID: todo>".format(self.__class__.__name__)
return "<{0}>".format(self.__class__.__name__)
"""
def __str__(self): # __unicode__ on Python 2
return ""
......@@ -121,24 +117,22 @@ class Article(object):
"""
@classmethod
def create_basic(cls, dct):
""" create basic Article
Args:
dct:
def dummy(cls):
""" dummy data (for testing)
Returns:
"""
_dct = {"Subject": "Dümmy Subject",
"Body": "Hallo Bjørn,\n[kt]\n\n -- The End",
"TimeUnit": 0,
"MimeType": "text/plain",
"Charset": "UTF8"}
return Article(_dct) \
for key, value in dct.items():
logger.debug("Create Basic Article: {0} <==> {1}".format(key, value))
dct.update({key: value})
return Article(dct)
@classmethod
def dummy(cls):
def dummy_force_notify(cls):
""" dummy data (for testing)
Returns:
......@@ -148,7 +142,8 @@ class Article(object):
"Body": "Hallo Bjørn,\n[kt]\n\n -- The End",
"TimeUnit": 0,
"MimeType": "text/plain",
"Charset": "UTF8"}
"Charset": "UTF8",
"ForceNotificationToUserID": [1, 2]}
return Article(_dct)
def to_dct(self):
......@@ -231,7 +226,7 @@ class AttachmentList(object):
yield item
def __repr__(self):
return "<{0}: #{1} item(s)>".format(self.__class__.__name__, len(self.attachment_list))
return "<{0}: {1} item(s)>".format(self.__class__.__name__, len(self.attachment_list))
"""
def __str__(self): # __unicode__ on Python 2
......@@ -274,17 +269,24 @@ class AttachmentList(object):
class DynamicField(object):
"""PyOTRS DynamicFieldDict class """
"""PyOTRS DynamicField class """
def __init__(self, lst=None):
self.lst = lst
def __init__(self, name=None, value=None, dct=None):
if dct:
if name or value:
raise Exception("Please provider either \"dct\" or \"name and value\"")
self.name = dct["Name"]
self.value = dct["Value"]
def __iter__(self):
for item in self.lst:
yield item
else:
if name and value:
self.name = name
self.value = value
else:
raise Exception("Please provider either \"dct\" or \"name and value\"")
def __repr__(self):
return "<{0}: #{1} item(s)>".format(self.__class__.__name__, len(self.lst))
return "<{0}: {1} --> {2} >".format(self.__class__.__name__, self.name, self.value)
"""
def __str__(self): # __unicode__ on Python 2
......@@ -293,21 +295,35 @@ class DynamicField(object):
def __unicode__(self): # __str__ on Python 3
return self.Filename
"""
def to_dct(self):
""" represent DynamicField as dict
Returns: dict
"""
return {"Name": self.name, "Value": self.value}
@classmethod
def dummy(cls):
""" dummy data (for testing)
def dummy1(cls):
""" dummy1 data (for testing)
Returns:
Returns: DynamicField
"""
_lst = [{'Name': 'lastname', 'Value': 'Doe'},
{'Name': 'firstname', 'Value': 'Jane'}]
return DynamicField(_lst)
return DynamicField(name="firstname", value="Jane")
@classmethod
def dummy2(cls):
""" dummy2 data (for testing)
Returns: DynamicField
"""
return DynamicField(dct={'Name': 'lastname', 'Value': 'Doe'})
class DynamicFieldList(object):
"""PyOTRS Attachment class """
"""PyOTRS DynamicFieldList class """
def __init__(self, dynamic_field_dicts=None):
dynamic_field_list = []
if isinstance(dynamic_field_dicts, DynamicField):
......@@ -323,7 +339,7 @@ class DynamicFieldList(object):
yield item
def __repr__(self):
return "<{0}: #{1} item(s)>".format(self.__class__.__name__, len(self.dynamic_field_list))
return "<{0}: {1} item(s)>".format(self.__class__.__name__, len(self.dynamic_field_list))
"""
def __str__(self): # __unicode__ on Python 2
......@@ -351,9 +367,8 @@ class DynamicFieldList(object):
"""
_lst = []
for dynamic_field_dict in self:
for item in dynamic_field_dict:
_lst.append(item)
for dynamic_field in self:
_lst.append(dynamic_field.to_dct())
return {"DynamicField": _lst}
@classmethod
......@@ -363,7 +378,39 @@ class DynamicFieldList(object):
Returns:
"""
return DynamicFieldList(DynamicField.dummy())
return DynamicFieldList([DynamicField(name="firstname", value="Jane"),
DynamicField(dct={'Name': 'lastname', 'Value': 'Doe'})])
@classmethod
def parse_dynamic_field_list_from_response(cls, response):
""" Parses dynamic fields from response
Args:
response (object):
Raises:
TicketDynamicFieldsNoRequestedError
TicketDynamicFieldsParseError
Returns:
DynamicFieldList: List containing parsed DynamicField objects
"""
raise NotImplementedError("copied but not fixed! ")
ticket_dynamic_fields = {}
try:
df_name_value_list = response.ticket_json["Ticket"][0]["DynamicField"]
except:
raise TicketDynamicFieldsParseError("Could not parse Dynamic Fields!")
for df_name_value in df_name_value_list:
ticket_dynamic_fields[df_name_value["Name"]] = df_name_value["Value"]
return True
class Ticket(object):
......@@ -376,7 +423,7 @@ class Ticket(object):
articles = []
for key, value in dct.items():
logger.debug("Parse Ticket: {0} <==> {1}".format(key, value))
logger.debug("Parse Ticket: {0} --> {1}".format(key, value))
# TODO 2016-04-15 (RH): needed?!
if key == "Article":
......@@ -463,7 +510,7 @@ class Ticket(object):
dct.update({u"CustomerUser": CustomerUser})
for key, value in dct.items():
logger.debug("Create Basic Ticket: {0} <==> {1}".format(key, value))
logger.debug("Create Basic Ticket: {0} --> {1}".format(key, value))
dct.update({key: value})
return Ticket(dct)
......@@ -594,6 +641,9 @@ class Client(object):
Returns:
bool: True if valid, False otherwise.
.. note::
Calls _ticket_get_json (GET)
"""
if not self.session_id:
......@@ -606,7 +656,7 @@ class Client(object):
payload = {"SessionID": self.session_id}
return self._ticket_get_json(url, payload)
return self._ticket_get_json(url, payload, suppress_debug=True)
def session_create(self):
""" create new OTRS Session and store Session ID
......@@ -614,6 +664,9 @@ class Client(object):
Returns:
bool: True if successful, False otherwise.
.. note::
Uses HTTP Method: POST
"""
url = "{0.baseurl}/otrs/nph-genericinterface.pl/Webservice/" \
......@@ -624,24 +677,9 @@ class Client(object):
"Password": self.password
}
try:
self.response = requests.post(url,
params=payload,
proxies=proxies,
verify=self.https_verify)
except requests.exceptions.RequestException as err:
logger.error("Requests Exception: {}".format(err))
raise requests.exceptions.RequestException("Requests Exception: {}".format(err))
# TODO 2016-04-17 (RH): This should be more thorough/verbose..!
try:
self.ticket_json = json.loads(self.response.content.decode())
self.session_id = self.ticket_json["SessionID"]
except Exception as err:
logger.error("JSON Parse Exception: {}".format(err))
raise SessionCreateError("JSON Parse Exception: {} - check credentials!".format(err))
return True
# TODO 2016-04-18 (RH): decide what to return here.. bool or result content?
if self._session_create_json(url, payload):
return self.ticket_json
def session_restore_or_set_up_new(self):
""" Try to restore Session ID from file otherwise create new one
......@@ -665,7 +703,7 @@ class Client(object):
except OTRSAPIError:
pass # most likely invalid session_id so pass. Remove clear session_id_file..
# got no (valid) session_id from file.. try to create new one
# got no (valid) session_id from file.. try to create new one ### TODO !!! ###
if not self.session_create():
logger.error("Failed to create a Session ID!")
raise SessionCreateError("Failed to create a Session ID!")
......@@ -678,6 +716,48 @@ class Client(object):
logger.debug("Saved new Session ID to file: {0}".format(self.session_id_file))
return True
def _session_create_json(self, url, payload):
""" _session_create_json
Args:
url (str):
payload (dict):
Raises:
OTRSHTTPError
OTRSAPIError
Returns:
bool: True if update successful, False otherwise.
.. note::
Uses HTTP Method: POST
"""
headers = {"Content-Type": "application/json"}
json_payload = json.dumps(payload)
try:
self.response = requests.post(url,
proxies=proxies,
data=json_payload,
headers=headers,
verify=self.https_verify)
except requests.exceptions.RequestException as err:
logger.error("Requests Exception: {}".format(err))
raise requests.exceptions.RequestException("Requests Exception: {}".format(err))
# TODO 2016-04-18 (RH): This should be more thorough/verbose..!
try:
self.ticket_json = json.loads(self.response.content.decode())
self.session_id = self.ticket_json["SessionID"]
except Exception as err:
logger.error("JSON Parse Exception: {}".format(err))
raise SessionCreateError("JSON Parse Exception: {} - check credentials!".format(err))
return True
def _read_session_id_from_file(self):
""" Retrieve a stored Session ID from file
......@@ -752,10 +832,8 @@ class Client(object):
Args:
ticket (Ticket):
article (Article): optional article
attachment_list (AttachmentList): dict containing list of Attachment
objects (e.g. result of :py:meth:`Attachment.to_dict`
attachment_list (AttachmentList):
dynamic_field_list (DynamicFieldList):
TODO: raus: of :py:meth:`build_dynamic_fields_dict_for_update`
**kwargs: any regular OTRS Fields (not for Dynamic Fields!)
"""
......@@ -783,14 +861,9 @@ class Client(object):
if dynamic_field_list:
payload.update(dynamic_field_list.to_dct())
self._ticket_create_json(url, payload)
"""
# TODO 2016-04-13 (RH): decide what to return here.. bool or ticket content
# TODO 2016-04-18(RH): decide what to return here.. bool or result content? Or full new?
if self._ticket_create_json(url, payload):
return self.ticket_json['Ticket'][0]
"""
return self.ticket_json
def _ticket_create_json(self, url, payload):
""" _ticket_create_json
......@@ -808,11 +881,8 @@ class Client(object):
bool: True if successful, False otherwise.
"""
headers = {"Content-Type": "application/json"}
json_payload = json.dumps(payload)
try:
self.response = requests.post(url,
proxies=proxies,
......@@ -820,11 +890,45 @@ class Client(object):
headers=headers,
verify=self.https_verify)
# critical error: HTTP request resulted in an error!
except Exception as err:
logger.error("_ticket_create error: {0}".format(err))
return False
logger.error("Failed to access OTRS. Check Hostname, Proxy, SSL Certificate!"
"Error with http communication: {0}".format(err))
# raise OTRSHTTPError("get http")
raise OTRSHTTPError("Failed to access OTRS. Check Hostname, Proxy, SSL Certificate!"
"Error with http communication: {0}".format(err))
# Biiiig TODO!!
try:
self.ticket_json = self.response.json()
logger.debug(self.ticket_json)
if self.ticket_json.get("TicketID") is not None:
self.response_type = "TicketID"
elif self.ticket_json.get("Error") is not None:
self.response_type = "Error"
else:
logger.error("Unknown key in response JSON DICT!")
# critical error: Unknown response from OTRS API - FAIL NOW!
raise ResponseJSONParseError("Unknown key in response JSON DICT!")
except Exception as err:
# TODO 2016-04-13 (RH): clean this up!
raise Exception("Parse Result to JSON failed.. Message ".format(err))
# Validated response_type
logger.debug("Type was set to: {0}".format(self.response_type))
if self.response_type == "Error":
logger.error("TicketUpdate API Error. Failed to access OTRS API. Check Username "
"and Password! Session ID expired?!\n"
"OTRS Error_Code; OTRS Message: "
"{0}; {1}".format(self.ticket_json["Error"]["ErrorCode"],
self.ticket_json["Error"]["ErrorMessage"]))
raise OTRSAPIError("TicketUpdate API Error. Failed to access OTRS API. Check Username "
"and Password! Session ID expired?!\n"
"OTRS Error_Code; OTRS Message: "
"{0}; {1}".format(self.ticket_json["Error"]["ErrorCode"],
self.ticket_json["Error"]["ErrorMessage"]))
return True
......@@ -904,7 +1008,7 @@ class Client(object):
logger.debug("Found more that one result with that Ticket Number?!")
return None
def _ticket_get_json(self, url, payload):
def _ticket_get_json(self, url, payload, suppress_debug=False):
""" _ticket_get_json
Args:
......@@ -919,12 +1023,17 @@ class Client(object):
Returns:
bool: True if successful, False otherwise.
"""
.. note::
Uses HTTP Method: GET
"""
headers = {"Content-Type": "application/json"}
json_payload = json.dumps(payload)
try:
self.response = requests.get(url,
proxies=proxies,
params=payload,
data=json_payload,
headers=headers,
verify=self.https_verify)
# critical error: HTTP request resulted in an error!
......@@ -937,7 +1046,8 @@ class Client(object):
try:
self.ticket_json = self.response.json()
logger.debug(self.ticket_json)
if not suppress_debug:
logger.debug(self.ticket_json)
if self.ticket_json.get("Ticket") is not None:
self.response_type = "Ticket"
......@@ -955,7 +1065,8 @@ class Client(object):
raise Exception("Parse Result to JSON failed.. Message ".format(err))
# Validated response_type
logger.debug("Type was set to: {0}".format(self.response_type))
if not suppress_debug:
logger.debug("Type was set to: {0}".format(self.response_type))
if self.response_type == "Error":
logger.error("TicketGet API Error. Failed to access OTRS API. Check Username "
......@@ -989,7 +1100,7 @@ class Client(object):
"""
if not self.ticket_dynamic_fields_requested:
raise TicketDynamicFieldsNoRequestedError("Dynamic Fields were not requested!")
raise TicketDynamicFieldsNotRequestedError("Dynamic Fields were not requested!")
self.ticket_dynamic_fields = {}
......@@ -1036,7 +1147,7 @@ class Client(object):
for key, value in kwargs.items():
if isinstance(value, datetime.datetime):
value = value.strftime("%Y-%m-%d %H:%M:%S")
logger.debug("Search: {0} <==> {1}".format(key, value))
logger.debug("Search: {0} --> {1}".format(key, value))
payload.update({key: value})
if len(payload) == 1:
......@@ -1098,18 +1209,18 @@ class Client(object):
Returns:
bool: True if search successful, False otherwise.
"""
.. note::
Uses HTTP Method: GET
"""
headers = {"Content-Type": "application/json"}
json_payload = json.dumps(payload)
try:
self.response = requests.get(url,
proxies=proxies,
data=json_payload,
headers=headers,
verify=self.https_verify)
proxies=proxies,
data=json_payload,
headers=headers,
verify=self.https_verify)
# critical error: HTTP request resulted in an error!
except Exception as err:
......@@ -1159,26 +1270,23 @@ class Client(object):
# GenericInterface :: Operation::Ticket :: TicketUpdate
# public methods
# * ticket_update
# * ticket_update_add_article
# * ticket_update_set_dynamic_field_value
# * ticket_update_set_pending
def ticket_update(self,
ticket_id,
article=None,
dynamic_fields_dct=None,
attachments_dct=None,
attachment_list=None,
dynamic_field_list=None,
**kwargs):
""" ticket_update_by_ticket_id_set_scout_id
Args:
ticket_id (int):
article (Article): optional article
attachments_dct (dict): dict containing list of Attachment
objects (e.g. result of :py:meth:`Attachment.to_dict`
dynamic_fields_dct (dict): result
of :py:meth:`build_dynamic_fields_dict_for_update`
article (Article):
attachment_list (AttachmentList):
dynamic_field_list (DynamicFieldList):
**kwargs: any regular OTRS Fields (not for Dynamic Fields!)
......@@ -1191,26 +1299,23 @@ class Client(object):
payload = {"SessionID": self.session_id}
# now what?! Will update set Dynamic Fields? Add Articles? Pending timer?
if article:
article.validate()
payload.update(article.to_dct())
if attachments_dct:
if attachment_list:
if not article:
raise TicketError("To create an attachment an article is needed!")
payload.update(attachment_list.to_dct())
payload.update(attachments_dct.to_dct())
if dynamic_fields_dct:
payload.update(dynamic_fields_dct)
if dynamic_field_list:
payload.update(dynamic_field_list.to_dct())
logger.debug("Updating {0} with: ".format(str(ticket_id)))
logger.debug(json.dumps(payload))
# TODO 2016-04-17 (RH): decide what to return here.. bool or result content? Or full new?
if self._update_by_ticket_id(url, payload):
if self._ticket_update_json(url, payload):
return self.ticket_json
def ticket_update_set_pending(self,
......@@ -1248,7 +1353,7 @@ class Client(object):
logger.debug(json.dumps(payload))
# TODO 2016-04-17 (RH): decide what to return here.. bool or result content? Or full new?
if self._update_by_ticket_id(url, payload):
if self._ticket_update_json(url, payload):
return "Set pending till {0} with state \"{1}\"".format(pending_till_str, new_state)
@staticmethod
......@@ -1273,13 +1378,13 @@ class Client(object):
if kwargs is not None:
for key, value in kwargs.items():
logger.debug("DF: {0} <==> {1}".format(key, value))
logger.debug("DF: {0} --> {1}".format(key, value))
dynamic_fields.append({"Name": key, "Value": value})
return {"DynamicField": dynamic_fields}
def _update_by_ticket_id(self, url, payload):
""" update_by_ticket_id
def _ticket_update_json(self, url, payload):
""" _ticket_update_json
Args:
url (str):
......@@ -1292,17 +1397,17 @@ class Client(object):
Returns:
bool: True if update successful, False otherwise.
"""
.. note::
Uses HTTP Method: PATCH
""" TODO 2016-04-13 (RH):why not?!
"""
headers = {"Content-Type": "application/json"}
json_payload = json.dumps(payload)
"""
try:
self.response = requests.patch(url,
proxies=proxies,
data=json.dumps(payload),
data=json_payload,
headers=headers,
verify=self.https_verify)
# critical error: HTTP request resulted in an error!
......
# -*- coding: utf-8 -*-
#
# Name: test_article.py
# Description: Test for PyOTRS Article class
#
# Author: robert.habermann@dlh.de
# Date: 2016-04-17
# make sure (early) that parent dir (main app) is in path
import os.path
import sys
import logging
import unittest2 as unittest
# from mock import MagicMock, patch
current_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(current_path, os.pardir))
from pyotrs import Article # noqa
# from pyotrs.lib import NoBaseURL, NoWebServiceName, NoCredentials
# from pyotrs.lib import SessionCreateError, SessionIDFileError, OTRSAPIError, OTRSHTTPError
class ArticleTests(unittest.TestCase):
def setUp(self):
# setUp for Test Class
# define logger (either Debug or Silent)
self.logger = ArticleTests._setUpLoggerDebug(self)
# self.logger = ArticleTests._setUpLoggerSilent(self)
def tearDown(self):
pass
def _setUpLoggerDebug(self):
logger = logging.getLogger('pyotrs.lib')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)
return logger
def _setUpLoggerSilent(self):
logger = logging.getLogger()
h = logging.StreamHandler()
logger.addHandler(h)
logging.disable(logger)
return logger
# self.assertRaisesRegexp(OTRSAPIError, 'TicketGet API Error.*', obj._ticket_get_json
# self.assertEqual({"TicketNumber": "1970010100000010", "TicketID": "10"}, obj.response.json())
# self.assertEqual(200, obj.response.status_code)
def test_dummy(self):
art = Article.dummy()
self.assertIsInstance(art, Article)
self.assertRegex(str(art), '<Article.*')
def test_dummy_to_dct(self):
expected = {'Article': {'Subject': 'Dümmy Subject',
'Body': 'Hallo Bjørn,\n[kt]\n\n -- The End',
'TimeUnit': 0,
'MimeType': 'text/plain',
'Charset': 'UTF8'}}
art = Article.dummy()
self.assertDictEqual(art.to_dct(), expected)
def test_dummy_force_notify(self):
expected = {'Article': {'Subject': 'Dümmy Subject',
'Body': 'Hallo Bjørn,\n[kt]\n\n -- The End',
'TimeUnit': 0,
'MimeType': 'text/plain',
'Charset': 'UTF8',
"ForceNotificationToUserID": [1, 2]}}
art = Article.dummy_force_notify()
self.assertDictEqual(art.to_dct(), expected)
def main():
unittest.main()
if __name__ == '__main__':
main()
# EOF
# -*- coding: utf-8 -*-
#
# Name: test_attachment.py
# Description: Test for PyOTRS Attachment class
#
# Author: robert.habermann@dlh.de
# Date: 2016-04-18
# make sure (early) that parent dir (main app) is in path
import os.path
import sys
import logging
import unittest2 as unittest
# from mock import MagicMock, patch
current_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(current_path, os.pardir))
from pyotrs import Attachment # noqa
class AttachmentTests(unittest.TestCase):
def setUp(self):
# setUp for Test Class
# define logger (either Debug or Silent)
self.logger = AttachmentTests._setUpLoggerDebug(self)
# self.logger = ArticleTests._setUpLoggerSilent(self)
def tearDown(self):
pass
def _setUpLoggerDebug(self):
logger = logging.getLogger('pyotrs.lib')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)
return logger
def _setUpLoggerSilent(self):
logger = logging.getLogger()
h = logging.StreamHandler()
logger.addHandler(h)
logging.disable(logger)
return logger
def test_init(self):
att = Attachment()
self.assertIsInstance(att, Attachment)
def main():
unittest.main()
if __name__ == '__main__':
main()
# EOF
# -*- coding: utf-8 -*-
#
# Name: test_attachment_list.py
# Description: Test for PyOTRS AttachmentList class
#
# Author: robert.habermann@dlh.de
# Date: 2016-04-18
# make sure (early) that parent dir (main app) is in path
import os.path
import sys
import logging
import unittest2 as unittest
# from mock import MagicMock, patch
current_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(current_path, os.pardir))
from pyotrs import AttachmentList # noqa
class AttachmentListTests(unittest.TestCase):
def setUp(self):
# setUp for Test Class
# define logger (either Debug or Silent)
self.logger = AttachmentListTests._setUpLoggerDebug(self)
# self.logger = ArticleTests._setUpLoggerSilent(self)
def tearDown(self):
pass
def _setUpLoggerDebug(self):
logger = logging.getLogger('pyotrs.lib')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)
return logger
def _setUpLoggerSilent(self):
logger = logging.getLogger()
h = logging.StreamHandler()
logger.addHandler(h)
logging.disable(logger)
return logger
def test_init(self):
att_list = AttachmentList()
self.assertIsInstance(att_list, AttachmentList)
def main():
unittest.main()
if __name__ == '__main__':
main()
# EOF
# -*- coding: utf-8 -*-
#
# Name: test_dynamic_field.py
# Description: Test for PyOTRS DynamicField class
#
# Author: robert.habermann@dlh.de
# Date: 2016-04-18
# make sure (early) that parent dir (main app) is in path
import os.path
import sys
import logging
import unittest2 as unittest
# from mock import MagicMock, patch
current_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(current_path, os.pardir))
from pyotrs import DynamicField # noqa
class DynamicFieldTests(unittest.TestCase):
def setUp(self):
# setUp for Test Class
# define logger (either Debug or Silent)
self.logger = DynamicFieldTests._setUpLoggerDebug(self)
# self.logger = ArticleTests._setUpLoggerSilent(self)
def tearDown(self):
pass
def _setUpLoggerDebug(self):
logger = logging.getLogger('pyotrs.lib')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)
return logger
def _setUpLoggerSilent(self):
logger = logging.getLogger()
h = logging.StreamHandler()
logger.addHandler(h)
logging.disable(logger)
return logger
def test_init(self):
dyn = DynamicField()
self.assertIsInstance(dyn, DynamicField)
def main():
unittest.main()
if __name__ == '__main__':
main()
# EOF
# -*- coding: utf-8 -*-
#
# Name: test_dynamic_field_list.py
# Description: Test for PyOTRS DynamicFieldList class
#
# Author: robert.habermann@dlh.de
# Date: 2016-04-18
# make sure (early) that parent dir (main app) is in path
import os.path
import sys
import logging
import unittest2 as unittest
# from mock import MagicMock, patch
current_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(current_path, os.pardir))
from pyotrs import DynamicFieldList # noqa
class DynamicFieldListTests(unittest.TestCase):
def setUp(self):
# setUp for Test Class
# define logger (either Debug or Silent)
self.logger = DynamicFieldListTests._setUpLoggerDebug(self)
# self.logger = ArticleTests._setUpLoggerSilent(self)
def tearDown(self):
pass
def _setUpLoggerDebug(self):
logger = logging.getLogger('pyotrs.lib')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)
return logger
def _setUpLoggerSilent(self):
logger = logging.getLogger()
h = logging.StreamHandler()
logger.addHandler(h)
logging.disable(logger)
return logger
def test_init(self):
dyn = DynamicFieldList()
self.assertIsInstance(dyn, DynamicFieldList)
def main():
unittest.main()
if __name__ == '__main__':
main()
# EOF
# -*- coding: utf-8 -*-
#
# Name: test_ticket.py
# Description: Test for PyOTRS Ticket class
#
# Author: robert.habermann@dlh.de
# Date: 2016-04-18
# make sure (early) that parent dir (main app) is in path
import os.path
import sys
import logging
import unittest2 as unittest
# from mock import MagicMock, patch
current_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(current_path, os.pardir))
from pyotrs import Ticket # noqa
class TicketTests(unittest.TestCase):
def setUp(self):
# setUp for Test Class
# define logger (either Debug or Silent)
self.logger = TicketTests._setUpLoggerDebug(self)
# self.logger = ArticleTests._setUpLoggerSilent(self)
def tearDown(self):
pass
def _setUpLoggerDebug(self):
logger = logging.getLogger('pyotrs.lib')
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.DEBUG)
logger.addHandler(ch)
return logger
def _setUpLoggerSilent(self):
logger = logging.getLogger()
h = logging.StreamHandler()
logger.addHandler(h)
logging.disable(logger)
return logger
def test_init(self):
dyn = Ticket()
self.assertIsInstance(dyn, Ticket)
def main():
unittest.main()
if __name__ == '__main__':
main()
# EOF
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment