def test_process_global_vendor_point(self, _handle_mapping, uow):
        global_vendor_point_handler = GlobalVendorPointHandler()
        global_vendor_point_handler.logger = Mock()
        johnson_fqr = Mock()
        johnson_site_id = Mock()
        ret_val = [{'syrx_num': Mock(), 'johnson_fqr': johnson_fqr,
                    'johnson_site_id': johnson_site_id, 'source': 'johnson'},
                   {'syrx_num': Mock(), 'johnson_fqr': johnson_fqr,
                    'johnson_site_id': johnson_site_id, 'source': 'johnson'},
                   {'syrx_num': Mock(), 'johnson_fqr': johnson_fqr,
                    'johnson_site_id': johnson_site_id, 'source': 'johnson'}]

        gvp = {'johnson_fqr': johnson_fqr,
               'johnson_site_id': johnson_site_id,
               'source': 'johnson'}

        uow.return_value.data_mapping.get_mappings_for_johnson_site_id_fqr.return_value = ret_val

        global_vendor_point_handler._process_global_vendor_point(gvp)

        uow.return_value.data_mapping.get_mappings_for_johnson_site_id_fqr.assert_called_with([[gvp['johnson_site_id'],
                                                                                                gvp['johnson_fqr']]])
        _handle_mapping.assert_has_calls([call(ret_val[0]),
                                          call(ret_val[1]),
                                          call(ret_val[2])])
    def test_find_new_records(self, _get_all_records_by_datetime, uow):
        global_vendor_point_handler = GlobalVendorPointHandler()
        global_vendor_point_handler.logger = Mock()
        mapping = {'syrx_num': Mock(), 'johnson_fqr': Mock(),
                   'johnson_site_id': Mock(), 'source': 'johnson'}
        date_1_mock = Mock()
        date_2_mock = Mock()
        date_3_mock = Mock()
        date_4_mock = Mock()
        existing_records = {date_1_mock: {'date': date_1_mock, 'value': 1},
                            date_2_mock: {'date': date_2_mock, 'value': 2}}
        all_records = [{'date': date_1_mock, 'value': 1},
                       {'date': date_2_mock, 'value': 2},
                       {'date': date_3_mock, 'value': 3},
                       {'date': date_4_mock, 'value': 4}]
        all_records_by_date = {date_1_mock: all_records[0],
                               date_2_mock: all_records[1],
                               date_3_mock: all_records[2],
                               date_4_mock: all_records[3]}
        uow.return_value.global_vendor_point_records.get_all_for_johnson_point.return_value = all_records
        _get_all_records_by_datetime.return_value = all_records_by_date

        rv = global_vendor_point_handler._find_new_records(mapping, existing_records)

        uow.return_value.global_vendor_point_records.get_all_for_johnson_point.assert_called_with(mapping['johnson_site_id'],
                                                                                                  mapping['johnson_fqr'])
        _get_all_records_by_datetime.assert_called_with(all_records)

        self.assertEqual(len(rv), 2)
        self.assertTrue(all_records[2] in rv)
        self.assertTrue(all_records[3] in rv)
    def test_get_all_records_by_datetime(self, uow):
        global_vendor_point_handler = GlobalVendorPointHandler()
        global_vendor_point_handler.logger = Mock()
        records = [{'date': Mock(), 'value': 1},
                   {'date': Mock(), 'value': 2}]

        rv = global_vendor_point_handler._get_all_records_by_datetime(records)

        self.assertEqual(len(rv.keys()), 2)
        self.assertTrue(records[0]['date'] in rv.keys() and records[1]['date'] in rv.keys())
    def test_handle_mapping(self, _insert_new_records, _find_new_records, _get_existing_records_by_datetime, uow):
        global_vendor_point_handler = GlobalVendorPointHandler()
        global_vendor_point_handler.logger = Mock()
        mapping = {'syrx_num': Mock(), 'johnson_fqr': Mock(),
                   'johnson_site_id': Mock(), 'source': 'johnson'}

        global_vendor_point_handler._handle_mapping(mapping)

        uow.return_value.energy_records.get_all_equipment_point_records_for_syrx_num.assert_called_with(mapping['syrx_num'])

        _get_existing_records_by_datetime.assert_called_with(uow.return_value.energy_records.get_all_equipment_point_records_for_syrx_num.return_value)
        _find_new_records.assert_called_with(mapping, _get_existing_records_by_datetime.return_value)
        _insert_new_records.assert_called_with(mapping, _find_new_records.return_value)
    def test_process_all_global_vendor_points(self, _process_global_vendor_point, uow):
        global_vendor_point_handler = GlobalVendorPointHandler()
        global_vendor_point_handler.logger = Mock()
        ret_val = [{'johnson_fqr': Mock(), 'johnson_site_id': Mock(), 'source': 'johnson'},
                   {'fieldserver_offset': Mock(), 'fieldserver_site_id': Mock(), 'source': 'fieldserver'},
                   {'siemens_meter_name': Mock(), 'source': 'siemens'},
                   {'invensys_site_name': Mock(), 'invensys_equipment_name': Mock(),
                    'invensys_point_name': Mock(), 'source': 'invensys'}]
        uow.return_value.data_mapping.get_all_global_vendor_points.return_value = ret_val

        global_vendor_point_handler.process_all_global_vendor_points()

        uow.return_value.data_mapping.get_all_global_vendor_points.assert_called_with()

        _process_global_vendor_point.assert_has_calls([call(ret_val[0]),
                                                       call(ret_val[1]),
                                                       call(ret_val[2]),
                                                       call(ret_val[3])])
    def test_insert_new_records(self, _handle_bad_records, _get_weather_data, _populate_weatherstation_id_on_records, energy_record_compiler, uow):
        global_vendor_point_handler = GlobalVendorPointHandler()
        global_vendor_point_handler.logger = Mock()

        date_1 = datetime.datetime(2014, 1, 1)
        date_2 = datetime.datetime(2014, 1, 2)
        date_1_utc = pytz.utc.localize(date_1)
        date_2_utc = pytz.utc.localize(date_2)
        mapping = {'syrx_num': Mock(), 'johnson_fqr': Mock(),
                   'johnson_site_id': Mock(), 'source': 'johnson'}
        records_to_insert = [{'date': date_1_utc, 'value': 3, 'timestamp': '2014-01-01 00:00:00'},
                             {'date': date_2_utc, 'value': 4, 'timestamp': '2014-01-02 00:00:00'}]
        weather_data = {'1': {date_1_utc: Mock(),
                              date_2_utc: Mock()}}
        _get_weather_data.return_value = weather_data

        def populate_weatherstation_id_side_effect(syrx_num, records):
            for r in records:
                r['weatherstation_id'] = '1'
        _populate_weatherstation_id_on_records.side_effect = populate_weatherstation_id_side_effect

        def get_equipment_point_record_side_effect(dt, syrx, value, weather, dt_2):
            return {'date': '1'}
        uow.return_value.energy_records.get_equipment_point_record.side_effect = get_equipment_point_record_side_effect

        global_vendor_point_handler._insert_new_records(mapping, records_to_insert)

        _populate_weatherstation_id_on_records.assert_called_with(mapping['syrx_num'], records_to_insert)
        _get_weather_data.assert_called_with(records_to_insert)

        uow.return_value.energy_records.get_equipment_point_record.assert_any_call(date_1_utc,
                                                                                   mapping['syrx_num'],
                                                                                   float(records_to_insert[0]['value']),
                                                                                   weather_data['1'][date_1_utc],
                                                                                   global_vendor_point_handler.date_time)
        uow.return_value.energy_records.get_equipment_point_record.assert_any_call(date_2_utc,
                                                                                   mapping['syrx_num'],
                                                                                   float(records_to_insert[1]['value']),
                                                                                   weather_data['1'][date_2_utc],
                                                                                   global_vendor_point_handler.date_time)

        uow.return_value.energy_records.insert_equipment_point_records.assert_called_with([{'date': '1'}, {'date': '1'}])

        self.assertTrue(not _handle_bad_records.called)