From 441a58755558b6f920d6bbbbc1da6aa14b471a75 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 16 Mar 2019 10:11:32 +0300 Subject: [PATCH 01/25] Add files commit. --- .gitignore | 4 + pom.xml | 67 +++++++++++++ src/main/java/ru/otus/mkulikov/Main.java | 31 ++++++ .../java/ru/otus/mkulikov/model/Question.java | 99 +++++++++++++++++++ .../java/ru/otus/mkulikov/model/User.java | 35 +++++++ .../ru/otus/mkulikov/processor/Processor.java | 16 +++ .../mkulikov/processor/ProcessorImpl.java | 48 +++++++++ .../mkulikov/questions/QuestionsLoader.java | 21 ++++ .../questions/QuestionsLoaderImpl.java | 49 +++++++++ .../mkulikov/questions/QuestionsProcess.java | 12 +++ .../questions/QuestionsProcessImpl.java | 59 +++++++++++ .../mkulikov/registration/Registration.java | 19 ++++ .../registration/RegistrationImpl.java | 35 +++++++ src/main/resources/applicationContext.xml | 18 ++++ src/main/resources/questions.csv | 5 + 15 files changed, 518 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/ru/otus/mkulikov/Main.java create mode 100644 src/main/java/ru/otus/mkulikov/model/Question.java create mode 100644 src/main/java/ru/otus/mkulikov/model/User.java create mode 100644 src/main/java/ru/otus/mkulikov/processor/Processor.java create mode 100644 src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/registration/Registration.java create mode 100644 src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java create mode 100644 src/main/resources/applicationContext.xml create mode 100644 src/main/resources/questions.csv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cba2a35 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.idea +target +*.iml +*.log \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..107185f --- /dev/null +++ b/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + home-work-01 + + ru.otus.mkulikov + home-work + 1.0-SNAPSHOT + + + 11 + ${java.version} + ${java.version} + UTF-8 + + + + + org.springframework + spring-context + 5.0.9.RELEASE + + + + net.sf.opencsv + opencsv + 2.3 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${encoding} + + + + + org.apache.maven.plugins + maven-resources-plugin + + ${encoding} + + + + + + + src/main/resources + + **/*.properties + **/*.xml + **/*.csv + + false + + + + \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/Main.java b/src/main/java/ru/otus/mkulikov/Main.java new file mode 100644 index 0000000..929ab68 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/Main.java @@ -0,0 +1,31 @@ +package ru.otus.mkulikov; + +import org.springframework.context.support.ClassPathXmlApplicationContext; +import ru.otus.mkulikov.processor.Processor; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:27 + */ + +public class Main { + + public static void main(String[] args) { + ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + try { + Processor processor = (Processor) context.getBean("processor"); + processor.startTest(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } finally { + context.close(); + } + } +} diff --git a/src/main/java/ru/otus/mkulikov/model/Question.java b/src/main/java/ru/otus/mkulikov/model/Question.java new file mode 100644 index 0000000..5f40e3f --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/model/Question.java @@ -0,0 +1,99 @@ +package ru.otus.mkulikov.model; + +import java.io.Serializable; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public class Question implements Serializable { + + private String id; + private String question; + private String answer1; + private String answer2; + private String answer3; + private String answer4; + private String trueAnswer; + private String userAnswer; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getQuestion() { + return question; + } + + public void setQuestion(String question) { + this.question = question; + } + + public String getAnswer1() { + return answer1; + } + + public void setAnswer1(String answer1) { + this.answer1 = answer1; + } + + public String getAnswer2() { + return answer2; + } + + public void setAnswer2(String answer2) { + this.answer2 = answer2; + } + + public String getAnswer3() { + return answer3; + } + + public void setAnswer3(String answer3) { + this.answer3 = answer3; + } + + public String getAnswer4() { + return answer4; + } + + public void setAnswer4(String answer4) { + this.answer4 = answer4; + } + + public String getTrueAnswer() { + return trueAnswer; + } + + public void setTrueAnswer(String trueAnswer) { + this.trueAnswer = trueAnswer; + } + + public String getUserAnswer() { + return userAnswer; + } + + public void setUserAnswer(String userAnswer) { + this.userAnswer = userAnswer; + } + + @Override + public String toString() { + return "Question {" + + "id='" + id + '\'' + + ", question='" + question + '\'' + + ", answer1='" + answer1 + '\'' + + ", answer2='" + answer2 + '\'' + + ", answer3='" + answer3 + '\'' + + ", answer4='" + answer4 + '\'' + + ", trueAnswer='" + trueAnswer + '\'' + + '}'; + } +} diff --git a/src/main/java/ru/otus/mkulikov/model/User.java b/src/main/java/ru/otus/mkulikov/model/User.java new file mode 100644 index 0000000..146fbd7 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/model/User.java @@ -0,0 +1,35 @@ +package ru.otus.mkulikov.model; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:29 + */ + +public class User { + + private final String name; + private final String surname; + + public User(String name, String surname) { + this.name = name; + this.surname = surname; + } + + public String getName() { + return name; + } + + public String getSurname() { + return surname; + } + + @Override + public String toString() { + return "User {" + + "name='" + name + '\'' + + ", surname='" + surname + '\'' + + '}'; + } +} diff --git a/src/main/java/ru/otus/mkulikov/processor/Processor.java b/src/main/java/ru/otus/mkulikov/processor/Processor.java new file mode 100644 index 0000000..e2c43e5 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/Processor.java @@ -0,0 +1,16 @@ +package ru.otus.mkulikov.processor; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public interface Processor { + + void startTest() throws FileNotFoundException, URISyntaxException; +} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java new file mode 100644 index 0000000..6790959 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java @@ -0,0 +1,48 @@ +package ru.otus.mkulikov.processor; + +import ru.otus.mkulikov.questions.QuestionsProcess; +import ru.otus.mkulikov.questions.QuestionsLoader; +import ru.otus.mkulikov.registration.Registration; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.Scanner; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public class ProcessorImpl implements Processor { + + private QuestionsProcess questionsProcess; + private Registration registration; + + public ProcessorImpl(QuestionsProcess questionsProcess, Registration registration) { + this.questionsProcess = questionsProcess; + this.registration = registration; + } + + @Override + public void startTest() throws FileNotFoundException, URISyntaxException { + Scanner in = new Scanner(System.in); + try { + getRegistration().addNewUser(in); + + getQuestionsProcess().loadQuestions(); + getQuestionsProcess().showQuestions(in); + } finally { + in.close(); + } + } + + public QuestionsProcess getQuestionsProcess() { + return questionsProcess; + } + + public Registration getRegistration() { + return registration; + } +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java new file mode 100644 index 0000000..824305d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java @@ -0,0 +1,21 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.model.Question; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:41 + */ + +public interface QuestionsLoader { + + void loadFile() throws FileNotFoundException, URISyntaxException; + + List getQuestions(); +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java new file mode 100644 index 0000000..4919922 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java @@ -0,0 +1,49 @@ +package ru.otus.mkulikov.questions; + +import au.com.bytecode.opencsv.CSVReader; +import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; +import au.com.bytecode.opencsv.bean.CsvToBean; +import ru.otus.mkulikov.model.Question; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.net.URISyntaxException; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:42 + */ + +public class QuestionsLoaderImpl implements QuestionsLoader { + + private List questions; + + @Override + @SuppressWarnings({"rawtypes", "unchecked"}) + public void loadFile() throws FileNotFoundException, URISyntaxException { + CsvToBean csv = new CsvToBean(); + String csvFilename = "questions.csv"; + File file = new File(getClass().getResource("/" + csvFilename).toURI()); + + CSVReader csvReader = new CSVReader(new FileReader(file)); + questions = csv.parse(setColumMapping(), csvReader); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + private ColumnPositionMappingStrategy setColumMapping() { + ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy(); + strategy.setType(Question.class); + String[] columns = new String[]{"id", "question", "answer1", "answer2", "answer3", "answer4", "trueAnswer"}; + strategy.setColumnMapping(columns); + return strategy; + } + + @Override + public List getQuestions() { + return questions; + } +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java new file mode 100644 index 0000000..a410d15 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java @@ -0,0 +1,12 @@ +package ru.otus.mkulikov.questions; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.Scanner; + +public interface QuestionsProcess { + + void loadQuestions() throws FileNotFoundException, URISyntaxException; + + void showQuestions(Scanner in); +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java new file mode 100644 index 0000000..32f163d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java @@ -0,0 +1,59 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.model.Question; + +import java.io.FileNotFoundException; +import java.net.URISyntaxException; +import java.util.Scanner; + +public class QuestionsProcessImpl implements QuestionsProcess { + + private final String c_delimeter = "---------------------------------------------------"; + private final String c_answerNumbers = "1234"; + + private QuestionsLoader questionsLoader; + + public QuestionsProcessImpl(QuestionsLoader questionsLoader) { + this.questionsLoader = questionsLoader; + } + + @Override + public void loadQuestions() throws FileNotFoundException, URISyntaxException { + getQuestionsLoader().loadFile(); + } + + @Override + public void showQuestions(Scanner in) { + System.out.println(c_delimeter); + for (Question question : getQuestionsLoader().getQuestions()) { + System.out.println(question.getQuestion()); + System.out.println(question.getAnswer1()); + System.out.println(question.getAnswer2()); + System.out.println(question.getAnswer3()); + System.out.println(question.getAnswer4()); + + String answer = null; + boolean okAnswer = false; + int i = 0; + while (!okAnswer && i < 4) { + System.out.println("Введите номер ответа: "); + answer = in.nextLine(); + okAnswer = c_answerNumbers.contains(answer); + i++; + } + + question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); + System.out.println(c_delimeter); + } + + long count = getQuestionsLoader().getQuestions().stream() + .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) + .count(); + System.out.println("Количество правильных ответов: " + count + " из " + getQuestionsLoader().getQuestions().size()); + System.out.println(c_delimeter); + } + + public QuestionsLoader getQuestionsLoader() { + return questionsLoader; + } +} diff --git a/src/main/java/ru/otus/mkulikov/registration/Registration.java b/src/main/java/ru/otus/mkulikov/registration/Registration.java new file mode 100644 index 0000000..a129f40 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/Registration.java @@ -0,0 +1,19 @@ +package ru.otus.mkulikov.registration; + +import ru.otus.mkulikov.model.User; + +import java.util.Scanner; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public interface Registration { + + void addNewUser(Scanner in); + + User getUser(); +} diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java new file mode 100644 index 0000000..e8571db --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java @@ -0,0 +1,35 @@ +package ru.otus.mkulikov.registration; + +import ru.otus.mkulikov.model.User; + +import java.util.Scanner; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public class RegistrationImpl implements Registration { + + private User user; + + @Override + public void addNewUser(Scanner in) { + System.out.println("Введите свои данные"); + System.out.println("Фамилия: "); + String surname = in.nextLine(); + + System.out.println("Имя: "); + String name = in.nextLine(); + + user = new User(name, surname); + System.out.println(String.format("Здравствуйте, %s %s!", surname, name)); + } + + @Override + public User getUser() { + return user; + } +} diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml new file mode 100644 index 0000000..86a39a5 --- /dev/null +++ b/src/main/resources/applicationContext.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/questions.csv b/src/main/resources/questions.csv new file mode 100644 index 0000000..6114d64 --- /dev/null +++ b/src/main/resources/questions.csv @@ -0,0 +1,5 @@ +1,Что из списка не является паттерном проектирования?,1. Фасад,2. Объект,3. Фабрика,4. Синглтон,2 +2,Какой тип не является примитивным?,1. String,2. int,3. char,4. boolean,1 +3,Сколько классов можно наследовать в Java?,1. Один,2. Два,3. Три,4. Четыре,1 +4,Какая коллекция содержит уникальне объекты?,1. List,2. Map,3. Set,4. Queue,3 +5,Какое значение нельзя положить в примитивный тип - int?,1. -1,2. 0,3. 10,4. null,4 \ No newline at end of file From b22839c7a513507b6298b3eb1ad9a08dfb1544e1 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 16 Mar 2019 10:25:44 +0300 Subject: [PATCH 02/25] Edit readme. --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 67d4ca0..acba68d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ -# OtusSpringHW +# OtusSpringHW Домашние задания по Spring для Otus. + +Домашнее задание #1: +Программа по проведению тестирования студентов +В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопрсов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. + +Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. + +Опционально: сервисы, по возможности, покрыть тестами. \ No newline at end of file From baef643fd2db52fa53d521e77ef7ca91febe7094 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 16 Mar 2019 10:27:58 +0300 Subject: [PATCH 03/25] Edit readme. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index acba68d..f2d1946 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# OtusSpringHW -Домашние задания по Spring для Otus. +# OtusSpringHW Домашние задания по Spring для Otus. Домашнее задание #1: + Программа по проведению тестирования студентов В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопрсов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. From 1afc67dd8c93b985ca2c49c243e21c30311472ad Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 16 Mar 2019 10:29:14 +0300 Subject: [PATCH 04/25] Edit readme. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2d1946..1ff1818 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# OtusSpringHW Домашние задания по Spring для Otus. +# OtusSpringHW Домашнее задание #1: From 9d46552d8096480c8a63cd616319278e7d7433bb Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 18 Mar 2019 01:44:11 +0300 Subject: [PATCH 05/25] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D1=81=D0=BE=D0=B2.=20-=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D1=81=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20QuestionsFileLoadingExce?= =?UTF-8?q?ption.=20-=20=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D1=8C=D1=8E=20=D0=B2=D1=8B?= =?UTF-8?q?=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20=D0=B2=20=D1=81=D0=B5?= =?UTF-8?q?=D1=80=D0=B2=D0=B8=D1=81=20ConsoleService.=20-=20=D0=A2=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20QuestionsDAO.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- README.md | 8 +- pom.xml | 20 +++++ src/main/java/ru/otus/mkulikov/Main.java | 12 +-- .../otus/mkulikov/console/ConsoleService.java | 15 ++++ .../mkulikov/console/ConsoleServiceImpl.java | 35 +++++++++ .../QuestionsFileLoadingException.java | 19 +++++ .../ru/otus/mkulikov/processor/Processor.java | 16 ---- .../mkulikov/processor/ProcessorImpl.java | 48 ------------ .../mkulikov/processor/ProcessorService.java | 15 ++++ .../processor/ProcessorServiceImpl.java | 37 ++++++++++ .../otus/mkulikov/questions/QuestionsDAO.java | 18 +++++ ...sLoaderImpl.java => QuestionsDAOImpl.java} | 31 ++++---- .../mkulikov/questions/QuestionsLoader.java | 21 ------ .../mkulikov/questions/QuestionsProcess.java | 12 --- .../questions/QuestionsProcessImpl.java | 59 --------------- .../mkulikov/questions/QuestionsService.java | 15 ++++ .../questions/QuestionsServiceImpl.java | 74 +++++++++++++++++++ .../mkulikov/registration/Registration.java | 19 ----- .../registration/RegistrationImpl.java | 35 --------- .../registration/RegistrationService.java | 13 ++++ .../registration/RegistrationServiceImpl.java | 38 ++++++++++ src/main/resources/applicationContext.xml | 14 +++- .../mkulikov/questions/QuestionsDAOTest.java | 31 ++++++++ src/test/resources/questions.csv | 3 + 25 files changed, 374 insertions(+), 237 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/console/ConsoleService.java create mode 100644 src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java delete mode 100644 src/main/java/ru/otus/mkulikov/processor/Processor.java delete mode 100644 src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/processor/ProcessorService.java create mode 100644 src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java rename src/main/java/ru/otus/mkulikov/questions/{QuestionsLoaderImpl.java => QuestionsDAOImpl.java} (50%) delete mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java delete mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java delete mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsService.java create mode 100644 src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java delete mode 100644 src/main/java/ru/otus/mkulikov/registration/Registration.java delete mode 100644 src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/registration/RegistrationService.java create mode 100644 src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java create mode 100644 src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java create mode 100644 src/test/resources/questions.csv diff --git a/.gitignore b/.gitignore index cba2a35..ced985d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea target *.iml -*.log \ No newline at end of file +*.log +*.txt \ No newline at end of file diff --git a/README.md b/README.md index 1ff1818..8eebeba 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,10 @@ Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. -Опционально: сервисы, по возможности, покрыть тестами. \ No newline at end of file +Опционально: сервисы, по возможности, покрыть тестами. + +### 19-03-18 Доработки: +- Переименование классов. +- Добавление исключения QuestionsFileLoadingException. +- Работа с консолью вынесена в сервис ConsoleService. +- Тесты для QuestionsDAO. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 107185f..7e5f8a1 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,26 @@ opencsv 2.3 + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + org.junit.jupiter + junit-jupiter-api + 5.4.0 + test + + + + org.junit.jupiter + junit-jupiter-engine + 5.4.0 + test + diff --git a/src/main/java/ru/otus/mkulikov/Main.java b/src/main/java/ru/otus/mkulikov/Main.java index 929ab68..88e4918 100644 --- a/src/main/java/ru/otus/mkulikov/Main.java +++ b/src/main/java/ru/otus/mkulikov/Main.java @@ -1,10 +1,8 @@ package ru.otus.mkulikov; import org.springframework.context.support.ClassPathXmlApplicationContext; -import ru.otus.mkulikov.processor.Processor; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.processor.ProcessorService; /** * Created by IntelliJ IDEA. @@ -18,11 +16,9 @@ public class Main { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); try { - Processor processor = (Processor) context.getBean("processor"); + ProcessorService processor = context.getBean(ProcessorService.class); processor.startTest(); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (URISyntaxException e) { + } catch (QuestionsFileLoadingException e) { e.printStackTrace(); } finally { context.close(); diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleService.java b/src/main/java/ru/otus/mkulikov/console/ConsoleService.java new file mode 100644 index 0000000..75d552d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/console/ConsoleService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.console; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 17.03.2019 + * Time: 23:21 + */ + +public interface ConsoleService { + + void write(String text); + + String read(); +} diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java new file mode 100644 index 0000000..881223e --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java @@ -0,0 +1,35 @@ +package ru.otus.mkulikov.console; + +import javax.annotation.PreDestroy; +import java.util.Scanner; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 17.03.2019 + * Time: 23:21 + */ + +public class ConsoleServiceImpl implements ConsoleService { + + private Scanner in; + + public ConsoleServiceImpl() { + in = new Scanner(System.in); + } + + @Override + public void write(String text) { + System.out.println(text); + } + + @Override + public String read() { + return in.nextLine(); + } + + @PreDestroy + public void destroy() { + in.close(); + } +} diff --git a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java new file mode 100644 index 0000000..5a4e3bc --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java @@ -0,0 +1,19 @@ +package ru.otus.mkulikov.exceptions; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-17 + * Time: 01:40 + */ + +public class QuestionsFileLoadingException extends Exception { + + public QuestionsFileLoadingException(String message) { + super(message); + } + + public QuestionsFileLoadingException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/ru/otus/mkulikov/processor/Processor.java b/src/main/java/ru/otus/mkulikov/processor/Processor.java deleted file mode 100644 index e2c43e5..0000000 --- a/src/main/java/ru/otus/mkulikov/processor/Processor.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.otus.mkulikov.processor; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 15:54 - */ - -public interface Processor { - - void startTest() throws FileNotFoundException, URISyntaxException; -} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java deleted file mode 100644 index 6790959..0000000 --- a/src/main/java/ru/otus/mkulikov/processor/ProcessorImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package ru.otus.mkulikov.processor; - -import ru.otus.mkulikov.questions.QuestionsProcess; -import ru.otus.mkulikov.questions.QuestionsLoader; -import ru.otus.mkulikov.registration.Registration; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.Scanner; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 15:54 - */ - -public class ProcessorImpl implements Processor { - - private QuestionsProcess questionsProcess; - private Registration registration; - - public ProcessorImpl(QuestionsProcess questionsProcess, Registration registration) { - this.questionsProcess = questionsProcess; - this.registration = registration; - } - - @Override - public void startTest() throws FileNotFoundException, URISyntaxException { - Scanner in = new Scanner(System.in); - try { - getRegistration().addNewUser(in); - - getQuestionsProcess().loadQuestions(); - getQuestionsProcess().showQuestions(in); - } finally { - in.close(); - } - } - - public QuestionsProcess getQuestionsProcess() { - return questionsProcess; - } - - public Registration getRegistration() { - return registration; - } -} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java new file mode 100644 index 0000000..f0bcccc --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.processor; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public interface ProcessorService { + + void startTest() throws QuestionsFileLoadingException; +} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java new file mode 100644 index 0000000..e5b99d0 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java @@ -0,0 +1,37 @@ +package ru.otus.mkulikov.processor; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.questions.QuestionsService; +import ru.otus.mkulikov.registration.RegistrationService; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:54 + */ + +public class ProcessorServiceImpl implements ProcessorService { + + private QuestionsService questionsProcess; + private RegistrationService registration; + + public ProcessorServiceImpl(QuestionsService questionsProcess, RegistrationService registration) { + this.questionsProcess = questionsProcess; + this.registration = registration; + } + + @Override + public void startTest() throws QuestionsFileLoadingException { + getRegistration().addNewUser(); + getQuestionsProcess().showQuestions(); + } + + public QuestionsService getQuestionsProcess() { + return questionsProcess; + } + + public RegistrationService getRegistration() { + return registration; + } +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java new file mode 100644 index 0000000..9a99d97 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java @@ -0,0 +1,18 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.model.Question; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:41 + */ + +public interface QuestionsDAO { + + List getQuestions(String csvFilename) throws QuestionsFileLoadingException; +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java similarity index 50% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java rename to src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java index 4919922..e0de84e 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoaderImpl.java +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java @@ -3,6 +3,7 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.model.Question; import java.io.File; @@ -18,19 +19,23 @@ * Time: 16:42 */ -public class QuestionsLoaderImpl implements QuestionsLoader { +public class QuestionsDAOImpl implements QuestionsDAO { - private List questions; - - @Override @SuppressWarnings({"rawtypes", "unchecked"}) - public void loadFile() throws FileNotFoundException, URISyntaxException { - CsvToBean csv = new CsvToBean(); - String csvFilename = "questions.csv"; - File file = new File(getClass().getResource("/" + csvFilename).toURI()); - - CSVReader csvReader = new CSVReader(new FileReader(file)); - questions = csv.parse(setColumMapping(), csvReader); + public List loadFile(String csvFilename) throws QuestionsFileLoadingException { + List questions = null; + try { + CsvToBean csv = new CsvToBean(); + File file = new File(getClass().getResource("/" + csvFilename).toURI()); + + CSVReader csvReader = new CSVReader(new FileReader(file)); + questions = csv.parse(setColumMapping(), csvReader); + } catch (FileNotFoundException e) { + throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e); + } catch (URISyntaxException e) { + throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); + } + return questions; } @SuppressWarnings({"rawtypes", "unchecked"}) @@ -43,7 +48,7 @@ private ColumnPositionMappingStrategy setColumMapping() { } @Override - public List getQuestions() { - return questions; + public List getQuestions(String csvFilename) throws QuestionsFileLoadingException { + return loadFile(csvFilename); } } diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java deleted file mode 100644 index 824305d..0000000 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsLoader.java +++ /dev/null @@ -1,21 +0,0 @@ -package ru.otus.mkulikov.questions; - -import ru.otus.mkulikov.model.Question; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.List; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 16:41 - */ - -public interface QuestionsLoader { - - void loadFile() throws FileNotFoundException, URISyntaxException; - - List getQuestions(); -} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java deleted file mode 100644 index a410d15..0000000 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcess.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.otus.mkulikov.questions; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.Scanner; - -public interface QuestionsProcess { - - void loadQuestions() throws FileNotFoundException, URISyntaxException; - - void showQuestions(Scanner in); -} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java deleted file mode 100644 index 32f163d..0000000 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsProcessImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.otus.mkulikov.questions; - -import ru.otus.mkulikov.model.Question; - -import java.io.FileNotFoundException; -import java.net.URISyntaxException; -import java.util.Scanner; - -public class QuestionsProcessImpl implements QuestionsProcess { - - private final String c_delimeter = "---------------------------------------------------"; - private final String c_answerNumbers = "1234"; - - private QuestionsLoader questionsLoader; - - public QuestionsProcessImpl(QuestionsLoader questionsLoader) { - this.questionsLoader = questionsLoader; - } - - @Override - public void loadQuestions() throws FileNotFoundException, URISyntaxException { - getQuestionsLoader().loadFile(); - } - - @Override - public void showQuestions(Scanner in) { - System.out.println(c_delimeter); - for (Question question : getQuestionsLoader().getQuestions()) { - System.out.println(question.getQuestion()); - System.out.println(question.getAnswer1()); - System.out.println(question.getAnswer2()); - System.out.println(question.getAnswer3()); - System.out.println(question.getAnswer4()); - - String answer = null; - boolean okAnswer = false; - int i = 0; - while (!okAnswer && i < 4) { - System.out.println("Введите номер ответа: "); - answer = in.nextLine(); - okAnswer = c_answerNumbers.contains(answer); - i++; - } - - question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); - System.out.println(c_delimeter); - } - - long count = getQuestionsLoader().getQuestions().stream() - .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) - .count(); - System.out.println("Количество правильных ответов: " + count + " из " + getQuestionsLoader().getQuestions().size()); - System.out.println(c_delimeter); - } - - public QuestionsLoader getQuestionsLoader() { - return questionsLoader; - } -} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java new file mode 100644 index 0000000..8c80904 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:41 + */ + +public interface QuestionsService { + + void showQuestions() throws QuestionsFileLoadingException; +} diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java new file mode 100644 index 0000000..ffcacf3 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java @@ -0,0 +1,74 @@ +package ru.otus.mkulikov.questions; + +import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.model.Question; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:41 + */ + +public class QuestionsServiceImpl implements QuestionsService { + + private final String c_delimeter = "---------------------------------------------------"; + private final String c_answerNumbers = "1234"; + private final String c_questionsFileName = "questions.csv"; + + private QuestionsDAO questionsLoader; + private ConsoleService consoleService; + + public QuestionsServiceImpl(QuestionsDAO questionsLoader, ConsoleService consoleService) { + this.questionsLoader = questionsLoader; + this.consoleService = consoleService; + } + + @Override + public void showQuestions() throws QuestionsFileLoadingException { + getConsoleService().write(c_delimeter); + List questions = getQuestionsLoader().getQuestions(c_questionsFileName); + + if (questions == null) { + throw new QuestionsFileLoadingException("Список вопросов пуст!"); + } + + for (Question question : questions) { + getConsoleService().write(question.getQuestion()); + getConsoleService().write(question.getAnswer1()); + getConsoleService().write(question.getAnswer2()); + getConsoleService().write(question.getAnswer3()); + getConsoleService().write(question.getAnswer4()); + + String answer = null; + boolean okAnswer = false; + int i = 0; + while (!okAnswer && i < 4) { + System.out.println("Введите номер ответа: "); + answer = getConsoleService().read(); + okAnswer = c_answerNumbers.contains(answer); + i++; + } + + question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); + getConsoleService().write(c_delimeter); + } + + long count = questions.stream() + .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) + .count(); + getConsoleService().write("Количество правильных ответов: " + count + " из " + questions.size()); + getConsoleService().write(c_delimeter); + } + + public QuestionsDAO getQuestionsLoader() { + return questionsLoader; + } + + public ConsoleService getConsoleService() { + return consoleService; + } +} diff --git a/src/main/java/ru/otus/mkulikov/registration/Registration.java b/src/main/java/ru/otus/mkulikov/registration/Registration.java deleted file mode 100644 index a129f40..0000000 --- a/src/main/java/ru/otus/mkulikov/registration/Registration.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.otus.mkulikov.registration; - -import ru.otus.mkulikov.model.User; - -import java.util.Scanner; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 16:34 - */ - -public interface Registration { - - void addNewUser(Scanner in); - - User getUser(); -} diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java deleted file mode 100644 index e8571db..0000000 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationImpl.java +++ /dev/null @@ -1,35 +0,0 @@ -package ru.otus.mkulikov.registration; - -import ru.otus.mkulikov.model.User; - -import java.util.Scanner; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-14 - * Time: 16:34 - */ - -public class RegistrationImpl implements Registration { - - private User user; - - @Override - public void addNewUser(Scanner in) { - System.out.println("Введите свои данные"); - System.out.println("Фамилия: "); - String surname = in.nextLine(); - - System.out.println("Имя: "); - String name = in.nextLine(); - - user = new User(name, surname); - System.out.println(String.format("Здравствуйте, %s %s!", surname, name)); - } - - @Override - public User getUser() { - return user; - } -} diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java new file mode 100644 index 0000000..6e420d0 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java @@ -0,0 +1,13 @@ +package ru.otus.mkulikov.registration; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public interface RegistrationService { + + void addNewUser(); +} diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java new file mode 100644 index 0000000..b3e5db4 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java @@ -0,0 +1,38 @@ +package ru.otus.mkulikov.registration; + +import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.model.User; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public class RegistrationServiceImpl implements RegistrationService { + + private User user; + private ConsoleService consoleService; + + public RegistrationServiceImpl(ConsoleService consoleService) { + this.consoleService = consoleService; + } + + @Override + public void addNewUser() { + getConsoleService().write("Введите свои данные"); + getConsoleService().write("Фамилия: "); + String surname = getConsoleService().read(); + + getConsoleService().write("Имя: "); + String name = getConsoleService().read(); + + user = new User(name, surname); + getConsoleService().write(String.format("Здравствуйте, %s %s!", surname, name)); + } + + public ConsoleService getConsoleService() { + return consoleService; + } +} diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml index 86a39a5..d0dc24a 100644 --- a/src/main/resources/applicationContext.xml +++ b/src/main/resources/applicationContext.xml @@ -3,14 +3,20 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - + - + + + + + + + + - + diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java new file mode 100644 index 0000000..19c5d55 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -0,0 +1,31 @@ +package ru.otus.mkulikov.questions; + +import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.model.Question; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class QuestionsDAOTest { + + private final String c_questionsFileName = "questions.csv"; + + @Test + public void loadQuestionsTest() { + try { + QuestionsDAO questionsDAO = new QuestionsDAOImpl(); + List questions = questionsDAO.getQuestions(c_questionsFileName); + + assertNotNull(questions); + assertEquals(questions.size(), 3); + assertEquals(questions.get(0).getQuestion(), "Тест1"); + assertEquals(questions.get(1).getQuestion(), "Тест2"); + assertEquals(questions.get(2).getQuestion(), "Тест3"); + } catch (QuestionsFileLoadingException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/test/resources/questions.csv b/src/test/resources/questions.csv new file mode 100644 index 0000000..47cc49f --- /dev/null +++ b/src/test/resources/questions.csv @@ -0,0 +1,3 @@ +1,Тест1,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 +2,Тест2,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 +3,Тест3,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 From c3266f7cc25d91cfe827c1c189609f279b8534b1 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Tue, 19 Mar 2019 10:39:09 +0300 Subject: [PATCH 06/25] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D1=8B.=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++- pom.xml | 13 +++ .../mkulikov/constants/StringConstants.java | 16 ++++ .../processor/ProcessorServiceImpl.java | 23 +++-- .../mkulikov/questions/QuestionsDAOImpl.java | 20 ++++- .../questions/QuestionsServiceImpl.java | 23 +++-- .../registration/RegistrationService.java | 4 +- .../registration/RegistrationServiceImpl.java | 15 ++-- src/main/resources/applicationContext.xml | 20 ++--- .../QuestionsFileLoadingExceptionTest.java | 29 ++++++ .../ru/otus/mkulikov/model/QuestionTest.java | 90 +++++++++++++++++++ .../java/ru/otus/mkulikov/model/UserTest.java | 33 +++++++ .../processor/ProcessorServiceImplTest.java | 56 ++++++++++++ .../mkulikov/questions/QuestionsDAOTest.java | 42 +++++++-- .../questions/QuestionsServiceImplTest.java | 56 ++++++++++++ .../RegistrationServiceImplTest.java | 38 ++++++++ src/test/resources/test_questions.csv | 3 + 17 files changed, 447 insertions(+), 44 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/constants/StringConstants.java create mode 100644 src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java create mode 100644 src/test/java/ru/otus/mkulikov/model/QuestionTest.java create mode 100644 src/test/java/ru/otus/mkulikov/model/UserTest.java create mode 100644 src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java create mode 100644 src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java create mode 100644 src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java create mode 100644 src/test/resources/test_questions.csv diff --git a/README.md b/README.md index 8eebeba..10840c6 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,11 @@ Опционально: сервисы, по возможности, покрыть тестами. ### 19-03-18 Доработки: -- Переименование классов. -- Добавление исключения QuestionsFileLoadingException. +- Переименованы классы. +- Добавлено исключение QuestionsFileLoadingException. - Работа с консолью вынесена в сервис ConsoleService. -- Тесты для QuestionsDAO. \ No newline at end of file +- Тесты для QuestionsDAO. + +### 19-03-19 Доработки: +- Переименованы классы. +- Добавлены тесты. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7e5f8a1..942e1cb 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,13 @@ 5.4.0 test + + + org.assertj + assertj-core + 3.11.1 + test + @@ -69,6 +76,12 @@ ${encoding} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 diff --git a/src/main/java/ru/otus/mkulikov/constants/StringConstants.java b/src/main/java/ru/otus/mkulikov/constants/StringConstants.java new file mode 100644 index 0000000..0673a74 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/constants/StringConstants.java @@ -0,0 +1,16 @@ +package ru.otus.mkulikov.constants; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 13:07 + */ + +public class StringConstants { + + public static final String c_error_load_consoleService = "Ошибка загрузки ConsoleService!"; + public static final String c_error_load_questionsDAO = "Ошибка загрузки QuestionsDAO!"; + public static final String c_error_load_questionsService = "Ошибка загрузки QuestionsService!"; + public static final String c_error_load_registrationService = "Ошибка загрузки RegistrationService!"; +} diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java index e5b99d0..626be7a 100644 --- a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java @@ -4,6 +4,9 @@ import ru.otus.mkulikov.questions.QuestionsService; import ru.otus.mkulikov.registration.RegistrationService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -13,25 +16,31 @@ public class ProcessorServiceImpl implements ProcessorService { - private QuestionsService questionsProcess; + private QuestionsService questionsService; private RegistrationService registration; - public ProcessorServiceImpl(QuestionsService questionsProcess, RegistrationService registration) { - this.questionsProcess = questionsProcess; + public ProcessorServiceImpl(QuestionsService questionsService, RegistrationService registration) { + this.questionsService = questionsService; this.registration = registration; } @Override public void startTest() throws QuestionsFileLoadingException { getRegistration().addNewUser(); - getQuestionsProcess().showQuestions(); + getQuestionsService().showQuestions(); } - public QuestionsService getQuestionsProcess() { - return questionsProcess; + public QuestionsService getQuestionsService() throws QuestionsFileLoadingException { + if (questionsService == null) { + throw new QuestionsFileLoadingException(c_error_load_questionsService); + } + return questionsService; } - public RegistrationService getRegistration() { + public RegistrationService getRegistration() throws QuestionsFileLoadingException { + if (registration == null) { + throw new QuestionsFileLoadingException(c_error_load_registrationService); + } return registration; } } diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java index e0de84e..1ec9636 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java @@ -9,7 +9,9 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; +import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; import java.util.List; /** @@ -22,13 +24,25 @@ public class QuestionsDAOImpl implements QuestionsDAO { @SuppressWarnings({"rawtypes", "unchecked"}) - public List loadFile(String csvFilename) throws QuestionsFileLoadingException { + private List loadFile(String csvFilename) throws QuestionsFileLoadingException { + if (csvFilename == null) { + throw new QuestionsFileLoadingException("Имя файла не может быть null!"); + } + List questions = null; try { - CsvToBean csv = new CsvToBean(); - File file = new File(getClass().getResource("/" + csvFilename).toURI()); + URL url = getClass().getResource("/" + csvFilename); + if (url == null) { + throw new QuestionsFileLoadingException( + String.format("Ошибка загрузки ресурса с именем %s!", csvFilename) + ); + } + + File file = new File(url.toURI()); CSVReader csvReader = new CSVReader(new FileReader(file)); + CsvToBean csv = new CsvToBean(); + questions = csv.parse(setColumMapping(), csvReader); } catch (FileNotFoundException e) { throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e); diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java index ffcacf3..fe5c66d 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java @@ -6,6 +6,9 @@ import java.util.List; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -19,18 +22,18 @@ public class QuestionsServiceImpl implements QuestionsService { private final String c_answerNumbers = "1234"; private final String c_questionsFileName = "questions.csv"; - private QuestionsDAO questionsLoader; + private QuestionsDAO questionsDAO; private ConsoleService consoleService; - public QuestionsServiceImpl(QuestionsDAO questionsLoader, ConsoleService consoleService) { - this.questionsLoader = questionsLoader; + public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleService) { + this.questionsDAO = questionsDAO; this.consoleService = consoleService; } @Override public void showQuestions() throws QuestionsFileLoadingException { getConsoleService().write(c_delimeter); - List questions = getQuestionsLoader().getQuestions(c_questionsFileName); + List questions = getQuestionsDAO().getQuestions(c_questionsFileName); if (questions == null) { throw new QuestionsFileLoadingException("Список вопросов пуст!"); @@ -64,11 +67,17 @@ public void showQuestions() throws QuestionsFileLoadingException { getConsoleService().write(c_delimeter); } - public QuestionsDAO getQuestionsLoader() { - return questionsLoader; + public QuestionsDAO getQuestionsDAO() throws QuestionsFileLoadingException { + if (questionsDAO == null) { + throw new QuestionsFileLoadingException(c_error_load_questionsDAO); + } + return questionsDAO; } - public ConsoleService getConsoleService() { + public ConsoleService getConsoleService() throws QuestionsFileLoadingException { + if (consoleService == null) { + throw new QuestionsFileLoadingException(c_error_load_consoleService); + } return consoleService; } } diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java index 6e420d0..f3a68ea 100644 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.registration; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -9,5 +11,5 @@ public interface RegistrationService { - void addNewUser(); + void addNewUser() throws QuestionsFileLoadingException; } diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java index b3e5db4..b50d935 100644 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java @@ -1,8 +1,11 @@ package ru.otus.mkulikov.registration; import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.model.User; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -12,7 +15,6 @@ public class RegistrationServiceImpl implements RegistrationService { - private User user; private ConsoleService consoleService; public RegistrationServiceImpl(ConsoleService consoleService) { @@ -20,7 +22,7 @@ public RegistrationServiceImpl(ConsoleService consoleService) { } @Override - public void addNewUser() { + public void addNewUser() throws QuestionsFileLoadingException { getConsoleService().write("Введите свои данные"); getConsoleService().write("Фамилия: "); String surname = getConsoleService().read(); @@ -28,11 +30,14 @@ public void addNewUser() { getConsoleService().write("Имя: "); String name = getConsoleService().read(); - user = new User(name, surname); - getConsoleService().write(String.format("Здравствуйте, %s %s!", surname, name)); + User user = new User(name, surname); + getConsoleService().write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName())); } - public ConsoleService getConsoleService() { + public ConsoleService getConsoleService() throws QuestionsFileLoadingException { + if (consoleService == null) { + throw new QuestionsFileLoadingException(c_error_load_consoleService); + } return consoleService; } } diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml index d0dc24a..c85fd3c 100644 --- a/src/main/resources/applicationContext.xml +++ b/src/main/resources/applicationContext.xml @@ -3,22 +3,22 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - + - - + + - + - - - + + + - - - + + + \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java b/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java new file mode 100644 index 0000000..3b40a89 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java @@ -0,0 +1,29 @@ +package ru.otus.mkulikov.exceptions; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 11:39 + */ + +@DisplayName("Класс исключения QuestionsFileLoadingException") +class QuestionsFileLoadingExceptionTest { + + private final String c_not_supperted = "Not supported"; + + @Test + @DisplayName("Корректное заполнение исключения") + void shouldThrowException() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + throw new QuestionsFileLoadingException(c_not_supperted); + }); + assertEquals(c_not_supperted, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java new file mode 100644 index 0000000..c7a8c27 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java @@ -0,0 +1,90 @@ +package ru.otus.mkulikov.model; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 11:13 + */ + +@DisplayName("Класс Question") +class QuestionTest { + + private final String c_id = "1"; + private final String c_question = "Question"; + private final String c_userAnswer = "UserAnswer"; + private final String c_trueAnswer = "TrueAnswer"; + private final String c_answer1 = "Answer1"; + private final String c_answer2 = "Answer2"; + private final String c_answer3 = "Answer3"; + private final String c_answer4 = "Answer4"; + + private Question question; + + @BeforeEach + public void createModelQuestion() { + question = new Question(); + question.setId(c_id); + question.setQuestion(c_question); + question.setUserAnswer(c_userAnswer); + question.setTrueAnswer(c_trueAnswer); + question.setAnswer1(c_answer1); + question.setAnswer2(c_answer2); + question.setAnswer3(c_answer3); + question.setAnswer4(c_answer4); + } + + @Test + @DisplayName("Корректное заполнение id") + public void fillIdTest() { + assertEquals(c_id, question.getId()); + } + + @Test + @DisplayName("Корректное заполнение question") + public void fillQuestionTest() { + assertEquals(c_question, question.getQuestion()); + } + + @Test + @DisplayName("Корректное заполнение userAnswer") + public void fillUserAnsweTest() { + assertEquals(c_userAnswer, question.getUserAnswer()); + } + + @Test + @DisplayName("Корректное заполнение trueAnswer") + public void fillTrueAnsweTest() { + assertEquals(c_trueAnswer, question.getTrueAnswer()); + } + + @Test + @DisplayName("Корректное заполнение answer1") + public void fillAnswer1AnsweTest() { + assertEquals(c_answer1, question.getAnswer1()); + } + + @Test + @DisplayName("Корректное заполнение answer2") + public void fillAnswer2AnsweTest() { + assertEquals(c_answer2, question.getAnswer2()); + } + + @Test + @DisplayName("Корректное заполнение answer3") + public void fillAnswer3AnsweTest() { + assertEquals(c_answer3, question.getAnswer3()); + } + + @Test + @DisplayName("Корректное заполнение answer4") + public void fillAnswer4AnsweTest() { + assertEquals(c_answer4, question.getAnswer4()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/UserTest.java b/src/test/java/ru/otus/mkulikov/model/UserTest.java new file mode 100644 index 0000000..ffba44b --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/model/UserTest.java @@ -0,0 +1,33 @@ +package ru.otus.mkulikov.model; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 10:57 + */ + +@DisplayName("Класс User") +class UserTest { + + private final String c_userName = "Name"; + private final String c_userSurname = "Surname"; + + @Test + @DisplayName("Корректное создание") + public void createUserTest() { + User user = new User(c_userName, c_userSurname); + assertAll("user", + () -> assertEquals(c_userName, user.getName()), + () -> assertEquals(c_userSurname, user.getSurname()) + ); + + Assertions.assertThat(user).hasFieldOrPropertyWithValue("name", c_userName); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java new file mode 100644 index 0000000..c5f2864 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java @@ -0,0 +1,56 @@ +package ru.otus.mkulikov.processor; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +import static org.junit.jupiter.api.Assertions.*; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 11:37 + */ + +@DisplayName("Класс ProcessorServiceImpl") +class ProcessorServiceImplTest { + + private final ProcessorServiceImpl processorServiceNull = new ProcessorServiceImpl(null, null); + + @Test + @DisplayName("Корректный тип исключения для getQuestionsProcess") + void getExceptionTypeQuestionsProcessTest() { + assertThrows(QuestionsFileLoadingException.class, () -> { + processorServiceNull.getQuestionsService(); + }); + } + + @Test + @DisplayName("Корректное исключение для getQuestionsProcess") + void getExceptionQuestionsProcessTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + processorServiceNull.getQuestionsService(); + }); + assertEquals(c_error_load_questionsService, exception.getMessage()); + } + + @Test + @DisplayName("Корректный тип исключения для getRegistrationTest") + void getExceptionTypeRegistrationTest() { + assertThrows(QuestionsFileLoadingException.class, () -> { + processorServiceNull.getRegistration(); + }); + } + + @Test + @DisplayName("Корректное исключение для getRegistrationTest") + void getExceptionRegistrationTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + processorServiceNull.getRegistration(); + }); + assertEquals(c_error_load_registrationService, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 19c5d55..9c68433 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -1,31 +1,57 @@ package ru.otus.mkulikov.questions; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.model.Question; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; +@DisplayName("Класс QuestionsDAO") class QuestionsDAOTest { - private final String c_questionsFileName = "questions.csv"; + private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(); + + private final String c_questionsFileName = "test_questions.csv"; + private final String c_questionsBadFileName = "test.csv"; + + private final String c_test1 = "Тест1"; + private final String c_test2 = "Тест2"; + private final String c_test3 = "Тест3"; @Test + @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() { try { - QuestionsDAO questionsDAO = new QuestionsDAOImpl(); List questions = questionsDAO.getQuestions(c_questionsFileName); assertNotNull(questions); - assertEquals(questions.size(), 3); - assertEquals(questions.get(0).getQuestion(), "Тест1"); - assertEquals(questions.get(1).getQuestion(), "Тест2"); - assertEquals(questions.get(2).getQuestion(), "Тест3"); + assertEquals(3, questions.size()); + assertEquals(c_test1, questions.get(0).getQuestion()); + assertEquals(c_test2, questions.get(1).getQuestion()); + assertEquals(c_test3, questions.get(2).getQuestion()); } catch (QuestionsFileLoadingException e) { e.printStackTrace(); } } + + @Test + @DisplayName("Корректное исключение на null") + public void loadNullExceptionQuestionsTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + questionsDAO.getQuestions(null); + }); + assertEquals("Имя файла не может быть null!", exception.getMessage()); + } + + @Test + @DisplayName("Корректное исключение на неверное имя файла") + public void loadExceptionQuestionsTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + questionsDAO.getQuestions(c_questionsBadFileName); + }); + assertEquals(String.format("Ошибка загрузки ресурса с именем %s!", c_questionsBadFileName), exception.getMessage()); + } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java new file mode 100644 index 0000000..a7bbcc6 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java @@ -0,0 +1,56 @@ +package ru.otus.mkulikov.questions; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +import static org.junit.jupiter.api.Assertions.*; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 12:00 + */ + +@DisplayName("Класс QuestionsServiceImpl") +class QuestionsServiceImplTest { + + private final QuestionsServiceImpl questionsService = new QuestionsServiceImpl(null, null); + + @Test + @DisplayName("Корректный тип исключения для getQuestionsDAO") + void getExceptionTypeQuestionsDAO() { + assertThrows(QuestionsFileLoadingException.class, () -> { + questionsService.getQuestionsDAO(); + }); + } + + @Test + @DisplayName("Корректное исключение для getQuestionsDAO") + void getExceptionQuestionsDAO() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + questionsService.getQuestionsDAO(); + }); + assertEquals(c_error_load_questionsDAO, exception.getMessage()); + } + + @Test + @DisplayName("Корректный тип исключения для getConsoleService") + void getExceptionTypeConsoleService() { + assertThrows(QuestionsFileLoadingException.class, () -> { + questionsService.getConsoleService(); + }); + } + + @Test + @DisplayName("Корректное исключение для getConsoleService") + void getExceptionConsoleService() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + questionsService.getConsoleService(); + }); + assertEquals(c_error_load_consoleService, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java new file mode 100644 index 0000000..5b75555 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java @@ -0,0 +1,38 @@ +package ru.otus.mkulikov.registration; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +import static org.junit.jupiter.api.Assertions.*; +import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-18 + * Time: 13:02 + */ + +@DisplayName("Класс RegistrationServiceImpl") +class RegistrationServiceImplTest { + + private final RegistrationServiceImpl registrationService = new RegistrationServiceImpl(null); + + @Test + @DisplayName("Корректный тип исключения для getConsoleService") + void getExceptionTypeConsoleServiceTest() { + assertThrows(QuestionsFileLoadingException.class, () -> { + registrationService.getConsoleService(); + }); + } + + @Test + @DisplayName("Корректное исключение для getQuestionsDAO") + void getExceptionConsoleServiceTest() { + Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { + registrationService.getConsoleService(); + }); + assertEquals(c_error_load_consoleService, exception.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/resources/test_questions.csv b/src/test/resources/test_questions.csv new file mode 100644 index 0000000..47cc49f --- /dev/null +++ b/src/test/resources/test_questions.csv @@ -0,0 +1,3 @@ +1,Тест1,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 +2,Тест2,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 +3,Тест3,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 From f02aaa198e5cb3181e6f9e71fc03df67cf308ad1 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Tue, 19 Mar 2019 16:19:34 +0300 Subject: [PATCH 07/25] =?UTF-8?q?-=20XML=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8?= =?UTF-8?q?=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20spring=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B0=20Jav?= =?UTF-8?q?a-based.=20-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D1=80=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 ++++--- pom.xml | 22 +++++++- .../mkulikov/{Main.java => Application.java} | 12 ++-- .../mkulikov/configuration/AppConfig.java | 56 +++++++++++++++++++ .../mkulikov/{model => models}/Question.java | 2 +- .../otus/mkulikov/{model => models}/User.java | 2 +- .../console/ConsoleService.java | 2 +- .../console/ConsoleServiceImpl.java | 2 +- .../processor/ProcessorService.java | 2 +- .../processor/ProcessorServiceImpl.java | 6 +- .../questions/QuestionsService.java | 2 +- .../questions/QuestionsServiceImpl.java | 7 ++- .../questions/dao}/QuestionsDAO.java | 4 +- .../questions/dao}/QuestionsDAOImpl.java | 14 ++--- .../registration/RegistrationService.java | 2 +- .../registration/RegistrationServiceImpl.java | 6 +- src/main/resources/applicationContext.xml | 24 -------- .../ru/otus/mkulikov/model/QuestionTest.java | 1 + .../java/ru/otus/mkulikov/model/UserTest.java | 1 + .../processor/ProcessorServiceImplTest.java | 1 + .../mkulikov/questions/QuestionsDAOTest.java | 16 ++++-- .../questions/QuestionsServiceImplTest.java | 1 + .../RegistrationServiceImplTest.java | 1 + src/test/resources/questions.csv | 3 - 24 files changed, 134 insertions(+), 74 deletions(-) rename src/main/java/ru/otus/mkulikov/{Main.java => Application.java} (54%) create mode 100644 src/main/java/ru/otus/mkulikov/configuration/AppConfig.java rename src/main/java/ru/otus/mkulikov/{model => models}/Question.java (98%) rename src/main/java/ru/otus/mkulikov/{model => models}/User.java (94%) rename src/main/java/ru/otus/mkulikov/{ => services}/console/ConsoleService.java (81%) rename src/main/java/ru/otus/mkulikov/{ => services}/console/ConsoleServiceImpl.java (93%) rename src/main/java/ru/otus/mkulikov/{ => services}/processor/ProcessorService.java (85%) rename src/main/java/ru/otus/mkulikov/{ => services}/processor/ProcessorServiceImpl.java (89%) rename src/main/java/ru/otus/mkulikov/{ => services}/questions/QuestionsService.java (85%) rename src/main/java/ru/otus/mkulikov/{ => services}/questions/QuestionsServiceImpl.java (93%) rename src/main/java/ru/otus/mkulikov/{questions => services/questions/dao}/QuestionsDAO.java (77%) rename src/main/java/ru/otus/mkulikov/{questions => services/questions/dao}/QuestionsDAOImpl.java (88%) rename src/main/java/ru/otus/mkulikov/{ => services}/registration/RegistrationService.java (85%) rename src/main/java/ru/otus/mkulikov/{ => services}/registration/RegistrationServiceImpl.java (90%) delete mode 100644 src/main/resources/applicationContext.xml delete mode 100644 src/test/resources/questions.csv diff --git a/README.md b/README.md index 10840c6..893eb6e 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,23 @@ # OtusSpringHW -Домашнее задание #1: - +### Домашнее задание #1: Программа по проведению тестирования студентов -В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопрсов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. - +В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопросов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. - Опционально: сервисы, по возможности, покрыть тестами. -### 19-03-18 Доработки: +##### 19-03-18 Доработки: - Переименованы классы. - Добавлено исключение QuestionsFileLoadingException. - Работа с консолью вынесена в сервис ConsoleService. - Тесты для QuestionsDAO. -### 19-03-19 Доработки: +##### 19-03-19 Доработки: - Переименованы классы. -- Добавлены тесты. \ No newline at end of file +- Добавлены тесты. +--- +### Домашнее задание #2: +- Добавить файл настроек в приложение и для тестирования. +- Локализовать выводимые сообщения и вопросы теста. +- Переписать конфигурацию в виде Java + Annotation-based конфигурации. +--- \ No newline at end of file diff --git a/pom.xml b/pom.xml index 942e1cb..bb61d64 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,13 @@ 1.3.2 + + junit + junit + 4.12 + test + + org.junit.jupiter junit-jupiter-api @@ -56,6 +63,13 @@ 3.11.1 test + + + org.junit.platform + junit-platform-launcher + 1.4.1 + test + @@ -81,7 +95,11 @@ org.apache.maven.plugins maven-surefire-plugin - 2.21.0 + 2.22.0 + + + false + @@ -89,8 +107,6 @@ src/main/resources - **/*.properties - **/*.xml **/*.csv false diff --git a/src/main/java/ru/otus/mkulikov/Main.java b/src/main/java/ru/otus/mkulikov/Application.java similarity index 54% rename from src/main/java/ru/otus/mkulikov/Main.java rename to src/main/java/ru/otus/mkulikov/Application.java index 88e4918..c6a283c 100644 --- a/src/main/java/ru/otus/mkulikov/Main.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -1,8 +1,10 @@ package ru.otus.mkulikov; -import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.processor.ProcessorService; +import ru.otus.mkulikov.services.processor.ProcessorService; /** * Created by IntelliJ IDEA. @@ -11,10 +13,12 @@ * Time: 15:27 */ -public class Main { +@Configuration +@ComponentScan +public class Application { public static void main(String[] args) { - ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class); try { ProcessorService processor = context.getBean(ProcessorService.class); processor.startTest(); diff --git a/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java b/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java new file mode 100644 index 0000000..dcb8799 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java @@ -0,0 +1,56 @@ +package ru.otus.mkulikov.configuration; + +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; +import ru.otus.mkulikov.services.console.ConsoleService; +import ru.otus.mkulikov.services.console.ConsoleServiceImpl; +import ru.otus.mkulikov.services.processor.ProcessorServiceImpl; +import ru.otus.mkulikov.services.questions.QuestionsService; +import ru.otus.mkulikov.services.questions.QuestionsServiceImpl; +import ru.otus.mkulikov.services.registration.RegistrationService; +import ru.otus.mkulikov.services.registration.RegistrationServiceImpl; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-19 + * Time: 14:15 + */ + +@Configuration +public class AppConfig { + + @Bean(destroyMethod = "destroy") + @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) + public ConsoleServiceImpl consoleService() { + return new ConsoleServiceImpl(); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public RegistrationServiceImpl registrationService(ConsoleService consoleService) { + return new RegistrationServiceImpl(consoleService); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public QuestionsDAOImpl questionsDAO() { + return new QuestionsDAOImpl(); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) + public QuestionsServiceImpl questionsService(QuestionsDAO questionsDAO, ConsoleService consoleService) { + return new QuestionsServiceImpl(questionsDAO, consoleService); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) + public ProcessorServiceImpl processorService(QuestionsService questionsService, RegistrationService registrationService) { + return new ProcessorServiceImpl(questionsService, registrationService); + } +} \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/model/Question.java b/src/main/java/ru/otus/mkulikov/models/Question.java similarity index 98% rename from src/main/java/ru/otus/mkulikov/model/Question.java rename to src/main/java/ru/otus/mkulikov/models/Question.java index 5f40e3f..94ca74c 100644 --- a/src/main/java/ru/otus/mkulikov/model/Question.java +++ b/src/main/java/ru/otus/mkulikov/models/Question.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.model; +package ru.otus.mkulikov.models; import java.io.Serializable; diff --git a/src/main/java/ru/otus/mkulikov/model/User.java b/src/main/java/ru/otus/mkulikov/models/User.java similarity index 94% rename from src/main/java/ru/otus/mkulikov/model/User.java rename to src/main/java/ru/otus/mkulikov/models/User.java index 146fbd7..bb44f31 100644 --- a/src/main/java/ru/otus/mkulikov/model/User.java +++ b/src/main/java/ru/otus/mkulikov/models/User.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.model; +package ru.otus.mkulikov.models; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleService.java b/src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java similarity index 81% rename from src/main/java/ru/otus/mkulikov/console/ConsoleService.java rename to src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java index 75d552d..a7e2f25 100644 --- a/src/main/java/ru/otus/mkulikov/console/ConsoleService.java +++ b/src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.console; +package ru.otus.mkulikov.services.console; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java similarity index 93% rename from src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java index 881223e..7a0c2d0 100644 --- a/src/main/java/ru/otus/mkulikov/console/ConsoleServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.console; +package ru.otus.mkulikov.services.console; import javax.annotation.PreDestroy; import java.util.Scanner; diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/processor/ProcessorService.java rename to src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java index f0bcccc..54e3c71 100644 --- a/src/main/java/ru/otus/mkulikov/processor/ProcessorService.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.processor; +package ru.otus.mkulikov.services.processor; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; diff --git a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java similarity index 89% rename from src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java index 626be7a..80905f6 100644 --- a/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java @@ -1,8 +1,8 @@ -package ru.otus.mkulikov.processor; +package ru.otus.mkulikov.services.processor; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.questions.QuestionsService; -import ru.otus.mkulikov.registration.RegistrationService; +import ru.otus.mkulikov.services.questions.QuestionsService; +import ru.otus.mkulikov.services.registration.RegistrationService; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsService.java rename to src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java index 8c80904..15fd4bb 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsService.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.services.questions; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java similarity index 93% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index fe5c66d..68acf83 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,8 +1,9 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.services.questions; -import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.services.console.ConsoleService; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.Question; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; +import ru.otus.mkulikov.models.Question; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java similarity index 77% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java rename to src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java index 9a99d97..c2c08b3 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAO.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java @@ -1,7 +1,7 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.services.questions.dao; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.Question; +import ru.otus.mkulikov.models.Question; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java similarity index 88% rename from src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java rename to src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 1ec9636..2e9fcb2 100644 --- a/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -1,15 +1,12 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.services.questions.dao; import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.Question; +import ru.otus.mkulikov.models.Question; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.net.URI; +import java.io.*; import java.net.URISyntaxException; import java.net.URL; import java.util.List; @@ -39,8 +36,7 @@ private List loadFile(String csvFilename) throws QuestionsFileLoadingE } File file = new File(url.toURI()); - - CSVReader csvReader = new CSVReader(new FileReader(file)); + CSVReader csvReader=new CSVReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); CsvToBean csv = new CsvToBean(); questions = csv.parse(setColumMapping(), csvReader); @@ -48,6 +44,8 @@ private List loadFile(String csvFilename) throws QuestionsFileLoadingE throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e); } catch (URISyntaxException e) { throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); } return questions; } diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/registration/RegistrationService.java rename to src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java index f3a68ea..8b6d68e 100644 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.registration; +package ru.otus.mkulikov.services.registration; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; diff --git a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java similarity index 90% rename from src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index b50d935..2c70448 100644 --- a/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -1,8 +1,8 @@ -package ru.otus.mkulikov.registration; +package ru.otus.mkulikov.services.registration; -import ru.otus.mkulikov.console.ConsoleService; +import ru.otus.mkulikov.services.console.ConsoleService; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.User; +import ru.otus.mkulikov.models.User; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml deleted file mode 100644 index c85fd3c..0000000 --- a/src/main/resources/applicationContext.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java index c7a8c27..fd315d2 100644 --- a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java +++ b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.models.Question; import static org.junit.jupiter.api.Assertions.assertEquals; diff --git a/src/test/java/ru/otus/mkulikov/model/UserTest.java b/src/test/java/ru/otus/mkulikov/model/UserTest.java index ffba44b..b1982fe 100644 --- a/src/test/java/ru/otus/mkulikov/model/UserTest.java +++ b/src/test/java/ru/otus/mkulikov/model/UserTest.java @@ -3,6 +3,7 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import ru.otus.mkulikov.models.User; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java index c5f2864..2928f53 100644 --- a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.services.processor.ProcessorServiceImpl; import static org.junit.jupiter.api.Assertions.*; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 9c68433..0ba967c 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -3,7 +3,9 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.model.Question; +import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; import java.util.List; @@ -27,11 +29,13 @@ public void loadQuestionsTest() { try { List questions = questionsDAO.getQuestions(c_questionsFileName); - assertNotNull(questions); - assertEquals(3, questions.size()); - assertEquals(c_test1, questions.get(0).getQuestion()); - assertEquals(c_test2, questions.get(1).getQuestion()); - assertEquals(c_test3, questions.get(2).getQuestion()); + assertAll("questions", + () -> assertNotNull(questions), + () -> assertEquals(3, questions.size()), + () -> assertEquals(c_test1, questions.get(0).getQuestion()), + () -> assertEquals(c_test2, questions.get(1).getQuestion()), + () -> assertEquals(c_test3, questions.get(2).getQuestion()) + ); } catch (QuestionsFileLoadingException e) { e.printStackTrace(); } diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java index a7bbcc6..2935fc0 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.services.questions.QuestionsServiceImpl; import static org.junit.jupiter.api.Assertions.*; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; diff --git a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java index 5b75555..0252a9d 100644 --- a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.services.registration.RegistrationServiceImpl; import static org.junit.jupiter.api.Assertions.*; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; diff --git a/src/test/resources/questions.csv b/src/test/resources/questions.csv deleted file mode 100644 index 47cc49f..0000000 --- a/src/test/resources/questions.csv +++ /dev/null @@ -1,3 +0,0 @@ -1,Тест1,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 -2,Тест2,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 -3,Тест3,Ответ1,Ответ2,Ответ3,Ответ4,Ответ1 From 0c0054193afa0ee39bf733621314badab2a236de Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Tue, 19 Mar 2019 16:44:44 +0300 Subject: [PATCH 08/25] =?UTF-8?q?Java-based=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20spring=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BD=D0=B0?= =?UTF-8?q?=20Annotation-based.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mkulikov/configuration/AppConfig.java | 56 ------------------- .../services/console/ConsoleServiceImpl.java | 5 +- .../processor/ProcessorServiceImpl.java | 8 ++- .../questions/QuestionsServiceImpl.java | 12 ++-- .../questions/dao/QuestionsDAOImpl.java | 2 + .../registration/RegistrationServiceImpl.java | 8 ++- 6 files changed, 26 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/ru/otus/mkulikov/configuration/AppConfig.java diff --git a/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java b/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java deleted file mode 100644 index dcb8799..0000000 --- a/src/main/java/ru/otus/mkulikov/configuration/AppConfig.java +++ /dev/null @@ -1,56 +0,0 @@ -package ru.otus.mkulikov.configuration; - -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; -import ru.otus.mkulikov.services.console.ConsoleService; -import ru.otus.mkulikov.services.console.ConsoleServiceImpl; -import ru.otus.mkulikov.services.processor.ProcessorServiceImpl; -import ru.otus.mkulikov.services.questions.QuestionsService; -import ru.otus.mkulikov.services.questions.QuestionsServiceImpl; -import ru.otus.mkulikov.services.registration.RegistrationService; -import ru.otus.mkulikov.services.registration.RegistrationServiceImpl; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-19 - * Time: 14:15 - */ - -@Configuration -public class AppConfig { - - @Bean(destroyMethod = "destroy") - @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) - public ConsoleServiceImpl consoleService() { - return new ConsoleServiceImpl(); - } - - @Bean - @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public RegistrationServiceImpl registrationService(ConsoleService consoleService) { - return new RegistrationServiceImpl(consoleService); - } - - @Bean - @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public QuestionsDAOImpl questionsDAO() { - return new QuestionsDAOImpl(); - } - - @Bean - @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) - public QuestionsServiceImpl questionsService(QuestionsDAO questionsDAO, ConsoleService consoleService) { - return new QuestionsServiceImpl(questionsDAO, consoleService); - } - - @Bean - @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON) - public ProcessorServiceImpl processorService(QuestionsService questionsService, RegistrationService registrationService) { - return new ProcessorServiceImpl(questionsService, registrationService); - } -} \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java index 7a0c2d0..357b770 100644 --- a/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.services.console; +import org.springframework.stereotype.Service; + import javax.annotation.PreDestroy; import java.util.Scanner; @@ -10,9 +12,10 @@ * Time: 23:21 */ +@Service public class ConsoleServiceImpl implements ConsoleService { - private Scanner in; + private final Scanner in; public ConsoleServiceImpl() { in = new Scanner(System.in); diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java index 80905f6..f398f9c 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.services.processor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.questions.QuestionsService; import ru.otus.mkulikov.services.registration.RegistrationService; @@ -14,11 +16,13 @@ * Time: 15:54 */ +@Service public class ProcessorServiceImpl implements ProcessorService { - private QuestionsService questionsService; - private RegistrationService registration; + private final QuestionsService questionsService; + private final RegistrationService registration; + @Autowired public ProcessorServiceImpl(QuestionsService questionsService, RegistrationService registration) { this.questionsService = questionsService; this.registration = registration; diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index 68acf83..c749537 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,9 +1,11 @@ package ru.otus.mkulikov.services.questions; -import ru.otus.mkulikov.services.console.ConsoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.services.console.ConsoleService; +import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import java.util.List; @@ -17,15 +19,17 @@ * Time: 16:41 */ +@Service public class QuestionsServiceImpl implements QuestionsService { private final String c_delimeter = "---------------------------------------------------"; private final String c_answerNumbers = "1234"; private final String c_questionsFileName = "questions.csv"; - private QuestionsDAO questionsDAO; - private ConsoleService consoleService; + private final QuestionsDAO questionsDAO; + private final ConsoleService consoleService; + @Autowired public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleService) { this.questionsDAO = questionsDAO; this.consoleService = consoleService; diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 2e9fcb2..1d17687 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,6 +3,7 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; +import org.springframework.stereotype.Repository; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; @@ -18,6 +19,7 @@ * Time: 16:42 */ +@Repository public class QuestionsDAOImpl implements QuestionsDAO { @SuppressWarnings({"rawtypes", "unchecked"}) diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index 2c70448..8fd3832 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -1,8 +1,10 @@ package ru.otus.mkulikov.services.registration; -import ru.otus.mkulikov.services.console.ConsoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.User; +import ru.otus.mkulikov.services.console.ConsoleService; import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; @@ -13,10 +15,12 @@ * Time: 16:34 */ +@Service public class RegistrationServiceImpl implements RegistrationService { - private ConsoleService consoleService; + private final ConsoleService consoleService; + @Autowired public RegistrationServiceImpl(ConsoleService consoleService) { this.consoleService = consoleService; } From 5836fb1dec14082953d92e9624e7b75043f8a84f Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 20 Mar 2019 01:55:23 +0300 Subject: [PATCH 09/25] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=BC=D0=B5=D0=BD=D0=B8=20=D1=84=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=B0=20=D1=81=20=D0=B2=D0=BE=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=D0=BC=D0=B8=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 +++++++ .../questions/QuestionsServiceImpl.java | 9 +++++-- src/main/resources/config.properties | 1 + .../mkulikov/questions/QuestionsDAOTest.java | 24 ++++++++----------- 4 files changed, 26 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/config.properties diff --git a/pom.xml b/pom.xml index bb61d64..8a15725 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,13 @@ 5.0.9.RELEASE + + org.springframework + spring-test + 5.0.9.RELEASE + + + net.sf.opencsv opencsv @@ -108,6 +115,7 @@ src/main/resources **/*.csv + **/*.properties false diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index c749537..b404d0f 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,6 +1,8 @@ package ru.otus.mkulikov.services.questions; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; @@ -20,11 +22,14 @@ */ @Service +@PropertySource("classpath:config.properties") public class QuestionsServiceImpl implements QuestionsService { private final String c_delimeter = "---------------------------------------------------"; private final String c_answerNumbers = "1234"; - private final String c_questionsFileName = "questions.csv"; + + @Value("${questions.file.name}") + private String questionsFileName ; private final QuestionsDAO questionsDAO; private final ConsoleService consoleService; @@ -38,7 +43,7 @@ public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleSer @Override public void showQuestions() throws QuestionsFileLoadingException { getConsoleService().write(c_delimeter); - List questions = getQuestionsDAO().getQuestions(c_questionsFileName); + List questions = getQuestionsDAO().getQuestions(questionsFileName); if (questions == null) { throw new QuestionsFileLoadingException("Список вопросов пуст!"); diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties new file mode 100644 index 0000000..4e513dc --- /dev/null +++ b/src/main/resources/config.properties @@ -0,0 +1 @@ +questions.file.name=questions.csv \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 0ba967c..b6d0826 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -25,20 +25,16 @@ class QuestionsDAOTest { @Test @DisplayName("Корректная загрузка вопросов") - public void loadQuestionsTest() { - try { - List questions = questionsDAO.getQuestions(c_questionsFileName); - - assertAll("questions", - () -> assertNotNull(questions), - () -> assertEquals(3, questions.size()), - () -> assertEquals(c_test1, questions.get(0).getQuestion()), - () -> assertEquals(c_test2, questions.get(1).getQuestion()), - () -> assertEquals(c_test3, questions.get(2).getQuestion()) - ); - } catch (QuestionsFileLoadingException e) { - e.printStackTrace(); - } + public void loadQuestionsTest() throws QuestionsFileLoadingException { + List questions = questionsDAO.getQuestions(c_questionsFileName); + + assertAll("questions", + () -> assertNotNull(questions), + () -> assertEquals(3, questions.size()), + () -> assertEquals(c_test1, questions.get(0).getQuestion()), + () -> assertEquals(c_test2, questions.get(1).getQuestion()), + () -> assertEquals(c_test3, questions.get(2).getQuestion()) + ); } @Test From da868941734952ecfda80fdb36630120f670bd86 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Wed, 20 Mar 2019 15:00:24 +0300 Subject: [PATCH 10/25] =?UTF-8?q?-=20=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.=20-=20=D0=98=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B1?= =?UTF-8?q?=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8=20lombok?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 17 ---- pom.xml | 8 +- .../java/ru/otus/mkulikov/Application.java | 2 + .../mkulikov/constants/StringConstants.java | 16 ---- .../QuestionsFileLoadingException.java | 2 +- .../ru/otus/mkulikov/models/Question.java | 86 +++++-------------- .../java/ru/otus/mkulikov/models/User.java | 23 ++--- ...iceImpl.java => ConsoleIOServiceImpl.java} | 4 +- .../{ConsoleService.java => IOService.java} | 2 +- .../services/processor/ProcessorService.java | 4 +- .../processor/ProcessorServiceImpl.java | 24 +----- .../questions/QuestionsServiceImpl.java | 51 +++-------- .../services/questions/dao/QuestionsDAO.java | 2 +- .../questions/dao/QuestionsDAOImpl.java | 17 ++-- .../registration/RegistrationService.java | 4 +- .../registration/RegistrationServiceImpl.java | 30 +++---- .../QuestionsFileLoadingExceptionTest.java | 29 ------- .../ru/otus/mkulikov/model/QuestionTest.java | 76 ++++------------ .../processor/ProcessorServiceImplTest.java | 57 ------------ .../mkulikov/questions/QuestionsDAOTest.java | 25 +----- .../questions/QuestionsServiceImplTest.java | 57 ------------ .../RegistrationServiceImplTest.java | 39 --------- 22 files changed, 99 insertions(+), 476 deletions(-) delete mode 100644 src/main/java/ru/otus/mkulikov/constants/StringConstants.java rename src/main/java/ru/otus/mkulikov/services/console/{ConsoleServiceImpl.java => ConsoleIOServiceImpl.java} (86%) rename src/main/java/ru/otus/mkulikov/services/console/{ConsoleService.java => IOService.java} (85%) delete mode 100644 src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java diff --git a/README.md b/README.md index 893eb6e..33f056a 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,6 @@ # OtusSpringHW -### Домашнее задание #1: -Программа по проведению тестирования студентов -В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопросов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. -Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. -Опционально: сервисы, по возможности, покрыть тестами. - -##### 19-03-18 Доработки: -- Переименованы классы. -- Добавлено исключение QuestionsFileLoadingException. -- Работа с консолью вынесена в сервис ConsoleService. -- Тесты для QuestionsDAO. - -##### 19-03-19 Доработки: -- Переименованы классы. -- Добавлены тесты. ---- ### Домашнее задание #2: - Добавить файл настроек в приложение и для тестирования. - Локализовать выводимые сообщения и вопросы теста. - Переписать конфигурацию в виде Java + Annotation-based конфигурации. ---- \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8a15725..bbb1616 100644 --- a/pom.xml +++ b/pom.xml @@ -30,7 +30,6 @@ 5.0.9.RELEASE - net.sf.opencsv opencsv @@ -77,6 +76,13 @@ 1.4.1 test + + + org.projectlombok + lombok + 1.18.4 + provided + diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index c6a283c..44ec99d 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -3,6 +3,7 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.processor.ProcessorService; @@ -15,6 +16,7 @@ @Configuration @ComponentScan +@PropertySource("classpath:config.properties") public class Application { public static void main(String[] args) { diff --git a/src/main/java/ru/otus/mkulikov/constants/StringConstants.java b/src/main/java/ru/otus/mkulikov/constants/StringConstants.java deleted file mode 100644 index 0673a74..0000000 --- a/src/main/java/ru/otus/mkulikov/constants/StringConstants.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.otus.mkulikov.constants; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 13:07 - */ - -public class StringConstants { - - public static final String c_error_load_consoleService = "Ошибка загрузки ConsoleService!"; - public static final String c_error_load_questionsDAO = "Ошибка загрузки QuestionsDAO!"; - public static final String c_error_load_questionsService = "Ошибка загрузки QuestionsService!"; - public static final String c_error_load_registrationService = "Ошибка загрузки RegistrationService!"; -} diff --git a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java index 5a4e3bc..2105a5b 100644 --- a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java +++ b/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java @@ -7,7 +7,7 @@ * Time: 01:40 */ -public class QuestionsFileLoadingException extends Exception { +public class QuestionsFileLoadingException extends RuntimeException { public QuestionsFileLoadingException(String message) { super(message); diff --git a/src/main/java/ru/otus/mkulikov/models/Question.java b/src/main/java/ru/otus/mkulikov/models/Question.java index 94ca74c..03f8256 100644 --- a/src/main/java/ru/otus/mkulikov/models/Question.java +++ b/src/main/java/ru/otus/mkulikov/models/Question.java @@ -1,5 +1,8 @@ package ru.otus.mkulikov.models; +import lombok.Getter; +import lombok.Setter; + import java.io.Serializable; /** @@ -11,89 +14,42 @@ public class Question implements Serializable { + @Setter + @Getter private String id; + @Setter + @Getter private String question; + @Setter + @Getter private String answer1; + @Setter + @Getter private String answer2; + @Setter + @Getter private String answer3; + @Setter + @Getter private String answer4; + @Setter + @Getter private String trueAnswer; + @Setter + @Getter private String userAnswer; - public String getId() { - return id; - } - - public void setId(String id) { + public Question(String id, String question, String answer1, String answer2, String answer3, String answer4, String trueAnswer, String userAnswer) { this.id = id; - } - - public String getQuestion() { - return question; - } - - public void setQuestion(String question) { this.question = question; - } - - public String getAnswer1() { - return answer1; - } - - public void setAnswer1(String answer1) { this.answer1 = answer1; - } - - public String getAnswer2() { - return answer2; - } - - public void setAnswer2(String answer2) { this.answer2 = answer2; - } - - public String getAnswer3() { - return answer3; - } - - public void setAnswer3(String answer3) { this.answer3 = answer3; - } - - public String getAnswer4() { - return answer4; - } - - public void setAnswer4(String answer4) { this.answer4 = answer4; - } - - public String getTrueAnswer() { - return trueAnswer; - } - - public void setTrueAnswer(String trueAnswer) { this.trueAnswer = trueAnswer; - } - - public String getUserAnswer() { - return userAnswer; - } - - public void setUserAnswer(String userAnswer) { this.userAnswer = userAnswer; } - @Override - public String toString() { - return "Question {" + - "id='" + id + '\'' + - ", question='" + question + '\'' + - ", answer1='" + answer1 + '\'' + - ", answer2='" + answer2 + '\'' + - ", answer3='" + answer3 + '\'' + - ", answer4='" + answer4 + '\'' + - ", trueAnswer='" + trueAnswer + '\'' + - '}'; + public Question() { } } diff --git a/src/main/java/ru/otus/mkulikov/models/User.java b/src/main/java/ru/otus/mkulikov/models/User.java index bb44f31..58c18f8 100644 --- a/src/main/java/ru/otus/mkulikov/models/User.java +++ b/src/main/java/ru/otus/mkulikov/models/User.java @@ -1,5 +1,8 @@ package ru.otus.mkulikov.models; +import lombok.Getter; +import lombok.Setter; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -9,27 +12,15 @@ public class User { + @Setter + @Getter private final String name; + @Setter + @Getter private final String surname; public User(String name, String surname) { this.name = name; this.surname = surname; } - - public String getName() { - return name; - } - - public String getSurname() { - return surname; - } - - @Override - public String toString() { - return "User {" + - "name='" + name + '\'' + - ", surname='" + surname + '\'' + - '}'; - } } diff --git a/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java similarity index 86% rename from src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java rename to src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java index 357b770..115a0e1 100644 --- a/src/main/java/ru/otus/mkulikov/services/console/ConsoleServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java @@ -13,11 +13,11 @@ */ @Service -public class ConsoleServiceImpl implements ConsoleService { +public class ConsoleIOServiceImpl implements IOService { private final Scanner in; - public ConsoleServiceImpl() { + public ConsoleIOServiceImpl() { in = new Scanner(System.in); } diff --git a/src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java b/src/main/java/ru/otus/mkulikov/services/console/IOService.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java rename to src/main/java/ru/otus/mkulikov/services/console/IOService.java index a7e2f25..b6f92d3 100644 --- a/src/main/java/ru/otus/mkulikov/services/console/ConsoleService.java +++ b/src/main/java/ru/otus/mkulikov/services/console/IOService.java @@ -7,7 +7,7 @@ * Time: 23:21 */ -public interface ConsoleService { +public interface IOService { void write(String text); diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java index 54e3c71..bfb3896 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java @@ -1,7 +1,5 @@ package ru.otus.mkulikov.services.processor; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -11,5 +9,5 @@ public interface ProcessorService { - void startTest() throws QuestionsFileLoadingException; + void startTest(); } diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java index f398f9c..50a00aa 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java @@ -2,13 +2,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.questions.QuestionsService; import ru.otus.mkulikov.services.registration.RegistrationService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -29,22 +25,8 @@ public ProcessorServiceImpl(QuestionsService questionsService, RegistrationServi } @Override - public void startTest() throws QuestionsFileLoadingException { - getRegistration().addNewUser(); - getQuestionsService().showQuestions(); - } - - public QuestionsService getQuestionsService() throws QuestionsFileLoadingException { - if (questionsService == null) { - throw new QuestionsFileLoadingException(c_error_load_questionsService); - } - return questionsService; - } - - public RegistrationService getRegistration() throws QuestionsFileLoadingException { - if (registration == null) { - throw new QuestionsFileLoadingException(c_error_load_registrationService); - } - return registration; + public void startTest() { + registration.addNewUser(); + questionsService.showQuestions(); } } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index b404d0f..e5eed5a 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,19 +1,14 @@ package ru.otus.mkulikov.services.questions; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; -import ru.otus.mkulikov.services.console.ConsoleService; +import ru.otus.mkulikov.services.console.IOService; import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import java.util.List; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -22,72 +17,54 @@ */ @Service -@PropertySource("classpath:config.properties") public class QuestionsServiceImpl implements QuestionsService { private final String c_delimeter = "---------------------------------------------------"; private final String c_answerNumbers = "1234"; - @Value("${questions.file.name}") - private String questionsFileName ; - private final QuestionsDAO questionsDAO; - private final ConsoleService consoleService; + private final IOService consoleService; @Autowired - public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleService) { + public QuestionsServiceImpl(QuestionsDAO questionsDAO, IOService consoleService) { this.questionsDAO = questionsDAO; this.consoleService = consoleService; } @Override public void showQuestions() throws QuestionsFileLoadingException { - getConsoleService().write(c_delimeter); - List questions = getQuestionsDAO().getQuestions(questionsFileName); + consoleService.write(c_delimeter); + List questions = questionsDAO.getQuestions(); if (questions == null) { throw new QuestionsFileLoadingException("Список вопросов пуст!"); } for (Question question : questions) { - getConsoleService().write(question.getQuestion()); - getConsoleService().write(question.getAnswer1()); - getConsoleService().write(question.getAnswer2()); - getConsoleService().write(question.getAnswer3()); - getConsoleService().write(question.getAnswer4()); + consoleService.write(question.getQuestion()); + consoleService.write(question.getAnswer1()); + consoleService.write(question.getAnswer2()); + consoleService.write(question.getAnswer3()); + consoleService.write(question.getAnswer4()); String answer = null; boolean okAnswer = false; int i = 0; while (!okAnswer && i < 4) { System.out.println("Введите номер ответа: "); - answer = getConsoleService().read(); + answer = consoleService.read(); okAnswer = c_answerNumbers.contains(answer); i++; } question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); - getConsoleService().write(c_delimeter); + consoleService.write(c_delimeter); } long count = questions.stream() .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) .count(); - getConsoleService().write("Количество правильных ответов: " + count + " из " + questions.size()); - getConsoleService().write(c_delimeter); - } - - public QuestionsDAO getQuestionsDAO() throws QuestionsFileLoadingException { - if (questionsDAO == null) { - throw new QuestionsFileLoadingException(c_error_load_questionsDAO); - } - return questionsDAO; - } - - public ConsoleService getConsoleService() throws QuestionsFileLoadingException { - if (consoleService == null) { - throw new QuestionsFileLoadingException(c_error_load_consoleService); - } - return consoleService; + consoleService.write("Количество правильных ответов: " + count + " из " + questions.size()); + consoleService.write(c_delimeter); } } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java index c2c08b3..96beeeb 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java @@ -14,5 +14,5 @@ public interface QuestionsDAO { - List getQuestions(String csvFilename) throws QuestionsFileLoadingException; + List getQuestions() throws QuestionsFileLoadingException; } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 1d17687..8eed393 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,6 +3,7 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; @@ -22,8 +23,15 @@ @Repository public class QuestionsDAOImpl implements QuestionsDAO { + private String csvFilename; + + public QuestionsDAOImpl(@Value("${questions.file.name}") String csvFilename) { + this.csvFilename = csvFilename; + } + @SuppressWarnings({"rawtypes", "unchecked"}) - private List loadFile(String csvFilename) throws QuestionsFileLoadingException { + @Override + public List getQuestions() throws QuestionsFileLoadingException { if (csvFilename == null) { throw new QuestionsFileLoadingException("Имя файла не может быть null!"); } @@ -47,7 +55,7 @@ private List loadFile(String csvFilename) throws QuestionsFileLoadingE } catch (URISyntaxException e) { throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); } catch (UnsupportedEncodingException e) { - e.printStackTrace(); + throw new QuestionsFileLoadingException("Ошибка кодировки файла!", e); } return questions; } @@ -60,9 +68,4 @@ private ColumnPositionMappingStrategy setColumMapping() { strategy.setColumnMapping(columns); return strategy; } - - @Override - public List getQuestions(String csvFilename) throws QuestionsFileLoadingException { - return loadFile(csvFilename); - } } diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java index 8b6d68e..8e0d4e1 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java @@ -1,7 +1,5 @@ package ru.otus.mkulikov.services.registration; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -11,5 +9,5 @@ public interface RegistrationService { - void addNewUser() throws QuestionsFileLoadingException; + void addNewUser(); } diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index 8fd3832..6523974 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -2,11 +2,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.User; -import ru.otus.mkulikov.services.console.ConsoleService; - -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; +import ru.otus.mkulikov.services.console.IOService; /** * Created by IntelliJ IDEA. @@ -18,30 +15,23 @@ @Service public class RegistrationServiceImpl implements RegistrationService { - private final ConsoleService consoleService; + private final IOService consoleService; @Autowired - public RegistrationServiceImpl(ConsoleService consoleService) { + public RegistrationServiceImpl(IOService consoleService) { this.consoleService = consoleService; } @Override - public void addNewUser() throws QuestionsFileLoadingException { - getConsoleService().write("Введите свои данные"); - getConsoleService().write("Фамилия: "); - String surname = getConsoleService().read(); + public void addNewUser() { + consoleService.write("Введите свои данные"); + consoleService.write("Фамилия: "); + String surname = consoleService.read(); - getConsoleService().write("Имя: "); - String name = getConsoleService().read(); + consoleService.write("Имя: "); + String name = consoleService.read(); User user = new User(name, surname); - getConsoleService().write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName())); - } - - public ConsoleService getConsoleService() throws QuestionsFileLoadingException { - if (consoleService == null) { - throw new QuestionsFileLoadingException(c_error_load_consoleService); - } - return consoleService; + consoleService.write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName())); } } diff --git a/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java b/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java deleted file mode 100644 index 3b40a89..0000000 --- a/src/test/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingExceptionTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package ru.otus.mkulikov.exceptions; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 11:39 - */ - -@DisplayName("Класс исключения QuestionsFileLoadingException") -class QuestionsFileLoadingExceptionTest { - - private final String c_not_supperted = "Not supported"; - - @Test - @DisplayName("Корректное заполнение исключения") - void shouldThrowException() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - throw new QuestionsFileLoadingException(c_not_supperted); - }); - assertEquals(c_not_supperted, exception.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java index fd315d2..f4f2074 100644 --- a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java +++ b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java @@ -1,10 +1,10 @@ package ru.otus.mkulikov.model; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import ru.otus.mkulikov.models.Question; +import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; /** @@ -26,66 +26,22 @@ class QuestionTest { private final String c_answer3 = "Answer3"; private final String c_answer4 = "Answer4"; - private Question question; - - @BeforeEach - public void createModelQuestion() { - question = new Question(); - question.setId(c_id); - question.setQuestion(c_question); - question.setUserAnswer(c_userAnswer); - question.setTrueAnswer(c_trueAnswer); - question.setAnswer1(c_answer1); - question.setAnswer2(c_answer2); - question.setAnswer3(c_answer3); - question.setAnswer4(c_answer4); - } - - @Test - @DisplayName("Корректное заполнение id") - public void fillIdTest() { - assertEquals(c_id, question.getId()); - } - @Test - @DisplayName("Корректное заполнение question") + @DisplayName("Корректное заполнение") public void fillQuestionTest() { - assertEquals(c_question, question.getQuestion()); - } - - @Test - @DisplayName("Корректное заполнение userAnswer") - public void fillUserAnsweTest() { - assertEquals(c_userAnswer, question.getUserAnswer()); - } - - @Test - @DisplayName("Корректное заполнение trueAnswer") - public void fillTrueAnsweTest() { - assertEquals(c_trueAnswer, question.getTrueAnswer()); - } - - @Test - @DisplayName("Корректное заполнение answer1") - public void fillAnswer1AnsweTest() { - assertEquals(c_answer1, question.getAnswer1()); - } - - @Test - @DisplayName("Корректное заполнение answer2") - public void fillAnswer2AnsweTest() { - assertEquals(c_answer2, question.getAnswer2()); - } - - @Test - @DisplayName("Корректное заполнение answer3") - public void fillAnswer3AnsweTest() { - assertEquals(c_answer3, question.getAnswer3()); - } - - @Test - @DisplayName("Корректное заполнение answer4") - public void fillAnswer4AnsweTest() { - assertEquals(c_answer4, question.getAnswer4()); + Question question = new Question( + c_id, c_question, c_answer1, c_answer2, c_answer3, c_answer4, c_trueAnswer, c_userAnswer + ); + + assertAll("question", + () -> assertEquals(c_id, question.getId()), + () -> assertEquals(c_question, question.getQuestion()), + () -> assertEquals(c_userAnswer, question.getUserAnswer()), + () -> assertEquals(c_trueAnswer, question.getTrueAnswer()), + () -> assertEquals(c_answer1, question.getAnswer1()), + () -> assertEquals(c_answer2, question.getAnswer2()), + () -> assertEquals(c_answer3, question.getAnswer3()), + () -> assertEquals(c_answer4, question.getAnswer4()) + ); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java b/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java deleted file mode 100644 index 2928f53..0000000 --- a/src/test/java/ru/otus/mkulikov/processor/ProcessorServiceImplTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package ru.otus.mkulikov.processor; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.processor.ProcessorServiceImpl; - -import static org.junit.jupiter.api.Assertions.*; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_registrationService; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 11:37 - */ - -@DisplayName("Класс ProcessorServiceImpl") -class ProcessorServiceImplTest { - - private final ProcessorServiceImpl processorServiceNull = new ProcessorServiceImpl(null, null); - - @Test - @DisplayName("Корректный тип исключения для getQuestionsProcess") - void getExceptionTypeQuestionsProcessTest() { - assertThrows(QuestionsFileLoadingException.class, () -> { - processorServiceNull.getQuestionsService(); - }); - } - - @Test - @DisplayName("Корректное исключение для getQuestionsProcess") - void getExceptionQuestionsProcessTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - processorServiceNull.getQuestionsService(); - }); - assertEquals(c_error_load_questionsService, exception.getMessage()); - } - - @Test - @DisplayName("Корректный тип исключения для getRegistrationTest") - void getExceptionTypeRegistrationTest() { - assertThrows(QuestionsFileLoadingException.class, () -> { - processorServiceNull.getRegistration(); - }); - } - - @Test - @DisplayName("Корректное исключение для getRegistrationTest") - void getExceptionRegistrationTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - processorServiceNull.getRegistration(); - }); - assertEquals(c_error_load_registrationService, exception.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index b6d0826..104b80a 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -14,10 +14,7 @@ @DisplayName("Класс QuestionsDAO") class QuestionsDAOTest { - private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(); - - private final String c_questionsFileName = "test_questions.csv"; - private final String c_questionsBadFileName = "test.csv"; + private final QuestionsDAO questionsDAO = new QuestionsDAOImpl("test_questions.csv"); private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; @@ -26,7 +23,7 @@ class QuestionsDAOTest { @Test @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() throws QuestionsFileLoadingException { - List questions = questionsDAO.getQuestions(c_questionsFileName); + List questions = questionsDAO.getQuestions(); assertAll("questions", () -> assertNotNull(questions), @@ -36,22 +33,4 @@ public void loadQuestionsTest() throws QuestionsFileLoadingException { () -> assertEquals(c_test3, questions.get(2).getQuestion()) ); } - - @Test - @DisplayName("Корректное исключение на null") - public void loadNullExceptionQuestionsTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - questionsDAO.getQuestions(null); - }); - assertEquals("Имя файла не может быть null!", exception.getMessage()); - } - - @Test - @DisplayName("Корректное исключение на неверное имя файла") - public void loadExceptionQuestionsTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - questionsDAO.getQuestions(c_questionsBadFileName); - }); - assertEquals(String.format("Ошибка загрузки ресурса с именем %s!", c_questionsBadFileName), exception.getMessage()); - } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java deleted file mode 100644 index 2935fc0..0000000 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsServiceImplTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package ru.otus.mkulikov.questions; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.questions.QuestionsServiceImpl; - -import static org.junit.jupiter.api.Assertions.*; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_questionsDAO; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 12:00 - */ - -@DisplayName("Класс QuestionsServiceImpl") -class QuestionsServiceImplTest { - - private final QuestionsServiceImpl questionsService = new QuestionsServiceImpl(null, null); - - @Test - @DisplayName("Корректный тип исключения для getQuestionsDAO") - void getExceptionTypeQuestionsDAO() { - assertThrows(QuestionsFileLoadingException.class, () -> { - questionsService.getQuestionsDAO(); - }); - } - - @Test - @DisplayName("Корректное исключение для getQuestionsDAO") - void getExceptionQuestionsDAO() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - questionsService.getQuestionsDAO(); - }); - assertEquals(c_error_load_questionsDAO, exception.getMessage()); - } - - @Test - @DisplayName("Корректный тип исключения для getConsoleService") - void getExceptionTypeConsoleService() { - assertThrows(QuestionsFileLoadingException.class, () -> { - questionsService.getConsoleService(); - }); - } - - @Test - @DisplayName("Корректное исключение для getConsoleService") - void getExceptionConsoleService() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - questionsService.getConsoleService(); - }); - assertEquals(c_error_load_consoleService, exception.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java deleted file mode 100644 index 0252a9d..0000000 --- a/src/test/java/ru/otus/mkulikov/registration/RegistrationServiceImplTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package ru.otus.mkulikov.registration; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.registration.RegistrationServiceImpl; - -import static org.junit.jupiter.api.Assertions.*; -import static ru.otus.mkulikov.constants.StringConstants.c_error_load_consoleService; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 13:02 - */ - -@DisplayName("Класс RegistrationServiceImpl") -class RegistrationServiceImplTest { - - private final RegistrationServiceImpl registrationService = new RegistrationServiceImpl(null); - - @Test - @DisplayName("Корректный тип исключения для getConsoleService") - void getExceptionTypeConsoleServiceTest() { - assertThrows(QuestionsFileLoadingException.class, () -> { - registrationService.getConsoleService(); - }); - } - - @Test - @DisplayName("Корректное исключение для getQuestionsDAO") - void getExceptionConsoleServiceTest() { - Throwable exception = assertThrows(QuestionsFileLoadingException.class, () -> { - registrationService.getConsoleService(); - }); - assertEquals(c_error_load_consoleService, exception.getMessage()); - } -} \ No newline at end of file From c27da6c1d37b39c50995a0f44b9f3ec1f3374655 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Thu, 21 Mar 2019 16:10:09 +0300 Subject: [PATCH 11/25] =?UTF-8?q?-=20=D0=9B=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20=D0=B8=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9.=20-=20=D0=A4?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA.=20-=20Java=20+=20Annotation-based=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/Application.java | 2 +- .../localisation/LocalisationService.java | 15 +++++++ .../localisation/LocalisationServiceImpl.java | 43 +++++++++++++++++++ .../questions/QuestionsServiceImpl.java | 19 +++++--- .../questions/dao/QuestionsDAOImpl.java | 23 +++++----- .../registration/RegistrationServiceImpl.java | 15 ++++--- src/main/resources/application.properties | 3 ++ src/main/resources/config.properties | 1 - src/main/resources/i18n/bundle_en.properties | 12 ++++++ src/main/resources/i18n/bundle_ru.properties | 12 ++++++ src/main/resources/questions/en.csv | 5 +++ .../{questions.csv => questions/ru.csv} | 0 .../mkulikov/questions/QuestionsDAOTest.java | 4 +- .../{test_questions.csv => questions/ru.csv} | 0 14 files changed, 129 insertions(+), 25 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java create mode 100644 src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java create mode 100644 src/main/resources/application.properties delete mode 100644 src/main/resources/config.properties create mode 100644 src/main/resources/i18n/bundle_en.properties create mode 100644 src/main/resources/i18n/bundle_ru.properties create mode 100644 src/main/resources/questions/en.csv rename src/main/resources/{questions.csv => questions/ru.csv} (100%) rename src/test/resources/{test_questions.csv => questions/ru.csv} (100%) diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 44ec99d..3f6ee5d 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -16,7 +16,7 @@ @Configuration @ComponentScan -@PropertySource("classpath:config.properties") +@PropertySource("classpath:application.properties") public class Application { public static void main(String[] args) { diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java new file mode 100644 index 0000000..fa1f7fe --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.services.localisation; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-21 + * Time: 14:02 + */ + +public interface LocalisationService { + + String getValue(String key); + + String getValueWithParams(String key, String[] params); +} diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java new file mode 100644 index 0000000..9c9d4ff --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java @@ -0,0 +1,43 @@ +package ru.otus.mkulikov.services.localisation; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.support.ReloadableResourceBundleMessageSource; +import org.springframework.stereotype.Service; + +import java.util.Locale; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-21 + * Time: 14:02 + */ + +@Service +public class LocalisationServiceImpl extends ReloadableResourceBundleMessageSource implements LocalisationService { + + private final Locale locale; + public static final Locale RUSSIAN = new Locale("ru"); + + public LocalisationServiceImpl( + @Value("${locale.basename}") String basename, + @Value("${locale.default.encoding}") String defaultEncoding, + @Value("${locale.default}") String localeDefault + ) { + super(); + setBasename(basename); + setDefaultEncoding(defaultEncoding); + + locale = (localeDefault != null) + ? new Locale(localeDefault) + : RUSSIAN; + } + + public String getValue(String key) { + return getMessage(key, null, locale); + } + + public String getValueWithParams(String key, String[] params) { + return getMessage(key, params, locale); + } +} diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index e5eed5a..040357c 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -5,6 +5,7 @@ import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.console.IOService; +import ru.otus.mkulikov.services.localisation.LocalisationService; import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import java.util.List; @@ -24,11 +25,13 @@ public class QuestionsServiceImpl implements QuestionsService { private final QuestionsDAO questionsDAO; private final IOService consoleService; + private final LocalisationService localisationService; @Autowired - public QuestionsServiceImpl(QuestionsDAO questionsDAO, IOService consoleService) { + public QuestionsServiceImpl(QuestionsDAO questionsDAO, IOService consoleService, LocalisationService localisationService) { this.questionsDAO = questionsDAO; this.consoleService = consoleService; + this.localisationService = localisationService; } @Override @@ -36,10 +39,6 @@ public void showQuestions() throws QuestionsFileLoadingException { consoleService.write(c_delimeter); List questions = questionsDAO.getQuestions(); - if (questions == null) { - throw new QuestionsFileLoadingException("Список вопросов пуст!"); - } - for (Question question : questions) { consoleService.write(question.getQuestion()); consoleService.write(question.getAnswer1()); @@ -51,7 +50,7 @@ public void showQuestions() throws QuestionsFileLoadingException { boolean okAnswer = false; int i = 0; while (!okAnswer && i < 4) { - System.out.println("Введите номер ответа: "); + consoleService.write(localisationService.getValue("enter.answer")); answer = consoleService.read(); okAnswer = c_answerNumbers.contains(answer); i++; @@ -64,7 +63,13 @@ public void showQuestions() throws QuestionsFileLoadingException { long count = questions.stream() .filter(obj -> obj.getTrueAnswer().equals(obj.getUserAnswer())) .count(); - consoleService.write("Количество правильных ответов: " + count + " из " + questions.size()); + + consoleService.write( + localisationService.getValueWithParams( + "count.true.answers", + new String[] {String.valueOf(count), String.valueOf(questions.size())} + ) + ); consoleService.write(c_delimeter); } } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 8eed393..8e38157 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,14 +3,15 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.services.localisation.LocalisationService; import java.io.*; import java.net.URISyntaxException; import java.net.URL; +import java.util.ArrayList; import java.util.List; /** @@ -23,25 +24,27 @@ @Repository public class QuestionsDAOImpl implements QuestionsDAO { - private String csvFilename; + private final LocalisationService localisationService; - public QuestionsDAOImpl(@Value("${questions.file.name}") String csvFilename) { - this.csvFilename = csvFilename; + public QuestionsDAOImpl(LocalisationService localisationService) { + this.localisationService = localisationService; } @SuppressWarnings({"rawtypes", "unchecked"}) @Override public List getQuestions() throws QuestionsFileLoadingException { + String csvFilename = localisationService.getValue("csv.file.name"); + if (csvFilename == null) { - throw new QuestionsFileLoadingException("Имя файла не может быть null!"); + throw new QuestionsFileLoadingException(localisationService.getValue("questions.load.null.filename")); } - List questions = null; + List questions = new ArrayList(); try { URL url = getClass().getResource("/" + csvFilename); if (url == null) { throw new QuestionsFileLoadingException( - String.format("Ошибка загрузки ресурса с именем %s!", csvFilename) + localisationService.getValueWithParams("questions.load.error.filename", new String[] {csvFilename}) ); } @@ -51,11 +54,11 @@ public List getQuestions() throws QuestionsFileLoadingException { questions = csv.parse(setColumMapping(), csvReader); } catch (FileNotFoundException e) { - throw new QuestionsFileLoadingException("Файл с именем " + csvFilename + " не найден!", e); + throw new QuestionsFileLoadingException(localisationService.getValueWithParams("questions.find.error.filename", new String[] {csvFilename}), e); } catch (URISyntaxException e) { - throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); + throw new QuestionsFileLoadingException(localisationService.getValue("questions.read.error"), e); } catch (UnsupportedEncodingException e) { - throw new QuestionsFileLoadingException("Ошибка кодировки файла!", e); + throw new QuestionsFileLoadingException(localisationService.getValue("questions.encoding.error"), e); } return questions; } diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index 6523974..08c64a0 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Service; import ru.otus.mkulikov.models.User; import ru.otus.mkulikov.services.console.IOService; +import ru.otus.mkulikov.services.localisation.LocalisationService; /** * Created by IntelliJ IDEA. @@ -16,22 +17,26 @@ public class RegistrationServiceImpl implements RegistrationService { private final IOService consoleService; + private final LocalisationService localisationService; @Autowired - public RegistrationServiceImpl(IOService consoleService) { + public RegistrationServiceImpl(IOService consoleService, LocalisationService localisationService) { this.consoleService = consoleService; + this.localisationService = localisationService; } @Override public void addNewUser() { - consoleService.write("Введите свои данные"); - consoleService.write("Фамилия: "); + consoleService.write(localisationService.getValue("enter.your.data")); + consoleService.write(localisationService.getValue("enter.your.surname")); String surname = consoleService.read(); - consoleService.write("Имя: "); + consoleService.write(localisationService.getValue("enter.your.name")); String name = consoleService.read(); User user = new User(name, surname); - consoleService.write(String.format("Здравствуйте, %s %s!", user.getSurname(), user.getName())); + consoleService.write( + localisationService.getValueWithParams("hello.user", new String[] {user.getName(), user.getSurname()}) + ); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..f676796 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +locale.basename=/i18n/bundle +locale.default.encoding=UTF-8 +locale.default=ru \ No newline at end of file diff --git a/src/main/resources/config.properties b/src/main/resources/config.properties deleted file mode 100644 index 4e513dc..0000000 --- a/src/main/resources/config.properties +++ /dev/null @@ -1 +0,0 @@ -questions.file.name=questions.csv \ No newline at end of file diff --git a/src/main/resources/i18n/bundle_en.properties b/src/main/resources/i18n/bundle_en.properties new file mode 100644 index 0000000..be4e3ea --- /dev/null +++ b/src/main/resources/i18n/bundle_en.properties @@ -0,0 +1,12 @@ +count.true.answers=Number of correct answers: {0} of {1} +csv.file.name=questions/en.csv +enter.answer=Enter answer number: +enter.your.data=Enter your data +enter.your.name=Name: +enter.your.surname=Surname: +hello.user=Hello, {0} {1}! +questions.encoding.error=File encoding error! +questions.find.error.filename=File named {0} not found! +questions.load.error.filename=Error loading file named {0}! +questions.load.null.filename=The file name cannot be null! +questions.read.error=File read error! \ No newline at end of file diff --git a/src/main/resources/i18n/bundle_ru.properties b/src/main/resources/i18n/bundle_ru.properties new file mode 100644 index 0000000..5ab475f --- /dev/null +++ b/src/main/resources/i18n/bundle_ru.properties @@ -0,0 +1,12 @@ +count.true.answers=Количество правильных ответов: {0} из {1} +csv.file.name=questions/ru.csv +enter.answer=Введите номер ответа: +enter.your.data=Введите свои данные +enter.your.name=Имя: +enter.your.surname=Фамилия: +hello.user=Здравствуйте, {0} {1}! +questions.encoding.error=Ошибка кодировки файла! +questions.find.error.filename=Файл с именем {0} не найден! +questions.load.error.filename=Ошибка загрузки файла с именем {0}! +questions.load.null.filename=Имя файла не может быть null! +questions.read.error=Ошибка чтения файла! \ No newline at end of file diff --git a/src/main/resources/questions/en.csv b/src/main/resources/questions/en.csv new file mode 100644 index 0000000..4d91327 --- /dev/null +++ b/src/main/resources/questions/en.csv @@ -0,0 +1,5 @@ +1,Which list is not a design pattern?,1. Facade,2. Object,3. Factory,4. Singleton,2 +2,Which type is not primitive?,1. String,2. int,3. char,4. boolean,1 +3,How many classes can be inherited in Java?,1. One,2. Two,3. Three,4. Four,1 +4,Which collection contains unique objects?,1. List,2. Map,3. Set,4. Queue,3 +5,What value cannot be put in the primitive type - int?,1. -1,2. 0,3. 10,4. null,4 \ No newline at end of file diff --git a/src/main/resources/questions.csv b/src/main/resources/questions/ru.csv similarity index 100% rename from src/main/resources/questions.csv rename to src/main/resources/questions/ru.csv diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 104b80a..adb2665 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.services.localisation.LocalisationServiceImpl; import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; @@ -14,7 +15,8 @@ @DisplayName("Класс QuestionsDAO") class QuestionsDAOTest { - private final QuestionsDAO questionsDAO = new QuestionsDAOImpl("test_questions.csv"); + private final LocalisationServiceImpl localisationService = new LocalisationServiceImpl("/i18n/bundle", "UTF-8", "ru"); + private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService); private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; diff --git a/src/test/resources/test_questions.csv b/src/test/resources/questions/ru.csv similarity index 100% rename from src/test/resources/test_questions.csv rename to src/test/resources/questions/ru.csv From d1ca11a3067ba6bd76bf54e2082d4f8f9a90295c Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 22 Mar 2019 01:27:24 +0300 Subject: [PATCH 12/25] =?UTF-8?q?-=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D1=8B.=20-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=BC.=20-=20=D0=98=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20@Data?= =?UTF-8?q?=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20@Getter,=20@Setter.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 ++- .../ru/otus/mkulikov/models/Question.java | 20 +------- .../java/ru/otus/mkulikov/models/User.java | 8 +--- .../questions/QuestionsServiceImpl.java | 2 +- .../questions/dao/QuestionsDAOImpl.java | 45 ++++++++---------- src/main/resources/application.properties | 4 +- src/main/resources/i18n/bundle_en.properties | 7 ++- src/main/resources/i18n/bundle_ru.properties | 7 ++- .../ru/otus/mkulikov/model/QuestionTest.java | 47 ------------------- .../java/ru/otus/mkulikov/model/UserTest.java | 34 -------------- .../mkulikov/questions/QuestionsDAOTest.java | 2 +- 11 files changed, 40 insertions(+), 143 deletions(-) delete mode 100644 src/test/java/ru/otus/mkulikov/model/QuestionTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/model/UserTest.java diff --git a/README.md b/README.md index 33f056a..2af3090 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ # OtusSpringHW -### Домашнее задание #2: +Домашнее задание #2: - Добавить файл настроек в приложение и для тестирования. - Локализовать выводимые сообщения и вопросы теста. - Переписать конфигурацию в виде Java + Annotation-based конфигурации. + +### 19-03-22 Доработки: +- Убраны лишние тесты. +- Изменена работа с файлом. +- Использование @Data вместо @Getter, @Setter. diff --git a/src/main/java/ru/otus/mkulikov/models/Question.java b/src/main/java/ru/otus/mkulikov/models/Question.java index 03f8256..e148602 100644 --- a/src/main/java/ru/otus/mkulikov/models/Question.java +++ b/src/main/java/ru/otus/mkulikov/models/Question.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.models; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import java.io.Serializable; @@ -12,31 +11,16 @@ * Time: 15:54 */ +@Data public class Question implements Serializable { - @Setter - @Getter private String id; - @Setter - @Getter private String question; - @Setter - @Getter private String answer1; - @Setter - @Getter private String answer2; - @Setter - @Getter private String answer3; - @Setter - @Getter private String answer4; - @Setter - @Getter private String trueAnswer; - @Setter - @Getter private String userAnswer; public Question(String id, String question, String answer1, String answer2, String answer3, String answer4, String trueAnswer, String userAnswer) { diff --git a/src/main/java/ru/otus/mkulikov/models/User.java b/src/main/java/ru/otus/mkulikov/models/User.java index 58c18f8..52a10f1 100644 --- a/src/main/java/ru/otus/mkulikov/models/User.java +++ b/src/main/java/ru/otus/mkulikov/models/User.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.models; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; /** * Created by IntelliJ IDEA. @@ -10,13 +9,10 @@ * Time: 15:29 */ +@Data public class User { - @Setter - @Getter private final String name; - @Setter - @Getter private final String surname; public User(String name, String surname) { diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index 040357c..672ff7e 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -52,7 +52,7 @@ public void showQuestions() throws QuestionsFileLoadingException { while (!okAnswer && i < 4) { consoleService.write(localisationService.getValue("enter.answer")); answer = consoleService.read(); - okAnswer = c_answerNumbers.contains(answer); + okAnswer = c_answerNumbers.contains(answer) && !answer.isEmpty(); i++; } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index 8e38157..eb09c51 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,15 +3,17 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.localisation.LocalisationService; -import java.io.*; -import java.net.URISyntaxException; -import java.net.URL; -import java.util.ArrayList; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.util.List; /** @@ -25,40 +27,31 @@ public class QuestionsDAOImpl implements QuestionsDAO { private final LocalisationService localisationService; + private final String defaultFileDir; - public QuestionsDAOImpl(LocalisationService localisationService) { + public QuestionsDAOImpl( + LocalisationService localisationService, + @Value("${questions.default.dir}") String defaultFileDir + ) { this.localisationService = localisationService; + this.defaultFileDir = defaultFileDir; } @SuppressWarnings({"rawtypes", "unchecked"}) @Override public List getQuestions() throws QuestionsFileLoadingException { - String csvFilename = localisationService.getValue("csv.file.name"); - - if (csvFilename == null) { - throw new QuestionsFileLoadingException(localisationService.getValue("questions.load.null.filename")); - } - - List questions = new ArrayList(); + String csvFilename = defaultFileDir + "/" + localisationService.getValue("csv.file.name"); + List questions; try { - URL url = getClass().getResource("/" + csvFilename); - if (url == null) { - throw new QuestionsFileLoadingException( - localisationService.getValueWithParams("questions.load.error.filename", new String[] {csvFilename}) - ); - } - - File file = new File(url.toURI()); - CSVReader csvReader=new CSVReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); - CsvToBean csv = new CsvToBean(); - - questions = csv.parse(setColumMapping(), csvReader); + ClassPathResource resource = new ClassPathResource(csvFilename); + CSVReader csvReader = new CSVReader(new InputStreamReader(resource.getInputStream(), "UTF-8")); + questions = new CsvToBean().parse(setColumMapping(), csvReader); } catch (FileNotFoundException e) { throw new QuestionsFileLoadingException(localisationService.getValueWithParams("questions.find.error.filename", new String[] {csvFilename}), e); - } catch (URISyntaxException e) { - throw new QuestionsFileLoadingException(localisationService.getValue("questions.read.error"), e); } catch (UnsupportedEncodingException e) { throw new QuestionsFileLoadingException(localisationService.getValue("questions.encoding.error"), e); + } catch (IOException e) { + throw new QuestionsFileLoadingException(localisationService.getValue("questions.io.error"), e); } return questions; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f676796..c6450d1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,5 @@ locale.basename=/i18n/bundle locale.default.encoding=UTF-8 -locale.default=ru \ No newline at end of file +locale.default=ru + +questions.default.dir=/questions \ No newline at end of file diff --git a/src/main/resources/i18n/bundle_en.properties b/src/main/resources/i18n/bundle_en.properties index be4e3ea..9907680 100644 --- a/src/main/resources/i18n/bundle_en.properties +++ b/src/main/resources/i18n/bundle_en.properties @@ -1,5 +1,4 @@ count.true.answers=Number of correct answers: {0} of {1} -csv.file.name=questions/en.csv enter.answer=Enter answer number: enter.your.data=Enter your data enter.your.name=Name: @@ -7,6 +6,6 @@ enter.your.surname=Surname: hello.user=Hello, {0} {1}! questions.encoding.error=File encoding error! questions.find.error.filename=File named {0} not found! -questions.load.error.filename=Error loading file named {0}! -questions.load.null.filename=The file name cannot be null! -questions.read.error=File read error! \ No newline at end of file +questions.io.error=Error I/O when working with a file! + +csv.file.name=en.csv diff --git a/src/main/resources/i18n/bundle_ru.properties b/src/main/resources/i18n/bundle_ru.properties index 5ab475f..5ff9c0a 100644 --- a/src/main/resources/i18n/bundle_ru.properties +++ b/src/main/resources/i18n/bundle_ru.properties @@ -1,5 +1,4 @@ count.true.answers=Количество правильных ответов: {0} из {1} -csv.file.name=questions/ru.csv enter.answer=Введите номер ответа: enter.your.data=Введите свои данные enter.your.name=Имя: @@ -7,6 +6,6 @@ enter.your.surname=Фамилия: hello.user=Здравствуйте, {0} {1}! questions.encoding.error=Ошибка кодировки файла! questions.find.error.filename=Файл с именем {0} не найден! -questions.load.error.filename=Ошибка загрузки файла с именем {0}! -questions.load.null.filename=Имя файла не может быть null! -questions.read.error=Ошибка чтения файла! \ No newline at end of file +questions.io.error=Ошибка ввода/вывода при работе с файлом! + +csv.file.name=ru.csv diff --git a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java b/src/test/java/ru/otus/mkulikov/model/QuestionTest.java deleted file mode 100644 index f4f2074..0000000 --- a/src/test/java/ru/otus/mkulikov/model/QuestionTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.otus.mkulikov.model; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.models.Question; - -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 11:13 - */ - -@DisplayName("Класс Question") -class QuestionTest { - - private final String c_id = "1"; - private final String c_question = "Question"; - private final String c_userAnswer = "UserAnswer"; - private final String c_trueAnswer = "TrueAnswer"; - private final String c_answer1 = "Answer1"; - private final String c_answer2 = "Answer2"; - private final String c_answer3 = "Answer3"; - private final String c_answer4 = "Answer4"; - - @Test - @DisplayName("Корректное заполнение") - public void fillQuestionTest() { - Question question = new Question( - c_id, c_question, c_answer1, c_answer2, c_answer3, c_answer4, c_trueAnswer, c_userAnswer - ); - - assertAll("question", - () -> assertEquals(c_id, question.getId()), - () -> assertEquals(c_question, question.getQuestion()), - () -> assertEquals(c_userAnswer, question.getUserAnswer()), - () -> assertEquals(c_trueAnswer, question.getTrueAnswer()), - () -> assertEquals(c_answer1, question.getAnswer1()), - () -> assertEquals(c_answer2, question.getAnswer2()), - () -> assertEquals(c_answer3, question.getAnswer3()), - () -> assertEquals(c_answer4, question.getAnswer4()) - ); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/model/UserTest.java b/src/test/java/ru/otus/mkulikov/model/UserTest.java deleted file mode 100644 index b1982fe..0000000 --- a/src/test/java/ru/otus/mkulikov/model/UserTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package ru.otus.mkulikov.model; - -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import ru.otus.mkulikov.models.User; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 2019-03-18 - * Time: 10:57 - */ - -@DisplayName("Класс User") -class UserTest { - - private final String c_userName = "Name"; - private final String c_userSurname = "Surname"; - - @Test - @DisplayName("Корректное создание") - public void createUserTest() { - User user = new User(c_userName, c_userSurname); - assertAll("user", - () -> assertEquals(c_userName, user.getName()), - () -> assertEquals(c_userSurname, user.getSurname()) - ); - - Assertions.assertThat(user).hasFieldOrPropertyWithValue("name", c_userName); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index adb2665..0b384fc 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -16,7 +16,7 @@ class QuestionsDAOTest { private final LocalisationServiceImpl localisationService = new LocalisationServiceImpl("/i18n/bundle", "UTF-8", "ru"); - private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService); + private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService, "/questions"); private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; From 00bc9bddf668cfe0163356f5e2baa548f1240611 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 22 Mar 2019 01:44:28 +0300 Subject: [PATCH 13/25] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/localisation/LocalisationServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java index 9c9d4ff..2af1b75 100644 --- a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java @@ -17,7 +17,7 @@ public class LocalisationServiceImpl extends ReloadableResourceBundleMessageSource implements LocalisationService { private final Locale locale; - public static final Locale RUSSIAN = new Locale("ru"); + private final Locale russian = new Locale("ru"); public LocalisationServiceImpl( @Value("${locale.basename}") String basename, @@ -30,7 +30,7 @@ public LocalisationServiceImpl( locale = (localeDefault != null) ? new Locale(localeDefault) - : RUSSIAN; + : russian; } public String getValue(String key) { From e2ba5e0da661fda21d718ff0757a2312e6135fe5 Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Fri, 22 Mar 2019 15:30:28 +0300 Subject: [PATCH 14/25] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 8 ++ .../mkulikov/questions/QuestionsDAOTest.java | 31 ++++++- .../LocalisationServiceImplTest.java | 89 +++++++++++++++++++ .../resources/locale/bundle_en.properties | 14 +++ .../resources/locale/bundle_ru.properties | 14 +++ src/test/resources/test.properties | 6 ++ 6 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java create mode 100644 src/test/resources/locale/bundle_en.properties create mode 100644 src/test/resources/locale/bundle_ru.properties create mode 100644 src/test/resources/test.properties diff --git a/pom.xml b/pom.xml index bbb1616..ae8c2f6 100644 --- a/pom.xml +++ b/pom.xml @@ -83,6 +83,14 @@ 1.18.4 provided + + + + org.mockito + mockito-all + 1.10.19 + test + diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 0b384fc..4e0bd8e 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -1,7 +1,14 @@ package ru.otus.mkulikov.questions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.otus.mkulikov.Application; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.localisation.LocalisationServiceImpl; @@ -13,15 +20,35 @@ import static org.junit.jupiter.api.Assertions.*; @DisplayName("Класс QuestionsDAO") +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = Application.class) +@TestPropertySource("/test.properties") class QuestionsDAOTest { - private final LocalisationServiceImpl localisationService = new LocalisationServiceImpl("/i18n/bundle", "UTF-8", "ru"); - private final QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService, "/questions"); + private LocalisationServiceImpl localisationService; + private QuestionsDAO questionsDAO; + + @Value("${test.basename}") + private String folder; + @Value("${test.default.encoding}") + private String encoding; + @Value("${test.default.ru}") + private String ru; + @Value("${test.default.en}") + private String en; + @Value("${test.question.folder}") + private String questionFolder; private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; private final String c_test3 = "Тест3"; + @BeforeEach + void init() { + localisationService = new LocalisationServiceImpl(folder, encoding, ru); + questionsDAO = new QuestionsDAOImpl(localisationService, questionFolder); + } + @Test @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() throws QuestionsFileLoadingException { diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java new file mode 100644 index 0000000..1b9b76e --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java @@ -0,0 +1,89 @@ +package ru.otus.mkulikov.services.localisation; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.otus.mkulikov.Application; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-22 + * Time: 13:58 + */ + +@DisplayName("Класс LocalisationServiceImpl") +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = Application.class) +@TestPropertySource("/test.properties") +class LocalisationServiceImplTest { + + @Value("${test.basename}") + private String folder; + @Value("${test.default.encoding}") + private String encoding; + @Value("${test.default.ru}") + private String ru; + @Value("${test.default.en}") + private String en; + + private LocalisationService ruLocale; + private LocalisationService enLocale; + + @BeforeEach + void init() { + ruLocale = new LocalisationServiceImpl(folder, encoding, ru); + enLocale = new LocalisationServiceImpl(folder, encoding, en); + } + + @Test + @DisplayName("Проверка получения значения ru локали") + void getValueRuTest() { + String value = ruLocale.getValue("test.key"); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("тест123", value) + ); + } + + @Test + @DisplayName("Проверка получения значения en локали") + void getValueEnTest() { + String value = enLocale.getValue("test.key"); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("test123", value) + ); + } + + @Test + @DisplayName("Проверка получения значения ru локали с параметром") + void getValueRuWithParamsTest() { + String value = ruLocale.getValueWithParams("test.key.params", new String[]{"При", "вет"}); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("При и вет - Привет", value) + ); + } + + @Test + @DisplayName("Проверка получения значения en локали с параметром") + void getValueEnWithParamsTest() { + String value = enLocale.getValueWithParams("test.key.params", new String[]{"Hel", "lo"}); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("Hel & lo - Hello", value) + ); + } +} \ No newline at end of file diff --git a/src/test/resources/locale/bundle_en.properties b/src/test/resources/locale/bundle_en.properties new file mode 100644 index 0000000..4c04204 --- /dev/null +++ b/src/test/resources/locale/bundle_en.properties @@ -0,0 +1,14 @@ +count.true.answers=Number of correct answers: {0} of {1} +enter.answer=Enter answer number: +enter.your.data=Enter your data +enter.your.name=Name: +enter.your.surname=Surname: +hello.user=Hello, {0} {1}! +questions.encoding.error=File encoding error! +questions.find.error.filename=File named {0} not found! +questions.io.error=Error I/O when working with a file! + +csv.file.name=en.csv + +test.key=test123 +test.key.params={0} & {1} - Hello \ No newline at end of file diff --git a/src/test/resources/locale/bundle_ru.properties b/src/test/resources/locale/bundle_ru.properties new file mode 100644 index 0000000..2fc5bc9 --- /dev/null +++ b/src/test/resources/locale/bundle_ru.properties @@ -0,0 +1,14 @@ +count.true.answers=Количество правильных ответов: {0} из {1} +enter.answer=Введите номер ответа: +enter.your.data=Введите свои данные +enter.your.name=Имя: +enter.your.surname=Фамилия: +hello.user=Здравствуйте, {0} {1}! +questions.encoding.error=Ошибка кодировки файла! +questions.find.error.filename=Файл с именем {0} не найден! +questions.io.error=Ошибка ввода/вывода при работе с файлом! + +csv.file.name=ru.csv + +test.key=тест123 +test.key.params={0} и {1} - Привет \ No newline at end of file diff --git a/src/test/resources/test.properties b/src/test/resources/test.properties new file mode 100644 index 0000000..ea04e2e --- /dev/null +++ b/src/test/resources/test.properties @@ -0,0 +1,6 @@ +test.basename=/locale/bundle +test.default.encoding=UTF-8 +test.default.ru=ru +test.default.en=en + +test.question.folder=/questions From 998fed3c607a1c0130efe6c6f40c7d3b392f02aa Mon Sep 17 00:00:00 2001 From: "maxim.kulikov" Date: Fri, 22 Mar 2019 15:36:36 +0300 Subject: [PATCH 15/25] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../otus/mkulikov/questions/QuestionsDAOTest.java | 12 +++--------- .../localisation/LocalisationServiceImplTest.java | 13 ++++--------- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 2af3090..74e0743 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ - Убраны лишние тесты. - Изменена работа с файлом. - Использование @Data вместо @Getter, @Setter. +- Добавлены *.properties для тестов. diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 4e0bd8e..a9bb600 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -25,9 +25,6 @@ @TestPropertySource("/test.properties") class QuestionsDAOTest { - private LocalisationServiceImpl localisationService; - private QuestionsDAO questionsDAO; - @Value("${test.basename}") private String folder; @Value("${test.default.encoding}") @@ -43,15 +40,12 @@ class QuestionsDAOTest { private final String c_test2 = "Тест2"; private final String c_test3 = "Тест3"; - @BeforeEach - void init() { - localisationService = new LocalisationServiceImpl(folder, encoding, ru); - questionsDAO = new QuestionsDAOImpl(localisationService, questionFolder); - } - @Test @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() throws QuestionsFileLoadingException { + LocalisationServiceImpl localisationService = new LocalisationServiceImpl(folder, encoding, ru); + QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService, questionFolder); + List questions = questionsDAO.getQuestions(); assertAll("questions", diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java index 1b9b76e..2984838 100644 --- a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java @@ -34,18 +34,10 @@ class LocalisationServiceImplTest { @Value("${test.default.en}") private String en; - private LocalisationService ruLocale; - private LocalisationService enLocale; - - @BeforeEach - void init() { - ruLocale = new LocalisationServiceImpl(folder, encoding, ru); - enLocale = new LocalisationServiceImpl(folder, encoding, en); - } - @Test @DisplayName("Проверка получения значения ru локали") void getValueRuTest() { + LocalisationService ruLocale = new LocalisationServiceImpl(folder, encoding, ru); String value = ruLocale.getValue("test.key"); assertAll("value", @@ -57,6 +49,7 @@ void getValueRuTest() { @Test @DisplayName("Проверка получения значения en локали") void getValueEnTest() { + LocalisationService enLocale = new LocalisationServiceImpl(folder, encoding, en); String value = enLocale.getValue("test.key"); assertAll("value", @@ -68,6 +61,7 @@ void getValueEnTest() { @Test @DisplayName("Проверка получения значения ru локали с параметром") void getValueRuWithParamsTest() { + LocalisationService ruLocale = new LocalisationServiceImpl(folder, encoding, ru); String value = ruLocale.getValueWithParams("test.key.params", new String[]{"При", "вет"}); assertAll("value", @@ -79,6 +73,7 @@ void getValueRuWithParamsTest() { @Test @DisplayName("Проверка получения значения en локали с параметром") void getValueEnWithParamsTest() { + LocalisationService enLocale = new LocalisationServiceImpl(folder, encoding, en); String value = enLocale.getValueWithParams("test.key.params", new String[]{"Hel", "lo"}); assertAll("value", From f5693bd2bc251a90a42ad41da731a0b6361983d9 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 23 Mar 2019 22:07:26 +0300 Subject: [PATCH 16/25] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 ++++++---------- pom.xml | 2 +- .../mkulikov/questions/QuestionsDAOTest.java | 1 - .../LocalisationServiceImplTest.java | 1 - 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 74e0743..2437cc0 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,8 @@ # OtusSpringHW -Домашнее задание #2: -- Добавить файл настроек в приложение и для тестирования. -- Локализовать выводимые сообщения и вопросы теста. -- Переписать конфигурацию в виде Java + Annotation-based конфигурации. - -### 19-03-22 Доработки: -- Убраны лишние тесты. -- Изменена работа с файлом. -- Использование @Data вместо @Getter, @Setter. -- Добавлены *.properties для тестов. +Домашнее задание #3: +- Создать проект используя Spring Boot Initializr. +- Перенести приложение тестирования на Spring Boot. +- Перенести все свойства в application.yml +- Сделать собственный баннер для приложения. +- Перенести тесты и использовать spring-boot-test-starter \ No newline at end of file diff --git a/pom.xml b/pom.xml index ae8c2f6..993fda9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - home-work-01 + home-work ru.otus.mkulikov home-work diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index a9bb600..8539401 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.questions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java index 2984838..0c6c4d5 100644 --- a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.services.localisation; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; From c44d163575c65b6909eb0703bf9e1ad7435dfe13 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 1 Apr 2019 01:13:28 +0300 Subject: [PATCH 17/25] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BD=D0=B0=20Spring=20Boot.=20-=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B2=D0=BE?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D0=B1=D0=B0=D0=BD=D0=BD=D0=B5=D1=80=D0=B0?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- pom.xml | 52 ++++++++++++------- .../java/ru/otus/mkulikov/Application.java | 13 ++--- .../questions/QuestionsServiceImpl.java | 7 +-- src/main/resources/application.properties | 4 +- 5 files changed, 47 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 2437cc0..56e56c5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Домашнее задание #3: - Создать проект используя Spring Boot Initializr. -- Перенести приложение тестирования на Spring Boot. -- Перенести все свойства в application.yml +- Перенести приложение на Spring Boot. - Сделать собственный баннер для приложения. +- Перенести все свойства в application.yml - Перенести тесты и использовать spring-boot-test-starter \ No newline at end of file diff --git a/pom.xml b/pom.xml index 993fda9..9d36fec 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,13 @@ home-work 1.0-SNAPSHOT + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + 11 ${java.version} @@ -18,18 +25,6 @@ - - org.springframework - spring-context - 5.0.9.RELEASE - - - - org.springframework - spring-test - 5.0.9.RELEASE - - net.sf.opencsv opencsv @@ -42,6 +37,14 @@ 1.3.2 + + org.projectlombok + lombok + 1.18.4 + provided + + + junit junit @@ -77,13 +80,6 @@ test - - org.projectlombok - lombok - 1.18.4 - provided - - org.mockito @@ -91,6 +87,18 @@ 1.10.19 test + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + @@ -122,6 +130,11 @@ false + + + org.springframework.boot + spring-boot-maven-plugin + @@ -130,6 +143,7 @@ **/*.csv **/*.properties + **/*.txt false diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 3f6ee5d..0facdbc 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -1,8 +1,8 @@ package ru.otus.mkulikov; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.PropertySource; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.processor.ProcessorService; @@ -14,20 +14,17 @@ * Time: 15:27 */ -@Configuration -@ComponentScan +@SpringBootApplication @PropertySource("classpath:application.properties") public class Application { public static void main(String[] args) { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class); + ApplicationContext context = SpringApplication.run(Application.class); try { ProcessorService processor = context.getBean(ProcessorService.class); processor.startTest(); } catch (QuestionsFileLoadingException e) { e.printStackTrace(); - } finally { - context.close(); } } } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index 672ff7e..96b2629 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -8,6 +8,7 @@ import ru.otus.mkulikov.services.localisation.LocalisationService; import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; +import java.util.Arrays; import java.util.List; /** @@ -21,7 +22,7 @@ public class QuestionsServiceImpl implements QuestionsService { private final String c_delimeter = "---------------------------------------------------"; - private final String c_answerNumbers = "1234"; + private final List answerNumbers = Arrays.asList(new String[]{"1", "2", "3", "4"}); private final QuestionsDAO questionsDAO; private final IOService consoleService; @@ -52,7 +53,7 @@ public void showQuestions() throws QuestionsFileLoadingException { while (!okAnswer && i < 4) { consoleService.write(localisationService.getValue("enter.answer")); answer = consoleService.read(); - okAnswer = c_answerNumbers.contains(answer) && !answer.isEmpty(); + okAnswer = answerNumbers.contains(answer) && !answer.isEmpty(); i++; } @@ -67,7 +68,7 @@ public void showQuestions() throws QuestionsFileLoadingException { consoleService.write( localisationService.getValueWithParams( "count.true.answers", - new String[] {String.valueOf(count), String.valueOf(questions.size())} + new String[]{String.valueOf(count), String.valueOf(questions.size())} ) ); consoleService.write(c_delimeter); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c6450d1..f36833c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,4 +2,6 @@ locale.basename=/i18n/bundle locale.default.encoding=UTF-8 locale.default=ru -questions.default.dir=/questions \ No newline at end of file +questions.default.dir=/questions + +spring.banner.location=classpath:./banner.txt \ No newline at end of file From 6766ccd3a59ab3b4afd8584f0d73479a90bd6d71 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 18 Apr 2019 16:52:26 +0300 Subject: [PATCH 18/25] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D1=8B=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=B0=20Spring=20Boot.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++- pom.xml | 17 ++++++++--------- .../mkulikov/questions/QuestionsDAOTest.java | 18 ++++++++++++------ .../LocalisationServiceImplTest.java | 11 +++++------ 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 56e56c5..f3bdd6c 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,7 @@ - Перенести приложение на Spring Boot. - Сделать собственный баннер для приложения. - Перенести все свойства в application.yml -- Перенести тесты и использовать spring-boot-test-starter \ No newline at end of file +- Перенести тесты и использовать spring-boot-test-starter + +### 19-04-18 Доработки: +- Тесты переведены на Spring Boot. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9d36fec..af143ae 100644 --- a/pom.xml +++ b/pom.xml @@ -55,21 +55,14 @@ org.junit.jupiter junit-jupiter-api - 5.4.0 + 5.3.2 test org.junit.jupiter junit-jupiter-engine - 5.4.0 - test - - - - org.assertj - assertj-core - 3.11.1 + 5.3.2 test @@ -99,6 +92,12 @@ spring-boot-starter-test test + + + org.springframework.boot + spring-boot-configuration-processor + true + diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 8539401..3e182df 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -2,12 +2,11 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; -import org.springframework.test.context.ContextConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.otus.mkulikov.Application; +import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.localisation.LocalisationServiceImpl; @@ -18,9 +17,16 @@ import static org.junit.jupiter.api.Assertions.*; +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-22 + * Time: 13:58 + */ + @DisplayName("Класс QuestionsDAO") -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = Application.class) +@RunWith(SpringRunner.class) +@SpringBootTest @TestPropertySource("/test.properties") class QuestionsDAOTest { diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java index 0c6c4d5..02a6fd9 100644 --- a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java @@ -2,12 +2,11 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Value; -import org.springframework.test.context.ContextConfiguration; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import ru.otus.mkulikov.Application; +import org.springframework.test.context.junit4.SpringRunner; import static org.junit.jupiter.api.Assertions.*; @@ -19,8 +18,8 @@ */ @DisplayName("Класс LocalisationServiceImpl") -@ExtendWith(SpringExtension.class) -@ContextConfiguration(classes = Application.class) +@RunWith(SpringRunner.class) +@SpringBootTest @TestPropertySource("/test.properties") class LocalisationServiceImplTest { From f7c892268e2a981ee78e31230b25fcdc9bac9f01 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 19 Apr 2019 17:25:22 +0300 Subject: [PATCH 19/25] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=B2=20*.yml=20=D1=84=D0=B0=D0=B9=D0=BB?= =?UTF-8?q?=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +-- pom.xml | 1 + .../java/ru/otus/mkulikov/Application.java | 6 ++- .../mkulikov/config/LocaleProperties.java | 22 ++++++++ .../mkulikov/config/QuetionsProperties.java | 20 +++++++ .../ru/otus/mkulikov/models/Question.java | 15 ++++++ .../localisation/LocalisationServiceImpl.java | 17 +++--- .../questions/dao/QuestionsDAOImpl.java | 23 ++++---- src/main/resources/application.properties | 7 --- src/main/resources/application.yml | 12 +++++ .../mkulikov/questions/QuestionsDAOTest.java | 25 ++++----- .../LocalisationServiceImplEnTest.java | 54 +++++++++++++++++++ ...ava => LocalisationServiceImplRuTest.java} | 46 ++++------------ src/test/resources/application-en.yml | 8 +++ src/test/resources/application-ru.yml | 8 +++ src/test/resources/test.properties | 6 --- 16 files changed, 188 insertions(+), 89 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/config/LocaleProperties.java create mode 100644 src/main/java/ru/otus/mkulikov/config/QuetionsProperties.java delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yml create mode 100644 src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplEnTest.java rename src/test/java/ru/otus/mkulikov/services/localisation/{LocalisationServiceImplTest.java => LocalisationServiceImplRuTest.java} (52%) create mode 100644 src/test/resources/application-en.yml create mode 100644 src/test/resources/application-ru.yml delete mode 100644 src/test/resources/test.properties diff --git a/README.md b/README.md index f3bdd6c..d592be2 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,5 @@ - Создать проект используя Spring Boot Initializr. - Перенести приложение на Spring Boot. - Сделать собственный баннер для приложения. -- Перенести все свойства в application.yml -- Перенести тесты и использовать spring-boot-test-starter - -### 19-04-18 Доработки: -- Тесты переведены на Spring Boot. \ No newline at end of file +- Перенести все свойства в *.yml файлы. +- Перенести тесты и использовать spring-boot-test-starter. diff --git a/pom.xml b/pom.xml index af143ae..80d3905 100644 --- a/pom.xml +++ b/pom.xml @@ -143,6 +143,7 @@ **/*.csv **/*.properties **/*.txt + **/*.yml false diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 0facdbc..8ceb52e 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -2,8 +2,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.PropertySource; +import ru.otus.mkulikov.config.LocaleProperties; +import ru.otus.mkulikov.config.QuetionsProperties; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.processor.ProcessorService; @@ -15,7 +18,8 @@ */ @SpringBootApplication -@PropertySource("classpath:application.properties") +@PropertySource("classpath:application.yml") +@EnableConfigurationProperties({LocaleProperties.class, QuetionsProperties.class}) public class Application { public static void main(String[] args) { diff --git a/src/main/java/ru/otus/mkulikov/config/LocaleProperties.java b/src/main/java/ru/otus/mkulikov/config/LocaleProperties.java new file mode 100644 index 0000000..c81716f --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/config/LocaleProperties.java @@ -0,0 +1,22 @@ +package ru.otus.mkulikov.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 19.04.2019 + * Time: 9:57 + */ + +@Data +@Component +@ConfigurationProperties(prefix = "locale") +public class LocaleProperties { + + private String basename; + private String defaultLocale; + private String encoding; +} diff --git a/src/main/java/ru/otus/mkulikov/config/QuetionsProperties.java b/src/main/java/ru/otus/mkulikov/config/QuetionsProperties.java new file mode 100644 index 0000000..90b419e --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/config/QuetionsProperties.java @@ -0,0 +1,20 @@ +package ru.otus.mkulikov.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 19.04.2019 + * Time: 10:25 + */ + +@Data +@Component +@ConfigurationProperties(prefix = "questions.default") +public class QuetionsProperties { + + private String dir; +} diff --git a/src/main/java/ru/otus/mkulikov/models/Question.java b/src/main/java/ru/otus/mkulikov/models/Question.java index e148602..1aecc2f 100644 --- a/src/main/java/ru/otus/mkulikov/models/Question.java +++ b/src/main/java/ru/otus/mkulikov/models/Question.java @@ -14,13 +14,28 @@ @Data public class Question implements Serializable { + public static final String c_id = "id"; private String id; + + public static final String c_question = "question"; private String question; + + public static final String c_answer1 = "answer1"; private String answer1; + + public static final String c_answer2 = "answer2"; private String answer2; + + public static final String c_answer3 = "answer3"; private String answer3; + + public static final String c_answer4 = "answer4"; private String answer4; + + public static final String c_trueAnswer = "trueAnswer"; private String trueAnswer; + + public static final String c_userAnswer = "userAnswer"; private String userAnswer; public Question(String id, String question, String answer1, String answer2, String answer3, String answer4, String trueAnswer, String userAnswer) { diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java index 2af1b75..3854acd 100644 --- a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java @@ -1,8 +1,9 @@ package ru.otus.mkulikov.services.localisation; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.stereotype.Service; +import ru.otus.mkulikov.config.LocaleProperties; import java.util.Locale; @@ -19,17 +20,13 @@ public class LocalisationServiceImpl extends ReloadableResourceBundleMessageSour private final Locale locale; private final Locale russian = new Locale("ru"); - public LocalisationServiceImpl( - @Value("${locale.basename}") String basename, - @Value("${locale.default.encoding}") String defaultEncoding, - @Value("${locale.default}") String localeDefault - ) { + public LocalisationServiceImpl(LocaleProperties localeProperties) { super(); - setBasename(basename); - setDefaultEncoding(defaultEncoding); + setBasename(localeProperties.getBasename()); + setDefaultEncoding(localeProperties.getEncoding()); - locale = (localeDefault != null) - ? new Locale(localeDefault) + locale = (localeProperties.getDefaultLocale() != null) + ? new Locale(localeProperties.getDefaultLocale()) : russian; } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index eb09c51..c7c1779 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -3,9 +3,9 @@ import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; -import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Repository; +import ru.otus.mkulikov.config.QuetionsProperties; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.localisation.LocalisationService; @@ -26,15 +26,13 @@ @Repository public class QuestionsDAOImpl implements QuestionsDAO { + private final String c_file_encoding = "UTF-8"; private final LocalisationService localisationService; private final String defaultFileDir; - public QuestionsDAOImpl( - LocalisationService localisationService, - @Value("${questions.default.dir}") String defaultFileDir - ) { + public QuestionsDAOImpl(LocalisationService localisationService, QuetionsProperties quetionsProperties) { this.localisationService = localisationService; - this.defaultFileDir = defaultFileDir; + this.defaultFileDir = quetionsProperties.getDir(); } @SuppressWarnings({"rawtypes", "unchecked"}) @@ -44,7 +42,7 @@ public List getQuestions() throws QuestionsFileLoadingException { List questions; try { ClassPathResource resource = new ClassPathResource(csvFilename); - CSVReader csvReader = new CSVReader(new InputStreamReader(resource.getInputStream(), "UTF-8")); + CSVReader csvReader = new CSVReader(new InputStreamReader(resource.getInputStream(), c_file_encoding)); questions = new CsvToBean().parse(setColumMapping(), csvReader); } catch (FileNotFoundException e) { throw new QuestionsFileLoadingException(localisationService.getValueWithParams("questions.find.error.filename", new String[] {csvFilename}), e); @@ -60,8 +58,15 @@ public List getQuestions() throws QuestionsFileLoadingException { private ColumnPositionMappingStrategy setColumMapping() { ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy(); strategy.setType(Question.class); - String[] columns = new String[]{"id", "question", "answer1", "answer2", "answer3", "answer4", "trueAnswer"}; - strategy.setColumnMapping(columns); + strategy.setColumnMapping(new String[]{ + Question.c_id, + Question.c_question, + Question.c_answer1, + Question.c_answer2, + Question.c_answer3, + Question.c_answer4, + Question.c_trueAnswer + }); return strategy; } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index f36833c..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -locale.basename=/i18n/bundle -locale.default.encoding=UTF-8 -locale.default=ru - -questions.default.dir=/questions - -spring.banner.location=classpath:./banner.txt \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..70451ea --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,12 @@ +locale: + basename: /i18n/bundle + defaultLocale: ru + encoding: UTF-8 + +questions: + default: + dir: /questions + +spring: + banner: + location: classpath:./banner.txt \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 3e182df..9d339e8 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -3,10 +3,13 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.config.LocaleProperties; +import ru.otus.mkulikov.config.QuetionsProperties; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; import ru.otus.mkulikov.services.localisation.LocalisationServiceImpl; @@ -27,19 +30,13 @@ @DisplayName("Класс QuestionsDAO") @RunWith(SpringRunner.class) @SpringBootTest -@TestPropertySource("/test.properties") +@ActiveProfiles("ru") class QuestionsDAOTest { - @Value("${test.basename}") - private String folder; - @Value("${test.default.encoding}") - private String encoding; - @Value("${test.default.ru}") - private String ru; - @Value("${test.default.en}") - private String en; - @Value("${test.question.folder}") - private String questionFolder; + @Autowired + private LocaleProperties localeProperties; + @Autowired + private QuetionsProperties quetionsProperties; private final String c_test1 = "Тест1"; private final String c_test2 = "Тест2"; @@ -48,8 +45,8 @@ class QuestionsDAOTest { @Test @DisplayName("Корректная загрузка вопросов") public void loadQuestionsTest() throws QuestionsFileLoadingException { - LocalisationServiceImpl localisationService = new LocalisationServiceImpl(folder, encoding, ru); - QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService, questionFolder); + LocalisationServiceImpl localisationService = new LocalisationServiceImpl(localeProperties); + QuestionsDAO questionsDAO = new QuestionsDAOImpl(localisationService, quetionsProperties); List questions = questionsDAO.getQuestions(); diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplEnTest.java b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplEnTest.java new file mode 100644 index 0000000..85c2758 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplEnTest.java @@ -0,0 +1,54 @@ +package ru.otus.mkulikov.services.localisation; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.config.LocaleProperties; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-22 + * Time: 13:58 + */ + +@DisplayName("Класс LocalisationServiceImpl") +@RunWith(SpringRunner.class) +@SpringBootTest +@ActiveProfiles("en") +class LocalisationServiceImplEnTest { + + @Autowired + private LocaleProperties localeProperties; + + @Test + @DisplayName("Проверка получения значения en локали") + void getValueEnTest() { + LocalisationService enLocale = new LocalisationServiceImpl(localeProperties); + String value = enLocale.getValue("test.key"); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("test123", value) + ); + } + + @Test + @DisplayName("Проверка получения значения en локали с параметром") + void getValueEnWithParamsTest() { + LocalisationService enLocale = new LocalisationServiceImpl(localeProperties); + String value = enLocale.getValueWithParams("test.key.params", new String[]{"Hel", "lo"}); + + assertAll("value", + () -> assertNotNull(value), + () -> assertEquals("Hel & lo - Hello", value) + ); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplRuTest.java similarity index 52% rename from src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java rename to src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplRuTest.java index 02a6fd9..7388509 100644 --- a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplRuTest.java @@ -3,10 +3,12 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.config.LocaleProperties; import static org.junit.jupiter.api.Assertions.*; @@ -20,22 +22,16 @@ @DisplayName("Класс LocalisationServiceImpl") @RunWith(SpringRunner.class) @SpringBootTest -@TestPropertySource("/test.properties") -class LocalisationServiceImplTest { +@ActiveProfiles("ru") +class LocalisationServiceImplRuTest { - @Value("${test.basename}") - private String folder; - @Value("${test.default.encoding}") - private String encoding; - @Value("${test.default.ru}") - private String ru; - @Value("${test.default.en}") - private String en; + @Autowired + private LocaleProperties localeProperties; @Test @DisplayName("Проверка получения значения ru локали") void getValueRuTest() { - LocalisationService ruLocale = new LocalisationServiceImpl(folder, encoding, ru); + LocalisationService ruLocale = new LocalisationServiceImpl(localeProperties); String value = ruLocale.getValue("test.key"); assertAll("value", @@ -44,22 +40,10 @@ void getValueRuTest() { ); } - @Test - @DisplayName("Проверка получения значения en локали") - void getValueEnTest() { - LocalisationService enLocale = new LocalisationServiceImpl(folder, encoding, en); - String value = enLocale.getValue("test.key"); - - assertAll("value", - () -> assertNotNull(value), - () -> assertEquals("test123", value) - ); - } - @Test @DisplayName("Проверка получения значения ru локали с параметром") void getValueRuWithParamsTest() { - LocalisationService ruLocale = new LocalisationServiceImpl(folder, encoding, ru); + LocalisationService ruLocale = new LocalisationServiceImpl(localeProperties); String value = ruLocale.getValueWithParams("test.key.params", new String[]{"При", "вет"}); assertAll("value", @@ -67,16 +51,4 @@ void getValueRuWithParamsTest() { () -> assertEquals("При и вет - Привет", value) ); } - - @Test - @DisplayName("Проверка получения значения en локали с параметром") - void getValueEnWithParamsTest() { - LocalisationService enLocale = new LocalisationServiceImpl(folder, encoding, en); - String value = enLocale.getValueWithParams("test.key.params", new String[]{"Hel", "lo"}); - - assertAll("value", - () -> assertNotNull(value), - () -> assertEquals("Hel & lo - Hello", value) - ); - } } \ No newline at end of file diff --git a/src/test/resources/application-en.yml b/src/test/resources/application-en.yml new file mode 100644 index 0000000..ff2c2d6 --- /dev/null +++ b/src/test/resources/application-en.yml @@ -0,0 +1,8 @@ +locale: + basename: /locale/bundle + defaultLocale: en + encoding: UTF-8 + +questions: + default: + dir: /questions diff --git a/src/test/resources/application-ru.yml b/src/test/resources/application-ru.yml new file mode 100644 index 0000000..5bc5fce --- /dev/null +++ b/src/test/resources/application-ru.yml @@ -0,0 +1,8 @@ +locale: + basename: /locale/bundle + defaultLocale: ru + encoding: UTF-8 + +questions: + default: + dir: /questions diff --git a/src/test/resources/test.properties b/src/test/resources/test.properties deleted file mode 100644 index ea04e2e..0000000 --- a/src/test/resources/test.properties +++ /dev/null @@ -1,6 +0,0 @@ -test.basename=/locale/bundle -test.default.encoding=UTF-8 -test.default.ru=ru -test.default.en=en - -test.question.folder=/questions From 2fd53d209c31862cdb307febb545d9e6e9ebac8c Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 22 Apr 2019 15:19:28 +0300 Subject: [PATCH 20/25] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=B1=D0=B0=D0=BD=D0=BD=D0=B5=D1=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - src/main/resources/application.yml | 2 +- src/main/resources/banner.txt | 11 +++++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/banner.txt diff --git a/.gitignore b/.gitignore index ced985d..6860851 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,3 @@ target *.iml *.log -*.txt \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 70451ea..5edd657 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -9,4 +9,4 @@ questions: spring: banner: - location: classpath:./banner.txt \ No newline at end of file + location: "classpath:banner.txt" diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt new file mode 100644 index 0000000..1687640 --- /dev/null +++ b/src/main/resources/banner.txt @@ -0,0 +1,11 @@ + ___ ___ ___ ___ ___ + /\__\ /\ \ /\__\ /\ \ /\ \ + /:/ / /::\ \ /:/ / /::\ \ /::\ \ + /:/ / /:/\:\ \ /:/ / /:/\:\ \ /:/\ \ \ + /:/ / ___ /:/ \:\ \ /:/ / /::\~\:\ \ _\:\~\ \ \ + /:/__/ /\__\ /:/__/ \:\__\ /:/__/ /:/\:\ \:\__\ /\ \:\ \ \__\ + \:\ \ /:/ / \:\ \ /:/ / \:\ \ \:\~\:\ \/__/ \:\ \:\ \/__/ + \:\ /:/ / \:\ /:/ / \:\ \ \:\ \:\__\ \:\ \:\__\ + \:\/:/ / \:\/:/ / \:\ \ \:\ \/__/ \:\/:/ / + \::/ / \::/ / \:\__\ \:\__\ \::/ / + \/__/ \/__/ \/__/ \/__/ \/__/ \ No newline at end of file From f483831eb075629605de23ac62556401c08b60f7 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 22 Apr 2019 15:22:55 +0300 Subject: [PATCH 21/25] =?UTF-8?q?=D0=A0=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 8 ++++---- src/test/resources/application-en.yml | 8 ++++---- src/test/resources/application-ru.yml | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 5edd657..fc12ff7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,11 +1,11 @@ locale: - basename: /i18n/bundle - defaultLocale: ru - encoding: UTF-8 + basename: "/i18n/bundle" + defaultLocale: "ru" + encoding: "UTF-8" questions: default: - dir: /questions + dir: "/questions" spring: banner: diff --git a/src/test/resources/application-en.yml b/src/test/resources/application-en.yml index ff2c2d6..9d2007a 100644 --- a/src/test/resources/application-en.yml +++ b/src/test/resources/application-en.yml @@ -1,8 +1,8 @@ locale: - basename: /locale/bundle - defaultLocale: en - encoding: UTF-8 + basename: "/locale/bundle" + defaultLocale: "en" + encoding: "UTF-8" questions: default: - dir: /questions + dir: "/questions" diff --git a/src/test/resources/application-ru.yml b/src/test/resources/application-ru.yml index 5bc5fce..4bd742b 100644 --- a/src/test/resources/application-ru.yml +++ b/src/test/resources/application-ru.yml @@ -1,8 +1,8 @@ locale: - basename: /locale/bundle - defaultLocale: ru - encoding: UTF-8 + basename: "/locale/bundle" + defaultLocale: "ru" + encoding: "UTF-8" questions: default: - dir: /questions + dir: "/questions" From 879244e37505c69beb6a63a0154570076a33f23e Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 23 Apr 2019 17:58:03 +0300 Subject: [PATCH 22/25] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B8=20=D0=BF=D0=BE=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=87=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++------ pom.xml | 11 ----------- src/main/java/ru/otus/mkulikov/Application.java | 6 +----- .../java/ru/otus/mkulikov/models/Question.java | 15 --------------- .../localisation/LocalisationServiceImpl.java | 1 - .../services/processor/ProcessorServiceImpl.java | 2 -- .../services/questions/QuestionsServiceImpl.java | 10 ++++------ .../services/questions/dao/QuestionsDAOImpl.java | 13 ++----------- .../registration/RegistrationServiceImpl.java | 2 -- 9 files changed, 11 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index d592be2..7cac160 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # OtusSpringHW -Домашнее задание #3: -- Создать проект используя Spring Boot Initializr. -- Перенести приложение на Spring Boot. -- Сделать собственный баннер для приложения. -- Перенести все свойства в *.yml файлы. -- Перенести тесты и использовать spring-boot-test-starter. +Домашнее задание #4: +- Перевести приложение для проведения опросов на Spring Shell. +- Подключить Spring Shell, используя starter. +- Написать юнит-тесты и использовать spring-boot-test-starter. diff --git a/pom.xml b/pom.xml index 80d3905..976269b 100644 --- a/pom.xml +++ b/pom.xml @@ -19,8 +19,6 @@ 11 - ${java.version} - ${java.version} UTF-8 @@ -45,13 +43,6 @@ - - junit - junit - 4.12 - test - - org.junit.jupiter junit-jupiter-api @@ -106,8 +97,6 @@ org.apache.maven.plugins maven-compiler-plugin - ${java.version} - ${java.version} ${encoding} diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 8ceb52e..b1247a1 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -4,9 +4,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.PropertySource; -import ru.otus.mkulikov.config.LocaleProperties; -import ru.otus.mkulikov.config.QuetionsProperties; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.services.processor.ProcessorService; @@ -18,8 +15,7 @@ */ @SpringBootApplication -@PropertySource("classpath:application.yml") -@EnableConfigurationProperties({LocaleProperties.class, QuetionsProperties.class}) +@EnableConfigurationProperties public class Application { public static void main(String[] args) { diff --git a/src/main/java/ru/otus/mkulikov/models/Question.java b/src/main/java/ru/otus/mkulikov/models/Question.java index 1aecc2f..e148602 100644 --- a/src/main/java/ru/otus/mkulikov/models/Question.java +++ b/src/main/java/ru/otus/mkulikov/models/Question.java @@ -14,28 +14,13 @@ @Data public class Question implements Serializable { - public static final String c_id = "id"; private String id; - - public static final String c_question = "question"; private String question; - - public static final String c_answer1 = "answer1"; private String answer1; - - public static final String c_answer2 = "answer2"; private String answer2; - - public static final String c_answer3 = "answer3"; private String answer3; - - public static final String c_answer4 = "answer4"; private String answer4; - - public static final String c_trueAnswer = "trueAnswer"; private String trueAnswer; - - public static final String c_userAnswer = "userAnswer"; private String userAnswer; public Question(String id, String question, String answer1, String answer2, String answer3, String answer4, String trueAnswer, String userAnswer) { diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java index 3854acd..ea97812 100644 --- a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.services.localisation; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.stereotype.Service; import ru.otus.mkulikov.config.LocaleProperties; diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java index 50a00aa..5d3086e 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.services.processor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.otus.mkulikov.services.questions.QuestionsService; import ru.otus.mkulikov.services.registration.RegistrationService; @@ -18,7 +17,6 @@ public class ProcessorServiceImpl implements ProcessorService { private final QuestionsService questionsService; private final RegistrationService registration; - @Autowired public ProcessorServiceImpl(QuestionsService questionsService, RegistrationService registration) { this.questionsService = questionsService; this.registration = registration; diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java index 96b2629..ed79226 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.services.questions; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.models.Question; @@ -28,7 +27,6 @@ public class QuestionsServiceImpl implements QuestionsService { private final IOService consoleService; private final LocalisationService localisationService; - @Autowired public QuestionsServiceImpl(QuestionsDAO questionsDAO, IOService consoleService, LocalisationService localisationService) { this.questionsDAO = questionsDAO; this.consoleService = consoleService; @@ -48,16 +46,16 @@ public void showQuestions() throws QuestionsFileLoadingException { consoleService.write(question.getAnswer4()); String answer = null; - boolean okAnswer = false; + boolean isOkAnswer = false; int i = 0; - while (!okAnswer && i < 4) { + while (!isOkAnswer && i < 4) { consoleService.write(localisationService.getValue("enter.answer")); answer = consoleService.read(); - okAnswer = answerNumbers.contains(answer) && !answer.isEmpty(); + isOkAnswer = answerNumbers.contains(answer) && !answer.isEmpty(); i++; } - question.setUserAnswer((!okAnswer && i == 4) ? "0" : answer); + question.setUserAnswer((!isOkAnswer && i == 4) ? "0" : answer); consoleService.write(c_delimeter); } diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java index c7c1779..0f7558b 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java @@ -26,7 +26,6 @@ @Repository public class QuestionsDAOImpl implements QuestionsDAO { - private final String c_file_encoding = "UTF-8"; private final LocalisationService localisationService; private final String defaultFileDir; @@ -42,7 +41,7 @@ public List getQuestions() throws QuestionsFileLoadingException { List questions; try { ClassPathResource resource = new ClassPathResource(csvFilename); - CSVReader csvReader = new CSVReader(new InputStreamReader(resource.getInputStream(), c_file_encoding)); + CSVReader csvReader = new CSVReader(new InputStreamReader(resource.getInputStream(), "UTF-8")); questions = new CsvToBean().parse(setColumMapping(), csvReader); } catch (FileNotFoundException e) { throw new QuestionsFileLoadingException(localisationService.getValueWithParams("questions.find.error.filename", new String[] {csvFilename}), e); @@ -58,15 +57,7 @@ public List getQuestions() throws QuestionsFileLoadingException { private ColumnPositionMappingStrategy setColumMapping() { ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy(); strategy.setType(Question.class); - strategy.setColumnMapping(new String[]{ - Question.c_id, - Question.c_question, - Question.c_answer1, - Question.c_answer2, - Question.c_answer3, - Question.c_answer4, - Question.c_trueAnswer - }); + strategy.setColumnMapping(new String[]{"id", "question", "answer1", "answer2", "answer3", "answer4", "trueAnswer"}); return strategy; } } diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java index 08c64a0..9431d72 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.services.registration; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.otus.mkulikov.models.User; import ru.otus.mkulikov.services.console.IOService; @@ -19,7 +18,6 @@ public class RegistrationServiceImpl implements RegistrationService { private final IOService consoleService; private final LocalisationService localisationService; - @Autowired public RegistrationServiceImpl(IOService consoleService, LocalisationService localisationService) { this.consoleService = consoleService; this.localisationService = localisationService; From 845b1b5678e3d78ca483fbe017d239c01e398fbe Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 25 May 2019 16:23:14 +0300 Subject: [PATCH 23/25] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20Spring=20Shell.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++++ .../java/ru/otus/mkulikov/Application.java | 11 +------ .../java/ru/otus/mkulikov/shell/Commands.java | 32 +++++++++++++++++++ .../mkulikov/questions/QuestionsDAOTest.java | 1 - 4 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/shell/Commands.java diff --git a/pom.xml b/pom.xml index 976269b..ef2ed40 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@ spring-boot-configuration-processor true + + + org.springframework.shell + spring-shell-starter + 2.0.0.RELEASE + diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index b1247a1..134eb85 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -3,9 +3,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.ApplicationContext; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.processor.ProcessorService; /** * Created by IntelliJ IDEA. @@ -19,12 +16,6 @@ public class Application { public static void main(String[] args) { - ApplicationContext context = SpringApplication.run(Application.class); - try { - ProcessorService processor = context.getBean(ProcessorService.class); - processor.startTest(); - } catch (QuestionsFileLoadingException e) { - e.printStackTrace(); - } + SpringApplication.run(Application.class, args); } } diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java new file mode 100644 index 0000000..378f7fd --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -0,0 +1,32 @@ +package ru.otus.mkulikov.shell; + +import org.springframework.shell.standard.ShellComponent; +import org.springframework.shell.standard.ShellMethod; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.services.processor.ProcessorService; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 25.05.2019 + * Time: 14:20 + */ + +@ShellComponent +public class Commands { + + private ProcessorService processor; + + public Commands(ProcessorService processor) { + this.processor = processor; + } + + @ShellMethod(key = { "startTest" }, value = "Start test") + public void startTest() { + try { + processor.startTest(); + } catch (QuestionsFileLoadingException e) { + e.printStackTrace(); + } + } +} diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java index 9d339e8..009e1ed 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.config.LocaleProperties; import ru.otus.mkulikov.config.QuetionsProperties; From 60d2af1a723223dad159d731d434b5c4f8690716 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 25 May 2019 17:23:46 +0300 Subject: [PATCH 24/25] =?UTF-8?q?=D0=A0=D0=B5=D1=88=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D1=8B=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20Spring=20?= =?UTF-8?q?Shell'=D0=BE=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => app}/config/LocaleProperties.java | 2 +- .../{ => app}/config/QuetionsProperties.java | 2 +- .../QuestionsFileLoadingException.java | 2 +- .../mkulikov/{ => app}/models/Question.java | 2 +- .../otus/mkulikov/{ => app}/models/User.java | 2 +- .../console/ConsoleIOServiceImpl.java | 2 +- .../{ => app}/services/console/IOService.java | 2 +- .../localisation/LocalisationService.java | 2 +- .../localisation/LocalisationServiceImpl.java | 4 ++-- .../services/processor/ProcessorService.java | 2 +- .../processor/ProcessorServiceImpl.java | 6 +++--- .../services/questions/QuestionsService.java | 4 ++-- .../questions/QuestionsServiceImpl.java | 12 +++++------ .../services/questions/dao/QuestionsDAO.java | 6 +++--- .../questions/dao/QuestionsDAOImpl.java | 10 +++++----- .../registration/RegistrationService.java | 2 +- .../registration/RegistrationServiceImpl.java | 8 ++++---- .../java/ru/otus/mkulikov/shell/Commands.java | 4 ++-- .../mkulikov/app/services/AppTestConfig.java | 20 +++++++++++++++++++ .../LocalisationServiceImplEnTest.java | 8 ++++---- .../LocalisationServiceImplRuTest.java | 8 ++++---- .../services}/questions/QuestionsDAOTest.java | 19 +++++++++--------- 22 files changed, 75 insertions(+), 54 deletions(-) rename src/main/java/ru/otus/mkulikov/{ => app}/config/LocaleProperties.java (92%) rename src/main/java/ru/otus/mkulikov/{ => app}/config/QuetionsProperties.java (91%) rename src/main/java/ru/otus/mkulikov/{ => app}/exceptions/QuestionsFileLoadingException.java (90%) rename src/main/java/ru/otus/mkulikov/{ => app}/models/Question.java (95%) rename src/main/java/ru/otus/mkulikov/{ => app}/models/User.java (89%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/console/ConsoleIOServiceImpl.java (93%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/console/IOService.java (79%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/localisation/LocalisationService.java (82%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/localisation/LocalisationServiceImpl.java (90%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/processor/ProcessorService.java (76%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/processor/ProcessorServiceImpl.java (78%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/questions/QuestionsService.java (63%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/questions/QuestionsServiceImpl.java (87%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/questions/dao/QuestionsDAO.java (58%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/questions/dao/QuestionsDAOImpl.java (89%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/registration/RegistrationService.java (76%) rename src/main/java/ru/otus/mkulikov/{ => app}/services/registration/RegistrationServiceImpl.java (83%) create mode 100644 src/test/java/ru/otus/mkulikov/app/services/AppTestConfig.java rename src/test/java/ru/otus/mkulikov/{ => app}/services/localisation/LocalisationServiceImplEnTest.java (88%) rename src/test/java/ru/otus/mkulikov/{ => app}/services/localisation/LocalisationServiceImplRuTest.java (88%) rename src/test/java/ru/otus/mkulikov/{ => app/services}/questions/QuestionsDAOTest.java (74%) diff --git a/src/main/java/ru/otus/mkulikov/config/LocaleProperties.java b/src/main/java/ru/otus/mkulikov/app/config/LocaleProperties.java similarity index 92% rename from src/main/java/ru/otus/mkulikov/config/LocaleProperties.java rename to src/main/java/ru/otus/mkulikov/app/config/LocaleProperties.java index c81716f..ff2f51e 100644 --- a/src/main/java/ru/otus/mkulikov/config/LocaleProperties.java +++ b/src/main/java/ru/otus/mkulikov/app/config/LocaleProperties.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.config; +package ru.otus.mkulikov.app.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/src/main/java/ru/otus/mkulikov/config/QuetionsProperties.java b/src/main/java/ru/otus/mkulikov/app/config/QuetionsProperties.java similarity index 91% rename from src/main/java/ru/otus/mkulikov/config/QuetionsProperties.java rename to src/main/java/ru/otus/mkulikov/app/config/QuetionsProperties.java index 90b419e..0231bc7 100644 --- a/src/main/java/ru/otus/mkulikov/config/QuetionsProperties.java +++ b/src/main/java/ru/otus/mkulikov/app/config/QuetionsProperties.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.config; +package ru.otus.mkulikov.app.config; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java b/src/main/java/ru/otus/mkulikov/app/exceptions/QuestionsFileLoadingException.java similarity index 90% rename from src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java rename to src/main/java/ru/otus/mkulikov/app/exceptions/QuestionsFileLoadingException.java index 2105a5b..8f5e560 100644 --- a/src/main/java/ru/otus/mkulikov/exceptions/QuestionsFileLoadingException.java +++ b/src/main/java/ru/otus/mkulikov/app/exceptions/QuestionsFileLoadingException.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.exceptions; +package ru.otus.mkulikov.app.exceptions; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/models/Question.java b/src/main/java/ru/otus/mkulikov/app/models/Question.java similarity index 95% rename from src/main/java/ru/otus/mkulikov/models/Question.java rename to src/main/java/ru/otus/mkulikov/app/models/Question.java index e148602..ef74502 100644 --- a/src/main/java/ru/otus/mkulikov/models/Question.java +++ b/src/main/java/ru/otus/mkulikov/app/models/Question.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.models; +package ru.otus.mkulikov.app.models; import lombok.Data; diff --git a/src/main/java/ru/otus/mkulikov/models/User.java b/src/main/java/ru/otus/mkulikov/app/models/User.java similarity index 89% rename from src/main/java/ru/otus/mkulikov/models/User.java rename to src/main/java/ru/otus/mkulikov/app/models/User.java index 52a10f1..0abc4dd 100644 --- a/src/main/java/ru/otus/mkulikov/models/User.java +++ b/src/main/java/ru/otus/mkulikov/app/models/User.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.models; +package ru.otus.mkulikov.app.models; import lombok.Data; diff --git a/src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/console/ConsoleIOServiceImpl.java similarity index 93% rename from src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java rename to src/main/java/ru/otus/mkulikov/app/services/console/ConsoleIOServiceImpl.java index 115a0e1..d990321 100644 --- a/src/main/java/ru/otus/mkulikov/services/console/ConsoleIOServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/console/ConsoleIOServiceImpl.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.services.console; +package ru.otus.mkulikov.app.services.console; import org.springframework.stereotype.Service; diff --git a/src/main/java/ru/otus/mkulikov/services/console/IOService.java b/src/main/java/ru/otus/mkulikov/app/services/console/IOService.java similarity index 79% rename from src/main/java/ru/otus/mkulikov/services/console/IOService.java rename to src/main/java/ru/otus/mkulikov/app/services/console/IOService.java index b6f92d3..f8ed658 100644 --- a/src/main/java/ru/otus/mkulikov/services/console/IOService.java +++ b/src/main/java/ru/otus/mkulikov/app/services/console/IOService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.services.console; +package ru.otus.mkulikov.app.services.console; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java b/src/main/java/ru/otus/mkulikov/app/services/localisation/LocalisationService.java similarity index 82% rename from src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java rename to src/main/java/ru/otus/mkulikov/app/services/localisation/LocalisationService.java index fa1f7fe..b1c0eb9 100644 --- a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationService.java +++ b/src/main/java/ru/otus/mkulikov/app/services/localisation/LocalisationService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.services.localisation; +package ru.otus.mkulikov.app.services.localisation; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImpl.java similarity index 90% rename from src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java rename to src/main/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImpl.java index ea97812..ab8a7bc 100644 --- a/src/main/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImpl.java @@ -1,8 +1,8 @@ -package ru.otus.mkulikov.services.localisation; +package ru.otus.mkulikov.app.services.localisation; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.stereotype.Service; -import ru.otus.mkulikov.config.LocaleProperties; +import ru.otus.mkulikov.app.config.LocaleProperties; import java.util.Locale; diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorService.java similarity index 76% rename from src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java rename to src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorService.java index bfb3896..074c5af 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorService.java +++ b/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.services.processor; +package ru.otus.mkulikov.app.services.processor; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorServiceImpl.java similarity index 78% rename from src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java rename to src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorServiceImpl.java index 5d3086e..0a554ad 100644 --- a/src/main/java/ru/otus/mkulikov/services/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorServiceImpl.java @@ -1,8 +1,8 @@ -package ru.otus.mkulikov.services.processor; +package ru.otus.mkulikov.app.services.processor; import org.springframework.stereotype.Service; -import ru.otus.mkulikov.services.questions.QuestionsService; -import ru.otus.mkulikov.services.registration.RegistrationService; +import ru.otus.mkulikov.app.services.questions.QuestionsService; +import ru.otus.mkulikov.app.services.registration.RegistrationService; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java b/src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsService.java similarity index 63% rename from src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java rename to src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsService.java index 15fd4bb..8499fc8 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsService.java +++ b/src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsService.java @@ -1,6 +1,6 @@ -package ru.otus.mkulikov.services.questions; +package ru.otus.mkulikov.app.services.questions; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.app.exceptions.QuestionsFileLoadingException; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsServiceImpl.java similarity index 87% rename from src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java rename to src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsServiceImpl.java index ed79226..3601ea3 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsServiceImpl.java @@ -1,11 +1,11 @@ -package ru.otus.mkulikov.services.questions; +package ru.otus.mkulikov.app.services.questions; import org.springframework.stereotype.Service; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.models.Question; -import ru.otus.mkulikov.services.console.IOService; -import ru.otus.mkulikov.services.localisation.LocalisationService; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; +import ru.otus.mkulikov.app.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.app.models.Question; +import ru.otus.mkulikov.app.services.console.IOService; +import ru.otus.mkulikov.app.services.localisation.LocalisationService; +import ru.otus.mkulikov.app.services.questions.dao.QuestionsDAO; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java b/src/main/java/ru/otus/mkulikov/app/services/questions/dao/QuestionsDAO.java similarity index 58% rename from src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java rename to src/main/java/ru/otus/mkulikov/app/services/questions/dao/QuestionsDAO.java index 96beeeb..c5a4a14 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAO.java +++ b/src/main/java/ru/otus/mkulikov/app/services/questions/dao/QuestionsDAO.java @@ -1,7 +1,7 @@ -package ru.otus.mkulikov.services.questions.dao; +package ru.otus.mkulikov.app.services.questions.dao; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.models.Question; +import ru.otus.mkulikov.app.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.app.models.Question; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/app/services/questions/dao/QuestionsDAOImpl.java similarity index 89% rename from src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java rename to src/main/java/ru/otus/mkulikov/app/services/questions/dao/QuestionsDAOImpl.java index 0f7558b..74375c1 100644 --- a/src/main/java/ru/otus/mkulikov/services/questions/dao/QuestionsDAOImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/questions/dao/QuestionsDAOImpl.java @@ -1,14 +1,14 @@ -package ru.otus.mkulikov.services.questions.dao; +package ru.otus.mkulikov.app.services.questions.dao; import au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; import au.com.bytecode.opencsv.bean.CsvToBean; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.config.QuetionsProperties; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.models.Question; -import ru.otus.mkulikov.services.localisation.LocalisationService; +import ru.otus.mkulikov.app.config.QuetionsProperties; +import ru.otus.mkulikov.app.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.app.models.Question; +import ru.otus.mkulikov.app.services.localisation.LocalisationService; import java.io.FileNotFoundException; import java.io.IOException; diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationService.java similarity index 76% rename from src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java rename to src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationService.java index 8e0d4e1..476d17b 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationService.java +++ b/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationService.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.services.registration; +package ru.otus.mkulikov.app.services.registration; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationServiceImpl.java similarity index 83% rename from src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java rename to src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationServiceImpl.java index 9431d72..e04e940 100644 --- a/src/main/java/ru/otus/mkulikov/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationServiceImpl.java @@ -1,9 +1,9 @@ -package ru.otus.mkulikov.services.registration; +package ru.otus.mkulikov.app.services.registration; import org.springframework.stereotype.Service; -import ru.otus.mkulikov.models.User; -import ru.otus.mkulikov.services.console.IOService; -import ru.otus.mkulikov.services.localisation.LocalisationService; +import ru.otus.mkulikov.app.models.User; +import ru.otus.mkulikov.app.services.console.IOService; +import ru.otus.mkulikov.app.services.localisation.LocalisationService; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java index 378f7fd..16c9f70 100644 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -2,8 +2,8 @@ import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.services.processor.ProcessorService; +import ru.otus.mkulikov.app.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.app.services.processor.ProcessorService; /** * Created by IntelliJ IDEA. diff --git a/src/test/java/ru/otus/mkulikov/app/services/AppTestConfig.java b/src/test/java/ru/otus/mkulikov/app/services/AppTestConfig.java new file mode 100644 index 0000000..651d3aa --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/services/AppTestConfig.java @@ -0,0 +1,20 @@ +package ru.otus.mkulikov.app.services; + +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.ComponentScan; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 25.05.2019 + * Time: 16:51 + */ + +@SpringBootConfiguration +@ComponentScan(basePackages = "ru.otus.mkulikov.app") +@EnableConfigurationProperties +public class AppTestConfig { + + +} diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplEnTest.java b/src/test/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImplEnTest.java similarity index 88% rename from src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplEnTest.java rename to src/test/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImplEnTest.java index 85c2758..6266814 100644 --- a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplEnTest.java +++ b/src/test/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImplEnTest.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.services.localisation; +package ru.otus.mkulikov.app.services.localisation; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -6,9 +6,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.config.LocaleProperties; +import ru.otus.mkulikov.app.services.AppTestConfig; +import ru.otus.mkulikov.app.config.LocaleProperties; import static org.junit.jupiter.api.Assertions.*; @@ -21,7 +21,7 @@ @DisplayName("Класс LocalisationServiceImpl") @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = AppTestConfig.class) @ActiveProfiles("en") class LocalisationServiceImplEnTest { diff --git a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplRuTest.java b/src/test/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImplRuTest.java similarity index 88% rename from src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplRuTest.java rename to src/test/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImplRuTest.java index 7388509..67d51ce 100644 --- a/src/test/java/ru/otus/mkulikov/services/localisation/LocalisationServiceImplRuTest.java +++ b/src/test/java/ru/otus/mkulikov/app/services/localisation/LocalisationServiceImplRuTest.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.services.localisation; +package ru.otus.mkulikov.app.services.localisation; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -6,9 +6,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.config.LocaleProperties; +import ru.otus.mkulikov.app.services.AppTestConfig; +import ru.otus.mkulikov.app.config.LocaleProperties; import static org.junit.jupiter.api.Assertions.*; @@ -21,7 +21,7 @@ @DisplayName("Класс LocalisationServiceImpl") @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = AppTestConfig.class) @ActiveProfiles("ru") class LocalisationServiceImplRuTest { diff --git a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java b/src/test/java/ru/otus/mkulikov/app/services/questions/QuestionsDAOTest.java similarity index 74% rename from src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java rename to src/test/java/ru/otus/mkulikov/app/services/questions/QuestionsDAOTest.java index 009e1ed..58d5f16 100644 --- a/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java +++ b/src/test/java/ru/otus/mkulikov/app/services/questions/QuestionsDAOTest.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.questions; +package ru.otus.mkulikov.app.services.questions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -7,13 +7,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.config.LocaleProperties; -import ru.otus.mkulikov.config.QuetionsProperties; -import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; -import ru.otus.mkulikov.models.Question; -import ru.otus.mkulikov.services.localisation.LocalisationServiceImpl; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAO; -import ru.otus.mkulikov.services.questions.dao.QuestionsDAOImpl; +import ru.otus.mkulikov.app.services.AppTestConfig; +import ru.otus.mkulikov.app.config.LocaleProperties; +import ru.otus.mkulikov.app.config.QuetionsProperties; +import ru.otus.mkulikov.app.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.app.models.Question; +import ru.otus.mkulikov.app.services.localisation.LocalisationServiceImpl; +import ru.otus.mkulikov.app.services.questions.dao.QuestionsDAO; +import ru.otus.mkulikov.app.services.questions.dao.QuestionsDAOImpl; import java.util.List; @@ -28,7 +29,7 @@ @DisplayName("Класс QuestionsDAO") @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = AppTestConfig.class) @ActiveProfiles("ru") class QuestionsDAOTest { From 4aa4125b04edb98c47b458778bf9bf306e4733fc Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sun, 26 May 2019 22:56:00 +0300 Subject: [PATCH 25/25] =?UTF-8?q?-=20=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=D0=BB=20=D0=BF=D0=BE=20=D0=BF=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D1=82=D0=B8=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D0=B2=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4.=20-=20=D0=A0?= =?UTF-8?q?=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20startTest=20=D0=B8=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20@ShellMethodAvailability.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++ .../services/processor/ProcessorService.java | 2 + .../processor/ProcessorServiceImpl.java | 6 ++- .../questions/QuestionsServiceImpl.java | 40 ++++++++++--------- .../registration/RegistrationService.java | 2 + .../registration/RegistrationServiceImpl.java | 29 +++++++++++++- .../java/ru/otus/mkulikov/shell/Commands.java | 18 +++++++++ src/main/resources/i18n/bundle_en.properties | 1 + src/main/resources/i18n/bundle_ru.properties | 1 + 9 files changed, 83 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 7cac160..becb362 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,7 @@ - Перевести приложение для проведения опросов на Spring Shell. - Подключить Spring Shell, используя starter. - Написать юнит-тесты и использовать spring-boot-test-starter. + +### 19-05-26 Доработки: +- Функционал по печати результатов вынесен в отдельный метод. +- Разделение функционала метода startTest и использование @ShellMethodAvailability. \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorService.java b/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorService.java index 074c5af..c599db8 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorService.java +++ b/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorService.java @@ -9,5 +9,7 @@ public interface ProcessorService { + boolean registry(String userName, String userSurname); + void startTest(); } diff --git a/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorServiceImpl.java index 0a554ad..4776767 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/processor/ProcessorServiceImpl.java @@ -22,9 +22,13 @@ public ProcessorServiceImpl(QuestionsService questionsService, RegistrationServi this.registration = registration; } + @Override + public boolean registry(String userName, String userSurname) { + return registration.addNewUser(userName, userSurname); + } + @Override public void startTest() { - registration.addNewUser(); questionsService.showQuestions(); } } diff --git a/src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsServiceImpl.java index 3601ea3..3efa3b6 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/questions/QuestionsServiceImpl.java @@ -39,24 +39,7 @@ public void showQuestions() throws QuestionsFileLoadingException { List questions = questionsDAO.getQuestions(); for (Question question : questions) { - consoleService.write(question.getQuestion()); - consoleService.write(question.getAnswer1()); - consoleService.write(question.getAnswer2()); - consoleService.write(question.getAnswer3()); - consoleService.write(question.getAnswer4()); - - String answer = null; - boolean isOkAnswer = false; - int i = 0; - while (!isOkAnswer && i < 4) { - consoleService.write(localisationService.getValue("enter.answer")); - answer = consoleService.read(); - isOkAnswer = answerNumbers.contains(answer) && !answer.isEmpty(); - i++; - } - - question.setUserAnswer((!isOkAnswer && i == 4) ? "0" : answer); - consoleService.write(c_delimeter); + printQuestion(question); } long count = questions.stream() @@ -71,4 +54,25 @@ public void showQuestions() throws QuestionsFileLoadingException { ); consoleService.write(c_delimeter); } + + private void printQuestion(Question question) { + consoleService.write(question.getQuestion()); + consoleService.write(question.getAnswer1()); + consoleService.write(question.getAnswer2()); + consoleService.write(question.getAnswer3()); + consoleService.write(question.getAnswer4()); + + String answer = null; + boolean isOkAnswer = false; + int i = 0; + while (!isOkAnswer && i < 4) { + consoleService.write(localisationService.getValue("enter.answer")); + answer = consoleService.read(); + isOkAnswer = answerNumbers.contains(answer) && !answer.isEmpty(); + i++; + } + + question.setUserAnswer((!isOkAnswer && i == 4) ? "0" : answer); + consoleService.write(c_delimeter); + } } diff --git a/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationService.java b/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationService.java index 476d17b..a755341 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationService.java +++ b/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationService.java @@ -10,4 +10,6 @@ public interface RegistrationService { void addNewUser(); + + boolean addNewUser(String userName, String userSurname); } diff --git a/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationServiceImpl.java index e04e940..ab5ff3e 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/registration/RegistrationServiceImpl.java @@ -32,7 +32,34 @@ public void addNewUser() { consoleService.write(localisationService.getValue("enter.your.name")); String name = consoleService.read(); - User user = new User(name, surname); + checkUser(new User(name, surname)); + } + + @Override + public boolean addNewUser(String userName, String userSurname) { + return checkUser(new User(userName, userSurname)); + } + + private boolean checkUser(User user) { + String name = user.getName().replace(" ", ""); + String surname = user.getSurname().replace(" ", ""); + + if (name != null && !name.isEmpty() && surname != null && !surname.isEmpty()) { + greetingUser(new User(name, surname)); + return true; + } else { + wrongUser(); + return false; + } + } + + private void wrongUser() { + consoleService.write( + localisationService.getValue("hello.user.fail") + ); + } + + private void greetingUser(User user) { consoleService.write( localisationService.getValueWithParams("hello.user", new String[] {user.getName(), user.getSurname()}) ); diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java index 16c9f70..0bc4179 100644 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -1,7 +1,9 @@ package ru.otus.mkulikov.shell; +import org.springframework.shell.Availability; import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; +import org.springframework.shell.standard.ShellMethodAvailability; import ru.otus.mkulikov.app.exceptions.QuestionsFileLoadingException; import ru.otus.mkulikov.app.services.processor.ProcessorService; @@ -15,13 +17,24 @@ @ShellComponent public class Commands { + private boolean isCheckIn = false; private ProcessorService processor; public Commands(ProcessorService processor) { this.processor = processor; } + @ShellMethod(key = { "registry" }, value = "User registration") + public void registry(String userName, String userSurname) { + try { + isCheckIn = processor.registry(userName, userSurname); + } catch (QuestionsFileLoadingException e) { + e.printStackTrace(); + } + } + @ShellMethod(key = { "startTest" }, value = "Start test") + @ShellMethodAvailability({"checkRegistry"}) public void startTest() { try { processor.startTest(); @@ -29,4 +42,9 @@ public void startTest() { e.printStackTrace(); } } + + public Availability checkRegistry() { + String message = "you are not registered"; + return isCheckIn ? Availability.available() : Availability.unavailable(message); + } } diff --git a/src/main/resources/i18n/bundle_en.properties b/src/main/resources/i18n/bundle_en.properties index 9907680..8e8b77a 100644 --- a/src/main/resources/i18n/bundle_en.properties +++ b/src/main/resources/i18n/bundle_en.properties @@ -4,6 +4,7 @@ enter.your.data=Enter your data enter.your.name=Name: enter.your.surname=Surname: hello.user=Hello, {0} {1}! +hello.user.fail=Registration failed! questions.encoding.error=File encoding error! questions.find.error.filename=File named {0} not found! questions.io.error=Error I/O when working with a file! diff --git a/src/main/resources/i18n/bundle_ru.properties b/src/main/resources/i18n/bundle_ru.properties index 5ff9c0a..a48e2bc 100644 --- a/src/main/resources/i18n/bundle_ru.properties +++ b/src/main/resources/i18n/bundle_ru.properties @@ -4,6 +4,7 @@ enter.your.data=Введите свои данные enter.your.name=Имя: enter.your.surname=Фамилия: hello.user=Здравствуйте, {0} {1}! +hello.user.fail=Ошибка регистрации! questions.encoding.error=Ошибка кодировки файла! questions.find.error.filename=Файл с именем {0} не найден! questions.io.error=Ошибка ввода/вывода при работе с файлом!