#!/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()