Beispiel #1
0
class CookieAuthTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource("http://rtkit.test/", "USER", "PASS", CookieAuthenticator)

    @httprettified
    def test_auth(self):
        HTTPretty.register_uri(
            HTTPretty.POST,
            "http://rtkit.test/",
            body="RT/4.0.5 200 Ok",
            status=200,
            set_cookie="RT_SID_example.com.80=2ec1d46cb1c05fff0fce34ed268e7d26; path=/; HttpOnly",
            transfer_encoding="chunked",
        )
        HTTPretty.register_uri(
            HTTPretty.GET,
            "http://rtkit.test/ticket/1",
            body="RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n",
            status=200,
        )
        self.resource.get(path="ticket/1", headers={"User-Agent": "rtkit-ua"})
        self.assertEqual(len(HTTPretty.latest_requests), 2)
        self.assertEqual(HTTPretty.latest_requests[0].path, "/")
        self.assertEqual(HTTPretty.latest_requests[0].method, "POST")
        self.assertEqual(HTTPretty.latest_requests[0].body, "user=USER&pass=PASS")
        self.assertEqual(HTTPretty.latest_requests[1].path, "/ticket/1")
        self.assertEqual(HTTPretty.latest_requests[1].method, "GET")
        self.assertEqual(HTTPretty.latest_requests[1].body, "")
Beispiel #2
0
class CookieAuthTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', 'USER', 'PASS', CookieAuthenticator)

    @httprettified
    def test_auth(self):
        HTTPretty.register_uri(
            HTTPretty.POST,
            'http://rtkit.test/',
            body='RT/4.0.5 200 Ok',
            status=200,
            set_cookie='RT_SID_example.com.80=2ec1d46cb1c05fff0fce34ed268e7d26; path=/; HttpOnly',
            transfer_encoding='chunked'
        )
        HTTPretty.register_uri(
            HTTPretty.GET,
            'http://rtkit.test/ticket/1',
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n',
            status=200
        )
        self.resource.get(
            path='ticket/1',
            headers={'User-Agent': 'rtkit-ua', }
        )
        self.assertEqual(len(HTTPretty.latest_requests), 2)
        self.assertEqual(HTTPretty.latest_requests[0].path, '/')
        self.assertEqual(HTTPretty.latest_requests[0].method, 'POST')
        self.assertEqual(HTTPretty.latest_requests[0].body, 'user=USER&pass=PASS')
        self.assertEqual(HTTPretty.latest_requests[1].path, '/ticket/1')
        self.assertEqual(HTTPretty.latest_requests[1].method, 'GET')
        self.assertEqual(HTTPretty.latest_requests[1].body, '')
Beispiel #3
0
class CookieAuthTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', 'USER', 'PASS', CookieAuthenticator)

    @httprettified
    def test_auth(self):
        HTTPretty.register_uri(
            HTTPretty.POST,
            'http://rtkit.test/',
            body='RT/4.0.5 200 Ok',
            status=200,
            set_cookie='RT_SID_example.com.80=2ec1d46cb1c05fff0fce34ed268e7d26; path=/; HttpOnly',
            transfer_encoding='chunked'
        )
        HTTPretty.register_uri(
            HTTPretty.GET,
            'http://rtkit.test/ticket/1',
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n',
            status=200
        )
        self.resource.get(
            path='ticket/1',
            headers={'User-Agent': 'rtkit-ua', }
        )
        self.assertEqual(len(HTTPretty.latest_requests), 2)
        self.assertEqual(HTTPretty.latest_requests[0].path, '/')
        self.assertEqual(HTTPretty.latest_requests[0].method, 'POST')
        self.assertEqual(HTTPretty.latest_requests[0].body, 'user=USER&pass=PASS')
        self.assertEqual(HTTPretty.latest_requests[1].path, '/ticket/1')
        self.assertEqual(HTTPretty.latest_requests[1].method, 'GET')
        self.assertEqual(HTTPretty.latest_requests[1].body, '')
Beispiel #4
0
class BasicAuthTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', 'USER', 'PASS',
                                   BasicAuthenticator)

    @httprettified
    def test_auth(self):
        HTTPretty.register_uri(
            HTTPretty.GET,
            'http://rtkit.test/ticket/1',
            responses=[
                HTTPretty.Response(
                    body='',
                    status=401,
                    www_authenticate='Basic realm="rtkit.test"'),
                HTTPretty.Response(
                    body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n',
                    status=200),
            ])
        self.resource.get(path='ticket/1',
                          headers={
                              'User-Agent': 'rtkit-ua',
                          })
        self.assertEqual(
            HTTPretty.last_request.headers['authorization'],
            'Basic ' + base64.b64encode('USER:PASS'),
        )
Beispiel #5
0
class QueryStringAuthTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource("http://rtkit.test/", "USER", "PASS", QueryStringAuthenticator)

    @httprettified
    def test_auth(self):
        HTTPretty.register_uri(
            HTTPretty.GET,
            "http://rtkit.test/ticket/1",
            responses=[HTTPretty.Response(body="RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n", status=200)],
        )
        self.resource.get(path="ticket/1", headers={"User-Agent": "rtkit-ua"})
        self.assertEqual(HTTPretty.latest_requests[0].path, "/ticket/1?user=USER&pass=PASS")
