+
+
@@ -69,5 +101,18 @@
-
+
+<%@include file="parts/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/head.jsp b/src/main/webapp/WEB-INF/head.jsp
index 2f7b9f2..fb94bc7 100644
--- a/src/main/webapp/WEB-INF/head.jsp
+++ b/src/main/webapp/WEB-INF/head.jsp
@@ -2,9 +2,13 @@
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-
Title
+
+
+
Pantera
+
+
diff --git a/src/main/webapp/WEB-INF/home.jsp b/src/main/webapp/WEB-INF/home.jsp
new file mode 100644
index 0000000..952e4b7
--- /dev/null
+++ b/src/main/webapp/WEB-INF/home.jsp
@@ -0,0 +1,28 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@include file="parts/header.jsp" %>
+
+
+<%@include file="parts/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/images/question-1.jpg b/src/main/webapp/WEB-INF/images/question-1.jpg
new file mode 100644
index 0000000..642b43c
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-1.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-11.jpg b/src/main/webapp/WEB-INF/images/question-11.jpg
new file mode 100644
index 0000000..297b906
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-11.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-12.jpg b/src/main/webapp/WEB-INF/images/question-12.jpg
new file mode 100644
index 0000000..8b9f14b
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-12.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-13.jpg b/src/main/webapp/WEB-INF/images/question-13.jpg
new file mode 100644
index 0000000..e6df4c8
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-13.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-14.jpg b/src/main/webapp/WEB-INF/images/question-14.jpg
new file mode 100644
index 0000000..5d8504a
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-14.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-15.jpg b/src/main/webapp/WEB-INF/images/question-15.jpg
new file mode 100644
index 0000000..b7e28fb
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-15.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-16.jpeg b/src/main/webapp/WEB-INF/images/question-16.jpeg
new file mode 100644
index 0000000..3fbd696
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-16.jpeg differ
diff --git a/src/main/webapp/WEB-INF/images/question-17.jpg b/src/main/webapp/WEB-INF/images/question-17.jpg
new file mode 100644
index 0000000..6bc7051
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-17.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-18.jpg b/src/main/webapp/WEB-INF/images/question-18.jpg
new file mode 100644
index 0000000..5536c49
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-18.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-2.jpg b/src/main/webapp/WEB-INF/images/question-2.jpg
new file mode 100644
index 0000000..e35ecb9
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-2.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-20.jpg b/src/main/webapp/WEB-INF/images/question-20.jpg
new file mode 100644
index 0000000..4a58892
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-20.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-21.jpg b/src/main/webapp/WEB-INF/images/question-21.jpg
new file mode 100644
index 0000000..1d3334e
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-21.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-3.jpg b/src/main/webapp/WEB-INF/images/question-3.jpg
new file mode 100644
index 0000000..5bd1148
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-3.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-4.jpg b/src/main/webapp/WEB-INF/images/question-4.jpg
new file mode 100644
index 0000000..5f2b854
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-4.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-5.jpg b/src/main/webapp/WEB-INF/images/question-5.jpg
new file mode 100644
index 0000000..5f2b854
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-5.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-6.jpg b/src/main/webapp/WEB-INF/images/question-6.jpg
new file mode 100644
index 0000000..5f2b854
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-6.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-7.jpg b/src/main/webapp/WEB-INF/images/question-7.jpg
new file mode 100644
index 0000000..c56f283
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-7.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-8.jpg b/src/main/webapp/WEB-INF/images/question-8.jpg
new file mode 100644
index 0000000..c56f283
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-8.jpg differ
diff --git a/src/main/webapp/WEB-INF/images/question-9.jpg b/src/main/webapp/WEB-INF/images/question-9.jpg
new file mode 100644
index 0000000..5f2b854
Binary files /dev/null and b/src/main/webapp/WEB-INF/images/question-9.jpg differ
diff --git a/src/main/webapp/WEB-INF/img/female.png b/src/main/webapp/WEB-INF/img/female.png
new file mode 100644
index 0000000..63881db
Binary files /dev/null and b/src/main/webapp/WEB-INF/img/female.png differ
diff --git a/src/main/webapp/WEB-INF/img/male.png b/src/main/webapp/WEB-INF/img/male.png
new file mode 100644
index 0000000..3b54b90
Binary files /dev/null and b/src/main/webapp/WEB-INF/img/male.png differ
diff --git a/src/main/webapp/WEB-INF/img/no-image.png b/src/main/webapp/WEB-INF/img/no-image.png
new file mode 100644
index 0000000..0c32da0
Binary files /dev/null and b/src/main/webapp/WEB-INF/img/no-image.png differ
diff --git a/src/main/webapp/WEB-INF/list-user.jsp b/src/main/webapp/WEB-INF/list-user.jsp
index dd52c55..5500433 100644
--- a/src/main/webapp/WEB-INF/list-user.jsp
+++ b/src/main/webapp/WEB-INF/list-user.jsp
@@ -1,9 +1,17 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@include file="head.jsp"%>
-
-
- ${user.login}
-
-
-
+<%@include file="parts/header.jsp"%>
+
+<%@include file="parts/footer.jsp"%>
diff --git a/src/main/webapp/WEB-INF/login.jsp b/src/main/webapp/WEB-INF/login.jsp
new file mode 100644
index 0000000..eb74fb5
--- /dev/null
+++ b/src/main/webapp/WEB-INF/login.jsp
@@ -0,0 +1,30 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@include file="parts/header.jsp" %>
+
+
+
+
+
Login
+
Enter your login details
+
+
+
+
+
+<%@include file="parts/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/parts/footer.jsp b/src/main/webapp/WEB-INF/parts/footer.jsp
new file mode 100644
index 0000000..decc85c
--- /dev/null
+++ b/src/main/webapp/WEB-INF/parts/footer.jsp
@@ -0,0 +1,41 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/parts/header.jsp b/src/main/webapp/WEB-INF/parts/header.jsp
new file mode 100644
index 0000000..6aa4dbc
--- /dev/null
+++ b/src/main/webapp/WEB-INF/parts/header.jsp
@@ -0,0 +1,52 @@
+<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+
+
+
+
+
+
+
Pantera
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/parts/quest-demo.jsp b/src/main/webapp/WEB-INF/parts/quest-demo.jsp
new file mode 100644
index 0000000..db1751b
--- /dev/null
+++ b/src/main/webapp/WEB-INF/parts/quest-demo.jsp
@@ -0,0 +1,23 @@
+<%@ page contentType="text/html;charset=UTF-8"
+%>
+Тут введите структуру вашего квеста в формате
+[Метка]: Вопрос, где [Метка] - это уникальный числовой номер вопроса
+[Метка]< Ответ, где [Метка] - номер, куда перейти при выборе этого ответа
+[Метка]+ Сообщение о победе, где [Метка] - это уникальный номер сообщения
+[Метка]- Сообщение о поражении, где [Метка] - это уникальный номер сообщения
+
+Пример:
+
+Отгадаете загадку?
+2< Да, конечно
+99< А что это такое?
+
+2: Без рук, без ног, а рисовать умеет?
+99< Художник
+99< Дождь
+99< Ветер
+100< Мороз
+
+99- Вы проиграли
+
+100+ Вы выиграли
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/parts/quest-jru.txt b/src/main/webapp/WEB-INF/parts/quest-jru.txt
new file mode 100644
index 0000000..72c56c3
--- /dev/null
+++ b/src/main/webapp/WEB-INF/parts/quest-jru.txt
@@ -0,0 +1,16 @@
+<%@ page contentType="text/html;charset=UTF-8"%>02< Принять вызов
+91< Отклонить вызов
+
+02: Ты принял вызов. Подняться на мостик к капитану?
+92< Отказаться подниматься на мостик
+03< Подняться на мостик
+
+03: Ты поднялся на мостик. Ты кто?
+93< Солгать о себе
+99< Рассказать правду
+
+91- Ты отклонил вызов. Поражение.
+92- Ты не пошел на переговоры. Поражение.
+93- Твою ложь разоблачили. Поражение.
+
+99+ Вы выиграли
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/parts/quest.txt b/src/main/webapp/WEB-INF/parts/quest.txt
new file mode 100644
index 0000000..4f6e10b
--- /dev/null
+++ b/src/main/webapp/WEB-INF/parts/quest.txt
@@ -0,0 +1,13 @@
+<%@ page contentType="text/html;charset=UTF-8"%>1: Отгадаете загадку?
+2< Да, конечно
+99< А что это такое?
+
+2: Без рук, без ног, а рисовать умеет?
+99< Художник
+99< Дождь
+99< Ветер
+100< Мороз
+
+99- Вы проиграли
+
+100+ Вы выиграли
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/play-game.jsp b/src/main/webapp/WEB-INF/play-game.jsp
new file mode 100644
index 0000000..b35f54a
--- /dev/null
+++ b/src/main/webapp/WEB-INF/play-game.jsp
@@ -0,0 +1,53 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ page contentType="text/html;charset=UTF-8" %>
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
diff --git a/src/main/webapp/WEB-INF/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp
new file mode 100644
index 0000000..dbd52d9
--- /dev/null
+++ b/src/main/webapp/WEB-INF/profile.jsp
@@ -0,0 +1,27 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ page contentType="text/html;charset=UTF-8" %>
+
+
+
+
+
+
+
+
User login: ${user.login}
+
User role: ${user.role}
+
+
+
+
+
diff --git a/src/main/webapp/WEB-INF/quest.jsp b/src/main/webapp/WEB-INF/quest.jsp
new file mode 100644
index 0000000..41cd1bd
--- /dev/null
+++ b/src/main/webapp/WEB-INF/quest.jsp
@@ -0,0 +1,24 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ page contentType="text/html;charset=UTF-8" %>
+
+
+
+
${requestScope.quest.name}
+
+
+
+
+
+
+
diff --git a/src/main/webapp/WEB-INF/signup.jsp b/src/main/webapp/WEB-INF/signup.jsp
new file mode 100644
index 0000000..34e399d
--- /dev/null
+++ b/src/main/webapp/WEB-INF/signup.jsp
@@ -0,0 +1,56 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@include file="parts/header.jsp" %>
+
+<%@include file="parts/footer.jsp" %>
diff --git a/src/main/webapp/WEB-INF/start-page.jsp b/src/main/webapp/WEB-INF/start-page.jsp
index 0531c1c..fb8a579 100644
--- a/src/main/webapp/WEB-INF/start-page.jsp
+++ b/src/main/webapp/WEB-INF/start-page.jsp
@@ -1,8 +1,7 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-<%@include file="head.jsp"%>
-
-
<%= "Hello World!" %>
-
-
-
List Users
-
+<%@include file="parts/header.jsp"%>
+
+
<%= "This is your best quest begins!" %>
+
List Users
+
+<%@include file="parts/footer.jsp"%>
diff --git a/src/main/webapp/WEB-INF/statistics.jsp b/src/main/webapp/WEB-INF/statistics.jsp
new file mode 100644
index 0000000..f001422
--- /dev/null
+++ b/src/main/webapp/WEB-INF/statistics.jsp
@@ -0,0 +1,47 @@
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ page contentType="text/html;charset=UTF-8" %>
+
+
+
+
Статистика
+
+
+
+
+ | Логин |
+ В процессе |
+ Победа |
+ Поражение |
+ Всего |
+
+
+
+
+
+ | ${stat.login} |
+ ${stat.play} |
+ ${stat.win} |
+ ${stat.lost} |
+ ${stat.total} |
+
+
+
+ |
+ |
+ |
+ |
+ |
+
+
+
+ | ${all.login} |
+ ${all.play} |
+ ${all.win} |
+ ${all.lost} |
+ ${all.total} |
+
+
+
+
+
+
diff --git a/src/main/webapp/assets/css/custom.css b/src/main/webapp/assets/css/custom.css
new file mode 100644
index 0000000..b16cbf8
--- /dev/null
+++ b/src/main/webapp/assets/css/custom.css
@@ -0,0 +1,132 @@
+/* Motorcycle theme accents */
+:root {
+ --bs-primary: #e76f51;
+ --bs-primary-rgb: 231, 111, 81;
+ --bs-link-color: #f4a261;
+ --bs-link-hover-color: #ffd166;
+}
+
+body {
+ min-height: 100vh;
+ color: #e9ecef;
+ background-color: #1b1e23;
+ background-repeat: no-repeat;
+ background-position: center calc(50% - 200px);
+ background-attachment: fixed;
+ background-size: cover;
+ font-size: 1.15rem;
+ font-weight: 600;
+}
+
+.navbar.bg-secondary,
+footer.bg-secondary {
+ background-color: rgba(35, 40, 46, 0.85) !important;
+}
+
+.hero-title {
+ color: #000000;
+ font-size: 3.5rem;
+ font-weight: 700;
+ -webkit-text-stroke: 1px #ffffff;
+ text-shadow: 0 0 1px rgba(0, 0, 0, 0.25);
+}
+
+.navbar,
+.nav-link,
+.btn,
+.list-group-item,
+body {
+ font-weight: 600;
+}
+
+.list-group-item,
+.list-group-item a,
+.list-group-item a:visited,
+.list-group-item a:hover,
+.list-group-item a:active,
+.list-group-item a:focus {
+ font-size: 1.25rem;
+ font-weight: 700;
+ color: #ffffff !important;
+ -webkit-text-stroke: 0;
+ text-shadow: none;
+}
+
+.page-title {
+ font-weight: 800;
+ color: #ffffff !important;
+ -webkit-text-stroke: 0;
+ text-shadow: none;
+ font-size: 2rem;
+}
+
+.content-panel {
+ background-color: rgba(0, 0, 0, 0.55);
+ border-radius: 12px;
+ padding: 1.25rem 1.5rem;
+}
+
+.content-panel p {
+ font-weight: 700;
+ color: #ffffff !important;
+ -webkit-text-stroke: 1px #000000;
+ text-shadow: 0 0 2px rgba(0, 0, 0, 0.6);
+}
+
+label,
+.form-label,
+.col-form-label,
+legend,
+.form-text {
+ color: #ffffff !important;
+ font-weight: 700 !important;
+ -webkit-text-stroke: 0.5px #000000 !important;
+ text-shadow: 0 0 2px rgba(0, 0, 0, 0.6) !important;
+}
+
+.user-row {
+ display: flex;
+ align-items: center;
+ gap: 0.75rem;
+}
+
+.user-avatar {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ object-fit: cover;
+ border: 2px solid rgba(255, 255, 255, 0.7);
+}
+.list-group {
+ background-color: transparent;
+}
+
+.list-group-item {
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+}
+
+.list-group-item + .list-group-item {
+ border-top: 0;
+}
+
+.page-title {
+ font-weight: 800;
+}
+
+.question-text-bg {
+ display: inline-block;
+ background-color: rgba(33, 37, 41, 0.85);
+ color: #f1f3f5;
+ padding: 0.25rem 0.5rem;
+ border-radius: 0.35rem;
+}
+
+.quest-text-bg {
+ display: inline-block;
+ background-color: rgba(33, 37, 41, 0.85);
+ color: #f1f3f5;
+ padding: 0.2rem 0.45rem;
+ border-radius: 0.35rem;
+}
diff --git a/src/main/webapp/assets/css/styles.min.css b/src/main/webapp/assets/css/styles.min.css
new file mode 100644
index 0000000..320a7ad
--- /dev/null
+++ b/src/main/webapp/assets/css/styles.min.css
@@ -0,0 +1 @@
+.fit-cover{object-fit:cover}.bs-icon{--bs-icon-size:.75rem;display:flex;flex-shrink:0;justify-content:center;align-items:center;font-size:var(--bs-icon-size);width:calc(var(--bs-icon-size) * 2);height:calc(var(--bs-icon-size) * 2);color:var(--bs-primary)}.bs-icon-xs{--bs-icon-size:1rem;width:calc(var(--bs-icon-size) * 1.5);height:calc(var(--bs-icon-size) * 1.5)}.bs-icon-sm{--bs-icon-size:1rem}.bs-icon-md{--bs-icon-size:1.5rem}.bs-icon-lg{--bs-icon-size:2rem}.bs-icon-xl{--bs-icon-size:2.5rem}.bs-icon.bs-icon-primary{color:var(--bs-white);background:var(--bs-primary)}.bs-icon.bs-icon-primary-light{color:var(--bs-primary);background:rgba(var(--bs-primary-rgb),.2)}.bs-icon.bs-icon-semi-white{color:var(--bs-primary);background:rgba(255,255,255,.5)}.bs-icon.bs-icon-rounded{border-radius:.5rem}.bs-icon.bs-icon-circle{border-radius:50%}
\ No newline at end of file
diff --git a/src/main/webapp/images/background-wallpaper.png b/src/main/webapp/images/background-wallpaper.png
new file mode 100644
index 0000000..7d1216b
Binary files /dev/null and b/src/main/webapp/images/background-wallpaper.png differ
diff --git a/src/main/webapp/images/cat.png b/src/main/webapp/images/cat.png
deleted file mode 100644
index 41771a1..0000000
Binary files a/src/main/webapp/images/cat.png and /dev/null differ
diff --git a/src/main/webapp/images/no-image.png b/src/main/webapp/images/no-image.png
new file mode 100644
index 0000000..0c32da0
Binary files /dev/null and b/src/main/webapp/images/no-image.png differ
diff --git a/src/test/java/com/javarush/popkov/BaseIT.java b/src/test/java/com/javarush/popkov/BaseIT.java
new file mode 100644
index 0000000..9dc4ecf
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/BaseIT.java
@@ -0,0 +1,60 @@
+package com.javarush.popkov;
+
+import com.javarush.popkov.config.Config;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.entity.Role;
+import com.javarush.popkov.entity.User;
+import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpSession;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class BaseIT {
+ protected final HttpServletRequest request;
+ protected final HttpServletResponse response;
+ protected final HttpSession session;
+ protected final Config config;
+ protected final ServletConfig servletConfig;
+ protected final ServletContext servletContext;
+ protected User testAdmin;
+ protected User testUser;
+ protected User testGuest;
+
+ protected BaseIT() {
+ //app config
+ config = Winter.find(Config.class);
+ config.fillEmptyRepository();
+ //servlet config
+ servletConfig = mock(ServletConfig.class);
+ servletContext = mock(ServletContext.class);
+ when(servletConfig.getServletContext()).thenReturn(servletContext);
+ //current op
+ request = mock(HttpServletRequest.class);
+ response = mock(HttpServletResponse.class);
+ session = mock(HttpSession.class);
+ when(request.getSession()).thenReturn(session);
+ //test data
+ testAdmin = User.builder()
+ .id(1L)
+ .login("testAdmin")
+ .password("testAdmin")
+ .role(Role.ADMIN)
+ .build();
+ testUser = User.builder()
+ .id(2L)
+ .login("testUser")
+ .password("testUser")
+ .role(Role.USER)
+ .build();
+ testGuest = User.builder()
+ .id(3L)
+ .login("testGuest")
+ .password("testGuest")
+ .role(Role.USER)
+ .build();
+ }
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/CreateQuestIT.java b/src/test/java/com/javarush/popkov/cmd/CreateQuestIT.java
new file mode 100644
index 0000000..bbdae97
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/CreateQuestIT.java
@@ -0,0 +1,33 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.entity.Role;
+import com.javarush.popkov.entity.User;
+import com.javarush.popkov.service.QuestService;
+import com.javarush.popkov.util.Go;
+import com.javarush.popkov.util.Key;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.when;
+
+class CreateQuestIT extends BaseIT {
+
+ private final CreateQuest createQuest = Winter.find(CreateQuest.class);
+ private final QuestService questService = Winter.find(QuestService.class);
+
+
+ @Test
+ void whenCreateQuest_thenQuestsCountIncreaseByOne() {
+ User admin = User.builder().id(1L).role(Role.ADMIN).build();
+ when(session.getAttribute(Key.USER)).thenReturn(admin);
+ when(request.getParameter(Key.NAME)).thenReturn("TestQuest");
+ when(request.getParameter(Key.TEXT)).thenReturn("1: Test OK?\n2< Да\n3< Нет\n2+ win\n3- lost\n");
+
+ int count = questService.getAll().size();
+ assertEquals(Go.HOME, createQuest.doPost(request));
+ assertEquals(count + 1, questService.getAll().size());
+ }
+
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/EditUserIT.java b/src/test/java/com/javarush/popkov/cmd/EditUserIT.java
new file mode 100644
index 0000000..c88a256
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/EditUserIT.java
@@ -0,0 +1,40 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.entity.Role;
+import com.javarush.popkov.entity.User;
+import com.javarush.popkov.service.UserService;
+import com.javarush.popkov.util.Key;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+
+class EditUserIT extends BaseIT {
+
+ private final EditUser editUser = Winter.find(EditUser.class);
+ private final UserService userService = Winter.find(UserService.class);
+
+ @Test
+ void whenOpenPage_thenCommandReturnJspPage() {
+ User user = userService.getAll().stream().findFirst().orElseThrow();
+ Mockito.when(request.getParameter(Key.ID)).thenReturn(user.getId().toString());
+ String view = editUser.doGet(request);
+ assertEquals("edit-user", view);
+ verify(request).setAttribute(eq(Key.USER), eq(user));
+ }
+
+ @Test
+ void whenUpdateUser_thenGetPageByUserId() throws Exception {
+ Mockito.when(request.getParameter(Key.LOGIN)).thenReturn("TestName");
+ Mockito.when(request.getParameter(Key.PASSWORD)).thenReturn("TestPassword");
+ Mockito.when(request.getParameter(Key.ROLE)).thenReturn(Role.GUEST.toString());
+ Mockito.when(request.getParameter(Key.ID)).thenReturn("1");
+ String page = editUser.doPost(request);
+ assertTrue(page.endsWith("?id=1"));
+ }
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/HomeIT.java b/src/test/java/com/javarush/popkov/cmd/HomeIT.java
new file mode 100644
index 0000000..fdf3c3f
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/HomeIT.java
@@ -0,0 +1,23 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.util.Key;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collection;
+
+import static org.mockito.Mockito.*;
+
+class HomeIT extends BaseIT {
+
+
+ @Test
+ void whenOpenPage_thenCommandReturnJspPage() {
+ Home home = Winter.find(Home.class);
+ String view = home.doGet(request);
+ Assertions.assertEquals("home", view);
+ verify(request).setAttribute(eq(Key.QUESTS), any(Collection.class));
+ }
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/ListUserIT.java b/src/test/java/com/javarush/popkov/cmd/ListUserIT.java
new file mode 100644
index 0000000..6a2b26d
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/ListUserIT.java
@@ -0,0 +1,24 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.util.Key;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collection;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+class ListUserIT extends BaseIT {
+
+ ListUser listUser = Winter.find(ListUser.class);
+
+ @Test
+ void whenGetListUsers_thenReturnJspPage() {
+ String jspPage = listUser.doGet(request);
+
+ assertEquals("list-user", jspPage);
+ verify(request).setAttribute(eq(Key.USERS), any(Collection.class));
+ }
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/LoginIT.java b/src/test/java/com/javarush/popkov/cmd/LoginIT.java
new file mode 100644
index 0000000..6a4cac3
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/LoginIT.java
@@ -0,0 +1,42 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.entity.User;
+import com.javarush.popkov.service.UserService;
+import com.javarush.popkov.util.Key;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+import static org.mockito.Mockito.*;
+
+class LoginIT extends BaseIT {
+
+ final Login login = Winter.find(Login.class);
+ final UserService userService = Winter.find(UserService.class);
+
+ @Test
+ @DisplayName("When login admin then redirect to profile")
+ void whenLoginAdminThenRedirectToProfile() {
+ User user = userService.getAll().stream().findFirst().orElseThrow();
+ when(request.getParameter("login")).thenReturn(user.getLogin());
+ when(request.getParameter("password")).thenReturn(user.getPassword());
+
+ String actualRedirect = login.doPost(request);
+ Assertions.assertEquals("/profile", actualRedirect);
+
+ verify(session)
+ .setAttribute(eq(Key.USER), any(User.class));
+ }
+
+ @Test
+ @DisplayName("When incorrect login then redirect to login")
+ void whenIncorrectLoginThenRedirectToLogin() {
+ when(request.getParameter("login")).thenReturn("Carl");
+ when(request.getParameter("password")).thenReturn("err");
+
+ String actualRedirect = login.doPost(request);
+ Assertions.assertEquals("/login", actualRedirect);
+ }
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/LogoutIT.java b/src/test/java/com/javarush/popkov/cmd/LogoutIT.java
new file mode 100644
index 0000000..4b7ac0c
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/LogoutIT.java
@@ -0,0 +1,18 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+class LogoutIT extends BaseIT {
+
+ private final Logout logout = Winter.find(Logout.class);
+
+ @Test
+ void whenOpenPage_thenInvalidateSession() {
+ logout.doGet(request);
+ Mockito.verify(session).invalidate();
+ }
+
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/PlayGameIT.java b/src/test/java/com/javarush/popkov/cmd/PlayGameIT.java
new file mode 100644
index 0000000..2e263a0
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/PlayGameIT.java
@@ -0,0 +1,28 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.entity.Game;
+import com.javarush.popkov.entity.Question;
+import com.javarush.popkov.util.Key;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.*;
+
+class PlayGameIT extends BaseIT {
+
+ private final PlayGame playGame = Winter.find(PlayGame.class);
+
+ @Test
+ void whenStartGame_thenSetGameAndQuestionInRequest() {
+ when(session.getAttribute(Key.USER)).thenReturn(testUser);
+ when(request.getParameter(Key.QUEST_ID)).thenReturn("1");
+ String jspPage = playGame.doGet(request);
+
+ assertEquals("play-game", jspPage);
+ verify(request).setAttribute(eq(Key.GAME), any(Game.class));
+ verify(request).setAttribute(eq(Key.QUESTION), any(Question.class));
+ }
+
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/ProfileIT.java b/src/test/java/com/javarush/popkov/cmd/ProfileIT.java
new file mode 100644
index 0000000..e385760
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/ProfileIT.java
@@ -0,0 +1,28 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.util.Go;
+import com.javarush.popkov.util.Key;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+class ProfileIT extends BaseIT {
+
+ private final Profile profile = Winter.find(Profile.class);
+
+ @Test
+ void whenClickEditInProfile_thenGoToEditUserPage() {
+ Mockito.when(session.getAttribute(Key.USER)).thenReturn(testUser);
+ String uri = profile.doPost(request);
+ Assertions.assertEquals(Go.EDIT_USER + "?id=" + testUser.getId(), uri);
+ }
+
+ @Test
+ void whenClickLogout_thenGoLogout() {
+ Mockito.when(request.getParameter(Key.LOGOUT)).thenReturn("true");
+ String uri = profile.doPost(request);
+ Assertions.assertEquals(Go.LOGOUT, uri);
+ }
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/QuestIT.java b/src/test/java/com/javarush/popkov/cmd/QuestIT.java
new file mode 100644
index 0000000..a08d2f6
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/QuestIT.java
@@ -0,0 +1,48 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.util.Go;
+import com.javarush.popkov.util.Key;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+class QuestIT extends BaseIT {
+
+ private final Quest quest = Winter.find(Quest.class);
+
+ @Test
+ void whenOpenQuestPageWithCorrectId_thenGetJsp() {
+ Mockito.when(request.getParameter(Key.ID)).thenReturn("1");
+ String jsp = quest.doGet(request);
+ Assertions.assertEquals("quest", jsp);
+ }
+
+ @Test
+ void whenAnonymousPostQuest_thenRedirectBackward() {
+ Mockito.when(request.getParameter(Key.ID)).thenReturn("1");
+ String uri = quest.doPost(request);
+ Assertions.assertEquals(Go.QUEST, uri);
+ }
+
+ @Test
+ void whenNonAdminPostQuest_thenRedirectBackward() {
+ Mockito.when(session.getAttribute(Key.USER)).thenReturn(testGuest);
+ Mockito.when(request.getParameter(Key.ID)).thenReturn("1");
+ String uri = quest.doPost(request);
+ Assertions.assertEquals(Go.QUEST, uri);
+ }
+
+ @Test
+ void whenAdminPostQuest_thenRedirectBackward() {
+ Mockito.when(session.getAttribute(Key.USER)).thenReturn(testAdmin);
+ Mockito.when(request.getParameter(Key.ID)).thenReturn("1");
+ Mockito.when(request.getParameter(Key.QUEST_ID)).thenReturn("1");
+ Mockito.when(request.getParameter(Key.QUESTION_ID)).thenReturn("1");
+ Mockito.when(request.getParameter(Key.TEXT)).thenReturn("newTestTextQuestion");
+ String actualUri = quest.doPost(request);
+ String expectedUri = "%s?id=%d#bookmark%d".formatted(Go.QUEST, 1, 1);
+ Assertions.assertEquals(expectedUri, actualUri);
+ }
+}
diff --git a/src/test/java/com/javarush/popkov/cmd/SignupIT.java b/src/test/java/com/javarush/popkov/cmd/SignupIT.java
new file mode 100644
index 0000000..d65a3ca
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/cmd/SignupIT.java
@@ -0,0 +1,30 @@
+package com.javarush.popkov.cmd;
+
+import com.javarush.popkov.BaseIT;
+import com.javarush.popkov.config.Winter;
+import com.javarush.popkov.repository.UserRepository;
+import com.javarush.popkov.util.Go;
+import com.javarush.popkov.util.Key;
+import jakarta.servlet.ServletException;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import java.io.IOException;
+
+class SignupIT extends BaseIT {
+
+ private final Signup signup = Winter.find(Signup.class);
+ private final UserRepository repository = Winter.find(UserRepository.class);
+
+ @Test
+ void doPost() {
+ Mockito.when(request.getParameter(Key.LOGIN)).thenReturn("newTestLogin");
+ Mockito.when(request.getParameter(Key.PASSWORD)).thenReturn("newTestPassword");
+ Mockito.when(request.getParameter(Key.ROLE)).thenReturn("GUEST");
+
+ String uri = signup.doPost(request);
+ Assertions.assertEquals(Go.PROFILE, uri);
+ Assertions.assertTrue(repository.getAll().toString().contains("newTestLogin"));
+ }
+}
diff --git a/src/test/java/com/javarush/popkov/controller/FrontControllerIT.java b/src/test/java/com/javarush/popkov/controller/FrontControllerIT.java
new file mode 100644
index 0000000..4e26db6
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/controller/FrontControllerIT.java
@@ -0,0 +1,24 @@
+package com.javarush.popkov.controller;
+
+import com.javarush.popkov.BaseIT;
+import jakarta.servlet.http.HttpServletResponse;
+import org.junit.jupiter.api.Test;
+
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+class FrontControllerIT extends BaseIT {
+
+ @Test
+ void whenFrontSendIncorrectMethod_thenReturn501() throws Exception {
+ FrontController frontController = new FrontController();
+ when(request.getMethod()).thenReturn("IncorrectMethod");
+ frontController.init(servletConfig);
+ when(request.getRequestURI()).thenReturn("/");
+ frontController.service(request, response);
+ verify(response).sendError(eq(HttpServletResponse.SC_NOT_IMPLEMENTED), anyString());
+ }
+
+}
diff --git a/src/test/java/com/javarush/popkov/repository/UserRepositoryTest.java b/src/test/java/com/javarush/popkov/repository/UserRepositoryTest.java
new file mode 100644
index 0000000..311e08d
--- /dev/null
+++ b/src/test/java/com/javarush/popkov/repository/UserRepositoryTest.java
@@ -0,0 +1,52 @@
+package com.javarush.popkov.repository;
+
+import com.javarush.popkov.entity.Role;
+import com.javarush.popkov.entity.User;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+class UserRepositoryTest {
+
+ private final UserRepository userRepository = new UserRepository();
+ private User admin;
+
+ @BeforeEach
+ void createAdmin() {
+ admin = User.builder()
+ .id(1L)
+ .login("testAdmin")
+ .password("testPassword")
+ .role(Role.ADMIN)
+ .build();
+ userRepository.create(admin);
+ }
+
+ @Test
+ void get() {
+ User user = userRepository.get(1L);
+ Assertions.assertEquals(admin, user);
+ }
+
+
+ @Test
+ void find() {
+ User pattern = User.builder().login("testAdmin").build();
+ var userStream = userRepository.find(pattern);
+ Assertions.assertEquals(admin, userStream.findFirst().orElseThrow());
+ }
+
+ @Test
+ void update(){
+ admin.setLogin("newLogin");
+ userRepository.update(admin);
+ User user = userRepository.get(1L);
+ Assertions.assertEquals(admin, user);
+ }
+
+ @Test
+ void delete(){
+ userRepository.delete(admin);
+ Assertions.assertEquals(0, userRepository.getAll().size());
+ }
+}
\ No newline at end of file