92 lines
2.8 KiB
Python
92 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
|
from __future__ import annotations
|
|
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
from redmine_ticket_attachments import (
|
|
attachments_from_issue,
|
|
pick_attachment,
|
|
safe_filename,
|
|
upload_file_token,
|
|
)
|
|
from redmine_tickets import build_parser, inject_default_sync_command
|
|
|
|
|
|
class AttachmentHelpersTest(unittest.TestCase):
|
|
def test_pick_and_safe(self):
|
|
atts = [{"id": 1, "filename": "a.pdf"}, {"id": 2, "filename": "b.pdf"}]
|
|
self.assertEqual(2, pick_attachment(atts, 2)["id"])
|
|
with self.assertRaises(LookupError):
|
|
pick_attachment(atts, None)
|
|
self.assertEqual(1, pick_attachment([atts[0]], None)["id"])
|
|
self.assertEqual("foo_bar.pdf", safe_filename("foo/bar.pdf"))
|
|
|
|
def test_attachments_from_issue(self):
|
|
self.assertEqual([], attachments_from_issue({}))
|
|
self.assertEqual(1, len(attachments_from_issue({"attachments": [{"id": 9}]})))
|
|
|
|
def test_cli_parse(self):
|
|
args = build_parser().parse_args(
|
|
inject_default_sync_command(
|
|
[
|
|
"--project",
|
|
"customer-service",
|
|
"attachments",
|
|
"list",
|
|
"--issue-id",
|
|
"1",
|
|
"--refresh",
|
|
]
|
|
)
|
|
)
|
|
self.assertEqual("attachments", args.command)
|
|
self.assertEqual("list", args.attachments_command)
|
|
self.assertTrue(args.refresh)
|
|
|
|
args2 = build_parser().parse_args(
|
|
inject_default_sync_command(
|
|
[
|
|
"attachments",
|
|
"upload",
|
|
"--issue-id",
|
|
"2",
|
|
"--file",
|
|
"/tmp/x.pdf",
|
|
"--apply",
|
|
]
|
|
)
|
|
)
|
|
self.assertEqual("upload", args2.attachments_command)
|
|
self.assertTrue(args2.apply)
|
|
|
|
def test_upload_token_mock(self):
|
|
with tempfile.TemporaryDirectory() as td:
|
|
path = Path(td) / "note.txt"
|
|
path.write_text("hello", encoding="utf-8")
|
|
|
|
class FakeResp:
|
|
def read(self):
|
|
return b'{"upload":{"token":"tok.123","id":1}}'
|
|
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, *a):
|
|
return False
|
|
|
|
with patch("redmine_ticket_attachments.urllib_request.urlopen", return_value=FakeResp()):
|
|
upload = upload_file_token(
|
|
base_url="http://192.168.50.170",
|
|
api_key="x",
|
|
path=path,
|
|
)
|
|
self.assertEqual("tok.123", upload["token"])
|
|
self.assertEqual("note.txt", upload["filename"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|