Beispiel #6
0
def modifyTicket(ticketID):
    global emailGlobal
    dic = {"email": emailGlobal}
    lst = []

    set_logging('debug')
    logger = logging.getLogger('rtkit')

    my_config = DITICConfig()
    system = my_config.get_system()

    resource = RTResource('http://localhost/rt/REST/1.0/', system['username'],
                          system['password'], CookieAuthenticator)

    try:
        response = resource.get(path='ticket/' + ticketID)
        for r in response.parsed:
            for t in r:
                logger.info(t)
                lst.append(t)

    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)

    lst = dict(lst)

    return template("ticketDetails", lst=lst, ticketID=ticketID, dic=dic)
Beispiel #7
0
def loadResponseInfoFromRT(request):
	if request.method != "POST":
		return HttpResponseNotAllowed(["POST"])

	rt = RTResource(settings.RT_URL, settings.RT_USER, settings.RT_PW, BasicAuthenticator)
	res = { "failed" : 0, "succeded" : 0 , "updated" : 0 }

	unansweredContacts = SponsorContact.objects.filter(responded=False).exclude(rtTicketId=None)
	for contact in unansweredContacts:
		# read the ticket from RT
		rtres = rt.get(path="ticket/{}/history".format(contact.rtTicketId))
		if rtres.status_int != 200:
			res["failed"] = res["failed"] + 1
			continue
		res["succeded"] = res["succeded"] + 1
		results = rtres.parsed
		if (len(
				[r for r in rtres.parsed[0] if
					r[1].lower().find("correspondence added") >= 0 and
					r[1].find("@") >= 0])
					>= 1):

			# count the number of correspondances that also contain an @. corresespondances added with "@" come from external mail and not rt user?!
			res["updated"] = res["updated"] + 1
			contact.responded = True
			contact.save()

	return respond_json(res)
Beispiel #8
0
class BasicAuthTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource("http://rtkit.test/", "USER", "PASS", BasicAuthenticator)

    @httprettified
    def test_auth(self):
        HTTPretty.register_uri(
            HTTPretty.GET,
            "http://rtkit.test/ticket/1",
            responses=[
                HTTPretty.Response(body="", status=401, www_authenticate='Basic realm="rtkit.test"'),
                HTTPretty.Response(body="RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n", status=200),
            ],
        )
        self.resource.get(path="ticket/1", headers={"User-Agent": "rtkit-ua"})
        self.assertEqual(HTTPretty.last_request.headers["authorization"], "Basic " + base64.b64encode("USER:PASS"))
Beispiel #9
0
class QueryStringAuthTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', 'USER', 'PASS', QueryStringAuthenticator)

    @httprettified
    def test_auth(self):
        HTTPretty.register_uri(
            HTTPretty.GET,
            'http://rtkit.test/ticket/1',
            responses=[
                HTTPretty.Response(body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n', status=200),
            ]
        )
        self.resource.get(
            path='ticket/1',
            headers={'User-Agent': 'rtkit-ua', }
        )
        self.assertEqual(HTTPretty.latest_requests[0].path, '/ticket/1?user=USER&pass=PASS')
Beispiel #10
0
def test(url):
    resource = RTResource(url, None, None, KerberosAuthenticator)
    try:
        response = resource.get(path='ticket/1')
        for r in response.parsed:
            for t in r:
                logger.info(t)
    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)
Beispiel #11
0
class BasicAuthTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', 'USER', 'PASS', BasicAuthenticator)

    @httprettified
    def test_auth(self):
        HTTPretty.register_uri(
            HTTPretty.GET,
            'http://rtkit.test/ticket/1',
            responses=[
                HTTPretty.Response(body='', status=401, www_authenticate='Basic realm="rtkit.test"'),
                HTTPretty.Response(body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n', status=200),
            ]
        )
        self.resource.get(
            path='ticket/1',
            headers={'User-Agent': 'rtkit-ua', }
        )
        self.assertEqual(
            HTTPretty.last_request.headers['authorization'],
            'Basic ' + base64.b64encode('USER:PASS'),
        )
Beispiel #12
0
def is_ticket_open(id):
    status = False
    global rt_url
    global rt_user
    global rt_pass
    resource = RTResource(rt_url, rt_user, rt_pass, CookieAuthenticator)
    try:
        ticket = "ticket/%s" % id
        response = resource.get(path=ticket)
        for r in response.parsed:
            l = {a: b for a, b in r}
            ticket_status = l["Status"]
            if ticket_status == "open" or ticket_status == "new":
                status = id
    except:
        return False
    return status
Beispiel #13
0
# Initialize or restore RT state settings
stored_last_updated_activity = time.gmtime(0)
try:
    stored_last_updated_activity = rt_parse_ticket_time(config.get('rt', 'last_fetched_timestamp'))
except:
    logger.warn('Unable to parse feed timestamp - Defaulting to: ' + rt_format_ticket_time(stored_last_updated_activity) + ' UTC')
    syslog.syslog(syslog.LOG_WARNING, 'Unable to parse feed timestamp - Defaulting to: ' + rt_format_ticket_time(stored_last_updated_activity) + ' UTC')

# Initialize web services
# Source RT Feed
resource = None
feed = None
try:
    resource = RTResource(config.get('rt', 'api_url_prefix'), config.get('rt', 'username'), config.get('rt', 'password'), CookieAuthenticator)
    feed = resource.get(path=config.get('rt', 'api_search_suffix'))
except RTResourceError as e:
    logger.error('Cannot connect to RT server')
    syslog.syslog(syslog.LOG_ERR, 'Cannot connect to RT server')
    logger.error(e.response.status_int)
    syslog.syslog(syslog.LOG_ERR, e.response.status_int)
    logger.error(e.response.status)
    syslog.syslog(syslog.LOG_ERR, e.response.status)
    logger.error(e.response.parsed)
    syslog.syslog(syslog.LOG_ERR, e.response.parsed)
    sys.exit(1)
except:
    logger.error('Cannot connect to RT server')
    syslog.syslog(syslog.LOG_ERR, 'Cannot connect to RT server')
    sys.exit(1)
Beispiel #14
0
                                              body).group("url")
                    print extracted_url
                    online, size = is_online(extracted_url)
                    if not online:
                        print "Resource %s is offline (size: %s)" % (
                            extracted_url, size)
                        close_ticket(id)
    except RTResourceError as e:
        logger.error(e.response.status_int)
        logger.error(e.response.status)
        logger.error(e.response.parsed)


