import unittest
from orders import demo_service


class OrdersTests(unittest.TestCase):
    def setUp(self):
        self.service = demo_service()

    def test_same_metric_different_fields(self):
        sales = self.service.get_order("demo-sales", "DEMO-42")
        analysis = self.service.get_order("demo-analysis", "DEMO-42")
        self.assertEqual(sales["total"], analysis["total"])
        self.assertEqual(sales["metric"], "order_total_not_booked_revenue")
        self.assertEqual(sales["metric"], analysis["metric"])
        self.assertIn("delivery_note", sales)
        self.assertNotIn("delivery_note", analysis)
        self.assertNotIn("status", analysis)

    def test_unknown_caller_never_reads(self):
        with self.assertRaises(PermissionError):
            self.service.get_order("unknown", "DEMO-42")
        self.assertEqual(self.service.reads, [])

    def test_order_scope_before_read(self):
        with self.assertRaises(PermissionError):
            self.service.get_order("demo-sales", "DEMO-43")
        self.assertEqual(self.service.reads, [])
        self.assertEqual(self.service.get_order("demo-analysis", "DEMO-43")["total"]["amount_cents"], 5400)

    def test_unknown_order_does_not_reveal_existence(self):
        with self.assertRaises(PermissionError):
            self.service.get_order("demo-sales", "MISSING")
        self.assertEqual(self.service.reads, [])

    def test_response_mutation_does_not_modify_source(self):
        result = self.service.get_order("demo-sales", "DEMO-42")
        result["total"]["amount_cents"] = 0
        self.assertEqual(self.service.get_order("demo-analysis", "DEMO-42")["total"]["amount_cents"], 10800)


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