def test_given_analyzer_result_with_an_incorrect_text_positions_then_we_fail(
        original_text, start, end):
    engine = AnonymizerEngine()
    analyzer_result = AnalyzerResult("type", start, end, 0.5)
    err_msg = f"Invalid analyzer result, start: {start} and end: " \
              f"{end}, while text length is only 11."
    with pytest.raises(InvalidParamException, match=err_msg):
        engine.anonymize(original_text, [analyzer_result], {})
def test_given_default_anonymizer_then_we_use_it():
    engine = AnonymizerEngine()
    text = "please REPLACE ME."
    analyzer_result = AnalyzerResult("SSN", 7, 17, 0.8)
    anonymizer_config = AnonymizerConfig("replace",
                                         {"new_value": "and thank you"})
    result = engine.anonymize(text, [analyzer_result],
                              {"DEFAULT": anonymizer_config})
    assert result == "please and thank you."
def test_given_several_anonymizers_then_we_use_the_correct_one():
    analyzer_result = AnalyzerResult.from_json({
        "score": 0.5,
        "entity_type": "PHONE_NUMBER",
        "start": 8,
        "end": 18
    })
    anonymizer_config = AnonymizerConfig("replace", {})
    anonymizer_config.anonymizer_class = MockAnonymizer
    text = AnonymizerEngine().anonymize("Number: 0554555556",
                                        [analyzer_result],
                                        {"PHONE_NUMBER": anonymizer_config})
    assert text == "Number: I am your new text!"
    def handle_analyzer_results_json(cls, data: Dict) -> List[AnalyzerResult]:
        """
        Go over analyzer results, validate them and convert to List[AnalyzeResult].

        :param data: contains the anonymizers and analyzer_results_json
        """
        analyzer_results = AnalyzerResults()
        analyzer_results_json = data.get("analyzer_results")
        if analyzer_results_json is None:
            cls.logger.debug(
                "invalid input, json missing field: analyzer_results_json")
            raise InvalidParamException(
                "Invalid input, "
                "request must contain analyzer results")
        for analyzer_result in analyzer_results_json:
            analyzer_result = AnalyzerResult.from_json(analyzer_result)
            analyzer_results.append(analyzer_result)
        return analyzer_results
def create_analayzer_result(entity_type: str, score: float, start: int, end: int):
    data = {"entity_type": entity_type, "score": score, "start": start, "end": end}
    return AnalyzerResult.from_json(data)
def test_given_json_for_creating_analyzer_result_without_text_then_creation_fails(
        request_json, result_text):
    with pytest.raises(InvalidParamException) as e:
        AnalyzerResult.from_json(request_json)
    assert result_text == e.value.err_msg
def test_given_none_as_anonymziers_list_then_we_fall_to_default():
    engine = AnonymizerEngine()
    text = "please REPLACE ME."
    analyzer_result = AnalyzerResult("SSN", 7, 17, 0.8)
    result = engine.anonymize(text, [analyzer_result])
    assert result == "please <SSN>."
def test_given_empty_text_to_engine_then_we_fail():
    engine = AnonymizerEngine()
    analyzer_result = AnalyzerResult("SSN", 0, 1, 0.5)
    with pytest.raises(InvalidParamException,
                       match="Invalid input, text can not be empty"):
        engine.anonymize("", [analyzer_result], {})