class TestDataSortedByQTypeEventProcessor(unittest.TestCase):
    def setUp(self):
        self.r = fakeredis.FakeStrictRedis()
        self.test_config = json.load(open(TEST_CONFIG_FILE))
        self.qtype_ep = DataSortedByQTypeEventProcessor(self.r, self.test_config)

    def tearDown(self):
        self.r.flushall()

    def test_select_item(self):
        input_data = {"qtype_data": [
            {"qtype": 1, "queries": [{"ip": 'ip1', "queries_count": 1},
                                     {"ip": 'ip2', "queries_count": 5},
                                     {"ip": 'ip3', "queries_count": 10}]},
            {"qtype": 2, "queries": [{"ip": 'ip4', "queries_count": 1},
                                     {"ip": 'ip5', "queries_count": 5},
                                     {"ip": 'ip6', "queries_count": 10}]},
            {"qtype": 3, "queries": [{"ip": 'ip7', "queries_count": 1},
                                     {"ip": 'ip8', "queries_count": 5},
                                     {"ip": 'ip9', "queries_count": 10}]}
        ], "time_span": 1}

        result = self.qtype_ep.select_item(input_data)

        expected_output_data = {"qtype_data": [
            {"qtype": 1, "queries": [{"ip": 'ip3', "queries_count": 10},
                                     {"ip": 'ip2', "queries_count": 5}]},
            {"qtype": 2, "queries": [{"ip": 'ip6', "queries_count": 10},
                                     {"ip": 'ip5', "queries_count": 5}]},
            {"qtype": 3, "queries": [{"ip": 'ip9', "queries_count": 10},
                                     {"ip": 'ip8', "queries_count": 5}]}
        ], "time_span": 1}

        self.assertDictEqual(result, expected_output_data)

    def test_process(self):
        input_item_1 = {"type": "QueriesSummary", "timeStamp": 1, "serverId": "server1",
                        "data": [{"ip": "ip1", "queries": {"qtype1": ["domain1", "domain2"],
                                                           "qtype2": ["domain3", "domain4"]}},
                                 {"ip": "ip2", "queries": {"qtype2": ["domain2"]}},
                                 {"ip": "ip3", "queries": {"qtype1": ["domain5", "domain6"]}}]}

        _, result = self.qtype_ep.process(input_item_1)

        expected_output = [{"time_span": 1, "qtype_data": [
            {"qtype": "qtype2", "queries": [
                {"ip": "ip1", "qtype_queries_percentage": 2 * 100 / 3, "queries_count": 2, "server_id": "server1",
                 "total_queries_percentage": 2 * 100 / 7},
                {"ip": "ip2", "qtype_queries_percentage": 1 * 100 / 3, "queries_count": 1, "server_id": "server1",
                 "total_queries_percentage": 1 * 100 / 7}]},
            {"qtype": "qtype1", "queries": [
                {"ip": "ip3", "qtype_queries_percentage": 2 * 100 / 4, "queries_count": 2, "server_id": "server1",
                 "total_queries_percentage": 2 * 100 / 7},
                {"ip": "ip1", "qtype_queries_percentage": 2 * 100 / 4, "queries_count": 2, "server_id": "server1",
                 "total_queries_percentage": 2 * 100 / 7}]}]}]

        # TODO: assert on lists within dictionaries
        # self.assertDictEqual(result[0]["qtype_data"][0], expected_output[0]["qtype_data"][0])
        pass
 def setUp(self):
     self.r = fakeredis.FakeStrictRedis()
     self.test_config = json.load(open(TEST_CONFIG_FILE))
     self.qtype_ep = DataSortedByQTypeEventProcessor(self.r, self.test_config)