#show ticket links
try:
    ticketpath = "ticket/%s/links/show" % incident
    response = resource.get(path=ticketpath)
    for r in response.parsed:
        for t in r[1][1].split("\n"):
            investigation = ""
            investigation_id = ""
            if t.startswith('fsck'):
                investigation = t
                print investigation
                investigation_id = re.findall('\d+', investigation)
                for i in investigation_id:
                    print i
                    print_active_ticket(i)
except Exception as e:
    print e
Beispiel #15
0
class RTBot(BaseMUCBot):
  def __init__(self, roomJID, nick, rt_url, rt_user, rt_pwd, roomPassword, rt_display_url=None, output_format="extended"):
    BaseMUCBot.__init__(self, roomJID, nick, roomPassword)
    self.resource = RTResource(rt_url + 'REST/1.0/', rt_user, rt_pwd, CookieAuthenticator)
    self.rt_url = rt_url
    self.output_format = output_format

    if rt_display_url is None:
	self.rt_display_url = rt_url
    else:
	self.rt_display_url = rt_display_url

  def handleGroupChat(self, room, user, message):
    if self.nick in message.body:
      if 'hi' in message.body or 'hello' in message.body:
        body = u"%s: greetings stranger arrr arrr!" % (user.nick)
        self.groupChat(self.roomJID, body)
      elif 'open' in message.body:
        queue = rt_default_queue

        m = re.search(r'open\s([^\s]+)', message.body)
        if m:
          queue = m.group(1)

        if queue == 'all':
          queue_query = ''
        else:
          queue_query = " AND QUEUE='" + queue + "'"

        query = "Owner = 'Nobody' AND ( Status = 'new' OR Status = 'open' )" + queue_query
        query = urllib.quote(query)
        prepend_string = 'Queue: ' + queue + '\n\n'

        try:
          ret = self.rtquery(query, prepend_string)
          self.groupChat(self.roomJID, ret)
        except NoResponse as e:
          self.groupChat(self.roomJID, e.message)

      elif 'search' in message.body:
        m = re.search(r'search\s([^\s]+)', message.body)
        if m:
          search = m.group(1)

          if len(search) >= 3:
            query = "Subject LIKE '" + search + "'"
            query = urllib.quote(query)

            try:
              ret = self.rtquery(query)
              self.groupChat(self.roomJID, ret)
            except NoResponse as e:
              self.groupChat(self.roomJID, e.message)
          else:
            self.groupChat(self.roomJID, 'Please enter at least 3 characters!')
        else:
          self.groupChat(self.roomJID, 'Nothing to search for!')

      elif 'ticket' in message.body:
        m = re.search(r'ticket\s([0-9]+)', message.body)
        if m:
          ticket_id = m.group(1)

          try:
            ret = self.rtticket(ticket_id)
            self.groupChat(self.roomJID, ret)
          except NoResponse as e:
            self.groupChat(self.roomJID, e.message)
        else:
          self.groupChat(self.roomJID, 'Nothing to search for!')

      elif 'help' in message.body:
        self.groupChat(self.roomJID, 'Usage:')
        self.groupChat(self.roomJID, 'open <queue name>  -  display all unassigned open and new tickets')
        self.groupChat(self.roomJID, '                                         queue name defaults to '+rt_default_queue)
        self.groupChat(self.roomJID, 'search <subject>        -  search for a subject')
        self.groupChat(self.roomJID, 'ticket <ticket-id>         -  display ticket information')

  def rtquery(self, query, prepend_text=''):
    ret = '\n'
    if self.output_format == "extended":
	ret += prepend_text

    try:
      response = self.resource.get(path='search/ticket?query=' + query)

      if len(response.parsed) > 0:
        first = True

        for r in response.parsed:
          for t in r:
            if not first and self.output_format == "extended":
              ret += '\n'
            else:
              first = False

            logger.info(t)
            t_id = t[0]
            t_display = self.rt_display_url + 'Ticket/Display.html?id=' + t_id
            t_title = unicode(t[1], errors='replace')
            if self.output_format == "extended":
                ret += 'Ticket#: ' + t_id + '\n'
                ret += 'URL: ' + t_display + '\n'
                ret += 'Title: ' + t_title + '\n'
	    elif self.output_format == "compact":
		ret += '#'+t_id+","+t_title+","+t_display+"\n"

      else:
        raise NoResponse('Nothing found!')
    except RTResourceError as e:
      logger.error(e.response.status_int)
      logger.error(e.response.status)
      logger.error(e.response.parsed)

    return ret

  def rtticket(self, ticket_id):
    ret = '\n'

    try:
      response = self.resource.get(path='ticket/' + ticket_id + '/show')

      if len(response.parsed) > 0:
        rsp_dict = {}

        for r in response.parsed:
          for t in r:
            rsp_dict[t[0]] = unicode(t[1], 'utf-8')

        ret += 'Ticket#: ' + ticket_id + '\n'
        t_display = self.rt_url + 'Ticket/Display.html?id=' + ticket_id
        ret += 'URL: ' + t_display + '\n'
        ret += 'Title: ' + rsp_dict['Subject'] + '\n'
        ret += 'Queue: ' + rsp_dict['Queue'] + '\n'
        ret += 'Owner: ' + rsp_dict['Owner'] + '\n'
        ret += 'Creator: ' + rsp_dict['Creator'] + '\n'
        ret += 'Status: ' + rsp_dict['Status'] + '\n'
        ret += 'Requestors: ' + rsp_dict['Requestors'] + '\n'
        ret += 'Created: ' + rsp_dict['Created'] + '\n'
        ret += 'LastUpdated: ' + rsp_dict['LastUpdated'] + '\n'
        #ret += ': ' + rsp_dict[''] + '\n'

        if 'Resolved' in rsp_dict:
          ret += 'Resolved: ' + rsp_dict['Resolved'] + '\n'

      else:
        raise NoResponse('Nothing found!')
    except RTResourceError as e:
      logger.error(e.response.status_int)
      logger.error(e.response.status)
      logger.error(e.response.parsed)

    #return unicode(ret, 'utf-8')
    return ret
