97 lines
3.3 KiB
Python
97 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
|
from __future__ import annotations
|
|
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
from redmine_ticket_meta import (
|
|
normalize_name,
|
|
resolve_id_by_name,
|
|
users_from_memberships,
|
|
)
|
|
from redmine_ticket_contacts import (
|
|
ContactCache,
|
|
contact_display_name,
|
|
filter_contacts,
|
|
primary_email,
|
|
)
|
|
from redmine_tickets import build_fields_payload_from_args, build_parser, inject_default_sync_command
|
|
|
|
|
|
class MetaResolveTest(unittest.TestCase):
|
|
def test_resolve_status(self):
|
|
statuses = [{"id": 1, "name": "New"}, {"id": 5, "name": "Closed"}]
|
|
self.assertEqual(5, resolve_id_by_name(statuses, "closed"))
|
|
self.assertEqual(5, resolve_id_by_name(statuses, "5"))
|
|
|
|
def test_users_from_memberships(self):
|
|
users = users_from_memberships(
|
|
[
|
|
{"user": {"id": 2, "name": "Jason T.", "login": "jason"}},
|
|
{"user": {"id": 2, "name": "Jason T."}},
|
|
{"group": {"id": 9, "name": "CS"}},
|
|
]
|
|
)
|
|
self.assertEqual(1, len(users))
|
|
self.assertEqual(2, resolve_id_by_name(users, "jason", name_keys=("name", "login")))
|
|
|
|
def test_set_fields_name_cli_parse(self):
|
|
args = build_parser().parse_args(
|
|
inject_default_sync_command(
|
|
[
|
|
"--project",
|
|
"customer-service",
|
|
"set-fields",
|
|
"--issue-id",
|
|
"1",
|
|
"--status",
|
|
"Closed",
|
|
"--assigned-to",
|
|
"unassigned",
|
|
]
|
|
)
|
|
)
|
|
self.assertEqual("Closed", args.status_name)
|
|
self.assertEqual("unassigned", args.assignee_name)
|
|
# build with resolved
|
|
payload = build_fields_payload_from_args(
|
|
args,
|
|
resolved_ids={"status_id": 5, "assigned_to_id": 0},
|
|
)
|
|
self.assertEqual(5, payload["status_id"])
|
|
self.assertIsNone(payload["assigned_to_id"])
|
|
|
|
|
|
class ContactsCacheTest(unittest.TestCase):
|
|
def test_write_filter(self):
|
|
with tempfile.TemporaryDirectory() as td:
|
|
cache = ContactCache(Path(td))
|
|
cache.write_contact(
|
|
{
|
|
"id": 7,
|
|
"name": "Ada Lovelace",
|
|
"email": "ada@example.com",
|
|
"company": "Analytical Engines",
|
|
"updated_on": "2026-07-01T00:00:00Z",
|
|
"tag_list": ["customer", "vip"],
|
|
}
|
|
)
|
|
loaded = cache.load_contact(7)
|
|
self.assertEqual("Ada Lovelace", contact_display_name(loaded))
|
|
self.assertEqual("ada@example.com", primary_email(loaded))
|
|
allc = list(cache.iter_contacts())
|
|
hits = filter_contacts(allc, query="analytical", tag="customer")
|
|
self.assertEqual(1, len(hits))
|
|
self.assertFalse(cache.should_fetch({"id": 7, "updated_on": "2026-07-01T00:00:00Z"}))
|
|
self.assertTrue(cache.should_fetch({"id": 7, "updated_on": "2026-07-02T00:00:00Z"}))
|
|
|
|
|
|
class NormalizeTest(unittest.TestCase):
|
|
def test_normalize(self):
|
|
self.assertEqual("jason t.", normalize_name(" Jason T. "))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|