diff --git a/.gitignore b/.gitignore index cba2a35..3c599ea 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea target *.iml -*.log \ No newline at end of file +*.log +*.txt diff --git a/README.md b/README.md index 67d4ca0..10840c6 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,20 @@ -# OtusSpringHW -Домашние задания по Spring для Otus. +# OtusSpringHW + +Домашнее задание #1: + +Программа по проведению тестирования студентов +В ресурсах хранятся вопросы и различные ответы к ним в виде CSV файла (5 вопрсов). Программа должна спросить у пользователя фамилию и имя, спросить 5 вопросов из CSV-файла и вывести результат тестирования. + +Все сервисы в программе должны решать строго определённую задачу. Зависимости должны быть настроены в IoC контейнере. + +Опционально: сервисы, по возможности, покрыть тестами. + +### 19-03-18 Доработки: +- Переименованы классы. +- Добавлено исключение QuestionsFileLoadingException. +- Работа с консолью вынесена в сервис ConsoleService. +- Тесты для QuestionsDAO. + +### 19-03-19 Доработки: +- Переименованы классы. +- Добавлены тесты. \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..942e1cb --- /dev/null +++ b/pom.xml @@ -0,0 +1,100 @@ + + + 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 + + + + 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 + + + + org.assertj + assertj-core + 3.11.1 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + ${encoding} + + + + + org.apache.maven.plugins + maven-resources-plugin + + ${encoding} + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.21.0 + + + + + + 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..88e4918 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/Main.java @@ -0,0 +1,27 @@ +package ru.otus.mkulikov; + +import org.springframework.context.support.ClassPathXmlApplicationContext; +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.processor.ProcessorService; + +/** + * 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 { + 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/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/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/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/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/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..626be7a --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/processor/ProcessorServiceImpl.java @@ -0,0 +1,46 @@ +package ru.otus.mkulikov.processor; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; +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 + * Date: 2019-03-14 + * Time: 15:54 + */ + +public class ProcessorServiceImpl implements ProcessorService { + + private QuestionsService questionsService; + private RegistrationService registration; + + public ProcessorServiceImpl(QuestionsService questionsService, RegistrationService registration) { + this.questionsService = questionsService; + this.registration = registration; + } + + @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; + } +} 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/QuestionsDAOImpl.java b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java new file mode 100644 index 0000000..1ec9636 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsDAOImpl.java @@ -0,0 +1,68 @@ +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.exceptions.QuestionsFileLoadingException; +import ru.otus.mkulikov.model.Question; + +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; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:42 + */ + +public class QuestionsDAOImpl implements QuestionsDAO { + + @SuppressWarnings({"rawtypes", "unchecked"}) + private List loadFile(String csvFilename) throws QuestionsFileLoadingException { + if (csvFilename == null) { + throw new QuestionsFileLoadingException("Имя файла не может быть null!"); + } + + List questions = null; + try { + 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); + } catch (URISyntaxException e) { + throw new QuestionsFileLoadingException("Ошибка чтения файла!", e); + } + return questions; + } + + @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(String csvFilename) throws QuestionsFileLoadingException { + return loadFile(csvFilename); + } +} 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..fe5c66d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/questions/QuestionsServiceImpl.java @@ -0,0 +1,83 @@ +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; + +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-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 questionsDAO; + private ConsoleService consoleService; + + public QuestionsServiceImpl(QuestionsDAO questionsDAO, ConsoleService consoleService) { + this.questionsDAO = questionsDAO; + this.consoleService = consoleService; + } + + @Override + public void showQuestions() throws QuestionsFileLoadingException { + getConsoleService().write(c_delimeter); + List questions = getQuestionsDAO().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 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; + } +} 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..f3a68ea --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationService.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.registration; + +import ru.otus.mkulikov.exceptions.QuestionsFileLoadingException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 16:34 + */ + +public interface RegistrationService { + + 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 new file mode 100644 index 0000000..b50d935 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/registration/RegistrationServiceImpl.java @@ -0,0 +1,43 @@ +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 + * Date: 2019-03-14 + * Time: 16:34 + */ + +public class RegistrationServiceImpl implements RegistrationService { + + private ConsoleService consoleService; + + public RegistrationServiceImpl(ConsoleService consoleService) { + this.consoleService = consoleService; + } + + @Override + public void addNewUser() throws QuestionsFileLoadingException { + getConsoleService().write("Введите свои данные"); + getConsoleService().write("Фамилия: "); + String surname = getConsoleService().read(); + + getConsoleService().write("Имя: "); + String name = getConsoleService().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; + } +} diff --git a/src/main/resources/applicationContext.xml b/src/main/resources/applicationContext.xml new file mode 100644 index 0000000..c85fd3c --- /dev/null +++ b/src/main/resources/applicationContext.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + \ 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 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 new file mode 100644 index 0000000..9c68433 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/questions/QuestionsDAOTest.java @@ -0,0 +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.*; + +@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 String c_test1 = "Тест1"; + private final String c_test2 = "Тест2"; + private final String c_test3 = "Тест3"; + + @Test + @DisplayName("Корректная загрузка вопросов") + 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()); + } 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/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 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