import sys
import logging

from rtkit.resource import RTResource
from rtkit.authenticators import BasicAuthenticator
from rtkit.errors import RTResourceError
from rtkit import set_logging

set_logging("debug")
logger = logging.getLogger("rtkit")

resource = RTResource("http://rt.cla.umn.edu/REST/1.0/", sys.argv[1], sys.argv[2], BasicAuthenticator)

try:
    response = resource.get(
        path="search/ticket?query=Owner=%s&user=%s&pass=%s" % (sys.argv[1], sys.argv[1], sys.argv[2])
    )
    for r in response.parsed:
        for t in r:
            logger.info(t)

except RTResourceError as e:
    logger.error(e.response.status_int)
    logger.error(e.response.status)
    logger.error(e.response.parsed)
Beispiel #17
0
class RTTickets(object):
    """Container class for RTTickets"""
    def __init__(self, url, usr, pwd):
        self.__url = url
        self.__resource = RTResource(url + 'REST/1.0/', usr, pwd,
                                     CookieAuthenticator)

    def get_all_tickets(self):
        """Returns all the tickets"""
        try:
            query = (
                "Queue%3D'SOC'%20OR%20Queue%3D'Investigations'%20OR%20Queue%3D'"
                +
                "Notifications'%20OR%20Queue%3D'Informations'%20OR%20Queue%3D'"
                + "Sub-Incidents'")
            response = self.__resource.get(path='search/ticket?query=' + query)
            ticket_list = list()
            if len(response.parsed) > 0:
                for text_list in response.parsed:
                    for ticket_id, ticket_title in text_list:
                        ticket = Ticket(ticket_id)
                        ticket.url = (
                            self.__url + '/Ticket/Display.html?id=' +
                            unicode(ticket_id, 'utf-8', errors='replace'))
                        ticket.title = unicode(ticket_title,
                                               'utf-8',
                                               errors='replace')
                        ticket_list.append(ticket)
                return ticket_list
            else:
                raise NoResponseException('Nothing found!')
        except RTResourceError as error:
            raise NoResponseException(error)

    def get_ticket_by_id(self, identifier):
        """Returns a ticket with the given identifier"""
        try:
            response = self.__resource.get(path='/ticket/' + identifier +
                                           '/show')
            if len(response.parsed) > 0:
                rsp_dict = {}
                for resp in response.parsed:
                    for tick in resp:
                        rsp_dict[tick[0]] = unicode(tick[1],
                                                    'utf-8',
                                                    errors='replace')
                ticket = Ticket(identifier)
                ticket.url = self.__url + '/Ticket/Display.html?id=' + identifier
                ticket.title = unicode(rsp_dict['Subject'],
                                       'utf-8',
                                       errors='replace')
                ticket.queue = unicode(rsp_dict['Queue'],
                                       'utf-8',
                                       errors='replace')
                ticket.owner = unicode(rsp_dict['Owner'],
                                       'utf-8',
                                       errors='replace')
                ticket.creator = unicode(rsp_dict['Creator'],
                                         'utf-8',
                                         errors='replace')
                ticket.status = unicode(rsp_dict['Status'],
                                        'utf-8',
                                        errors='replace')
                ticket.requestors = unicode(rsp_dict['Requestors'],
                                            'utf-8',
                                            errors='replace')
                ticket.created = unicode(rsp_dict['Created'],
                                         'utf-8',
                                         errors='replace')
                ticket.last_updated = unicode(rsp_dict['LastUpdated'],
                                              'utf-8',
                                              errors='replace')
                # froen mech waat daat mecht?
                if 'Resolved' in rsp_dict:
                    ticket.resolved = rsp_dict['Resolved']
            else:
                raise NoResponseException('Nothing found!')
        except RTResourceError as error:
            raise NoResponseException(error)

    def get_base_ticket_url(self):
        """Returns the base url of RT"""
        return self.__url + '/Ticket/Display.html?id='
