def setUp(self):
     self.r = fakeredis.FakeStrictRedis()
     self.test_config = json.load(open(TEST_CONFIG_FILE))
     self.top_qnames_ep = TopQNamesWithIPEventProcessor(self.r, self.test_config)
class TestTopQNamesWithIPEventProcessor(unittest.TestCase):
    def setUp(self):
        self.r = fakeredis.FakeStrictRedis()
        self.test_config = json.load(open(TEST_CONFIG_FILE))
        self.top_qnames_ep = TopQNamesWithIPEventProcessor(self.r, self.test_config)

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

    def test_select_item(self):
        input_data = {"qnames_data": [
            {"qname": 'qname1',
             "total_count": 7,
             "servers_data": [
                 {"qname_server_count": 3,
                  "server_id": 'server1',
                  "top_ips": [{"ip": 'ip1', "ip_server_count": 1},
                              {"ip": 'ip2', 'ip_server_count': 2}]},
                 {"qname_server_count": 4,
                  "server_id": 'server2',
                  "top_ips": [{"ip": 'ip3',
                               "ip_server_count": 1},
                              {"ip": 'ip4',
                               'ip_server_count': 2},
                              {"ip": 'ip5',
                               "ip_server_count": 1}]}]},
            {"qname": 'qname2',
             "total_count": 10,
             "servers_data": [
                 {"qname_server_count": 9,
                  "server_id": 'server1',
                  "top_ips": [{"ip": 'ip1', "ip_server_count": 3},
                              {"ip": 'ip2', "ip_server_count": 5},
                              {"ip": 'ip6', "ip_server_count": 2}]},
                 {"qname_server_count": 1,
                  "server_id": 'server2',
                  "top_ips": [{"ip": 'ip5', "ip_server_count": 1}]}]},
            {"qname": 'qname3',
             "total_count": 2,
             "servers_data": [
                 {"qname_server_count": 2,
                  "server_id": 'server1',
                  "top_ips": [{"ip": 'ip5',
                               "ip_server_count": 2}]}]},
            {"qname": 'qname4',
             "total_count": 12,
             "servers_data": [
                 {"qname_server_count": 6,
                  "server_id": 'server1',
                  "top_ips": [{"ip": 'ip1', "ip_server_count": 1},
                              {"ip": 'ip2', 'ip_server_count': 2},
                              {"ip": 'ip6', 'ip_server_count': 3}]},
                 {"qname_server_count": 6,
                  "server_id": 'server2',
                  "top_ips": [{"ip": 'ip3',
                               "ip_server_count": 1},
                              {"ip": 'ip4',
                               'ip_server_count': 5}]}]},
            {"qname": 'qname5',
             "total_count": 1,
             "servers_data": [
                 {"qname_server_count": 1,
                  "server_id": 'server1',
                  "top_ips": [{"ip": 'ip1', "ip_server_count": 1}]}]}],
            "time_span": 1}

        result = self.top_qnames_ep.select_item(input_data)

        expected_output_data = {"qnames_data": [
            {"qname": 'qname4',
             "total_count": 12,
             "servers_data": [
                 {"qname_server_count": 6,
                  "server_id": 'server1',
                  "top_ips": [{"ip": 'ip6', 'ip_server_count': 3},
                              {"ip": 'ip2', 'ip_server_count': 2}]},
                 {"qname_server_count": 6,
                  "server_id": 'server2',
                  "top_ips": [{"ip": 'ip4',
                               "ip_server_count": 5},
                              {"ip": 'ip3',
                               'ip_server_count': 1}]}]},
            {"qname": 'qname2',
             "total_count": 10,
             "servers_data": [
                 {"qname_server_count": 9,
                  "server_id": 'server1',
                  "top_ips": [{"ip": 'ip2', "ip_server_count": 5},
                              {"ip": 'ip1', "ip_server_count": 3}]},
                 {"qname_server_count": 1,
                  "server_id": 'server2',
                  "top_ips": [{"ip": 'ip5', "ip_server_count": 1}]}]}], "time_span": 1}

        self.assertDictEqual(result, expected_output_data)

    def test_process(self):
        input_item_1 = {"type": "QueryNameCounterWithIPs", "timeStamp": 1, "serverId": "server1",
                        "data":
                            {"domain1": ["ip1"],
                             "domain2": ["ip1", "ip2"],
                             "domain3": ["ip3", "ip4"]}}

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

        expected_output = [{"time_span": 1, "qnames_data": [
            {"qname": "domain3", "total_count": 2, "servers_data": [
                {"server_id": "server1", "qname_server_count": 2, "top_ips": [
                    {"ip": "ip3", "ip_server_count": 1, "ip_server_percentage": 100 * 1 / 2},
                    {"ip": "ip4", "ip_server_count": 1, "ip_server_percentage": 100 * 1 / 2}]}]},
            {"qname": "domain2", "total_count": 2, "servers_data": [
                {"server_id": "server1", "qname_server_count": 2, "top_ips": [
                    {"ip": "ip1", "ip_server_count": 1, "ip_server_percentage": 100 * 1 / 2},
                    {"ip": "ip2", "ip_server_count": 1, "ip_server_percentage": 100 * 1 / 2}]}]}]}]

        # TODO: assert on lists within dictionaries
        # self.assertDictEqual(expected_output[0]["qnames_data"][0], result[0]["qnames_data"][0])
        pass