import unittest
from collector import Collector, FixtureSource, Query, demo_collector


class CollectorTests(unittest.TestCase):
    def setUp(self):
        self.query = Query("checkout", "production", "2026-09-01T10:00:00Z", "2026-09-01T10:15:00Z")

    def test_actual_queries_share_coordinates(self):
        collector = demo_collector()
        rows = collector.collect(self.query)["evidence"]
        for source in collector.sources.values():
            self.assertEqual(source.queries, [self.query])
        self.assertTrue(all(row["query"] == rows[0]["query"] for row in rows))

    def test_service_environment_and_window_filtering(self):
        rows = demo_collector().collect(self.query)["evidence"]
        self.assertEqual([row["event"] for row in rows[0]["records"]], ["DEMO-E1"])
        self.assertEqual(rows[1]["records"], [])

    def test_empty_is_not_timeout(self):
        rows = demo_collector().collect(self.query)["evidence"]
        self.assertEqual(rows[1]["state"], "received")
        self.assertEqual(rows[2]["state"], "unavailable")
        self.assertNotIn("records", rows[2])

    def test_end_is_exclusive(self):
        source = FixtureSource([{"service": "checkout", "environment": "production", "at": self.query.end}])
        self.assertEqual(source.query(self.query), [])

    def test_invalid_windows(self):
        for start, end in [("2026-09-01T10:00:00", self.query.end), (self.query.end, self.query.start),
                           (self.query.start, "2026-09-01T12:00:00Z")]:
            with self.assertRaises(ValueError):
                Query("checkout", "production", start, end)

    def test_source_error_does_not_leak_message(self):
        class Broken:
            def query(self, request):
                raise RuntimeError("secret-example-credential")
        result = Collector({"broken": Broken()}).collect(self.query)
        self.assertNotIn("secret-example-credential", str(result))
        self.assertEqual(result["evidence"][0]["error"], "source_error")


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