Beispiel #18
0
    logger.warn('Unable to parse feed timestamp - Defaulting to: ' +
                rt_format_ticket_time(stored_last_updated_activity) + ' UTC')
    syslog.syslog(
        syslog.LOG_WARNING,
        'Unable to parse feed timestamp - Defaulting to: ' +
        rt_format_ticket_time(stored_last_updated_activity) + ' UTC')

# Initialize web services
# Source RT Feed
resource = None
feed = None
try:
    resource = RTResource(config.get('rt', 'api_url_prefix'),
                          config.get('rt', 'username'),
                          config.get('rt', 'password'), CookieAuthenticator)
    feed = resource.get(path=config.get('rt', 'api_search_suffix'))
except RTResourceError as e:
    logger.error('Cannot connect to RT server')
    syslog.syslog(syslog.LOG_ERR, 'Cannot connect to RT server')
    logger.error(e.response.status_int)
    syslog.syslog(syslog.LOG_ERR, e.response.status_int)
    logger.error(e.response.status)
    syslog.syslog(syslog.LOG_ERR, e.response.status)
    logger.error(e.response.parsed)
    syslog.syslog(syslog.LOG_ERR, e.response.parsed)
    sys.exit(1)
except:
    logger.error('Cannot connect to RT server')
    syslog.syslog(syslog.LOG_ERR, 'Cannot connect to RT server')
    sys.exit(1)
