"""Run: python3 -m unittest test_report.py (no EasyNet setup required)."""

from pathlib import Path
import unittest

from report import sales_report

ROOT = Path(__file__).resolve().parent
HEADER = "product,quantity,unit_price_cents\n"


class SalesReportTests(unittest.TestCase):
    def test_published_result_is_actual_output(self):
        self.assertEqual(sales_report((ROOT / "input.csv").read_text()), (ROOT / "output.md").read_text())

    def test_integer_cents(self):
        self.assertIn("Total: USD 0.30", sales_report(HEADER + "Pen,3,10\n"))

    def test_allows_exact_row_limit(self):
        self.assertIn("Total: USD 1.00", sales_report(HEADER + "Pen,1,1\n" * 100))

    def test_rejects_malformed_header_consistently(self):
        with self.assertRaisesRegex(ValueError, "Malformed CSV header"):
            sales_report('"product,quantity,unit_price_cents\n')

    def test_byte_limit_not_only_character_limit(self):
        with self.assertRaisesRegex(ValueError, "32 KiB"):
            sales_report("\u754c" * 11000)

    def test_rejects_non_text(self):
        for value in [None, 123, b"product,quantity,unit_price_cents"]:
            with self.subTest(value=value), self.assertRaises(ValueError):
                sales_report(value)

    def test_rejects_bad_input(self):
        samples = ["", HEADER, "wrong,columns\na,b\n", HEADER + "Pen,1\n",
                   HEADER + "Pen,1,20,extra\n", HEADER + "Pen,-1,20\n",
                   HEADER + "Pen,1.5,20\n", HEADER + "Pen,0,20\n",
                   HEADER + "Pen,1,0\n", HEADER + "Pen,10001,20\n",
                   HEADER + "Pen,1,100000001\n", HEADER + "[link](url),1,20\n",
                   HEADER + "Pen,1,20\n" * 101, "x" * 32769,
                   HEADER + '"unclosed,1,20\n']
        for sample in samples:
            with self.subTest(sample=sample[:80]), self.assertRaises(ValueError):
                sales_report(sample)


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