diff --git a/pom.xml b/pom.xml index 408b8dc..30911f5 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.sadtech.autoresponder autoresponder - 1.6.1-RELEASE + 1.6.2-SNAPSHOT jar @@ -32,6 +32,12 @@ slf4j-api ${slf4j.ver} + + + junit + junit + 4.12 + diff --git a/src/main/java/org/sadtech/autoresponder/Autoresponder.java b/src/main/java/org/sadtech/autoresponder/Autoresponder.java index 829094e..fa8b8bf 100644 --- a/src/main/java/org/sadtech/autoresponder/Autoresponder.java +++ b/src/main/java/org/sadtech/autoresponder/Autoresponder.java @@ -40,12 +40,16 @@ public class Autoresponder { this.defaultUnit = defaultUnit; } + public Unit getDefaultUnit() { + return defaultUnit; + } + public Unit answer(Integer personId, String message) { UnitPointer unitPointer = checkAndAddPerson(personId); Unit unit; try { if (unitPointer.getUnit() == null || unitPointer.getUnit().getNextUnits() == null) { - unit = nextUnit(startUnits, message); // выбирает unit из startUnits, если пользователь обращается впервые + unit = nextUnit(startUnits, message); } else { unit = nextUnit(unitPointer.getUnit().getNextUnits(), message); } @@ -58,13 +62,12 @@ public class Autoresponder { private Unit nextUnit(Set nextUnits, String message) { Optional unit = nextUnits.stream() - .filter(nextUnit -> nextUnit.getPattern() != null) - .filter(nextUnit -> patternReg(nextUnit, message)) + .filter(nextUnit -> nextUnit.getPattern() != null && patternReg(nextUnit, message)) .max(UNIT_PRIORITY_COMPARATOR); if (!unit.isPresent()) { unit = nextUnits.stream() - .filter(nextUnit -> textPercentageMatch(nextUnit, Parser.parse(message)) >= nextUnit.getMatchThreshold()) + .filter(nextUnit -> percentageMatch(nextUnit, Parser.parse(message)) >= nextUnit.getMatchThreshold()) .max(UNIT_PRIORITY_COMPARATOR); } @@ -93,7 +96,7 @@ public class Autoresponder { return m.find(); } - private Double textPercentageMatch(Unit unit, Set words) { + private Double percentageMatch(Unit unit, Set words) { if (unit.getKeyWords() != null) { Set temp = new HashSet<>(unit.getKeyWords()); temp.retainAll(words); diff --git a/src/main/java/org/sadtech/autoresponder/repository/UnitPointerRepository.java b/src/main/java/org/sadtech/autoresponder/repository/UnitPointerRepository.java index 576bf75..acd74fb 100644 --- a/src/main/java/org/sadtech/autoresponder/repository/UnitPointerRepository.java +++ b/src/main/java/org/sadtech/autoresponder/repository/UnitPointerRepository.java @@ -2,17 +2,17 @@ package org.sadtech.autoresponder.repository; import org.sadtech.autoresponder.entity.UnitPointer; -import java.util.Map; +import java.util.Collection; public interface UnitPointerRepository { - Integer add(UnitPointer unitPointer); + void add(UnitPointer unitPointer); void edit(UnitPointer unitPointer); void remove(Integer entityId); - void addAll(Map unitPointerMap); + void addAll(Collection unitPointerMap); UnitPointer findByEntityId(Integer entityId); diff --git a/src/main/java/org/sadtech/autoresponder/repository/UnitPointerRepositoryMap.java b/src/main/java/org/sadtech/autoresponder/repository/UnitPointerRepositoryMap.java index 5534c55..f093d46 100644 --- a/src/main/java/org/sadtech/autoresponder/repository/UnitPointerRepositoryMap.java +++ b/src/main/java/org/sadtech/autoresponder/repository/UnitPointerRepositoryMap.java @@ -2,6 +2,7 @@ package org.sadtech.autoresponder.repository; import org.sadtech.autoresponder.entity.UnitPointer; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -10,9 +11,8 @@ public class UnitPointerRepositoryMap implements UnitPointerRepository { private Map unitPointerMap = new HashMap<>(); @Override - public Integer add(UnitPointer unitPointer) { + public void add(UnitPointer unitPointer) { unitPointerMap.put(unitPointer.getEntityId(), unitPointer); - return unitPointer.getEntityId(); } @Override @@ -26,8 +26,8 @@ public class UnitPointerRepositoryMap implements UnitPointerRepository { } @Override - public void addAll(Map unitPointerMap) { - this.unitPointerMap.putAll(unitPointerMap); + public void addAll(Collection unitPointers) { + unitPointers.parallelStream().forEach(unitPointer -> unitPointerMap.put(unitPointer.getEntityId(), unitPointer)); } @Override diff --git a/src/test/java/org/sadtech/autoresponder/AutoresponderTest.java b/src/test/java/org/sadtech/autoresponder/AutoresponderTest.java new file mode 100644 index 0000000..d0f7b11 --- /dev/null +++ b/src/test/java/org/sadtech/autoresponder/AutoresponderTest.java @@ -0,0 +1,133 @@ +package org.sadtech.autoresponder; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.sadtech.autoresponder.entity.Unit; +import org.sadtech.autoresponder.exception.NotFoundUnitException; +import org.sadtech.autoresponder.repository.UnitPointerRepositoryMap; +import org.sadtech.autoresponder.service.UnitPointerServiceImpl; +import org.sadtech.autoresponder.test.TestUnit; + +import java.util.HashSet; +import java.util.Set; +import java.util.regex.Pattern; + +public class AutoresponderTest { + + private Autoresponder autoresponder; + + @Before + public void setUp() { + TestUnit dela = new TestUnit(); + dela.setKeyWord("дела", "делишки"); + dela.setMessage("хорошо"); + + TestUnit delaTop = new TestUnit(); + delaTop.setPriority(100); + delaTop.setKeyWord("делишки"); + delaTop.setMessage("отлично"); + + TestUnit hello = new TestUnit(); + hello.setMessage("тест"); + hello.setKeyWord("привет"); + hello.setNextUnit(dela); + hello.setNextUnit(delaTop); + + TestUnit number = new TestUnit(); + number.setKeyWord("89101234567"); + number.setMessage("ответ"); + + TestUnit regExp = new TestUnit(); + regExp.setPattern(Pattern.compile("^((8|\\+7)[\\- ]?)?(\\(?\\d{3}\\)?[\\- ]?)?[\\d\\- ]{7,10}$")); + regExp.setMessage("регулярка"); + dela.setNextUnit(regExp); + dela.setNextUnit(number); + + TestUnit unreal = new TestUnit(); + unreal.setKeyWord("витамин", "мультифрукт", "арбуз", "параметр"); + unreal.setMessage("победа"); + unreal.setMatchThreshold(100); + + Set testUnits = new HashSet<>(); + testUnits.add(hello); + testUnits.add(regExp); + testUnits.add(unreal); + + UnitPointerServiceImpl unitPointerService = new UnitPointerServiceImpl(new UnitPointerRepositoryMap()); + autoresponder = new Autoresponder(unitPointerService, testUnits); + } + + @Test + public void simpleAnswer() { + String message = ((TestUnit) autoresponder.answer(1, "привет это тестирвоание функциональности")).getMessage(); + Assert.assertEquals("тест", message); + String message1 = ((TestUnit) autoresponder.answer(2, "привет, еще одно тестирование")).getMessage(); + Assert.assertEquals("тест", message1); + } + + @Test + public void defaultAnswer() { + TestUnit defaultUnit = new TestUnit(); + defaultUnit.setMessage("не знаю"); + autoresponder.setDefaultUnit(defaultUnit); + + Assert.assertEquals(((TestUnit) autoresponder.answer(2, "пока")).getMessage(), "не знаю"); + } + + @Test(expected = NotFoundUnitException.class) + public void notDefaultAnswer() { + autoresponder.answer(2, "пока"); + } + + @Test + public void regExpAnswer() { + String message = ((TestUnit) autoresponder.answer(1, "79101234567")).getMessage(); + Assert.assertEquals(message, "регулярка"); + } + + @Test + public void priorityAnswer() { + autoresponder.answer(1, "привет"); + autoresponder.answer(2, "привет"); + String message = ((TestUnit) autoresponder.answer(1, "как твои делишки")).getMessage(); + Assert.assertEquals("отлично", message); + String message1 = ((TestUnit) autoresponder.answer(2, "твои дела все еще хорошо?")).getMessage(); + Assert.assertEquals("хорошо", message1); + } + + @Test + public void showRegExpVsKeyWords() { + autoresponder.answer(1, "привет"); + autoresponder.answer(1, "дела"); + Assert.assertEquals("регулярка", ((TestUnit) autoresponder.answer(1, "89101234567")).getMessage()); + } + + @Test(expected = NotFoundUnitException.class) + public void matchThreshold() { + autoresponder.answer(1, "витамин я сьем, и арбуз получу"); + String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт"; + String answer = ((TestUnit) autoresponder.answer(1, message)).getMessage(); + Assert.assertEquals("победа", answer); + } + + @Test + public void generalAnswer() { + TestUnit defaultUnit = new TestUnit(); + defaultUnit.setMessage("не знаю"); + autoresponder.setDefaultUnit(defaultUnit); + String answer = ((TestUnit) autoresponder.answer(1, "привет это тестирование функциональности")).getMessage(); + Assert.assertEquals("тест", answer); + Assert.assertEquals("хорошо", ((TestUnit) autoresponder.answer(1, "как твои дела")).getMessage()); + String answer2 = ((TestUnit) autoresponder.answer(2, "привет это тестирование функциональности")).getMessage(); + Assert.assertEquals("тест", answer2); + Assert.assertEquals("не знаю", ((TestUnit) autoresponder.answer(1, "нет")).getMessage()); + String message = "параметр себе задам: покушать витамин и арбуз, а вместе все это мультифрукт"; + Assert.assertEquals("победа", ((TestUnit) autoresponder.answer(3, message)).getMessage()); + Assert.assertEquals("регулярка", ((TestUnit) autoresponder.answer(1, "8912345678")).getMessage()); + String answer3 = ((TestUnit) autoresponder.answer(1, "привет это тестирование функциональности")).getMessage(); + Assert.assertEquals("тест", answer3); + } + + +} \ No newline at end of file diff --git a/src/test/java/org/sadtech/autoresponder/test/TestUnit.java b/src/test/java/org/sadtech/autoresponder/test/TestUnit.java new file mode 100644 index 0000000..40c3cce --- /dev/null +++ b/src/test/java/org/sadtech/autoresponder/test/TestUnit.java @@ -0,0 +1,32 @@ +package org.sadtech.autoresponder.test; + +import org.sadtech.autoresponder.entity.Unit; + +import java.util.Objects; + +public class TestUnit extends Unit { + + private String message; + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof TestUnit)) return false; + if (!super.equals(o)) return false; + TestUnit testUnit = (TestUnit) o; + return Objects.equals(message, testUnit.message); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), message); + } +}