Beispiel #19
0
class TktTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', None, None, AbstractAuthenticator)
        self.content = {
            'content': {
                'Queue': 1,
                'Subject': 'New Ticket',
                'Text': 'My useless\ntext on\nthree lines.',
            }
        }
        self.req_body = 'content=Queue: 1\nText: My useless\n text on\n three lines.\nSubject: New Ticket'
        self.req_headers_get = {
            'connection': 'close',
            'user-agent': 'rtkit-ua',
            'host': 'rtkit.test',
            'accept': 'text/plain',
            'accept-encoding': 'identity',
        }
        self.req_headers_post = self.req_headers_get.copy()
        self.req_headers_post.update({
            'content-length': '76',
            'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
        })

    @httprettified
    def test_http_error(self):
        HTTPretty.register_uri(HTTPretty.GET, 'http://rtkit.test/:GET:', status=404, body='Not Found')
        response = self.resource.get(':GET:', headers={'User-Agent': 'rtkit-ua', })
        self.assertEqual(response.parsed, [[]])
        self.assertEqual(response.status_int, 500)
        self.assertEqual(response.status, 'Not Found')

    @httprettified
    def assertPost(self, body, expected, content=None):
        HTTPretty.register_uri(HTTPretty.POST, 'http://rtkit.test/:POST:', body=body)
        response = self.resource.post(
            path=':POST:',
            payload=content or self.content,
            headers={'User-Agent': 'rtkit-ua', }
        )
        self.assertEqual(response.parsed, expected.parsed)
        self.assertEqual(response.status_int, expected.status_int)
        self.assertEqual(response.status, expected.status)
        self.assertEqual(HTTPretty.last_request.method, HTTPretty.POST)
        self.assertEqual(HTTPretty.last_request.path, '/:POST:')
        self.assertEqual(HTTPretty.last_request.body, expected.req_body)
        self.assertEqual(dict(HTTPretty.last_request.headers), expected.req_headers)

    @httprettified
    def assertGet(self, body, expected):
        HTTPretty.register_uri(HTTPretty.GET, 'http://rtkit.test/:GET:', body=body)
        response = self.resource.get(
            path=':GET:',
            headers={'User-Agent': 'rtkit-ua', }
        )
        self.assertEqual(response.parsed, expected.parsed)
        self.assertEqual(response.status_int, expected.status_int)
        self.assertEqual(response.status, expected.status)
        self.assertEqual(HTTPretty.last_request.method, HTTPretty.GET)
        self.assertEqual(HTTPretty.last_request.path, '/:GET:')
        self.assertEqual(HTTPretty.last_request.body, expected.req_body)
        self.assertEqual(dict(HTTPretty.last_request.headers), expected.req_headers)

    def test_create_tkt(self):
        expected = Expected(
            parsed=[[('id', 'ticket/1')]],
            status_int=200,
            status='200 Ok',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 created.\n\n',
            expected=expected,
        )

    def test_create_tkt_noqueue(self):
        expected = Expected(
            parsed=[],
            status_int=400,
            status='400 Could not create ticket. Queue not set',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Could not create ticket.\n# Could not create ticket. Queue not set\n\n',
            expected=expected,
        )

    def test_create_tkt_noperm(self):
        expected = Expected(
            parsed=[],
            status_int=400,
            status='400 No permission to create tickets in the queue \'___Admin\'',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Could not create ticket.\n# No permission to create tickets in the queue \'___Admin\'\n\n',
            expected=expected,
        )

    def test_read_tkt(self):
        expected = Expected(
            parsed=[[
                ('id', 'ticket/1'),
                ('Queue', 'General'),
                ('Owner', 'Nobody'),
                ('Creator', 'pyrtkit'),
                ('Subject', 'pyrt-create4'),
                ('Status', 'open'),
                ('Priority', '5'),
                ('InitialPriority', '0'),
                ('FinalPriority', '0'),
                ('Requestors', ''),
                ('Cc', ''),
                ('AdminCc', ''),
                ('Created', 'Sun Jul 03 10:48:57 2011'),
                ('Starts', 'Not set'),
                ('Started', 'Not set'),
                ('Due', 'Not set'),
                ('Resolved', 'Not set'),
                ('Told', 'Wed Jul 06 12:58:00 2011'),
                ('LastUpdated', 'Thu Jul 07 14:42:32 2011'),
                ('TimeEstimated', '0'),
                ('TimeWorked', '25 minutes'),
                ('TimeLeft', '0'),
            ]],
            status_int=200,
            status='200 Ok',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='''RT/3.8.10 200 Ok

id: ticket/1
Queue: General
Owner: Nobody
Creator: pyrtkit
Subject: pyrt-create4
Status: open
Priority: 5
InitialPriority: 0
FinalPriority: 0
Requestors:
Cc:
AdminCc:
Created: Sun Jul 03 10:48:57 2011
Starts: Not set
Started: Not set
Due: Not set
Resolved: Not set
Told: Wed Jul 06 12:58:00 2011
LastUpdated: Thu Jul 07 14:42:32 2011
TimeEstimated: 0
TimeWorked: 25 minutes
TimeLeft: 0


''',
            expected=expected,
        )

    def test_read_tkt_notfound(self):
        expected = Expected(
            parsed=[],
            status_int=404,
            status='404 Ticket 1 does not exist',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n',
            expected=expected,
        )

    def test_read_tkt_credentials(self):
        expected = Expected(
            parsed=[],
            status_int=401,
            status='401 Credentials required',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='RT/3.8.10 401 Credentials required\n',
            expected=expected,
        )

    def test_update_tkt_syntax_error(self):
        self.req_headers_post.update({'content-length': '16'})
        expected = Expected(
            parsed=[[('queue', 'You may not create requests in that queue.')]],
            status_int=409,
            status='409 Syntax Error',
            req_body='content=Queue: 3',
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 409 Syntax Error\n\n# queue: You may not create requests in that queue.\n\n',
            expected=expected,
            content={'content': {'Queue': 3, }}
        )

    def test_tkt_comment_with_attach(self):
        self.req_headers_post.update({
            'content-length': '760',
            'content-type': 'multipart/form-data; boundary=xXXxXXyYYzzz',
        })
        expected = Expected(
            parsed=[[]],
            status_int=200,
            status='200 Ok',
            req_body='--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="content"\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 77\r\n\r\nAction: comment\nText: Comment with attach\nAttachment: x1.txt, x2.txt, 1x1.gif\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_2"; filename="rtkit/tests/attach/x2.txt"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n\r\nHello World!\n2\n\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_1"; filename="rtkit/tests/attach/x1.txt"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n\r\nHello World!\n1\n\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_3"; filename="rtkit/tests/attach/1x1.gif"\r\nContent-Type: image/gif\r\nContent-Length: 35\r\n\r\nGIF87a\x01\x00\x01\x00\x80\x00\x00\xcc\xcc\xcc\x96\x96\x96,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;\r\n--xXXxXXyYYzzz--\r\n',
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Message recorded\n\n',
            expected=expected,
            content={
                'content': {
                    'Action': 'comment',
                    'Text': 'Comment with attach',
                    'Attachment': 'x1.txt, x2.txt, 1x1.gif',
                },
                'attachment_1': file('rtkit/tests/attach/x1.txt'),
                'attachment_2': file('rtkit/tests/attach/x2.txt'),
                'attachment_3': file('rtkit/tests/attach/1x1.gif'),
            }
        )

    def test_read_tkt_comment(self):
        expected = Expected(
            parsed=[[
                ('id', '2831'),
                ('Ticket', '216'),
                ('TimeTaken', '0'),
                ('Type', 'Create'),
                ('Field', ''),
                ('OldValue', ''),
                ('NewValue', ''),
                ('Data', ''),
                ('Description', 'Ticket created by john.foo'),
                ('Content', 'this is a\nmultiline\nticket'),
                ('Creator', 'john.foo'),
                ('Created', '2013-02-14 18:00:45'),
                ('Attachments', '\n1315: untitled (38b)')
            ]],
            status_int=200,
            status='200 Ok',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='''RT/4.0.5-116-g591e06a 200 Ok

# 2/2 (id/2831/total)

id: 2831
Ticket: 216
TimeTaken: 0
Type: Create
Field:
OldValue:
NewValue:
Data:
Description: Ticket created by john.foo

Content: this is a
         multiline
         ticket


Creator: john.foo
Created: 2013-02-14 18:00:45

Attachments:
             1315: untitled (38b)
''',
            expected=expected,
        )
