9fbc658aa6
This method can parse the ticket and (optional) attachment IDs out of our short-hand link formats, both for Ledger and Beancount.
123 lines
4.2 KiB
Python
123 lines
4.2 KiB
Python
"""Test RT integration"""
|
|
# Copyright © 2020 Brett Smith
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
import pytest
|
|
|
|
from . import testutil
|
|
|
|
from conservancy_beancount import rtutil
|
|
|
|
DEFAULT_RT_URL = testutil.RTClient.DEFAULT_URL[:-9]
|
|
|
|
EXPECTED_URLS = [
|
|
(1, None, 'Ticket/Display.html?id=1'),
|
|
(1, 2, 'Ticket/Display.html?id=1#txn-1'),
|
|
(1, 4, 'Ticket/Attachment/1/4/Forwarded%20Message.eml'),
|
|
(1, 99, None),
|
|
(2, 1, None),
|
|
(2, 10, 'Ticket/Attachment/7/10/screenshot.png'),
|
|
(2, 13, 'Ticket/Display.html?id=2#txn-11'),
|
|
(2, 14, 'Ticket/Display.html?id=2#txn-11'), # statement.txt
|
|
(3, None, 'Ticket/Display.html?id=3'),
|
|
(9, None, None),
|
|
]
|
|
|
|
@pytest.fixture(scope='module')
|
|
def rt():
|
|
client = testutil.RTClient()
|
|
return rtutil.RT(client)
|
|
|
|
@pytest.fixture
|
|
def new_client():
|
|
class RTClient(testutil.RTClient):
|
|
TICKET_DATA = {'1': [], '2': []}
|
|
return RTClient()
|
|
|
|
@pytest.mark.parametrize('ticket_id,attachment_id,expected', EXPECTED_URLS)
|
|
def test_url(rt, ticket_id, attachment_id, expected):
|
|
if expected is not None:
|
|
expected = DEFAULT_RT_URL + expected
|
|
assert rt.url(ticket_id, attachment_id) == expected
|
|
|
|
@pytest.mark.parametrize('attachment_id', [
|
|
3,
|
|
None,
|
|
])
|
|
def test_url_caches(new_client, attachment_id):
|
|
new_client.TICKET_DATA['1'].append(('3', '(Unnamed)', 'text/plain', '3.0k'))
|
|
if attachment_id is None:
|
|
fragment = ''
|
|
else:
|
|
fragment = '#txn-3'
|
|
expected = '{}Ticket/Display.html?id=1{}'.format(DEFAULT_RT_URL, fragment)
|
|
rt = rtutil.RT(new_client)
|
|
assert rt.url(1, attachment_id) == expected
|
|
new_client.TICKET_DATA.clear()
|
|
assert rt.url(1, attachment_id) == expected
|
|
|
|
@pytest.mark.parametrize('mimetype,extension', [
|
|
('application/pdf', 'pdf'),
|
|
('image/png', 'png'),
|
|
('message/rfc822', 'eml'),
|
|
('x-test/x-unknown', 'bin'),
|
|
])
|
|
def test_url_default_filename(new_client, mimetype, extension):
|
|
new_client.TICKET_DATA['1'].append(('9', '(Unnamed)', mimetype, '50.5k'))
|
|
rt = rtutil.RT(new_client)
|
|
expected = '{}Ticket/Attachment/9/9/RT1%20attachment%209.{}'.format(DEFAULT_RT_URL, extension)
|
|
assert rt.url(1, 9) == expected
|
|
|
|
@pytest.mark.parametrize('ticket_id,attachment_id,expected', EXPECTED_URLS)
|
|
def test_exists(rt, ticket_id, attachment_id, expected):
|
|
expected = False if expected is None else True
|
|
assert rt.exists(ticket_id, attachment_id) is expected
|
|
|
|
def test_exists_caches(new_client):
|
|
new_client.TICKET_DATA['1'].append(('3', '(Unnamed)', 'text/plain', '3.0k'))
|
|
rt = rtutil.RT(new_client)
|
|
assert rt.exists(1, 3)
|
|
assert rt.exists(2)
|
|
assert not rt.exists(1, 9)
|
|
assert not rt.exists(9)
|
|
new_client.TICKET_DATA.clear()
|
|
assert rt.exists(1, 3)
|
|
assert rt.exists(2)
|
|
assert not rt.exists(1, 9)
|
|
assert not rt.exists(9)
|
|
|
|
@pytest.mark.parametrize('link,expected', [
|
|
('rt:1/2', ('1', '2')),
|
|
('rt:123/456', ('123', '456')),
|
|
('rt:12345', ('12345', None)),
|
|
('rt:12346/', ('12346', None)),
|
|
('rt:12346/789', ('12346', '789')),
|
|
('rt:12346/780/', ('12346', '780')),
|
|
('rt://ticket/1', ('1', None)),
|
|
('rt://ticket/1/', ('1', None)),
|
|
('rt://ticket/1234/attachments/5678', ('1234', '5678')),
|
|
('rt://ticket/1234/attachments/5678/', ('1234', '5678')),
|
|
('rt://ticket/1234/attachment/5678', ('1234', '5678')),
|
|
('rt://ticket/1234/attachment/5678/', ('1234', '5678')),
|
|
('rt:', None),
|
|
('rt://', None),
|
|
('rt:example.org', None),
|
|
('rt:example.org/1', None),
|
|
('rt://example.org', None),
|
|
('rt://example.org/1', None),
|
|
('https://example.org/rt/Ticket/Display.html?id=123', None),
|
|
])
|
|
def test_parse(rt, link, expected):
|
|
assert rt.parse(link) == expected
|