package ru.pdguard; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import ru.pdguard.config.SystemPolicy; import ru.pdguard.core.PayloadStore; import ru.pdguard.core.Pipeline; import ru.pdguard.detect.NameCascade; import ru.pdguard.detect.RuleRegistry; import ru.pdguard.mask.Masker; /** Вторая ступень не должна вредить первой. */ class NameCascadeTest { private static final String TEXT = "Клиент Иванов Иван Иванович, паспорт 4509 123456"; private String mask(NameCascade cascade, String payloadId) { Pipeline pipeline = new Pipeline(new RuleRegistry(), new Masker(), new PayloadStore(30), cascade); return pipeline.process(TEXT, payloadId, SystemPolicy.DEFAULT); } @Test void withoutModelTheStageIsOff() { NameCascade cascade = NameCascade.disabled(); assertFalse(cascade.enabled()); assertEquals("Клиент И. И. И., паспорт 45** ****56", mask(cascade, "off-1")); } @Test void missingModelFileDoesNotBreakMasking(@TempDir Path dir) { NameCascade cascade = new NameCascade( "rubert", Optional.of(dir.resolve("нет-такого-каталога").toString()), 16, 4); assertFalse(cascade.enabled(), "отсутствующая модель должна выключать ступень"); assertEquals("Клиент И. И. И., паспорт 45** ****56", mask(cascade, "missing-1")); } @Test void brokenModelFileDoesNotBreakMasking(@TempDir Path dir) throws IOException { Path broken = dir.resolve("испорченная-модель"); Files.createDirectories(broken); for (String name : new String[] {"model_int8.onnx", "vocab.txt", "config.json"}) { Files.writeString(broken.resolve(name), "это не модель", StandardCharsets.UTF_8); } NameCascade cascade = new NameCascade("rubert", Optional.of(broken.toString()), 16, 4); assertFalse(cascade.enabled(), "испорченная модель должна выключать ступень"); assertEquals( "Клиент И. И. И., паспорт 45** ****56", mask(cascade, "broken-1"), "маскирование по правилам обязано работать и без второй ступени"); } }