def test_get_processed_fieldserver_records_invalid_bool_value(self, _handle_record, uow):
        fieldserver_file_handler = FieldserverFileHandler()
        fieldserver_file_handler.logger = Mock()
        fieldserver_file_handler.date_time_str = Mock()
        fieldserver_file_handler.get_string_timestamp = Mock()

        mappings_dict = {("123456", 0): [{"syrx_num": "400000-0001-237323-BP-001", "point_type": "BP"}]}
        fieldserver_file_handler.get_mappings_dict = Mock(return_value=mappings_dict)

        records = [{"site_id": "123456", "offset": 0, "value": "a", "timestamp": "2014-09-07 23:00"}]

        def handle_record_side_effect(mapping, record, rv, error_messages):
            error_messages.append("Invalid value for boolean point")
        _handle_record.side_effect = handle_record_side_effect

        rv = fieldserver_file_handler.get_processed_fieldserver_records(records)

        _handle_record.assert_called_with(mappings_dict[("123456", 0)][0], records[0], rv,
                                          ["Invalid value for boolean point"])

        assert len(rv.good_records) == 0
        assert len(rv.bad_records) == 1
        assert len(rv.unmapped_vendor_points) == 0
        assert len(rv.global_vendor_point_records) == 0

        assert rv.bad_records[0] == {"site_id": "123456", "offset": 0, "value": "a", "timestamp": "2014-09-07 23:00",
                                     "error": {"date": fieldserver_file_handler.date_time_str,
                                               "messages": ["Invalid value for boolean point"]}}
    def test_get_processed_fieldserver_records_nonexistent_mapping(self, _handle_record, uow):
        fieldserver_file_handler = FieldserverFileHandler()
        fieldserver_file_handler.logger = Mock()
        fieldserver_file_handler.date_time_str = Mock()
        fieldserver_file_handler.get_string_timestamp = Mock()

        mappings_dict = {}
        fieldserver_file_handler.get_mappings_dict = Mock(return_value=mappings_dict)

        records = [{"site_id": "123456", "offset": 0, "value": "0.0", "timestamp": "2014-09-07 23:00"}]

        rv = fieldserver_file_handler.get_processed_fieldserver_records(records)

        assert not _handle_record.called

        assert len(rv.good_records) == 0
        assert len(rv.bad_records) == 1
        assert len(rv.unmapped_vendor_points) == 1
        assert len(rv.global_vendor_point_records) == 0

        assert rv.bad_records[0] == {"site_id": "123456", "offset": 0, "value": "0.0", "timestamp": "2014-09-07 23:00",
                                     "error": {"date": fieldserver_file_handler.date_time_str,
                                               "messages": ["Could not find vendor mapping"]}}

        assert rv.unmapped_vendor_points[0] == {"source": "fieldserver", "fieldserver_site_id": "123456",
                                                "fieldserver_offset": 0,
                                                "date_added": fieldserver_file_handler.date_time_str}
    def test_process_fieldserver_records(self, uow):
        fieldserver_file_handler = FieldserverFileHandler()
        fieldserver_file_handler.logger = Mock()
        fieldserver_file_handler.date_str = Mock()
        fieldserver_file_handler.handle_unmapped_vendor_points = Mock()

        processed_records = ProcessFieldserverRecordsReturn()
        processed_records.good_records = [
            {"name": "record0"},
            {"name": "record1"}
        ]
        processed_records.bad_records = [
            {"name": "record2"},
            {"name": "record3"}
        ]
        processed_records.unmapped_vendor_points = [
            {"name": "record4"},
            {"name": "record5"}
        ]
        processed_records.global_vendor_point_records = [
            {'name': 'record6'},
            {'name': 'record7'}
        ]
        fieldserver_file_handler.get_processed_fieldserver_records = Mock(return_value=processed_records)
        fieldserver_file_handler.make_global_vendor_point_records_unique = Mock(return_value=processed_records.global_vendor_point_records)

        records = [MagicMock(), MagicMock()]
        good_record_file = io.StringIO()
        bad_record_file = io.StringIO()

        rv = fieldserver_file_handler.process_fieldserver_records(records, good_record_file, bad_record_file)

        fieldserver_file_handler.get_processed_fieldserver_records.assert_called_with(records)

        good_record_file.seek(0)
        good_records_written_data = good_record_file.read().strip().split("\n")
        assert len(good_records_written_data) == 2
        assert json.loads(good_records_written_data[0]) == {"name": "record0"}
        assert json.loads(good_records_written_data[1]) == {"name": "record1"}

        bad_record_file.seek(0)
        bad_records_written_data = bad_record_file.read().strip().split("\n")
        assert len(bad_records_written_data) == 2
        assert json.loads(bad_records_written_data[0]) == {"name": "record2"}
        assert json.loads(bad_records_written_data[1]) == {"name": "record3"}

        fieldserver_file_handler.handle_unmapped_vendor_points.assert_called_with(processed_records.unmapped_vendor_points)

        assert rv.num_good_records == 2
        assert rv.num_bad_records == 2
        assert rv.num_unmapped_vendor_points == 2
    def test_get_processed_fieldserver_records_successful_global_multi_mapping(self, _handle_global_mapping, uow):
        fieldserver_file_handler = FieldserverFileHandler()
        fieldserver_file_handler.logger = Mock()
        fieldserver_file_handler.date_time_str = Mock()
        fieldserver_file_handler.get_string_timestamp = Mock()

        mappings_dict = {("123456", 0): [{"syrx_num": "400000-0001-237323-EP-001", "point_type": "EP", "global": True},
                                         {"syrx_num": "400000-0002-237323-NP-001", "point_type": "EP", "global": True}]}
        fieldserver_file_handler.get_mappings_dict = Mock(return_value=mappings_dict)

        records = [{"site_id": "123456", "offset": 0, "value": "100.1", "timestamp": "2014-09-07 23:00"}]

        def handle_global_mapping_side_effect(mapping, record, rv, error_messages):
            if mapping["point_type"] in ["EP", "NP", "PP"]:
                record["value"] = float(record["value"])
            elif mapping["point_type"] == "BP":
                record["value"] = float(record["value"])
                if record["value"] > 0:
                    record["value"] = 1.0
                else:
                    record["value"] = 0.0
            record["timestamp"] = fieldserver_file_handler.get_string_timestamp(record["timestamp"])
            global_record = {
                "source": "fieldserver",
                "fieldserver_site_id": str(record["site_id"]),
                "fieldserver_offset": str(record["offset"]),
                "timestamp": record["timestamp"],
                "value": record["value"],
                "date_added": fieldserver_file_handler.date_time_str
            }
            rv.global_vendor_point_records.append(global_record)
        _handle_global_mapping.side_effect = handle_global_mapping_side_effect

        rv = fieldserver_file_handler.get_processed_fieldserver_records(records)

        _handle_global_mapping.assert_has_calls([call(mappings_dict[("123456", 0)][0], records[0], rv, [])])

        assert len(rv.good_records) == 0
        assert len(rv.bad_records) == 0
        assert len(rv.unmapped_vendor_points) == 0
        assert len(rv.global_vendor_point_records) == 1

        assert rv.global_vendor_point_records[0] == {"source": "fieldserver", "fieldserver_site_id": "123456",
                                                     "fieldserver_offset": "0",
                                                     "timestamp": fieldserver_file_handler.get_string_timestamp.return_value,
                                                     "value": 100.1, "date_added": fieldserver_file_handler.date_time_str}
    def test_get_processed_fieldserver_records_successful(self, _handle_record, uow):
        fieldserver_file_handler = FieldserverFileHandler()
        fieldserver_file_handler.logger = Mock()
        fieldserver_file_handler.date_time_str = Mock()
        fieldserver_file_handler.get_string_timestamp = Mock()

        mappings_dict = {("123456", 0): [{"syrx_num": "400000-0001-237323-EP-001", "point_type": "EP"}],
                         ("123456", 1): [{"syrx_num": "400000-0001-237323-NP-001", "point_type": "NP"}],
                         ("123456", 2): [{"syrx_num": "400000-0001-237323-PP-001", "point_type": "PP"}],
                         ("123456", 3): [{"syrx_num": "400000-0001-237323-BP-001", "point_type": "BP"}]}
        fieldserver_file_handler.get_mappings_dict = Mock(return_value=mappings_dict)

        records = [{"site_id": "123456", "offset": 0, "value": "100.1", "timestamp": "2014-09-07 23:00"},
                   {"site_id": "123456", "offset": 1, "value": "100.2", "timestamp": "2014-09-07 23:00"},
                   {"site_id": "123456", "offset": 2, "value": "100.3", "timestamp": "2014-09-07 23:00"},
                   {"site_id": "123456", "offset": 3, "value": "1.0", "timestamp": "2014-09-07 23:00"},
                   {"site_id": "123456", "offset": 3, "value": "0.0", "timestamp": "2014-09-07 23:15"}]

        def handle_record_side_effect(mapping, record, rv, error_messages):
            if mapping["point_type"] in ["EP", "NP", "PP"]:
                record["value"] = float(record["value"])
            elif mapping["point_type"] == "BP":
                record["value"] = float(record["value"])
                if record["value"] > 0:
                    record["value"] = 1.0
                else:
                    record["value"] = 0.0
            record["timestamp"] = fieldserver_file_handler.get_string_timestamp(record["timestamp"])
            good_record = {
                "syrx_num": mapping["syrx_num"],
                "timestamp": record["timestamp"],
                "value": record["value"],
                "date_added": fieldserver_file_handler.date_time_str
            }
            rv.good_records.append(good_record)
        _handle_record.side_effect = handle_record_side_effect

        rv = fieldserver_file_handler.get_processed_fieldserver_records(records)

        _handle_record.assert_has_calls([call(mappings_dict[("123456", 0)][0], records[0], rv, []),
                                         call(mappings_dict[("123456", 1)][0], records[1], rv, []),
                                         call(mappings_dict[("123456", 2)][0], records[2], rv, []),
                                         call(mappings_dict[("123456", 3)][0], records[3], rv, []),
                                         call(mappings_dict[("123456", 3)][0], records[4], rv, [])])

        assert len(rv.good_records) == 5
        assert len(rv.bad_records) == 0
        assert len(rv.unmapped_vendor_points) == 0
        assert len(rv.global_vendor_point_records) == 0

        assert rv.good_records[0] == {"syrx_num": "400000-0001-237323-EP-001",
                                      "timestamp": fieldserver_file_handler.get_string_timestamp.return_value,
                                      "value": 100.1, "date_added": fieldserver_file_handler.date_time_str}
        assert rv.good_records[1] == {"syrx_num": "400000-0001-237323-NP-001",
                                      "timestamp": fieldserver_file_handler.get_string_timestamp.return_value,
                                      "value": 100.2, "date_added": fieldserver_file_handler.date_time_str}
        assert rv.good_records[2] == {"syrx_num": "400000-0001-237323-PP-001",
                                      "timestamp": fieldserver_file_handler.get_string_timestamp.return_value,
                                      "value": 100.3, "date_added": fieldserver_file_handler.date_time_str}
        assert rv.good_records[3] == {"syrx_num": "400000-0001-237323-BP-001",
                                      "timestamp": fieldserver_file_handler.get_string_timestamp.return_value,
                                      "value": 1.0, "date_added": fieldserver_file_handler.date_time_str}
        assert rv.good_records[4] == {"syrx_num": "400000-0001-237323-BP-001",
                                      "timestamp": fieldserver_file_handler.get_string_timestamp.return_value,
                                      "value": 0.0, "date_added": fieldserver_file_handler.date_time_str}