import unittest
from listing_check import check_listing


class ListingCheckTests(unittest.TestCase):
    def listing(self, **updates):
        return {"sku": "CUP-17", "title": "500 ml travel cup",
                "material": "steel", "capacity_ml": 500, **updates}

    def test_two_findings(self):
        report = check_listing(self.listing(material="", capacity_ml=350))
        self.assertEqual([i["field"] for i in report["issues"]], ["material", "capacity_ml"])

    def test_corrected(self):
        self.assertFalse(check_listing(self.listing())["needs_review"])

    def test_numeric_boundary_and_case(self):
        for title, capacity in [("1500 ml travel cup", 1500), ("500 ML cup", 500), ("500ml cup", 500)]:
            with self.subTest(title=title):
                self.assertEqual(check_listing(self.listing(title=title, capacity_ml=capacity))["issues"], [])

    def test_reject_ambiguous_and_invalid(self):
        for updates in [{"capacity_ml": True}, {"capacity_ml": 0}, {"material": None},
                        {"title": "500 ml / 350 ml cup"}, {"sku": ""}]:
            with self.subTest(updates=updates), self.assertRaises(ValueError):
                check_listing(self.listing(**updates))
        with self.assertRaises(ValueError):
            check_listing({})


if __name__ == "__main__":
    unittest.main()