Beispiel #20
0
class TktTestCase(unittest.TestCase):
    def setUp(self):
        self.resource = RTResource('http://rtkit.test/', None, None,
                                   AbstractAuthenticator)
        self.content = {
            'content': {
                'Queue': 1,
                'Subject': 'New Ticket',
                'Text': 'My useless\ntext on\nthree lines.',
            }
        }
        self.req_body = 'content=Queue: 1\nText: My useless\n text on\n three lines.\nSubject: New Ticket'
        self.req_headers_get = {
            'connection': 'close',
            'user-agent': 'rtkit-ua',
            'host': 'rtkit.test',
            'accept': 'text/plain',
            'accept-encoding': 'identity',
        }
        self.req_headers_post = self.req_headers_get.copy()
        self.req_headers_post.update({
            'content-length':
            '76',
            'content-type':
            'application/x-www-form-urlencoded; charset=utf-8',
        })

    @httprettified
    def test_http_error(self):
        HTTPretty.register_uri(HTTPretty.GET,
                               'http://rtkit.test/:GET:',
                               status=404,
                               body='Not Found')
        response = self.resource.get(':GET:',
                                     headers={
                                         'User-Agent': 'rtkit-ua',
                                     })
        self.assertEqual(response.parsed, [[]])
        self.assertEqual(response.status_int, 500)
        self.assertEqual(response.status, 'Not Found')

    @httprettified
    def assertPost(self, body, expected, content=None):
        HTTPretty.register_uri(HTTPretty.POST,
                               'http://rtkit.test/:POST:',
                               body=body)
        response = self.resource.post(path=':POST:',
                                      payload=content or self.content,
                                      headers={
                                          'User-Agent': 'rtkit-ua',
                                      })
        self.assertEqual(response.parsed, expected.parsed)
        self.assertEqual(response.status_int, expected.status_int)
        self.assertEqual(response.status, expected.status)
        self.assertEqual(HTTPretty.last_request.method, HTTPretty.POST)
        self.assertEqual(HTTPretty.last_request.path, '/:POST:')
        self.assertEqual(HTTPretty.last_request.body, expected.req_body)
        self.assertEqual(dict(HTTPretty.last_request.headers),
                         expected.req_headers)

    @httprettified
    def assertGet(self, body, expected):
        HTTPretty.register_uri(HTTPretty.GET,
                               'http://rtkit.test/:GET:',
                               body=body)
        response = self.resource.get(path=':GET:',
                                     headers={
                                         'User-Agent': 'rtkit-ua',
                                     })
        self.assertEqual(response.parsed, expected.parsed)
        self.assertEqual(response.status_int, expected.status_int)
        self.assertEqual(response.status, expected.status)
        self.assertEqual(HTTPretty.last_request.method, HTTPretty.GET)
        self.assertEqual(HTTPretty.last_request.path, '/:GET:')
        self.assertEqual(HTTPretty.last_request.body, expected.req_body)
        self.assertEqual(dict(HTTPretty.last_request.headers),
                         expected.req_headers)

    def test_create_tkt(self):
        expected = Expected(
            parsed=[[('id', 'ticket/1')]],
            status_int=200,
            status='200 Ok',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 created.\n\n',
            expected=expected,
        )

    def test_create_tkt_noqueue(self):
        expected = Expected(
            parsed=[],
            status_int=400,
            status='400 Could not create ticket. Queue not set',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body=
            'RT/3.8.10 200 Ok\n\n# Could not create ticket.\n# Could not create ticket. Queue not set\n\n',
            expected=expected,
        )

    def test_create_tkt_noperm(self):
        expected = Expected(
            parsed=[],
            status_int=400,
            status=
            '400 No permission to create tickets in the queue \'___Admin\'',
            req_body=self.req_body,
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body=
            'RT/3.8.10 200 Ok\n\n# Could not create ticket.\n# No permission to create tickets in the queue \'___Admin\'\n\n',
            expected=expected,
        )

    def test_read_tkt(self):
        expected = Expected(
            parsed=[[
                ('id', 'ticket/1'),
                ('Queue', 'General'),
                ('Owner', 'Nobody'),
                ('Creator', 'pyrtkit'),
                ('Subject', 'pyrt-create4'),
                ('Status', 'open'),
                ('Priority', '5'),
                ('InitialPriority', '0'),
                ('FinalPriority', '0'),
                ('Requestors', ''),
                ('Cc', ''),
                ('AdminCc', ''),
                ('Created', 'Sun Jul 03 10:48:57 2011'),
                ('Starts', 'Not set'),
                ('Started', 'Not set'),
                ('Due', 'Not set'),
                ('Resolved', 'Not set'),
                ('Told', 'Wed Jul 06 12:58:00 2011'),
                ('LastUpdated', 'Thu Jul 07 14:42:32 2011'),
                ('TimeEstimated', '0'),
                ('TimeWorked', '25 minutes'),
                ('TimeLeft', '0'),
            ]],
            status_int=200,
            status='200 Ok',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='''RT/3.8.10 200 Ok

id: ticket/1
Queue: General
Owner: Nobody
Creator: pyrtkit
Subject: pyrt-create4
Status: open
Priority: 5
InitialPriority: 0
FinalPriority: 0
Requestors:
Cc:
AdminCc:
Created: Sun Jul 03 10:48:57 2011
Starts: Not set
Started: Not set
Due: Not set
Resolved: Not set
Told: Wed Jul 06 12:58:00 2011
LastUpdated: Thu Jul 07 14:42:32 2011
TimeEstimated: 0
TimeWorked: 25 minutes
TimeLeft: 0


''',
            expected=expected,
        )

    def test_read_tkt_notfound(self):
        expected = Expected(
            parsed=[],
            status_int=404,
            status='404 Ticket 1 does not exist',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='RT/3.8.10 200 Ok\n\n# Ticket 1 does not exist.\n\n\n',
            expected=expected,
        )

    def test_read_tkt_credentials(self):
        expected = Expected(
            parsed=[],
            status_int=401,
            status='401 Credentials required',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='RT/3.8.10 401 Credentials required\n',
            expected=expected,
        )

    def test_update_tkt_syntax_error(self):
        self.req_headers_post.update({'content-length': '16'})
        expected = Expected(
            parsed=[[('queue', 'You may not create requests in that queue.')]],
            status_int=409,
            status='409 Syntax Error',
            req_body='content=Queue: 3',
            req_headers=self.req_headers_post,
        )
        self.assertPost(
            body=
            'RT/3.8.10 409 Syntax Error\n\n# queue: You may not create requests in that queue.\n\n',
            expected=expected,
            content={'content': {
                'Queue': 3,
            }})

    def test_tkt_comment_with_attach(self):
        self.req_headers_post.update({
            'content-length':
            '760',
            'content-type':
            'multipart/form-data; boundary=xXXxXXyYYzzz',
        })
        expected = Expected(
            parsed=[[]],
            status_int=200,
            status='200 Ok',
            req_body=
            '--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="content"\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 77\r\n\r\nAction: comment\nText: Comment with attach\nAttachment: x1.txt, x2.txt, 1x1.gif\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_2"; filename="rtkit/tests/attach/x2.txt"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n\r\nHello World!\n2\n\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_1"; filename="rtkit/tests/attach/x1.txt"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n\r\nHello World!\n1\n\r\n--xXXxXXyYYzzz\r\nContent-Disposition: form-data; name="attachment_3"; filename="rtkit/tests/attach/1x1.gif"\r\nContent-Type: image/gif\r\nContent-Length: 35\r\n\r\nGIF87a\x01\x00\x01\x00\x80\x00\x00\xcc\xcc\xcc\x96\x96\x96,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;\r\n--xXXxXXyYYzzz--\r\n',
            req_headers=self.req_headers_post,
        )
        self.assertPost(body='RT/3.8.10 200 Ok\n\n# Message recorded\n\n',
                        expected=expected,
                        content={
                            'content': {
                                'Action': 'comment',
                                'Text': 'Comment with attach',
                                'Attachment': 'x1.txt, x2.txt, 1x1.gif',
                            },
                            'attachment_1': file('rtkit/tests/attach/x1.txt'),
                            'attachment_2': file('rtkit/tests/attach/x2.txt'),
                            'attachment_3': file('rtkit/tests/attach/1x1.gif'),
                        })

    def test_read_tkt_comment(self):
        expected = Expected(
            parsed=[[('id', '2831'), ('Ticket', '216'), ('TimeTaken', '0'),
                     ('Type', 'Create'), ('Field', ''), ('OldValue', ''),
                     ('NewValue', ''), ('Data', ''),
                     ('Description', 'Ticket created by john.foo'),
                     ('Content', 'this is a\nmultiline\nticket'),
                     ('Creator', 'john.foo'),
                     ('Created', '2013-02-14 18:00:45'),
                     ('Attachments', '\n1315: untitled (38b)')]],
            status_int=200,
            status='200 Ok',
            req_body='',
            req_headers=self.req_headers_get,
        )
        self.assertGet(
            body='''RT/4.0.5-116-g591e06a 200 Ok

# 2/2 (id/2831/total)

id: 2831
Ticket: 216
TimeTaken: 0
Type: Create
Field:
OldValue:
NewValue:
Data:
Description: Ticket created by john.foo

Content: this is a
         multiline
         ticket


Creator: john.foo
Created: 2013-02-14 18:00:45

Attachments:
             1315: untitled (38b)
''',
            expected=expected,
        )