|
23 | 23 | check_existing_instrument, |
24 | 24 | check_instrument_id, |
25 | 25 | ensure_timezone, |
| 26 | + get_iacuc_protocol, |
26 | 27 | get_instrument, |
27 | 28 | get_intended_measurements, |
28 | 29 | get_procedures, |
@@ -639,5 +640,63 @@ def input_func(prompt): |
639 | 640 | self.assertTrue(any("Help" in str(call) for call in mock_print.call_args_list)) |
640 | 641 |
|
641 | 642 |
|
| 643 | +class TestGetIacucProtocol(unittest.TestCase): |
| 644 | + """Tests for get_iacuc_protocol function.""" |
| 645 | + |
| 646 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 647 | + def test_returns_protocol_number_field(self, mock_helper): |
| 648 | + """The protocol_number field (joined from the IacucProtocol table) is returned.""" |
| 649 | + mock_helper.return_value = [{"group_name": "Exp-ND-01-001-2414", "protocol_number": "2414"}] |
| 650 | + self.assertEqual(get_iacuc_protocol("818908"), "2414") |
| 651 | + |
| 652 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 653 | + def test_accepts_int_subject_id(self, mock_helper): |
| 654 | + """An int subject_id is cast to str and handled.""" |
| 655 | + mock_helper.return_value = [{"protocol_number": "2414"}] |
| 656 | + self.assertEqual(get_iacuc_protocol(818908), "2414") |
| 657 | + |
| 658 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 659 | + def test_returns_protocol_when_group_name_lacks_number(self, mock_helper): |
| 660 | + """A breeding-group name with no trailing number still resolves via protocol_number.""" |
| 661 | + mock_helper.return_value = [{"group_name": "Pdyn-IRES-Cre;Oi9(ND)", "protocol_number": "2453"}] |
| 662 | + self.assertEqual(get_iacuc_protocol("x"), "2453") |
| 663 | + |
| 664 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 665 | + def test_numeric_protocol_number_is_coerced_to_str(self, mock_helper): |
| 666 | + """A non-string protocol_number is coerced to str.""" |
| 667 | + mock_helper.return_value = [{"protocol_number": 2414}] |
| 668 | + self.assertEqual(get_iacuc_protocol("x"), "2414") |
| 669 | + |
| 670 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 671 | + def test_null_protocol_number_returns_none(self, mock_helper): |
| 672 | + """A record with a null protocol_number yields None.""" |
| 673 | + mock_helper.return_value = [{"group_name": "Practice Mice", "protocol_number": None}] |
| 674 | + self.assertIsNone(get_iacuc_protocol("x")) |
| 675 | + |
| 676 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 677 | + def test_missing_protocol_number_returns_none(self, mock_helper): |
| 678 | + """A record without a protocol_number yields None.""" |
| 679 | + mock_helper.return_value = [{}] |
| 680 | + self.assertIsNone(get_iacuc_protocol("x")) |
| 681 | + |
| 682 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 683 | + def test_no_records_returns_none(self, mock_helper): |
| 684 | + """No records (helper returns None) yields None.""" |
| 685 | + mock_helper.return_value = None |
| 686 | + self.assertIsNone(get_iacuc_protocol("x")) |
| 687 | + |
| 688 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 689 | + def test_dict_error_body_returns_none(self, mock_helper): |
| 690 | + """A non-list error body (e.g. {"detail": "Not Found"}) yields None.""" |
| 691 | + mock_helper.return_value = {"detail": "Not Found"} |
| 692 | + self.assertIsNone(get_iacuc_protocol("x")) |
| 693 | + |
| 694 | + @patch("aind_metadata_mapper.utils.metadata_service_helper") |
| 695 | + def test_exception_returns_none(self, mock_helper): |
| 696 | + """An unexpected error is caught and yields None.""" |
| 697 | + mock_helper.side_effect = ValueError("boom") |
| 698 | + self.assertIsNone(get_iacuc_protocol("x")) |
| 699 | + |
| 700 | + |
642 | 701 | if __name__ == "__main__": |
643 | 702 | unittest.main() |
0 commit comments