Merge branch 'release/release-1.6.2'

This commit is contained in:
Mark Struchkov 2019-06-15 14:57:56 +03:00
commit 0bfb372eff
6 changed files with 187 additions and 13 deletions

View File

@ -6,7 +6,7 @@
<groupId>org.sadtech.autoresponder</groupId>
<artifactId>autoresponder</artifactId>
<version>1.6.1-RELEASE</version>
<version>1.6.2-RELEASE</version>
<packaging>jar</packaging>
<build>
<plugins>
@ -32,6 +32,12 @@
<artifactId>slf4j-api</artifactId>
<version>${slf4j.ver}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<developers>

View File

@ -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<Unit> nextUnits, String message) {
Optional<Unit> 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<String> words) {
private Double percentageMatch(Unit unit, Set<String> words) {
if (unit.getKeyWords() != null) {
Set<String> temp = new HashSet<>(unit.getKeyWords());
temp.retainAll(words);

View File

@ -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<Integer, UnitPointer> unitPointerMap);
void addAll(Collection<UnitPointer> unitPointerMap);
UnitPointer findByEntityId(Integer entityId);

View File

@ -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<Integer, UnitPointer> 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<Integer, UnitPointer> unitPointerMap) {
this.unitPointerMap.putAll(unitPointerMap);
public void addAll(Collection<UnitPointer> unitPointers) {
unitPointers.parallelStream().forEach(unitPointer -> unitPointerMap.put(unitPointer.getEntityId(), unitPointer));
}
@Override

View File

@ -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<Unit> 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);
}
}

View File

@ -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);
}
}