From 2dd30d9beef233892aaad55100ff4b7b87e807fe Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 22 Apr 2019 16:08:03 +0300 Subject: [PATCH 01/70] =?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?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +- pom.xml | 164 ++++++++++++++++++ .../java/ru/otus/mkulikov/Application.java | 26 +++ src/main/resources/application.yml | 3 + src/main/resources/banner.txt | 11 ++ 5 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 pom.xml create mode 100644 src/main/java/ru/otus/mkulikov/Application.java create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/banner.txt diff --git a/README.md b/README.md index e2cfdc7..943beb2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,9 @@ # OtusSpringHW-Library -Домашние задания по Spring для Otus с базами данных. + +Домашнее задание #5: +- Создать приложение хранящее информацию о книгах в библиотеке. +- Использовать Spring JDBC и реляционную базу. +- Опционально использовать настоящую реляционную БД, но можно использовать H2. +- Предусмотреть таблицы авторов, книг и жанров. +- Интерфейс на Spring Shell. +- Покрыть тестами, насколько это возможно. \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4973666 --- /dev/null +++ b/pom.xml @@ -0,0 +1,164 @@ + + + 4.0.0 + + home-work + + ru.otus.mkulikov + home-work + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + + + 8 + ${java.version} + ${java.version} + UTF-8 + + + + + net.sf.opencsv + opencsv + 2.3 + + + + javax.annotation + javax.annotation-api + 1.3.2 + + + + org.projectlombok + lombok + 1.18.4 + provided + + + + + junit + junit + 4.12 + test + + + + org.junit.jupiter + junit-jupiter-api + 5.3.2 + test + + + + org.junit.jupiter + junit-jupiter-engine + 5.3.2 + test + + + + org.junit.platform + junit-platform-launcher + 1.4.1 + test + + + + + org.mockito + mockito-all + 1.10.19 + test + + + + + org.springframework.boot + spring-boot-starter + + + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + + + + + + + + + + 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.22.0 + + + false + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + src/main/resources + + **/*.csv + **/*.properties + **/*.txt + **/*.yml + + false + + + + \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java new file mode 100644 index 0000000..7572a2b --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -0,0 +1,26 @@ +package ru.otus.mkulikov; + +//import org.h2.tools.Console; +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; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 2019-03-14 + * Time: 15:27 + */ + +@SpringBootApplication +@PropertySource("classpath:application.yml") +@EnableConfigurationProperties +public class Application { + + public static void main(String[] args) { + ApplicationContext context = SpringApplication.run(Application.class); +// Console.main(args); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..6e8162e --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,3 @@ +spring: + banner: + 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 4533cd4f66e31c0e14839dab9f5bcf3cf5eb778b Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 23 May 2019 16:12:33 +0300 Subject: [PATCH 02/70] =?UTF-8?q?-=20=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=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82?= =?UTF-8?q?=D0=BE=D0=B2.=20-=20=D0=9C=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20?= =?UTF-8?q?=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BA=D0=B8=20=D0=B8=D0=B7=20?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20=D0=BA=D0=BD=D0=B8?= =?UTF-8?q?=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 27 ++++----- .../java/ru/otus/mkulikov/Application.java | 13 ++++- .../java/ru/otus/mkulikov/dao/BookDao.java | 19 +++++++ .../ru/otus/mkulikov/dao/BookDaoJdbc.java | 55 +++++++++++++++++++ .../java/ru/otus/mkulikov/domain/Book.java | 32 +++++++++++ src/main/resources/data.sql | 27 +++++++++ src/main/resources/schema.sql | 23 ++++++++ 7 files changed, 176 insertions(+), 20 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/dao/BookDao.java create mode 100644 src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java create mode 100644 src/main/java/ru/otus/mkulikov/domain/Book.java create mode 100644 src/main/resources/data.sql create mode 100644 src/main/resources/schema.sql diff --git a/pom.xml b/pom.xml index 4973666..cde26b6 100644 --- a/pom.xml +++ b/pom.xml @@ -18,9 +18,6 @@ - 8 - ${java.version} - ${java.version} UTF-8 @@ -87,10 +84,10 @@ spring-boot-starter - - - - + + org.springframework.boot + spring-boot-starter-jdbc + org.springframework.boot @@ -105,11 +102,11 @@ - - - - - + + com.h2database + h2 + 1.4.199 + @@ -117,11 +114,6 @@ org.apache.maven.plugins maven-compiler-plugin - - ${java.version} - ${java.version} - ${encoding} - @@ -156,6 +148,7 @@ **/*.properties **/*.txt **/*.yml + **/*.sql false diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 7572a2b..7b6cb8d 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -1,11 +1,14 @@ package ru.otus.mkulikov; -//import org.h2.tools.Console; +import org.h2.tools.Console; 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.dao.BookDao; +import ru.otus.mkulikov.domain.Book; + /** * Created by IntelliJ IDEA. @@ -19,8 +22,12 @@ @EnableConfigurationProperties public class Application { - public static void main(String[] args) { + public static void main(String[] args) throws Exception { ApplicationContext context = SpringApplication.run(Application.class); -// Console.main(args); + BookDao dao = context.getBean(BookDao.class); + + Book book = dao.getBookById(1); + + Console.main(args); } } diff --git a/src/main/java/ru/otus/mkulikov/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/dao/BookDao.java new file mode 100644 index 0000000..6fafa79 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/dao/BookDao.java @@ -0,0 +1,19 @@ +package ru.otus.mkulikov.dao; + +import ru.otus.mkulikov.domain.Book; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 13:28 + */ + +public interface BookDao { + + Book getBookById(Integer id); + + List getAllBooks(); +} diff --git a/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java new file mode 100644 index 0000000..2aeffcc --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java @@ -0,0 +1,55 @@ +package ru.otus.mkulikov.dao; + +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; +import ru.otus.mkulikov.domain.Book; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 13:28 + */ + +@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) +@Repository +public class BookDaoJdbc implements BookDao { + + private final JdbcOperations jdbcOperations; + + public BookDaoJdbc(JdbcOperations jdbcOperations) { + this.jdbcOperations = jdbcOperations; + } + + @Override + public Book getBookById(Integer id) { + return jdbcOperations.queryForObject("select * from Book where id = ? ", new Object[]{id}, new BookMapper()); + } + + @Override + public List getAllBooks() { + return jdbcOperations.query("select * from Book", new BookMapper()); + } + + public static class BookMapper implements RowMapper { + + @Override + public Book mapRow(ResultSet resultSet, int i) throws SQLException { + int id = resultSet.getInt("ID"); + Date add_record_date = resultSet.getDate("ADD_RECORD_DATE"); + String caption = resultSet.getString("CAPTION"); + int author_id = resultSet.getInt("AUTHOR_ID"); + int genre_id = resultSet.getInt("GENRE_ID"); + String comment = resultSet.getString("COMMENT"); + + return new Book(id, add_record_date, caption, author_id, genre_id, comment); + } + } +} + diff --git a/src/main/java/ru/otus/mkulikov/domain/Book.java b/src/main/java/ru/otus/mkulikov/domain/Book.java new file mode 100644 index 0000000..81614de --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/domain/Book.java @@ -0,0 +1,32 @@ +package ru.otus.mkulikov.domain; + +import lombok.Data; + +import java.util.Date; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 13:28 + */ + +@Data +public class Book { + + private final int id; + private final Date add_record_date; + private final String caption; + private final int author_id; + private final int genre_id; + private final String comment; + + public Book(int id, Date add_record_date, String caption, int author_id, int genre_id, String comment) { + this.id = id; + this.add_record_date = add_record_date; + this.caption = caption; + this.author_id = author_id; + this.genre_id = genre_id; + this.comment = comment; + } +} diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql new file mode 100644 index 0000000..d9af4d1 --- /dev/null +++ b/src/main/resources/data.sql @@ -0,0 +1,27 @@ +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (1, 'Surname1', 'FirstName1', 'SecondName1'); + +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (2, 'Surname2', 'FirstName2', 'SecondName2'); + +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (3, 'Surname3', 'FirstName3', 'SecondName3'); + +-------------------------- + +insert into GENRE (ID, NAME) values (1, 'Genre1'); +insert into GENRE (ID, NAME) values (2, 'Genre2'); +insert into GENRE (ID, NAME) values (3, 'Genre3'); + +-------------------------- + +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (1, sysdate, 'book_1', 1, 1, 'comment'); + +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (2, sysdate, 'book_2', 1, 1, 'comment'); + +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (3, sysdate, 'book_3', 1, 1, 'comment'); + +-------------------------- diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000..6771ddc --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,23 @@ +DROP TABLE IF EXISTS BOOK; +CREATE TABLE BOOK( + ID INT PRIMARY KEY, + ADD_RECORD_DATE DATE, + CAPTION VARCHAR(255), + AUTHOR_ID INT, + GENRE_ID INT, + COMMENT VARCHAR(255) +); + +DROP TABLE IF EXISTS AUTHOR; +CREATE TABLE AUTHOR( + ID INT PRIMARY KEY, + SURNAME VARCHAR(100), + FIRST_NAME VARCHAR(100), + SECOND_NAME VARCHAR(100) +); + +DROP TABLE IF EXISTS GENRE; +CREATE TABLE GENRE( + ID INT PRIMARY KEY, + NAME VARCHAR(100), +); \ No newline at end of file From 628b8ae8bd180149fd365d799ee91c1280b9c624 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 23 May 2019 18:19:49 +0300 Subject: [PATCH 03/70] =?UTF-8?q?-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20dao=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D0=B2.=20-=20=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 | 15 ++--- .../java/ru/otus/mkulikov/dao/AuthorDao.java | 20 +++++++ .../ru/otus/mkulikov/dao/AuthorDaoJdbc.java | 38 ++++++++++++ .../java/ru/otus/mkulikov/dao/BookDao.java | 10 +++- .../ru/otus/mkulikov/dao/BookDaoJdbc.java | 19 +++++- .../java/ru/otus/mkulikov/dao/GenreDao.java | 23 ++++++++ .../ru/otus/mkulikov/dao/GenreDaoJdbc.java | 59 +++++++++++++++++++ .../java/ru/otus/mkulikov/model/Author.java | 26 ++++++++ .../otus/mkulikov/{domain => model}/Book.java | 14 ++++- .../java/ru/otus/mkulikov/model/Genre.java | 22 +++++++ .../java/ru/otus/mkulikov/shell/Commands.java | 38 ++++++++++++ 12 files changed, 278 insertions(+), 12 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/dao/AuthorDao.java create mode 100644 src/main/java/ru/otus/mkulikov/dao/AuthorDaoJdbc.java create mode 100644 src/main/java/ru/otus/mkulikov/dao/GenreDao.java create mode 100644 src/main/java/ru/otus/mkulikov/dao/GenreDaoJdbc.java create mode 100644 src/main/java/ru/otus/mkulikov/model/Author.java rename src/main/java/ru/otus/mkulikov/{domain => model}/Book.java (63%) create mode 100644 src/main/java/ru/otus/mkulikov/model/Genre.java create mode 100644 src/main/java/ru/otus/mkulikov/shell/Commands.java diff --git a/pom.xml b/pom.xml index cde26b6..b77b838 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,12 @@ true + + org.springframework.shell + spring-shell-starter + 2.0.0.RELEASE + + com.h2database diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 7b6cb8d..137b521 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -7,7 +7,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.PropertySource; import ru.otus.mkulikov.dao.BookDao; -import ru.otus.mkulikov.domain.Book; +import ru.otus.mkulikov.model.Book; /** @@ -23,11 +23,12 @@ public class Application { public static void main(String[] args) throws Exception { - ApplicationContext context = SpringApplication.run(Application.class); - BookDao dao = context.getBean(BookDao.class); - - Book book = dao.getBookById(1); - - Console.main(args); + SpringApplication.run(Application.class); + //ApplicationContext context = SpringApplication.run(Application.class); + //BookDao dao = context.getBean(BookDao.class); + // + //Book book = dao.getById(1); + // + //Console.main(args); } } diff --git a/src/main/java/ru/otus/mkulikov/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/dao/AuthorDao.java new file mode 100644 index 0000000..3adf222 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/dao/AuthorDao.java @@ -0,0 +1,20 @@ +package ru.otus.mkulikov.dao; + +import ru.otus.mkulikov.model.Book; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:06 + */ + +public interface AuthorDao { + + int addObject(Book book); + + void deleteObject(Book book); + + int updateObject(Book book); + +} diff --git a/src/main/java/ru/otus/mkulikov/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/dao/AuthorDaoJdbc.java new file mode 100644 index 0000000..ac5ed2d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/dao/AuthorDaoJdbc.java @@ -0,0 +1,38 @@ +package ru.otus.mkulikov.dao; + +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.stereotype.Repository; +import ru.otus.mkulikov.model.Book; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:06 + */ + +@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) +@Repository +public class AuthorDaoJdbc implements AuthorDao { + + private final JdbcOperations jdbcOperations; + + public AuthorDaoJdbc(JdbcOperations jdbcOperations) { + this.jdbcOperations = jdbcOperations; + } + + @Override + public int addObject(Book book) { + return 0; + } + + @Override + public void deleteObject(Book book) { + + } + + @Override + public int updateObject(Book book) { + return 0; + } +} diff --git a/src/main/java/ru/otus/mkulikov/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/dao/BookDao.java index 6fafa79..4f03017 100644 --- a/src/main/java/ru/otus/mkulikov/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/dao/BookDao.java @@ -1,6 +1,6 @@ package ru.otus.mkulikov.dao; -import ru.otus.mkulikov.domain.Book; +import ru.otus.mkulikov.model.Book; import java.util.List; @@ -13,7 +13,13 @@ public interface BookDao { - Book getBookById(Integer id); + Book getById(int id); List getAllBooks(); + + int addObject(Book book); + + void deleteObject(Book book); + + int updateObject(Book book); } diff --git a/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java index 2aeffcc..7875943 100644 --- a/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java @@ -3,7 +3,7 @@ import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.domain.Book; +import ru.otus.mkulikov.model.Book; import java.sql.ResultSet; import java.sql.SQLException; @@ -28,7 +28,7 @@ public BookDaoJdbc(JdbcOperations jdbcOperations) { } @Override - public Book getBookById(Integer id) { + public Book getById(int id) { return jdbcOperations.queryForObject("select * from Book where id = ? ", new Object[]{id}, new BookMapper()); } @@ -37,6 +37,21 @@ public List getAllBooks() { return jdbcOperations.query("select * from Book", new BookMapper()); } + @Override + public int addObject(Book book) { + return 0; + } + + @Override + public void deleteObject(Book book) { + + } + + @Override + public int updateObject(Book book) { + return 0; + } + public static class BookMapper implements RowMapper { @Override diff --git a/src/main/java/ru/otus/mkulikov/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/dao/GenreDao.java new file mode 100644 index 0000000..2d00b50 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/dao/GenreDao.java @@ -0,0 +1,23 @@ +package ru.otus.mkulikov.dao; + +import ru.otus.mkulikov.model.Book; +import ru.otus.mkulikov.model.Genre; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:07 + */ + +public interface GenreDao { + + Genre getById(int id); + + int addObject(Book book); + + void deleteObject(Book book); + + int updateObject(Book book); + +} diff --git a/src/main/java/ru/otus/mkulikov/dao/GenreDaoJdbc.java b/src/main/java/ru/otus/mkulikov/dao/GenreDaoJdbc.java new file mode 100644 index 0000000..6def4fa --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/dao/GenreDaoJdbc.java @@ -0,0 +1,59 @@ +package ru.otus.mkulikov.dao; + +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; +import ru.otus.mkulikov.model.Book; +import ru.otus.mkulikov.model.Genre; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:07 + */ + +@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) +@Repository +public class GenreDaoJdbc implements GenreDao { + + private final JdbcOperations jdbcOperations; + + public GenreDaoJdbc(JdbcOperations jdbcOperations) { + this.jdbcOperations = jdbcOperations; + } + + @Override + public Genre getById(int id) { + return jdbcOperations.queryForObject("select * from Genre where id = ? ", new Object[]{id}, new GenreMapper()); + } + + @Override + public int addObject(Book book) { + return 0; + } + + @Override + public void deleteObject(Book book) { + + } + + @Override + public int updateObject(Book book) { + return 0; + } + + public static class GenreMapper implements RowMapper { + + @Override + public Genre mapRow(ResultSet resultSet, int i) throws SQLException { + int id = resultSet.getInt("ID"); + String name = resultSet.getString("NAME"); + + return new Genre(id, name); + } + } +} diff --git a/src/main/java/ru/otus/mkulikov/model/Author.java b/src/main/java/ru/otus/mkulikov/model/Author.java new file mode 100644 index 0000000..11412f3 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/model/Author.java @@ -0,0 +1,26 @@ +package ru.otus.mkulikov.model; + +import lombok.Data; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:02 + */ + +@Data +public class Author { + + private final int id; + private final String surname; + private final String first_name; + private final String second_name; + + public Author(int id, String surname, String first_name, String second_name) { + this.id = id; + this.surname = surname; + this.first_name = first_name; + this.second_name = second_name; + } +} diff --git a/src/main/java/ru/otus/mkulikov/domain/Book.java b/src/main/java/ru/otus/mkulikov/model/Book.java similarity index 63% rename from src/main/java/ru/otus/mkulikov/domain/Book.java rename to src/main/java/ru/otus/mkulikov/model/Book.java index 81614de..6b34dc1 100644 --- a/src/main/java/ru/otus/mkulikov/domain/Book.java +++ b/src/main/java/ru/otus/mkulikov/model/Book.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.domain; +package ru.otus.mkulikov.model; import lombok.Data; @@ -29,4 +29,16 @@ public Book(int id, Date add_record_date, String caption, int author_id, int gen this.genre_id = genre_id; this.comment = comment; } + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", add_record_date=" + add_record_date + + ", caption='" + caption + '\'' + + ", author_id=" + author_id + + ", genre_id=" + genre_id + + ", comment='" + comment + '\'' + + '}'; + } } diff --git a/src/main/java/ru/otus/mkulikov/model/Genre.java b/src/main/java/ru/otus/mkulikov/model/Genre.java new file mode 100644 index 0000000..7da3b68 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/model/Genre.java @@ -0,0 +1,22 @@ +package ru.otus.mkulikov.model; + +import lombok.Data; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:04 + */ + +@Data +public class Genre { + + private final int id; + private final String name; + + public Genre(int id, String name) { + this.id = id; + this.name = name; + } +} \ No newline at end of file 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..e79cf7f --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -0,0 +1,38 @@ +package ru.otus.mkulikov.shell; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.shell.standard.ShellComponent; +import org.springframework.shell.standard.ShellMethod; +import org.springframework.shell.standard.ShellOption; +import ru.otus.mkulikov.dao.AuthorDao; +import ru.otus.mkulikov.dao.BookDao; +import ru.otus.mkulikov.dao.GenreDao; +import ru.otus.mkulikov.model.Book; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:33 + */ + +@ShellComponent +public class Commands { + + private final AuthorDao authorDao; + private final BookDao bookDao; + private final GenreDao genreDao; + + @Autowired + public Commands(AuthorDao authorDao, BookDao bookDao, GenreDao genreDao) { + this.authorDao = authorDao; + this.bookDao = bookDao; + this.genreDao = genreDao; + } + + @ShellMethod(key = { "getBookById" }, value = "Select book by id.") + public String getBookById(@ShellOption String id) { + Book book = bookDao.getById(Integer.parseInt(id)); + return book.toString(); + } +} From b782bf356edf5253c3ff1774a427cae456bbab3c Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 24 May 2019 14:37:09 +0300 Subject: [PATCH 04/70] =?UTF-8?q?=D0=A7=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B2=D0=B2=D0=BE=D0=B4=D0=B8=D0=BC=D1=8B=D1=85=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D1=8B=D1=85.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/shell/Commands.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java index e79cf7f..31343e4 100644 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -1,5 +1,6 @@ package ru.otus.mkulikov.shell; +import org.jline.reader.LineReader; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; @@ -23,6 +24,9 @@ public class Commands { private final BookDao bookDao; private final GenreDao genreDao; + @Autowired + private LineReader reader; + @Autowired public Commands(AuthorDao authorDao, BookDao bookDao, GenreDao genreDao) { this.authorDao = authorDao; @@ -30,9 +34,36 @@ public Commands(AuthorDao authorDao, BookDao bookDao, GenreDao genreDao) { this.genreDao = genreDao; } + public String write(String text) { + return this.reader.readLine("\n" + text + " > "); + } + @ShellMethod(key = { "getBookById" }, value = "Select book by id.") public String getBookById(@ShellOption String id) { Book book = bookDao.getById(Integer.parseInt(id)); return book.toString(); } + + @ShellMethod(key = { "setService", "select" }, value = "Choose a Speech to Text Service") + public void setService() { + boolean success = false; + do { + String question = "Please select a service."; + + // Get Input + String input = this.write(question); + if ("1".equals(input)) { + this.write("OK"); + } else { + this.write("NO"); + } + + // Input handling + /* + * do something with input variable + */ + success = true; + + } while (!success); + } } From 56ba6a0c4f1e2d2f850c11ae34e889b197527037 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 24 May 2019 16:27:52 +0300 Subject: [PATCH 05/70] =?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=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B5=D0=B9?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/otus/mkulikov/Application.java | 6 ------ src/main/java/ru/otus/mkulikov/model/Author.java | 10 ++++++++++ src/main/java/ru/otus/mkulikov/model/Book.java | 2 +- src/main/java/ru/otus/mkulikov/model/Genre.java | 8 ++++++++ src/main/java/ru/otus/mkulikov/shell/Commands.java | 11 +++++++++++ 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 137b521..d6e34bc 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -6,8 +6,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.PropertySource; -import ru.otus.mkulikov.dao.BookDao; -import ru.otus.mkulikov.model.Book; /** @@ -25,10 +23,6 @@ public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class); //ApplicationContext context = SpringApplication.run(Application.class); - //BookDao dao = context.getBean(BookDao.class); - // - //Book book = dao.getById(1); - // //Console.main(args); } } diff --git a/src/main/java/ru/otus/mkulikov/model/Author.java b/src/main/java/ru/otus/mkulikov/model/Author.java index 11412f3..d316b84 100644 --- a/src/main/java/ru/otus/mkulikov/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/model/Author.java @@ -23,4 +23,14 @@ public Author(int id, String surname, String first_name, String second_name) { this.first_name = first_name; this.second_name = second_name; } + + @Override + public String toString() { + return "Author{" + + "id=" + id + + ", surname='" + surname + '\'' + + ", first_name='" + first_name + '\'' + + ", second_name='" + second_name + '\'' + + "}\n"; + } } diff --git a/src/main/java/ru/otus/mkulikov/model/Book.java b/src/main/java/ru/otus/mkulikov/model/Book.java index 6b34dc1..c3dd013 100644 --- a/src/main/java/ru/otus/mkulikov/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/model/Book.java @@ -39,6 +39,6 @@ public String toString() { ", author_id=" + author_id + ", genre_id=" + genre_id + ", comment='" + comment + '\'' + - '}'; + "}\n"; } } diff --git a/src/main/java/ru/otus/mkulikov/model/Genre.java b/src/main/java/ru/otus/mkulikov/model/Genre.java index 7da3b68..5881406 100644 --- a/src/main/java/ru/otus/mkulikov/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/model/Genre.java @@ -19,4 +19,12 @@ public Genre(int id, String name) { this.id = id; this.name = name; } + + @Override + public String toString() { + return "Genre{" + + "id=" + id + + ", name='" + name + '\'' + + "}\n"; + } } \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java index 31343e4..6a6ca8b 100644 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -10,6 +10,8 @@ import ru.otus.mkulikov.dao.GenreDao; import ru.otus.mkulikov.model.Book; +import java.util.List; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -35,6 +37,8 @@ public Commands(AuthorDao authorDao, BookDao bookDao, GenreDao genreDao) { } public String write(String text) { + System.out.println("qweqwewqe"); + return this.reader.readLine("\n" + text + " > "); } @@ -44,6 +48,12 @@ public String getBookById(@ShellOption String id) { return book.toString(); } + @ShellMethod(key = { "getBooks" }, value = "Select book by id.") + public String getBooks() { + List allBooks = bookDao.getAllBooks(); + return allBooks.toString(); + } + @ShellMethod(key = { "setService", "select" }, value = "Choose a Speech to Text Service") public void setService() { boolean success = false; @@ -52,6 +62,7 @@ public void setService() { // Get Input String input = this.write(question); + if ("1".equals(input)) { this.write("OK"); } else { From f8f5da19abb7c3ff0a42f7fbe660abba73e92c7a Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 27 May 2019 13:53:53 +0300 Subject: [PATCH 06/70] =?UTF-8?q?-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20DAO=20=D0=B4=D0=BB=D1=8F=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=20=D0=B0=D0=B2=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B8=20=D0=B6=D0=B0=D0=BD=D1=80=D0=BE=D0=B2.?= =?UTF-8?q?=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20Shell=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mkulikov/{ => app}/dao/AuthorDao.java | 12 ++- .../otus/mkulikov/app/dao/AuthorDaoJdbc.java | 65 +++++++++++++++ .../otus/mkulikov/{ => app}/dao/BookDao.java | 6 +- .../mkulikov/{ => app}/dao/BookDaoJdbc.java | 14 ++-- .../otus/mkulikov/{ => app}/dao/GenreDao.java | 11 ++- .../mkulikov/{ => app}/dao/GenreDaoJdbc.java | 18 ++-- .../otus/mkulikov/{ => app}/model/Author.java | 2 +- .../otus/mkulikov/{ => app}/model/Book.java | 2 +- .../otus/mkulikov/{ => app}/model/Genre.java | 2 +- .../app/services/BooksManageSevice.java | 29 +++++++ .../app/services/BooksManageSeviceImpl.java | 54 ++++++++++++ .../ru/otus/mkulikov/dao/AuthorDaoJdbc.java | 38 --------- .../java/ru/otus/mkulikov/shell/Commands.java | 83 ++++++++----------- 13 files changed, 221 insertions(+), 115 deletions(-) rename src/main/java/ru/otus/mkulikov/{ => app}/dao/AuthorDao.java (53%) create mode 100644 src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java rename src/main/java/ru/otus/mkulikov/{ => app}/dao/BookDao.java (72%) rename src/main/java/ru/otus/mkulikov/{ => app}/dao/BookDaoJdbc.java (85%) rename src/main/java/ru/otus/mkulikov/{ => app}/dao/GenreDao.java (60%) rename src/main/java/ru/otus/mkulikov/{ => app}/dao/GenreDaoJdbc.java (78%) rename src/main/java/ru/otus/mkulikov/{ => app}/model/Author.java (95%) rename src/main/java/ru/otus/mkulikov/{ => app}/model/Book.java (96%) rename src/main/java/ru/otus/mkulikov/{ => app}/model/Genre.java (92%) create mode 100644 src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java create mode 100644 src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java delete mode 100644 src/main/java/ru/otus/mkulikov/dao/AuthorDaoJdbc.java diff --git a/src/main/java/ru/otus/mkulikov/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java similarity index 53% rename from src/main/java/ru/otus/mkulikov/dao/AuthorDao.java rename to src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index 3adf222..6026c67 100644 --- a/src/main/java/ru/otus/mkulikov/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -1,6 +1,9 @@ -package ru.otus.mkulikov.dao; +package ru.otus.mkulikov.app.dao; -import ru.otus.mkulikov.model.Book; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; + +import java.util.List; /** * Created by IntelliJ IDEA. @@ -11,10 +14,13 @@ public interface AuthorDao { + Author getById(int id); + + List getAllObjects(); + int addObject(Book book); void deleteObject(Book book); int updateObject(Book book); - } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java new file mode 100644 index 0000000..d31b889 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java @@ -0,0 +1,65 @@ +package ru.otus.mkulikov.app.dao; + +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:06 + */ + +@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) +@Repository +@RequiredArgsConstructor +public class AuthorDaoJdbc implements AuthorDao { + + private final JdbcOperations jdbcOperations; + + @Override + public Author getById(int id) { + return jdbcOperations.queryForObject("select * from Author where id = ? ", new Object[]{id}, new AuthorMapper()); + } + + @Override + public List getAllObjects() { + return jdbcOperations.query("select * from Author", new AuthorMapper()); + } + + @Override + public int addObject(Book book) { + return 0; + } + + @Override + public void deleteObject(Book book) { + + } + + @Override + public int updateObject(Book book) { + return 0; + } + + private static class AuthorMapper implements RowMapper { + + @Override + public Author mapRow(ResultSet resultSet, int i) throws SQLException { + int id = resultSet.getInt("ID"); + String surname = resultSet.getString("SURNAME"); + String first_name = resultSet.getString("FIRST_NAME"); + String second_name = resultSet.getString("SECOND_NAME"); + + return new Author(id, surname, first_name, second_name); + } + } +} diff --git a/src/main/java/ru/otus/mkulikov/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java similarity index 72% rename from src/main/java/ru/otus/mkulikov/dao/BookDao.java rename to src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index 4f03017..f73f7e3 100644 --- a/src/main/java/ru/otus/mkulikov/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -1,6 +1,6 @@ -package ru.otus.mkulikov.dao; +package ru.otus.mkulikov.app.dao; -import ru.otus.mkulikov.model.Book; +import ru.otus.mkulikov.app.model.Book; import java.util.List; @@ -15,7 +15,7 @@ public interface BookDao { Book getById(int id); - List getAllBooks(); + List getAllObjects(); int addObject(Book book); diff --git a/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java similarity index 85% rename from src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java rename to src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java index 7875943..6c73ab3 100644 --- a/src/main/java/ru/otus/mkulikov/dao/BookDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java @@ -1,9 +1,10 @@ -package ru.otus.mkulikov.dao; +package ru.otus.mkulikov.app.dao; +import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.model.Book; +import ru.otus.mkulikov.app.model.Book; import java.sql.ResultSet; import java.sql.SQLException; @@ -19,21 +20,18 @@ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) @Repository +@RequiredArgsConstructor public class BookDaoJdbc implements BookDao { private final JdbcOperations jdbcOperations; - public BookDaoJdbc(JdbcOperations jdbcOperations) { - this.jdbcOperations = jdbcOperations; - } - @Override public Book getById(int id) { return jdbcOperations.queryForObject("select * from Book where id = ? ", new Object[]{id}, new BookMapper()); } @Override - public List getAllBooks() { + public List getAllObjects() { return jdbcOperations.query("select * from Book", new BookMapper()); } @@ -52,7 +50,7 @@ public int updateObject(Book book) { return 0; } - public static class BookMapper implements RowMapper { + private static class BookMapper implements RowMapper { @Override public Book mapRow(ResultSet resultSet, int i) throws SQLException { diff --git a/src/main/java/ru/otus/mkulikov/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java similarity index 60% rename from src/main/java/ru/otus/mkulikov/dao/GenreDao.java rename to src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 2d00b50..95828bf 100644 --- a/src/main/java/ru/otus/mkulikov/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -1,7 +1,9 @@ -package ru.otus.mkulikov.dao; +package ru.otus.mkulikov.app.dao; -import ru.otus.mkulikov.model.Book; -import ru.otus.mkulikov.model.Genre; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; /** * Created by IntelliJ IDEA. @@ -14,10 +16,11 @@ public interface GenreDao { Genre getById(int id); + List getAllObjects(); + int addObject(Book book); void deleteObject(Book book); int updateObject(Book book); - } diff --git a/src/main/java/ru/otus/mkulikov/dao/GenreDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java similarity index 78% rename from src/main/java/ru/otus/mkulikov/dao/GenreDaoJdbc.java rename to src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java index 6def4fa..154a5f7 100644 --- a/src/main/java/ru/otus/mkulikov/dao/GenreDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java @@ -1,13 +1,15 @@ -package ru.otus.mkulikov.dao; +package ru.otus.mkulikov.app.dao; +import lombok.RequiredArgsConstructor; import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.model.Book; -import ru.otus.mkulikov.model.Genre; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.List; /** * Created by IntelliJ IDEA. @@ -18,19 +20,21 @@ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) @Repository +@RequiredArgsConstructor public class GenreDaoJdbc implements GenreDao { private final JdbcOperations jdbcOperations; - public GenreDaoJdbc(JdbcOperations jdbcOperations) { - this.jdbcOperations = jdbcOperations; - } - @Override public Genre getById(int id) { return jdbcOperations.queryForObject("select * from Genre where id = ? ", new Object[]{id}, new GenreMapper()); } + @Override + public List getAllObjects() { + return jdbcOperations.query("select * from Genre", new GenreMapper()); + } + @Override public int addObject(Book book) { return 0; diff --git a/src/main/java/ru/otus/mkulikov/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java similarity index 95% rename from src/main/java/ru/otus/mkulikov/model/Author.java rename to src/main/java/ru/otus/mkulikov/app/model/Author.java index d316b84..f418720 100644 --- a/src/main/java/ru/otus/mkulikov/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.model; +package ru.otus.mkulikov.app.model; import lombok.Data; diff --git a/src/main/java/ru/otus/mkulikov/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java similarity index 96% rename from src/main/java/ru/otus/mkulikov/model/Book.java rename to src/main/java/ru/otus/mkulikov/app/model/Book.java index c3dd013..917daeb 100644 --- a/src/main/java/ru/otus/mkulikov/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.model; +package ru.otus.mkulikov.app.model; import lombok.Data; diff --git a/src/main/java/ru/otus/mkulikov/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java similarity index 92% rename from src/main/java/ru/otus/mkulikov/model/Genre.java rename to src/main/java/ru/otus/mkulikov/app/model/Genre.java index 5881406..5f507f3 100644 --- a/src/main/java/ru/otus/mkulikov/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.model; +package ru.otus.mkulikov.app.model; import lombok.Data; diff --git a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java new file mode 100644 index 0000000..c001499 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java @@ -0,0 +1,29 @@ +package ru.otus.mkulikov.app.services; + +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 27.05.2019 + * Time: 13:42 + */ + +public interface BooksManageSevice { + + Book getBookById(int id); + + List getBooks(); + + Author getAuthorById(int id); + + List getAuthors(); + + Genre getGenreById(int id); + + List getGenres(); +} diff --git a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java new file mode 100644 index 0000000..02dc424 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java @@ -0,0 +1,54 @@ +package ru.otus.mkulikov.app.services; + +import lombok.RequiredArgsConstructor; +import org.springframework.shell.standard.ShellMethod; +import org.springframework.shell.standard.ShellOption; +import org.springframework.stereotype.Service; +import ru.otus.mkulikov.app.dao.AuthorDao; +import ru.otus.mkulikov.app.dao.BookDao; +import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 27.05.2019 + * Time: 13:42 + */ + +@Service +@RequiredArgsConstructor +public class BooksManageSeviceImpl implements BooksManageSevice { + + private final AuthorDao authorDao; + private final BookDao bookDao; + private final GenreDao genreDao; + + public Book getBookById(int id) { + return bookDao.getById(id); + } + + public List getBooks() { + return bookDao.getAllObjects(); + } + + public Author getAuthorById(int id) { + return authorDao.getById(id); + } + + public List getAuthors() { + return authorDao.getAllObjects(); + } + + public Genre getGenreById(int id) { + return genreDao.getById(id); + } + + public List getGenres() { + return genreDao.getAllObjects(); + } +} diff --git a/src/main/java/ru/otus/mkulikov/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/dao/AuthorDaoJdbc.java deleted file mode 100644 index ac5ed2d..0000000 --- a/src/main/java/ru/otus/mkulikov/dao/AuthorDaoJdbc.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.otus.mkulikov.dao; - -import org.springframework.jdbc.core.JdbcOperations; -import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.model.Book; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 23.05.2019 - * Time: 17:06 - */ - -@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) -@Repository -public class AuthorDaoJdbc implements AuthorDao { - - private final JdbcOperations jdbcOperations; - - public AuthorDaoJdbc(JdbcOperations jdbcOperations) { - this.jdbcOperations = jdbcOperations; - } - - @Override - public int addObject(Book book) { - return 0; - } - - @Override - public void deleteObject(Book book) { - - } - - @Override - public int updateObject(Book book) { - return 0; - } -} diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java index 6a6ca8b..9b7b023 100644 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -1,14 +1,16 @@ package ru.otus.mkulikov.shell; -import org.jline.reader.LineReader; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; import org.springframework.shell.standard.ShellOption; -import ru.otus.mkulikov.dao.AuthorDao; -import ru.otus.mkulikov.dao.BookDao; -import ru.otus.mkulikov.dao.GenreDao; -import ru.otus.mkulikov.model.Book; +import ru.otus.mkulikov.app.dao.AuthorDao; +import ru.otus.mkulikov.app.dao.BookDao; +import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.services.BooksManageSevice; import java.util.List; @@ -20,61 +22,44 @@ */ @ShellComponent +@RequiredArgsConstructor public class Commands { - private final AuthorDao authorDao; - private final BookDao bookDao; - private final GenreDao genreDao; - - @Autowired - private LineReader reader; - - @Autowired - public Commands(AuthorDao authorDao, BookDao bookDao, GenreDao genreDao) { - this.authorDao = authorDao; - this.bookDao = bookDao; - this.genreDao = genreDao; - } - - public String write(String text) { - System.out.println("qweqwewqe"); - - return this.reader.readLine("\n" + text + " > "); - } + private final BooksManageSevice booksManageSevice; @ShellMethod(key = { "getBookById" }, value = "Select book by id.") - public String getBookById(@ShellOption String id) { - Book book = bookDao.getById(Integer.parseInt(id)); + public String getBookById(@ShellOption int id) { + Book book = booksManageSevice.getBookById(id); return book.toString(); } - @ShellMethod(key = { "getBooks" }, value = "Select book by id.") + @ShellMethod(key = { "getBooks" }, value = "Select all books.") public String getBooks() { - List allBooks = bookDao.getAllBooks(); - return allBooks.toString(); + List allObjects = booksManageSevice.getBooks(); + return allObjects.toString(); } - @ShellMethod(key = { "setService", "select" }, value = "Choose a Speech to Text Service") - public void setService() { - boolean success = false; - do { - String question = "Please select a service."; - - // Get Input - String input = this.write(question); + @ShellMethod(key = { "getAuthorById" }, value = "Select author by id.") + public String getAuthorById(@ShellOption int id) { + Author author = booksManageSevice.getAuthorById(id); + return author.toString(); + } - if ("1".equals(input)) { - this.write("OK"); - } else { - this.write("NO"); - } + @ShellMethod(key = { "getAuthors" }, value = "Select all authors.") + public String getAuthors() { + List allObjects = booksManageSevice.getAuthors(); + return allObjects.toString(); + } - // Input handling - /* - * do something with input variable - */ - success = true; + @ShellMethod(key = { "getGenreById" }, value = "Select genre by id.") + public String getGenreById(@ShellOption int id) { + Genre genre = booksManageSevice.getGenreById(id); + return genre.toString(); + } - } while (!success); + @ShellMethod(key = { "getGenres" }, value = "Select all genres.") + public String getGenres() { + List allObjects = booksManageSevice.getGenres(); + return allObjects.toString(); } } From 91e179e7b82a430a6f021439ea252a4d6ea00639 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 27 May 2019 17:19:19 +0300 Subject: [PATCH 07/70] =?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,=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=BE=D0=B2=D1=8B?= =?UTF-8?q?=D1=85=20shell=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/app/dao/AuthorDao.java | 15 ++++++--------- .../ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java | 9 ++++----- .../java/ru/otus/mkulikov/app/dao/BookDao.java | 14 ++++++-------- .../ru/otus/mkulikov/app/dao/BookDaoJdbc.java | 2 +- .../java/ru/otus/mkulikov/app/dao/GenreDao.java | 15 ++++++--------- .../ru/otus/mkulikov/app/dao/GenreDaoJdbc.java | 11 +++++------ .../java/ru/otus/mkulikov/app/model/Author.java | 2 ++ .../java/ru/otus/mkulikov/app/model/Book.java | 2 ++ .../java/ru/otus/mkulikov/app/model/Genre.java | 2 ++ .../mkulikov/app/services/BooksManageSevice.java | 2 ++ .../app/services/BooksManageSeviceImpl.java | 12 +++++++----- .../java/ru/otus/mkulikov/shell/Commands.java | 9 ++++++--- 12 files changed, 49 insertions(+), 46 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index 6026c67..a9b2fa6 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -1,8 +1,5 @@ package ru.otus.mkulikov.app.dao; -import ru.otus.mkulikov.app.model.Author; -import ru.otus.mkulikov.app.model.Book; - import java.util.List; /** @@ -12,15 +9,15 @@ * Time: 17:06 */ -public interface AuthorDao { +public interface AuthorDao { - Author getById(int id); + T getById(int id); - List getAllObjects(); + List getAllObjects(); - int addObject(Book book); + int addObject(T t); - void deleteObject(Book book); + void deleteObject(T t); - int updateObject(Book book); + int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java index d31b889..a7e58b7 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java @@ -5,7 +5,6 @@ import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.app.model.Author; -import ru.otus.mkulikov.app.model.Book; import java.sql.ResultSet; import java.sql.SQLException; @@ -21,7 +20,7 @@ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) @Repository @RequiredArgsConstructor -public class AuthorDaoJdbc implements AuthorDao { +public class AuthorDaoJdbc implements AuthorDao { private final JdbcOperations jdbcOperations; @@ -36,17 +35,17 @@ public List getAllObjects() { } @Override - public int addObject(Book book) { + public int addObject(Author book) { return 0; } @Override - public void deleteObject(Book book) { + public void deleteObject(Author book) { } @Override - public int updateObject(Book book) { + public int updateObject(Author book) { return 0; } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index f73f7e3..f183925 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -1,7 +1,5 @@ package ru.otus.mkulikov.app.dao; -import ru.otus.mkulikov.app.model.Book; - import java.util.List; /** @@ -11,15 +9,15 @@ * Time: 13:28 */ -public interface BookDao { +public interface BookDao { - Book getById(int id); + T getById(int id); - List getAllObjects(); + List getAllObjects(); - int addObject(Book book); + int addObject(T t); - void deleteObject(Book book); + void deleteObject(T t); - int updateObject(Book book); + int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java index 6c73ab3..5294b37 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java @@ -21,7 +21,7 @@ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) @Repository @RequiredArgsConstructor -public class BookDaoJdbc implements BookDao { +public class BookDaoJdbc implements BookDao { private final JdbcOperations jdbcOperations; diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 95828bf..1b6d511 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -1,8 +1,5 @@ package ru.otus.mkulikov.app.dao; -import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Genre; - import java.util.List; /** @@ -12,15 +9,15 @@ * Time: 17:07 */ -public interface GenreDao { +public interface GenreDao { - Genre getById(int id); + T getById(int id); - List getAllObjects(); + List getAllObjects(); - int addObject(Book book); + int addObject(T t); - void deleteObject(Book book); + int deleteObject(int id); - int updateObject(Book book); + int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java index 154a5f7..b34193e 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java @@ -4,7 +4,6 @@ import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; import java.sql.ResultSet; @@ -21,7 +20,7 @@ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) @Repository @RequiredArgsConstructor -public class GenreDaoJdbc implements GenreDao { +public class GenreDaoJdbc implements GenreDao { private final JdbcOperations jdbcOperations; @@ -36,17 +35,17 @@ public List getAllObjects() { } @Override - public int addObject(Book book) { + public int addObject(Genre genre) { return 0; } @Override - public void deleteObject(Book book) { - + public int deleteObject(int id) { + return jdbcOperations.update("delete from Genre where id = ? ", new Object[]{id}); } @Override - public int updateObject(Book book) { + public int updateObject(Genre genre) { return 0; } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index f418720..2bba880 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -7,6 +7,8 @@ * Developer: Maksim Kulikov * Date: 23.05.2019 * Time: 17:02 + * + * Сущность таблицы авторов */ @Data diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 917daeb..4d31e82 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -9,6 +9,8 @@ * Developer: Maksim Kulikov * Date: 23.05.2019 * Time: 13:28 + * + * Сущность таблицы книг */ @Data diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 5f507f3..9ba35ce 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -7,6 +7,8 @@ * Developer: Maksim Kulikov * Date: 23.05.2019 * Time: 17:04 + * + * Сущность таблицы жанров */ @Data diff --git a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java index c001499..b4bf2b4 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java @@ -26,4 +26,6 @@ public interface BooksManageSevice { Genre getGenreById(int id); List getGenres(); + + int deleteGenre(int id); } diff --git a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java index 02dc424..974b517 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java @@ -1,8 +1,6 @@ package ru.otus.mkulikov.app.services; import lombok.RequiredArgsConstructor; -import org.springframework.shell.standard.ShellMethod; -import org.springframework.shell.standard.ShellOption; import org.springframework.stereotype.Service; import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; @@ -24,9 +22,9 @@ @RequiredArgsConstructor public class BooksManageSeviceImpl implements BooksManageSevice { - private final AuthorDao authorDao; - private final BookDao bookDao; - private final GenreDao genreDao; + private final AuthorDao authorDao; + private final BookDao bookDao; + private final GenreDao genreDao; public Book getBookById(int id) { return bookDao.getById(id); @@ -51,4 +49,8 @@ public Genre getGenreById(int id) { public List getGenres() { return genreDao.getAllObjects(); } + + public int deleteGenre(int id) { + return genreDao.deleteObject(id); + } } diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java index 9b7b023..7d5506b 100644 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -4,9 +4,6 @@ import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; import org.springframework.shell.standard.ShellOption; -import ru.otus.mkulikov.app.dao.AuthorDao; -import ru.otus.mkulikov.app.dao.BookDao; -import ru.otus.mkulikov.app.dao.GenreDao; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; @@ -62,4 +59,10 @@ public String getGenres() { List allObjects = booksManageSevice.getGenres(); return allObjects.toString(); } + + @ShellMethod(key = { "deleteGenre" }, value = "Delete genre by id.") + public String deleteGenre(@ShellOption int id) { + int count = booksManageSevice.deleteGenre(id); + return "Deleted " + count + " row(s)"; + } } From eaed856a29d059c12ac5329a6bee8f47b63fab46 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 27 May 2019 17:57:09 +0300 Subject: [PATCH 08/70] =?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 --- .../otus/mkulikov/app/dao/GenreDaoJdbc.java | 6 +- .../ru/otus/mkulikov/app/model/Genre.java | 5 ++ .../app/services/BooksManageSevice.java | 4 ++ .../app/services/BooksManageSeviceImpl.java | 8 +++ .../java/ru/otus/mkulikov/shell/Commands.java | 60 +++++++++++++------ src/main/resources/data.sql | 30 +++++----- src/main/resources/schema.sql | 8 +-- 7 files changed, 81 insertions(+), 40 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java index b34193e..1535ff7 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java @@ -36,17 +36,17 @@ public List getAllObjects() { @Override public int addObject(Genre genre) { - return 0; + return jdbcOperations.update("insert into Genre (name) values (?)", new Object[]{genre.getName()}); } @Override public int deleteObject(int id) { - return jdbcOperations.update("delete from Genre where id = ? ", new Object[]{id}); + return jdbcOperations.update("delete from Genre where id = ? ", new Object[]{id}); } @Override public int updateObject(Genre genre) { - return 0; + return jdbcOperations.update("update Genre set name = ? where id = ? ", new Object[]{genre.getName(), genre.getId()}); } public static class GenreMapper implements RowMapper { diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 9ba35ce..8f8a011 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -22,6 +22,11 @@ public Genre(int id, String name) { this.name = name; } + public Genre(String name) { + this.id = 0; + this.name = name; + } + @Override public String toString() { return "Genre{" + diff --git a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java index b4bf2b4..018f904 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java @@ -27,5 +27,9 @@ public interface BooksManageSevice { List getGenres(); + int addGenre(String name); + + int updateGenre(int id, String name); + int deleteGenre(int id); } diff --git a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java index 974b517..3b9b036 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java @@ -50,6 +50,14 @@ public List getGenres() { return genreDao.getAllObjects(); } + public int addGenre(String name) { + return genreDao.addObject(new Genre(name)); + } + + public int updateGenre(int id, String name) { + return genreDao.updateObject(new Genre(id, name)); + } + public int deleteGenre(int id) { return genreDao.deleteObject(id); } diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java index 7d5506b..3a77778 100644 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -24,6 +24,44 @@ public class Commands { private final BooksManageSevice booksManageSevice; + /************** + * Жанры + */ + + @ShellMethod(key = { "getGenreById" }, value = "Select genre by id.") + public String getGenreById(@ShellOption int id) { + Genre genre = booksManageSevice.getGenreById(id); + return genre.toString(); + } + + @ShellMethod(key = { "getGenres" }, value = "Select all genres.") + public String getGenres() { + List allObjects = booksManageSevice.getGenres(); + return allObjects.toString(); + } + + @ShellMethod(key = { "addGenre" }, value = "Add new genre.") + public String addGenre(@ShellOption String name) { + int count = booksManageSevice.addGenre(name); + return "Add " + count + " row(s)"; + } + + @ShellMethod(key = { "updateGenre" }, value = "Update genre by id.") + public String updateGenre(@ShellOption int id, @ShellOption String name) { + int count = booksManageSevice.updateGenre(id, name); + return "Updated " + count + " row(s)"; + } + + @ShellMethod(key = { "deleteGenre" }, value = "Delete genre by id.") + public String deleteGenre(@ShellOption int id) { + int count = booksManageSevice.deleteGenre(id); + return "Deleted " + count + " row(s)"; + } + + /************** + * Книги + */ + @ShellMethod(key = { "getBookById" }, value = "Select book by id.") public String getBookById(@ShellOption int id) { Book book = booksManageSevice.getBookById(id); @@ -36,6 +74,10 @@ public String getBooks() { return allObjects.toString(); } + /************** + * Авторы + */ + @ShellMethod(key = { "getAuthorById" }, value = "Select author by id.") public String getAuthorById(@ShellOption int id) { Author author = booksManageSevice.getAuthorById(id); @@ -47,22 +89,4 @@ public String getAuthors() { List allObjects = booksManageSevice.getAuthors(); return allObjects.toString(); } - - @ShellMethod(key = { "getGenreById" }, value = "Select genre by id.") - public String getGenreById(@ShellOption int id) { - Genre genre = booksManageSevice.getGenreById(id); - return genre.toString(); - } - - @ShellMethod(key = { "getGenres" }, value = "Select all genres.") - public String getGenres() { - List allObjects = booksManageSevice.getGenres(); - return allObjects.toString(); - } - - @ShellMethod(key = { "deleteGenre" }, value = "Delete genre by id.") - public String deleteGenre(@ShellOption int id) { - int count = booksManageSevice.deleteGenre(id); - return "Deleted " + count + " row(s)"; - } } diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index d9af4d1..e255fb4 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,27 +1,27 @@ -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (1, 'Surname1', 'FirstName1', 'SecondName1'); +insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) +values ('Surname1', 'FirstName1', 'SecondName1'); -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (2, 'Surname2', 'FirstName2', 'SecondName2'); +insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) +values ('Surname2', 'FirstName2', 'SecondName2'); -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (3, 'Surname3', 'FirstName3', 'SecondName3'); +insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) +values ('Surname3', 'FirstName3', 'SecondName3'); -------------------------- -insert into GENRE (ID, NAME) values (1, 'Genre1'); -insert into GENRE (ID, NAME) values (2, 'Genre2'); -insert into GENRE (ID, NAME) values (3, 'Genre3'); +insert into GENRE (NAME) values ('Genre1'); +insert into GENRE (NAME) values ('Genre2'); +insert into GENRE (NAME) values ('Genre3'); -------------------------- -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (1, sysdate, 'book_1', 1, 1, 'comment'); +insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (sysdate, 'book_1', 1, 1, 'comment'); -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (2, sysdate, 'book_2', 1, 1, 'comment'); +insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (sysdate, 'book_2', 1, 1, 'comment'); -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (3, sysdate, 'book_3', 1, 1, 'comment'); +insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (sysdate, 'book_3', 1, 1, 'comment'); -------------------------- diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 6771ddc..4f8c037 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,6 +1,6 @@ DROP TABLE IF EXISTS BOOK; CREATE TABLE BOOK( - ID INT PRIMARY KEY, + ID INT AUTO_INCREMENT PRIMARY KEY, ADD_RECORD_DATE DATE, CAPTION VARCHAR(255), AUTHOR_ID INT, @@ -10,7 +10,7 @@ CREATE TABLE BOOK( DROP TABLE IF EXISTS AUTHOR; CREATE TABLE AUTHOR( - ID INT PRIMARY KEY, + ID INT AUTO_INCREMENT PRIMARY KEY, SURNAME VARCHAR(100), FIRST_NAME VARCHAR(100), SECOND_NAME VARCHAR(100) @@ -18,6 +18,6 @@ CREATE TABLE AUTHOR( DROP TABLE IF EXISTS GENRE; CREATE TABLE GENRE( - ID INT PRIMARY KEY, - NAME VARCHAR(100), + ID INT AUTO_INCREMENT PRIMARY KEY, + NAME VARCHAR(100), ); \ No newline at end of file From 034a299c6a7125ff600013f71d0bacc8fc6cd747 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 28 May 2019 11:20:37 +0300 Subject: [PATCH 09/70] =?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=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20GenreDaoJdbc.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/Application.java | 2 +- .../ru/otus/mkulikov/app/dao/AuthorDao.java | 4 +- .../otus/mkulikov/app/dao/AuthorDaoJdbc.java | 2 +- .../ru/otus/mkulikov/app/dao/BookDao.java | 4 +- .../ru/otus/mkulikov/app/dao/BookDaoJdbc.java | 2 +- .../ru/otus/mkulikov/app/dao/GenreDao.java | 4 +- .../otus/mkulikov/app/dao/GenreDaoJdbc.java | 6 +- .../ru/otus/mkulikov/app/model/Author.java | 7 ++ .../java/ru/otus/mkulikov/app/model/Book.java | 9 ++ .../BooksManageSevice.java | 2 +- .../BooksManageSeviceImpl.java | 8 +- .../java/ru/otus/mkulikov/shell/Commands.java | 2 +- .../java/ru/otus/mkulikov/AppTestConfig.java | 16 +++ .../mkulikov/app/dao/GenreDaoJdbcTest.java | 105 ++++++++++++++++++ src/test/resources/test_data.sql | 27 +++++ src/test/resources/test_schema.sql | 23 ++++ 16 files changed, 210 insertions(+), 13 deletions(-) rename src/main/java/ru/otus/mkulikov/app/{services => service}/BooksManageSevice.java (93%) rename src/main/java/ru/otus/mkulikov/app/{services => service}/BooksManageSeviceImpl.java (88%) create mode 100644 src/test/java/ru/otus/mkulikov/AppTestConfig.java create mode 100644 src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java create mode 100644 src/test/resources/test_data.sql create mode 100644 src/test/resources/test_schema.sql diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index d6e34bc..7760aa8 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -16,7 +16,7 @@ */ @SpringBootApplication -@PropertySource("classpath:application.yml") +//@PropertySource("classpath:application.yml") @EnableConfigurationProperties public class Application { diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index a9b2fa6..ef336c7 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.app.dao; +import ru.otus.mkulikov.app.model.Author; + import java.util.List; /** @@ -9,7 +11,7 @@ * Time: 17:06 */ -public interface AuthorDao { +public interface AuthorDao { T getById(int id); diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java index a7e58b7..6fa4789 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java @@ -31,7 +31,7 @@ public Author getById(int id) { @Override public List getAllObjects() { - return jdbcOperations.query("select * from Author", new AuthorMapper()); + return jdbcOperations.query("select * from Author order by id", new AuthorMapper()); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index f183925..de461de 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.app.dao; +import ru.otus.mkulikov.app.model.Book; + import java.util.List; /** @@ -9,7 +11,7 @@ * Time: 13:28 */ -public interface BookDao { +public interface BookDao { T getById(int id); diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java index 5294b37..1d13930 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java @@ -32,7 +32,7 @@ public Book getById(int id) { @Override public List getAllObjects() { - return jdbcOperations.query("select * from Book", new BookMapper()); + return jdbcOperations.query("select * from Book order by id", new BookMapper()); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 1b6d511..bffc90d 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -1,5 +1,7 @@ package ru.otus.mkulikov.app.dao; +import ru.otus.mkulikov.app.model.Genre; + import java.util.List; /** @@ -9,7 +11,7 @@ * Time: 17:07 */ -public interface GenreDao { +public interface GenreDao { T getById(int id); diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java index 1535ff7..2ee2fe5 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java @@ -1,11 +1,15 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.app.model.Genre; +import javax.annotation.PostConstruct; +import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; @@ -31,7 +35,7 @@ public Genre getById(int id) { @Override public List getAllObjects() { - return jdbcOperations.query("select * from Genre", new GenreMapper()); + return jdbcOperations.query("select * from Genre order by id", new GenreMapper()); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index 2bba880..489268f 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -26,6 +26,13 @@ public Author(int id, String surname, String first_name, String second_name) { this.second_name = second_name; } + public Author(String surname, String first_name, String second_name) { + this.id = 0; + this.surname = surname; + this.first_name = first_name; + this.second_name = second_name; + } + @Override public String toString() { return "Author{" + diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 4d31e82..c90e411 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -32,6 +32,15 @@ public Book(int id, Date add_record_date, String caption, int author_id, int gen this.comment = comment; } + public Book(Date add_record_date, String caption, int author_id, int genre_id, String comment) { + this.id = 0; + this.add_record_date = add_record_date; + this.caption = caption; + this.author_id = author_id; + this.genre_id = genre_id; + this.comment = comment; + } + @Override public String toString() { return "Book{" + diff --git a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java similarity index 93% rename from src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java rename to src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java index 018f904..e805c28 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.app.services; +package ru.otus.mkulikov.app.service; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; diff --git a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java similarity index 88% rename from src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java rename to src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java index 3b9b036..ff57986 100644 --- a/src/main/java/ru/otus/mkulikov/app/services/BooksManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java @@ -1,4 +1,4 @@ -package ru.otus.mkulikov.app.services; +package ru.otus.mkulikov.app.service; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -22,9 +22,9 @@ @RequiredArgsConstructor public class BooksManageSeviceImpl implements BooksManageSevice { - private final AuthorDao authorDao; - private final BookDao bookDao; - private final GenreDao genreDao; + private final AuthorDao authorDao; + private final BookDao bookDao; + private final GenreDao genreDao; public Book getBookById(int id) { return bookDao.getById(id); diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java index 3a77778..a932e76 100644 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ b/src/main/java/ru/otus/mkulikov/shell/Commands.java @@ -7,7 +7,7 @@ import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; -import ru.otus.mkulikov.app.services.BooksManageSevice; +import ru.otus.mkulikov.app.service.BooksManageSevice; import java.util.List; diff --git a/src/test/java/ru/otus/mkulikov/AppTestConfig.java b/src/test/java/ru/otus/mkulikov/AppTestConfig.java new file mode 100644 index 0000000..85f7510 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/AppTestConfig.java @@ -0,0 +1,16 @@ +package ru.otus.mkulikov; + +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 28.05.2019 + * Time: 9:47 + */ + +@SpringBootConfiguration +@EnableConfigurationProperties +public class AppTestConfig { +} diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java new file mode 100644 index 0000000..82630d6 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java @@ -0,0 +1,105 @@ +package ru.otus.mkulikov.app.dao; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 28.05.2019 + * Time: 9:45 + */ + +@DisplayName("Класс GenreDaoJdbc") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AppTestConfig.class) +class GenreDaoJdbcTest { + + private GenreDaoJdbc genreDaoJdbc; + + @BeforeEach + public void setup() { + EmbeddedDatabase db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .addScript("test_schema.sql") + .addScript("test_data.sql") + .build(); + + genreDaoJdbc = new GenreDaoJdbc(new JdbcTemplate(db)); + } + + @Test + void getById() { + Genre genre = genreDaoJdbc.getById(1); + + assertAll("genre", + () -> assertNotNull(genre), + () -> assertEquals(1, genre.getId()), + () -> assertEquals("Genre1", genre.getName()) + ); + } + + @Test + void getAllObjects() { + List genres = genreDaoJdbc.getAllObjects(); + + assertAll("genres", + () -> assertNotNull(genres), + () -> assertEquals(3, genres.size()), + () -> assertEquals("Genre1", genres.get(0).getName()), + () -> assertEquals("Genre2", genres.get(1).getName()), + () -> assertEquals("Genre3", genres.get(2).getName()) + ); + } + + @Test + void addObject() { + genreDaoJdbc.addObject(new Genre("Test4")); + + Genre genre = genreDaoJdbc.getById(4); + + assertAll("genre", + () -> assertNotNull(genre), + () -> assertEquals(4, genre.getId()), + () -> assertEquals("Test4", genre.getName()) + ); + } + + @Test + void deleteObject() { + int count = genreDaoJdbc.deleteObject(1); + + assertAll("genre", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { genreDaoJdbc.getById(1); }) + ); + } + + @Test + void updateObject() { + Genre genre1 = genreDaoJdbc.getById(1); + int count = genreDaoJdbc.updateObject(new Genre(1, "UpdatedName")); + Genre genre2 = genreDaoJdbc.getById(1); + + assertAll("genre", + () -> assertEquals(1, count), + () -> assertEquals("Genre1", genre1.getName()), + () -> assertEquals("UpdatedName", genre2.getName()) + ); + } +} \ No newline at end of file diff --git a/src/test/resources/test_data.sql b/src/test/resources/test_data.sql new file mode 100644 index 0000000..e255fb4 --- /dev/null +++ b/src/test/resources/test_data.sql @@ -0,0 +1,27 @@ +insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) +values ('Surname1', 'FirstName1', 'SecondName1'); + +insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) +values ('Surname2', 'FirstName2', 'SecondName2'); + +insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) +values ('Surname3', 'FirstName3', 'SecondName3'); + +-------------------------- + +insert into GENRE (NAME) values ('Genre1'); +insert into GENRE (NAME) values ('Genre2'); +insert into GENRE (NAME) values ('Genre3'); + +-------------------------- + +insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (sysdate, 'book_1', 1, 1, 'comment'); + +insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (sysdate, 'book_2', 1, 1, 'comment'); + +insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) + values (sysdate, 'book_3', 1, 1, 'comment'); + +-------------------------- diff --git a/src/test/resources/test_schema.sql b/src/test/resources/test_schema.sql new file mode 100644 index 0000000..4f8c037 --- /dev/null +++ b/src/test/resources/test_schema.sql @@ -0,0 +1,23 @@ +DROP TABLE IF EXISTS BOOK; +CREATE TABLE BOOK( + ID INT AUTO_INCREMENT PRIMARY KEY, + ADD_RECORD_DATE DATE, + CAPTION VARCHAR(255), + AUTHOR_ID INT, + GENRE_ID INT, + COMMENT VARCHAR(255) +); + +DROP TABLE IF EXISTS AUTHOR; +CREATE TABLE AUTHOR( + ID INT AUTO_INCREMENT PRIMARY KEY, + SURNAME VARCHAR(100), + FIRST_NAME VARCHAR(100), + SECOND_NAME VARCHAR(100) +); + +DROP TABLE IF EXISTS GENRE; +CREATE TABLE GENRE( + ID INT AUTO_INCREMENT PRIMARY KEY, + NAME VARCHAR(100), +); \ No newline at end of file From 0c2804a738fb7d3188d047551dbf298eea2664a4 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 28 May 2019 14:05:56 +0300 Subject: [PATCH 10/70] =?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=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20BookDaoJdbc.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/otus/mkulikov/app/dao/AuthorDao.java | 2 +- .../otus/mkulikov/app/dao/AuthorDaoJdbc.java | 10 +- .../ru/otus/mkulikov/app/dao/BookDao.java | 2 +- .../ru/otus/mkulikov/app/dao/BookDaoJdbc.java | 9 +- .../ru/otus/mkulikov/app/model/Author.java | 20 +-- .../java/ru/otus/mkulikov/app/model/Book.java | 35 +++-- .../mkulikov/app/dao/BookDaoJdbcTest.java | 120 ++++++++++++++++++ .../mkulikov/app/dao/GenreDaoJdbcTest.java | 3 +- src/test/resources/test_data.sql | 6 +- 9 files changed, 168 insertions(+), 39 deletions(-) create mode 100644 src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index ef336c7..dfeba2f 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -19,7 +19,7 @@ public interface AuthorDao { int addObject(T t); - void deleteObject(T t); + int deleteObject(int id); int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java index 6fa4789..8474f7b 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java @@ -40,8 +40,8 @@ public int addObject(Author book) { } @Override - public void deleteObject(Author book) { - + public int deleteObject(int id) { + return 0; } @Override @@ -55,10 +55,10 @@ private static class AuthorMapper implements RowMapper { public Author mapRow(ResultSet resultSet, int i) throws SQLException { int id = resultSet.getInt("ID"); String surname = resultSet.getString("SURNAME"); - String first_name = resultSet.getString("FIRST_NAME"); - String second_name = resultSet.getString("SECOND_NAME"); + String firstName = resultSet.getString("FIRST_NAME"); + String secondName = resultSet.getString("SECOND_NAME"); - return new Author(id, surname, first_name, second_name); + return new Author(id, surname, firstName, secondName); } } } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index de461de..431f064 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -19,7 +19,7 @@ public interface BookDao { int addObject(T t); - void deleteObject(T t); + int deleteObject(int id); int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java index 1d13930..533e9b9 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java @@ -8,6 +8,7 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; import java.util.Date; import java.util.List; @@ -41,8 +42,8 @@ public int addObject(Book book) { } @Override - public void deleteObject(Book book) { - + public int deleteObject(int id) { + return 0; } @Override @@ -55,13 +56,13 @@ private static class BookMapper implements RowMapper { @Override public Book mapRow(ResultSet resultSet, int i) throws SQLException { int id = resultSet.getInt("ID"); - Date add_record_date = resultSet.getDate("ADD_RECORD_DATE"); + Date addRecordDate = resultSet.getDate("ADD_RECORD_DATE"); String caption = resultSet.getString("CAPTION"); int author_id = resultSet.getInt("AUTHOR_ID"); int genre_id = resultSet.getInt("GENRE_ID"); String comment = resultSet.getString("COMMENT"); - return new Book(id, add_record_date, caption, author_id, genre_id, comment); + return new Book(id, addRecordDate, caption, author_id, genre_id, comment); } } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index 489268f..e81c78a 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -16,21 +16,21 @@ public class Author { private final int id; private final String surname; - private final String first_name; - private final String second_name; + private final String firstName; + private final String secondName; - public Author(int id, String surname, String first_name, String second_name) { + public Author(int id, String surname, String firstName, String secondName) { this.id = id; this.surname = surname; - this.first_name = first_name; - this.second_name = second_name; + this.firstName = firstName; + this.secondName = secondName; } - public Author(String surname, String first_name, String second_name) { + public Author(String surname, String firstName, String secondName) { this.id = 0; this.surname = surname; - this.first_name = first_name; - this.second_name = second_name; + this.firstName = firstName; + this.secondName = secondName; } @Override @@ -38,8 +38,8 @@ public String toString() { return "Author{" + "id=" + id + ", surname='" + surname + '\'' + - ", first_name='" + first_name + '\'' + - ", second_name='" + second_name + '\'' + + ", firstName='" + firstName + '\'' + + ", secondName='" + secondName + '\'' + "}\n"; } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index c90e411..ec890ba 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -2,6 +2,8 @@ import lombok.Data; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Date; /** @@ -17,38 +19,43 @@ public class Book { private final int id; - private final Date add_record_date; + private final Date addRecordDate; private final String caption; - private final int author_id; - private final int genre_id; + private final int authorId; + private final int genreId; private final String comment; - public Book(int id, Date add_record_date, String caption, int author_id, int genre_id, String comment) { + public Book(int id, Date addRecordDate, String caption, int authorId, int genreId, String comment) { this.id = id; - this.add_record_date = add_record_date; + this.addRecordDate = addRecordDate; this.caption = caption; - this.author_id = author_id; - this.genre_id = genre_id; + this.authorId = authorId; + this.genreId = genreId; this.comment = comment; } - public Book(Date add_record_date, String caption, int author_id, int genre_id, String comment) { + public Book(Date addRecordDate, String caption, int authorId, int genreId, String comment) { this.id = 0; - this.add_record_date = add_record_date; + this.addRecordDate = addRecordDate; this.caption = caption; - this.author_id = author_id; - this.genre_id = genre_id; + this.authorId = authorId; + this.genreId = genreId; this.comment = comment; } + public String getAddRecordDateString() { + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + return addRecordDate != null ? dateFormat.format(addRecordDate) : null; + } + @Override public String toString() { return "Book{" + "id=" + id + - ", add_record_date=" + add_record_date + + ", addRecordDate=" + addRecordDate + ", caption='" + caption + '\'' + - ", author_id=" + author_id + - ", genre_id=" + genre_id + + ", authorId=" + authorId + + ", genreId=" + genreId + ", comment='" + comment + '\'' + "}\n"; } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java new file mode 100644 index 0000000..a1de4d9 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java @@ -0,0 +1,120 @@ +package ru.otus.mkulikov.app.dao; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.model.Book; + +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 28.05.2019 + * Time: 13:16 + */ + +@DisplayName("Класс BookDaoJdbc") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AppTestConfig.class) +class BookDaoJdbcTest { + + private BookDaoJdbc bookDaoJdbc; + + @BeforeEach + public void setup() { + EmbeddedDatabase db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .addScript("test_schema.sql") + .addScript("test_data.sql") + .build(); + + bookDaoJdbc = new BookDaoJdbc(new JdbcTemplate(db)); + } + + @Test + void getById() { + Book book = bookDaoJdbc.getById(1); + + assertAll("book", + () -> assertNotNull(book), + () -> assertEquals(1, book.getId()), + () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("book_1", book.getCaption()), + () -> assertEquals(1, book.getAuthorId()), + () -> assertEquals(1, book.getGenreId()), + () -> assertEquals("comment", book.getComment()) + ); + } + + @Test + void getAllObjects() { + List books = bookDaoJdbc.getAllObjects(); + + assertAll("books", + () -> assertNotNull(books), + () -> assertEquals(3, books.size()), + () -> assertEquals("book_1", books.get(0).getCaption()), + () -> assertEquals("book_2", books.get(1).getCaption()), + () -> assertEquals("book_3", books.get(2).getCaption()) + ); + } + + @Test + void addObject() { + int count = bookDaoJdbc.addObject( + new Book(new Date(),"Test_Book",2,3,"Test_Comment") + ); + + Book book = bookDaoJdbc.getById(4); + + assertAll("book", + () -> assertNotNull(book), + () -> assertEquals(1, count), + () -> assertEquals(4, book.getId()), + () -> assertEquals("Test_Book", book.getCaption()), + () -> assertEquals("2", book.getAuthorId()), + () -> assertEquals("3", book.getGenreId()), + () -> assertEquals("Test_Comment", book.getCaption()) + ); + } + + @Test + void deleteObject() { + int count = bookDaoJdbc.deleteObject(1); + + assertAll("book", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { bookDaoJdbc.getById(1); }) + ); + } + + @Test + void updateObject() { + Book book1 = bookDaoJdbc.getById(1); + int count = bookDaoJdbc.updateObject( + new Book(1, new Date(),"Test_Book",2,3,"Test_Comment") + ); + Book book2 = bookDaoJdbc.getById(1); + + assertAll("book", + () -> assertEquals(1, count), + () -> assertEquals("book_1", book1.getCaption()), + () -> assertEquals("comment", book1.getComment()), + () -> assertEquals("Test_Book", book2.getCaption()), + () -> assertEquals("Test_Comment", book2.getComment()) + ); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java index 82630d6..c9590e4 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java @@ -69,12 +69,13 @@ void getAllObjects() { @Test void addObject() { - genreDaoJdbc.addObject(new Genre("Test4")); + int count = genreDaoJdbc.addObject(new Genre("Test4")); Genre genre = genreDaoJdbc.getById(4); assertAll("genre", () -> assertNotNull(genre), + () -> assertEquals(1, count), () -> assertEquals(4, genre.getId()), () -> assertEquals("Test4", genre.getName()) ); diff --git a/src/test/resources/test_data.sql b/src/test/resources/test_data.sql index e255fb4..02531b1 100644 --- a/src/test/resources/test_data.sql +++ b/src/test/resources/test_data.sql @@ -16,12 +16,12 @@ insert into GENRE (NAME) values ('Genre3'); -------------------------- insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (sysdate, 'book_1', 1, 1, 'comment'); + values (to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'comment'); insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (sysdate, 'book_2', 1, 1, 'comment'); + values (to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'comment'); insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (sysdate, 'book_3', 1, 1, 'comment'); + values (to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'comment'); -------------------------- From 64febb3c5763d9d1506e7e985c69280ba575b0b1 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 29 May 2019 11:38:10 +0300 Subject: [PATCH 11/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20AuthorDaoJdbc,=20BookDaoJdbc=20=D0=B8=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=BA=20=D0=BD=D0=B8=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../otus/mkulikov/app/dao/AuthorDaoJdbc.java | 16 ++- .../ru/otus/mkulikov/app/dao/BookDaoJdbc.java | 12 +- .../mkulikov/app/dao/AuthorDaoJdbcTest.java | 116 ++++++++++++++++++ .../mkulikov/app/dao/BookDaoJdbcTest.java | 6 +- 4 files changed, 139 insertions(+), 11 deletions(-) create mode 100644 src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java index 8474f7b..ae64ebd 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java @@ -35,18 +35,24 @@ public List getAllObjects() { } @Override - public int addObject(Author book) { - return 0; + public int addObject(Author author) { + return jdbcOperations.update( + "insert into Author (surname, first_name, second_name) values (?,?,?)", + new Object[]{author.getSurname(), author.getFirstName(), author.getSecondName()} + ); } @Override public int deleteObject(int id) { - return 0; + return jdbcOperations.update("delete from Author where id = ? ", new Object[]{id}); } @Override - public int updateObject(Author book) { - return 0; + public int updateObject(Author author) { + return jdbcOperations.update( + "update Author set surname = ?, first_name = ?, second_name = ? where id = ? ", + new Object[]{author.getSurname(), author.getFirstName(), author.getSecondName(), author.getId()} + ); } private static class AuthorMapper implements RowMapper { diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java index 533e9b9..89a0c16 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java @@ -38,17 +38,23 @@ public List getAllObjects() { @Override public int addObject(Book book) { - return 0; + return jdbcOperations.update( + "insert into Book (add_record_date, caption, author_id, genre_id, comment) values (sysdate,?,?,?,?)", + new Object[]{book.getCaption(), book.getAuthorId(), book.getGenreId(), book.getComment()} + ); } @Override public int deleteObject(int id) { - return 0; + return jdbcOperations.update("delete from Book where id = ? ", new Object[]{id}); } @Override public int updateObject(Book book) { - return 0; + return jdbcOperations.update( + "update Book set add_record_date = sysdate, caption = ?, author_id = ?, genre_id = ?, comment = ? where id = ? ", + new Object[]{book.getCaption(), book.getAuthorId(), book.getGenreId(), book.getComment(), book.getId()} + ); } private static class BookMapper implements RowMapper { diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java new file mode 100644 index 0000000..38b0fad --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java @@ -0,0 +1,116 @@ +package ru.otus.mkulikov.app.dao; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.model.Author; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 29.05.2019 + * Time: 10:12 + */ + +@DisplayName("Класс AuthorDaoJdbc") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AppTestConfig.class) +class AuthorDaoJdbcTest { + + private AuthorDaoJdbc authorDaoJdbc; + + @BeforeEach + public void setup() { + EmbeddedDatabase db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .addScript("test_schema.sql") + .addScript("test_data.sql") + .build(); + + authorDaoJdbc = new AuthorDaoJdbc(new JdbcTemplate(db)); + } + + @Test + void getById() { + Author author = authorDaoJdbc.getById(1); + + assertAll("author", + () -> assertNotNull(author), + () -> assertEquals(1, author.getId()), + () -> assertEquals("Surname1", author.getSurname()), + () -> assertEquals("FirstName1", author.getFirstName()), + () -> assertEquals("SecondName1", author.getSecondName()) + ); + } + + @Test + void getAllObjects() { + List authors = authorDaoJdbc.getAllObjects(); + + assertAll("authors", + () -> assertNotNull(authors), + () -> assertEquals(3, authors.size()), + () -> assertEquals("Surname1", authors.get(0).getSurname()), + () -> assertEquals("Surname2", authors.get(1).getSurname()), + () -> assertEquals("Surname3", authors.get(2).getSurname()) + ); + } + + @Test + void addObject() { + Author author = new Author("TestSurname", "TestFirstName", "TestSecondName"); + int count = authorDaoJdbc.addObject(author); + Author author_selected = authorDaoJdbc.getById(4); + + assertAll("author", + () -> assertNotNull(author_selected), + () -> assertEquals(1, count), + () -> assertEquals(4, author_selected.getId()), + () -> assertEquals(author.getSurname(), author_selected.getSurname()), + () -> assertEquals(author.getFirstName(), author_selected.getFirstName()), + () -> assertEquals(author.getSecondName(), author_selected.getSecondName()) + ); + } + + @Test + void deleteObject() { + int count = authorDaoJdbc.deleteObject(1); + + assertAll("author", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { authorDaoJdbc.getById(1); }) + ); + } + + @Test + void updateObject() { + Author author1 = authorDaoJdbc.getById(1); + int count = authorDaoJdbc.updateObject( + new Author(1,"TestSurname", "TestFirstName", "TestSecondName") + ); + Author author2 = authorDaoJdbc.getById(1); + + assertAll("author", + () -> assertEquals(1, count), + () -> assertEquals("Surname1", author1.getSurname()), + () -> assertEquals("FirstName1", author1.getFirstName()), + () -> assertEquals("SecondName1", author1.getSecondName()), + () -> assertEquals("TestSurname", author2.getSurname()), + () -> assertEquals("TestFirstName", author2.getFirstName()), + () -> assertEquals("TestSecondName", author2.getSecondName()) + ); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java index a1de4d9..69958db 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java @@ -85,9 +85,9 @@ void addObject() { () -> assertEquals(1, count), () -> assertEquals(4, book.getId()), () -> assertEquals("Test_Book", book.getCaption()), - () -> assertEquals("2", book.getAuthorId()), - () -> assertEquals("3", book.getGenreId()), - () -> assertEquals("Test_Comment", book.getCaption()) + () -> assertEquals(2, book.getAuthorId()), + () -> assertEquals(3, book.getGenreId()), + () -> assertEquals("Test_Comment", book.getComment()) ); } From 27e65385e4779c18601d294e76a66c1a063ceae0 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 29 May 2019 12:32:39 +0300 Subject: [PATCH 12/70] =?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=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?,=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/app/model/Book.java | 24 +++++++----- .../app/service/BooksManageSevice.java | 14 ++++++- .../app/service/BooksManageSeviceImpl.java | 39 +++++++++++++++++++ .../mkulikov/app/dao/BookDaoJdbcTest.java | 2 +- .../ru/otus/mkulikov/app/model/BookTest.java | 39 +++++++++++++++++++ 5 files changed, 107 insertions(+), 11 deletions(-) create mode 100644 src/test/java/ru/otus/mkulikov/app/model/BookTest.java diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index ec890ba..e141a0a 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -18,12 +18,12 @@ @Data public class Book { - private final int id; - private final Date addRecordDate; - private final String caption; - private final int authorId; - private final int genreId; - private final String comment; + private int id; + private Date addRecordDate; + private String caption; + private int authorId; + private int genreId; + private String comment; public Book(int id, Date addRecordDate, String caption, int authorId, int genreId, String comment) { this.id = id; @@ -34,9 +34,15 @@ public Book(int id, Date addRecordDate, String caption, int authorId, int genreI this.comment = comment; } - public Book(Date addRecordDate, String caption, int authorId, int genreId, String comment) { - this.id = 0; - this.addRecordDate = addRecordDate; + public Book(int id, String caption, int authorId, int genreId, String comment) { + this.id = id; + this.caption = caption; + this.authorId = authorId; + this.genreId = genreId; + this.comment = comment; + } + + public Book(String caption, int authorId, int genreId, String comment) { this.caption = caption; this.authorId = authorId; this.genreId = genreId; diff --git a/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java index e805c28..855111e 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java @@ -25,11 +25,23 @@ public interface BooksManageSevice { Genre getGenreById(int id); - List getGenres(); + List getGenres(); int addGenre(String name); int updateGenre(int id, String name); int deleteGenre(int id); + + int addBook(String caption, int authorId, int genreId, String comment); + + int updateBook(int id, String caption, int authorId, int genreId, String comment); + + int deleteBook(int id); + + int addAuthor(String surname, String firstName, String secondName); + + int updateAuthor(int id, String surname, String firstName, String secondName); + + int deleteAuthor(int id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java index ff57986..601fc77 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java @@ -26,39 +26,78 @@ public class BooksManageSeviceImpl implements BooksManageSevice { private final BookDao bookDao; private final GenreDao genreDao; + @Override public Book getBookById(int id) { return bookDao.getById(id); } + @Override public List getBooks() { return bookDao.getAllObjects(); } + @Override public Author getAuthorById(int id) { return authorDao.getById(id); } + @Override public List getAuthors() { return authorDao.getAllObjects(); } + @Override public Genre getGenreById(int id) { return genreDao.getById(id); } + @Override public List getGenres() { return genreDao.getAllObjects(); } + @Override public int addGenre(String name) { return genreDao.addObject(new Genre(name)); } + @Override public int updateGenre(int id, String name) { return genreDao.updateObject(new Genre(id, name)); } + @Override public int deleteGenre(int id) { return genreDao.deleteObject(id); } + + @Override + public int addBook(String caption, int authorId, int genreId, String comment) { + return bookDao.addObject(new Book(caption, authorId, genreId, comment)); + } + + @Override + public int updateBook(int id, String caption, int authorId, int genreId, String comment) { + return bookDao.updateObject(new Book(id, caption, authorId, genreId, comment)); + } + + @Override + public int deleteBook(int id) { + return bookDao.deleteObject(id); + } + + @Override + public int addAuthor(String surname, String firstName, String secondName) { + return authorDao.addObject(new Author(surname, firstName, secondName)); + } + + @Override + public int updateAuthor(int id, String surname, String firstName, String secondName) { + return authorDao.updateObject(new Author(id, surname, firstName, secondName)); + } + + @Override + public int deleteAuthor(int id) { + return authorDao.deleteObject(id); + } } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java index 69958db..f019089 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java @@ -75,7 +75,7 @@ void getAllObjects() { @Test void addObject() { int count = bookDaoJdbc.addObject( - new Book(new Date(),"Test_Book",2,3,"Test_Comment") + new Book("Test_Book",2,3,"Test_Comment") ); Book book = bookDaoJdbc.getById(4); diff --git a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java new file mode 100644 index 0000000..9932b6d --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java @@ -0,0 +1,39 @@ +package ru.otus.mkulikov.app.model; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.AppTestConfig; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 29.05.2019 + * Time: 11:39 + */ + +@DisplayName("Класс Book") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AppTestConfig.class) +class BookTest { + + @Test + void getAddRecordDateString() { + Date date = new Date(); + Book book = new Book(1, date, "Test_Book", 2, 3, "Test_Comment"); + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + assertAll("book", + () -> assertNotNull(book), + () -> assertEquals(dateFormat.format(date), book.getAddRecordDateString()) + ); + } +} \ No newline at end of file From f23fcd4d4087c3c4d7c6a8695118613c50132829 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 29 May 2019 15:19:11 +0300 Subject: [PATCH 13/70] =?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=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20BooksManageSevice.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/BooksManageSeviceImplTest.java | 251 ++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 src/test/java/ru/otus/mkulikov/app/service/BooksManageSeviceImplTest.java diff --git a/src/test/java/ru/otus/mkulikov/app/service/BooksManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BooksManageSeviceImplTest.java new file mode 100644 index 0000000..a14b73e --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/service/BooksManageSeviceImplTest.java @@ -0,0 +1,251 @@ +package ru.otus.mkulikov.app.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.dao.AuthorDaoJdbc; +import ru.otus.mkulikov.app.dao.BookDaoJdbc; +import ru.otus.mkulikov.app.dao.GenreDaoJdbc; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 29.05.2019 + * Time: 13:40 + */ + +@DisplayName("Класс BooksManageSevice") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AppTestConfig.class) +class BooksManageSeviceImplTest { + + private BooksManageSevice booksManageSevice; + + @BeforeEach + public void setup() { + EmbeddedDatabase db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .addScript("test_schema.sql") + .addScript("test_data.sql") + .build(); + + AuthorDaoJdbc authorDaoJdbc = new AuthorDaoJdbc(new JdbcTemplate(db)); + BookDaoJdbc bookDaoJdbc = new BookDaoJdbc(new JdbcTemplate(db)); + GenreDaoJdbc genreDaoJdbc = new GenreDaoJdbc(new JdbcTemplate(db)); + + booksManageSevice = new BooksManageSeviceImpl(authorDaoJdbc, bookDaoJdbc, genreDaoJdbc); + } + + @Test + void getBookById() { + Book book = booksManageSevice.getBookById(1); + + assertAll("book", + () -> assertNotNull(book), + () -> assertEquals(1, book.getId()), + () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("book_1", book.getCaption()), + () -> assertEquals(1, book.getAuthorId()), + () -> assertEquals(1, book.getGenreId()), + () -> assertEquals("comment", book.getComment()) + ); + } + + @Test + void getBooks() { + List books = booksManageSevice.getBooks(); + + assertAll("books", + () -> assertNotNull(books), + () -> assertEquals(3, books.size()), + () -> assertEquals("book_1", books.get(0).getCaption()), + () -> assertEquals("book_2", books.get(1).getCaption()), + () -> assertEquals("book_3", books.get(2).getCaption()) + ); + } + + @Test + void getAuthorById() { + Author author = booksManageSevice.getAuthorById(1); + + assertAll("author", + () -> assertNotNull(author), + () -> assertEquals(1, author.getId()), + () -> assertEquals("Surname1", author.getSurname()), + () -> assertEquals("FirstName1", author.getFirstName()), + () -> assertEquals("SecondName1", author.getSecondName()) + ); + } + + @Test + void getAuthors() { + List authors = booksManageSevice.getAuthors(); + + assertAll("authors", + () -> assertNotNull(authors), + () -> assertEquals(3, authors.size()), + () -> assertEquals("Surname1", authors.get(0).getSurname()), + () -> assertEquals("Surname2", authors.get(1).getSurname()), + () -> assertEquals("Surname3", authors.get(2).getSurname()) + ); + } + + @Test + void getGenreById() { + Genre genre = booksManageSevice.getGenreById(1); + + assertAll("genre", + () -> assertNotNull(genre), + () -> assertEquals(1, genre.getId()), + () -> assertEquals("Genre1", genre.getName()) + ); + } + + @Test + void getGenres() { + List genres = booksManageSevice.getGenres(); + + assertAll("genres", + () -> assertNotNull(genres), + () -> assertEquals(3, genres.size()), + () -> assertEquals("Genre1", genres.get(0).getName()), + () -> assertEquals("Genre2", genres.get(1).getName()), + () -> assertEquals("Genre3", genres.get(2).getName()) + ); + } + + @Test + void addGenre() { + int count = booksManageSevice.addGenre("Test4"); + Genre genre = booksManageSevice.getGenreById(4); + + assertAll("genre", + () -> assertNotNull(genre), + () -> assertEquals(1, count), + () -> assertEquals(4, genre.getId()), + () -> assertEquals("Test4", genre.getName()) + ); + } + + @Test + void updateGenre() { + Genre genre1 = booksManageSevice.getGenreById(1); + int count = booksManageSevice.updateGenre(1, "UpdatedName"); + Genre genre2 = booksManageSevice.getGenreById(1); + + assertAll("genre", + () -> assertEquals(1, count), + () -> assertEquals("Genre1", genre1.getName()), + () -> assertEquals("UpdatedName", genre2.getName()) + ); + } + + @Test + void deleteGenre() { + int count = booksManageSevice.deleteGenre(1); + + assertAll("genre", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getGenreById(1); }) + ); + } + + @Test + void addBook() { + int count = booksManageSevice.addBook("Test_Book",2,3,"Test_Comment"); + Book book = booksManageSevice.getBookById(4); + + assertAll("book", + () -> assertNotNull(book), + () -> assertEquals(1, count), + () -> assertEquals(4, book.getId()), + () -> assertEquals("Test_Book", book.getCaption()), + () -> assertEquals(2, book.getAuthorId()), + () -> assertEquals(3, book.getGenreId()), + () -> assertEquals("Test_Comment", book.getComment()) + ); + } + + @Test + void updateBook() { + Book book1 = booksManageSevice.getBookById(1); + int count = booksManageSevice.updateBook(1, "Test_Book", 2, 3, "Test_Comment"); + Book book2 = booksManageSevice.getBookById(1); + + assertAll("book", + () -> assertEquals(1, count), + () -> assertEquals("book_1", book1.getCaption()), + () -> assertEquals("comment", book1.getComment()), + () -> assertEquals("Test_Book", book2.getCaption()), + () -> assertEquals("Test_Comment", book2.getComment()) + ); + } + + @Test + void deleteBook() { + int count = booksManageSevice.deleteBook(1); + + assertAll("book", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getBookById(1); }) + ); + } + + @Test + void addAuthor() { + int count = booksManageSevice.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); + Author author_selected = booksManageSevice.getAuthorById(4); + + assertAll("author", + () -> assertNotNull(author_selected), + () -> assertEquals(1, count), + () -> assertEquals(4, author_selected.getId()), + () -> assertEquals("TestSurname", author_selected.getSurname()), + () -> assertEquals("TestFirstName", author_selected.getFirstName()), + () -> assertEquals("TestSecondName", author_selected.getSecondName()) + ); + } + + @Test + void updateAuthor() { + Author author1 = booksManageSevice.getAuthorById(1); + int count = booksManageSevice.updateAuthor(1,"TestSurname", "TestFirstName", "TestSecondName"); + Author author2 = booksManageSevice.getAuthorById(1); + + assertAll("author", + () -> assertEquals(1, count), + () -> assertEquals("Surname1", author1.getSurname()), + () -> assertEquals("FirstName1", author1.getFirstName()), + () -> assertEquals("SecondName1", author1.getSecondName()), + () -> assertEquals("TestSurname", author2.getSurname()), + () -> assertEquals("TestFirstName", author2.getFirstName()), + () -> assertEquals("TestSecondName", author2.getSecondName()) + ); + } + + @Test + void deleteAuthor() { + int count = booksManageSevice.deleteAuthor(1); + + assertAll("author", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getAuthorById(1); }) + ); + } +} \ No newline at end of file From 486d0a3788b1024dc76e625a13be55d2eded94c8 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 30 May 2019 16:34:48 +0300 Subject: [PATCH 14/70] =?UTF-8?q?-=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D0=B0.=20-=20=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BD=D0=B0=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B8?= =?UTF-8?q?.=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=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 --- .../java/ru/otus/mkulikov/Application.java | 5 - .../ru/otus/mkulikov/app/model/Author.java | 6 +- .../java/ru/otus/mkulikov/app/model/Book.java | 19 +- .../ru/otus/mkulikov/app/model/Genre.java | 2 - .../app/service/AuthorManageService.java | 25 ++ .../app/service/AuthorManageServiceImpl.java | 47 ++++ .../app/service/BookManageSevice.java | 29 ++ .../app/service/BookManageSeviceImpl.java | 72 +++++ .../app/service/BooksManageSevice.java | 47 ---- .../app/service/BooksManageSeviceImpl.java | 103 ------- .../app/service/GenreManageService.java | 24 ++ .../app/service/GenreManageServiceImpl.java | 47 ++++ .../otus/mkulikov/shell/AuthorCommands.java | 54 ++++ .../ru/otus/mkulikov/shell/BookCommands.java | 66 +++++ .../java/ru/otus/mkulikov/shell/Commands.java | 92 ------- .../ru/otus/mkulikov/shell/GenreCommands.java | 54 ++++ src/main/resources/schema.sql | 12 +- .../ru/otus/mkulikov/app/model/BookTest.java | 9 +- .../service/AuthorManageSeviceImplTest.java | 118 ++++++++ .../app/service/BookManageSeviceImplTest.java | 141 ++++++++++ .../service/BooksManageSeviceImplTest.java | 251 ------------------ .../service/GenreManageSeviceImplTest.java | 110 ++++++++ src/test/resources/test_schema.sql | 12 +- 23 files changed, 826 insertions(+), 519 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java create mode 100644 src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java create mode 100644 src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java delete mode 100644 src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java delete mode 100644 src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java create mode 100644 src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java create mode 100644 src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java create mode 100644 src/main/java/ru/otus/mkulikov/shell/BookCommands.java delete mode 100644 src/main/java/ru/otus/mkulikov/shell/Commands.java create mode 100644 src/main/java/ru/otus/mkulikov/shell/GenreCommands.java create mode 100644 src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java create mode 100644 src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java delete mode 100644 src/test/java/ru/otus/mkulikov/app/service/BooksManageSeviceImplTest.java create mode 100644 src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 7760aa8..a45b459 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.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; - /** * Created by IntelliJ IDEA. @@ -16,13 +13,11 @@ */ @SpringBootApplication -//@PropertySource("classpath:application.yml") @EnableConfigurationProperties public class Application { public static void main(String[] args) throws Exception { SpringApplication.run(Application.class); - //ApplicationContext context = SpringApplication.run(Application.class); //Console.main(args); } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index e81c78a..d087534 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -7,8 +7,6 @@ * Developer: Maksim Kulikov * Date: 23.05.2019 * Time: 17:02 - * - * Сущность таблицы авторов */ @Data @@ -33,6 +31,10 @@ public Author(String surname, String firstName, String secondName) { this.secondName = secondName; } + public String toFormatedString() { + return getSurname() + " " + getFirstName() + " " + getSecondName(); + } + @Override public String toString() { return "Author{" + diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index e141a0a..7c87c7a 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -5,14 +5,13 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov * Date: 23.05.2019 * Time: 13:28 - * - * Сущность таблицы книг */ @Data @@ -23,6 +22,8 @@ public class Book { private String caption; private int authorId; private int genreId; + private Author author; + private Genre genre; private String comment; public Book(int id, Date addRecordDate, String caption, int authorId, int genreId, String comment) { @@ -54,6 +55,18 @@ public String getAddRecordDateString() { return addRecordDate != null ? dateFormat.format(addRecordDate) : null; } + public String getAuthorString() { + return (author != null) + ? ", author='" + author.toFormatedString() + '\'' + : ""; + } + + public String getGenreString() { + return (genre != null) + ? ", genre='" + genre.getName() + '\'' + : ""; + } + @Override public String toString() { return "Book{" + @@ -63,6 +76,8 @@ public String toString() { ", authorId=" + authorId + ", genreId=" + genreId + ", comment='" + comment + '\'' + + getAuthorString() + + getGenreString() + "}\n"; } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 8f8a011..2f2d528 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -7,8 +7,6 @@ * Developer: Maksim Kulikov * Date: 23.05.2019 * Time: 17:04 - * - * Сущность таблицы жанров */ @Data diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java new file mode 100644 index 0000000..b11706d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java @@ -0,0 +1,25 @@ +package ru.otus.mkulikov.app.service; + +import ru.otus.mkulikov.app.model.Author; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 14:59 + */ + +public interface AuthorManageService { + + T getAuthorById(int id); + + List getAuthors(); + + int addAuthor(String surname, String firstName, String secondName); + + int updateAuthor(int id, String surname, String firstName, String secondName); + + int deleteAuthor(int id); +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java new file mode 100644 index 0000000..9237363 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -0,0 +1,47 @@ +package ru.otus.mkulikov.app.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.otus.mkulikov.app.dao.AuthorDao; +import ru.otus.mkulikov.app.model.Author; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 15:53 + */ + +@Service +@RequiredArgsConstructor +public class AuthorManageServiceImpl implements AuthorManageService { + + private final AuthorDao authorDao; + + @Override + public Author getAuthorById(int id) { + return authorDao.getById(id); + } + + @Override + public List getAuthors() { + return authorDao.getAllObjects(); + } + + @Override + public int addAuthor(String surname, String firstName, String secondName) { + return authorDao.addObject(new Author(surname, firstName, secondName)); + } + + @Override + public int updateAuthor(int id, String surname, String firstName, String secondName) { + return authorDao.updateObject(new Author(id, surname, firstName, secondName)); + } + + @Override + public int deleteAuthor(int id) { + return authorDao.deleteObject(id); + } +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java new file mode 100644 index 0000000..552cd31 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -0,0 +1,29 @@ +package ru.otus.mkulikov.app.service; + +import ru.otus.mkulikov.app.model.Book; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 27.05.2019 + * Time: 13:42 + */ + +public interface BookManageSevice { + + T getBookById(int id); + + T getFullBookById(int id); + + List getBooks(); + + List getFullBooks(); + + int addBook(String caption, int authorId, int genreId, String comment); + + int updateBook(int id, String caption, int authorId, int genreId, String comment); + + int deleteBook(int id); +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java new file mode 100644 index 0000000..b64c332 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -0,0 +1,72 @@ +package ru.otus.mkulikov.app.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.otus.mkulikov.app.dao.AuthorDao; +import ru.otus.mkulikov.app.dao.BookDao; +import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Book; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 27.05.2019 + * Time: 13:42 + */ + +@Service +@RequiredArgsConstructor +public class BookManageSeviceImpl implements BookManageSevice { + + private final AuthorDao authorDao; + private final BookDao bookDao; + private final GenreDao genreDao; + + @Override + public Book getBookById(int id) { + return bookDao.getById(id); + } + + @Override + public Book getFullBookById(int id) { + Book book = bookDao.getById(id); + return setBookInfo(book); + } + + @Override + public List getBooks() { + return bookDao.getAllObjects(); + } + + @Override + public List getFullBooks() { + List books = bookDao.getAllObjects(); + for (Book book : books) { + setBookInfo(book); + } + return books; + } + + private Book setBookInfo(Book book) { + book.setAuthor(authorDao.getById(book.getAuthorId())); + book.setGenre(genreDao.getById(book.getGenreId())); + return book; + } + + @Override + public int addBook(String caption, int authorId, int genreId, String comment) { + return bookDao.addObject(new Book(caption, authorId, genreId, comment)); + } + + @Override + public int updateBook(int id, String caption, int authorId, int genreId, String comment) { + return bookDao.updateObject(new Book(id, caption, authorId, genreId, comment)); + } + + @Override + public int deleteBook(int id) { + return bookDao.deleteObject(id); + } +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java deleted file mode 100644 index 855111e..0000000 --- a/src/main/java/ru/otus/mkulikov/app/service/BooksManageSevice.java +++ /dev/null @@ -1,47 +0,0 @@ -package ru.otus.mkulikov.app.service; - -import ru.otus.mkulikov.app.model.Author; -import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Genre; - -import java.util.List; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 27.05.2019 - * Time: 13:42 - */ - -public interface BooksManageSevice { - - Book getBookById(int id); - - List getBooks(); - - Author getAuthorById(int id); - - List getAuthors(); - - Genre getGenreById(int id); - - List getGenres(); - - int addGenre(String name); - - int updateGenre(int id, String name); - - int deleteGenre(int id); - - int addBook(String caption, int authorId, int genreId, String comment); - - int updateBook(int id, String caption, int authorId, int genreId, String comment); - - int deleteBook(int id); - - int addAuthor(String surname, String firstName, String secondName); - - int updateAuthor(int id, String surname, String firstName, String secondName); - - int deleteAuthor(int id); -} diff --git a/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java deleted file mode 100644 index 601fc77..0000000 --- a/src/main/java/ru/otus/mkulikov/app/service/BooksManageSeviceImpl.java +++ /dev/null @@ -1,103 +0,0 @@ -package ru.otus.mkulikov.app.service; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import ru.otus.mkulikov.app.dao.AuthorDao; -import ru.otus.mkulikov.app.dao.BookDao; -import ru.otus.mkulikov.app.dao.GenreDao; -import ru.otus.mkulikov.app.model.Author; -import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Genre; - -import java.util.List; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 27.05.2019 - * Time: 13:42 - */ - -@Service -@RequiredArgsConstructor -public class BooksManageSeviceImpl implements BooksManageSevice { - - private final AuthorDao authorDao; - private final BookDao bookDao; - private final GenreDao genreDao; - - @Override - public Book getBookById(int id) { - return bookDao.getById(id); - } - - @Override - public List getBooks() { - return bookDao.getAllObjects(); - } - - @Override - public Author getAuthorById(int id) { - return authorDao.getById(id); - } - - @Override - public List getAuthors() { - return authorDao.getAllObjects(); - } - - @Override - public Genre getGenreById(int id) { - return genreDao.getById(id); - } - - @Override - public List getGenres() { - return genreDao.getAllObjects(); - } - - @Override - public int addGenre(String name) { - return genreDao.addObject(new Genre(name)); - } - - @Override - public int updateGenre(int id, String name) { - return genreDao.updateObject(new Genre(id, name)); - } - - @Override - public int deleteGenre(int id) { - return genreDao.deleteObject(id); - } - - @Override - public int addBook(String caption, int authorId, int genreId, String comment) { - return bookDao.addObject(new Book(caption, authorId, genreId, comment)); - } - - @Override - public int updateBook(int id, String caption, int authorId, int genreId, String comment) { - return bookDao.updateObject(new Book(id, caption, authorId, genreId, comment)); - } - - @Override - public int deleteBook(int id) { - return bookDao.deleteObject(id); - } - - @Override - public int addAuthor(String surname, String firstName, String secondName) { - return authorDao.addObject(new Author(surname, firstName, secondName)); - } - - @Override - public int updateAuthor(int id, String surname, String firstName, String secondName) { - return authorDao.updateObject(new Author(id, surname, firstName, secondName)); - } - - @Override - public int deleteAuthor(int id) { - return authorDao.deleteObject(id); - } -} diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java new file mode 100644 index 0000000..b811b8e --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java @@ -0,0 +1,24 @@ +package ru.otus.mkulikov.app.service; + +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 15:50 + */ +public interface GenreManageService { + + Genre getGenreById(int id); + + List getGenres(); + + int addGenre(String name); + + int updateGenre(int id, String name); + + int deleteGenre(int id); +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java new file mode 100644 index 0000000..f2e21ac --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -0,0 +1,47 @@ +package ru.otus.mkulikov.app.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 15:52 + */ + +@Service +@RequiredArgsConstructor +public class GenreManageServiceImpl implements GenreManageService { + + private final GenreDao genreDao; + + @Override + public Genre getGenreById(int id) { + return genreDao.getById(id); + } + + @Override + public List getGenres() { + return genreDao.getAllObjects(); + } + + @Override + public int addGenre(String name) { + return genreDao.addObject(new Genre(name)); + } + + @Override + public int updateGenre(int id, String name) { + return genreDao.updateObject(new Genre(id, name)); + } + + @Override + public int deleteGenre(int id) { + return genreDao.deleteObject(id); + } +} diff --git a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java new file mode 100644 index 0000000..550b846 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java @@ -0,0 +1,54 @@ +package ru.otus.mkulikov.shell; + +import lombok.RequiredArgsConstructor; +import org.springframework.shell.standard.ShellComponent; +import org.springframework.shell.standard.ShellMethod; +import org.springframework.shell.standard.ShellOption; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.service.AuthorManageService; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 14:46 + */ + +@ShellComponent +@RequiredArgsConstructor +public class AuthorCommands { + + private final AuthorManageService authorManageService; + + @ShellMethod(key = { "getAuthorById" }, value = "Select author by id.") + public String getAuthorById(@ShellOption int id) { + Author author = authorManageService.getAuthorById(id); + return author.toString(); + } + + @ShellMethod(key = { "getAuthors" }, value = "Select all authors.") + public String getAuthors() { + List allObjects = authorManageService.getAuthors(); + return allObjects.toString(); + } + + @ShellMethod(key = { "addAuthor" }, value = "Add new author.") + public String addAuthor(@ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { + int count = authorManageService.addAuthor(surname, firstName, secondName); + return "Add " + count + " row(s)"; + } + + @ShellMethod(key = { "updateAuthor" }, value = "Update author by id.") + public String updateAuthor(@ShellOption int id, @ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { + int count = authorManageService.updateAuthor(id, surname, firstName, secondName); + return "Updated " + count + " row(s)"; + } + + @ShellMethod(key = { "deleteAuthor" }, value = "Delete author by id.") + public String deleteAuthor(@ShellOption int id) { + int count = authorManageService.deleteAuthor(id); + return "Deleted " + count + " row(s)"; + } +} diff --git a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java new file mode 100644 index 0000000..aa70aaa --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java @@ -0,0 +1,66 @@ +package ru.otus.mkulikov.shell; + +import lombok.RequiredArgsConstructor; +import org.springframework.shell.standard.ShellComponent; +import org.springframework.shell.standard.ShellMethod; +import org.springframework.shell.standard.ShellOption; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.service.BookManageSevice; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:33 + */ + +@ShellComponent +@RequiredArgsConstructor +public class BookCommands { + + private final BookManageSevice bookManageSevice; + + @ShellMethod(key = { "getBookById" }, value = "Select book by id.") + public String getBookById(@ShellOption int id) { + Book book = bookManageSevice.getBookById(id); + return book.toString(); + } + + @ShellMethod(key = { "getFullBookById" }, value = "Select book by id.") + public String getFullBookById(@ShellOption int id) { + Book book = bookManageSevice.getFullBookById(id); + return book.toString(); + } + + @ShellMethod(key = { "getBooks" }, value = "Select all books.") + public String getBooks() { + List allObjects = bookManageSevice.getBooks(); + return allObjects.toString(); + } + + @ShellMethod(key = { "getFullBooks" }, value = "Select all books.") + public String getFullBooks() { + List allObjects = bookManageSevice.getFullBooks(); + return allObjects.toString(); + } + + @ShellMethod(key = { "addBook" }, value = "Add new book.") + public String addBook(@ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String comment) { + int count = bookManageSevice.addBook(caption, authorId, genreId, comment); + return "Add " + count + " row(s)"; + } + + @ShellMethod(key = { "updateBook" }, value = "Update book by id.") + public String updateBook(@ShellOption int id, @ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String comment) { + int count = bookManageSevice.updateBook(id, caption, authorId, genreId, comment); + return "Updated " + count + " row(s)"; + } + + @ShellMethod(key = { "deleteBook" }, value = "Delete book by id.") + public String deleteBook(@ShellOption int id) { + int count = bookManageSevice.deleteBook(id); + return "Deleted " + count + " row(s)"; + } +} diff --git a/src/main/java/ru/otus/mkulikov/shell/Commands.java b/src/main/java/ru/otus/mkulikov/shell/Commands.java deleted file mode 100644 index a932e76..0000000 --- a/src/main/java/ru/otus/mkulikov/shell/Commands.java +++ /dev/null @@ -1,92 +0,0 @@ -package ru.otus.mkulikov.shell; - -import lombok.RequiredArgsConstructor; -import org.springframework.shell.standard.ShellComponent; -import org.springframework.shell.standard.ShellMethod; -import org.springframework.shell.standard.ShellOption; -import ru.otus.mkulikov.app.model.Author; -import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Genre; -import ru.otus.mkulikov.app.service.BooksManageSevice; - -import java.util.List; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 23.05.2019 - * Time: 17:33 - */ - -@ShellComponent -@RequiredArgsConstructor -public class Commands { - - private final BooksManageSevice booksManageSevice; - - /************** - * Жанры - */ - - @ShellMethod(key = { "getGenreById" }, value = "Select genre by id.") - public String getGenreById(@ShellOption int id) { - Genre genre = booksManageSevice.getGenreById(id); - return genre.toString(); - } - - @ShellMethod(key = { "getGenres" }, value = "Select all genres.") - public String getGenres() { - List allObjects = booksManageSevice.getGenres(); - return allObjects.toString(); - } - - @ShellMethod(key = { "addGenre" }, value = "Add new genre.") - public String addGenre(@ShellOption String name) { - int count = booksManageSevice.addGenre(name); - return "Add " + count + " row(s)"; - } - - @ShellMethod(key = { "updateGenre" }, value = "Update genre by id.") - public String updateGenre(@ShellOption int id, @ShellOption String name) { - int count = booksManageSevice.updateGenre(id, name); - return "Updated " + count + " row(s)"; - } - - @ShellMethod(key = { "deleteGenre" }, value = "Delete genre by id.") - public String deleteGenre(@ShellOption int id) { - int count = booksManageSevice.deleteGenre(id); - return "Deleted " + count + " row(s)"; - } - - /************** - * Книги - */ - - @ShellMethod(key = { "getBookById" }, value = "Select book by id.") - public String getBookById(@ShellOption int id) { - Book book = booksManageSevice.getBookById(id); - return book.toString(); - } - - @ShellMethod(key = { "getBooks" }, value = "Select all books.") - public String getBooks() { - List allObjects = booksManageSevice.getBooks(); - return allObjects.toString(); - } - - /************** - * Авторы - */ - - @ShellMethod(key = { "getAuthorById" }, value = "Select author by id.") - public String getAuthorById(@ShellOption int id) { - Author author = booksManageSevice.getAuthorById(id); - return author.toString(); - } - - @ShellMethod(key = { "getAuthors" }, value = "Select all authors.") - public String getAuthors() { - List allObjects = booksManageSevice.getAuthors(); - return allObjects.toString(); - } -} diff --git a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java new file mode 100644 index 0000000..2e6a3ac --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java @@ -0,0 +1,54 @@ +package ru.otus.mkulikov.shell; + +import lombok.RequiredArgsConstructor; +import org.springframework.shell.standard.ShellComponent; +import org.springframework.shell.standard.ShellMethod; +import org.springframework.shell.standard.ShellOption; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.service.GenreManageService; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 14:47 + */ + +@ShellComponent +@RequiredArgsConstructor +public class GenreCommands { + + private final GenreManageService genreManageService; + + @ShellMethod(key = { "getGenreById" }, value = "Select genre by id.") + public String getGenreById(@ShellOption int id) { + Genre genre = genreManageService.getGenreById(id); + return genre.toString(); + } + + @ShellMethod(key = { "getGenres" }, value = "Select all genres.") + public String getGenres() { + List allObjects = genreManageService.getGenres(); + return allObjects.toString(); + } + + @ShellMethod(key = { "addGenre" }, value = "Add new genre.") + public String addGenre(@ShellOption String name) { + int count = genreManageService.addGenre(name); + return "Add " + count + " row(s)"; + } + + @ShellMethod(key = { "updateGenre" }, value = "Update genre by id.") + public String updateGenre(@ShellOption int id, @ShellOption String name) { + int count = genreManageService.updateGenre(id, name); + return "Updated " + count + " row(s)"; + } + + @ShellMethod(key = { "deleteGenre" }, value = "Delete genre by id.") + public String deleteGenre(@ShellOption int id) { + int count = genreManageService.deleteGenre(id); + return "Deleted " + count + " row(s)"; + } +} diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 4f8c037..d0b2b33 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -2,22 +2,22 @@ DROP TABLE IF EXISTS BOOK; CREATE TABLE BOOK( ID INT AUTO_INCREMENT PRIMARY KEY, ADD_RECORD_DATE DATE, - CAPTION VARCHAR(255), - AUTHOR_ID INT, - GENRE_ID INT, + CAPTION VARCHAR(255) not null, + AUTHOR_ID INT not null, + GENRE_ID INT not null, COMMENT VARCHAR(255) ); DROP TABLE IF EXISTS AUTHOR; CREATE TABLE AUTHOR( ID INT AUTO_INCREMENT PRIMARY KEY, - SURNAME VARCHAR(100), - FIRST_NAME VARCHAR(100), + SURNAME VARCHAR(100) not null, + FIRST_NAME VARCHAR(100) not null, SECOND_NAME VARCHAR(100) ); DROP TABLE IF EXISTS GENRE; CREATE TABLE GENRE( ID INT AUTO_INCREMENT PRIMARY KEY, - NAME VARCHAR(100), + NAME VARCHAR(100) not null ); \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java index 9932b6d..b05b6fe 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java @@ -27,13 +27,16 @@ class BookTest { @Test void getAddRecordDateString() { - Date date = new Date(); - Book book = new Book(1, date, "Test_Book", 2, 3, "Test_Comment"); + Book book = getNewBook(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); assertAll("book", () -> assertNotNull(book), - () -> assertEquals(dateFormat.format(date), book.getAddRecordDateString()) + () -> assertEquals(dateFormat.format(new Date()), book.getAddRecordDateString()) ); } + + private Book getNewBook() { + return new Book(1, new Date(), "Test_Book", 2, 3, "Test_Comment"); + } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java new file mode 100644 index 0000000..23b4286 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -0,0 +1,118 @@ +package ru.otus.mkulikov.app.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.dao.AuthorDaoJdbc; +import ru.otus.mkulikov.app.model.Author; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 15:59 + */ + +@DisplayName("Класс AuthorManageSevice") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AppTestConfig.class) +class AuthorManageSeviceImplTest { + + private AuthorManageService authorManageService; + + @BeforeEach + public void setup() { + EmbeddedDatabase db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .addScript("test_schema.sql") + .addScript("test_data.sql") + .build(); + + AuthorDaoJdbc authorDaoJdbc = new AuthorDaoJdbc(new JdbcTemplate(db)); + authorManageService = new AuthorManageServiceImpl(authorDaoJdbc); + } + + @Test + void getAuthorById() { + Author author = authorManageService.getAuthorById(1); + + assertAll("author", + () -> assertNotNull(author), + () -> assertEquals(1, author.getId()), + () -> assertEquals("Surname1", author.getSurname()), + () -> assertEquals("FirstName1", author.getFirstName()), + () -> assertEquals("SecondName1", author.getSecondName()) + ); + } + + @Test + void getAuthors() { + List authors = authorManageService.getAuthors(); + + assertAll("authors", + () -> assertNotNull(authors), + () -> assertEquals(3, authors.size()), + () -> assertEquals("Surname1", authors.get(0).getSurname()), + () -> assertEquals("Surname2", authors.get(1).getSurname()), + () -> assertEquals("Surname3", authors.get(2).getSurname()) + ); + } + + @Test + void addAuthor() { + int count = authorManageService.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); + Author author_selected = authorManageService.getAuthorById(4); + + assertAll("author", + () -> assertNotNull(author_selected), + () -> assertEquals(1, count), + () -> assertEquals(4, author_selected.getId()), + () -> assertEquals("TestSurname", author_selected.getSurname()), + () -> assertEquals("TestFirstName", author_selected.getFirstName()), + () -> assertEquals("TestSecondName", author_selected.getSecondName()) + ); + } + + @Test + void updateAuthor() { + Author author1 = authorManageService.getAuthorById(1); + int count = authorManageService.updateAuthor(1,"TestSurname", "TestFirstName", "TestSecondName"); + Author author2 = authorManageService.getAuthorById(1); + + assertAll("author", + () -> assertEquals(1, count), + () -> assertEquals("Surname1", author1.getSurname()), + () -> assertEquals("FirstName1", author1.getFirstName()), + () -> assertEquals("SecondName1", author1.getSecondName()), + () -> assertEquals("TestSurname", author2.getSurname()), + () -> assertEquals("TestFirstName", author2.getFirstName()), + () -> assertEquals("TestSecondName", author2.getSecondName()) + ); + } + + @Test + void deleteAuthor() { + int count = authorManageService.deleteAuthor(1); + + assertAll("author", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { authorManageService.getAuthorById(1); }) + ); + } +} diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java new file mode 100644 index 0000000..2b9928c --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -0,0 +1,141 @@ +package ru.otus.mkulikov.app.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.dao.AuthorDaoJdbc; +import ru.otus.mkulikov.app.dao.BookDaoJdbc; +import ru.otus.mkulikov.app.dao.GenreDaoJdbc; +import ru.otus.mkulikov.app.model.Book; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 29.05.2019 + * Time: 13:40 + */ + +@DisplayName("Класс BookManageSevice") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AppTestConfig.class) +class BookManageSeviceImplTest { + + private BookManageSevice booksManageSevice; + + @BeforeEach + public void setup() { + EmbeddedDatabase db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .addScript("test_schema.sql") + .addScript("test_data.sql") + .build(); + + AuthorDaoJdbc authorDaoJdbc = new AuthorDaoJdbc(new JdbcTemplate(db)); + BookDaoJdbc bookDaoJdbc = new BookDaoJdbc(new JdbcTemplate(db)); + GenreDaoJdbc genreDaoJdbc = new GenreDaoJdbc(new JdbcTemplate(db)); + + booksManageSevice = new BookManageSeviceImpl(authorDaoJdbc, bookDaoJdbc, genreDaoJdbc); + } + + @Test + void getBookById() { + Book book = booksManageSevice.getBookById(1); + + assertAll("book", + () -> assertNotNull(book), + () -> assertNull(book.getAuthor()), + () -> assertNull(book.getGenre()), + () -> assertEquals(1, book.getId()), + () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("book_1", book.getCaption()), + () -> assertEquals(1, book.getAuthorId()), + () -> assertEquals(1, book.getGenreId()), + () -> assertEquals("comment", book.getComment()) + ); + } + + @Test + void getFullBookById() { + Book book = booksManageSevice.getFullBookById(1); + + assertAll("book", + () -> assertNotNull(book), + () -> assertNotNull(book.getAuthor()), + () -> assertNotNull(book.getGenre()), + () -> assertEquals(1, book.getId()), + () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("book_1", book.getCaption()), + () -> assertEquals(1, book.getAuthorId()), + () -> assertEquals(1, book.getGenreId()), + () -> assertEquals("comment", book.getComment()) + ); + } + + @Test + void getBooks() { + List books = booksManageSevice.getBooks(); + + assertAll("books", + () -> assertNotNull(books), + () -> assertEquals(3, books.size()), + () -> assertEquals("book_1", books.get(0).getCaption()), + () -> assertEquals("book_2", books.get(1).getCaption()), + () -> assertEquals("book_3", books.get(2).getCaption()) + ); + } + + @Test + void addBook() { + int count = booksManageSevice.addBook("Test_Book",2,3,"Test_Comment"); + Book book = booksManageSevice.getBookById(4); + + assertAll("book", + () -> assertNotNull(book), + () -> assertEquals(1, count), + () -> assertEquals(4, book.getId()), + () -> assertEquals("Test_Book", book.getCaption()), + () -> assertEquals(2, book.getAuthorId()), + () -> assertEquals(3, book.getGenreId()), + () -> assertEquals("Test_Comment", book.getComment()) + ); + } + + @Test + void updateBook() { + Book book1 = booksManageSevice.getBookById(1); + int count = booksManageSevice.updateBook(1, "Test_Book", 2, 3, "Test_Comment"); + Book book2 = booksManageSevice.getBookById(1); + + assertAll("book", + () -> assertEquals(1, count), + () -> assertEquals("book_1", book1.getCaption()), + () -> assertEquals("comment", book1.getComment()), + () -> assertEquals("Test_Book", book2.getCaption()), + () -> assertEquals("Test_Comment", book2.getComment()) + ); + } + + @Test + void deleteBook() { + int count = booksManageSevice.deleteBook(1); + + assertAll("book", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getBookById(1); }) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/BooksManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BooksManageSeviceImplTest.java deleted file mode 100644 index a14b73e..0000000 --- a/src/test/java/ru/otus/mkulikov/app/service/BooksManageSeviceImplTest.java +++ /dev/null @@ -1,251 +0,0 @@ -package ru.otus.mkulikov.app.service; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; -import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.AppTestConfig; -import ru.otus.mkulikov.app.dao.AuthorDaoJdbc; -import ru.otus.mkulikov.app.dao.BookDaoJdbc; -import ru.otus.mkulikov.app.dao.GenreDaoJdbc; -import ru.otus.mkulikov.app.model.Author; -import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Genre; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 29.05.2019 - * Time: 13:40 - */ - -@DisplayName("Класс BooksManageSevice") -@RunWith(SpringRunner.class) -@SpringBootTest(classes = AppTestConfig.class) -class BooksManageSeviceImplTest { - - private BooksManageSevice booksManageSevice; - - @BeforeEach - public void setup() { - EmbeddedDatabase db = new EmbeddedDatabaseBuilder() - .setType(EmbeddedDatabaseType.H2) - .addScript("test_schema.sql") - .addScript("test_data.sql") - .build(); - - AuthorDaoJdbc authorDaoJdbc = new AuthorDaoJdbc(new JdbcTemplate(db)); - BookDaoJdbc bookDaoJdbc = new BookDaoJdbc(new JdbcTemplate(db)); - GenreDaoJdbc genreDaoJdbc = new GenreDaoJdbc(new JdbcTemplate(db)); - - booksManageSevice = new BooksManageSeviceImpl(authorDaoJdbc, bookDaoJdbc, genreDaoJdbc); - } - - @Test - void getBookById() { - Book book = booksManageSevice.getBookById(1); - - assertAll("book", - () -> assertNotNull(book), - () -> assertEquals(1, book.getId()), - () -> assertEquals("2019-01-01", book.getAddRecordDateString()), - () -> assertEquals("book_1", book.getCaption()), - () -> assertEquals(1, book.getAuthorId()), - () -> assertEquals(1, book.getGenreId()), - () -> assertEquals("comment", book.getComment()) - ); - } - - @Test - void getBooks() { - List books = booksManageSevice.getBooks(); - - assertAll("books", - () -> assertNotNull(books), - () -> assertEquals(3, books.size()), - () -> assertEquals("book_1", books.get(0).getCaption()), - () -> assertEquals("book_2", books.get(1).getCaption()), - () -> assertEquals("book_3", books.get(2).getCaption()) - ); - } - - @Test - void getAuthorById() { - Author author = booksManageSevice.getAuthorById(1); - - assertAll("author", - () -> assertNotNull(author), - () -> assertEquals(1, author.getId()), - () -> assertEquals("Surname1", author.getSurname()), - () -> assertEquals("FirstName1", author.getFirstName()), - () -> assertEquals("SecondName1", author.getSecondName()) - ); - } - - @Test - void getAuthors() { - List authors = booksManageSevice.getAuthors(); - - assertAll("authors", - () -> assertNotNull(authors), - () -> assertEquals(3, authors.size()), - () -> assertEquals("Surname1", authors.get(0).getSurname()), - () -> assertEquals("Surname2", authors.get(1).getSurname()), - () -> assertEquals("Surname3", authors.get(2).getSurname()) - ); - } - - @Test - void getGenreById() { - Genre genre = booksManageSevice.getGenreById(1); - - assertAll("genre", - () -> assertNotNull(genre), - () -> assertEquals(1, genre.getId()), - () -> assertEquals("Genre1", genre.getName()) - ); - } - - @Test - void getGenres() { - List genres = booksManageSevice.getGenres(); - - assertAll("genres", - () -> assertNotNull(genres), - () -> assertEquals(3, genres.size()), - () -> assertEquals("Genre1", genres.get(0).getName()), - () -> assertEquals("Genre2", genres.get(1).getName()), - () -> assertEquals("Genre3", genres.get(2).getName()) - ); - } - - @Test - void addGenre() { - int count = booksManageSevice.addGenre("Test4"); - Genre genre = booksManageSevice.getGenreById(4); - - assertAll("genre", - () -> assertNotNull(genre), - () -> assertEquals(1, count), - () -> assertEquals(4, genre.getId()), - () -> assertEquals("Test4", genre.getName()) - ); - } - - @Test - void updateGenre() { - Genre genre1 = booksManageSevice.getGenreById(1); - int count = booksManageSevice.updateGenre(1, "UpdatedName"); - Genre genre2 = booksManageSevice.getGenreById(1); - - assertAll("genre", - () -> assertEquals(1, count), - () -> assertEquals("Genre1", genre1.getName()), - () -> assertEquals("UpdatedName", genre2.getName()) - ); - } - - @Test - void deleteGenre() { - int count = booksManageSevice.deleteGenre(1); - - assertAll("genre", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getGenreById(1); }) - ); - } - - @Test - void addBook() { - int count = booksManageSevice.addBook("Test_Book",2,3,"Test_Comment"); - Book book = booksManageSevice.getBookById(4); - - assertAll("book", - () -> assertNotNull(book), - () -> assertEquals(1, count), - () -> assertEquals(4, book.getId()), - () -> assertEquals("Test_Book", book.getCaption()), - () -> assertEquals(2, book.getAuthorId()), - () -> assertEquals(3, book.getGenreId()), - () -> assertEquals("Test_Comment", book.getComment()) - ); - } - - @Test - void updateBook() { - Book book1 = booksManageSevice.getBookById(1); - int count = booksManageSevice.updateBook(1, "Test_Book", 2, 3, "Test_Comment"); - Book book2 = booksManageSevice.getBookById(1); - - assertAll("book", - () -> assertEquals(1, count), - () -> assertEquals("book_1", book1.getCaption()), - () -> assertEquals("comment", book1.getComment()), - () -> assertEquals("Test_Book", book2.getCaption()), - () -> assertEquals("Test_Comment", book2.getComment()) - ); - } - - @Test - void deleteBook() { - int count = booksManageSevice.deleteBook(1); - - assertAll("book", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getBookById(1); }) - ); - } - - @Test - void addAuthor() { - int count = booksManageSevice.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); - Author author_selected = booksManageSevice.getAuthorById(4); - - assertAll("author", - () -> assertNotNull(author_selected), - () -> assertEquals(1, count), - () -> assertEquals(4, author_selected.getId()), - () -> assertEquals("TestSurname", author_selected.getSurname()), - () -> assertEquals("TestFirstName", author_selected.getFirstName()), - () -> assertEquals("TestSecondName", author_selected.getSecondName()) - ); - } - - @Test - void updateAuthor() { - Author author1 = booksManageSevice.getAuthorById(1); - int count = booksManageSevice.updateAuthor(1,"TestSurname", "TestFirstName", "TestSecondName"); - Author author2 = booksManageSevice.getAuthorById(1); - - assertAll("author", - () -> assertEquals(1, count), - () -> assertEquals("Surname1", author1.getSurname()), - () -> assertEquals("FirstName1", author1.getFirstName()), - () -> assertEquals("SecondName1", author1.getSecondName()), - () -> assertEquals("TestSurname", author2.getSurname()), - () -> assertEquals("TestFirstName", author2.getFirstName()), - () -> assertEquals("TestSecondName", author2.getSecondName()) - ); - } - - @Test - void deleteAuthor() { - int count = booksManageSevice.deleteAuthor(1); - - assertAll("author", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getAuthorById(1); }) - ); - } -} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java new file mode 100644 index 0000000..d8b48ab --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -0,0 +1,110 @@ +package ru.otus.mkulikov.app.service; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.dao.GenreDaoJdbc; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 15:56 + */ + +@DisplayName("Класс GenreManageSevice") +@RunWith(SpringRunner.class) +@SpringBootTest(classes = AppTestConfig.class) +class GenreManageSeviceImplTest { + + private GenreManageService genreManageService; + + @BeforeEach + public void setup() { + EmbeddedDatabase db = new EmbeddedDatabaseBuilder() + .setType(EmbeddedDatabaseType.H2) + .addScript("test_schema.sql") + .addScript("test_data.sql") + .build(); + + GenreDaoJdbc genreDaoJdbc = new GenreDaoJdbc(new JdbcTemplate(db)); + genreManageService = new GenreManageServiceImpl(genreDaoJdbc); + } + + @Test + void getGenreById() { + Genre genre = genreManageService.getGenreById(1); + + assertAll("genre", + () -> assertNotNull(genre), + () -> assertEquals(1, genre.getId()), + () -> assertEquals("Genre1", genre.getName()) + ); + } + + @Test + void getGenres() { + List genres = genreManageService.getGenres(); + + assertAll("genres", + () -> assertNotNull(genres), + () -> assertEquals(3, genres.size()), + () -> assertEquals("Genre1", genres.get(0).getName()), + () -> assertEquals("Genre2", genres.get(1).getName()), + () -> assertEquals("Genre3", genres.get(2).getName()) + ); + } + + @Test + void addGenre() { + int count = genreManageService.addGenre("Test4"); + Genre genre = genreManageService.getGenreById(4); + + assertAll("genre", + () -> assertNotNull(genre), + () -> assertEquals(1, count), + () -> assertEquals(4, genre.getId()), + () -> assertEquals("Test4", genre.getName()) + ); + } + + @Test + void updateGenre() { + Genre genre1 = genreManageService.getGenreById(1); + int count = genreManageService.updateGenre(1, "UpdatedName"); + Genre genre2 = genreManageService.getGenreById(1); + + assertAll("genre", + () -> assertEquals(1, count), + () -> assertEquals("Genre1", genre1.getName()), + () -> assertEquals("UpdatedName", genre2.getName()) + ); + } + + @Test + void deleteGenre() { + int count = genreManageService.deleteGenre(1); + + assertAll("genre", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { genreManageService.getGenreById(1); }) + ); + } +} diff --git a/src/test/resources/test_schema.sql b/src/test/resources/test_schema.sql index 4f8c037..d0b2b33 100644 --- a/src/test/resources/test_schema.sql +++ b/src/test/resources/test_schema.sql @@ -2,22 +2,22 @@ DROP TABLE IF EXISTS BOOK; CREATE TABLE BOOK( ID INT AUTO_INCREMENT PRIMARY KEY, ADD_RECORD_DATE DATE, - CAPTION VARCHAR(255), - AUTHOR_ID INT, - GENRE_ID INT, + CAPTION VARCHAR(255) not null, + AUTHOR_ID INT not null, + GENRE_ID INT not null, COMMENT VARCHAR(255) ); DROP TABLE IF EXISTS AUTHOR; CREATE TABLE AUTHOR( ID INT AUTO_INCREMENT PRIMARY KEY, - SURNAME VARCHAR(100), - FIRST_NAME VARCHAR(100), + SURNAME VARCHAR(100) not null, + FIRST_NAME VARCHAR(100) not null, SECOND_NAME VARCHAR(100) ); DROP TABLE IF EXISTS GENRE; CREATE TABLE GENRE( ID INT AUTO_INCREMENT PRIMARY KEY, - NAME VARCHAR(100), + NAME VARCHAR(100) not null ); \ No newline at end of file From ff74ea4e72ee35dc6c28f1b7ff918e5ab7db54d9 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 31 May 2019 16:30:54 +0300 Subject: [PATCH 15/70] =?UTF-8?q?-=20JdbcOperations=20=D0=B7=D0=B0=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=20=D0=BD=D0=B0=20NamedParameterJdbcOpe?= =?UTF-8?q?rations.=20-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D1=8B=20=D0=BA=D0=BD?= =?UTF-8?q?=D0=B8=D0=B3.=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD=D0=B8=D1=85?= =?UTF-8?q?=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=B9=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20=D0=BA=D0=BD=D0=B8?= =?UTF-8?q?=D0=B3.=20-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20Boo?= =?UTF-8?q?k.=20-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D1=82=D0=B8=D0=BF=D0=B0=20id.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/Application.java | 1 + .../ru/otus/mkulikov/app/dao/AuthorDao.java | 4 +- .../otus/mkulikov/app/dao/AuthorDaoJdbc.java | 37 +++-- .../ru/otus/mkulikov/app/dao/BookDao.java | 4 +- .../ru/otus/mkulikov/app/dao/BookDaoJdbc.java | 103 +++++++++---- .../ru/otus/mkulikov/app/dao/GenreDao.java | 4 +- .../otus/mkulikov/app/dao/GenreDaoJdbc.java | 35 +++-- .../ru/otus/mkulikov/app/model/Author.java | 6 +- .../java/ru/otus/mkulikov/app/model/Book.java | 25 ++-- .../ru/otus/mkulikov/app/model/Genre.java | 6 +- .../app/service/AuthorManageService.java | 6 +- .../app/service/AuthorManageServiceImpl.java | 6 +- .../app/service/BookManageSevice.java | 8 +- .../app/service/BookManageSeviceImpl.java | 36 +++-- .../app/service/GenreManageService.java | 6 +- .../app/service/GenreManageServiceImpl.java | 6 +- .../otus/mkulikov/shell/AuthorCommands.java | 6 +- .../ru/otus/mkulikov/shell/BookCommands.java | 8 +- .../ru/otus/mkulikov/shell/GenreCommands.java | 6 +- src/main/resources/application.yml | 8 ++ src/main/resources/data.sql | 6 +- src/main/resources/schema.sql | 31 ++-- .../java/ru/otus/mkulikov/AppTestConfig.java | 43 ++++++ .../mkulikov/app/dao/AuthorDaoJdbcTest.java | 104 +++++++------- .../mkulikov/app/dao/BookDaoJdbcTest.java | 121 ++++++++-------- .../mkulikov/app/dao/GenreDaoJdbcTest.java | 81 +++++------ .../ru/otus/mkulikov/app/model/BookTest.java | 15 +- .../service/AuthorManageSeviceImplTest.java | 97 ++++++------- .../app/service/BookManageSeviceImplTest.java | 135 +++++++++--------- .../service/GenreManageSeviceImplTest.java | 79 +++++----- src/test/resources/test_data.sql | 27 ---- src/test/resources/test_schema.sql | 23 --- 32 files changed, 565 insertions(+), 518 deletions(-) delete mode 100644 src/test/resources/test_data.sql delete mode 100644 src/test/resources/test_schema.sql diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index a45b459..70a6c6d 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -4,6 +4,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.PropertySource; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index dfeba2f..099b02b 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -13,13 +13,13 @@ public interface AuthorDao { - T getById(int id); + T getById(long id); List getAllObjects(); int addObject(T t); - int deleteObject(int id); + int deleteObject(long id); int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java index ae64ebd..8f23571 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java @@ -1,14 +1,17 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.JdbcOperations; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.app.model.Author; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Created by IntelliJ IDEA. @@ -22,40 +25,46 @@ @RequiredArgsConstructor public class AuthorDaoJdbc implements AuthorDao { - private final JdbcOperations jdbcOperations; + private final NamedParameterJdbcOperations namedParameterJdbcOperations; @Override - public Author getById(int id) { - return jdbcOperations.queryForObject("select * from Author where id = ? ", new Object[]{id}, new AuthorMapper()); + public Author getById(long id) { + Map paramMap = new HashMap(); + paramMap.put("id", id); + + return namedParameterJdbcOperations.queryForObject("select * from Author where id = :id ", paramMap, new AuthorMapper()); } @Override public List getAllObjects() { - return jdbcOperations.query("select * from Author order by id", new AuthorMapper()); + return namedParameterJdbcOperations.query("select * from Author order by id", new AuthorMapper()); } @Override public int addObject(Author author) { - return jdbcOperations.update( - "insert into Author (surname, first_name, second_name) values (?,?,?)", - new Object[]{author.getSurname(), author.getFirstName(), author.getSecondName()} + return namedParameterJdbcOperations.update( + "insert into Author (surname, first_name, second_name) values (:surname, :firstName, :secondName)", + new BeanPropertySqlParameterSource(author) ); } @Override - public int deleteObject(int id) { - return jdbcOperations.update("delete from Author where id = ? ", new Object[]{id}); + public int deleteObject(long id) { + Map paramMap = new HashMap(); + paramMap.put("id", id); + + return namedParameterJdbcOperations.update("delete from Author where id = :id ", paramMap); } @Override public int updateObject(Author author) { - return jdbcOperations.update( - "update Author set surname = ?, first_name = ?, second_name = ? where id = ? ", - new Object[]{author.getSurname(), author.getFirstName(), author.getSecondName(), author.getId()} + return namedParameterJdbcOperations.update( + "update Author set surname = :surname, first_name = :firstName, second_name = :secondName where id = :id ", + new BeanPropertySqlParameterSource(author) ); } - private static class AuthorMapper implements RowMapper { + public static class AuthorMapper implements RowMapper { @Override public Author mapRow(ResultSet resultSet, int i) throws SQLException { diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index 431f064..3e2faa1 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -13,13 +13,13 @@ public interface BookDao { - T getById(int id); + T getById(long id); List getAllObjects(); int addObject(T t); - int deleteObject(int id); + int deleteObject(long id); int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java index 89a0c16..2ab1c2a 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java @@ -1,16 +1,20 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.JdbcOperations; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.stereotype.Repository; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Timestamp; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Created by IntelliJ IDEA. @@ -24,51 +28,100 @@ @RequiredArgsConstructor public class BookDaoJdbc implements BookDao { - private final JdbcOperations jdbcOperations; + private final NamedParameterJdbcOperations namedParameterJdbcOperations; + + private final String BOOK_SELECT = + "select b.*, a.surname, a.first_name, a.second_name, g.name " + + "from Book b " + + "inner join Author a on a.id = b.author_id " + + "inner join Genre g on g.id = b.genre_id " + + "where id = :id "; + + private final String BOOK_SELECT_ALL = + "select b.*, a.surname, a.first_name, a.second_name, g.name " + + "from Book b " + + "inner join Author a on a.id = b.author_id " + + "inner join Genre g on g.id = b.genre_id " + + "order by b.id "; + + private final String BOOK_UPDATE = + "update Book " + + "set add_record_date = sysdate, caption = :caption, author_id = :author_id, genre_id = :genre_id, comment = :comment " + + "where id = :id "; + + private final String BOOK_INSERT = + "insert into Book (add_record_date, caption, author_id, genre_id, comment) " + + " values (sysdate, :caption, :author_id, :genre_id, :comment)"; + + private final String BOOK_DELETE = "delete from Book where id = :id "; @Override - public Book getById(int id) { - return jdbcOperations.queryForObject("select * from Book where id = ? ", new Object[]{id}, new BookMapper()); + public Book getById(long id) { + Map paramMap = new HashMap(); + paramMap.put("id", id); + + List books = namedParameterJdbcOperations.query(BOOK_SELECT, paramMap, new BookMapper()); + return (books != null) ? books.get(0) : null; } @Override public List getAllObjects() { - return jdbcOperations.query("select * from Book order by id", new BookMapper()); + return namedParameterJdbcOperations.query(BOOK_SELECT_ALL, new BookMapper()); } @Override public int addObject(Book book) { - return jdbcOperations.update( - "insert into Book (add_record_date, caption, author_id, genre_id, comment) values (sysdate,?,?,?,?)", - new Object[]{book.getCaption(), book.getAuthorId(), book.getGenreId(), book.getComment()} - ); + Map paramMap = new HashMap(); + paramMap.put("caption", book.getCaption()); + paramMap.put("author_id", book.getAuthor().getId()); + paramMap.put("genre_id", book.getGenre().getId()); + paramMap.put("comment", book.getComment()); + + return namedParameterJdbcOperations.update(BOOK_INSERT, paramMap); } @Override - public int deleteObject(int id) { - return jdbcOperations.update("delete from Book where id = ? ", new Object[]{id}); + public int deleteObject(long id) { + Map paramMap = new HashMap(); + paramMap.put("id", id); + + return namedParameterJdbcOperations.update(BOOK_DELETE, paramMap); } @Override public int updateObject(Book book) { - return jdbcOperations.update( - "update Book set add_record_date = sysdate, caption = ?, author_id = ?, genre_id = ?, comment = ? where id = ? ", - new Object[]{book.getCaption(), book.getAuthorId(), book.getGenreId(), book.getComment(), book.getId()} - ); + Map paramMap = new HashMap(); + paramMap.put("caption", book.getCaption()); + paramMap.put("author_id", book.getAuthor().getId()); + paramMap.put("genre_id", book.getGenre().getId()); + paramMap.put("comment", book.getComment()); + paramMap.put("id", book.getId()); + + return namedParameterJdbcOperations.update(BOOK_UPDATE, paramMap); } - private static class BookMapper implements RowMapper { + public static class BookMapper implements RowMapper { @Override public Book mapRow(ResultSet resultSet, int i) throws SQLException { - int id = resultSet.getInt("ID"); - Date addRecordDate = resultSet.getDate("ADD_RECORD_DATE"); - String caption = resultSet.getString("CAPTION"); - int author_id = resultSet.getInt("AUTHOR_ID"); - int genre_id = resultSet.getInt("GENRE_ID"); - String comment = resultSet.getString("COMMENT"); - - return new Book(id, addRecordDate, caption, author_id, genre_id, comment); + int id = resultSet.getInt("id"); + Date addRecordDate = resultSet.getDate("add_record_date"); + String caption = resultSet.getString("caption"); + String comment = resultSet.getString("comment"); + + Author author = new Author( + resultSet.getLong("author_id"), + resultSet.getString("surname"), + resultSet.getString("first_name"), + resultSet.getString("second_name") + ); + + Genre genre = new Genre( + resultSet.getLong("genre_id"), + resultSet.getString("name") + ); + + return new Book(id, addRecordDate, caption, author, genre, comment); } } } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index bffc90d..348b84d 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -13,13 +13,13 @@ public interface GenreDao { - T getById(int id); + T getById(long id); List getAllObjects(); int addObject(T t); - int deleteObject(int id); + int deleteObject(long id); int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java index 2ee2fe5..627c1e5 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java @@ -1,18 +1,17 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcOperations; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.stereotype.Repository; import ru.otus.mkulikov.app.model.Genre; -import javax.annotation.PostConstruct; -import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Created by IntelliJ IDEA. @@ -26,31 +25,41 @@ @RequiredArgsConstructor public class GenreDaoJdbc implements GenreDao { - private final JdbcOperations jdbcOperations; + private final NamedParameterJdbcOperations namedParameterJdbcOperations; @Override - public Genre getById(int id) { - return jdbcOperations.queryForObject("select * from Genre where id = ? ", new Object[]{id}, new GenreMapper()); + public Genre getById(long id) { + Map paramMap = new HashMap(); + paramMap.put("id", id); + + return namedParameterJdbcOperations.queryForObject("select * from Genre where id = :id ", paramMap, new GenreMapper()); } @Override public List getAllObjects() { - return jdbcOperations.query("select * from Genre order by id", new GenreMapper()); + return namedParameterJdbcOperations.query("select * from Genre order by id", new GenreMapper()); } @Override public int addObject(Genre genre) { - return jdbcOperations.update("insert into Genre (name) values (?)", new Object[]{genre.getName()}); + return namedParameterJdbcOperations.update( + "insert into Genre (name) values (:name)", + new BeanPropertySqlParameterSource(genre)); } @Override - public int deleteObject(int id) { - return jdbcOperations.update("delete from Genre where id = ? ", new Object[]{id}); + public int deleteObject(long id) { + Map paramMap = new HashMap(); + paramMap.put("id", id); + + return namedParameterJdbcOperations.update("delete from Genre where id = :id ", paramMap); } @Override public int updateObject(Genre genre) { - return jdbcOperations.update("update Genre set name = ? where id = ? ", new Object[]{genre.getName(), genre.getId()}); + return namedParameterJdbcOperations.update( + "update Genre set name = :name where id = :id ", + new BeanPropertySqlParameterSource(genre)); } public static class GenreMapper implements RowMapper { diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index d087534..d3bd662 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -12,12 +12,12 @@ @Data public class Author { - private final int id; + private final long id; private final String surname; private final String firstName; private final String secondName; - public Author(int id, String surname, String firstName, String secondName) { + public Author(long id, String surname, String firstName, String secondName) { this.id = id; this.surname = surname; this.firstName = firstName; @@ -25,7 +25,7 @@ public Author(int id, String surname, String firstName, String secondName) { } public Author(String surname, String firstName, String secondName) { - this.id = 0; + this.id = 0L; this.surname = surname; this.firstName = firstName; this.secondName = secondName; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 7c87c7a..a70181d 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -5,7 +5,6 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.List; /** * Created by IntelliJ IDEA. @@ -17,36 +16,34 @@ @Data public class Book { - private int id; + private long id; private Date addRecordDate; private String caption; - private int authorId; - private int genreId; private Author author; private Genre genre; private String comment; - public Book(int id, Date addRecordDate, String caption, int authorId, int genreId, String comment) { + public Book(long id, Date addRecordDate, String caption, Author author, Genre genre, String comment) { this.id = id; this.addRecordDate = addRecordDate; + this.author = author; + this.genre = genre; this.caption = caption; - this.authorId = authorId; - this.genreId = genreId; this.comment = comment; } - public Book(int id, String caption, int authorId, int genreId, String comment) { + public Book(long id, String caption, Author author, Genre genre, String comment) { this.id = id; this.caption = caption; - this.authorId = authorId; - this.genreId = genreId; + this.author = author; + this.genre = genre; this.comment = comment; } - public Book(String caption, int authorId, int genreId, String comment) { + public Book(String caption, Author author, Genre genre, String comment) { this.caption = caption; - this.authorId = authorId; - this.genreId = genreId; + this.author = author; + this.genre = genre; this.comment = comment; } @@ -73,8 +70,6 @@ public String toString() { "id=" + id + ", addRecordDate=" + addRecordDate + ", caption='" + caption + '\'' + - ", authorId=" + authorId + - ", genreId=" + genreId + ", comment='" + comment + '\'' + getAuthorString() + getGenreString() + diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 2f2d528..5dff2a6 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -12,16 +12,16 @@ @Data public class Genre { - private final int id; + private final long id; private final String name; - public Genre(int id, String name) { + public Genre(long id, String name) { this.id = id; this.name = name; } public Genre(String name) { - this.id = 0; + this.id = 0L; this.name = name; } diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java index b11706d..2ebc5f1 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java @@ -13,13 +13,13 @@ public interface AuthorManageService { - T getAuthorById(int id); + T getAuthorById(long id); List getAuthors(); int addAuthor(String surname, String firstName, String secondName); - int updateAuthor(int id, String surname, String firstName, String secondName); + int updateAuthor(long id, String surname, String firstName, String secondName); - int deleteAuthor(int id); + int deleteAuthor(long id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index 9237363..63632f9 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -21,7 +21,7 @@ public class AuthorManageServiceImpl implements AuthorManageService { private final AuthorDao authorDao; @Override - public Author getAuthorById(int id) { + public Author getAuthorById(long id) { return authorDao.getById(id); } @@ -36,12 +36,12 @@ public int addAuthor(String surname, String firstName, String secondName) { } @Override - public int updateAuthor(int id, String surname, String firstName, String secondName) { + public int updateAuthor(long id, String surname, String firstName, String secondName) { return authorDao.updateObject(new Author(id, surname, firstName, secondName)); } @Override - public int deleteAuthor(int id) { + public int deleteAuthor(long id) { return authorDao.deleteObject(id); } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java index 552cd31..4dab791 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -13,9 +13,9 @@ public interface BookManageSevice { - T getBookById(int id); + T getBookById(long id); - T getFullBookById(int id); + T getFullBookById(long id); List getBooks(); @@ -23,7 +23,7 @@ public interface BookManageSevice { int addBook(String caption, int authorId, int genreId, String comment); - int updateBook(int id, String caption, int authorId, int genreId, String comment); + int updateBook(long id, String caption, int authorId, int genreId, String comment); - int deleteBook(int id); + int deleteBook(long id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index b64c332..f73beca 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -5,7 +5,9 @@ import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; import java.util.List; @@ -20,19 +22,18 @@ @RequiredArgsConstructor public class BookManageSeviceImpl implements BookManageSevice { - private final AuthorDao authorDao; private final BookDao bookDao; + private final AuthorDao authorDao; private final GenreDao genreDao; @Override - public Book getBookById(int id) { + public Book getBookById(long id) { return bookDao.getById(id); } @Override - public Book getFullBookById(int id) { - Book book = bookDao.getById(id); - return setBookInfo(book); + public Book getFullBookById(long id) { + return bookDao.getById(id); } @Override @@ -42,31 +43,28 @@ public List getBooks() { @Override public List getFullBooks() { - List books = bookDao.getAllObjects(); - for (Book book : books) { - setBookInfo(book); - } - return books; + return bookDao.getAllObjects(); } - private Book setBookInfo(Book book) { - book.setAuthor(authorDao.getById(book.getAuthorId())); - book.setGenre(genreDao.getById(book.getGenreId())); - return book; - } @Override public int addBook(String caption, int authorId, int genreId, String comment) { - return bookDao.addObject(new Book(caption, authorId, genreId, comment)); + Author author = authorDao.getById(authorId); + Genre genre = genreDao.getById(genreId); + + return bookDao.addObject(new Book(caption, author, genre, comment)); } @Override - public int updateBook(int id, String caption, int authorId, int genreId, String comment) { - return bookDao.updateObject(new Book(id, caption, authorId, genreId, comment)); + public int updateBook(long id, String caption, int authorId, int genreId, String comment) { + Author author = authorDao.getById(authorId); + Genre genre = genreDao.getById(genreId); + + return bookDao.updateObject(new Book(id, caption, author, genre, comment)); } @Override - public int deleteBook(int id) { + public int deleteBook(long id) { return bookDao.deleteObject(id); } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java index b811b8e..d2f62af 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java @@ -12,13 +12,13 @@ */ public interface GenreManageService { - Genre getGenreById(int id); + Genre getGenreById(long id); List getGenres(); int addGenre(String name); - int updateGenre(int id, String name); + int updateGenre(long id, String name); - int deleteGenre(int id); + int deleteGenre(long id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index f2e21ac..f0b56a6 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -21,7 +21,7 @@ public class GenreManageServiceImpl implements GenreManageService { private final GenreDao genreDao; @Override - public Genre getGenreById(int id) { + public Genre getGenreById(long id) { return genreDao.getById(id); } @@ -36,12 +36,12 @@ public int addGenre(String name) { } @Override - public int updateGenre(int id, String name) { + public int updateGenre(long id, String name) { return genreDao.updateObject(new Genre(id, name)); } @Override - public int deleteGenre(int id) { + public int deleteGenre(long id) { return genreDao.deleteObject(id); } } diff --git a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java index 550b846..6fac36a 100644 --- a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java @@ -23,7 +23,7 @@ public class AuthorCommands { private final AuthorManageService authorManageService; @ShellMethod(key = { "getAuthorById" }, value = "Select author by id.") - public String getAuthorById(@ShellOption int id) { + public String getAuthorById(@ShellOption long id) { Author author = authorManageService.getAuthorById(id); return author.toString(); } @@ -41,13 +41,13 @@ public String addAuthor(@ShellOption String surname, @ShellOption String firstNa } @ShellMethod(key = { "updateAuthor" }, value = "Update author by id.") - public String updateAuthor(@ShellOption int id, @ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { + public String updateAuthor(@ShellOption long id, @ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { int count = authorManageService.updateAuthor(id, surname, firstName, secondName); return "Updated " + count + " row(s)"; } @ShellMethod(key = { "deleteAuthor" }, value = "Delete author by id.") - public String deleteAuthor(@ShellOption int id) { + public String deleteAuthor(@ShellOption long id) { int count = authorManageService.deleteAuthor(id); return "Deleted " + count + " row(s)"; } diff --git a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java index aa70aaa..a8a998e 100644 --- a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java @@ -23,13 +23,13 @@ public class BookCommands { private final BookManageSevice bookManageSevice; @ShellMethod(key = { "getBookById" }, value = "Select book by id.") - public String getBookById(@ShellOption int id) { + public String getBookById(@ShellOption long id) { Book book = bookManageSevice.getBookById(id); return book.toString(); } @ShellMethod(key = { "getFullBookById" }, value = "Select book by id.") - public String getFullBookById(@ShellOption int id) { + public String getFullBookById(@ShellOption long id) { Book book = bookManageSevice.getFullBookById(id); return book.toString(); } @@ -53,13 +53,13 @@ public String addBook(@ShellOption String caption, @ShellOption int authorId, @S } @ShellMethod(key = { "updateBook" }, value = "Update book by id.") - public String updateBook(@ShellOption int id, @ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String comment) { + public String updateBook(@ShellOption long id, @ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String comment) { int count = bookManageSevice.updateBook(id, caption, authorId, genreId, comment); return "Updated " + count + " row(s)"; } @ShellMethod(key = { "deleteBook" }, value = "Delete book by id.") - public String deleteBook(@ShellOption int id) { + public String deleteBook(@ShellOption long id) { int count = bookManageSevice.deleteBook(id); return "Deleted " + count + " row(s)"; } diff --git a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java index 2e6a3ac..e0959bf 100644 --- a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java @@ -23,7 +23,7 @@ public class GenreCommands { private final GenreManageService genreManageService; @ShellMethod(key = { "getGenreById" }, value = "Select genre by id.") - public String getGenreById(@ShellOption int id) { + public String getGenreById(@ShellOption long id) { Genre genre = genreManageService.getGenreById(id); return genre.toString(); } @@ -41,13 +41,13 @@ public String addGenre(@ShellOption String name) { } @ShellMethod(key = { "updateGenre" }, value = "Update genre by id.") - public String updateGenre(@ShellOption int id, @ShellOption String name) { + public String updateGenre(@ShellOption long id, @ShellOption String name) { int count = genreManageService.updateGenre(id, name); return "Updated " + count + " row(s)"; } @ShellMethod(key = { "deleteGenre" }, value = "Delete genre by id.") - public String deleteGenre(@ShellOption int id) { + public String deleteGenre(@ShellOption long id) { int count = genreManageService.deleteGenre(id); return "Deleted " + count + " row(s)"; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6e8162e..4252b7d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,11 @@ spring: + datasource: + data: "classpath:data.sql" + schema: "classpath:schema.sql" + username: "SA" + password: "" + driver-class-name: "org.h2.Driver" + url: "jdbc:h2:mem:test" + banner: location: "classpath:banner.txt" diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index e255fb4..1372099 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -16,12 +16,12 @@ insert into GENRE (NAME) values ('Genre3'); -------------------------- insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (sysdate, 'book_1', 1, 1, 'comment'); +values (to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'comment'); insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (sysdate, 'book_2', 1, 1, 'comment'); +values (to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'comment'); insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (sysdate, 'book_3', 1, 1, 'comment'); +values (to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'comment'); -------------------------- diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index d0b2b33..c18e8d2 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,23 +1,28 @@ DROP TABLE IF EXISTS BOOK; -CREATE TABLE BOOK( - ID INT AUTO_INCREMENT PRIMARY KEY, - ADD_RECORD_DATE DATE, - CAPTION VARCHAR(255) not null, - AUTHOR_ID INT not null, - GENRE_ID INT not null, - COMMENT VARCHAR(255) -); - DROP TABLE IF EXISTS AUTHOR; +DROP TABLE IF EXISTS GENRE; + CREATE TABLE AUTHOR( - ID INT AUTO_INCREMENT PRIMARY KEY, + ID NUMBER(22,0) AUTO_INCREMENT PRIMARY KEY, SURNAME VARCHAR(100) not null, FIRST_NAME VARCHAR(100) not null, SECOND_NAME VARCHAR(100) ); -DROP TABLE IF EXISTS GENRE; CREATE TABLE GENRE( - ID INT AUTO_INCREMENT PRIMARY KEY, + ID NUMBER(22,0) AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(100) not null -); \ No newline at end of file +); + +CREATE TABLE BOOK( + ID NUMBER(22,0) AUTO_INCREMENT PRIMARY KEY, + ADD_RECORD_DATE DATE, + CAPTION VARCHAR(255) not null, + AUTHOR_ID INT not null, + GENRE_ID INT not null, + COMMENT VARCHAR(255), + + foreign key (AUTHOR_ID) references AUTHOR(ID), + foreign key (GENRE_ID) references GENRE(ID) +); + diff --git a/src/test/java/ru/otus/mkulikov/AppTestConfig.java b/src/test/java/ru/otus/mkulikov/AppTestConfig.java index 85f7510..376bdc6 100644 --- a/src/test/java/ru/otus/mkulikov/AppTestConfig.java +++ b/src/test/java/ru/otus/mkulikov/AppTestConfig.java @@ -1,7 +1,19 @@ package ru.otus.mkulikov; import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.PropertySource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import ru.otus.mkulikov.app.dao.BookDaoJdbc; + +import javax.sql.DataSource; /** * Created by IntelliJ IDEA. @@ -11,6 +23,37 @@ */ @SpringBootConfiguration +@ComponentScan("ru.otus.mkulikov.app") +@PropertySource({"classpath:application.yml"}) @EnableConfigurationProperties public class AppTestConfig { + + @Bean + public NamedParameterJdbcOperations getNamedParameterJdbcOperations(DataSource dataSource) { + return new NamedParameterJdbcTemplate(dataSource); + } + + //@Bean + //public DataSource getDataSource() { + // DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); + // dataSourceBuilder.driverClassName("org.h2.Driver"); + // dataSourceBuilder.url("jdbc:h2:mem:test"); + // dataSourceBuilder.username("SA"); + // dataSourceBuilder.password(""); + // return dataSourceBuilder.build(); + //} + + @Bean + @Primary + @ConfigurationProperties("application.yml") + public DataSourceProperties getDatasourceProperties() { + return new DataSourceProperties(); + } + + @Bean + //@ConfigurationProperties("datasource.oracle") + public DataSource getDatasource() { + return getDatasourceProperties().initializeDataSourceBuilder() + .build(); + } } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java index 38b0fad..145835b 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java @@ -4,9 +4,13 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; @@ -16,7 +20,10 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -30,29 +37,20 @@ @SpringBootTest(classes = AppTestConfig.class) class AuthorDaoJdbcTest { + @Autowired private AuthorDaoJdbc authorDaoJdbc; - @BeforeEach - public void setup() { - EmbeddedDatabase db = new EmbeddedDatabaseBuilder() - .setType(EmbeddedDatabaseType.H2) - .addScript("test_schema.sql") - .addScript("test_data.sql") - .build(); - - authorDaoJdbc = new AuthorDaoJdbc(new JdbcTemplate(db)); - } - @Test void getById() { - Author author = authorDaoJdbc.getById(1); - - assertAll("author", - () -> assertNotNull(author), - () -> assertEquals(1, author.getId()), - () -> assertEquals("Surname1", author.getSurname()), - () -> assertEquals("FirstName1", author.getFirstName()), - () -> assertEquals("SecondName1", author.getSecondName()) + Author author = authorDaoJdbc.getById(1L); + + assertAll( + "author", + () -> assertNotNull(author), + () -> assertEquals(1L, author.getId()), + () -> assertEquals("Surname1", author.getSurname()), + () -> assertEquals("FirstName1", author.getFirstName()), + () -> assertEquals("SecondName1", author.getSecondName()) ); } @@ -60,12 +58,13 @@ void getById() { void getAllObjects() { List authors = authorDaoJdbc.getAllObjects(); - assertAll("authors", - () -> assertNotNull(authors), - () -> assertEquals(3, authors.size()), - () -> assertEquals("Surname1", authors.get(0).getSurname()), - () -> assertEquals("Surname2", authors.get(1).getSurname()), - () -> assertEquals("Surname3", authors.get(2).getSurname()) + assertAll( + "authors", + () -> assertNotNull(authors), + () -> assertEquals(3, authors.size()), + () -> assertEquals("Surname1", authors.get(0).getSurname()), + () -> assertEquals("Surname2", authors.get(1).getSurname()), + () -> assertEquals("Surname3", authors.get(2).getSurname()) ); } @@ -73,44 +72,41 @@ void getAllObjects() { void addObject() { Author author = new Author("TestSurname", "TestFirstName", "TestSecondName"); int count = authorDaoJdbc.addObject(author); - Author author_selected = authorDaoJdbc.getById(4); - - assertAll("author", - () -> assertNotNull(author_selected), - () -> assertEquals(1, count), - () -> assertEquals(4, author_selected.getId()), - () -> assertEquals(author.getSurname(), author_selected.getSurname()), - () -> assertEquals(author.getFirstName(), author_selected.getFirstName()), - () -> assertEquals(author.getSecondName(), author_selected.getSecondName()) + Author author_selected = authorDaoJdbc.getById(4L); + + assertAll( + "author", + () -> assertNotNull(author_selected), + () -> assertEquals(1, count), + () -> assertEquals(4, author_selected.getId()), + () -> assertEquals(author.getSurname(), author_selected.getSurname()), + () -> assertEquals(author.getFirstName(), author_selected.getFirstName()), + () -> assertEquals(author.getSecondName(), author_selected.getSecondName()) ); } @Test void deleteObject() { - int count = authorDaoJdbc.deleteObject(1); - - assertAll("author", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { authorDaoJdbc.getById(1); }) - ); + assertThrows(DataIntegrityViolationException.class, () -> { authorDaoJdbc.deleteObject(1L); }); } @Test void updateObject() { - Author author1 = authorDaoJdbc.getById(1); + Author author1 = authorDaoJdbc.getById(1L); int count = authorDaoJdbc.updateObject( - new Author(1,"TestSurname", "TestFirstName", "TestSecondName") + new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") ); - Author author2 = authorDaoJdbc.getById(1); - - assertAll("author", - () -> assertEquals(1, count), - () -> assertEquals("Surname1", author1.getSurname()), - () -> assertEquals("FirstName1", author1.getFirstName()), - () -> assertEquals("SecondName1", author1.getSecondName()), - () -> assertEquals("TestSurname", author2.getSurname()), - () -> assertEquals("TestFirstName", author2.getFirstName()), - () -> assertEquals("TestSecondName", author2.getSecondName()) + Author author2 = authorDaoJdbc.getById(1L); + + assertAll( + "author", + () -> assertEquals(1, count), + () -> assertEquals("Surname1", author1.getSurname()), + () -> assertEquals("FirstName1", author1.getFirstName()), + () -> assertEquals("SecondName1", author1.getSecondName()), + () -> assertEquals("TestSurname", author2.getSurname()), + () -> assertEquals("TestFirstName", author2.getFirstName()), + () -> assertEquals("TestSecondName", author2.getSecondName()) ); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java index f019089..d48684b 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java @@ -4,20 +4,29 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; import java.util.Date; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -31,31 +40,22 @@ @SpringBootTest(classes = AppTestConfig.class) class BookDaoJdbcTest { + @Autowired private BookDaoJdbc bookDaoJdbc; - @BeforeEach - public void setup() { - EmbeddedDatabase db = new EmbeddedDatabaseBuilder() - .setType(EmbeddedDatabaseType.H2) - .addScript("test_schema.sql") - .addScript("test_data.sql") - .build(); - - bookDaoJdbc = new BookDaoJdbc(new JdbcTemplate(db)); - } - @Test void getById() { - Book book = bookDaoJdbc.getById(1); - - assertAll("book", - () -> assertNotNull(book), - () -> assertEquals(1, book.getId()), - () -> assertEquals("2019-01-01", book.getAddRecordDateString()), - () -> assertEquals("book_1", book.getCaption()), - () -> assertEquals(1, book.getAuthorId()), - () -> assertEquals(1, book.getGenreId()), - () -> assertEquals("comment", book.getComment()) + Book book = bookDaoJdbc.getById(1L); + + assertAll( + "book", + () -> assertNotNull(book), + () -> assertEquals(1L, book.getId()), + () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("book_1", book.getCaption()), + () -> assertEquals(1, book.getAuthor().getId()), + () -> assertEquals(1, book.getGenre().getId()), + () -> assertEquals("comment", book.getComment()) ); } @@ -63,58 +63,63 @@ void getById() { void getAllObjects() { List books = bookDaoJdbc.getAllObjects(); - assertAll("books", - () -> assertNotNull(books), - () -> assertEquals(3, books.size()), - () -> assertEquals("book_1", books.get(0).getCaption()), - () -> assertEquals("book_2", books.get(1).getCaption()), - () -> assertEquals("book_3", books.get(2).getCaption()) + assertAll( + "books", + () -> assertNotNull(books), + () -> assertEquals(3, books.size()), + () -> assertEquals("book_1", books.get(0).getCaption()), + () -> assertEquals("book_2", books.get(1).getCaption()), + () -> assertEquals("book_3", books.get(2).getCaption()) ); } @Test void addObject() { - int count = bookDaoJdbc.addObject( - new Book("Test_Book",2,3,"Test_Comment") - ); - - Book book = bookDaoJdbc.getById(4); - - assertAll("book", - () -> assertNotNull(book), - () -> assertEquals(1, count), - () -> assertEquals(4, book.getId()), - () -> assertEquals("Test_Book", book.getCaption()), - () -> assertEquals(2, book.getAuthorId()), - () -> assertEquals(3, book.getGenreId()), - () -> assertEquals("Test_Comment", book.getComment()) + int count = bookDaoJdbc.addObject(getNewBook()); + Book book = bookDaoJdbc.getById(4L); + + assertAll( + "book", + () -> assertNotNull(book), + () -> assertEquals(1, count), + () -> assertEquals(4L, book.getId()), + () -> assertEquals("Test_Book", book.getCaption()), + () -> assertEquals(1, book.getAuthor().getId()), + () -> assertEquals(1, book.getGenre().getId()), + () -> assertEquals("Test_Comment", book.getComment()) ); } @Test void deleteObject() { - int count = bookDaoJdbc.deleteObject(1); + int count = bookDaoJdbc.deleteObject(1L); - assertAll("book", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { bookDaoJdbc.getById(1); }) + assertAll( + "book", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { bookDaoJdbc.getById(1L); }) ); } @Test void updateObject() { - Book book1 = bookDaoJdbc.getById(1); - int count = bookDaoJdbc.updateObject( - new Book(1, new Date(),"Test_Book",2,3,"Test_Comment") - ); - Book book2 = bookDaoJdbc.getById(1); - - assertAll("book", - () -> assertEquals(1, count), - () -> assertEquals("book_1", book1.getCaption()), - () -> assertEquals("comment", book1.getComment()), - () -> assertEquals("Test_Book", book2.getCaption()), - () -> assertEquals("Test_Comment", book2.getComment()) + Book book1 = bookDaoJdbc.getById(1L); + int count = bookDaoJdbc.updateObject(getNewBook()); + Book book2 = bookDaoJdbc.getById(1L); + + assertAll( + "book", + () -> assertEquals(1, count), + () -> assertEquals("book_1", book1.getCaption()), + () -> assertEquals("comment", book1.getComment()), + () -> assertEquals("Test_Book", book2.getCaption()), + () -> assertEquals("Test_Comment", book2.getComment()) ); } + + private Book getNewBook() { + Author author = new Author(1L, "TestSurname", "TestFirstName", "TestSecondName"); + Genre genre = new Genre(1L, "Test4"); + return new Book(1L, new Date(), "Test_Book", author, genre, "Test_Comment"); + } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java index c9590e4..9dc952c 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java @@ -4,8 +4,9 @@ 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.dao.EmptyResultDataAccessException; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; @@ -16,7 +17,10 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -30,27 +34,18 @@ @SpringBootTest(classes = AppTestConfig.class) class GenreDaoJdbcTest { + @Autowired private GenreDaoJdbc genreDaoJdbc; - @BeforeEach - public void setup() { - EmbeddedDatabase db = new EmbeddedDatabaseBuilder() - .setType(EmbeddedDatabaseType.H2) - .addScript("test_schema.sql") - .addScript("test_data.sql") - .build(); - - genreDaoJdbc = new GenreDaoJdbc(new JdbcTemplate(db)); - } - @Test void getById() { - Genre genre = genreDaoJdbc.getById(1); + Genre genre = genreDaoJdbc.getById(1L); - assertAll("genre", - () -> assertNotNull(genre), - () -> assertEquals(1, genre.getId()), - () -> assertEquals("Genre1", genre.getName()) + assertAll( + "genre", + () -> assertNotNull(genre), + () -> assertEquals(1L, genre.getId()), + () -> assertEquals("Genre1", genre.getName()) ); } @@ -58,12 +53,13 @@ void getById() { void getAllObjects() { List genres = genreDaoJdbc.getAllObjects(); - assertAll("genres", - () -> assertNotNull(genres), - () -> assertEquals(3, genres.size()), - () -> assertEquals("Genre1", genres.get(0).getName()), - () -> assertEquals("Genre2", genres.get(1).getName()), - () -> assertEquals("Genre3", genres.get(2).getName()) + assertAll( + "genres", + () -> assertNotNull(genres), + () -> assertEquals(3, genres.size()), + () -> assertEquals("Genre1", genres.get(0).getName()), + () -> assertEquals("Genre2", genres.get(1).getName()), + () -> assertEquals("Genre3", genres.get(2).getName()) ); } @@ -71,36 +67,33 @@ void getAllObjects() { void addObject() { int count = genreDaoJdbc.addObject(new Genre("Test4")); - Genre genre = genreDaoJdbc.getById(4); + Genre genre = genreDaoJdbc.getById(4L); - assertAll("genre", - () -> assertNotNull(genre), - () -> assertEquals(1, count), - () -> assertEquals(4, genre.getId()), - () -> assertEquals("Test4", genre.getName()) + assertAll( + "genre", + () -> assertNotNull(genre), + () -> assertEquals(1, count), + () -> assertEquals(4L, genre.getId()), + () -> assertEquals("Test4", genre.getName()) ); } @Test void deleteObject() { - int count = genreDaoJdbc.deleteObject(1); - - assertAll("genre", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { genreDaoJdbc.getById(1); }) - ); + assertThrows(DataIntegrityViolationException.class, () -> { genreDaoJdbc.deleteObject(1L); }); } @Test void updateObject() { - Genre genre1 = genreDaoJdbc.getById(1); - int count = genreDaoJdbc.updateObject(new Genre(1, "UpdatedName")); - Genre genre2 = genreDaoJdbc.getById(1); - - assertAll("genre", - () -> assertEquals(1, count), - () -> assertEquals("Genre1", genre1.getName()), - () -> assertEquals("UpdatedName", genre2.getName()) + Genre genre1 = genreDaoJdbc.getById(1L); + int count = genreDaoJdbc.updateObject(new Genre(1L, "UpdatedName")); + Genre genre2 = genreDaoJdbc.getById(1L); + + assertAll( + "genre", + () -> assertEquals(1, count), + () -> assertEquals("Genre1", genre1.getName()), + () -> assertEquals("UpdatedName", genre2.getName()) ); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java index b05b6fe..9fc482c 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java @@ -11,7 +11,9 @@ import java.text.SimpleDateFormat; import java.util.Date; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Created by IntelliJ IDEA. @@ -30,13 +32,16 @@ void getAddRecordDateString() { Book book = getNewBook(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - assertAll("book", - () -> assertNotNull(book), - () -> assertEquals(dateFormat.format(new Date()), book.getAddRecordDateString()) + assertAll( + "book", + () -> assertNotNull(book), + () -> assertEquals(dateFormat.format(new Date()), book.getAddRecordDateString()) ); } private Book getNewBook() { - return new Book(1, new Date(), "Test_Book", 2, 3, "Test_Comment"); + Author author = new Author(1L, "TestSurname", "TestFirstName", "TestSecondName"); + Genre genre = new Genre("Test4"); + return new Book(1L, new Date(), "Test_Book", author, genre, "Test_Comment"); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 23b4286..52f8606 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -4,8 +4,9 @@ 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.dao.EmptyResultDataAccessException; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; @@ -34,30 +35,22 @@ @SpringBootTest(classes = AppTestConfig.class) class AuthorManageSeviceImplTest { - private AuthorManageService authorManageService; - @BeforeEach - public void setup() { - EmbeddedDatabase db = new EmbeddedDatabaseBuilder() - .setType(EmbeddedDatabaseType.H2) - .addScript("test_schema.sql") - .addScript("test_data.sql") - .build(); - AuthorDaoJdbc authorDaoJdbc = new AuthorDaoJdbc(new JdbcTemplate(db)); - authorManageService = new AuthorManageServiceImpl(authorDaoJdbc); - } + @Autowired + private AuthorManageService authorManageService; @Test void getAuthorById() { - Author author = authorManageService.getAuthorById(1); - - assertAll("author", - () -> assertNotNull(author), - () -> assertEquals(1, author.getId()), - () -> assertEquals("Surname1", author.getSurname()), - () -> assertEquals("FirstName1", author.getFirstName()), - () -> assertEquals("SecondName1", author.getSecondName()) + Author author = authorManageService.getAuthorById(1L); + + assertAll( + "author", + () -> assertNotNull(author), + () -> assertEquals(1L, author.getId()), + () -> assertEquals("Surname1", author.getSurname()), + () -> assertEquals("FirstName1", author.getFirstName()), + () -> assertEquals("SecondName1", author.getSecondName()) ); } @@ -65,54 +58,52 @@ void getAuthorById() { void getAuthors() { List authors = authorManageService.getAuthors(); - assertAll("authors", - () -> assertNotNull(authors), - () -> assertEquals(3, authors.size()), - () -> assertEquals("Surname1", authors.get(0).getSurname()), - () -> assertEquals("Surname2", authors.get(1).getSurname()), - () -> assertEquals("Surname3", authors.get(2).getSurname()) + assertAll( + "authors", + () -> assertNotNull(authors), + () -> assertEquals(3, authors.size()), + () -> assertEquals("Surname1", authors.get(0).getSurname()), + () -> assertEquals("Surname2", authors.get(1).getSurname()), + () -> assertEquals("Surname3", authors.get(2).getSurname()) ); } @Test void addAuthor() { int count = authorManageService.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); - Author author_selected = authorManageService.getAuthorById(4); - - assertAll("author", - () -> assertNotNull(author_selected), - () -> assertEquals(1, count), - () -> assertEquals(4, author_selected.getId()), - () -> assertEquals("TestSurname", author_selected.getSurname()), - () -> assertEquals("TestFirstName", author_selected.getFirstName()), - () -> assertEquals("TestSecondName", author_selected.getSecondName()) + Author author_selected = authorManageService.getAuthorById(4L); + + assertAll( + "author", + () -> assertNotNull(author_selected), + () -> assertEquals(1, count), + () -> assertEquals(4L, author_selected.getId()), + () -> assertEquals("TestSurname", author_selected.getSurname()), + () -> assertEquals("TestFirstName", author_selected.getFirstName()), + () -> assertEquals("TestSecondName", author_selected.getSecondName()) ); } @Test void updateAuthor() { - Author author1 = authorManageService.getAuthorById(1); - int count = authorManageService.updateAuthor(1,"TestSurname", "TestFirstName", "TestSecondName"); - Author author2 = authorManageService.getAuthorById(1); - - assertAll("author", - () -> assertEquals(1, count), - () -> assertEquals("Surname1", author1.getSurname()), - () -> assertEquals("FirstName1", author1.getFirstName()), - () -> assertEquals("SecondName1", author1.getSecondName()), - () -> assertEquals("TestSurname", author2.getSurname()), - () -> assertEquals("TestFirstName", author2.getFirstName()), - () -> assertEquals("TestSecondName", author2.getSecondName()) + Author author1 = authorManageService.getAuthorById(1L); + int count = authorManageService.updateAuthor(1L, "TestSurname", "TestFirstName", "TestSecondName"); + Author author2 = authorManageService.getAuthorById(1L); + + assertAll( + "author", + () -> assertEquals(1, count), + () -> assertEquals("Surname1", author1.getSurname()), + () -> assertEquals("FirstName1", author1.getFirstName()), + () -> assertEquals("SecondName1", author1.getSecondName()), + () -> assertEquals("TestSurname", author2.getSurname()), + () -> assertEquals("TestFirstName", author2.getFirstName()), + () -> assertEquals("TestSecondName", author2.getSecondName()) ); } @Test void deleteAuthor() { - int count = authorManageService.deleteAuthor(1); - - assertAll("author", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { authorManageService.getAuthorById(1); }) - ); + assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(1L); }); } } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 2b9928c..a568230 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -4,6 +4,7 @@ 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.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -19,7 +20,11 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -33,37 +38,24 @@ @SpringBootTest(classes = AppTestConfig.class) class BookManageSeviceImplTest { + @Autowired private BookManageSevice booksManageSevice; - @BeforeEach - public void setup() { - EmbeddedDatabase db = new EmbeddedDatabaseBuilder() - .setType(EmbeddedDatabaseType.H2) - .addScript("test_schema.sql") - .addScript("test_data.sql") - .build(); - - AuthorDaoJdbc authorDaoJdbc = new AuthorDaoJdbc(new JdbcTemplate(db)); - BookDaoJdbc bookDaoJdbc = new BookDaoJdbc(new JdbcTemplate(db)); - GenreDaoJdbc genreDaoJdbc = new GenreDaoJdbc(new JdbcTemplate(db)); - - booksManageSevice = new BookManageSeviceImpl(authorDaoJdbc, bookDaoJdbc, genreDaoJdbc); - } - @Test void getBookById() { - Book book = booksManageSevice.getBookById(1); - - assertAll("book", - () -> assertNotNull(book), - () -> assertNull(book.getAuthor()), - () -> assertNull(book.getGenre()), - () -> assertEquals(1, book.getId()), - () -> assertEquals("2019-01-01", book.getAddRecordDateString()), - () -> assertEquals("book_1", book.getCaption()), - () -> assertEquals(1, book.getAuthorId()), - () -> assertEquals(1, book.getGenreId()), - () -> assertEquals("comment", book.getComment()) + Book book = booksManageSevice.getBookById(1L); + + assertAll( + "book", + () -> assertNotNull(book), + () -> assertNull(book.getAuthor()), + () -> assertNull(book.getGenre()), + () -> assertEquals(1L, book.getId()), + () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("book_1", book.getCaption()), + () -> assertEquals(1, book.getAuthor().getId()), + () -> assertEquals(1, book.getGenre().getId()), + () -> assertEquals("comment", book.getComment()) ); } @@ -71,16 +63,17 @@ void getBookById() { void getFullBookById() { Book book = booksManageSevice.getFullBookById(1); - assertAll("book", - () -> assertNotNull(book), - () -> assertNotNull(book.getAuthor()), - () -> assertNotNull(book.getGenre()), - () -> assertEquals(1, book.getId()), - () -> assertEquals("2019-01-01", book.getAddRecordDateString()), - () -> assertEquals("book_1", book.getCaption()), - () -> assertEquals(1, book.getAuthorId()), - () -> assertEquals(1, book.getGenreId()), - () -> assertEquals("comment", book.getComment()) + assertAll( + "book", + () -> assertNotNull(book), + () -> assertNotNull(book.getAuthor()), + () -> assertNotNull(book.getGenre()), + () -> assertEquals(1L, book.getId()), + () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("book_1", book.getCaption()), + () -> assertEquals(1, book.getAuthor().getId()), + () -> assertEquals(1, book.getGenre().getId()), + () -> assertEquals("comment", book.getComment()) ); } @@ -88,53 +81,57 @@ void getFullBookById() { void getBooks() { List books = booksManageSevice.getBooks(); - assertAll("books", - () -> assertNotNull(books), - () -> assertEquals(3, books.size()), - () -> assertEquals("book_1", books.get(0).getCaption()), - () -> assertEquals("book_2", books.get(1).getCaption()), - () -> assertEquals("book_3", books.get(2).getCaption()) + assertAll( + "books", + () -> assertNotNull(books), + () -> assertEquals(3, books.size()), + () -> assertEquals("book_1", books.get(0).getCaption()), + () -> assertEquals("book_2", books.get(1).getCaption()), + () -> assertEquals("book_3", books.get(2).getCaption()) ); } @Test void addBook() { - int count = booksManageSevice.addBook("Test_Book",2,3,"Test_Comment"); - Book book = booksManageSevice.getBookById(4); - - assertAll("book", - () -> assertNotNull(book), - () -> assertEquals(1, count), - () -> assertEquals(4, book.getId()), - () -> assertEquals("Test_Book", book.getCaption()), - () -> assertEquals(2, book.getAuthorId()), - () -> assertEquals(3, book.getGenreId()), - () -> assertEquals("Test_Comment", book.getComment()) + int count = booksManageSevice.addBook("Test_Book", 2, 3, "Test_Comment"); + Book book = booksManageSevice.getBookById(4L); + + assertAll( + "book", + () -> assertNotNull(book), + () -> assertEquals(1, count), + () -> assertEquals(4L, book.getId()), + () -> assertEquals("Test_Book", book.getCaption()), + () -> assertEquals(2, book.getAuthor().getId()), + () -> assertEquals(3, book.getGenre().getId()), + () -> assertEquals("Test_Comment", book.getComment()) ); } @Test void updateBook() { - Book book1 = booksManageSevice.getBookById(1); - int count = booksManageSevice.updateBook(1, "Test_Book", 2, 3, "Test_Comment"); - Book book2 = booksManageSevice.getBookById(1); - - assertAll("book", - () -> assertEquals(1, count), - () -> assertEquals("book_1", book1.getCaption()), - () -> assertEquals("comment", book1.getComment()), - () -> assertEquals("Test_Book", book2.getCaption()), - () -> assertEquals("Test_Comment", book2.getComment()) + Book book1 = booksManageSevice.getBookById(1L); + int count = booksManageSevice.updateBook(1L, "Test_Book", 2, 3, "Test_Comment"); + Book book2 = booksManageSevice.getBookById(1L); + + assertAll( + "book", + () -> assertEquals(1, count), + () -> assertEquals("book_1", book1.getCaption()), + () -> assertEquals("comment", book1.getComment()), + () -> assertEquals("Test_Book", book2.getCaption()), + () -> assertEquals("Test_Comment", book2.getComment()) ); } @Test void deleteBook() { - int count = booksManageSevice.deleteBook(1); + int count = booksManageSevice.deleteBook(1L); - assertAll("book", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getBookById(1); }) + assertAll( + "book", + () -> assertEquals(1, count), + () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getBookById(1L); }) ); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index d8b48ab..7fe9582 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -4,8 +4,9 @@ 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.dao.EmptyResultDataAccessException; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; @@ -34,28 +35,18 @@ @SpringBootTest(classes = AppTestConfig.class) class GenreManageSeviceImplTest { + @Autowired private GenreManageService genreManageService; - @BeforeEach - public void setup() { - EmbeddedDatabase db = new EmbeddedDatabaseBuilder() - .setType(EmbeddedDatabaseType.H2) - .addScript("test_schema.sql") - .addScript("test_data.sql") - .build(); - - GenreDaoJdbc genreDaoJdbc = new GenreDaoJdbc(new JdbcTemplate(db)); - genreManageService = new GenreManageServiceImpl(genreDaoJdbc); - } - @Test void getGenreById() { - Genre genre = genreManageService.getGenreById(1); + Genre genre = genreManageService.getGenreById(1L); - assertAll("genre", - () -> assertNotNull(genre), - () -> assertEquals(1, genre.getId()), - () -> assertEquals("Genre1", genre.getName()) + assertAll( + "genre", + () -> assertNotNull(genre), + () -> assertEquals(1L, genre.getId()), + () -> assertEquals("Genre1", genre.getName()) ); } @@ -63,48 +54,46 @@ void getGenreById() { void getGenres() { List genres = genreManageService.getGenres(); - assertAll("genres", - () -> assertNotNull(genres), - () -> assertEquals(3, genres.size()), - () -> assertEquals("Genre1", genres.get(0).getName()), - () -> assertEquals("Genre2", genres.get(1).getName()), - () -> assertEquals("Genre3", genres.get(2).getName()) + assertAll( + "genres", + () -> assertNotNull(genres), + () -> assertEquals(3, genres.size()), + () -> assertEquals("Genre1", genres.get(0).getName()), + () -> assertEquals("Genre2", genres.get(1).getName()), + () -> assertEquals("Genre3", genres.get(2).getName()) ); } @Test void addGenre() { int count = genreManageService.addGenre("Test4"); - Genre genre = genreManageService.getGenreById(4); - - assertAll("genre", - () -> assertNotNull(genre), - () -> assertEquals(1, count), - () -> assertEquals(4, genre.getId()), - () -> assertEquals("Test4", genre.getName()) + Genre genre = genreManageService.getGenreById(4L); + + assertAll( + "genre", + () -> assertNotNull(genre), + () -> assertEquals(1, count), + () -> assertEquals(4L, genre.getId()), + () -> assertEquals("Test4", genre.getName()) ); } @Test void updateGenre() { - Genre genre1 = genreManageService.getGenreById(1); - int count = genreManageService.updateGenre(1, "UpdatedName"); - Genre genre2 = genreManageService.getGenreById(1); - - assertAll("genre", - () -> assertEquals(1, count), - () -> assertEquals("Genre1", genre1.getName()), - () -> assertEquals("UpdatedName", genre2.getName()) + Genre genre1 = genreManageService.getGenreById(1L); + int count = genreManageService.updateGenre(1L, "UpdatedName"); + Genre genre2 = genreManageService.getGenreById(1L); + + assertAll( + "genre", + () -> assertEquals(1, count), + () -> assertEquals("Genre1", genre1.getName()), + () -> assertEquals("UpdatedName", genre2.getName()) ); } @Test void deleteGenre() { - int count = genreManageService.deleteGenre(1); - - assertAll("genre", - () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { genreManageService.getGenreById(1); }) - ); + assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(1L); }); } } diff --git a/src/test/resources/test_data.sql b/src/test/resources/test_data.sql deleted file mode 100644 index 02531b1..0000000 --- a/src/test/resources/test_data.sql +++ /dev/null @@ -1,27 +0,0 @@ -insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) -values ('Surname1', 'FirstName1', 'SecondName1'); - -insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) -values ('Surname2', 'FirstName2', 'SecondName2'); - -insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) -values ('Surname3', 'FirstName3', 'SecondName3'); - --------------------------- - -insert into GENRE (NAME) values ('Genre1'); -insert into GENRE (NAME) values ('Genre2'); -insert into GENRE (NAME) values ('Genre3'); - --------------------------- - -insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'comment'); - -insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'comment'); - -insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) - values (to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'comment'); - --------------------------- diff --git a/src/test/resources/test_schema.sql b/src/test/resources/test_schema.sql deleted file mode 100644 index d0b2b33..0000000 --- a/src/test/resources/test_schema.sql +++ /dev/null @@ -1,23 +0,0 @@ -DROP TABLE IF EXISTS BOOK; -CREATE TABLE BOOK( - ID INT AUTO_INCREMENT PRIMARY KEY, - ADD_RECORD_DATE DATE, - CAPTION VARCHAR(255) not null, - AUTHOR_ID INT not null, - GENRE_ID INT not null, - COMMENT VARCHAR(255) -); - -DROP TABLE IF EXISTS AUTHOR; -CREATE TABLE AUTHOR( - ID INT AUTO_INCREMENT PRIMARY KEY, - SURNAME VARCHAR(100) not null, - FIRST_NAME VARCHAR(100) not null, - SECOND_NAME VARCHAR(100) -); - -DROP TABLE IF EXISTS GENRE; -CREATE TABLE GENRE( - ID INT AUTO_INCREMENT PRIMARY KEY, - NAME VARCHAR(100) not null -); \ No newline at end of file From b019b1b177560cbe33a9227a6a389598316a9bdd Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 5 Jun 2019 16:19:41 +0300 Subject: [PATCH 16/70] =?UTF-8?q?-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B.=20-=20=D0=98?= =?UTF-8?q?=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20@JdbcTest.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++- .../ru/otus/mkulikov/app/dao/BookDaoJdbc.java | 3 +- .../java/ru/otus/mkulikov/app/model/Book.java | 21 +------ .../ru/otus/mkulikov/app/utils/DateUtil.java | 22 +++++++ src/main/resources/application.yml | 12 ++-- .../java/ru/otus/mkulikov/AppTestConfig.java | 59 ------------------- .../mkulikov/app/dao/AuthorDaoJdbcTest.java | 17 ++---- .../mkulikov/app/dao/BookDaoJdbcTest.java | 23 +++----- .../mkulikov/app/dao/GenreDaoJdbcTest.java | 14 ++--- .../ru/otus/mkulikov/app/model/BookTest.java | 7 +-- .../service/AuthorManageSeviceImplTest.java | 15 ++--- .../app/service/BookManageSeviceImplTest.java | 28 ++++----- .../service/GenreManageSeviceImplTest.java | 13 ++-- 13 files changed, 80 insertions(+), 167 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java delete mode 100644 src/test/java/ru/otus/mkulikov/AppTestConfig.java diff --git a/README.md b/README.md index 943beb2..d6228fc 100644 --- a/README.md +++ b/README.md @@ -6,4 +6,15 @@ - Опционально использовать настоящую реляционную БД, но можно использовать H2. - Предусмотреть таблицы авторов, книг и жанров. - Интерфейс на Spring Shell. -- Покрыть тестами, насколько это возможно. \ No newline at end of file +- Покрыть тестами, насколько это возможно. + +### 19-05-31 Доработки: +- JdbcOperations заменен на NamedParameterJdbcOperations. +- Изменены запросы книг. +- Добавление внешних ключей для таблицы книг. +- Изменение сущности Book. +- Изменение типа id. + +### 19-06-05 Доработки: +- Изменены тесты. +- Использование @JdbcTest. diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java index 2ab1c2a..cd3f532 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.stereotype.Repository; @@ -35,7 +34,7 @@ public class BookDaoJdbc implements BookDao { + "from Book b " + "inner join Author a on a.id = b.author_id " + "inner join Genre g on g.id = b.genre_id " - + "where id = :id "; + + "where b.id = :id "; private final String BOOK_SELECT_ALL = "select b.*, a.surname, a.first_name, a.second_name, g.name " diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index a70181d..0127892 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -47,23 +47,6 @@ public Book(String caption, Author author, Genre genre, String comment) { this.comment = comment; } - public String getAddRecordDateString() { - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - return addRecordDate != null ? dateFormat.format(addRecordDate) : null; - } - - public String getAuthorString() { - return (author != null) - ? ", author='" + author.toFormatedString() + '\'' - : ""; - } - - public String getGenreString() { - return (genre != null) - ? ", genre='" + genre.getName() + '\'' - : ""; - } - @Override public String toString() { return "Book{" + @@ -71,8 +54,8 @@ public String toString() { ", addRecordDate=" + addRecordDate + ", caption='" + caption + '\'' + ", comment='" + comment + '\'' + - getAuthorString() + - getGenreString() + + ", author=" + author + + ", genre=" + genre + "}\n"; } } diff --git a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java new file mode 100644 index 0000000..2507a0a --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java @@ -0,0 +1,22 @@ +package ru.otus.mkulikov.app.utils; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 05.06.2019 + * Time: 11:33 + */ + +public class DateUtil { + + private final static String DATE_FORMAT = "yyyy-MM-dd"; + + public static String dateToString(Date date) { + DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); + return date != null ? dateFormat.format(date) : null; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4252b7d..3436172 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,11 +1,7 @@ spring: - datasource: - data: "classpath:data.sql" - schema: "classpath:schema.sql" - username: "SA" - password: "" - driver-class-name: "org.h2.Driver" - url: "jdbc:h2:mem:test" - banner: location: "classpath:banner.txt" + + + + diff --git a/src/test/java/ru/otus/mkulikov/AppTestConfig.java b/src/test/java/ru/otus/mkulikov/AppTestConfig.java deleted file mode 100644 index 376bdc6..0000000 --- a/src/test/java/ru/otus/mkulikov/AppTestConfig.java +++ /dev/null @@ -1,59 +0,0 @@ -package ru.otus.mkulikov; - -import org.springframework.boot.SpringBootConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Primary; -import org.springframework.context.annotation.PropertySource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import ru.otus.mkulikov.app.dao.BookDaoJdbc; - -import javax.sql.DataSource; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 28.05.2019 - * Time: 9:47 - */ - -@SpringBootConfiguration -@ComponentScan("ru.otus.mkulikov.app") -@PropertySource({"classpath:application.yml"}) -@EnableConfigurationProperties -public class AppTestConfig { - - @Bean - public NamedParameterJdbcOperations getNamedParameterJdbcOperations(DataSource dataSource) { - return new NamedParameterJdbcTemplate(dataSource); - } - - //@Bean - //public DataSource getDataSource() { - // DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); - // dataSourceBuilder.driverClassName("org.h2.Driver"); - // dataSourceBuilder.url("jdbc:h2:mem:test"); - // dataSourceBuilder.username("SA"); - // dataSourceBuilder.password(""); - // return dataSourceBuilder.build(); - //} - - @Bean - @Primary - @ConfigurationProperties("application.yml") - public DataSourceProperties getDatasourceProperties() { - return new DataSourceProperties(); - } - - @Bean - //@ConfigurationProperties("datasource.oracle") - public DataSource getDatasource() { - return getDatasourceProperties().initializeDataSourceBuilder() - .build(); - } -} diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java index 145835b..ba4bed6 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java @@ -1,21 +1,13 @@ package ru.otus.mkulikov.app.dao; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.context.annotation.Import; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.AppTestConfig; import ru.otus.mkulikov.app.model.Author; import java.util.List; @@ -34,11 +26,12 @@ @DisplayName("Класс AuthorDaoJdbc") @RunWith(SpringRunner.class) -@SpringBootTest(classes = AppTestConfig.class) +@JdbcTest +@Import(AuthorDaoJdbc.class) class AuthorDaoJdbcTest { @Autowired - private AuthorDaoJdbc authorDaoJdbc; + private AuthorDao authorDaoJdbc; @Test void getById() { diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java index d48684b..908c10a 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java @@ -1,24 +1,16 @@ package ru.otus.mkulikov.app.dao; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.AppTestConfig; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.utils.DateUtil; import java.util.Date; import java.util.List; @@ -37,11 +29,12 @@ @DisplayName("Класс BookDaoJdbc") @RunWith(SpringRunner.class) -@SpringBootTest(classes = AppTestConfig.class) +@JdbcTest +@Import(BookDaoJdbc.class) class BookDaoJdbcTest { @Autowired - private BookDaoJdbc bookDaoJdbc; + private BookDao bookDaoJdbc; @Test void getById() { @@ -51,7 +44,7 @@ void getById() { "book", () -> assertNotNull(book), () -> assertEquals(1L, book.getId()), - () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("2019-01-01", DateUtil.dateToString(book.getAddRecordDate())), () -> assertEquals("book_1", book.getCaption()), () -> assertEquals(1, book.getAuthor().getId()), () -> assertEquals(1, book.getGenre().getId()), @@ -97,7 +90,7 @@ void deleteObject() { assertAll( "book", () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { bookDaoJdbc.getById(1L); }) + () -> assertThrows(IndexOutOfBoundsException.class, () -> { bookDaoJdbc.getById(1L); }) ); } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java index 9dc952c..47791a4 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java @@ -1,18 +1,13 @@ package ru.otus.mkulikov.app.dao; -import org.junit.jupiter.api.BeforeEach; 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.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.context.annotation.Import; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.AppTestConfig; import ru.otus.mkulikov.app.model.Genre; import java.util.List; @@ -31,11 +26,12 @@ @DisplayName("Класс GenreDaoJdbc") @RunWith(SpringRunner.class) -@SpringBootTest(classes = AppTestConfig.class) +@JdbcTest +@Import(GenreDaoJdbc.class) class GenreDaoJdbcTest { @Autowired - private GenreDaoJdbc genreDaoJdbc; + private GenreDao genreDaoJdbc; @Test void getById() { diff --git a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java index 9fc482c..293ef8c 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java @@ -3,9 +3,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.AppTestConfig; +import ru.otus.mkulikov.app.utils.DateUtil; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -24,7 +23,7 @@ @DisplayName("Класс Book") @RunWith(SpringRunner.class) -@SpringBootTest(classes = AppTestConfig.class) +//@SpringBootTest(classes = AppTestConfig.class) class BookTest { @Test @@ -35,7 +34,7 @@ void getAddRecordDateString() { assertAll( "book", () -> assertNotNull(book), - () -> assertEquals(dateFormat.format(new Date()), book.getAddRecordDateString()) + () -> assertEquals(dateFormat.format(new Date()), DateUtil.dateToString(book.getAddRecordDate())) ); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 52f8606..93ca519 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -1,19 +1,13 @@ package ru.otus.mkulikov.app.service; -import org.junit.jupiter.api.BeforeEach; 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.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.AppTestConfig; -import ru.otus.mkulikov.app.dao.AuthorDaoJdbc; import ru.otus.mkulikov.app.model.Author; import java.util.List; @@ -32,11 +26,10 @@ @DisplayName("Класс AuthorManageSevice") @RunWith(SpringRunner.class) -@SpringBootTest(classes = AppTestConfig.class) +@JdbcTest +@ComponentScan("ru.otus.mkulikov.app") class AuthorManageSeviceImplTest { - - @Autowired private AuthorManageService authorManageService; diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index a568230..e7db9bc 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -1,29 +1,20 @@ package ru.otus.mkulikov.app.service; -import org.junit.jupiter.api.BeforeEach; 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.dao.EmptyResultDataAccessException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.AppTestConfig; -import ru.otus.mkulikov.app.dao.AuthorDaoJdbc; -import ru.otus.mkulikov.app.dao.BookDaoJdbc; -import ru.otus.mkulikov.app.dao.GenreDaoJdbc; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.utils.DateUtil; import java.util.List; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; /** @@ -35,7 +26,8 @@ @DisplayName("Класс BookManageSevice") @RunWith(SpringRunner.class) -@SpringBootTest(classes = AppTestConfig.class) +@JdbcTest +@ComponentScan("ru.otus.mkulikov.app") class BookManageSeviceImplTest { @Autowired @@ -48,10 +40,10 @@ void getBookById() { assertAll( "book", () -> assertNotNull(book), - () -> assertNull(book.getAuthor()), - () -> assertNull(book.getGenre()), + () -> assertNotNull(book.getAuthor()), + () -> assertNotNull(book.getGenre()), () -> assertEquals(1L, book.getId()), - () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("2019-01-01", DateUtil.dateToString(book.getAddRecordDate())), () -> assertEquals("book_1", book.getCaption()), () -> assertEquals(1, book.getAuthor().getId()), () -> assertEquals(1, book.getGenre().getId()), @@ -69,7 +61,7 @@ void getFullBookById() { () -> assertNotNull(book.getAuthor()), () -> assertNotNull(book.getGenre()), () -> assertEquals(1L, book.getId()), - () -> assertEquals("2019-01-01", book.getAddRecordDateString()), + () -> assertEquals("2019-01-01", DateUtil.dateToString(book.getAddRecordDate())), () -> assertEquals("book_1", book.getCaption()), () -> assertEquals(1, book.getAuthor().getId()), () -> assertEquals(1, book.getGenre().getId()), @@ -131,7 +123,7 @@ void deleteBook() { assertAll( "book", () -> assertEquals(1, count), - () -> assertThrows(EmptyResultDataAccessException.class, () -> { booksManageSevice.getBookById(1L); }) + () -> assertThrows(IndexOutOfBoundsException.class, () -> { booksManageSevice.getBookById(1L); }) ); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 7fe9582..57a833b 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -1,19 +1,13 @@ package ru.otus.mkulikov.app.service; -import org.junit.jupiter.api.BeforeEach; 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.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; -import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.test.context.junit4.SpringRunner; -import ru.otus.mkulikov.AppTestConfig; -import ru.otus.mkulikov.app.dao.GenreDaoJdbc; import ru.otus.mkulikov.app.model.Genre; import java.util.List; @@ -32,7 +26,8 @@ @DisplayName("Класс GenreManageSevice") @RunWith(SpringRunner.class) -@SpringBootTest(classes = AppTestConfig.class) +@JdbcTest +@ComponentScan("ru.otus.mkulikov.app") class GenreManageSeviceImplTest { @Autowired From 45999774aba7d9e16b357c81822f73a0d37ce677 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 6 Jun 2019 09:47:00 +0300 Subject: [PATCH 17/70] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index d6228fc..aff31e5 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,7 @@ # OtusSpringHW-Library -Домашнее задание #5: -- Создать приложение хранящее информацию о книгах в библиотеке. -- Использовать Spring JDBC и реляционную базу. -- Опционально использовать настоящую реляционную БД, но можно использовать H2. -- Предусмотреть таблицы авторов, книг и жанров. -- Интерфейс на Spring Shell. -- Покрыть тестами, насколько это возможно. - -### 19-05-31 Доработки: -- JdbcOperations заменен на NamedParameterJdbcOperations. -- Изменены запросы книг. -- Добавление внешних ключей для таблицы книг. -- Изменение сущности Book. -- Изменение типа id. - -### 19-06-05 Доработки: -- Изменены тесты. -- Использование @JdbcTest. +Домашнее задание #6: +- Переписать приложение для хранения книг на ORM. +- Использовать JPA, Hibernate только в качестве JPA-провайдера. +- Добавить комментарии к книгам, и высокоуровневые сервисы, оставляющие комментарии к книгам. +- Покрыть DAO тестами используя H2 базу данных и соответствующий H2 Hibernate-диалект. From 0ed6680820e7bfc8554cf57bedb799417f6b79ea Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 13 Jun 2019 17:30:08 +0300 Subject: [PATCH 18/70] =?UTF-8?q?=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20?= =?UTF-8?q?=D1=81=20=D0=B1=D0=B4=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20jpa.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 ++-- .../otus/mkulikov/app/dao/AuthorDaoJdbc.java | 61 ++++++++----------- .../otus/mkulikov/app/dao/GenreDaoJdbc.java | 54 +++++++--------- .../ru/otus/mkulikov/app/model/Author.java | 36 +++++++++-- .../java/ru/otus/mkulikov/app/model/Book.java | 35 ++++++++++- .../ru/otus/mkulikov/app/model/Genre.java | 30 ++++++++- src/main/resources/application.yml | 4 +- src/main/resources/data.sql | 30 ++++----- src/main/resources/schema.sql | 13 ++-- .../mkulikov/app/dao/AuthorDaoJdbcTest.java | 10 ++- 10 files changed, 181 insertions(+), 105 deletions(-) diff --git a/pom.xml b/pom.xml index b77b838..f1fbb76 100644 --- a/pom.xml +++ b/pom.xml @@ -84,10 +84,10 @@ spring-boot-starter - - org.springframework.boot - spring-boot-starter-jdbc - + + + + org.springframework.boot @@ -101,6 +101,11 @@ true + + org.springframework.boot + spring-boot-starter-data-jpa + + org.springframework.shell spring-shell-starter diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java index 8f23571..b3d9409 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java @@ -1,17 +1,14 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + import java.util.List; -import java.util.Map; /** * Created by IntelliJ IDEA. @@ -22,58 +19,48 @@ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) @Repository +@Transactional @RequiredArgsConstructor public class AuthorDaoJdbc implements AuthorDao { - private final NamedParameterJdbcOperations namedParameterJdbcOperations; + @PersistenceContext + private EntityManager em; @Override public Author getById(long id) { - Map paramMap = new HashMap(); - paramMap.put("id", id); + List list = em.createQuery("select a from Author a where a.id = :id", Author.class) + .setParameter("id", id) + .getResultList(); - return namedParameterJdbcOperations.queryForObject("select * from Author where id = :id ", paramMap, new AuthorMapper()); + return (list != null && !list.isEmpty()) ? list.get(0) : null; } @Override public List getAllObjects() { - return namedParameterJdbcOperations.query("select * from Author order by id", new AuthorMapper()); + return em.createQuery("select a from Author a order by a.id", Author.class) + .getResultList(); } @Override public int addObject(Author author) { - return namedParameterJdbcOperations.update( - "insert into Author (surname, first_name, second_name) values (:surname, :firstName, :secondName)", - new BeanPropertySqlParameterSource(author) - ); + em.persist(author); + return 1; } @Override public int deleteObject(long id) { - Map paramMap = new HashMap(); - paramMap.put("id", id); - - return namedParameterJdbcOperations.update("delete from Author where id = :id ", paramMap); + return em.createQuery("delete from Author a where a.id = :id ") + .setParameter("id", id) + .executeUpdate(); } @Override public int updateObject(Author author) { - return namedParameterJdbcOperations.update( - "update Author set surname = :surname, first_name = :firstName, second_name = :secondName where id = :id ", - new BeanPropertySqlParameterSource(author) - ); - } - - public static class AuthorMapper implements RowMapper { - - @Override - public Author mapRow(ResultSet resultSet, int i) throws SQLException { - int id = resultSet.getInt("ID"); - String surname = resultSet.getString("SURNAME"); - String firstName = resultSet.getString("FIRST_NAME"); - String secondName = resultSet.getString("SECOND_NAME"); - - return new Author(id, surname, firstName, secondName); - } + return em.createQuery("update Author a set a.surname = :surname, a.first_name = :firstName, a.second_name = :secondName where a.id = :id ") + .setParameter("surname", author.getSurname()) + .setParameter("firstName", author.getFirstName()) + .setParameter("secondName", author.getSecondName()) + .setParameter("id", author.getId()) + .executeUpdate(); } } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java index 627c1e5..0ace048 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java @@ -1,17 +1,13 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; import java.util.List; -import java.util.Map; /** * Created by IntelliJ IDEA. @@ -22,54 +18,46 @@ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) @Repository +@Transactional @RequiredArgsConstructor public class GenreDaoJdbc implements GenreDao { - private final NamedParameterJdbcOperations namedParameterJdbcOperations; + @PersistenceContext + private EntityManager em; @Override public Genre getById(long id) { - Map paramMap = new HashMap(); - paramMap.put("id", id); + List list = em.createQuery("select g from Genre g where g.id = :id ", Genre.class) + .setParameter("id", id) + .getResultList(); - return namedParameterJdbcOperations.queryForObject("select * from Genre where id = :id ", paramMap, new GenreMapper()); + return (list != null && !list.isEmpty()) ? list.get(0) : null; } @Override public List getAllObjects() { - return namedParameterJdbcOperations.query("select * from Genre order by id", new GenreMapper()); + return em.createQuery("select g from Genre g order by g.id", Genre.class) + .getResultList(); } @Override public int addObject(Genre genre) { - return namedParameterJdbcOperations.update( - "insert into Genre (name) values (:name)", - new BeanPropertySqlParameterSource(genre)); + em.persist(genre); + return 1; } @Override public int deleteObject(long id) { - Map paramMap = new HashMap(); - paramMap.put("id", id); - - return namedParameterJdbcOperations.update("delete from Genre where id = :id ", paramMap); + return em.createQuery("delete from Genre g where g.id = :id ") + .setParameter("id", id) + .executeUpdate(); } @Override public int updateObject(Genre genre) { - return namedParameterJdbcOperations.update( - "update Genre set name = :name where id = :id ", - new BeanPropertySqlParameterSource(genre)); - } - - public static class GenreMapper implements RowMapper { - - @Override - public Genre mapRow(ResultSet resultSet, int i) throws SQLException { - int id = resultSet.getInt("ID"); - String name = resultSet.getString("NAME"); - - return new Genre(id, name); - } + return em.createQuery("update Genre g set g.name = :name where g.id = :id ") + .setParameter("name", genre.getName()) + .setParameter("id", genre.getId()) + .executeUpdate(); } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index d3bd662..a8de914 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -2,6 +2,18 @@ import lombok.Data; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.OneToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import java.math.BigInteger; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -10,12 +22,28 @@ */ @Data +@Entity +@Table(name = "AUTHOR") public class Author { - private final long id; - private final String surname; - private final String firstName; - private final String secondName; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_author") + @SequenceGenerator(name = "sq_author", sequenceName = "sq_author", allocationSize = 1) + @Column(name = "ID") + private long id; + @Column(name = "SURNAME") + private String surname; + @Column(name = "FIRST_NAME") + private String firstName; + @Column(name = "SECOND_NAME") + private String secondName; + // + //@OneToOne(mappedBy = "author") + //@JoinTable(name="BOOK", joinColumns=@JoinColumn(name="AUTHOR_ID")) + //private Book book; + + public Author() { + } public Author(long id, String surname, String firstName, String secondName) { this.id = id; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 0127892..b509adb 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -2,8 +2,18 @@ import lombok.Data; -import java.text.DateFormat; -import java.text.SimpleDateFormat; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToOne; +import javax.persistence.OneToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; import java.util.Date; /** @@ -14,14 +24,33 @@ */ @Data +@Entity +@Table(name = "BOOK") public class Book { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_book") + @SequenceGenerator(name = "sq_book", sequenceName = "sq_book", allocationSize = 1) + @Column(name = "ID") private long id; + @Column(name = "ADD_RECORD_DATE") private Date addRecordDate; + @Column(name = "CAPTION") private String caption; + @Column(name = "COMMENT") + private String comment; + + @OneToOne//(mappedBy = "book") + //@JoinTable(name="AUTHOR", joinColumns=@JoinColumn(name="AUTHOR_ID")) private Author author; + + //@JoinTable(name="GENRE", joinColumns=@JoinColumn(name="GENRE_ID")) + @OneToOne//(mappedBy = "book") private Genre genre; - private String comment; + + + public Book() { + } public Book(long id, Date addRecordDate, String caption, Author author, Genre genre, String comment) { this.id = id; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 5dff2a6..2d5a5f2 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -2,6 +2,17 @@ import lombok.Data; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.OneToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -10,10 +21,25 @@ */ @Data +@Entity +@Table(name = "GENRE") public class Genre { - private final long id; - private final String name; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_genre") + @SequenceGenerator(name = "sq_genre", sequenceName = "sq_genre", allocationSize = 1) + @Column(name = "ID") + private long id; + + @Column(name = "NAME") + private String name; + + //@OneToOne(mappedBy = "genre") + //private Book book; + + + public Genre() { + } public Genre(long id, String name) { this.id = id; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3436172..1534e00 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,8 @@ spring: banner: location: "classpath:banner.txt" - + jpa: + hibernate: + ddl-auto: none diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 1372099..a0fbb68 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1,27 +1,27 @@ -insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) -values ('Surname1', 'FirstName1', 'SecondName1'); +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (sq_author.nextval, 'Surname1', 'FirstName1', 'SecondName1'); -insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) -values ('Surname2', 'FirstName2', 'SecondName2'); +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (sq_author.nextval, 'Surname2', 'FirstName2', 'SecondName2'); -insert into AUTHOR (SURNAME, FIRST_NAME, SECOND_NAME) -values ('Surname3', 'FirstName3', 'SecondName3'); +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (sq_author.nextval, 'Surname3', 'FirstName3', 'SecondName3'); -------------------------- -insert into GENRE (NAME) values ('Genre1'); -insert into GENRE (NAME) values ('Genre2'); -insert into GENRE (NAME) values ('Genre3'); +insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre1'); +insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre2'); +insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre3'); -------------------------- -insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'comment'); -insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'comment'); -insert into BOOK (ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'comment'); -------------------------- diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index c18e8d2..538c6ab 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -3,26 +3,29 @@ DROP TABLE IF EXISTS AUTHOR; DROP TABLE IF EXISTS GENRE; CREATE TABLE AUTHOR( - ID NUMBER(22,0) AUTO_INCREMENT PRIMARY KEY, + ID NUMBER(22,0) PRIMARY KEY not null, SURNAME VARCHAR(100) not null, FIRST_NAME VARCHAR(100) not null, SECOND_NAME VARCHAR(100) ); CREATE TABLE GENRE( - ID NUMBER(22,0) AUTO_INCREMENT PRIMARY KEY, + ID NUMBER(22,0) PRIMARY KEY not null, NAME VARCHAR(100) not null ); CREATE TABLE BOOK( - ID NUMBER(22,0) AUTO_INCREMENT PRIMARY KEY, + ID NUMBER(22,0) PRIMARY KEY not null, ADD_RECORD_DATE DATE, CAPTION VARCHAR(255) not null, - AUTHOR_ID INT not null, - GENRE_ID INT not null, + AUTHOR_ID NUMBER(22,0) not null, + GENRE_ID NUMBER(22,0) not null, COMMENT VARCHAR(255), foreign key (AUTHOR_ID) references AUTHOR(ID), foreign key (GENRE_ID) references GENRE(ID) ); +CREATE SEQUENCE sq_author minvalue 1 start with 1 increment by 1; +CREATE SEQUENCE sq_genre minvalue 1 start with 1 increment by 1; +CREATE SEQUENCE sq_book minvalue 1 start with 1 increment by 1; diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java index ba4bed6..30a0e0f 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java @@ -5,11 +5,16 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; import java.util.List; import static org.junit.jupiter.api.Assertions.assertAll; @@ -26,13 +31,16 @@ @DisplayName("Класс AuthorDaoJdbc") @RunWith(SpringRunner.class) -@JdbcTest @Import(AuthorDaoJdbc.class) +@DataJpaTest class AuthorDaoJdbcTest { @Autowired private AuthorDao authorDaoJdbc; + //@PersistenceContext + //private EntityManager manager; + @Test void getById() { Author author = authorDaoJdbc.getById(1L); From a9d5968040b8d097623b82a8beb8571349db302c Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 13 Jun 2019 18:05:33 +0300 Subject: [PATCH 19/70] =?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 --- .../{AuthorDaoJdbc.java => AuthorDaoJpa.java} | 4 ++- .../{GenreDaoJdbc.java => GenreDaoJpa.java} | 4 ++- .../ru/otus/mkulikov/app/model/Author.java | 8 ------ .../java/ru/otus/mkulikov/app/model/Book.java | 11 ++------ .../ru/otus/mkulikov/app/model/Genre.java | 7 ----- .../mkulikov/app/dao/AuthorDaoJdbcTest.java | 28 +++++++------------ .../mkulikov/app/dao/GenreDaoJdbcTest.java | 20 ++++++------- 7 files changed, 28 insertions(+), 54 deletions(-) rename src/main/java/ru/otus/mkulikov/app/dao/{AuthorDaoJdbc.java => AuthorDaoJpa.java} (89%) rename src/main/java/ru/otus/mkulikov/app/dao/{GenreDaoJdbc.java => GenreDaoJpa.java} (88%) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java similarity index 89% rename from src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java rename to src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java index b3d9409..04e3988 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java @@ -21,7 +21,7 @@ @Repository @Transactional @RequiredArgsConstructor -public class AuthorDaoJdbc implements AuthorDao { +public class AuthorDaoJpa implements AuthorDao { @PersistenceContext private EntityManager em; @@ -32,6 +32,8 @@ public Author getById(long id) { .setParameter("id", id) .getResultList(); + // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных + // не хочу ошибку, хочу null return (list != null && !list.isEmpty()) ? list.get(0) : null; } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java similarity index 88% rename from src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java rename to src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java index 0ace048..e7e52fb 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJdbc.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java @@ -20,7 +20,7 @@ @Repository @Transactional @RequiredArgsConstructor -public class GenreDaoJdbc implements GenreDao { +public class GenreDaoJpa implements GenreDao { @PersistenceContext private EntityManager em; @@ -31,6 +31,8 @@ public Genre getById(long id) { .setParameter("id", id) .getResultList(); + // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных + // не хочу ошибку, хочу null return (list != null && !list.isEmpty()) ? list.get(0) : null; } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index a8de914..c3bdcb4 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -7,12 +7,8 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; -import java.math.BigInteger; /** * Created by IntelliJ IDEA. @@ -37,10 +33,6 @@ public class Author { private String firstName; @Column(name = "SECOND_NAME") private String secondName; - // - //@OneToOne(mappedBy = "author") - //@JoinTable(name="BOOK", joinColumns=@JoinColumn(name="AUTHOR_ID")) - //private Book book; public Author() { } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index b509adb..ea3c49b 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -2,15 +2,11 @@ import lombok.Data; -import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @@ -40,15 +36,12 @@ public class Book { @Column(name = "COMMENT") private String comment; - @OneToOne//(mappedBy = "book") - //@JoinTable(name="AUTHOR", joinColumns=@JoinColumn(name="AUTHOR_ID")) + @OneToOne private Author author; - //@JoinTable(name="GENRE", joinColumns=@JoinColumn(name="GENRE_ID")) - @OneToOne//(mappedBy = "book") + @OneToOne private Genre genre; - public Book() { } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 2d5a5f2..c89efa3 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -7,9 +7,6 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @@ -34,10 +31,6 @@ public class Genre { @Column(name = "NAME") private String name; - //@OneToOne(mappedBy = "genre") - //private Book book; - - public Genre() { } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java index 30a0e0f..5971ffe 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java @@ -4,17 +4,12 @@ import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; import java.util.List; import static org.junit.jupiter.api.Assertions.assertAll; @@ -31,19 +26,16 @@ @DisplayName("Класс AuthorDaoJdbc") @RunWith(SpringRunner.class) -@Import(AuthorDaoJdbc.class) +@Import(AuthorDaoJpa.class) @DataJpaTest class AuthorDaoJdbcTest { @Autowired - private AuthorDao authorDaoJdbc; - - //@PersistenceContext - //private EntityManager manager; + private AuthorDao authorDaoJpa; @Test void getById() { - Author author = authorDaoJdbc.getById(1L); + Author author = authorDaoJpa.getById(1L); assertAll( "author", @@ -57,7 +49,7 @@ void getById() { @Test void getAllObjects() { - List authors = authorDaoJdbc.getAllObjects(); + List authors = authorDaoJpa.getAllObjects(); assertAll( "authors", @@ -72,8 +64,8 @@ void getAllObjects() { @Test void addObject() { Author author = new Author("TestSurname", "TestFirstName", "TestSecondName"); - int count = authorDaoJdbc.addObject(author); - Author author_selected = authorDaoJdbc.getById(4L); + int count = authorDaoJpa.addObject(author); + Author author_selected = authorDaoJpa.getById(4L); assertAll( "author", @@ -88,16 +80,16 @@ void addObject() { @Test void deleteObject() { - assertThrows(DataIntegrityViolationException.class, () -> { authorDaoJdbc.deleteObject(1L); }); + assertThrows(DataIntegrityViolationException.class, () -> { authorDaoJpa.deleteObject(1L); }); } @Test void updateObject() { - Author author1 = authorDaoJdbc.getById(1L); - int count = authorDaoJdbc.updateObject( + Author author1 = authorDaoJpa.getById(1L); + int count = authorDaoJpa.updateObject( new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") ); - Author author2 = authorDaoJdbc.getById(1L); + Author author2 = authorDaoJpa.getById(1L); assertAll( "author", diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java index 47791a4..c73c2e1 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java @@ -27,15 +27,15 @@ @DisplayName("Класс GenreDaoJdbc") @RunWith(SpringRunner.class) @JdbcTest -@Import(GenreDaoJdbc.class) +@Import(GenreDaoJpa.class) class GenreDaoJdbcTest { @Autowired - private GenreDao genreDaoJdbc; + private GenreDao genreDaoJpa; @Test void getById() { - Genre genre = genreDaoJdbc.getById(1L); + Genre genre = genreDaoJpa.getById(1L); assertAll( "genre", @@ -47,7 +47,7 @@ void getById() { @Test void getAllObjects() { - List genres = genreDaoJdbc.getAllObjects(); + List genres = genreDaoJpa.getAllObjects(); assertAll( "genres", @@ -61,9 +61,9 @@ void getAllObjects() { @Test void addObject() { - int count = genreDaoJdbc.addObject(new Genre("Test4")); + int count = genreDaoJpa.addObject(new Genre("Test4")); - Genre genre = genreDaoJdbc.getById(4L); + Genre genre = genreDaoJpa.getById(4L); assertAll( "genre", @@ -76,14 +76,14 @@ void addObject() { @Test void deleteObject() { - assertThrows(DataIntegrityViolationException.class, () -> { genreDaoJdbc.deleteObject(1L); }); + assertThrows(DataIntegrityViolationException.class, () -> { genreDaoJpa.deleteObject(1L); }); } @Test void updateObject() { - Genre genre1 = genreDaoJdbc.getById(1L); - int count = genreDaoJdbc.updateObject(new Genre(1L, "UpdatedName")); - Genre genre2 = genreDaoJdbc.getById(1L); + Genre genre1 = genreDaoJpa.getById(1L); + int count = genreDaoJpa.updateObject(new Genre(1L, "UpdatedName")); + Genre genre2 = genreDaoJpa.getById(1L); assertAll( "genre", From b228def7bd2a4122d8977a0b36bd519b9156bc21 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 14 Jun 2019 00:39:44 +0300 Subject: [PATCH 20/70] =?UTF-8?q?-=20=D0=A0=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=20=D1=81=20=D0=B1=D0=B4=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20jpa?= =?UTF-8?q?.=20-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=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 --- .../otus/mkulikov/app/dao/AuthorDaoJpa.java | 5 +- .../ru/otus/mkulikov/app/dao/BookDaoJdbc.java | 127 ------------------ .../ru/otus/mkulikov/app/dao/BookDaoJpa.java | 75 +++++++++++ .../ru/otus/mkulikov/app/dao/GenreDaoJpa.java | 5 +- .../ru/otus/mkulikov/app/model/Author.java | 10 +- .../java/ru/otus/mkulikov/app/model/Book.java | 14 +- .../ru/otus/mkulikov/app/model/Genre.java | 6 +- .../app/service/BookManageSevice.java | 2 - .../app/service/BookManageSeviceImpl.java | 6 - .../otus/mkulikov/shell/AuthorCommands.java | 10 +- .../ru/otus/mkulikov/shell/BookCommands.java | 18 +-- .../ru/otus/mkulikov/shell/GenreCommands.java | 10 +- ...DaoJdbcTest.java => AuthorDaoJpaTest.java} | 11 +- ...okDaoJdbcTest.java => BookDaoJpaTest.java} | 29 ++-- ...eDaoJdbcTest.java => GenreDaoJpaTest.java} | 7 +- .../ru/otus/mkulikov/app/model/BookTest.java | 4 +- .../service/AuthorManageSeviceImplTest.java | 5 +- .../app/service/BookManageSeviceImplTest.java | 5 +- .../service/GenreManageSeviceImplTest.java | 5 +- 19 files changed, 137 insertions(+), 217 deletions(-) delete mode 100644 src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java create mode 100644 src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java rename src/test/java/ru/otus/mkulikov/app/dao/{AuthorDaoJdbcTest.java => AuthorDaoJpaTest.java} (88%) rename src/test/java/ru/otus/mkulikov/app/dao/{BookDaoJdbcTest.java => BookDaoJpaTest.java} (80%) rename src/test/java/ru/otus/mkulikov/app/dao/{GenreDaoJdbcTest.java => GenreDaoJpaTest.java} (90%) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java index 04e3988..cfb17ba 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java @@ -58,11 +58,14 @@ public int deleteObject(long id) { @Override public int updateObject(Author author) { - return em.createQuery("update Author a set a.surname = :surname, a.first_name = :firstName, a.second_name = :secondName where a.id = :id ") + int count = em.createQuery("update Author a set a.surname = :surname, a.firstName = :firstName, a.secondName = :secondName where a.id = :id ") .setParameter("surname", author.getSurname()) .setParameter("firstName", author.getFirstName()) .setParameter("secondName", author.getSecondName()) .setParameter("id", author.getId()) .executeUpdate(); + + em.clear(); + return count; } } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java deleted file mode 100644 index cd3f532..0000000 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJdbc.java +++ /dev/null @@ -1,127 +0,0 @@ -package ru.otus.mkulikov.app.dao; - -import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; -import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.app.model.Author; -import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Genre; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 23.05.2019 - * Time: 13:28 - */ - -@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) -@Repository -@RequiredArgsConstructor -public class BookDaoJdbc implements BookDao { - - private final NamedParameterJdbcOperations namedParameterJdbcOperations; - - private final String BOOK_SELECT = - "select b.*, a.surname, a.first_name, a.second_name, g.name " - + "from Book b " - + "inner join Author a on a.id = b.author_id " - + "inner join Genre g on g.id = b.genre_id " - + "where b.id = :id "; - - private final String BOOK_SELECT_ALL = - "select b.*, a.surname, a.first_name, a.second_name, g.name " - + "from Book b " - + "inner join Author a on a.id = b.author_id " - + "inner join Genre g on g.id = b.genre_id " - + "order by b.id "; - - private final String BOOK_UPDATE = - "update Book " - + "set add_record_date = sysdate, caption = :caption, author_id = :author_id, genre_id = :genre_id, comment = :comment " - + "where id = :id "; - - private final String BOOK_INSERT = - "insert into Book (add_record_date, caption, author_id, genre_id, comment) " - + " values (sysdate, :caption, :author_id, :genre_id, :comment)"; - - private final String BOOK_DELETE = "delete from Book where id = :id "; - - @Override - public Book getById(long id) { - Map paramMap = new HashMap(); - paramMap.put("id", id); - - List books = namedParameterJdbcOperations.query(BOOK_SELECT, paramMap, new BookMapper()); - return (books != null) ? books.get(0) : null; - } - - @Override - public List getAllObjects() { - return namedParameterJdbcOperations.query(BOOK_SELECT_ALL, new BookMapper()); - } - - @Override - public int addObject(Book book) { - Map paramMap = new HashMap(); - paramMap.put("caption", book.getCaption()); - paramMap.put("author_id", book.getAuthor().getId()); - paramMap.put("genre_id", book.getGenre().getId()); - paramMap.put("comment", book.getComment()); - - return namedParameterJdbcOperations.update(BOOK_INSERT, paramMap); - } - - @Override - public int deleteObject(long id) { - Map paramMap = new HashMap(); - paramMap.put("id", id); - - return namedParameterJdbcOperations.update(BOOK_DELETE, paramMap); - } - - @Override - public int updateObject(Book book) { - Map paramMap = new HashMap(); - paramMap.put("caption", book.getCaption()); - paramMap.put("author_id", book.getAuthor().getId()); - paramMap.put("genre_id", book.getGenre().getId()); - paramMap.put("comment", book.getComment()); - paramMap.put("id", book.getId()); - - return namedParameterJdbcOperations.update(BOOK_UPDATE, paramMap); - } - - public static class BookMapper implements RowMapper { - - @Override - public Book mapRow(ResultSet resultSet, int i) throws SQLException { - int id = resultSet.getInt("id"); - Date addRecordDate = resultSet.getDate("add_record_date"); - String caption = resultSet.getString("caption"); - String comment = resultSet.getString("comment"); - - Author author = new Author( - resultSet.getLong("author_id"), - resultSet.getString("surname"), - resultSet.getString("first_name"), - resultSet.getString("second_name") - ); - - Genre genre = new Genre( - resultSet.getLong("genre_id"), - resultSet.getString("name") - ); - - return new Book(id, addRecordDate, caption, author, genre, comment); - } - } -} - diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java new file mode 100644 index 0000000..8fe8ca0 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java @@ -0,0 +1,75 @@ +package ru.otus.mkulikov.app.dao; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; +import ru.otus.mkulikov.app.model.Book; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.Date; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 13:28 + */ + +@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) +@Repository +@Transactional +@RequiredArgsConstructor +public class BookDaoJpa implements BookDao { + + @PersistenceContext + private EntityManager em; + + @Override + public Book getById(long id) { + List books = em.createQuery("select b from Book b where b.id = :id ") + .setParameter("id", id) + .getResultList(); + + return (books != null) ? books.get(0) : null; + } + + @Override + public List getAllObjects() { + return em.createQuery("select b from Book b order by b.id ") + .getResultList(); + } + + @Override + public int addObject(Book book) { + em.persist(book); + return 1; + } + + @Override + public int deleteObject(long id) { + return em.createQuery("delete from Book b where b.id = :id ") + .setParameter("id", id) + .executeUpdate(); + } + + @Override + public int updateObject(Book book) { + int count = em.createQuery( + "update Book b " + + "set b.add_record_date = :add_record_date, b.caption = :caption, b.author_id = :author_id, b.genre_id = :genre_id, b.comment = :comment " + + "where b.id = :id ") + .setParameter("add_record_date", new Date()) + .setParameter("caption", book.getCaption()) + .setParameter("author_id", book.getAuthor().getId()) + .setParameter("genre_id", book.getGenre().getId()) + .setParameter("comment", book.getComment()) + .setParameter("id", book.getId()) + .executeUpdate(); + + em.clear(); + return count; + } +} + diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java index e7e52fb..17331a5 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java @@ -57,9 +57,12 @@ public int deleteObject(long id) { @Override public int updateObject(Genre genre) { - return em.createQuery("update Genre g set g.name = :name where g.id = :id ") + int count = em.createQuery("update Genre g set g.name = :name where g.id = :id ") .setParameter("name", genre.getName()) .setParameter("id", genre.getId()) .executeUpdate(); + + em.clear(); + return count; } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index c3bdcb4..4d0da56 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -58,10 +58,10 @@ public String toFormatedString() { @Override public String toString() { return "Author{" + - "id=" + id + - ", surname='" + surname + '\'' + - ", firstName='" + firstName + '\'' + - ", secondName='" + secondName + '\'' + - "}\n"; + "id=" + id + + ", surname='" + surname + '\'' + + ", firstName='" + firstName + '\'' + + ", secondName='" + secondName + '\'' + + "}\n"; } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index ea3c49b..374d3bc 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -72,12 +72,12 @@ public Book(String caption, Author author, Genre genre, String comment) { @Override public String toString() { return "Book{" + - "id=" + id + - ", addRecordDate=" + addRecordDate + - ", caption='" + caption + '\'' + - ", comment='" + comment + '\'' + - ", author=" + author + - ", genre=" + genre + - "}\n"; + "id=" + id + + ", addRecordDate=" + addRecordDate + + ", caption='" + caption + '\'' + + ", comment='" + comment + '\'' + + ", author=" + author + + ", genre=" + genre + + "}\n"; } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index c89efa3..1e6969e 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -47,8 +47,8 @@ public Genre(String name) { @Override public String toString() { return "Genre{" + - "id=" + id + - ", name='" + name + '\'' + - "}\n"; + "id=" + id + + ", name='" + name + '\'' + + "}\n"; } } \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java index 4dab791..5809dc6 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -19,8 +19,6 @@ public interface BookManageSevice { List getBooks(); - List getFullBooks(); - int addBook(String caption, int authorId, int genreId, String comment); int updateBook(long id, String caption, int authorId, int genreId, String comment); diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index f73beca..15c5571 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -41,12 +41,6 @@ public List getBooks() { return bookDao.getAllObjects(); } - @Override - public List getFullBooks() { - return bookDao.getAllObjects(); - } - - @Override public int addBook(String caption, int authorId, int genreId, String comment) { Author author = authorDao.getById(authorId); diff --git a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java index 6fac36a..2ace11e 100644 --- a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java @@ -22,31 +22,31 @@ public class AuthorCommands { private final AuthorManageService authorManageService; - @ShellMethod(key = { "getAuthorById" }, value = "Select author by id.") + @ShellMethod(key = {"getAuthorById"}, value = "Select author by id.") public String getAuthorById(@ShellOption long id) { Author author = authorManageService.getAuthorById(id); return author.toString(); } - @ShellMethod(key = { "getAuthors" }, value = "Select all authors.") + @ShellMethod(key = {"getAuthors"}, value = "Select all authors.") public String getAuthors() { List allObjects = authorManageService.getAuthors(); return allObjects.toString(); } - @ShellMethod(key = { "addAuthor" }, value = "Add new author.") + @ShellMethod(key = {"addAuthor"}, value = "Add new author.") public String addAuthor(@ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { int count = authorManageService.addAuthor(surname, firstName, secondName); return "Add " + count + " row(s)"; } - @ShellMethod(key = { "updateAuthor" }, value = "Update author by id.") + @ShellMethod(key = {"updateAuthor"}, value = "Update author by id.") public String updateAuthor(@ShellOption long id, @ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { int count = authorManageService.updateAuthor(id, surname, firstName, secondName); return "Updated " + count + " row(s)"; } - @ShellMethod(key = { "deleteAuthor" }, value = "Delete author by id.") + @ShellMethod(key = {"deleteAuthor"}, value = "Delete author by id.") public String deleteAuthor(@ShellOption long id) { int count = authorManageService.deleteAuthor(id); return "Deleted " + count + " row(s)"; diff --git a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java index a8a998e..e563400 100644 --- a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java @@ -22,43 +22,37 @@ public class BookCommands { private final BookManageSevice bookManageSevice; - @ShellMethod(key = { "getBookById" }, value = "Select book by id.") + @ShellMethod(key = {"getBookById"}, value = "Select book by id.") public String getBookById(@ShellOption long id) { Book book = bookManageSevice.getBookById(id); return book.toString(); } - @ShellMethod(key = { "getFullBookById" }, value = "Select book by id.") + @ShellMethod(key = {"getFullBookById"}, value = "Select book by id.") public String getFullBookById(@ShellOption long id) { Book book = bookManageSevice.getFullBookById(id); return book.toString(); } - @ShellMethod(key = { "getBooks" }, value = "Select all books.") + @ShellMethod(key = {"getBooks"}, value = "Select all books.") public String getBooks() { List allObjects = bookManageSevice.getBooks(); return allObjects.toString(); } - @ShellMethod(key = { "getFullBooks" }, value = "Select all books.") - public String getFullBooks() { - List allObjects = bookManageSevice.getFullBooks(); - return allObjects.toString(); - } - - @ShellMethod(key = { "addBook" }, value = "Add new book.") + @ShellMethod(key = {"addBook"}, value = "Add new book.") public String addBook(@ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String comment) { int count = bookManageSevice.addBook(caption, authorId, genreId, comment); return "Add " + count + " row(s)"; } - @ShellMethod(key = { "updateBook" }, value = "Update book by id.") + @ShellMethod(key = {"updateBook"}, value = "Update book by id.") public String updateBook(@ShellOption long id, @ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String comment) { int count = bookManageSevice.updateBook(id, caption, authorId, genreId, comment); return "Updated " + count + " row(s)"; } - @ShellMethod(key = { "deleteBook" }, value = "Delete book by id.") + @ShellMethod(key = {"deleteBook"}, value = "Delete book by id.") public String deleteBook(@ShellOption long id) { int count = bookManageSevice.deleteBook(id); return "Deleted " + count + " row(s)"; diff --git a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java index e0959bf..eb2344e 100644 --- a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java @@ -22,31 +22,31 @@ public class GenreCommands { private final GenreManageService genreManageService; - @ShellMethod(key = { "getGenreById" }, value = "Select genre by id.") + @ShellMethod(key = {"getGenreById"}, value = "Select genre by id.") public String getGenreById(@ShellOption long id) { Genre genre = genreManageService.getGenreById(id); return genre.toString(); } - @ShellMethod(key = { "getGenres" }, value = "Select all genres.") + @ShellMethod(key = {"getGenres"}, value = "Select all genres.") public String getGenres() { List allObjects = genreManageService.getGenres(); return allObjects.toString(); } - @ShellMethod(key = { "addGenre" }, value = "Add new genre.") + @ShellMethod(key = {"addGenre"}, value = "Add new genre.") public String addGenre(@ShellOption String name) { int count = genreManageService.addGenre(name); return "Add " + count + " row(s)"; } - @ShellMethod(key = { "updateGenre" }, value = "Update genre by id.") + @ShellMethod(key = {"updateGenre"}, value = "Update genre by id.") public String updateGenre(@ShellOption long id, @ShellOption String name) { int count = genreManageService.updateGenre(id, name); return "Updated " + count + " row(s)"; } - @ShellMethod(key = { "deleteGenre" }, value = "Delete genre by id.") + @ShellMethod(key = {"deleteGenre"}, value = "Delete genre by id.") public String deleteGenre(@ShellOption long id) { int count = genreManageService.deleteGenre(id); return "Deleted " + count + " row(s)"; diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java similarity index 88% rename from src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java rename to src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 5971ffe..71e26d0 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -6,16 +6,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; +import javax.persistence.PersistenceException; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. @@ -28,7 +25,7 @@ @RunWith(SpringRunner.class) @Import(AuthorDaoJpa.class) @DataJpaTest -class AuthorDaoJdbcTest { +class AuthorDaoJpaTest { @Autowired private AuthorDao authorDaoJpa; @@ -80,7 +77,7 @@ void addObject() { @Test void deleteObject() { - assertThrows(DataIntegrityViolationException.class, () -> { authorDaoJpa.deleteObject(1L); }); + assertThrows(PersistenceException.class, () -> { authorDaoJpa.deleteObject(1L); }); } @Test diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java similarity index 80% rename from src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java rename to src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 908c10a..c4fb107 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -15,10 +15,7 @@ import java.util.Date; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. @@ -30,15 +27,15 @@ @DisplayName("Класс BookDaoJdbc") @RunWith(SpringRunner.class) @JdbcTest -@Import(BookDaoJdbc.class) -class BookDaoJdbcTest { +@Import(BookDaoJpa.class) +class BookDaoJpaTest { @Autowired - private BookDao bookDaoJdbc; + private BookDao bookDaoJpa; @Test void getById() { - Book book = bookDaoJdbc.getById(1L); + Book book = bookDaoJpa.getById(1L); assertAll( "book", @@ -54,7 +51,7 @@ void getById() { @Test void getAllObjects() { - List books = bookDaoJdbc.getAllObjects(); + List books = bookDaoJpa.getAllObjects(); assertAll( "books", @@ -68,8 +65,8 @@ void getAllObjects() { @Test void addObject() { - int count = bookDaoJdbc.addObject(getNewBook()); - Book book = bookDaoJdbc.getById(4L); + int count = bookDaoJpa.addObject(getNewBook()); + Book book = bookDaoJpa.getById(4L); assertAll( "book", @@ -85,20 +82,20 @@ void addObject() { @Test void deleteObject() { - int count = bookDaoJdbc.deleteObject(1L); + int count = bookDaoJpa.deleteObject(1L); assertAll( "book", () -> assertEquals(1, count), - () -> assertThrows(IndexOutOfBoundsException.class, () -> { bookDaoJdbc.getById(1L); }) + () -> assertThrows(IndexOutOfBoundsException.class, () -> { bookDaoJpa.getById(1L); }) ); } @Test void updateObject() { - Book book1 = bookDaoJdbc.getById(1L); - int count = bookDaoJdbc.updateObject(getNewBook()); - Book book2 = bookDaoJdbc.getById(1L); + Book book1 = bookDaoJpa.getById(1L); + int count = bookDaoJpa.updateObject(getNewBook()); + Book book2 = bookDaoJpa.getById(1L); assertAll( "book", diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java similarity index 90% rename from src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java rename to src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index c73c2e1..f14731a 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJdbcTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -12,10 +12,7 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. @@ -28,7 +25,7 @@ @RunWith(SpringRunner.class) @JdbcTest @Import(GenreDaoJpa.class) -class GenreDaoJdbcTest { +class GenreDaoJpaTest { @Autowired private GenreDao genreDaoJpa; diff --git a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java index 293ef8c..f70da33 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/BookTest.java @@ -10,9 +10,7 @@ import java.text.SimpleDateFormat; import java.util.Date; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 93ca519..c0c8743 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -12,10 +12,7 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index e7db9bc..54ca4e6 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -12,10 +12,7 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 57a833b..e938751 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -12,10 +12,7 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. From 88398c9d3d48c58103c033fac82ff6f99e5fb411 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 14 Jun 2019 18:01:48 +0300 Subject: [PATCH 21/70] =?UTF-8?q?=D0=9D=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B9=D0=BA=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20jpa.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/app/dao/BookDaoJpa.java | 11 +++++++---- src/main/java/ru/otus/mkulikov/app/model/Book.java | 9 +++++++-- src/main/resources/application.yml | 2 +- .../ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java | 4 +++- .../java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java | 8 +++++--- .../ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java | 10 +++++++--- .../app/service/AuthorManageSeviceImplTest.java | 8 ++++++-- .../app/service/BookManageSeviceImplTest.java | 5 ++++- .../app/service/GenreManageSeviceImplTest.java | 8 ++++++-- src/test/resources/test_application.yml | 9 +++++++++ 10 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 src/test/resources/test_application.yml diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java index 8fe8ca0..5d8aaeb 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java @@ -37,13 +37,16 @@ public Book getById(long id) { @Override public List getAllObjects() { - return em.createQuery("select b from Book b order by b.id ") + List books = em.createQuery("select b from Book b order by b.id ") .getResultList(); + + return books; } @Override public int addObject(Book book) { em.persist(book); + em.clear(); return 1; } @@ -56,10 +59,10 @@ public int deleteObject(long id) { @Override public int updateObject(Book book) { - int count = em.createQuery( + int count = em.createNativeQuery( "update Book b " - + "set b.add_record_date = :add_record_date, b.caption = :caption, b.author_id = :author_id, b.genre_id = :genre_id, b.comment = :comment " - + "where b.id = :id ") + + "set b.add_record_date = :add_record_date, b.caption = :caption, b.author_id = :author_id, b.genre_id = :genre_id, b.comment = :comment " + + "where b.id = :id ") .setParameter("add_record_date", new Date()) .setParameter("caption", book.getCaption()) .setParameter("author_id", book.getAuthor().getId()) diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 374d3bc..c7bc001 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -2,11 +2,16 @@ import lombok.Data; +import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @@ -36,10 +41,10 @@ public class Book { @Column(name = "COMMENT") private String comment; - @OneToOne + @ManyToOne private Author author; - @OneToOne + @ManyToOne private Genre genre; public Book() { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1534e00..2a393df 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: banner: - location: "classpath:banner.txt" + location: jpa: hibernate: diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 71e26d0..3ae2a15 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; @@ -21,10 +22,11 @@ * Time: 10:12 */ -@DisplayName("Класс AuthorDaoJdbc") +@DisplayName("Класс AuthorDaoJpa") @RunWith(SpringRunner.class) @Import(AuthorDaoJpa.class) @DataJpaTest +@TestPropertySource(locations= "classpath:test_application.yml") class AuthorDaoJpaTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index c4fb107..bcba7fd 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -4,8 +4,9 @@ import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; @@ -24,10 +25,11 @@ * Time: 13:16 */ -@DisplayName("Класс BookDaoJdbc") +@DisplayName("Класс BookDaoJpa") @RunWith(SpringRunner.class) -@JdbcTest @Import(BookDaoJpa.class) +@DataJpaTest +@TestPropertySource(locations= "classpath:test_application.yml") class BookDaoJpaTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index f14731a..cc48de5 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -5,11 +5,14 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; +import javax.persistence.PersistenceException; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -21,10 +24,11 @@ * Time: 9:45 */ -@DisplayName("Класс GenreDaoJdbc") +@DisplayName("Класс GenreDaoJpa") @RunWith(SpringRunner.class) -@JdbcTest @Import(GenreDaoJpa.class) +@DataJpaTest +@TestPropertySource(locations= "classpath:test_application.yml") class GenreDaoJpaTest { @Autowired @@ -73,7 +77,7 @@ void addObject() { @Test void deleteObject() { - assertThrows(DataIntegrityViolationException.class, () -> { genreDaoJpa.deleteObject(1L); }); + assertThrows(PersistenceException.class, () -> { genreDaoJpa.deleteObject(1L); }); } @Test diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index c0c8743..bea7318 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -5,11 +5,14 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; +import javax.persistence.PersistenceException; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -23,8 +26,9 @@ @DisplayName("Класс AuthorManageSevice") @RunWith(SpringRunner.class) -@JdbcTest @ComponentScan("ru.otus.mkulikov.app") +@DataJpaTest +@TestPropertySource(locations= "classpath:test_application.yml") class AuthorManageSeviceImplTest { @Autowired @@ -94,6 +98,6 @@ void updateAuthor() { @Test void deleteAuthor() { - assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(1L); }); + assertThrows(PersistenceException.class, () -> { authorManageService.deleteAuthor(1L); }); } } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 54ca4e6..241781e 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -5,7 +5,9 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.utils.DateUtil; @@ -23,8 +25,9 @@ @DisplayName("Класс BookManageSevice") @RunWith(SpringRunner.class) -@JdbcTest @ComponentScan("ru.otus.mkulikov.app") +@DataJpaTest +@TestPropertySource(locations= "classpath:test_application.yml") class BookManageSeviceImplTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index e938751..8aa5fa9 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -5,11 +5,14 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; +import javax.persistence.PersistenceException; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -23,8 +26,9 @@ @DisplayName("Класс GenreManageSevice") @RunWith(SpringRunner.class) -@JdbcTest @ComponentScan("ru.otus.mkulikov.app") +@DataJpaTest +@TestPropertySource(locations= "classpath:test_application.yml") class GenreManageSeviceImplTest { @Autowired @@ -86,6 +90,6 @@ void updateGenre() { @Test void deleteGenre() { - assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(1L); }); + assertThrows(PersistenceException.class, () -> { genreManageService.deleteGenre(1L); }); } } diff --git a/src/test/resources/test_application.yml b/src/test/resources/test_application.yml new file mode 100644 index 0000000..2a393df --- /dev/null +++ b/src/test/resources/test_application.yml @@ -0,0 +1,9 @@ +spring: + banner: + location: + + jpa: + hibernate: + ddl-auto: none + + From 64470370c5642f8624c4a3a541182008a5d7c132 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 17 Jun 2019 16:36:12 +0300 Subject: [PATCH 22/70] =?UTF-8?q?-=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20dao.=20-=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/otus/mkulikov/app/dao/BookDaoJpa.java | 1 - .../ru/otus/mkulikov/app/model/Author.java | 1 + .../java/ru/otus/mkulikov/app/model/Book.java | 18 +++++++++++++++-- .../ru/otus/mkulikov/app/model/Genre.java | 2 +- src/main/resources/application.yml | 7 +++++-- src/main/resources/schema.sql | 2 +- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 20 ++++++++++++++----- src/test/resources/test_application.yml | 7 +++++-- 8 files changed, 44 insertions(+), 14 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java index 5d8aaeb..76b1fa9 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java @@ -46,7 +46,6 @@ public List getAllObjects() { @Override public int addObject(Book book) { em.persist(book); - em.clear(); return 1; } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index 4d0da56..e5fc804 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -7,6 +7,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index c7bc001..332863e 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -11,6 +11,7 @@ import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; +import javax.persistence.MapsId; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; @@ -41,10 +42,17 @@ public class Book { @Column(name = "COMMENT") private String comment; - @ManyToOne + @Column(name = "AUTHOR_ID", updatable = false, insertable = false) + private long author_id; + @Column(name = "GENRE_ID", updatable = false, insertable = false) + private long genre_id; + + @OneToOne(optional=false) + //@JoinColumn(name="ID", referencedColumnName="AUTHOR_ID") private Author author; - @ManyToOne + @OneToOne(optional=false) + //@JoinColumn(name="ID", referencedColumnName="GENRE_ID") private Genre genre; public Book() { @@ -57,6 +65,8 @@ public Book(long id, Date addRecordDate, String caption, Author author, Genre ge this.genre = genre; this.caption = caption; this.comment = comment; + this.author_id = author.getId(); + this.genre_id = genre.getId(); } public Book(long id, String caption, Author author, Genre genre, String comment) { @@ -65,6 +75,8 @@ public Book(long id, String caption, Author author, Genre genre, String comment) this.author = author; this.genre = genre; this.comment = comment; + this.author_id = author.getId(); + this.genre_id = genre.getId(); } public Book(String caption, Author author, Genre genre, String comment) { @@ -72,6 +84,8 @@ public Book(String caption, Author author, Genre genre, String comment) { this.author = author; this.genre = genre; this.comment = comment; + this.author_id = author.getId(); + this.genre_id = genre.getId(); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 1e6969e..a8153b9 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -7,6 +7,7 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; @@ -27,7 +28,6 @@ public class Genre { @SequenceGenerator(name = "sq_genre", sequenceName = "sq_genre", allocationSize = 1) @Column(name = "ID") private long id; - @Column(name = "NAME") private String name; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 2a393df..515ee34 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,9 +1,12 @@ spring: banner: - location: + location: "classpath:banner.txt" jpa: hibernate: ddl-auto: none - + properties: + hibernate: + show_sql: false + format_sql: false \ No newline at end of file diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 538c6ab..8f77a94 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -16,7 +16,7 @@ CREATE TABLE GENRE( CREATE TABLE BOOK( ID NUMBER(22,0) PRIMARY KEY not null, - ADD_RECORD_DATE DATE, + ADD_RECORD_DATE DATE default sysdate, CAPTION VARCHAR(255) not null, AUTHOR_ID NUMBER(22,0) not null, GENRE_ID NUMBER(22,0) not null, diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index bcba7fd..75d5fad 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -27,13 +27,17 @@ @DisplayName("Класс BookDaoJpa") @RunWith(SpringRunner.class) -@Import(BookDaoJpa.class) +@Import({BookDaoJpa.class, AuthorDaoJpa.class, GenreDaoJpa.class}) @DataJpaTest @TestPropertySource(locations= "classpath:test_application.yml") class BookDaoJpaTest { @Autowired private BookDao bookDaoJpa; + @Autowired + private AuthorDao authorDao; + @Autowired + private GenreDao genreDao; @Test void getById() { @@ -96,7 +100,7 @@ void deleteObject() { @Test void updateObject() { Book book1 = bookDaoJpa.getById(1L); - int count = bookDaoJpa.updateObject(getNewBook()); + int count = bookDaoJpa.updateObject(getUpdatedBook()); Book book2 = bookDaoJpa.getById(1L); assertAll( @@ -110,8 +114,14 @@ void updateObject() { } private Book getNewBook() { - Author author = new Author(1L, "TestSurname", "TestFirstName", "TestSecondName"); - Genre genre = new Genre(1L, "Test4"); - return new Book(1L, new Date(), "Test_Book", author, genre, "Test_Comment"); + Author author = authorDao.getById(1); + Genre genre = genreDao.getById(1); + return new Book("Test_Book", author, genre, "Test_Comment"); + } + + private Book getUpdatedBook() { + Author author = authorDao.getById(1); + Genre genre = genreDao.getById(1); + return new Book(1L,"Test_Book", author, genre, "Test_Comment"); } } \ No newline at end of file diff --git a/src/test/resources/test_application.yml b/src/test/resources/test_application.yml index 2a393df..515ee34 100644 --- a/src/test/resources/test_application.yml +++ b/src/test/resources/test_application.yml @@ -1,9 +1,12 @@ spring: banner: - location: + location: "classpath:banner.txt" jpa: hibernate: ddl-auto: none - + properties: + hibernate: + show_sql: false + format_sql: false \ No newline at end of file From f8ca9452d0480a13e9b244bc7b56652be74b7e9b Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 17 Jun 2019 18:01:53 +0300 Subject: [PATCH 23/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B1=D0=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 6 +++- src/main/resources/{data.sql => data-h2.sql} | 0 .../resources/{schema.sql => schema-h2.sql} | 0 .../mkulikov/app/dao/AuthorDaoJpaTest.java | 16 +++++----- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 3 +- .../mkulikov/app/dao/GenreDaoJpaTest.java | 4 +-- .../service/AuthorManageSeviceImplTest.java | 18 +++++------ .../app/service/BookManageSeviceImplTest.java | 3 +- .../service/GenreManageSeviceImplTest.java | 4 +-- .../{test_application.yml => application.yml} | 7 ++++- src/test/resources/data-test.sql | 27 ++++++++++++++++ src/test/resources/schema-test.sql | 31 +++++++++++++++++++ 12 files changed, 89 insertions(+), 30 deletions(-) rename src/main/resources/{data.sql => data-h2.sql} (100%) rename src/main/resources/{schema.sql => schema-h2.sql} (100%) rename src/test/resources/{test_application.yml => application.yml} (62%) create mode 100644 src/test/resources/data-test.sql create mode 100644 src/test/resources/schema-test.sql diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 515ee34..91ca387 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,10 @@ spring: banner: location: "classpath:banner.txt" + datasource: + initialization-mode: always + platform: h2 + jpa: hibernate: ddl-auto: none @@ -9,4 +13,4 @@ spring: properties: hibernate: show_sql: false - format_sql: false \ No newline at end of file + format_sql: false diff --git a/src/main/resources/data.sql b/src/main/resources/data-h2.sql similarity index 100% rename from src/main/resources/data.sql rename to src/main/resources/data-h2.sql diff --git a/src/main/resources/schema.sql b/src/main/resources/schema-h2.sql similarity index 100% rename from src/main/resources/schema.sql rename to src/main/resources/schema-h2.sql diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 3ae2a15..040c5ec 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -26,7 +26,7 @@ @RunWith(SpringRunner.class) @Import(AuthorDaoJpa.class) @DataJpaTest -@TestPropertySource(locations= "classpath:test_application.yml") +@TestPropertySource(locations= "classpath:application.yml") class AuthorDaoJpaTest { @Autowired @@ -40,9 +40,9 @@ void getById() { "author", () -> assertNotNull(author), () -> assertEquals(1L, author.getId()), - () -> assertEquals("Surname1", author.getSurname()), - () -> assertEquals("FirstName1", author.getFirstName()), - () -> assertEquals("SecondName1", author.getSecondName()) + () -> assertEquals("Surname", author.getSurname()), + () -> assertEquals("FirstName", author.getFirstName()), + () -> assertEquals("SecondName", author.getSecondName()) ); } @@ -54,7 +54,7 @@ void getAllObjects() { "authors", () -> assertNotNull(authors), () -> assertEquals(3, authors.size()), - () -> assertEquals("Surname1", authors.get(0).getSurname()), + () -> assertEquals("Surname", authors.get(0).getSurname()), () -> assertEquals("Surname2", authors.get(1).getSurname()), () -> assertEquals("Surname3", authors.get(2).getSurname()) ); @@ -93,9 +93,9 @@ void updateObject() { assertAll( "author", () -> assertEquals(1, count), - () -> assertEquals("Surname1", author1.getSurname()), - () -> assertEquals("FirstName1", author1.getFirstName()), - () -> assertEquals("SecondName1", author1.getSecondName()), + () -> assertEquals("Surname", author1.getSurname()), + () -> assertEquals("FirstName", author1.getFirstName()), + () -> assertEquals("SecondName", author1.getSecondName()), () -> assertEquals("TestSurname", author2.getSurname()), () -> assertEquals("TestFirstName", author2.getFirstName()), () -> assertEquals("TestSecondName", author2.getSecondName()) diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 75d5fad..4a79cb1 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -13,7 +13,6 @@ import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.utils.DateUtil; -import java.util.Date; import java.util.List; import static org.junit.jupiter.api.Assertions.*; @@ -29,7 +28,7 @@ @RunWith(SpringRunner.class) @Import({BookDaoJpa.class, AuthorDaoJpa.class, GenreDaoJpa.class}) @DataJpaTest -@TestPropertySource(locations= "classpath:test_application.yml") +@TestPropertySource(locations= "classpath:application.yml") class BookDaoJpaTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index cc48de5..cc939a4 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -4,10 +4,8 @@ import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; @@ -28,7 +26,7 @@ @RunWith(SpringRunner.class) @Import(GenreDaoJpa.class) @DataJpaTest -@TestPropertySource(locations= "classpath:test_application.yml") +@TestPropertySource(locations= "classpath:application.yml") class GenreDaoJpaTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index bea7318..ff34ac1 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -4,10 +4,8 @@ import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; @@ -28,7 +26,7 @@ @RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") @DataJpaTest -@TestPropertySource(locations= "classpath:test_application.yml") +@TestPropertySource(locations= "classpath:application.yml") class AuthorManageSeviceImplTest { @Autowired @@ -42,9 +40,9 @@ void getAuthorById() { "author", () -> assertNotNull(author), () -> assertEquals(1L, author.getId()), - () -> assertEquals("Surname1", author.getSurname()), - () -> assertEquals("FirstName1", author.getFirstName()), - () -> assertEquals("SecondName1", author.getSecondName()) + () -> assertEquals("Surname", author.getSurname()), + () -> assertEquals("FirstName", author.getFirstName()), + () -> assertEquals("SecondName", author.getSecondName()) ); } @@ -56,7 +54,7 @@ void getAuthors() { "authors", () -> assertNotNull(authors), () -> assertEquals(3, authors.size()), - () -> assertEquals("Surname1", authors.get(0).getSurname()), + () -> assertEquals("Surname", authors.get(0).getSurname()), () -> assertEquals("Surname2", authors.get(1).getSurname()), () -> assertEquals("Surname3", authors.get(2).getSurname()) ); @@ -87,9 +85,9 @@ void updateAuthor() { assertAll( "author", () -> assertEquals(1, count), - () -> assertEquals("Surname1", author1.getSurname()), - () -> assertEquals("FirstName1", author1.getFirstName()), - () -> assertEquals("SecondName1", author1.getSecondName()), + () -> assertEquals("Surname", author1.getSurname()), + () -> assertEquals("FirstName", author1.getFirstName()), + () -> assertEquals("SecondName", author1.getSecondName()), () -> assertEquals("TestSurname", author2.getSurname()), () -> assertEquals("TestFirstName", author2.getFirstName()), () -> assertEquals("TestSecondName", author2.getSecondName()) diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 241781e..2198576 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -4,7 +4,6 @@ import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.TestPropertySource; @@ -27,7 +26,7 @@ @RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") @DataJpaTest -@TestPropertySource(locations= "classpath:test_application.yml") +@TestPropertySource(locations= "classpath:application.yml") class BookManageSeviceImplTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 8aa5fa9..784d44c 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -4,10 +4,8 @@ import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; @@ -28,7 +26,7 @@ @RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") @DataJpaTest -@TestPropertySource(locations= "classpath:test_application.yml") +@TestPropertySource(locations= "classpath:application.yml") class GenreManageSeviceImplTest { @Autowired diff --git a/src/test/resources/test_application.yml b/src/test/resources/application.yml similarity index 62% rename from src/test/resources/test_application.yml rename to src/test/resources/application.yml index 515ee34..c679d5b 100644 --- a/src/test/resources/test_application.yml +++ b/src/test/resources/application.yml @@ -2,6 +2,10 @@ spring: banner: location: "classpath:banner.txt" + datasource: + initialization-mode: always + platform: test + jpa: hibernate: ddl-auto: none @@ -9,4 +13,5 @@ spring: properties: hibernate: show_sql: false - format_sql: false \ No newline at end of file + format_sql: false + diff --git a/src/test/resources/data-test.sql b/src/test/resources/data-test.sql new file mode 100644 index 0000000..e1ff332 --- /dev/null +++ b/src/test/resources/data-test.sql @@ -0,0 +1,27 @@ +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (sq_author.nextval, 'Surname', 'FirstName', 'SecondName'); + +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (sq_author.nextval, 'Surname2', 'FirstName2', 'SecondName2'); + +insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) +values (sq_author.nextval, 'Surname3', 'FirstName3', 'SecondName3'); + +-------------------------- + +insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre1'); +insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre2'); +insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre3'); + +-------------------------- + +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'comment'); + +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'comment'); + +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'comment'); + +-------------------------- diff --git a/src/test/resources/schema-test.sql b/src/test/resources/schema-test.sql new file mode 100644 index 0000000..8f77a94 --- /dev/null +++ b/src/test/resources/schema-test.sql @@ -0,0 +1,31 @@ +DROP TABLE IF EXISTS BOOK; +DROP TABLE IF EXISTS AUTHOR; +DROP TABLE IF EXISTS GENRE; + +CREATE TABLE AUTHOR( + ID NUMBER(22,0) PRIMARY KEY not null, + SURNAME VARCHAR(100) not null, + FIRST_NAME VARCHAR(100) not null, + SECOND_NAME VARCHAR(100) +); + +CREATE TABLE GENRE( + ID NUMBER(22,0) PRIMARY KEY not null, + NAME VARCHAR(100) not null +); + +CREATE TABLE BOOK( + ID NUMBER(22,0) PRIMARY KEY not null, + ADD_RECORD_DATE DATE default sysdate, + CAPTION VARCHAR(255) not null, + AUTHOR_ID NUMBER(22,0) not null, + GENRE_ID NUMBER(22,0) not null, + COMMENT VARCHAR(255), + + foreign key (AUTHOR_ID) references AUTHOR(ID), + foreign key (GENRE_ID) references GENRE(ID) +); + +CREATE SEQUENCE sq_author minvalue 1 start with 1 increment by 1; +CREATE SEQUENCE sq_genre minvalue 1 start with 1 increment by 1; +CREATE SEQUENCE sq_book minvalue 1 start with 1 increment by 1; From e2f98fd6b89ea7120e78bf7035dc8a6d12a1240f Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 17 Jun 2019 18:13:48 +0300 Subject: [PATCH 24/70] =?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/test/resources/application.yml | 2 +- src/test/resources/banner-test.txt | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/banner-test.txt diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index c679d5b..e2c030c 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -1,6 +1,6 @@ spring: banner: - location: "classpath:banner.txt" + location: "classpath:banner-test.txt" datasource: initialization-mode: always diff --git a/src/test/resources/banner-test.txt b/src/test/resources/banner-test.txt new file mode 100644 index 0000000..50a692c --- /dev/null +++ b/src/test/resources/banner-test.txt @@ -0,0 +1,11 @@ + ___ ___ ___ ___ ___ ___ ___ + /\__\ /\ \ /\__\ /\ \ /\ \ ___ / /\ / /\ ___ + /:/ / /::\ \ /:/ / /::\ \ /::\ \ /__/\ / /::\ / /::\ /__/\ + /:/ / /:/\:\ \ /:/ / /:/\:\ \ /:/\ \ \ \ \:\ / /:/\:\ /__/:/\:\ \ \:\ + /:/ / ___ /:/ \:\ \ /:/ / /::\~\:\ \ _\:\~\ \ \ \__\:\ / /::\ \:\ _\_ \:\ \:\ \__\:\ + /:/__/ /\__\ /:/__/ \:\__\ /:/__/ /:/\:\ \:\__\ /\ \:\ \ \__\ *** / /::\ /__/:/\:\ \:\ /__/\ \:\ \:\ / /::\ + \:\ \ /:/ / \:\ \ /:/ / \:\ \ \:\~\:\ \/__/ \:\ \:\ \/__/ / /:/\:\ \ \:\ \:\_\/ \ \:\ \:\_\/ / /:/\:\ + \:\ /:/ / \:\ /:/ / \:\ \ \:\ \:\__\ \:\ \:\__\ / /:/__\/ \ \:\ \:\ \ \:\_\:\ / /:/__\/ + \:\/:/ / \:\/:/ / \:\ \ \:\ \/__/ \:\/:/ / /__/:/ \ \:\_\/ \ \:\/:/ /__/:/ + \::/ / \::/ / \:\__\ \:\__\ \::/ / \__\/ \ \:\ \ \::/ \__\/ + \/__/ \/__/ \/__/ \/__/ \/__/ \__\/ \__\/ From 31e0dfa3c6931ee9b0d524d69cab7a7797655758 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 18 Jun 2019 09:41:50 +0300 Subject: [PATCH 25/70] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20readme.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index aff31e5..07ed4c8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # OtusSpringHW-Library -Домашнее задание #6: -- Переписать приложение для хранения книг на ORM. -- Использовать JPA, Hibernate только в качестве JPA-провайдера. -- Добавить комментарии к книгам, и высокоуровневые сервисы, оставляющие комментарии к книгам. -- Покрыть DAO тестами используя H2 базу данных и соответствующий H2 Hibernate-диалект. +Домашнее задание #7: +- Переделать билиотеку на Spring Data JPA. +- Реализовать весь функционал работы с БД в приложении книг с использованием spring-data-jpa репозиториев. \ No newline at end of file From 033c5da5afb53d3f3f236beb7786e3c277058208 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 19 Jun 2019 00:45:15 +0300 Subject: [PATCH 26/70] =?UTF-8?q?-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=82=D1=8D=D1=81=D1=82=D0=BE=D0=B2.=20-=20=D0=A1?= =?UTF-8?q?=D0=B2=D1=8F=D0=B7=D0=B8=20OneToOne=20=D0=B8=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=20ManyToOne.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++ .../otus/mkulikov/app/dao/AuthorDaoJpa.java | 1 - .../ru/otus/mkulikov/app/model/Author.java | 13 +------- .../java/ru/otus/mkulikov/app/model/Book.java | 33 +++---------------- .../ru/otus/mkulikov/app/model/Genre.java | 9 +---- .../app/service/BookManageSevice.java | 2 -- .../app/service/BookManageSeviceImpl.java | 5 --- .../ru/otus/mkulikov/shell/BookCommands.java | 6 ---- .../mkulikov/app/dao/AuthorDaoJpaTest.java | 5 +++ .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 5 +++ .../mkulikov/app/dao/GenreDaoJpaTest.java | 5 +++ .../{BookTest.java => DateUtilTest.java} | 6 ++-- .../service/AuthorManageSeviceImplTest.java | 5 +++ .../app/service/BookManageSeviceImplTest.java | 23 +++---------- .../service/GenreManageSeviceImplTest.java | 5 +++ 15 files changed, 43 insertions(+), 84 deletions(-) rename src/test/java/ru/otus/mkulikov/app/model/{BookTest.java => DateUtilTest.java} (91%) diff --git a/README.md b/README.md index aff31e5..40b2856 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,7 @@ - Использовать JPA, Hibernate только в качестве JPA-провайдера. - Добавить комментарии к книгам, и высокоуровневые сервисы, оставляющие комментарии к книгам. - Покрыть DAO тестами используя H2 базу данных и соответствующий H2 Hibernate-диалект. + +### 19-09-19 Доработки: +- Добавлены названия тэстов. +- Связи OneToOne изменены на ManyToOne. diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java index cfb17ba..640852d 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java @@ -7,7 +7,6 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; - import java.util.List; /** diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index e5fc804..edca570 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -2,14 +2,7 @@ import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import javax.persistence.*; /** * Created by IntelliJ IDEA. @@ -52,10 +45,6 @@ public Author(String surname, String firstName, String secondName) { this.secondName = secondName; } - public String toFormatedString() { - return getSurname() + " " + getFirstName() + " " + getSecondName(); - } - @Override public String toString() { return "Author{" + diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 332863e..1b7f81b 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -2,20 +2,7 @@ import lombok.Data; -import javax.persistence.CascadeType; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.MapsId; -import javax.persistence.OneToMany; -import javax.persistence.OneToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import javax.persistence.*; import java.util.Date; /** @@ -42,17 +29,10 @@ public class Book { @Column(name = "COMMENT") private String comment; - @Column(name = "AUTHOR_ID", updatable = false, insertable = false) - private long author_id; - @Column(name = "GENRE_ID", updatable = false, insertable = false) - private long genre_id; - - @OneToOne(optional=false) - //@JoinColumn(name="ID", referencedColumnName="AUTHOR_ID") + @ManyToOne(optional=false) private Author author; - @OneToOne(optional=false) - //@JoinColumn(name="ID", referencedColumnName="GENRE_ID") + @ManyToOne(optional=false) private Genre genre; public Book() { @@ -65,8 +45,6 @@ public Book(long id, Date addRecordDate, String caption, Author author, Genre ge this.genre = genre; this.caption = caption; this.comment = comment; - this.author_id = author.getId(); - this.genre_id = genre.getId(); } public Book(long id, String caption, Author author, Genre genre, String comment) { @@ -75,17 +53,14 @@ public Book(long id, String caption, Author author, Genre genre, String comment) this.author = author; this.genre = genre; this.comment = comment; - this.author_id = author.getId(); - this.genre_id = genre.getId(); } public Book(String caption, Author author, Genre genre, String comment) { + this.id = 0L; this.caption = caption; this.author = author; this.genre = genre; this.comment = comment; - this.author_id = author.getId(); - this.genre_id = genre.getId(); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index a8153b9..dc37847 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -2,14 +2,7 @@ import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import javax.persistence.*; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java index 5809dc6..535b2dd 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -15,8 +15,6 @@ public interface BookManageSevice { T getBookById(long id); - T getFullBookById(long id); - List getBooks(); int addBook(String caption, int authorId, int genreId, String comment); diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 15c5571..1caf2b0 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -31,11 +31,6 @@ public Book getBookById(long id) { return bookDao.getById(id); } - @Override - public Book getFullBookById(long id) { - return bookDao.getById(id); - } - @Override public List getBooks() { return bookDao.getAllObjects(); diff --git a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java index e563400..163788d 100644 --- a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java @@ -28,12 +28,6 @@ public String getBookById(@ShellOption long id) { return book.toString(); } - @ShellMethod(key = {"getFullBookById"}, value = "Select book by id.") - public String getFullBookById(@ShellOption long id) { - Book book = bookManageSevice.getFullBookById(id); - return book.toString(); - } - @ShellMethod(key = {"getBooks"}, value = "Select all books.") public String getBooks() { List allObjects = bookManageSevice.getBooks(); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 040c5ec..96ebe9d 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -33,6 +33,7 @@ class AuthorDaoJpaTest { private AuthorDao authorDaoJpa; @Test + @DisplayName("Получение автора по id") void getById() { Author author = authorDaoJpa.getById(1L); @@ -47,6 +48,7 @@ void getById() { } @Test + @DisplayName("Получение всех авторов") void getAllObjects() { List authors = authorDaoJpa.getAllObjects(); @@ -61,6 +63,7 @@ void getAllObjects() { } @Test + @DisplayName("Добавление автора") void addObject() { Author author = new Author("TestSurname", "TestFirstName", "TestSecondName"); int count = authorDaoJpa.addObject(author); @@ -78,11 +81,13 @@ void addObject() { } @Test + @DisplayName("Удаление автора, который используется в таблице книг") void deleteObject() { assertThrows(PersistenceException.class, () -> { authorDaoJpa.deleteObject(1L); }); } @Test + @DisplayName("Обновление автора") void updateObject() { Author author1 = authorDaoJpa.getById(1L); int count = authorDaoJpa.updateObject( diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 4a79cb1..6958758 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -39,6 +39,7 @@ class BookDaoJpaTest { private GenreDao genreDao; @Test + @DisplayName("Получение книги по id") void getById() { Book book = bookDaoJpa.getById(1L); @@ -55,6 +56,7 @@ void getById() { } @Test + @DisplayName("Получение всех книг") void getAllObjects() { List books = bookDaoJpa.getAllObjects(); @@ -69,6 +71,7 @@ void getAllObjects() { } @Test + @DisplayName("Добавление книги") void addObject() { int count = bookDaoJpa.addObject(getNewBook()); Book book = bookDaoJpa.getById(4L); @@ -86,6 +89,7 @@ void addObject() { } @Test + @DisplayName("Удаление книги по id") void deleteObject() { int count = bookDaoJpa.deleteObject(1L); @@ -97,6 +101,7 @@ void deleteObject() { } @Test + @DisplayName("Обновление книги") void updateObject() { Book book1 = bookDaoJpa.getById(1L); int count = bookDaoJpa.updateObject(getUpdatedBook()); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index cc939a4..ab25d87 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -33,6 +33,7 @@ class GenreDaoJpaTest { private GenreDao genreDaoJpa; @Test + @DisplayName("Получение жанра по id") void getById() { Genre genre = genreDaoJpa.getById(1L); @@ -45,6 +46,7 @@ void getById() { } @Test + @DisplayName("Получение всех жанров") void getAllObjects() { List genres = genreDaoJpa.getAllObjects(); @@ -59,6 +61,7 @@ void getAllObjects() { } @Test + @DisplayName("Добавление жанра") void addObject() { int count = genreDaoJpa.addObject(new Genre("Test4")); @@ -74,11 +77,13 @@ void addObject() { } @Test + @DisplayName("Удаление жанра, который используется в таблице книг") void deleteObject() { assertThrows(PersistenceException.class, () -> { genreDaoJpa.deleteObject(1L); }); } @Test + @DisplayName("Обновление жанра") void updateObject() { Genre genre1 = genreDaoJpa.getById(1L); int count = genreDaoJpa.updateObject(new Genre(1L, "UpdatedName")); diff --git a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java similarity index 91% rename from src/test/java/ru/otus/mkulikov/app/model/BookTest.java rename to src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java index f70da33..291acd0 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/BookTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java @@ -19,12 +19,12 @@ * Time: 11:39 */ -@DisplayName("Класс Book") +@DisplayName("Класс DateUtil") @RunWith(SpringRunner.class) -//@SpringBootTest(classes = AppTestConfig.class) -class BookTest { +class DateUtilTest { @Test + @DisplayName("Формат даты 'yyyy-MM-dd'") void getAddRecordDateString() { Book book = getNewBook(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index ff34ac1..2203f8c 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -33,6 +33,7 @@ class AuthorManageSeviceImplTest { private AuthorManageService authorManageService; @Test + @DisplayName("Получение автора по id") void getAuthorById() { Author author = authorManageService.getAuthorById(1L); @@ -47,6 +48,7 @@ void getAuthorById() { } @Test + @DisplayName("Получение всех авторов") void getAuthors() { List authors = authorManageService.getAuthors(); @@ -61,6 +63,7 @@ void getAuthors() { } @Test + @DisplayName("Добавление автора") void addAuthor() { int count = authorManageService.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); Author author_selected = authorManageService.getAuthorById(4L); @@ -77,6 +80,7 @@ void addAuthor() { } @Test + @DisplayName("Обновление автора") void updateAuthor() { Author author1 = authorManageService.getAuthorById(1L); int count = authorManageService.updateAuthor(1L, "TestSurname", "TestFirstName", "TestSecondName"); @@ -95,6 +99,7 @@ void updateAuthor() { } @Test + @DisplayName("Удаление автора, который используется в таблице книг") void deleteAuthor() { assertThrows(PersistenceException.class, () -> { authorManageService.deleteAuthor(1L); }); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 2198576..d017f57 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -33,6 +33,7 @@ class BookManageSeviceImplTest { private BookManageSevice booksManageSevice; @Test + @DisplayName("Получение книги по id") void getBookById() { Book book = booksManageSevice.getBookById(1L); @@ -51,24 +52,7 @@ void getBookById() { } @Test - void getFullBookById() { - Book book = booksManageSevice.getFullBookById(1); - - assertAll( - "book", - () -> assertNotNull(book), - () -> assertNotNull(book.getAuthor()), - () -> assertNotNull(book.getGenre()), - () -> assertEquals(1L, book.getId()), - () -> assertEquals("2019-01-01", DateUtil.dateToString(book.getAddRecordDate())), - () -> assertEquals("book_1", book.getCaption()), - () -> assertEquals(1, book.getAuthor().getId()), - () -> assertEquals(1, book.getGenre().getId()), - () -> assertEquals("comment", book.getComment()) - ); - } - - @Test + @DisplayName("Получение всех книг") void getBooks() { List books = booksManageSevice.getBooks(); @@ -83,6 +67,7 @@ void getBooks() { } @Test + @DisplayName("Добавление книги") void addBook() { int count = booksManageSevice.addBook("Test_Book", 2, 3, "Test_Comment"); Book book = booksManageSevice.getBookById(4L); @@ -100,6 +85,7 @@ void addBook() { } @Test + @DisplayName("Обновление книги") void updateBook() { Book book1 = booksManageSevice.getBookById(1L); int count = booksManageSevice.updateBook(1L, "Test_Book", 2, 3, "Test_Comment"); @@ -116,6 +102,7 @@ void updateBook() { } @Test + @DisplayName("Удаление книги по id") void deleteBook() { int count = booksManageSevice.deleteBook(1L); diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 784d44c..da4d95f 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -33,6 +33,7 @@ class GenreManageSeviceImplTest { private GenreManageService genreManageService; @Test + @DisplayName("Получение жанра по id") void getGenreById() { Genre genre = genreManageService.getGenreById(1L); @@ -45,6 +46,7 @@ void getGenreById() { } @Test + @DisplayName("Получение всех жанров") void getGenres() { List genres = genreManageService.getGenres(); @@ -59,6 +61,7 @@ void getGenres() { } @Test + @DisplayName("Добавление жанра") void addGenre() { int count = genreManageService.addGenre("Test4"); Genre genre = genreManageService.getGenreById(4L); @@ -73,6 +76,7 @@ void addGenre() { } @Test + @DisplayName("Обновление жанра") void updateGenre() { Genre genre1 = genreManageService.getGenreById(1L); int count = genreManageService.updateGenre(1L, "UpdatedName"); @@ -87,6 +91,7 @@ void updateGenre() { } @Test + @DisplayName("Удаление жанра, который используется в таблице книг") void deleteGenre() { assertThrows(PersistenceException.class, () -> { genreManageService.deleteGenre(1L); }); } From d7900084e9ce206f44904114ebba6113631baebd Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 20 Jun 2019 13:40:47 +0300 Subject: [PATCH 27/70] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=80=D1=83=D1=80?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= =?UTF-8?q?=20Book.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ .../java/ru/otus/mkulikov/app/dao/BookDaoJpa.java | 12 ++++++++++-- src/main/java/ru/otus/mkulikov/app/model/Book.java | 8 ++++++-- src/test/resources/application.yml | 4 ++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 40b2856..a2255dd 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,6 @@ ### 19-09-19 Доработки: - Добавлены названия тэстов. - Связи OneToOne изменены на ManyToOne. + +### 19-09-20 Доработки: +- Изменена струкрура запроса для сущности Book. \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java index 76b1fa9..9abc144 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java @@ -28,7 +28,11 @@ public class BookDaoJpa implements BookDao { @Override public Book getById(long id) { - List books = em.createQuery("select b from Book b where b.id = :id ") + List books = em.createQuery("select b " + + "from Book b " + + "inner join fetch b.author a " + + "inner join fetch b.genre g " + + "where b.id = :id ") .setParameter("id", id) .getResultList(); @@ -37,7 +41,11 @@ public Book getById(long id) { @Override public List getAllObjects() { - List books = em.createQuery("select b from Book b order by b.id ") + List books = em.createQuery("select b " + + "from Book b " + + "inner join fetch b.author a " + + "inner join fetch b.genre g " + + "order by b.id ") .getResultList(); return books; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 1b7f81b..8cfc9a8 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -1,6 +1,8 @@ package ru.otus.mkulikov.app.model; import lombok.Data; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; import javax.persistence.*; import java.util.Date; @@ -29,10 +31,12 @@ public class Book { @Column(name = "COMMENT") private String comment; - @ManyToOne(optional=false) + @Fetch(FetchMode.JOIN) + @ManyToOne(optional=false, fetch = FetchType.EAGER) private Author author; - @ManyToOne(optional=false) + @Fetch(FetchMode.JOIN) + @ManyToOne(optional=false, fetch = FetchType.EAGER) private Genre genre; public Book() { diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index e2c030c..6175668 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -12,6 +12,6 @@ spring: properties: hibernate: - show_sql: false - format_sql: false + show_sql: true + format_sql: true From 2fde702e1d297fdbc560accfe968f5a7aaab538c Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 20 Jun 2019 15:00:15 +0300 Subject: [PATCH 28/70] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20Spring=20Data=20JP?= =?UTF-8?q?A.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 22 ++-- .../java/ru/otus/mkulikov/Application.java | 3 - .../ru/otus/mkulikov/app/dao/AuthorDao.java | 19 ++- .../otus/mkulikov/app/dao/AuthorDaoJpa.java | 71 ----------- .../ru/otus/mkulikov/app/dao/BookDao.java | 1 + .../ru/otus/mkulikov/app/dao/GenreDao.java | 1 + .../app/service/AuthorManageServiceImpl.java | 22 +++- .../app/service/BookManageSeviceImpl.java | 18 +-- .../mkulikov/app/dao/AuthorDaoJpaTest.java | 119 +++++++++--------- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 115 ++++++++--------- .../mkulikov/app/dao/GenreDaoJpaTest.java | 3 +- 11 files changed, 171 insertions(+), 223 deletions(-) delete mode 100644 src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java diff --git a/pom.xml b/pom.xml index f1fbb76..adbdd0f 100644 --- a/pom.xml +++ b/pom.xml @@ -84,11 +84,6 @@ spring-boot-starter - - - - - org.springframework.boot spring-boot-starter-test @@ -101,11 +96,6 @@ true - - org.springframework.boot - spring-boot-starter-data-jpa - - org.springframework.shell spring-shell-starter @@ -118,6 +108,18 @@ h2 1.4.199 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.data + spring-data-jpa + 2.0.8.RELEASE + diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 70a6c6d..ceae852 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -3,8 +3,6 @@ import org.h2.tools.Console; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.PropertySource; /** * Created by IntelliJ IDEA. @@ -14,7 +12,6 @@ */ @SpringBootApplication -@EnableConfigurationProperties public class Application { public static void main(String[] args) throws Exception { diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index 099b02b..00984a0 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -1,9 +1,11 @@ package ru.otus.mkulikov.app.dao; +import lombok.RequiredArgsConstructor; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; -import java.util.List; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -11,15 +13,8 @@ * Time: 17:06 */ -public interface AuthorDao { - - T getById(long id); - - List getAllObjects(); - - int addObject(T t); - - int deleteObject(long id); +@Repository +@Transactional +public interface AuthorDao extends CrudRepository { - int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java deleted file mode 100644 index cfb17ba..0000000 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java +++ /dev/null @@ -1,71 +0,0 @@ -package ru.otus.mkulikov.app.dao; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; -import ru.otus.mkulikov.app.model.Author; - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; - -import java.util.List; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 23.05.2019 - * Time: 17:06 - */ - -@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) -@Repository -@Transactional -@RequiredArgsConstructor -public class AuthorDaoJpa implements AuthorDao { - - @PersistenceContext - private EntityManager em; - - @Override - public Author getById(long id) { - List list = em.createQuery("select a from Author a where a.id = :id", Author.class) - .setParameter("id", id) - .getResultList(); - - // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных - // не хочу ошибку, хочу null - return (list != null && !list.isEmpty()) ? list.get(0) : null; - } - - @Override - public List getAllObjects() { - return em.createQuery("select a from Author a order by a.id", Author.class) - .getResultList(); - } - - @Override - public int addObject(Author author) { - em.persist(author); - return 1; - } - - @Override - public int deleteObject(long id) { - return em.createQuery("delete from Author a where a.id = :id ") - .setParameter("id", id) - .executeUpdate(); - } - - @Override - public int updateObject(Author author) { - int count = em.createQuery("update Author a set a.surname = :surname, a.firstName = :firstName, a.secondName = :secondName where a.id = :id ") - .setParameter("surname", author.getSurname()) - .setParameter("firstName", author.getFirstName()) - .setParameter("secondName", author.getSecondName()) - .setParameter("id", author.getId()) - .executeUpdate(); - - em.clear(); - return count; - } -} diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index 3e2faa1..5311c12 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -1,5 +1,6 @@ package ru.otus.mkulikov.app.dao; +import org.springframework.data.repository.CrudRepository; import ru.otus.mkulikov.app.model.Book; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 348b84d..5e0af50 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -1,5 +1,6 @@ package ru.otus.mkulikov.app.dao; +import org.springframework.data.repository.CrudRepository; import ru.otus.mkulikov.app.model.Genre; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index 63632f9..2743073 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -6,6 +6,9 @@ import ru.otus.mkulikov.app.model.Author; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; /** * Created by IntelliJ IDEA. @@ -22,26 +25,35 @@ public class AuthorManageServiceImpl implements AuthorManageService { @Override public Author getAuthorById(long id) { - return authorDao.getById(id); + Optional author = authorDao.findById(id); + return author.get(); } @Override public List getAuthors() { - return authorDao.getAllObjects(); + Iterable authors = authorDao.findAll(); + List list = StreamSupport + .stream(authors.spliterator(), false) + .collect(Collectors.toList()); + + return list; } @Override public int addAuthor(String surname, String firstName, String secondName) { - return authorDao.addObject(new Author(surname, firstName, secondName)); + authorDao.save(new Author(surname, firstName, secondName)); + return 1; } @Override public int updateAuthor(long id, String surname, String firstName, String secondName) { - return authorDao.updateObject(new Author(id, surname, firstName, secondName)); + authorDao.save(new Author(id, surname, firstName, secondName)); + return 1; } @Override public int deleteAuthor(long id) { - return authorDao.deleteObject(id); + authorDao.deleteById(id); + return 1; } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 15c5571..f30686c 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -43,18 +43,20 @@ public List getBooks() { @Override public int addBook(String caption, int authorId, int genreId, String comment) { - Author author = authorDao.getById(authorId); - Genre genre = genreDao.getById(genreId); - - return bookDao.addObject(new Book(caption, author, genre, comment)); + // Author author = authorDao.getById(authorId); + // Genre genre = genreDao.getById(genreId); + // + // return bookDao.addObject(new Book(caption, author, genre, comment)); + return 1; } @Override public int updateBook(long id, String caption, int authorId, int genreId, String comment) { - Author author = authorDao.getById(authorId); - Genre genre = genreDao.getById(genreId); - - return bookDao.updateObject(new Book(id, caption, author, genre, comment)); + // Author author = authorDao.getById(authorId); + // Genre genre = genreDao.getById(genreId); + // + // return bookDao.updateObject(new Book(id, caption, author, genre, comment)); + return 1; } @Override diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 040c5ec..1660eab 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -5,6 +5,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; @@ -12,6 +13,9 @@ import javax.persistence.PersistenceException; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import static org.junit.jupiter.api.Assertions.*; @@ -24,81 +28,84 @@ @DisplayName("Класс AuthorDaoJpa") @RunWith(SpringRunner.class) -@Import(AuthorDaoJpa.class) +@ComponentScan("ru.otus.mkulikov.app") @DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class AuthorDaoJpaTest { @Autowired - private AuthorDao authorDaoJpa; + private AuthorDao authorDao; @Test void getById() { - Author author = authorDaoJpa.getById(1L); + Optional author = authorDao.findById(1L); assertAll( "author", - () -> assertNotNull(author), - () -> assertEquals(1L, author.getId()), - () -> assertEquals("Surname", author.getSurname()), - () -> assertEquals("FirstName", author.getFirstName()), - () -> assertEquals("SecondName", author.getSecondName()) + () -> assertNotNull(author.get()), + () -> assertEquals(1L, author.get().getId()), + () -> assertEquals("Surname", author.get().getSurname()), + () -> assertEquals("FirstName", author.get().getFirstName()), + () -> assertEquals("SecondName", author.get().getSecondName()) ); } @Test void getAllObjects() { - List authors = authorDaoJpa.getAllObjects(); + Iterable authors = authorDao.findAll(); + List list = StreamSupport + .stream(authors.spliterator(), false) + .collect(Collectors.toList()); assertAll( "authors", - () -> assertNotNull(authors), - () -> assertEquals(3, authors.size()), - () -> assertEquals("Surname", authors.get(0).getSurname()), - () -> assertEquals("Surname2", authors.get(1).getSurname()), - () -> assertEquals("Surname3", authors.get(2).getSurname()) - ); - } - - @Test - void addObject() { - Author author = new Author("TestSurname", "TestFirstName", "TestSecondName"); - int count = authorDaoJpa.addObject(author); - Author author_selected = authorDaoJpa.getById(4L); - - assertAll( - "author", - () -> assertNotNull(author_selected), - () -> assertEquals(1, count), - () -> assertEquals(4, author_selected.getId()), - () -> assertEquals(author.getSurname(), author_selected.getSurname()), - () -> assertEquals(author.getFirstName(), author_selected.getFirstName()), - () -> assertEquals(author.getSecondName(), author_selected.getSecondName()) - ); - } - - @Test - void deleteObject() { - assertThrows(PersistenceException.class, () -> { authorDaoJpa.deleteObject(1L); }); - } - - @Test - void updateObject() { - Author author1 = authorDaoJpa.getById(1L); - int count = authorDaoJpa.updateObject( - new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") - ); - Author author2 = authorDaoJpa.getById(1L); - - assertAll( - "author", - () -> assertEquals(1, count), - () -> assertEquals("Surname", author1.getSurname()), - () -> assertEquals("FirstName", author1.getFirstName()), - () -> assertEquals("SecondName", author1.getSecondName()), - () -> assertEquals("TestSurname", author2.getSurname()), - () -> assertEquals("TestFirstName", author2.getFirstName()), - () -> assertEquals("TestSecondName", author2.getSecondName()) + () -> assertNotNull(list), + () -> assertEquals(3, list.size()), + () -> assertEquals("Surname", list.get(0).getSurname()), + () -> assertEquals("Surname2", list.get(1).getSurname()), + () -> assertEquals("Surname3", list.get(2).getSurname()) ); } + // + //@Test + //void addObject() { + // Author author = new Author("TestSurname", "TestFirstName", "TestSecondName"); + // int count = authorDao.save(author); + // Author author_selected = authorDao.getById(4L); + // + // assertAll( + // "author", + // () -> assertNotNull(author_selected), + // () -> assertEquals(1, count), + // () -> assertEquals(4, author_selected.getId()), + // () -> assertEquals(author.getSurname(), author_selected.getSurname()), + // () -> assertEquals(author.getFirstName(), author_selected.getFirstName()), + // () -> assertEquals(author.getSecondName(), author_selected.getSecondName()) + // ); + //} + // + //@Test + //void deleteObject() { + // assertThrows(PersistenceException.class, () -> { authorDao.deleteObject(1L); }); + //} + // + //@Test + //void updateObject() { + // Author author1 = authorDao.getById(1L); + // int count = authorDao.updateObject( + // new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") + // ); + // Author author2 = authorDao.getById(1L); + // + // assertAll( + // "author", + // () -> assertEquals(1, count), + // () -> assertEquals("Surname", author1.getSurname()), + // () -> assertEquals("FirstName", author1.getFirstName()), + // () -> assertEquals("SecondName", author1.getSecondName()), + // () -> assertEquals("TestSurname", author2.getSurname()), + // () -> assertEquals("TestFirstName", author2.getFirstName()), + // () -> assertEquals("TestSecondName", author2.getSecondName()) + // ); + //} } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 4a79cb1..29958d2 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -5,6 +5,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; @@ -26,7 +27,7 @@ @DisplayName("Класс BookDaoJpa") @RunWith(SpringRunner.class) -@Import({BookDaoJpa.class, AuthorDaoJpa.class, GenreDaoJpa.class}) +@ComponentScan("ru.otus.mkulikov.app") @DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class BookDaoJpaTest { @@ -67,60 +68,60 @@ void getAllObjects() { () -> assertEquals("book_3", books.get(2).getCaption()) ); } - - @Test - void addObject() { - int count = bookDaoJpa.addObject(getNewBook()); - Book book = bookDaoJpa.getById(4L); - - assertAll( - "book", - () -> assertNotNull(book), - () -> assertEquals(1, count), - () -> assertEquals(4L, book.getId()), - () -> assertEquals("Test_Book", book.getCaption()), - () -> assertEquals(1, book.getAuthor().getId()), - () -> assertEquals(1, book.getGenre().getId()), - () -> assertEquals("Test_Comment", book.getComment()) - ); - } - - @Test - void deleteObject() { - int count = bookDaoJpa.deleteObject(1L); - - assertAll( - "book", - () -> assertEquals(1, count), - () -> assertThrows(IndexOutOfBoundsException.class, () -> { bookDaoJpa.getById(1L); }) - ); - } - - @Test - void updateObject() { - Book book1 = bookDaoJpa.getById(1L); - int count = bookDaoJpa.updateObject(getUpdatedBook()); - Book book2 = bookDaoJpa.getById(1L); - - assertAll( - "book", - () -> assertEquals(1, count), - () -> assertEquals("book_1", book1.getCaption()), - () -> assertEquals("comment", book1.getComment()), - () -> assertEquals("Test_Book", book2.getCaption()), - () -> assertEquals("Test_Comment", book2.getComment()) - ); - } - - private Book getNewBook() { - Author author = authorDao.getById(1); - Genre genre = genreDao.getById(1); - return new Book("Test_Book", author, genre, "Test_Comment"); - } - - private Book getUpdatedBook() { - Author author = authorDao.getById(1); - Genre genre = genreDao.getById(1); - return new Book(1L,"Test_Book", author, genre, "Test_Comment"); - } + // + //@Test + //void addObject() { + // int count = bookDaoJpa.addObject(getNewBook()); + // Book book = bookDaoJpa.getById(4L); + // + // assertAll( + // "book", + // () -> assertNotNull(book), + // () -> assertEquals(1, count), + // () -> assertEquals(4L, book.getId()), + // () -> assertEquals("Test_Book", book.getCaption()), + // () -> assertEquals(1, book.getAuthor().getId()), + // () -> assertEquals(1, book.getGenre().getId()), + // () -> assertEquals("Test_Comment", book.getComment()) + // ); + //} + // + //@Test + //void deleteObject() { + // int count = bookDaoJpa.deleteObject(1L); + // + // assertAll( + // "book", + // () -> assertEquals(1, count), + // () -> assertThrows(IndexOutOfBoundsException.class, () -> { bookDaoJpa.getById(1L); }) + // ); + //} + // + //@Test + //void updateObject() { + // Book book1 = bookDaoJpa.getById(1L); + // int count = bookDaoJpa.updateObject(getUpdatedBook()); + // Book book2 = bookDaoJpa.getById(1L); + // + // assertAll( + // "book", + // () -> assertEquals(1, count), + // () -> assertEquals("book_1", book1.getCaption()), + // () -> assertEquals("comment", book1.getComment()), + // () -> assertEquals("Test_Book", book2.getCaption()), + // () -> assertEquals("Test_Comment", book2.getComment()) + // ); + //} + // + //private Book getNewBook() { + // Author author = authorDao.getById(1); + // Genre genre = genreDao.getById(1); + // return new Book("Test_Book", author, genre, "Test_Comment"); + //} + // + //private Book getUpdatedBook() { + // Author author = authorDao.getById(1); + // Genre genre = genreDao.getById(1); + // return new Book(1L,"Test_Book", author, genre, "Test_Comment"); + //} } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index cc939a4..533a048 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -5,6 +5,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; @@ -24,7 +25,7 @@ @DisplayName("Класс GenreDaoJpa") @RunWith(SpringRunner.class) -@Import(GenreDaoJpa.class) +@ComponentScan("ru.otus.mkulikov.app") @DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class GenreDaoJpaTest { From 6d1e02fd6338c144eb5949b1fd42e70d0ff58cb1 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 21 Jun 2019 08:18:38 +0300 Subject: [PATCH 29/70] =?UTF-8?q?-=20=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=81=D1=83=D1=89=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20comment=20=D0=B8=20=D0=BA=D0=BB=D0=B0=D1=87?= =?UTF-8?q?=D1=87=D0=BE=D0=B2=20=D0=BA=20=D0=BD=D0=B5=D0=B9.=20-=20=D0=94?= =?UTF-8?q?=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/otus/mkulikov/app/dao/BookDaoJpa.java | 10 ++- .../ru/otus/mkulikov/app/dao/CommentDao.java | 28 +++++++ .../otus/mkulikov/app/dao/CommentDaoJpa.java | 82 +++++++++++++++++++ .../java/ru/otus/mkulikov/app/model/Book.java | 22 +++-- .../ru/otus/mkulikov/app/model/Comment.java | 60 ++++++++++++++ .../app/service/BookManageSevice.java | 4 +- .../app/service/BookManageSeviceImpl.java | 10 ++- .../app/service/CommentManageService.java | 25 ++++++ .../app/service/CommentManageServiceImpl.java | 50 +++++++++++ .../app/service/GenreManageService.java | 4 +- .../ru/otus/mkulikov/shell/BookCommands.java | 8 +- src/main/resources/data-h2.sql | 24 ++++-- src/main/resources/schema-h2.sql | 24 ++++-- 13 files changed, 314 insertions(+), 37 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java create mode 100644 src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java create mode 100644 src/main/java/ru/otus/mkulikov/app/model/Comment.java create mode 100644 src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java create mode 100644 src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java index 9abc144..12eee8f 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java @@ -32,7 +32,8 @@ public Book getById(long id) { + "from Book b " + "inner join fetch b.author a " + "inner join fetch b.genre g " - + "where b.id = :id ") + + "inner join fetch b.comment c " + + "where b.id = :id ", Book.class) .setParameter("id", id) .getResultList(); @@ -45,7 +46,8 @@ public List getAllObjects() { + "from Book b " + "inner join fetch b.author a " + "inner join fetch b.genre g " - + "order by b.id ") + + "inner join fetch b.comment c " + + "order by b.id ", Book.class) .getResultList(); return books; @@ -68,13 +70,13 @@ public int deleteObject(long id) { public int updateObject(Book book) { int count = em.createNativeQuery( "update Book b " - + "set b.add_record_date = :add_record_date, b.caption = :caption, b.author_id = :author_id, b.genre_id = :genre_id, b.comment = :comment " + + "set b.add_record_date = :add_record_date, b.caption = :caption, b.author_id = :author_id, b.genre_id = :genre_id, b.description = :description " + "where b.id = :id ") .setParameter("add_record_date", new Date()) .setParameter("caption", book.getCaption()) .setParameter("author_id", book.getAuthor().getId()) .setParameter("genre_id", book.getGenre().getId()) - .setParameter("comment", book.getComment()) + .setParameter("description", book.getDescription()) .setParameter("id", book.getId()) .executeUpdate(); diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java new file mode 100644 index 0000000..b7a33e1 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -0,0 +1,28 @@ +package ru.otus.mkulikov.app.dao; + +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 20.06.2019 + * Time: 23:48 + */ + +public interface CommentDao { + + T getById(long id); + + T getByBookId(long id); + + List getAllObjects(); + + int addObject(T t); + + int deleteObject(long id); + + int updateObject(T t); +} diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java new file mode 100644 index 0000000..bba522a --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java @@ -0,0 +1,82 @@ +package ru.otus.mkulikov.app.dao; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Comment; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 23.05.2019 + * Time: 17:06 + */ + +@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) +@Repository +@Transactional +@RequiredArgsConstructor +public class CommentDaoJpa implements CommentDao { + + @PersistenceContext + private EntityManager em; + + @Override + public Comment getById(long id) { + List list = em.createQuery("select a from Comment a where a.id = :id", Comment.class) + .setParameter("id", id) + .getResultList(); + + // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных + // не хочу ошибку, хочу null + return (list != null && !list.isEmpty()) ? list.get(0) : null; + } + + @Override + public Comment getByBookId(long bookId) { + List list = em.createQuery("select a from Comment a where a.bookId = :bookId", Comment.class) + .setParameter("bookId", bookId) + .getResultList(); + + // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных + // не хочу ошибку, хочу null + return (list != null && !list.isEmpty()) ? list.get(0) : null; + } + + @Override + public List getAllObjects() { + return em.createQuery("select a from Comment a order by a.id", Comment.class) + .getResultList(); + } + + @Override + public int addObject(Comment comment) { + em.persist(comment); + return 1; + } + + @Override + public int deleteObject(long id) { + return em.createQuery("delete from Comment a where a.id = :id ") + .setParameter("id", id) + .executeUpdate(); + } + + @Override + public int updateObject(Comment comment) { + int count = em.createQuery("update Comment a set a.addRecordDate = :addRecordDate, a.userName = :userName , a.text = :text where a.id = :id ") + .setParameter("addRecordDate", comment.getAddRecordDate()) + .setParameter("userName", comment.getUserName()) + .setParameter("text", comment.getText()) + .setParameter("id", comment.getId()) + .executeUpdate(); + + em.clear(); + return count; + } +} diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 8cfc9a8..9aefa3b 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -28,8 +28,12 @@ public class Book { private Date addRecordDate; @Column(name = "CAPTION") private String caption; - @Column(name = "COMMENT") - private String comment; + @Column(name = "DESCRIPTION") + private String description; + +// @Fetch(FetchMode.JOIN) +// @ManyToOne(optional=false, fetch = FetchType.EAGER) +// private Comment comment; @Fetch(FetchMode.JOIN) @ManyToOne(optional=false, fetch = FetchType.EAGER) @@ -42,29 +46,29 @@ public class Book { public Book() { } - public Book(long id, Date addRecordDate, String caption, Author author, Genre genre, String comment) { + public Book(long id, Date addRecordDate, String caption, Author author, Genre genre, String description) { this.id = id; this.addRecordDate = addRecordDate; this.author = author; this.genre = genre; this.caption = caption; - this.comment = comment; + this.description = description; } - public Book(long id, String caption, Author author, Genre genre, String comment) { + public Book(long id, String caption, Author author, Genre genre, String description) { this.id = id; this.caption = caption; this.author = author; this.genre = genre; - this.comment = comment; + this.description = description; } - public Book(String caption, Author author, Genre genre, String comment) { + public Book(String caption, Author author, Genre genre, String description) { this.id = 0L; this.caption = caption; this.author = author; this.genre = genre; - this.comment = comment; + this.description = description; } @Override @@ -73,7 +77,7 @@ public String toString() { "id=" + id + ", addRecordDate=" + addRecordDate + ", caption='" + caption + '\'' + - ", comment='" + comment + '\'' + + ", description=" + description + ", author=" + author + ", genre=" + genre + "}\n"; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java new file mode 100644 index 0000000..00424b9 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -0,0 +1,60 @@ +package ru.otus.mkulikov.app.model; + +import lombok.Data; + +import javax.persistence.*; +import java.util.Date; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 20.06.2019 + * Time: 23:38 + */ + +@Data +@Entity +@Table(name = "COMMENT") +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_comment") + @SequenceGenerator(name = "sq_comment", sequenceName = "sq_comment", allocationSize = 1) + @Column(name = "ID") + private long id; + @Column(name = "BOOK_ID") + private long bookId; + @Column(name = "ADD_RECORD_DATE") + private Date addRecordDate; + @Column(name = "USER_NAME") + private String userName; + @Column(name = "TEXT") + private String text; + + public Comment(long id, long bookId, Date addRecordDate, String userName, String text) { + this.id = id; + this.bookId = bookId; + this.addRecordDate = addRecordDate; + this.userName = userName; + this.text = text; + } + + public Comment(long bookId, Date addRecordDate, String userName, String text) { + this.id = 0L; + this.bookId = bookId; + this.addRecordDate = addRecordDate; + this.userName = userName; + this.text = text; + } + + @Override + public String toString() { + return "Comment{" + + "id=" + id + + ", bookId=" + bookId + + ", addRecordDate=" + addRecordDate + + ", userName=" + userName + + ", text='" + text + '\'' + + "}\n"; + } +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java index 535b2dd..e08867d 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -17,9 +17,9 @@ public interface BookManageSevice { List getBooks(); - int addBook(String caption, int authorId, int genreId, String comment); + int addBook(String caption, int authorId, int genreId, String description); - int updateBook(long id, String caption, int authorId, int genreId, String comment); + int updateBook(long id, String caption, int authorId, int genreId, String description); int deleteBook(long id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 1caf2b0..faf01b2 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -4,9 +4,11 @@ import org.springframework.stereotype.Service; import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; +import ru.otus.mkulikov.app.dao.CommentDao; import ru.otus.mkulikov.app.dao.GenreDao; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.model.Genre; import java.util.List; @@ -37,19 +39,19 @@ public List getBooks() { } @Override - public int addBook(String caption, int authorId, int genreId, String comment) { + public int addBook(String caption, int authorId, int genreId, String description) { Author author = authorDao.getById(authorId); Genre genre = genreDao.getById(genreId); - return bookDao.addObject(new Book(caption, author, genre, comment)); + return bookDao.addObject(new Book(caption, author, genre, description)); } @Override - public int updateBook(long id, String caption, int authorId, int genreId, String comment) { + public int updateBook(long id, String caption, int authorId, int genreId, String description) { Author author = authorDao.getById(authorId); Genre genre = genreDao.getById(genreId); - return bookDao.updateObject(new Book(id, caption, author, genre, comment)); + return bookDao.updateObject(new Book(id, caption, author, genre, description)); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java new file mode 100644 index 0000000..2565a14 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java @@ -0,0 +1,25 @@ +package ru.otus.mkulikov.app.service; + +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 15:50 + */ +public interface CommentManageService { + + T getCommentById(long id); + + List getComments(); + + int addComment(long bookId, String userName, String text); + + int updateComment(long id, long bookId, String userName, String text); + + int deleteComment(long id); +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java new file mode 100644 index 0000000..9b21664 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -0,0 +1,50 @@ +package ru.otus.mkulikov.app.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.otus.mkulikov.app.dao.CommentDao; +import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.model.Genre; + +import java.util.Date; +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 15:52 + */ + +@Service +@RequiredArgsConstructor +public class CommentManageServiceImpl implements CommentManageService { + + private final CommentDao commentDao; + + @Override + public Comment getCommentById(long id) { + return commentDao.getById(id); + } + + @Override + public List getComments() { + return commentDao.getAllObjects(); + } + + @Override + public int addComment(long bookId, String userName, String text) { + return commentDao.addObject(new Comment(bookId, new Date(), userName, text)); + } + + @Override + public int updateComment(long id, long bookId, String userName, String text) { + return commentDao.updateObject(new Comment(id, bookId, new Date(), userName, text)); + } + + @Override + public int deleteComment(long id) { + return commentDao.deleteObject(id); + } +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java index d2f62af..80015b3 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java @@ -12,9 +12,9 @@ */ public interface GenreManageService { - Genre getGenreById(long id); + T getGenreById(long id); - List getGenres(); + List getGenres(); int addGenre(String name); diff --git a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java index 163788d..b5119f5 100644 --- a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java @@ -35,14 +35,14 @@ public String getBooks() { } @ShellMethod(key = {"addBook"}, value = "Add new book.") - public String addBook(@ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String comment) { - int count = bookManageSevice.addBook(caption, authorId, genreId, comment); + public String addBook(@ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String description) { + int count = bookManageSevice.addBook(caption, authorId, genreId, description); return "Add " + count + " row(s)"; } @ShellMethod(key = {"updateBook"}, value = "Update book by id.") - public String updateBook(@ShellOption long id, @ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String comment) { - int count = bookManageSevice.updateBook(id, caption, authorId, genreId, comment); + public String updateBook(@ShellOption long id, @ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String description) { + int count = bookManageSevice.updateBook(id, caption, authorId, genreId, description); return "Updated " + count + " row(s)"; } diff --git a/src/main/resources/data-h2.sql b/src/main/resources/data-h2.sql index a0fbb68..eb74cd6 100644 --- a/src/main/resources/data-h2.sql +++ b/src/main/resources/data-h2.sql @@ -15,13 +15,25 @@ insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre3'); -------------------------- -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'description'); -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'description'); -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'description'); -------------------------- + +insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) +values (sq_comment.nextval, 1, to_date('2019-01-01','YYYY-MM-DD'), 'user1', 'text1'); + +insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) +values (sq_comment.nextval, 1, to_date('2019-01-01','YYYY-MM-DD'), 'user2', 'text2'); + +insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) +values (sq_comment.nextval, 2, to_date('2019-01-01','YYYY-MM-DD'), 'user3', 'text3'); + +insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) +values (sq_comment.nextval, 2, to_date('2019-01-01','YYYY-MM-DD'), 'user4', 'text4'); \ No newline at end of file diff --git a/src/main/resources/schema-h2.sql b/src/main/resources/schema-h2.sql index 8f77a94..d8d9c5c 100644 --- a/src/main/resources/schema-h2.sql +++ b/src/main/resources/schema-h2.sql @@ -1,31 +1,43 @@ DROP TABLE IF EXISTS BOOK; DROP TABLE IF EXISTS AUTHOR; DROP TABLE IF EXISTS GENRE; +DROP TABLE IF EXISTS COMMENT; CREATE TABLE AUTHOR( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, SURNAME VARCHAR(100) not null, FIRST_NAME VARCHAR(100) not null, SECOND_NAME VARCHAR(100) ); CREATE TABLE GENRE( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, NAME VARCHAR(100) not null ); CREATE TABLE BOOK( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, ADD_RECORD_DATE DATE default sysdate, CAPTION VARCHAR(255) not null, - AUTHOR_ID NUMBER(22,0) not null, - GENRE_ID NUMBER(22,0) not null, - COMMENT VARCHAR(255), + AUTHOR_ID NUMBER(20,0) not null, + GENRE_ID NUMBER(20,0) not null, + DESCRIPTION VARCHAR(255), foreign key (AUTHOR_ID) references AUTHOR(ID), foreign key (GENRE_ID) references GENRE(ID) ); +CREATE TABLE COMMENT( + ID NUMBER(20,0) PRIMARY KEY not null, + BOOK_ID NUMBER(20,0) not null, + ADD_RECORD_DATE DATE default sysdate, + USER_NAME VARCHAR(20), + TEXT VARCHAR(500), + + foreign key (BOOK_ID) references BOOK(ID) +); + CREATE SEQUENCE sq_author minvalue 1 start with 1 increment by 1; CREATE SEQUENCE sq_genre minvalue 1 start with 1 increment by 1; CREATE SEQUENCE sq_book minvalue 1 start with 1 increment by 1; +CREATE SEQUENCE sq_comment minvalue 1 start with 1 increment by 1; \ No newline at end of file From d45245ea21a6e1effeacfa38c827a59d1c952ae4 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 21 Jun 2019 17:57:44 +0300 Subject: [PATCH 30/70] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4=20Data=20Jp?= =?UTF-8?q?a.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/otus/mkulikov/app/dao/AuthorDao.java | 4 +- .../ru/otus/mkulikov/app/dao/GenreDao.java | 17 ++-- .../ru/otus/mkulikov/app/dao/GenreDaoJpa.java | 68 ---------------- .../app/service/GenreManageServiceImpl.java | 22 +++-- .../mkulikov/app/dao/AuthorDaoJpaTest.java | 81 +++++++++---------- .../mkulikov/app/dao/GenreDaoJpaTest.java | 30 ++++--- src/test/resources/schema-test.sql | 10 +-- 7 files changed, 85 insertions(+), 147 deletions(-) delete mode 100644 src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index 00984a0..1a926b0 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -1,6 +1,6 @@ package ru.otus.mkulikov.app.dao; -import lombok.RequiredArgsConstructor; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -15,6 +15,6 @@ @Repository @Transactional -public interface AuthorDao extends CrudRepository { +public interface AuthorDao extends JpaRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 5e0af50..9273707 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -1,10 +1,10 @@ package ru.otus.mkulikov.app.dao; import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; -import java.util.List; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -12,15 +12,8 @@ * Time: 17:07 */ -public interface GenreDao { - - T getById(long id); - - List getAllObjects(); - - int addObject(T t); - - int deleteObject(long id); +@Repository +@Transactional +public interface GenreDao extends CrudRepository { - int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java deleted file mode 100644 index 17331a5..0000000 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java +++ /dev/null @@ -1,68 +0,0 @@ -package ru.otus.mkulikov.app.dao; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; -import ru.otus.mkulikov.app.model.Genre; - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import java.util.List; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 23.05.2019 - * Time: 17:07 - */ - -@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) -@Repository -@Transactional -@RequiredArgsConstructor -public class GenreDaoJpa implements GenreDao { - - @PersistenceContext - private EntityManager em; - - @Override - public Genre getById(long id) { - List list = em.createQuery("select g from Genre g where g.id = :id ", Genre.class) - .setParameter("id", id) - .getResultList(); - - // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных - // не хочу ошибку, хочу null - return (list != null && !list.isEmpty()) ? list.get(0) : null; - } - - @Override - public List getAllObjects() { - return em.createQuery("select g from Genre g order by g.id", Genre.class) - .getResultList(); - } - - @Override - public int addObject(Genre genre) { - em.persist(genre); - return 1; - } - - @Override - public int deleteObject(long id) { - return em.createQuery("delete from Genre g where g.id = :id ") - .setParameter("id", id) - .executeUpdate(); - } - - @Override - public int updateObject(Genre genre) { - int count = em.createQuery("update Genre g set g.name = :name where g.id = :id ") - .setParameter("name", genre.getName()) - .setParameter("id", genre.getId()) - .executeUpdate(); - - em.clear(); - return count; - } -} diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index f0b56a6..ddb4acd 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -6,6 +6,9 @@ import ru.otus.mkulikov.app.model.Genre; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; /** * Created by IntelliJ IDEA. @@ -22,26 +25,35 @@ public class GenreManageServiceImpl implements GenreManageService { @Override public Genre getGenreById(long id) { - return genreDao.getById(id); + Optional genre = genreDao.findById(id); + return genre.get(); } @Override public List getGenres() { - return genreDao.getAllObjects(); + Iterable authors = genreDao.findAll(); + List list = StreamSupport + .stream(authors.spliterator(), false) + .collect(Collectors.toList()); + + return list; } @Override public int addGenre(String name) { - return genreDao.addObject(new Genre(name)); + genreDao.save(new Genre(name)); + return 1; } @Override public int updateGenre(long id, String name) { - return genreDao.updateObject(new Genre(id, name)); + genreDao.save(new Genre(id, name)); + return 1; } @Override public int deleteGenre(long id) { - return genreDao.deleteObject(id); + genreDao.deleteById(id); + return 1; } } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 1660eab..502aed0 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -66,46 +66,43 @@ void getAllObjects() { () -> assertEquals("Surname3", list.get(2).getSurname()) ); } - // - //@Test - //void addObject() { - // Author author = new Author("TestSurname", "TestFirstName", "TestSecondName"); - // int count = authorDao.save(author); - // Author author_selected = authorDao.getById(4L); - // - // assertAll( - // "author", - // () -> assertNotNull(author_selected), - // () -> assertEquals(1, count), - // () -> assertEquals(4, author_selected.getId()), - // () -> assertEquals(author.getSurname(), author_selected.getSurname()), - // () -> assertEquals(author.getFirstName(), author_selected.getFirstName()), - // () -> assertEquals(author.getSecondName(), author_selected.getSecondName()) - // ); - //} - // - //@Test - //void deleteObject() { - // assertThrows(PersistenceException.class, () -> { authorDao.deleteObject(1L); }); - //} - // - //@Test - //void updateObject() { - // Author author1 = authorDao.getById(1L); - // int count = authorDao.updateObject( - // new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") - // ); - // Author author2 = authorDao.getById(1L); - // - // assertAll( - // "author", - // () -> assertEquals(1, count), - // () -> assertEquals("Surname", author1.getSurname()), - // () -> assertEquals("FirstName", author1.getFirstName()), - // () -> assertEquals("SecondName", author1.getSecondName()), - // () -> assertEquals("TestSurname", author2.getSurname()), - // () -> assertEquals("TestFirstName", author2.getFirstName()), - // () -> assertEquals("TestSecondName", author2.getSecondName()) - // ); - //} + + @Test + void addObject() { + Author author = authorDao.save(new Author("TestSurname", "TestFirstName", "TestSecondName")); + Optional author_selected = authorDao.findById(4L); + + assertAll( + "author", + () -> assertNotNull(author_selected), + () -> assertEquals(4, author_selected.get().getId()), + () -> assertEquals(author.getSurname(), author_selected.get().getSurname()), + () -> assertEquals(author.getFirstName(), author_selected.get().getFirstName()), + () -> assertEquals(author.getSecondName(), author_selected.get().getSecondName()) + ); + } + + @Test + void deleteObject() { + authorDao.deleteById(1L); + Optional author = authorDao.findById(1L); + + assertNotNull(author); + } + + @Test + void updateObject() { + authorDao.save( + new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") + ); + Author author = authorDao.findById(1L).get(); + + assertAll( + "author", + () -> assertEquals(1L, author.getId()), + () -> assertEquals("TestSurname", author.getSurname()), + () -> assertEquals("TestFirstName", author.getFirstName()), + () -> assertEquals("TestSecondName", author.getSecondName()) + ); + } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index 44a2a6a..e92e383 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -13,6 +13,8 @@ import javax.persistence.PersistenceException; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import static org.junit.jupiter.api.Assertions.*; @@ -36,7 +38,7 @@ class GenreDaoJpaTest { @Test @DisplayName("Получение жанра по id") void getById() { - Genre genre = genreDaoJpa.getById(1L); + Genre genre = genreDaoJpa.findById(1L).get(); assertAll( "genre", @@ -49,7 +51,10 @@ void getById() { @Test @DisplayName("Получение всех жанров") void getAllObjects() { - List genres = genreDaoJpa.getAllObjects(); + Iterable iterable = genreDaoJpa.findAll(); + List genres = StreamSupport + .stream(iterable.spliterator(), false) + .collect(Collectors.toList()); assertAll( "genres", @@ -64,14 +69,12 @@ void getAllObjects() { @Test @DisplayName("Добавление жанра") void addObject() { - int count = genreDaoJpa.addObject(new Genre("Test4")); - - Genre genre = genreDaoJpa.getById(4L); + genreDaoJpa.save(new Genre("Test4")); + Genre genre = genreDaoJpa.findById(4L).get(); assertAll( "genre", () -> assertNotNull(genre), - () -> assertEquals(1, count), () -> assertEquals(4L, genre.getId()), () -> assertEquals("Test4", genre.getName()) ); @@ -80,21 +83,22 @@ void addObject() { @Test @DisplayName("Удаление жанра, который используется в таблице книг") void deleteObject() { - assertThrows(PersistenceException.class, () -> { genreDaoJpa.deleteObject(1L); }); + genreDaoJpa.deleteById(1L); + Genre genre = genreDaoJpa.findById(1L).get(); + + assertNotNull(genre); } @Test @DisplayName("Обновление жанра") void updateObject() { - Genre genre1 = genreDaoJpa.getById(1L); - int count = genreDaoJpa.updateObject(new Genre(1L, "UpdatedName")); - Genre genre2 = genreDaoJpa.getById(1L); + genreDaoJpa.save(new Genre(1L, "UpdatedName")); + Genre genre = genreDaoJpa.findById(1L).get(); assertAll( "genre", - () -> assertEquals(1, count), - () -> assertEquals("Genre1", genre1.getName()), - () -> assertEquals("UpdatedName", genre2.getName()) + () -> assertEquals(1L, genre.getId()), + () -> assertEquals("UpdatedName", genre.getName()) ); } } \ No newline at end of file diff --git a/src/test/resources/schema-test.sql b/src/test/resources/schema-test.sql index 8f77a94..96192a1 100644 --- a/src/test/resources/schema-test.sql +++ b/src/test/resources/schema-test.sql @@ -3,23 +3,23 @@ DROP TABLE IF EXISTS AUTHOR; DROP TABLE IF EXISTS GENRE; CREATE TABLE AUTHOR( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, SURNAME VARCHAR(100) not null, FIRST_NAME VARCHAR(100) not null, SECOND_NAME VARCHAR(100) ); CREATE TABLE GENRE( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, NAME VARCHAR(100) not null ); CREATE TABLE BOOK( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, ADD_RECORD_DATE DATE default sysdate, CAPTION VARCHAR(255) not null, - AUTHOR_ID NUMBER(22,0) not null, - GENRE_ID NUMBER(22,0) not null, + AUTHOR_ID NUMBER(20,0) not null, + GENRE_ID NUMBER(20,0) not null, COMMENT VARCHAR(255), foreign key (AUTHOR_ID) references AUTHOR(ID), From 13c56fced1dc6a32c3c6a0d8532b22b75cb4e150 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 22 Jun 2019 14:06:58 +0300 Subject: [PATCH 31/70] =?UTF-8?q?-=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BC=D0=B5=D1=85=D0=B0=D0=BD=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B0=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F/=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9.=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= =?UTF-8?q?=20Comment=20=D0=B8=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +- .../java/ru/otus/mkulikov/Application.java | 2 - .../ru/otus/mkulikov/app/dao/AuthorDao.java | 4 +- .../otus/mkulikov/app/dao/AuthorDaoJpa.java | 30 ++-- .../ru/otus/mkulikov/app/dao/BookDao.java | 4 +- .../ru/otus/mkulikov/app/dao/BookDaoJpa.java | 32 ++-- .../ru/otus/mkulikov/app/dao/CommentDao.java | 10 +- .../otus/mkulikov/app/dao/CommentDaoJpa.java | 56 ++++--- .../ru/otus/mkulikov/app/dao/GenreDao.java | 4 +- .../ru/otus/mkulikov/app/dao/GenreDaoJpa.java | 36 ++--- .../java/ru/otus/mkulikov/app/model/Book.java | 11 +- .../ru/otus/mkulikov/app/model/Comment.java | 21 ++- .../app/service/AuthorManageServiceImpl.java | 4 +- .../app/service/BookManageSeviceImpl.java | 6 +- .../app/service/CommentManageService.java | 5 +- .../app/service/CommentManageServiceImpl.java | 25 +++- .../app/service/GenreManageServiceImpl.java | 4 +- .../ru/otus/mkulikov/app/utils/DateUtil.java | 7 + .../otus/mkulikov/shell/CommentCommands.java | 60 ++++++++ src/main/resources/data-h2.sql | 8 +- src/main/resources/schema-h2.sql | 4 +- .../mkulikov/app/dao/AuthorDaoJpaTest.java | 4 +- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 16 +- .../mkulikov/app/dao/CommentDaoJpaTest.java | 139 ++++++++++++++++++ .../mkulikov/app/dao/GenreDaoJpaTest.java | 4 +- .../otus/mkulikov/app/model/DateUtilTest.java | 15 +- .../app/service/BookManageSeviceImplTest.java | 12 +- .../service/CommentManageSeviceImplTest.java | 126 ++++++++++++++++ src/test/resources/data-test.sql | 24 ++- src/test/resources/schema-test.sql | 24 ++- 30 files changed, 536 insertions(+), 168 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/shell/CommentCommands.java create mode 100644 src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java create mode 100644 src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java diff --git a/README.md b/README.md index a2255dd..e5a364a 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,9 @@ - Связи OneToOne изменены на ManyToOne. ### 19-09-20 Доработки: -- Изменена струкрура запроса для сущности Book. \ No newline at end of file +- Изменена струкрура запроса для сущности Book. + +### 19-09-22 Доработки: +- Добавлена сущность Comment. +- Изменение механизма добавления/обновления сущностей. +- Добавление классов для обработки сущности Comment и покрытие тестами. \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 70a6c6d..005151d 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -1,10 +1,8 @@ package ru.otus.mkulikov; -import org.h2.tools.Console; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.PropertySource; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index 099b02b..6f09bc7 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -17,9 +17,7 @@ public interface AuthorDao { List getAllObjects(); - int addObject(T t); + int save(T t); int deleteObject(long id); - - int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java index 640852d..9c8cdb4 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java @@ -31,20 +31,27 @@ public Author getById(long id) { .setParameter("id", id) .getResultList(); - // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных - // не хочу ошибку, хочу null + em.clear(); return (list != null && !list.isEmpty()) ? list.get(0) : null; } @Override public List getAllObjects() { - return em.createQuery("select a from Author a order by a.id", Author.class) + List list = em.createQuery("select a from Author a order by a.id", Author.class) .getResultList(); + + em.clear(); + return list; } @Override - public int addObject(Author author) { - em.persist(author); + public int save(Author author) { + if (author.getId() == 0) { + em.persist(author); + } else { + em.merge(author); + } + System.out.println("Author saved with id: " + author.getId()); return 1; } @@ -54,17 +61,4 @@ public int deleteObject(long id) { .setParameter("id", id) .executeUpdate(); } - - @Override - public int updateObject(Author author) { - int count = em.createQuery("update Author a set a.surname = :surname, a.firstName = :firstName, a.secondName = :secondName where a.id = :id ") - .setParameter("surname", author.getSurname()) - .setParameter("firstName", author.getFirstName()) - .setParameter("secondName", author.getSecondName()) - .setParameter("id", author.getId()) - .executeUpdate(); - - em.clear(); - return count; - } } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index 3e2faa1..58aaf0f 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -17,9 +17,7 @@ public interface BookDao { List getAllObjects(); - int addObject(T t); + int save(T t); int deleteObject(long id); - - int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java index 12eee8f..fbeb9a0 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java @@ -7,7 +7,6 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import java.util.Date; import java.util.List; /** @@ -32,11 +31,11 @@ public Book getById(long id) { + "from Book b " + "inner join fetch b.author a " + "inner join fetch b.genre g " - + "inner join fetch b.comment c " + "where b.id = :id ", Book.class) .setParameter("id", id) .getResultList(); + em.clear(); return (books != null) ? books.get(0) : null; } @@ -46,16 +45,21 @@ public List getAllObjects() { + "from Book b " + "inner join fetch b.author a " + "inner join fetch b.genre g " - + "inner join fetch b.comment c " + "order by b.id ", Book.class) .getResultList(); + em.clear(); return books; } @Override - public int addObject(Book book) { - em.persist(book); + public int save(Book book) { + if (book.getId() == 0) { + em.persist(book); + } else { + em.merge(book); + } + System.out.println("Book saved with id: " + book.getId()); return 1; } @@ -65,23 +69,5 @@ public int deleteObject(long id) { .setParameter("id", id) .executeUpdate(); } - - @Override - public int updateObject(Book book) { - int count = em.createNativeQuery( - "update Book b " - + "set b.add_record_date = :add_record_date, b.caption = :caption, b.author_id = :author_id, b.genre_id = :genre_id, b.description = :description " - + "where b.id = :id ") - .setParameter("add_record_date", new Date()) - .setParameter("caption", book.getCaption()) - .setParameter("author_id", book.getAuthor().getId()) - .setParameter("genre_id", book.getGenre().getId()) - .setParameter("description", book.getDescription()) - .setParameter("id", book.getId()) - .executeUpdate(); - - em.clear(); - return count; - } } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index b7a33e1..49ddac6 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -1,7 +1,7 @@ package ru.otus.mkulikov.app.dao; +import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; -import ru.otus.mkulikov.app.model.Genre; import java.util.List; @@ -16,13 +16,11 @@ public interface CommentDao { T getById(long id); - T getByBookId(long id); + List getByBook(Book book); - List getAllObjects(); + int save(T t); - int addObject(T t); + List getAllObjects(); int deleteObject(long id); - - int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java index bba522a..94a313d 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; -import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import javax.persistence.EntityManager; @@ -28,36 +28,47 @@ public class CommentDaoJpa implements CommentDao { @Override public Comment getById(long id) { - List list = em.createQuery("select a from Comment a where a.id = :id", Comment.class) + List list = em.createQuery( + "select c " + + "from Comment c " + + "inner join fetch c.book b " + + "where c.id = :id", Comment.class) .setParameter("id", id) .getResultList(); - // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных - // не хочу ошибку, хочу null + em.clear(); return (list != null && !list.isEmpty()) ? list.get(0) : null; } @Override - public Comment getByBookId(long bookId) { - List list = em.createQuery("select a from Comment a where a.bookId = :bookId", Comment.class) - .setParameter("bookId", bookId) + public List getByBook(Book book) { + List list = em.createQuery( + "select c " + + "from Comment c " + + "inner join fetch c.book b " + + "where c.book = :book", Comment.class) + .setParameter("book", book) .getResultList(); - // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных - // не хочу ошибку, хочу null - return (list != null && !list.isEmpty()) ? list.get(0) : null; + em.clear(); + return list; } @Override - public List getAllObjects() { - return em.createQuery("select a from Comment a order by a.id", Comment.class) - .getResultList(); + public int save(Comment comment) { + if (comment.getId() == 0) { + em.persist(comment); + } else { + em.merge(comment); + } + System.out.println("Comment saved with id: " + comment.getId()); + return 1; } @Override - public int addObject(Comment comment) { - em.persist(comment); - return 1; + public List getAllObjects() { + return em.createQuery("select a from Comment a order by a.id", Comment.class) + .getResultList(); } @Override @@ -66,17 +77,4 @@ public int deleteObject(long id) { .setParameter("id", id) .executeUpdate(); } - - @Override - public int updateObject(Comment comment) { - int count = em.createQuery("update Comment a set a.addRecordDate = :addRecordDate, a.userName = :userName , a.text = :text where a.id = :id ") - .setParameter("addRecordDate", comment.getAddRecordDate()) - .setParameter("userName", comment.getUserName()) - .setParameter("text", comment.getText()) - .setParameter("id", comment.getId()) - .executeUpdate(); - - em.clear(); - return count; - } } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 348b84d..4121f3f 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -17,9 +17,7 @@ public interface GenreDao { List getAllObjects(); - int addObject(T t); + int save(T t); int deleteObject(long id); - - int updateObject(T t); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java index 17331a5..f487fd2 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java @@ -27,24 +27,37 @@ public class GenreDaoJpa implements GenreDao { @Override public Genre getById(long id) { - List list = em.createQuery("select g from Genre g where g.id = :id ", Genre.class) + List list = em.createQuery( + "select g " + + "from Genre g " + + "where g.id = :id ", Genre.class) .setParameter("id", id) .getResultList(); - // не использую getSingleResult, т.к. он возвращает ошибку, если нет данных - // не хочу ошибку, хочу null + em.clear(); return (list != null && !list.isEmpty()) ? list.get(0) : null; } @Override public List getAllObjects() { - return em.createQuery("select g from Genre g order by g.id", Genre.class) + List list = em.createQuery( + "select g " + + "from Genre g " + + "order by g.id", Genre.class) .getResultList(); + + em.clear(); + return list; } @Override - public int addObject(Genre genre) { - em.persist(genre); + public int save(Genre genre) { + if (genre.getId() == 0) { + em.persist(genre); + } else { + em.merge(genre); + } + System.out.println("Genre saved with id: " + genre.getId()); return 1; } @@ -54,15 +67,4 @@ public int deleteObject(long id) { .setParameter("id", id) .executeUpdate(); } - - @Override - public int updateObject(Genre genre) { - int count = em.createQuery("update Genre g set g.name = :name where g.id = :id ") - .setParameter("name", genre.getName()) - .setParameter("id", genre.getId()) - .executeUpdate(); - - em.clear(); - return count; - } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 9aefa3b..17cdc5c 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -3,9 +3,12 @@ import lombok.Data; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; import javax.persistence.*; import java.util.Date; +import java.util.List; /** * Created by IntelliJ IDEA. @@ -31,10 +34,6 @@ public class Book { @Column(name = "DESCRIPTION") private String description; -// @Fetch(FetchMode.JOIN) -// @ManyToOne(optional=false, fetch = FetchType.EAGER) -// private Comment comment; - @Fetch(FetchMode.JOIN) @ManyToOne(optional=false, fetch = FetchType.EAGER) private Author author; @@ -43,6 +42,10 @@ public class Book { @ManyToOne(optional=false, fetch = FetchType.EAGER) private Genre genre; + @OneToMany(mappedBy = "book", fetch = FetchType.LAZY) + @OnDelete(action = OnDeleteAction.CASCADE) + private List comments; + public Book() { } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java index 00424b9..dd7a0a5 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Comment.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -1,6 +1,8 @@ package ru.otus.mkulikov.app.model; import lombok.Data; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; import javax.persistence.*; import java.util.Date; @@ -22,26 +24,32 @@ public class Comment { @SequenceGenerator(name = "sq_comment", sequenceName = "sq_comment", allocationSize = 1) @Column(name = "ID") private long id; - @Column(name = "BOOK_ID") - private long bookId; @Column(name = "ADD_RECORD_DATE") + @Temporal(TemporalType.TIMESTAMP) private Date addRecordDate; @Column(name = "USER_NAME") private String userName; @Column(name = "TEXT") private String text; - public Comment(long id, long bookId, Date addRecordDate, String userName, String text) { + @Fetch(FetchMode.JOIN) + @ManyToOne(optional=false, fetch = FetchType.EAGER) + private Book book; + + public Comment() { + } + + public Comment(long id, Book book, Date addRecordDate, String userName, String text) { this.id = id; - this.bookId = bookId; + this.book = book; this.addRecordDate = addRecordDate; this.userName = userName; this.text = text; } - public Comment(long bookId, Date addRecordDate, String userName, String text) { + public Comment(Book book, Date addRecordDate, String userName, String text) { this.id = 0L; - this.bookId = bookId; + this.book = book; this.addRecordDate = addRecordDate; this.userName = userName; this.text = text; @@ -51,7 +59,6 @@ public Comment(long bookId, Date addRecordDate, String userName, String text) { public String toString() { return "Comment{" + "id=" + id + - ", bookId=" + bookId + ", addRecordDate=" + addRecordDate + ", userName=" + userName + ", text='" + text + '\'' + diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index 63632f9..f0bd226 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -32,12 +32,12 @@ public List getAuthors() { @Override public int addAuthor(String surname, String firstName, String secondName) { - return authorDao.addObject(new Author(surname, firstName, secondName)); + return authorDao.save(new Author(surname, firstName, secondName)); } @Override public int updateAuthor(long id, String surname, String firstName, String secondName) { - return authorDao.updateObject(new Author(id, surname, firstName, secondName)); + return authorDao.save(new Author(id, surname, firstName, secondName)); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index faf01b2..94a97f1 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -4,11 +4,9 @@ import org.springframework.stereotype.Service; import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; -import ru.otus.mkulikov.app.dao.CommentDao; import ru.otus.mkulikov.app.dao.GenreDao; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.model.Genre; import java.util.List; @@ -43,7 +41,7 @@ public int addBook(String caption, int authorId, int genreId, String description Author author = authorDao.getById(authorId); Genre genre = genreDao.getById(genreId); - return bookDao.addObject(new Book(caption, author, genre, description)); + return bookDao.save(new Book(caption, author, genre, description)); } @Override @@ -51,7 +49,7 @@ public int updateBook(long id, String caption, int authorId, int genreId, String Author author = authorDao.getById(authorId); Genre genre = genreDao.getById(genreId); - return bookDao.updateObject(new Book(id, caption, author, genre, description)); + return bookDao.save(new Book(id, caption, author, genre, description)); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java index 2565a14..5c9e5e7 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.app.service; import ru.otus.mkulikov.app.model.Comment; -import ru.otus.mkulikov.app.model.Genre; import java.util.List; @@ -17,9 +16,11 @@ public interface CommentManageService { List getComments(); + List getCommentsByBookId(long bookId); + int addComment(long bookId, String userName, String text); - int updateComment(long id, long bookId, String userName, String text); + int updateComment(long id, String userName, String text); int deleteComment(long id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index 9b21664..591e132 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -2,10 +2,10 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.CommentDao; -import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; -import ru.otus.mkulikov.app.model.Genre; import java.util.Date; import java.util.List; @@ -22,6 +22,7 @@ public class CommentManageServiceImpl implements CommentManageService { private final CommentDao commentDao; + private final BookDao bookDao; @Override public Comment getCommentById(long id) { @@ -33,14 +34,28 @@ public List getComments() { return commentDao.getAllObjects(); } + @Override + public List getCommentsByBookId(long bookId) { + Book book = bookDao.getById(bookId); + + return commentDao.getByBook(book); + } + @Override public int addComment(long bookId, String userName, String text) { - return commentDao.addObject(new Comment(bookId, new Date(), userName, text)); + Book book = bookDao.getById(bookId); + + return commentDao.save(new Comment(book, new Date(), userName, text)); } @Override - public int updateComment(long id, long bookId, String userName, String text) { - return commentDao.updateObject(new Comment(id, bookId, new Date(), userName, text)); + public int updateComment(long id, String userName, String text) { + Comment comment = commentDao.getById(id); + comment.setAddRecordDate(new Date()); + comment.setUserName(userName); + comment.setText(text); + + return commentDao.save(comment); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index f0b56a6..2cf897a 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -32,12 +32,12 @@ public List getGenres() { @Override public int addGenre(String name) { - return genreDao.addObject(new Genre(name)); + return genreDao.save(new Genre(name)); } @Override public int updateGenre(long id, String name) { - return genreDao.updateObject(new Genre(id, name)); + return genreDao.save(new Genre(id, name)); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java index 2507a0a..ffbce20 100644 --- a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java +++ b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java @@ -15,8 +15,15 @@ public class DateUtil { private final static String DATE_FORMAT = "yyyy-MM-dd"; + private final static String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + public static String dateToString(Date date) { DateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT); return date != null ? dateFormat.format(date) : null; } + + public static String dateTimeToString(Date date) { + DateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT); + return date != null ? dateFormat.format(date) : null; + } } diff --git a/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java b/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java new file mode 100644 index 0000000..3965c34 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java @@ -0,0 +1,60 @@ +package ru.otus.mkulikov.shell; + +import lombok.RequiredArgsConstructor; +import org.springframework.shell.standard.ShellComponent; +import org.springframework.shell.standard.ShellMethod; +import org.springframework.shell.standard.ShellOption; +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.service.CommentManageService; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 14:47 + */ + +@ShellComponent +@RequiredArgsConstructor +public class CommentCommands { + + private final CommentManageService commentManageService; + + @ShellMethod(key = {"getCommentById"}, value = "Select comment by id.") + public String getCommentById(@ShellOption long id) { + Comment comment = commentManageService.getCommentById(id); + return comment.toString(); + } + + @ShellMethod(key = {"getComments"}, value = "Select all comments.") + public String getComments() { + List allObjects = commentManageService.getComments(); + return allObjects.toString(); + } + + @ShellMethod(key = {"getCommentsByBookId"}, value = "Select all comments.") + public String getCommentsByBookId(@ShellOption long bookId) { + List allObjects = commentManageService.getCommentsByBookId(bookId); + return allObjects.toString(); + } + + @ShellMethod(key = {"addComment"}, value = "Add new comment.") + public String addComment(@ShellOption long bookId, @ShellOption String userName, @ShellOption String text) { + int count = commentManageService.addComment(bookId, userName, text); + return "Add " + count + " row(s)"; + } + + @ShellMethod(key = {"updateComment"}, value = "Update comment by id.") + public String updateComment(@ShellOption long id, @ShellOption String userName, @ShellOption String text) { + int count = commentManageService.updateComment(id, userName, text); + return "Updated " + count + " row(s)"; + } + + @ShellMethod(key = {"deleteComment"}, value = "Delete comment by id.") + public String deleteComment(@ShellOption long id) { + int count = commentManageService.deleteComment(id); + return "Deleted " + count + " row(s)"; + } +} diff --git a/src/main/resources/data-h2.sql b/src/main/resources/data-h2.sql index eb74cd6..bca97c4 100644 --- a/src/main/resources/data-h2.sql +++ b/src/main/resources/data-h2.sql @@ -27,13 +27,13 @@ values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'de -------------------------- insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 1, to_date('2019-01-01','YYYY-MM-DD'), 'user1', 'text1'); +values (sq_comment.nextval, 1, to_date('2019-01-01 10:01:01','YYYY-MM-DD HH24-MI-SS'), 'user1', 'text1'); insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 1, to_date('2019-01-01','YYYY-MM-DD'), 'user2', 'text2'); +values (sq_comment.nextval, 1, to_date('2019-01-01 10:01:02','YYYY-MM-DD HH24-MI-SS'), 'user2', 'text2'); insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 2, to_date('2019-01-01','YYYY-MM-DD'), 'user3', 'text3'); +values (sq_comment.nextval, 2, to_date('2019-01-01 10:01:03','YYYY-MM-DD HH24-MI-SS'), 'user3', 'text3'); insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 2, to_date('2019-01-01','YYYY-MM-DD'), 'user4', 'text4'); \ No newline at end of file +values (sq_comment.nextval, 2, to_date('2019-01-01 10:01:04','YYYY-MM-DD HH24-MI-SS'), 'user4', 'text4'); \ No newline at end of file diff --git a/src/main/resources/schema-h2.sql b/src/main/resources/schema-h2.sql index d8d9c5c..7156478 100644 --- a/src/main/resources/schema-h2.sql +++ b/src/main/resources/schema-h2.sql @@ -30,11 +30,11 @@ CREATE TABLE BOOK( CREATE TABLE COMMENT( ID NUMBER(20,0) PRIMARY KEY not null, BOOK_ID NUMBER(20,0) not null, - ADD_RECORD_DATE DATE default sysdate, + ADD_RECORD_DATE TIMESTAMP default sysdate, USER_NAME VARCHAR(20), TEXT VARCHAR(500), - foreign key (BOOK_ID) references BOOK(ID) + foreign key (BOOK_ID) references BOOK(ID) ON DELETE CASCADE ); CREATE SEQUENCE sq_author minvalue 1 start with 1 increment by 1; diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 96ebe9d..3ec510f 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -66,7 +66,7 @@ void getAllObjects() { @DisplayName("Добавление автора") void addObject() { Author author = new Author("TestSurname", "TestFirstName", "TestSecondName"); - int count = authorDaoJpa.addObject(author); + int count = authorDaoJpa.save(author); Author author_selected = authorDaoJpa.getById(4L); assertAll( @@ -90,7 +90,7 @@ void deleteObject() { @DisplayName("Обновление автора") void updateObject() { Author author1 = authorDaoJpa.getById(1L); - int count = authorDaoJpa.updateObject( + int count = authorDaoJpa.save( new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") ); Author author2 = authorDaoJpa.getById(1L); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 6958758..6c1e247 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -51,7 +51,7 @@ void getById() { () -> assertEquals("book_1", book.getCaption()), () -> assertEquals(1, book.getAuthor().getId()), () -> assertEquals(1, book.getGenre().getId()), - () -> assertEquals("comment", book.getComment()) + () -> assertEquals("description", book.getDescription()) ); } @@ -73,7 +73,7 @@ void getAllObjects() { @Test @DisplayName("Добавление книги") void addObject() { - int count = bookDaoJpa.addObject(getNewBook()); + int count = bookDaoJpa.save(getNewBook()); Book book = bookDaoJpa.getById(4L); assertAll( @@ -84,7 +84,7 @@ void addObject() { () -> assertEquals("Test_Book", book.getCaption()), () -> assertEquals(1, book.getAuthor().getId()), () -> assertEquals(1, book.getGenre().getId()), - () -> assertEquals("Test_Comment", book.getComment()) + () -> assertEquals("Test_Description", book.getDescription()) ); } @@ -104,28 +104,28 @@ void deleteObject() { @DisplayName("Обновление книги") void updateObject() { Book book1 = bookDaoJpa.getById(1L); - int count = bookDaoJpa.updateObject(getUpdatedBook()); + int count = bookDaoJpa.save(getUpdatedBook()); Book book2 = bookDaoJpa.getById(1L); assertAll( "book", () -> assertEquals(1, count), () -> assertEquals("book_1", book1.getCaption()), - () -> assertEquals("comment", book1.getComment()), + () -> assertEquals("description", book1.getDescription()), () -> assertEquals("Test_Book", book2.getCaption()), - () -> assertEquals("Test_Comment", book2.getComment()) + () -> assertEquals("Test_Description", book2.getDescription()) ); } private Book getNewBook() { Author author = authorDao.getById(1); Genre genre = genreDao.getById(1); - return new Book("Test_Book", author, genre, "Test_Comment"); + return new Book("Test_Book", author, genre, "Test_Description"); } private Book getUpdatedBook() { Author author = authorDao.getById(1); Genre genre = genreDao.getById(1); - return new Book(1L,"Test_Book", author, genre, "Test_Comment"); + return new Book(1L,"Test_Book", author, genre, "Test_Description"); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java new file mode 100644 index 0000000..3336556 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java @@ -0,0 +1,139 @@ +package ru.otus.mkulikov.app.dao; + +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.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.utils.DateUtil; + +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 28.05.2019 + * Time: 9:45 + */ + +@DisplayName("Класс CommentDaoJpa") +@RunWith(SpringRunner.class) +@Import({CommentDaoJpa.class, BookDaoJpa.class}) +@DataJpaTest +@TestPropertySource(locations= "classpath:application.yml") +class CommentDaoJpaTest { + + @Autowired + private BookDao bookDaoJpa; + @Autowired + private CommentDao commentDaoJpa; + + @Test + @DisplayName("Получение комментария по id") + void getById() { + Comment comment = commentDaoJpa.getById(1L); + + assertAll( + "comment", + () -> assertNotNull(comment), + () -> assertNotNull(comment.getBook()), + () -> assertEquals(1L, comment.getId()), + () -> assertEquals("user1", comment.getUserName()), + () -> assertEquals("2019-01-01 10:01:01", DateUtil.dateTimeToString(comment.getAddRecordDate())), + () -> assertEquals("text1", comment.getText()) + ); + } + + @Test + @DisplayName("Получение всех комментариев") + void getAllObjects() { + List comments = commentDaoJpa.getAllObjects(); + + assertAll( + "comments", + () -> assertNotNull(comments), + () -> assertEquals(4, comments.size()), + () -> assertEquals("text1", comments.get(0).getText()), + () -> assertEquals("text2", comments.get(1).getText()), + () -> assertEquals("text3", comments.get(2).getText()), + () -> assertEquals("text4", comments.get(3).getText()) + ); + } + + @Test + @DisplayName("Получение всех комментариев для книги") + void getObjectsByBook() { + Book book = bookDaoJpa.getById(1L); + List comments = commentDaoJpa.getByBook(book); + + assertAll( + "comments", + () -> assertNotNull(comments), + () -> assertEquals(2, comments.size()), + () -> assertEquals("text1", comments.get(0).getText()), + () -> assertEquals("text2", comments.get(1).getText()) + ); + } + + @Test + @DisplayName("Добавление комментария") + void addObject() { + Date date = new Date(); + Book book = bookDaoJpa.getById(1L); + int count = commentDaoJpa.save(new Comment(book, date, "user5", "text5")); + + Comment comment = commentDaoJpa.getById(5L); + + assertAll( + "comment", + () -> assertNotNull(comment), + () -> assertNotNull(comment.getBook()), + () -> assertEquals(1, count), + () -> assertEquals(5L, comment.getId()), + () -> assertEquals(date, comment.getAddRecordDate()), + () -> assertEquals("user5", comment.getUserName()), + () -> assertEquals("text5", comment.getText()) + ); + } + + @Test + @DisplayName("Удаление комментария") + void deleteObject() { + commentDaoJpa.deleteObject(1L); + assertNull(commentDaoJpa.getById(1L)); + } + + @Test + @DisplayName("Обновление комментария") + void updateObject() { + Comment comment1 = commentDaoJpa.getById(1L); + + Date date = new Date(); + int count = commentDaoJpa.save(new Comment(1L, comment1.getBook(), date, "TestUser", "TestText")); + + Comment comment2 = commentDaoJpa.getById(1L); + + assertAll( + "comment", + () -> assertNotNull(comment1), + () -> assertNotNull(comment2), + () -> assertNotNull(comment1.getBook()), + () -> assertNotNull(comment2.getBook()), + () -> assertEquals(1, count), + () -> assertEquals("user1", comment1.getUserName()), + () -> assertEquals("text1", comment1.getText()), + () -> assertEquals(date, comment2.getAddRecordDate()), + () -> assertEquals("TestUser", comment2.getUserName()), + () -> assertEquals("TestText", comment2.getText()) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index ab25d87..a91800e 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -63,7 +63,7 @@ void getAllObjects() { @Test @DisplayName("Добавление жанра") void addObject() { - int count = genreDaoJpa.addObject(new Genre("Test4")); + int count = genreDaoJpa.save(new Genre("Test4")); Genre genre = genreDaoJpa.getById(4L); @@ -86,7 +86,7 @@ void deleteObject() { @DisplayName("Обновление жанра") void updateObject() { Genre genre1 = genreDaoJpa.getById(1L); - int count = genreDaoJpa.updateObject(new Genre(1L, "UpdatedName")); + int count = genreDaoJpa.save(new Genre(1L, "UpdatedName")); Genre genre2 = genreDaoJpa.getById(1L); assertAll( diff --git a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java index 291acd0..1276d90 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java @@ -25,7 +25,7 @@ class DateUtilTest { @Test @DisplayName("Формат даты 'yyyy-MM-dd'") - void getAddRecordDateString() { + void dateToString() { Book book = getNewBook(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); @@ -36,6 +36,19 @@ void getAddRecordDateString() { ); } + @Test + @DisplayName("Формат даты 'yyyy-MM-dd HH:mm:ss'") + void dateTimeToString() { + Book book = getNewBook(); + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + assertAll( + "book", + () -> assertNotNull(book), + () -> assertEquals(dateFormat.format(new Date()), DateUtil.dateTimeToString(book.getAddRecordDate())) + ); + } + private Book getNewBook() { Author author = new Author(1L, "TestSurname", "TestFirstName", "TestSecondName"); Genre genre = new Genre("Test4"); diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index d017f57..5dbb053 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -47,7 +47,7 @@ void getBookById() { () -> assertEquals("book_1", book.getCaption()), () -> assertEquals(1, book.getAuthor().getId()), () -> assertEquals(1, book.getGenre().getId()), - () -> assertEquals("comment", book.getComment()) + () -> assertEquals("description", book.getDescription()) ); } @@ -69,7 +69,7 @@ void getBooks() { @Test @DisplayName("Добавление книги") void addBook() { - int count = booksManageSevice.addBook("Test_Book", 2, 3, "Test_Comment"); + int count = booksManageSevice.addBook("Test_Book", 2, 3, "Test_Description"); Book book = booksManageSevice.getBookById(4L); assertAll( @@ -80,7 +80,7 @@ void addBook() { () -> assertEquals("Test_Book", book.getCaption()), () -> assertEquals(2, book.getAuthor().getId()), () -> assertEquals(3, book.getGenre().getId()), - () -> assertEquals("Test_Comment", book.getComment()) + () -> assertEquals("Test_Description", book.getDescription()) ); } @@ -88,16 +88,16 @@ void addBook() { @DisplayName("Обновление книги") void updateBook() { Book book1 = booksManageSevice.getBookById(1L); - int count = booksManageSevice.updateBook(1L, "Test_Book", 2, 3, "Test_Comment"); + int count = booksManageSevice.updateBook(1L, "Test_Book", 2, 3, "Test_Description"); Book book2 = booksManageSevice.getBookById(1L); assertAll( "book", () -> assertEquals(1, count), () -> assertEquals("book_1", book1.getCaption()), - () -> assertEquals("comment", book1.getComment()), + () -> assertEquals("description", book1.getDescription()), () -> assertEquals("Test_Book", book2.getCaption()), - () -> assertEquals("Test_Comment", book2.getComment()) + () -> assertEquals("Test_Description", book2.getDescription()) ); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java new file mode 100644 index 0000000..e641616 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -0,0 +1,126 @@ +package ru.otus.mkulikov.app.service; + +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.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.utils.DateUtil; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 30.05.2019 + * Time: 15:56 + */ + +@DisplayName("Класс CommentManageSevice") +@RunWith(SpringRunner.class) +@ComponentScan("ru.otus.mkulikov.app") +@DataJpaTest +@TestPropertySource(locations= "classpath:application.yml") +class CommentManageSeviceImplTest { + + @Autowired + private CommentManageService commentManageService; + + @Test + @DisplayName("Получение комментария по id") + void getCommentById() { + Comment comment = commentManageService.getCommentById(1L); + + assertAll( + "comment", + () -> assertNotNull(comment), + () -> assertNotNull(comment.getBook()), + () -> assertEquals(1L, comment.getId()), + () -> assertEquals("user1", comment.getUserName()), + () -> assertEquals("2019-01-01 10:01:01", DateUtil.dateTimeToString(comment.getAddRecordDate())), + () -> assertEquals("text1", comment.getText()) + ); + } + + @Test + @DisplayName("Получение всех комментариев") + void getComments() { + List comments = commentManageService.getComments(); + + assertAll( + "comments", + () -> assertNotNull(comments), + () -> assertEquals(4, comments.size()), + () -> assertEquals("text1", comments.get(0).getText()), + () -> assertEquals("text2", comments.get(1).getText()), + () -> assertEquals("text3", comments.get(2).getText()), + () -> assertEquals("text4", comments.get(3).getText()) + ); + } + + @Test + @DisplayName("Добавление комментария") + void addComment() { + int count = commentManageService.addComment(1L, "user5", "text5"); + + Comment comment = commentManageService.getCommentById(5L); + + assertAll( + "comment", + () -> assertNotNull(comment), + () -> assertNotNull(comment.getBook()), + () -> assertEquals(1, count), + () -> assertEquals(5L, comment.getId()), + () -> assertEquals("user5", comment.getUserName()), + () -> assertEquals("text5", comment.getText()) + ); + } + + @Test + @DisplayName("Получение комментариев по Id книги") + void getCommentsByBookId() { + List comments = commentManageService.getCommentsByBookId(1L); + + assertAll( + "comments", + () -> assertNotNull(comments), + () -> assertEquals(2, comments.size()), + () -> assertEquals("text1", comments.get(0).getText()), + () -> assertEquals("text2", comments.get(1).getText()) + ); + } + + @Test + @DisplayName("Обновление комментария") + void updateComment() { + Comment comment1 = commentManageService.getCommentById(1L); + int count = commentManageService.updateComment(1L, "TestUser", "TestText"); + Comment comment2 = commentManageService.getCommentById(1L); + + assertAll( + "comment", + () -> assertNotNull(comment1), + () -> assertNotNull(comment2), + () -> assertNotNull(comment1.getBook()), + () -> assertNotNull(comment2.getBook()), + () -> assertEquals(1, count), + () -> assertEquals("user1", comment1.getUserName()), + () -> assertEquals("text1", comment1.getText()), + () -> assertEquals("TestUser", comment2.getUserName()), + () -> assertEquals("TestText", comment2.getText()) + ); + } + + @Test + @DisplayName("Удаление комментария") + void deleteComment() { + commentManageService.deleteComment(1L); + assertNull(commentManageService.getCommentById(1L)); + } +} diff --git a/src/test/resources/data-test.sql b/src/test/resources/data-test.sql index e1ff332..75ebe2d 100644 --- a/src/test/resources/data-test.sql +++ b/src/test/resources/data-test.sql @@ -15,13 +15,25 @@ insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre3'); -------------------------- -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'description'); -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'description'); -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, COMMENT) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'comment'); +insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) +values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'description'); -------------------------- + +insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) +values (sq_comment.nextval, 1, to_date('2019-01-01 10:01:01','YYYY-MM-DD HH24-MI-SS'), 'user1', 'text1'); + +insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) +values (sq_comment.nextval, 1, to_date('2019-01-01 10:01:02','YYYY-MM-DD HH24-MI-SS'), 'user2', 'text2'); + +insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) +values (sq_comment.nextval, 2, to_date('2019-01-01 10:01:03','YYYY-MM-DD HH24-MI-SS'), 'user3', 'text3'); + +insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) +values (sq_comment.nextval, 2, to_date('2019-01-01 10:01:04','YYYY-MM-DD HH24-MI-SS'), 'user4', 'text4'); \ No newline at end of file diff --git a/src/test/resources/schema-test.sql b/src/test/resources/schema-test.sql index 8f77a94..7156478 100644 --- a/src/test/resources/schema-test.sql +++ b/src/test/resources/schema-test.sql @@ -1,31 +1,43 @@ DROP TABLE IF EXISTS BOOK; DROP TABLE IF EXISTS AUTHOR; DROP TABLE IF EXISTS GENRE; +DROP TABLE IF EXISTS COMMENT; CREATE TABLE AUTHOR( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, SURNAME VARCHAR(100) not null, FIRST_NAME VARCHAR(100) not null, SECOND_NAME VARCHAR(100) ); CREATE TABLE GENRE( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, NAME VARCHAR(100) not null ); CREATE TABLE BOOK( - ID NUMBER(22,0) PRIMARY KEY not null, + ID NUMBER(20,0) PRIMARY KEY not null, ADD_RECORD_DATE DATE default sysdate, CAPTION VARCHAR(255) not null, - AUTHOR_ID NUMBER(22,0) not null, - GENRE_ID NUMBER(22,0) not null, - COMMENT VARCHAR(255), + AUTHOR_ID NUMBER(20,0) not null, + GENRE_ID NUMBER(20,0) not null, + DESCRIPTION VARCHAR(255), foreign key (AUTHOR_ID) references AUTHOR(ID), foreign key (GENRE_ID) references GENRE(ID) ); +CREATE TABLE COMMENT( + ID NUMBER(20,0) PRIMARY KEY not null, + BOOK_ID NUMBER(20,0) not null, + ADD_RECORD_DATE TIMESTAMP default sysdate, + USER_NAME VARCHAR(20), + TEXT VARCHAR(500), + + foreign key (BOOK_ID) references BOOK(ID) ON DELETE CASCADE +); + CREATE SEQUENCE sq_author minvalue 1 start with 1 increment by 1; CREATE SEQUENCE sq_genre minvalue 1 start with 1 increment by 1; CREATE SEQUENCE sq_book minvalue 1 start with 1 increment by 1; +CREATE SEQUENCE sq_comment minvalue 1 start with 1 increment by 1; \ No newline at end of file From f8d243346313933ac37c3bb6bad14bb958b6dfb7 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 22 Jun 2019 14:18:19 +0300 Subject: [PATCH 32/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=B2=D1=8B=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BA=D0=BD=D0=B8=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java | 6 ++++-- src/main/java/ru/otus/mkulikov/app/model/Book.java | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java index fbeb9a0..dad9f26 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java @@ -27,10 +27,11 @@ public class BookDaoJpa implements BookDao { @Override public Book getById(long id) { - List books = em.createQuery("select b " + List books = em.createQuery("select distinct b " + "from Book b " + "inner join fetch b.author a " + "inner join fetch b.genre g " + + "left join b.comments c " + "where b.id = :id ", Book.class) .setParameter("id", id) .getResultList(); @@ -41,10 +42,11 @@ public Book getById(long id) { @Override public List getAllObjects() { - List books = em.createQuery("select b " + List books = em.createQuery("select distinct b " + "from Book b " + "inner join fetch b.author a " + "inner join fetch b.genre g " + + "left join b.comments c " + "order by b.id ", Book.class) .getResultList(); diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 17cdc5c..7586ff6 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -42,6 +42,7 @@ public class Book { @ManyToOne(optional=false, fetch = FetchType.EAGER) private Genre genre; + @Fetch(FetchMode.JOIN) @OneToMany(mappedBy = "book", fetch = FetchType.LAZY) @OnDelete(action = OnDeleteAction.CASCADE) private List comments; @@ -83,6 +84,7 @@ public String toString() { ", description=" + description + ", author=" + author + ", genre=" + genre + + ", comments=" + (comments != null ? comments : "none") + "}\n"; } } From 2e578aa6621e0472382ec5543ff43ffe7f18e8cb Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 22 Jun 2019 23:35:47 +0300 Subject: [PATCH 33/70] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4=20Data=20Jp?= =?UTF-8?q?a.=20-=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20liquibase.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- pom.xml | 32 ++++ .../java/ru/otus/mkulikov/Application.java | 1 - .../ru/otus/mkulikov/app/dao/BookDao.java | 1 - .../app/service/BookManageSeviceImpl.java | 2 - src/main/resources/application.yml | 3 + .../1.0/2019-06-22--0001-schema.yaml | 153 ++++++++++++++++++ .../db/changelog/data/0001-chema-data.yaml | 14 ++ .../{ => db/changelog/data/sql}/data-h2.sql | 0 .../db/changelog/db.changelog-master.yaml | 5 + src/main/resources/schema-h2.sql | 43 ----- .../mkulikov/app/dao/AuthorDaoJpaTest.java | 9 +- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 8 +- .../service/AuthorManageSeviceImplTest.java | 10 +- src/test/resources/application.yml | 2 + .../1.0/2019-06-22--0001-schema.yaml | 153 ++++++++++++++++++ .../db/changelog/data/0001-chema-data.yaml | 14 ++ .../changelog/data/sql/data-h2.sql} | 0 .../db/changelog/db.changelog-master.yaml | 5 + src/test/resources/schema-test.sql | 43 ----- 20 files changed, 401 insertions(+), 102 deletions(-) create mode 100644 src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml create mode 100644 src/main/resources/db/changelog/data/0001-chema-data.yaml rename src/main/resources/{ => db/changelog/data/sql}/data-h2.sql (100%) create mode 100644 src/main/resources/db/changelog/db.changelog-master.yaml delete mode 100644 src/main/resources/schema-h2.sql create mode 100644 src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml create mode 100644 src/test/resources/db/changelog/data/0001-chema-data.yaml rename src/test/resources/{data-test.sql => db/changelog/data/sql/data-h2.sql} (100%) create mode 100644 src/test/resources/db/changelog/db.changelog-master.yaml delete mode 100644 src/test/resources/schema-test.sql diff --git a/README.md b/README.md index 07ed4c8..14d6a5c 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,7 @@ Домашнее задание #7: - Переделать билиотеку на Spring Data JPA. -- Реализовать весь функционал работы с БД в приложении книг с использованием spring-data-jpa репозиториев. \ No newline at end of file +- Реализовать весь функционал работы с БД в приложении книг с использованием spring-data-jpa репозиториев. + +### 19-06-22 Доработки +- Подключил liquibase. \ No newline at end of file diff --git a/pom.xml b/pom.xml index adbdd0f..b8ee082 100644 --- a/pom.xml +++ b/pom.xml @@ -109,6 +109,11 @@ 1.4.199 + + org.liquibase + liquibase-core + + org.springframework.boot @@ -151,6 +156,32 @@ org.springframework.boot spring-boot-maven-plugin + + + org.liquibase + liquibase-maven-plugin + 3.6.3 + + true + false + classpath:/db/changelog/db.changelog-master.yaml + + + + package + + update + + + + + + org.yaml + snakeyaml + 1.23 + + + @@ -162,6 +193,7 @@ **/*.txt **/*.yml **/*.sql + **/*.yaml false diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index ceae852..9c2f534 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov; -import org.h2.tools.Console; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index cd12179..58aaf0f 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.app.dao; -import org.springframework.data.repository.CrudRepository; import ru.otus.mkulikov.app.model.Book; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 57f4d56..5c4c9fc 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -5,9 +5,7 @@ import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.GenreDao; -import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Genre; import java.util.List; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 91ca387..1184619 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -14,3 +14,6 @@ spring: hibernate: show_sql: false format_sql: false + + liquibase: + enabled: true \ No newline at end of file diff --git a/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml b/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml new file mode 100644 index 0000000..42aad48 --- /dev/null +++ b/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml @@ -0,0 +1,153 @@ +databaseChangeLog: +- changeSet: + id: 2019-06-22--0001-schema-author + author: KulikovMV + createTable: + tableName: author + columns: + - column: + name: id + type: number(20,0) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_author + - column: + name: surname + type: varchar(100) + constraints: + nullable: false + - column: + name: first_name + type: varchar(100) + constraints: + nullable: false + - column: + name: second_name + type: varchar(100) +- changeSet: + id: 2019-06-22--0001-schema-genre + author: KulikovMV + createTable: + tableName: genre + columns: + - column: + name: id + type: number(20,0) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_genre + - column: + name: name + type: varchar(100) + constraints: + nullable: false +- changeSet: + id: 2019-06-22--0001-schema-book + author: KulikovMV + createTable: + tableName: book + columns: + - column: + name: id + type: number(20,0) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_book + - column: + name: add_record_date + type: date + defaultValueDate: sysdate + constraints: + nullable: false + - column: + name: caption + type: varchar(255) + constraints: + nullable: false + - column: + name: author_id + type: number(20,0) + constraints: + nullable: false + foreignKeyName: fk_author + references: author(id) + - column: + name: genre_id + type: number(20,0) + constraints: + nullable: false + foreignKeyName: fk_genre + references: genre(id) + - column: + name: description + type: varchar(255) + constraints: + nullable: false +- changeSet: + id: 2019-06-22--0001-schema-comment + author: KulikovMV + createTable: + tableName: comment + columns: + - column: + name: id + type: number(20,0) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_comment + - column: + name: book_id + type: number(20,0) + constraints: + nullable: false + foreignKeyName: fk_comment + references: book(id) + onDelete: cascade + - column: + name: add_record_date + type: date + defaultValueDate: sysdate + constraints: + nullable: false + - column: + name: user_name + type: varchar(20) + constraints: + nullable: false + - column: + name: text + type: varchar(500) + constraints: + nullable: false +- changeSet: + id: 2019-06-22--0001-schema-sequences + author: KulikovMV + changes: + - createSequence: + cycle: true + incrementBy: 1 + ordered: true + sequenceName: sq_author + startValue: 1 + - createSequence: + cycle: true + incrementBy: 1 + ordered: true + sequenceName: sq_genre + startValue: 1 + - createSequence: + cycle: true + incrementBy: 1 + ordered: true + sequenceName: sq_book + startValue: 1 + - createSequence: + cycle: true + incrementBy: 1 + ordered: true + sequenceName: sq_comment + startValue: 1 diff --git a/src/main/resources/db/changelog/data/0001-chema-data.yaml b/src/main/resources/db/changelog/data/0001-chema-data.yaml new file mode 100644 index 0000000..7338565 --- /dev/null +++ b/src/main/resources/db/changelog/data/0001-chema-data.yaml @@ -0,0 +1,14 @@ +databaseChangeLog: +- changeSet: + id: 0001-chema-sql + author: KulikovMV + context: test + changes: + - sqlFile: + dbms: h2, oracle + encoding: utf8 + endDelimiter: ; + path: sql/data-h2.sql + relativeToChangelogFile: true + splitStatements: true + stripComments: true \ No newline at end of file diff --git a/src/main/resources/data-h2.sql b/src/main/resources/db/changelog/data/sql/data-h2.sql similarity index 100% rename from src/main/resources/data-h2.sql rename to src/main/resources/db/changelog/data/sql/data-h2.sql diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml new file mode 100644 index 0000000..dccfd73 --- /dev/null +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -0,0 +1,5 @@ +databaseChangeLog: +- include: + file: db/changelog/1.0/2019-06-22--0001-schema.yaml +- include: + file: db/changelog/data/0001-chema-data.yaml \ No newline at end of file diff --git a/src/main/resources/schema-h2.sql b/src/main/resources/schema-h2.sql deleted file mode 100644 index 7156478..0000000 --- a/src/main/resources/schema-h2.sql +++ /dev/null @@ -1,43 +0,0 @@ -DROP TABLE IF EXISTS BOOK; -DROP TABLE IF EXISTS AUTHOR; -DROP TABLE IF EXISTS GENRE; -DROP TABLE IF EXISTS COMMENT; - -CREATE TABLE AUTHOR( - ID NUMBER(20,0) PRIMARY KEY not null, - SURNAME VARCHAR(100) not null, - FIRST_NAME VARCHAR(100) not null, - SECOND_NAME VARCHAR(100) -); - -CREATE TABLE GENRE( - ID NUMBER(20,0) PRIMARY KEY not null, - NAME VARCHAR(100) not null -); - -CREATE TABLE BOOK( - ID NUMBER(20,0) PRIMARY KEY not null, - ADD_RECORD_DATE DATE default sysdate, - CAPTION VARCHAR(255) not null, - AUTHOR_ID NUMBER(20,0) not null, - GENRE_ID NUMBER(20,0) not null, - DESCRIPTION VARCHAR(255), - - foreign key (AUTHOR_ID) references AUTHOR(ID), - foreign key (GENRE_ID) references GENRE(ID) -); - -CREATE TABLE COMMENT( - ID NUMBER(20,0) PRIMARY KEY not null, - BOOK_ID NUMBER(20,0) not null, - ADD_RECORD_DATE TIMESTAMP default sysdate, - USER_NAME VARCHAR(20), - TEXT VARCHAR(500), - - foreign key (BOOK_ID) references BOOK(ID) ON DELETE CASCADE -); - -CREATE SEQUENCE sq_author minvalue 1 start with 1 increment by 1; -CREATE SEQUENCE sq_genre minvalue 1 start with 1 increment by 1; -CREATE SEQUENCE sq_book minvalue 1 start with 1 increment by 1; -CREATE SEQUENCE sq_comment minvalue 1 start with 1 increment by 1; \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 502aed0..c399568 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -37,6 +37,7 @@ class AuthorDaoJpaTest { private AuthorDao authorDao; @Test + @DisplayName("Получение автора по id") void getById() { Optional author = authorDao.findById(1L); @@ -51,6 +52,7 @@ void getById() { } @Test + @DisplayName("Получение всех авторов") void getAllObjects() { Iterable authors = authorDao.findAll(); List list = StreamSupport @@ -68,6 +70,7 @@ void getAllObjects() { } @Test + @DisplayName("Добавление автора") void addObject() { Author author = authorDao.save(new Author("TestSurname", "TestFirstName", "TestSecondName")); Optional author_selected = authorDao.findById(4L); @@ -83,14 +86,16 @@ void addObject() { } @Test + @DisplayName("Удаление автора, который используется в таблице книг") void deleteObject() { authorDao.deleteById(1L); - Optional author = authorDao.findById(1L); + Author author = authorDao.findById(1L).get(); - assertNotNull(author); +// assertNotNull(author); } @Test + @DisplayName("Обновление автора") void updateObject() { authorDao.save( new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 9454b68..770f3cf 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -119,14 +119,14 @@ void updateObject() { } private Book getNewBook() { - Author author = authorDao.getById(1); - Genre genre = genreDao.getById(1); + Author author = authorDao.findById(1L).get(); + Genre genre = genreDao.findById(1L).get(); return new Book("Test_Book", author, genre, "Test_Description"); } private Book getUpdatedBook() { - Author author = authorDao.getById(1); - Genre genre = genreDao.getById(1); + Author author = authorDao.findById(1L).get(); + Genre genre = genreDao.findById(1L).get(); return new Book(1L,"Test_Book", author, genre, "Test_Description"); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 2203f8c..76097a2 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -82,16 +82,12 @@ void addAuthor() { @Test @DisplayName("Обновление автора") void updateAuthor() { - Author author1 = authorManageService.getAuthorById(1L); int count = authorManageService.updateAuthor(1L, "TestSurname", "TestFirstName", "TestSecondName"); Author author2 = authorManageService.getAuthorById(1L); assertAll( "author", () -> assertEquals(1, count), - () -> assertEquals("Surname", author1.getSurname()), - () -> assertEquals("FirstName", author1.getFirstName()), - () -> assertEquals("SecondName", author1.getSecondName()), () -> assertEquals("TestSurname", author2.getSurname()), () -> assertEquals("TestFirstName", author2.getFirstName()), () -> assertEquals("TestSecondName", author2.getSecondName()) @@ -101,6 +97,10 @@ void updateAuthor() { @Test @DisplayName("Удаление автора, который используется в таблице книг") void deleteAuthor() { - assertThrows(PersistenceException.class, () -> { authorManageService.deleteAuthor(1L); }); + authorManageService.deleteAuthor(1L); + + + + assertThrows(PersistenceException.class, () -> { }); } } diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 6175668..9219289 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -15,3 +15,5 @@ spring: show_sql: true format_sql: true + liquibase: + enabled: true \ No newline at end of file diff --git a/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml b/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml new file mode 100644 index 0000000..42aad48 --- /dev/null +++ b/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml @@ -0,0 +1,153 @@ +databaseChangeLog: +- changeSet: + id: 2019-06-22--0001-schema-author + author: KulikovMV + createTable: + tableName: author + columns: + - column: + name: id + type: number(20,0) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_author + - column: + name: surname + type: varchar(100) + constraints: + nullable: false + - column: + name: first_name + type: varchar(100) + constraints: + nullable: false + - column: + name: second_name + type: varchar(100) +- changeSet: + id: 2019-06-22--0001-schema-genre + author: KulikovMV + createTable: + tableName: genre + columns: + - column: + name: id + type: number(20,0) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_genre + - column: + name: name + type: varchar(100) + constraints: + nullable: false +- changeSet: + id: 2019-06-22--0001-schema-book + author: KulikovMV + createTable: + tableName: book + columns: + - column: + name: id + type: number(20,0) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_book + - column: + name: add_record_date + type: date + defaultValueDate: sysdate + constraints: + nullable: false + - column: + name: caption + type: varchar(255) + constraints: + nullable: false + - column: + name: author_id + type: number(20,0) + constraints: + nullable: false + foreignKeyName: fk_author + references: author(id) + - column: + name: genre_id + type: number(20,0) + constraints: + nullable: false + foreignKeyName: fk_genre + references: genre(id) + - column: + name: description + type: varchar(255) + constraints: + nullable: false +- changeSet: + id: 2019-06-22--0001-schema-comment + author: KulikovMV + createTable: + tableName: comment + columns: + - column: + name: id + type: number(20,0) + constraints: + nullable: false + primaryKey: true + primaryKeyName: pk_comment + - column: + name: book_id + type: number(20,0) + constraints: + nullable: false + foreignKeyName: fk_comment + references: book(id) + onDelete: cascade + - column: + name: add_record_date + type: date + defaultValueDate: sysdate + constraints: + nullable: false + - column: + name: user_name + type: varchar(20) + constraints: + nullable: false + - column: + name: text + type: varchar(500) + constraints: + nullable: false +- changeSet: + id: 2019-06-22--0001-schema-sequences + author: KulikovMV + changes: + - createSequence: + cycle: true + incrementBy: 1 + ordered: true + sequenceName: sq_author + startValue: 1 + - createSequence: + cycle: true + incrementBy: 1 + ordered: true + sequenceName: sq_genre + startValue: 1 + - createSequence: + cycle: true + incrementBy: 1 + ordered: true + sequenceName: sq_book + startValue: 1 + - createSequence: + cycle: true + incrementBy: 1 + ordered: true + sequenceName: sq_comment + startValue: 1 diff --git a/src/test/resources/db/changelog/data/0001-chema-data.yaml b/src/test/resources/db/changelog/data/0001-chema-data.yaml new file mode 100644 index 0000000..7338565 --- /dev/null +++ b/src/test/resources/db/changelog/data/0001-chema-data.yaml @@ -0,0 +1,14 @@ +databaseChangeLog: +- changeSet: + id: 0001-chema-sql + author: KulikovMV + context: test + changes: + - sqlFile: + dbms: h2, oracle + encoding: utf8 + endDelimiter: ; + path: sql/data-h2.sql + relativeToChangelogFile: true + splitStatements: true + stripComments: true \ No newline at end of file diff --git a/src/test/resources/data-test.sql b/src/test/resources/db/changelog/data/sql/data-h2.sql similarity index 100% rename from src/test/resources/data-test.sql rename to src/test/resources/db/changelog/data/sql/data-h2.sql diff --git a/src/test/resources/db/changelog/db.changelog-master.yaml b/src/test/resources/db/changelog/db.changelog-master.yaml new file mode 100644 index 0000000..dccfd73 --- /dev/null +++ b/src/test/resources/db/changelog/db.changelog-master.yaml @@ -0,0 +1,5 @@ +databaseChangeLog: +- include: + file: db/changelog/1.0/2019-06-22--0001-schema.yaml +- include: + file: db/changelog/data/0001-chema-data.yaml \ No newline at end of file diff --git a/src/test/resources/schema-test.sql b/src/test/resources/schema-test.sql deleted file mode 100644 index 7156478..0000000 --- a/src/test/resources/schema-test.sql +++ /dev/null @@ -1,43 +0,0 @@ -DROP TABLE IF EXISTS BOOK; -DROP TABLE IF EXISTS AUTHOR; -DROP TABLE IF EXISTS GENRE; -DROP TABLE IF EXISTS COMMENT; - -CREATE TABLE AUTHOR( - ID NUMBER(20,0) PRIMARY KEY not null, - SURNAME VARCHAR(100) not null, - FIRST_NAME VARCHAR(100) not null, - SECOND_NAME VARCHAR(100) -); - -CREATE TABLE GENRE( - ID NUMBER(20,0) PRIMARY KEY not null, - NAME VARCHAR(100) not null -); - -CREATE TABLE BOOK( - ID NUMBER(20,0) PRIMARY KEY not null, - ADD_RECORD_DATE DATE default sysdate, - CAPTION VARCHAR(255) not null, - AUTHOR_ID NUMBER(20,0) not null, - GENRE_ID NUMBER(20,0) not null, - DESCRIPTION VARCHAR(255), - - foreign key (AUTHOR_ID) references AUTHOR(ID), - foreign key (GENRE_ID) references GENRE(ID) -); - -CREATE TABLE COMMENT( - ID NUMBER(20,0) PRIMARY KEY not null, - BOOK_ID NUMBER(20,0) not null, - ADD_RECORD_DATE TIMESTAMP default sysdate, - USER_NAME VARCHAR(20), - TEXT VARCHAR(500), - - foreign key (BOOK_ID) references BOOK(ID) ON DELETE CASCADE -); - -CREATE SEQUENCE sq_author minvalue 1 start with 1 increment by 1; -CREATE SEQUENCE sq_genre minvalue 1 start with 1 increment by 1; -CREATE SEQUENCE sq_book minvalue 1 start with 1 increment by 1; -CREATE SEQUENCE sq_comment minvalue 1 start with 1 increment by 1; \ No newline at end of file From de67a82cf6c528b1fb9396ee3530cfde83db1d76 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 24 Jun 2019 16:24:41 +0300 Subject: [PATCH 34/70] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4=20Data=20Jp?= =?UTF-8?q?a.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 7 ++++ .../ru/otus/mkulikov/app/dao/AuthorDao.java | 1 + .../ru/otus/mkulikov/app/dao/BookDao.java | 10 ++---- .../otus/mkulikov/app/dao/BookDaoCustom.java | 23 +++++++++++++ ...BookDaoJpa.java => BookDaoCustomImpl.java} | 28 +++------------- .../ru/otus/mkulikov/app/dao/CommentDao.java | 12 ++----- .../mkulikov/app/dao/CommentDaoCustom.java | 20 ++++++++++++ ...tDaoJpa.java => CommentDaoCustomImpl.java} | 32 +++---------------- .../java/ru/otus/mkulikov/app/model/Book.java | 8 ++--- .../app/service/AuthorManageServiceImpl.java | 11 ++++++- .../app/service/BookManageSevice.java | 4 +-- .../app/service/BookManageSeviceImpl.java | 27 +++++++++------- .../app/service/CommentManageServiceImpl.java | 17 +++++----- .../app/service/GenreManageServiceImpl.java | 6 +++- .../1.0/2019-06-22--0001-schema.yaml | 5 +-- .../mkulikov/app/dao/AuthorDaoJpaTest.java | 13 ++++---- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 30 ++++++++--------- .../mkulikov/app/dao/CommentDaoJpaTest.java | 24 +++++++------- .../mkulikov/app/dao/GenreDaoJpaTest.java | 13 ++++---- .../otus/mkulikov/app/model/DateUtilTest.java | 4 ++- .../service/AuthorManageSeviceImplTest.java | 12 +++---- .../app/service/BookManageSeviceImplTest.java | 10 +++--- .../service/CommentManageSeviceImplTest.java | 5 ++- .../service/GenreManageSeviceImplTest.java | 10 +++--- .../1.0/2019-06-22--0001-schema.yaml | 5 +-- 25 files changed, 177 insertions(+), 160 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java rename src/main/java/ru/otus/mkulikov/app/dao/{BookDaoJpa.java => BookDaoCustomImpl.java} (64%) create mode 100644 src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java rename src/main/java/ru/otus/mkulikov/app/dao/{CommentDaoJpa.java => CommentDaoCustomImpl.java} (61%) diff --git a/pom.xml b/pom.xml index b8ee082..db03f3c 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,13 @@ test + + org.assertj + assertj-core + 3.12.2 + test + + org.junit.jupiter junit-jupiter-api diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index 1a926b0..6a58a60 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -1,6 +1,7 @@ package ru.otus.mkulikov.app.dao; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index 58aaf0f..deb70cc 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -1,5 +1,6 @@ package ru.otus.mkulikov.app.dao; +import org.springframework.data.jpa.repository.JpaRepository; import ru.otus.mkulikov.app.model.Book; import java.util.List; @@ -11,13 +12,6 @@ * Time: 13:28 */ -public interface BookDao { +public interface BookDao extends JpaRepository, BookDaoCustom { - T getById(long id); - - List getAllObjects(); - - int save(T t); - - int deleteObject(long id); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java new file mode 100644 index 0000000..402e1a9 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java @@ -0,0 +1,23 @@ +package ru.otus.mkulikov.app.dao; + +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; +import ru.otus.mkulikov.app.model.Book; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 24.06.2019 + * Time: 11:48 + */ + +@Repository +@Transactional +public interface BookDaoCustom { + + Book getById(long id); + + List getAllObjects(); +} diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java similarity index 64% rename from src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java rename to src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java index dad9f26..f4cb17a 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java @@ -20,56 +20,36 @@ @Repository @Transactional @RequiredArgsConstructor -public class BookDaoJpa implements BookDao { +public class BookDaoCustomImpl implements BookDaoCustom { @PersistenceContext private EntityManager em; @Override public Book getById(long id) { - List books = em.createQuery("select distinct b " + List books = em.createQuery("select b " + "from Book b " + "inner join fetch b.author a " + "inner join fetch b.genre g " - + "left join b.comments c " + "where b.id = :id ", Book.class) .setParameter("id", id) .getResultList(); em.clear(); - return (books != null) ? books.get(0) : null; + return (books != null && !books.isEmpty()) ? books.get(0) : null; } @Override public List getAllObjects() { - List books = em.createQuery("select distinct b " + List books = em.createQuery("select b " + "from Book b " + "inner join fetch b.author a " + "inner join fetch b.genre g " - + "left join b.comments c " + "order by b.id ", Book.class) .getResultList(); em.clear(); return books; } - - @Override - public int save(Book book) { - if (book.getId() == 0) { - em.persist(book); - } else { - em.merge(book); - } - System.out.println("Book saved with id: " + book.getId()); - return 1; - } - - @Override - public int deleteObject(long id) { - return em.createQuery("delete from Book b where b.id = :id ") - .setParameter("id", id) - .executeUpdate(); - } } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index 49ddac6..8f41380 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -1,5 +1,6 @@ package ru.otus.mkulikov.app.dao; +import org.springframework.data.jpa.repository.JpaRepository; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; @@ -12,15 +13,6 @@ * Time: 23:48 */ -public interface CommentDao { +public interface CommentDao extends JpaRepository, CommentDaoCustom { - T getById(long id); - - List getByBook(Book book); - - int save(T t); - - List getAllObjects(); - - int deleteObject(long id); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java new file mode 100644 index 0000000..fd21688 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java @@ -0,0 +1,20 @@ +package ru.otus.mkulikov.app.dao; + +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Comment; + +import java.util.List; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 20.06.2019 + * Time: 23:48 + */ + +public interface CommentDaoCustom { + + T getById(long id); + + List getByBookId(long bookId); +} diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java similarity index 61% rename from src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java rename to src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java index 94a313d..8effe2f 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoJpa.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java @@ -21,7 +21,7 @@ @Repository @Transactional @RequiredArgsConstructor -public class CommentDaoJpa implements CommentDao { +public class CommentDaoCustomImpl implements CommentDaoCustom { @PersistenceContext private EntityManager em; @@ -41,40 +41,16 @@ public Comment getById(long id) { } @Override - public List getByBook(Book book) { + public List getByBookId(long bookId) { List list = em.createQuery( "select c " + "from Comment c " + "inner join fetch c.book b " + - "where c.book = :book", Comment.class) - .setParameter("book", book) + "where c.book.id = :bookId", Comment.class) + .setParameter("bookId", bookId) .getResultList(); em.clear(); return list; } - - @Override - public int save(Comment comment) { - if (comment.getId() == 0) { - em.persist(comment); - } else { - em.merge(comment); - } - System.out.println("Comment saved with id: " + comment.getId()); - return 1; - } - - @Override - public List getAllObjects() { - return em.createQuery("select a from Comment a order by a.id", Comment.class) - .getResultList(); - } - - @Override - public int deleteObject(long id) { - return em.createQuery("delete from Comment a where a.id = :id ") - .setParameter("id", id) - .executeUpdate(); - } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 7586ff6..6ffaec3 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -42,11 +42,6 @@ public class Book { @ManyToOne(optional=false, fetch = FetchType.EAGER) private Genre genre; - @Fetch(FetchMode.JOIN) - @OneToMany(mappedBy = "book", fetch = FetchType.LAZY) - @OnDelete(action = OnDeleteAction.CASCADE) - private List comments; - public Book() { } @@ -61,6 +56,7 @@ public Book(long id, Date addRecordDate, String caption, Author author, Genre ge public Book(long id, String caption, Author author, Genre genre, String description) { this.id = id; + this.addRecordDate = new Date(); this.caption = caption; this.author = author; this.genre = genre; @@ -69,6 +65,7 @@ public Book(long id, String caption, Author author, Genre genre, String descript public Book(String caption, Author author, Genre genre, String description) { this.id = 0L; + this.addRecordDate = new Date(); this.caption = caption; this.author = author; this.genre = genre; @@ -84,7 +81,6 @@ public String toString() { ", description=" + description + ", author=" + author + ", genre=" + genre + - ", comments=" + (comments != null ? comments : "none") + "}\n"; } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index 2743073..7288dfa 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -47,13 +47,22 @@ public int addAuthor(String surname, String firstName, String secondName) { @Override public int updateAuthor(long id, String surname, String firstName, String secondName) { - authorDao.save(new Author(id, surname, firstName, secondName)); + Author author = authorDao.findById(id).get(); + author.setSurname(surname); + author.setFirstName(firstName); + author.setSecondName(secondName); + + authorDao.save(author); return 1; } @Override public int deleteAuthor(long id) { authorDao.deleteById(id); + // при удалении записи, которая используется в другой таблице не выдает никакой ошибки, + // ошибка выдается только при вызове следующей команды + // поэтому вызываю count + authorDao.count(); return 1; } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java index e08867d..98f0170 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -17,9 +17,9 @@ public interface BookManageSevice { List getBooks(); - int addBook(String caption, int authorId, int genreId, String description); + int addBook(String caption, long authorId, long genreId, String description); - int updateBook(long id, String caption, int authorId, int genreId, String description); + int updateBook(long id, String caption, long authorId, long genreId, String description); int deleteBook(long id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 5c4c9fc..69384cb 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -5,8 +5,11 @@ import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; +import java.util.Date; import java.util.List; /** @@ -35,25 +38,27 @@ public List getBooks() { } @Override - public int addBook(String caption, int authorId, int genreId, String comment) { - // Author author = authorDao.getById(authorId); - // Genre genre = genreDao.getById(genreId); - // - // return bookDao.addObject(new Book(caption, author, genre, comment)); + public int addBook(String caption, long authorId, long genreId, String comment) { + Author author = authorDao.findById(authorId).get(); + Genre genre = genreDao.findById(genreId).get(); + + bookDao.save(new Book(caption, author, genre, comment)); return 1; } @Override - public int updateBook(long id, String caption, int authorId, int genreId, String comment) { - // Author author = authorDao.getById(authorId); - // Genre genre = genreDao.getById(genreId); - // - // return bookDao.updateObject(new Book(id, caption, author, genre, comment)); + public int updateBook(long id, String caption, long authorId, long genreId, String comment) { + Author author = authorDao.findById(authorId).get(); + Genre genre = genreDao.findById(genreId).get(); + + bookDao.save(new Book(id, caption, author, genre, comment)); return 1; } @Override public int deleteBook(long id) { - return bookDao.deleteObject(id); + bookDao.deleteById(id); + bookDao.count(); + return 1; } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index 591e132..dfd59cb 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -31,21 +31,19 @@ public Comment getCommentById(long id) { @Override public List getComments() { - return commentDao.getAllObjects(); + return commentDao.findAll(); } @Override public List getCommentsByBookId(long bookId) { - Book book = bookDao.getById(bookId); - - return commentDao.getByBook(book); + return commentDao.getByBookId(bookId); } @Override public int addComment(long bookId, String userName, String text) { Book book = bookDao.getById(bookId); - - return commentDao.save(new Comment(book, new Date(), userName, text)); + commentDao.save(new Comment(book, new Date(), userName, text)); + return 1; } @Override @@ -55,11 +53,14 @@ public int updateComment(long id, String userName, String text) { comment.setUserName(userName); comment.setText(text); - return commentDao.save(comment); + commentDao.save(comment); + return 1; } @Override public int deleteComment(long id) { - return commentDao.deleteObject(id); + commentDao.deleteById(id); + commentDao.count(); + return 1; } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index ddb4acd..90ded25 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -47,13 +47,17 @@ public int addGenre(String name) { @Override public int updateGenre(long id, String name) { - genreDao.save(new Genre(id, name)); + Genre genre = genreDao.findById(id).get(); + genre.setName(name); + + genreDao.save(genre); return 1; } @Override public int deleteGenre(long id) { genreDao.deleteById(id); + genreDao.count(); return 1; } } diff --git a/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml b/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml index 42aad48..92d188b 100644 --- a/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml +++ b/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml @@ -58,7 +58,7 @@ databaseChangeLog: primaryKeyName: pk_book - column: name: add_record_date - type: date + type: timestamp defaultValueDate: sysdate constraints: nullable: false @@ -106,10 +106,11 @@ databaseChangeLog: nullable: false foreignKeyName: fk_comment references: book(id) + deleteCascade: true onDelete: cascade - column: name: add_record_date - type: date + type: timestamp defaultValueDate: sysdate constraints: nullable: false diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index c399568..5b2667d 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -6,18 +6,20 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; -import javax.persistence.PersistenceException; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -89,9 +91,8 @@ void addObject() { @DisplayName("Удаление автора, который используется в таблице книг") void deleteObject() { authorDao.deleteById(1L); - Author author = authorDao.findById(1L).get(); - -// assertNotNull(author); + //assertThat(authorDao.count()).isEqualTo(1); + assertThrows(DataIntegrityViolationException.class, () -> { authorDao.count(); }); } @Test diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 770f3cf..2fbf3b6 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; @@ -14,9 +13,15 @@ import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.utils.DateUtil; +import java.util.Date; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -74,13 +79,12 @@ void getAllObjects() { @Test @DisplayName("Добавление книги") void addObject() { - int count = bookDaoJpa.save(getNewBook()); + bookDaoJpa.save(getNewBook()); Book book = bookDaoJpa.getById(4L); assertAll( "book", () -> assertNotNull(book), - () -> assertEquals(1, count), () -> assertEquals(4L, book.getId()), () -> assertEquals("Test_Book", book.getCaption()), () -> assertEquals(1, book.getAuthor().getId()), @@ -92,27 +96,19 @@ void addObject() { @Test @DisplayName("Удаление книги по id") void deleteObject() { - int count = bookDaoJpa.deleteObject(1L); - - assertAll( - "book", - () -> assertEquals(1, count), - () -> assertThrows(IndexOutOfBoundsException.class, () -> { bookDaoJpa.getById(1L); }) - ); + bookDaoJpa.deleteById(1L); + Book book = bookDaoJpa.getById(1L); + assertNull(book); } @Test @DisplayName("Обновление книги") void updateObject() { - Book book1 = bookDaoJpa.getById(1L); - int count = bookDaoJpa.save(getUpdatedBook()); + bookDaoJpa.save(getUpdatedBook()); Book book2 = bookDaoJpa.getById(1L); assertAll( "book", - () -> assertEquals(1, count), - () -> assertEquals("book_1", book1.getCaption()), - () -> assertEquals("description", book1.getDescription()), () -> assertEquals("Test_Book", book2.getCaption()), () -> assertEquals("Test_Description", book2.getDescription()) ); @@ -127,6 +123,6 @@ private Book getNewBook() { private Book getUpdatedBook() { Author author = authorDao.findById(1L).get(); Genre genre = genreDao.findById(1L).get(); - return new Book(1L,"Test_Book", author, genre, "Test_Description"); + return new Book(1L, new Date(), "Test_Book", author, genre, "Test_Description"); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java index 3336556..a9fc3f8 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java @@ -15,7 +15,11 @@ import java.util.Date; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -26,7 +30,7 @@ @DisplayName("Класс CommentDaoJpa") @RunWith(SpringRunner.class) -@Import({CommentDaoJpa.class, BookDaoJpa.class}) +@Import({CommentDaoCustomImpl.class, BookDaoCustomImpl.class}) @DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class CommentDaoJpaTest { @@ -55,7 +59,7 @@ void getById() { @Test @DisplayName("Получение всех комментариев") void getAllObjects() { - List comments = commentDaoJpa.getAllObjects(); + List comments = commentDaoJpa.findAll(); assertAll( "comments", @@ -71,8 +75,7 @@ void getAllObjects() { @Test @DisplayName("Получение всех комментариев для книги") void getObjectsByBook() { - Book book = bookDaoJpa.getById(1L); - List comments = commentDaoJpa.getByBook(book); + List comments = commentDaoJpa.getByBookId(1L); assertAll( "comments", @@ -88,7 +91,7 @@ void getObjectsByBook() { void addObject() { Date date = new Date(); Book book = bookDaoJpa.getById(1L); - int count = commentDaoJpa.save(new Comment(book, date, "user5", "text5")); + commentDaoJpa.save(new Comment(book, date, "user5", "text5")); Comment comment = commentDaoJpa.getById(5L); @@ -96,7 +99,6 @@ void addObject() { "comment", () -> assertNotNull(comment), () -> assertNotNull(comment.getBook()), - () -> assertEquals(1, count), () -> assertEquals(5L, comment.getId()), () -> assertEquals(date, comment.getAddRecordDate()), () -> assertEquals("user5", comment.getUserName()), @@ -107,8 +109,9 @@ void addObject() { @Test @DisplayName("Удаление комментария") void deleteObject() { - commentDaoJpa.deleteObject(1L); - assertNull(commentDaoJpa.getById(1L)); + commentDaoJpa.deleteById(1L); + Comment comment = commentDaoJpa.getById(1L); + assertNull(comment); } @Test @@ -117,7 +120,7 @@ void updateObject() { Comment comment1 = commentDaoJpa.getById(1L); Date date = new Date(); - int count = commentDaoJpa.save(new Comment(1L, comment1.getBook(), date, "TestUser", "TestText")); + commentDaoJpa.save(new Comment(1L, comment1.getBook(), date, "TestUser", "TestText")); Comment comment2 = commentDaoJpa.getById(1L); @@ -127,7 +130,6 @@ void updateObject() { () -> assertNotNull(comment2), () -> assertNotNull(comment1.getBook()), () -> assertNotNull(comment2.getBook()), - () -> assertEquals(1, count), () -> assertEquals("user1", comment1.getUserName()), () -> assertEquals("text1", comment1.getText()), () -> assertEquals(date, comment2.getAddRecordDate()), diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index e92e383..f5fbea9 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -6,17 +6,19 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; -import javax.persistence.PersistenceException; import java.util.List; import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -84,9 +86,8 @@ void addObject() { @DisplayName("Удаление жанра, который используется в таблице книг") void deleteObject() { genreDaoJpa.deleteById(1L); - Genre genre = genreDaoJpa.findById(1L).get(); - - assertNotNull(genre); + //assertThat(authorDao.count()).isEqualTo(1); + assertThrows(DataIntegrityViolationException.class, () -> { genreDaoJpa.count(); }); } @Test diff --git a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java index 1276d90..aaab80c 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java @@ -10,7 +10,9 @@ import java.text.SimpleDateFormat; import java.util.Date; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Created by IntelliJ IDEA. diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 76097a2..68b5767 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; @@ -13,7 +14,10 @@ import javax.persistence.PersistenceException; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -97,10 +101,6 @@ void updateAuthor() { @Test @DisplayName("Удаление автора, который используется в таблице книг") void deleteAuthor() { - authorManageService.deleteAuthor(1L); - - - - assertThrows(PersistenceException.class, () -> { }); + assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(1L); }); } } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 5dbb053..d552267 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -13,7 +13,10 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -87,15 +90,12 @@ void addBook() { @Test @DisplayName("Обновление книги") void updateBook() { - Book book1 = booksManageSevice.getBookById(1L); - int count = booksManageSevice.updateBook(1L, "Test_Book", 2, 3, "Test_Description"); + int count = booksManageSevice.updateBook(1L, "Test_Book", 1, 1, "Test_Description"); Book book2 = booksManageSevice.getBookById(1L); assertAll( "book", () -> assertEquals(1, count), - () -> assertEquals("book_1", book1.getCaption()), - () -> assertEquals("description", book1.getDescription()), () -> assertEquals("Test_Book", book2.getCaption()), () -> assertEquals("Test_Description", book2.getDescription()) ); diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index e641616..87fb9c5 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -13,7 +13,10 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Created by IntelliJ IDEA. diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index da4d95f..cd0707c 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; @@ -13,7 +14,10 @@ import javax.persistence.PersistenceException; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -78,14 +82,12 @@ void addGenre() { @Test @DisplayName("Обновление жанра") void updateGenre() { - Genre genre1 = genreManageService.getGenreById(1L); int count = genreManageService.updateGenre(1L, "UpdatedName"); Genre genre2 = genreManageService.getGenreById(1L); assertAll( "genre", () -> assertEquals(1, count), - () -> assertEquals("Genre1", genre1.getName()), () -> assertEquals("UpdatedName", genre2.getName()) ); } @@ -93,6 +95,6 @@ void updateGenre() { @Test @DisplayName("Удаление жанра, который используется в таблице книг") void deleteGenre() { - assertThrows(PersistenceException.class, () -> { genreManageService.deleteGenre(1L); }); + assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(1L); }); } } diff --git a/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml b/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml index 42aad48..92d188b 100644 --- a/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml +++ b/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml @@ -58,7 +58,7 @@ databaseChangeLog: primaryKeyName: pk_book - column: name: add_record_date - type: date + type: timestamp defaultValueDate: sysdate constraints: nullable: false @@ -106,10 +106,11 @@ databaseChangeLog: nullable: false foreignKeyName: fk_comment references: book(id) + deleteCascade: true onDelete: cascade - column: name: add_record_date - type: date + type: timestamp defaultValueDate: sysdate constraints: nullable: false From 871c88f4abc0663f011372e93bdc19ab10a10172 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 25 Jun 2019 16:19:29 +0300 Subject: [PATCH 35/70] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4=20Data=20Jp?= =?UTF-8?q?a.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 ++++++------ .../ru/otus/mkulikov/app/dao/AuthorDao.java | 2 -- .../ru/otus/mkulikov/app/dao/BookDao.java | 2 -- .../ru/otus/mkulikov/app/dao/CommentDao.java | 3 --- .../mkulikov/app/dao/CommentDaoCustom.java | 1 - .../app/dao/CommentDaoCustomImpl.java | 1 - .../ru/otus/mkulikov/app/dao/GenreDao.java | 4 +-- .../ru/otus/mkulikov/app/model/Author.java | 8 +++++- .../java/ru/otus/mkulikov/app/model/Book.java | 13 +++++++--- .../ru/otus/mkulikov/app/model/Comment.java | 12 ++++++++- .../ru/otus/mkulikov/app/model/Genre.java | 8 +++++- .../app/service/AuthorManageService.java | 2 +- .../app/service/AuthorManageServiceImpl.java | 6 ++--- .../app/service/BookManageSevice.java | 2 +- .../app/service/BookManageSeviceImpl.java | 18 ++++++++----- .../app/service/CommentManageService.java | 2 +- .../app/service/CommentManageServiceImpl.java | 7 +++--- .../app/service/GenreManageService.java | 2 +- .../app/service/GenreManageServiceImpl.java | 6 ++--- .../otus/mkulikov/shell/AuthorCommands.java | 4 +-- .../ru/otus/mkulikov/shell/BookCommands.java | 4 +-- .../otus/mkulikov/shell/CommentCommands.java | 4 +-- .../ru/otus/mkulikov/shell/GenreCommands.java | 4 +-- ...a-data.yaml => 2019-06-22--0001-data.yaml} | 2 +- ...ta-h2.sql => 2019-06-22--0001-data-h2.sql} | 0 .../db/changelog/db.changelog-master.yaml | 2 +- .../mkulikov/app/dao/AuthorDaoJpaTest.java | 23 +++++++++-------- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 8 ++++-- .../mkulikov/app/dao/CommentDaoJpaTest.java | 8 +++++- .../mkulikov/app/dao/GenreDaoJpaTest.java | 13 +++++----- .../service/AuthorManageSeviceImplTest.java | 15 +++++++---- .../app/service/BookManageSeviceImplTest.java | 25 ++++++++++--------- .../service/CommentManageSeviceImplTest.java | 11 ++++++-- .../service/GenreManageSeviceImplTest.java | 15 +++++++---- ...a-data.yaml => 2019-06-22--0001-data.yaml} | 2 +- ...ta-h2.sql => 2019-06-22--0001-data-h2.sql} | 0 .../db/changelog/db.changelog-master.yaml | 2 +- 37 files changed, 156 insertions(+), 101 deletions(-) rename src/main/resources/db/changelog/data/{0001-chema-data.yaml => 2019-06-22--0001-data.yaml} (86%) rename src/main/resources/db/changelog/data/sql/{data-h2.sql => 2019-06-22--0001-data-h2.sql} (100%) rename src/test/resources/db/changelog/data/{0001-chema-data.yaml => 2019-06-22--0001-data.yaml} (86%) rename src/test/resources/db/changelog/data/sql/{data-h2.sql => 2019-06-22--0001-data-h2.sql} (100%) diff --git a/pom.xml b/pom.xml index db03f3c..869c9eb 100644 --- a/pom.xml +++ b/pom.xml @@ -173,14 +173,14 @@ false classpath:/db/changelog/db.changelog-master.yaml - - - package - - update - - - + + + + + + + + org.yaml diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index 6a58a60..87ee2bc 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -1,8 +1,6 @@ package ru.otus.mkulikov.app.dao; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index deb70cc..fc5c1b8 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -3,8 +3,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import ru.otus.mkulikov.app.model.Book; -import java.util.List; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index 8f41380..66f53de 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -1,11 +1,8 @@ package ru.otus.mkulikov.app.dao; import org.springframework.data.jpa.repository.JpaRepository; -import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; -import java.util.List; - /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java index fd21688..071c93f 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.app.dao; -import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import java.util.List; diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java index 8effe2f..36f207c 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; -import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import javax.persistence.EntityManager; diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 9273707..982c856 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -1,6 +1,6 @@ package ru.otus.mkulikov.app.dao; -import org.springframework.data.repository.CrudRepository; +import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; @@ -14,6 +14,6 @@ @Repository @Transactional -public interface GenreDao extends CrudRepository { +public interface GenreDao extends JpaRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index edca570..b126428 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -2,7 +2,13 @@ import lombok.Data; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 6ffaec3..d2a68ca 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -3,12 +3,17 @@ import lombok.Data; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import org.hibernate.annotations.OnDelete; -import org.hibernate.annotations.OnDeleteAction; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; import java.util.Date; -import java.util.List; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java index dd7a0a5..3902e58 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Comment.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -4,7 +4,17 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; import java.util.Date; /** diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index dc37847..4e72005 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -2,7 +2,13 @@ import lombok.Data; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java index 2ebc5f1..de2eaaf 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java @@ -17,7 +17,7 @@ public interface AuthorManageService { List getAuthors(); - int addAuthor(String surname, String firstName, String secondName); + long addAuthor(String surname, String firstName, String secondName); int updateAuthor(long id, String surname, String firstName, String secondName); diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index 7288dfa..be77cff 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -40,9 +40,9 @@ public List getAuthors() { } @Override - public int addAuthor(String surname, String firstName, String secondName) { - authorDao.save(new Author(surname, firstName, secondName)); - return 1; + public long addAuthor(String surname, String firstName, String secondName) { + Author author = authorDao.save(new Author(surname, firstName, secondName)); + return author.getId(); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java index 98f0170..4dab801 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -17,7 +17,7 @@ public interface BookManageSevice { List getBooks(); - int addBook(String caption, long authorId, long genreId, String description); + long addBook(String caption, long authorId, long genreId, String description); int updateBook(long id, String caption, long authorId, long genreId, String description); diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 69384cb..e96cfbd 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -9,7 +9,6 @@ import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; -import java.util.Date; import java.util.List; /** @@ -38,20 +37,27 @@ public List getBooks() { } @Override - public int addBook(String caption, long authorId, long genreId, String comment) { + public long addBook(String caption, long authorId, long genreId, String description) { Author author = authorDao.findById(authorId).get(); Genre genre = genreDao.findById(genreId).get(); - bookDao.save(new Book(caption, author, genre, comment)); - return 1; + Book book = bookDao.save(new Book(caption, author, genre, description)); + return book.getId(); } @Override - public int updateBook(long id, String caption, long authorId, long genreId, String comment) { + public int updateBook(long id, String caption, long authorId, long genreId, String description) { Author author = authorDao.findById(authorId).get(); Genre genre = genreDao.findById(genreId).get(); - bookDao.save(new Book(id, caption, author, genre, comment)); + Book book = bookDao.findById(id).get(); + book.setCaption(caption); + book.setAuthor(author); + book.setGenre(genre); + book.setGenre(genre); + book.setDescription(description); + + bookDao.save(book); return 1; } diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java index 5c9e5e7..ebdf3e1 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java @@ -18,7 +18,7 @@ public interface CommentManageService { List getCommentsByBookId(long bookId); - int addComment(long bookId, String userName, String text); + long addComment(long bookId, String userName, String text); int updateComment(long id, String userName, String text); diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index dfd59cb..2791b06 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -40,10 +40,11 @@ public List getCommentsByBookId(long bookId) { } @Override - public int addComment(long bookId, String userName, String text) { + public long addComment(long bookId, String userName, String text) { Book book = bookDao.getById(bookId); - commentDao.save(new Comment(book, new Date(), userName, text)); - return 1; + + Comment comment = commentDao.save(new Comment(book, new Date(), userName, text)); + return comment.getId(); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java index 80015b3..f6b83ee 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java @@ -16,7 +16,7 @@ public interface GenreManageService { List getGenres(); - int addGenre(String name); + long addGenre(String name); int updateGenre(long id, String name); diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index 90ded25..4c9757e 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -40,9 +40,9 @@ public List getGenres() { } @Override - public int addGenre(String name) { - genreDao.save(new Genre(name)); - return 1; + public long addGenre(String name) { + Genre genre = genreDao.save(new Genre(name)); + return genre.getId(); } @Override diff --git a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java index 2ace11e..c239e0d 100644 --- a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java @@ -36,8 +36,8 @@ public String getAuthors() { @ShellMethod(key = {"addAuthor"}, value = "Add new author.") public String addAuthor(@ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { - int count = authorManageService.addAuthor(surname, firstName, secondName); - return "Add " + count + " row(s)"; + long id = authorManageService.addAuthor(surname, firstName, secondName); + return "Add " + (id != 0 ? 1 : 0) + " row(s)"; } @ShellMethod(key = {"updateAuthor"}, value = "Update author by id.") diff --git a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java index b5119f5..d33aed8 100644 --- a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java @@ -36,8 +36,8 @@ public String getBooks() { @ShellMethod(key = {"addBook"}, value = "Add new book.") public String addBook(@ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String description) { - int count = bookManageSevice.addBook(caption, authorId, genreId, description); - return "Add " + count + " row(s)"; + long id = bookManageSevice.addBook(caption, authorId, genreId, description); + return "Add " + (id != 0 ? 1 : 0) + " row(s)"; } @ShellMethod(key = {"updateBook"}, value = "Update book by id.") diff --git a/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java b/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java index 3965c34..e1dde06 100644 --- a/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java @@ -42,8 +42,8 @@ public String getCommentsByBookId(@ShellOption long bookId) { @ShellMethod(key = {"addComment"}, value = "Add new comment.") public String addComment(@ShellOption long bookId, @ShellOption String userName, @ShellOption String text) { - int count = commentManageService.addComment(bookId, userName, text); - return "Add " + count + " row(s)"; + long id = commentManageService.addComment(bookId, userName, text); + return "Add " + (id != 0 ? 1 : 0) + " row(s)"; } @ShellMethod(key = {"updateComment"}, value = "Update comment by id.") diff --git a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java index eb2344e..9d73476 100644 --- a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java @@ -36,8 +36,8 @@ public String getGenres() { @ShellMethod(key = {"addGenre"}, value = "Add new genre.") public String addGenre(@ShellOption String name) { - int count = genreManageService.addGenre(name); - return "Add " + count + " row(s)"; + long id = genreManageService.addGenre(name); + return "Add " + (id != 0 ? 1 : 0) + " row(s)"; } @ShellMethod(key = {"updateGenre"}, value = "Update genre by id.") diff --git a/src/main/resources/db/changelog/data/0001-chema-data.yaml b/src/main/resources/db/changelog/data/2019-06-22--0001-data.yaml similarity index 86% rename from src/main/resources/db/changelog/data/0001-chema-data.yaml rename to src/main/resources/db/changelog/data/2019-06-22--0001-data.yaml index 7338565..cbfcff5 100644 --- a/src/main/resources/db/changelog/data/0001-chema-data.yaml +++ b/src/main/resources/db/changelog/data/2019-06-22--0001-data.yaml @@ -8,7 +8,7 @@ databaseChangeLog: dbms: h2, oracle encoding: utf8 endDelimiter: ; - path: sql/data-h2.sql + path: sql/2019-06-22--0001-data-h2.sql relativeToChangelogFile: true splitStatements: true stripComments: true \ No newline at end of file diff --git a/src/main/resources/db/changelog/data/sql/data-h2.sql b/src/main/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql similarity index 100% rename from src/main/resources/db/changelog/data/sql/data-h2.sql rename to src/main/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index dccfd73..3adc919 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -2,4 +2,4 @@ databaseChangeLog: - include: file: db/changelog/1.0/2019-06-22--0001-schema.yaml - include: - file: db/changelog/data/0001-chema-data.yaml \ No newline at end of file + file: db/changelog/data/2019-06-22--0001-data.yaml \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 5b2667d..8ab00fe 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -7,14 +7,13 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -40,6 +39,7 @@ class AuthorDaoJpaTest { @Test @DisplayName("Получение автора по id") + @Rollback void getById() { Optional author = authorDao.findById(1L); @@ -55,24 +55,23 @@ void getById() { @Test @DisplayName("Получение всех авторов") + @Rollback void getAllObjects() { - Iterable authors = authorDao.findAll(); - List list = StreamSupport - .stream(authors.spliterator(), false) - .collect(Collectors.toList()); + List authors = authorDao.findAll(); assertAll( "authors", - () -> assertNotNull(list), - () -> assertEquals(3, list.size()), - () -> assertEquals("Surname", list.get(0).getSurname()), - () -> assertEquals("Surname2", list.get(1).getSurname()), - () -> assertEquals("Surname3", list.get(2).getSurname()) + () -> assertNotNull(authors), + () -> assertEquals(3, authors.size()), + () -> assertEquals("Surname", authors.get(0).getSurname()), + () -> assertEquals("Surname2", authors.get(1).getSurname()), + () -> assertEquals("Surname3", authors.get(2).getSurname()) ); } @Test @DisplayName("Добавление автора") + @Rollback void addObject() { Author author = authorDao.save(new Author("TestSurname", "TestFirstName", "TestSecondName")); Optional author_selected = authorDao.findById(4L); @@ -89,6 +88,7 @@ void addObject() { @Test @DisplayName("Удаление автора, который используется в таблице книг") + @Rollback void deleteObject() { authorDao.deleteById(1L); //assertThat(authorDao.count()).isEqualTo(1); @@ -97,6 +97,7 @@ void deleteObject() { @Test @DisplayName("Обновление автора") + @Rollback void updateObject() { authorDao.save( new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 2fbf3b6..698ec53 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; @@ -16,12 +17,10 @@ import java.util.Date; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -46,6 +45,7 @@ class BookDaoJpaTest { @Test @DisplayName("Получение книги по id") + @Rollback void getById() { Book book = bookDaoJpa.getById(1L); @@ -63,6 +63,7 @@ void getById() { @Test @DisplayName("Получение всех книг") + @Rollback void getAllObjects() { List books = bookDaoJpa.getAllObjects(); @@ -78,6 +79,7 @@ void getAllObjects() { @Test @DisplayName("Добавление книги") + @Rollback void addObject() { bookDaoJpa.save(getNewBook()); Book book = bookDaoJpa.getById(4L); @@ -95,6 +97,7 @@ void addObject() { @Test @DisplayName("Удаление книги по id") + @Rollback void deleteObject() { bookDaoJpa.deleteById(1L); Book book = bookDaoJpa.getById(1L); @@ -103,6 +106,7 @@ void deleteObject() { @Test @DisplayName("Обновление книги") + @Rollback void updateObject() { bookDaoJpa.save(getUpdatedBook()); Book book2 = bookDaoJpa.getById(1L); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java index a9fc3f8..fe4c23d 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Book; @@ -19,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -42,6 +42,7 @@ class CommentDaoJpaTest { @Test @DisplayName("Получение комментария по id") + @Rollback void getById() { Comment comment = commentDaoJpa.getById(1L); @@ -58,6 +59,7 @@ void getById() { @Test @DisplayName("Получение всех комментариев") + @Rollback void getAllObjects() { List comments = commentDaoJpa.findAll(); @@ -74,6 +76,7 @@ void getAllObjects() { @Test @DisplayName("Получение всех комментариев для книги") + @Rollback void getObjectsByBook() { List comments = commentDaoJpa.getByBookId(1L); @@ -88,6 +91,7 @@ void getObjectsByBook() { @Test @DisplayName("Добавление комментария") + @Rollback void addObject() { Date date = new Date(); Book book = bookDaoJpa.getById(1L); @@ -108,6 +112,7 @@ void addObject() { @Test @DisplayName("Удаление комментария") + @Rollback void deleteObject() { commentDaoJpa.deleteById(1L); Comment comment = commentDaoJpa.getById(1L); @@ -116,6 +121,7 @@ void deleteObject() { @Test @DisplayName("Обновление комментария") + @Rollback void updateObject() { Comment comment1 = commentDaoJpa.getById(1L); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index f5fbea9..1f43565 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -7,13 +7,12 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -39,6 +38,7 @@ class GenreDaoJpaTest { @Test @DisplayName("Получение жанра по id") + @Rollback void getById() { Genre genre = genreDaoJpa.findById(1L).get(); @@ -52,11 +52,9 @@ void getById() { @Test @DisplayName("Получение всех жанров") + @Rollback void getAllObjects() { - Iterable iterable = genreDaoJpa.findAll(); - List genres = StreamSupport - .stream(iterable.spliterator(), false) - .collect(Collectors.toList()); + List genres = genreDaoJpa.findAll(); assertAll( "genres", @@ -70,6 +68,7 @@ void getAllObjects() { @Test @DisplayName("Добавление жанра") + @Rollback void addObject() { genreDaoJpa.save(new Genre("Test4")); Genre genre = genreDaoJpa.findById(4L).get(); @@ -84,6 +83,7 @@ void addObject() { @Test @DisplayName("Удаление жанра, который используется в таблице книг") + @Rollback void deleteObject() { genreDaoJpa.deleteById(1L); //assertThat(authorDao.count()).isEqualTo(1); @@ -92,6 +92,7 @@ void deleteObject() { @Test @DisplayName("Обновление жанра") + @Rollback void updateObject() { genreDaoJpa.save(new Genre(1L, "UpdatedName")); Genre genre = genreDaoJpa.findById(1L).get(); diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 68b5767..426e417 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -7,15 +7,16 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; -import javax.persistence.PersistenceException; import java.util.List; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -38,6 +39,7 @@ class AuthorManageSeviceImplTest { @Test @DisplayName("Получение автора по id") + @Rollback void getAuthorById() { Author author = authorManageService.getAuthorById(1L); @@ -53,6 +55,7 @@ void getAuthorById() { @Test @DisplayName("Получение всех авторов") + @Rollback void getAuthors() { List authors = authorManageService.getAuthors(); @@ -68,15 +71,15 @@ void getAuthors() { @Test @DisplayName("Добавление автора") + @Rollback void addAuthor() { - int count = authorManageService.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); - Author author_selected = authorManageService.getAuthorById(4L); + long id = authorManageService.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); + Author author_selected = authorManageService.getAuthorById(id); assertAll( "author", () -> assertNotNull(author_selected), - () -> assertEquals(1, count), - () -> assertEquals(4L, author_selected.getId()), + () -> assertNotEquals(0, id), () -> assertEquals("TestSurname", author_selected.getSurname()), () -> assertEquals("TestFirstName", author_selected.getFirstName()), () -> assertEquals("TestSecondName", author_selected.getSecondName()) @@ -85,6 +88,7 @@ void addAuthor() { @Test @DisplayName("Обновление автора") + @Rollback void updateAuthor() { int count = authorManageService.updateAuthor(1L, "TestSurname", "TestFirstName", "TestSecondName"); Author author2 = authorManageService.getAuthorById(1L); @@ -100,6 +104,7 @@ void updateAuthor() { @Test @DisplayName("Удаление автора, который используется в таблице книг") + @Rollback void deleteAuthor() { assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(1L); }); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index d552267..a4902ed 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Book; @@ -13,10 +14,11 @@ import java.util.List; +import static org.junit.Assert.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Created by IntelliJ IDEA. @@ -37,6 +39,7 @@ class BookManageSeviceImplTest { @Test @DisplayName("Получение книги по id") + @Rollback void getBookById() { Book book = booksManageSevice.getBookById(1L); @@ -56,6 +59,7 @@ void getBookById() { @Test @DisplayName("Получение всех книг") + @Rollback void getBooks() { List books = booksManageSevice.getBooks(); @@ -71,15 +75,15 @@ void getBooks() { @Test @DisplayName("Добавление книги") + @Rollback void addBook() { - int count = booksManageSevice.addBook("Test_Book", 2, 3, "Test_Description"); - Book book = booksManageSevice.getBookById(4L); + long id = booksManageSevice.addBook("Test_Book", 2, 3, "Test_Description"); + Book book = booksManageSevice.getBookById(id); assertAll( "book", () -> assertNotNull(book), - () -> assertEquals(1, count), - () -> assertEquals(4L, book.getId()), + () -> assertNotEquals(0, id), () -> assertEquals("Test_Book", book.getCaption()), () -> assertEquals(2, book.getAuthor().getId()), () -> assertEquals(3, book.getGenre().getId()), @@ -89,6 +93,7 @@ void addBook() { @Test @DisplayName("Обновление книги") + @Rollback void updateBook() { int count = booksManageSevice.updateBook(1L, "Test_Book", 1, 1, "Test_Description"); Book book2 = booksManageSevice.getBookById(1L); @@ -103,14 +108,10 @@ void updateBook() { @Test @DisplayName("Удаление книги по id") + @Rollback void deleteBook() { - int count = booksManageSevice.deleteBook(1L); - - assertAll( - "book", - () -> assertEquals(1, count), - () -> assertThrows(IndexOutOfBoundsException.class, () -> { booksManageSevice.getBookById(1L); }) - ); + booksManageSevice.deleteBook(1L); + assertNull(booksManageSevice.getBookById(1L)); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index 87fb9c5..33f6048 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Comment; @@ -37,6 +38,7 @@ class CommentManageSeviceImplTest { @Test @DisplayName("Получение комментария по id") + @Rollback void getCommentById() { Comment comment = commentManageService.getCommentById(1L); @@ -53,6 +55,7 @@ void getCommentById() { @Test @DisplayName("Получение всех комментариев") + @Rollback void getComments() { List comments = commentManageService.getComments(); @@ -69,8 +72,9 @@ void getComments() { @Test @DisplayName("Добавление комментария") + @Rollback void addComment() { - int count = commentManageService.addComment(1L, "user5", "text5"); + long id = commentManageService.addComment(1L, "user5", "text5"); Comment comment = commentManageService.getCommentById(5L); @@ -78,7 +82,7 @@ void addComment() { "comment", () -> assertNotNull(comment), () -> assertNotNull(comment.getBook()), - () -> assertEquals(1, count), + () -> assertEquals(5L, id), () -> assertEquals(5L, comment.getId()), () -> assertEquals("user5", comment.getUserName()), () -> assertEquals("text5", comment.getText()) @@ -87,6 +91,7 @@ void addComment() { @Test @DisplayName("Получение комментариев по Id книги") + @Rollback void getCommentsByBookId() { List comments = commentManageService.getCommentsByBookId(1L); @@ -101,6 +106,7 @@ void getCommentsByBookId() { @Test @DisplayName("Обновление комментария") + @Rollback void updateComment() { Comment comment1 = commentManageService.getCommentById(1L); int count = commentManageService.updateComment(1L, "TestUser", "TestText"); @@ -122,6 +128,7 @@ void updateComment() { @Test @DisplayName("Удаление комментария") + @Rollback void deleteComment() { commentManageService.deleteComment(1L); assertNull(commentManageService.getCommentById(1L)); diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index cd0707c..4460d08 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -7,15 +7,16 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; -import javax.persistence.PersistenceException; import java.util.List; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -38,6 +39,7 @@ class GenreManageSeviceImplTest { @Test @DisplayName("Получение жанра по id") + @Rollback void getGenreById() { Genre genre = genreManageService.getGenreById(1L); @@ -51,6 +53,7 @@ void getGenreById() { @Test @DisplayName("Получение всех жанров") + @Rollback void getGenres() { List genres = genreManageService.getGenres(); @@ -66,21 +69,22 @@ void getGenres() { @Test @DisplayName("Добавление жанра") + @Rollback void addGenre() { - int count = genreManageService.addGenre("Test4"); - Genre genre = genreManageService.getGenreById(4L); + long id = genreManageService.addGenre("Test4"); + Genre genre = genreManageService.getGenreById(id); assertAll( "genre", () -> assertNotNull(genre), - () -> assertEquals(1, count), - () -> assertEquals(4L, genre.getId()), + () -> assertNotEquals(0, id), () -> assertEquals("Test4", genre.getName()) ); } @Test @DisplayName("Обновление жанра") + @Rollback void updateGenre() { int count = genreManageService.updateGenre(1L, "UpdatedName"); Genre genre2 = genreManageService.getGenreById(1L); @@ -94,6 +98,7 @@ void updateGenre() { @Test @DisplayName("Удаление жанра, который используется в таблице книг") + @Rollback void deleteGenre() { assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(1L); }); } diff --git a/src/test/resources/db/changelog/data/0001-chema-data.yaml b/src/test/resources/db/changelog/data/2019-06-22--0001-data.yaml similarity index 86% rename from src/test/resources/db/changelog/data/0001-chema-data.yaml rename to src/test/resources/db/changelog/data/2019-06-22--0001-data.yaml index 7338565..cbfcff5 100644 --- a/src/test/resources/db/changelog/data/0001-chema-data.yaml +++ b/src/test/resources/db/changelog/data/2019-06-22--0001-data.yaml @@ -8,7 +8,7 @@ databaseChangeLog: dbms: h2, oracle encoding: utf8 endDelimiter: ; - path: sql/data-h2.sql + path: sql/2019-06-22--0001-data-h2.sql relativeToChangelogFile: true splitStatements: true stripComments: true \ No newline at end of file diff --git a/src/test/resources/db/changelog/data/sql/data-h2.sql b/src/test/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql similarity index 100% rename from src/test/resources/db/changelog/data/sql/data-h2.sql rename to src/test/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql diff --git a/src/test/resources/db/changelog/db.changelog-master.yaml b/src/test/resources/db/changelog/db.changelog-master.yaml index dccfd73..3adc919 100644 --- a/src/test/resources/db/changelog/db.changelog-master.yaml +++ b/src/test/resources/db/changelog/db.changelog-master.yaml @@ -2,4 +2,4 @@ databaseChangeLog: - include: file: db/changelog/1.0/2019-06-22--0001-schema.yaml - include: - file: db/changelog/data/0001-chema-data.yaml \ No newline at end of file + file: db/changelog/data/2019-06-22--0001-data.yaml \ No newline at end of file From 297e33ec562b72dfc1934b8b6919ac5a5b0c3531 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 25 Jun 2019 18:08:08 +0300 Subject: [PATCH 36/70] =?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/java/ru/otus/mkulikov/app/dao/AuthorDao.java | 2 -- src/main/java/ru/otus/mkulikov/app/dao/BookDao.java | 2 ++ src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java | 2 -- .../java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java | 4 ---- src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java | 2 ++ .../java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java | 2 ++ .../ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java | 4 ---- src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java | 2 -- .../java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java | 6 ------ src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java | 7 +------ .../java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java | 7 ------- .../java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java | 6 ------ .../mkulikov/app/service/AuthorManageSeviceImplTest.java | 6 ------ .../mkulikov/app/service/BookManageSeviceImplTest.java | 6 ------ .../mkulikov/app/service/CommentManageSeviceImplTest.java | 7 ------- .../mkulikov/app/service/GenreManageSeviceImplTest.java | 6 ------ src/test/resources/application.yml | 2 +- 17 files changed, 8 insertions(+), 65 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index 87ee2bc..b4b1933 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -2,7 +2,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; /** @@ -13,7 +12,6 @@ */ @Repository -@Transactional public interface AuthorDao extends JpaRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index fc5c1b8..7cbcd93 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -1,6 +1,7 @@ package ru.otus.mkulikov.app.dao; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import ru.otus.mkulikov.app.model.Book; /** @@ -10,6 +11,7 @@ * Time: 13:28 */ +@Repository public interface BookDao extends JpaRepository, BookDaoCustom { } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java index 402e1a9..96385f9 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.app.dao; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Book; import java.util.List; @@ -14,7 +13,6 @@ */ @Repository -@Transactional public interface BookDaoCustom { Book getById(long id); diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java index f4cb17a..d2480bc 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java @@ -1,8 +1,6 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Book; import javax.persistence.EntityManager; @@ -17,8 +15,6 @@ */ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) -@Repository -@Transactional @RequiredArgsConstructor public class BookDaoCustomImpl implements BookDaoCustom { diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index 66f53de..47269b3 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -1,6 +1,7 @@ package ru.otus.mkulikov.app.dao; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import ru.otus.mkulikov.app.model.Comment; /** @@ -10,6 +11,7 @@ * Time: 23:48 */ +@Repository public interface CommentDao extends JpaRepository, CommentDaoCustom { } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java index 071c93f..a799292 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java @@ -1,5 +1,6 @@ package ru.otus.mkulikov.app.dao; +import org.springframework.stereotype.Repository; import ru.otus.mkulikov.app.model.Comment; import java.util.List; @@ -11,6 +12,7 @@ * Time: 23:48 */ +@Repository public interface CommentDaoCustom { T getById(long id); diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java index 36f207c..a68607f 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java @@ -1,8 +1,6 @@ package ru.otus.mkulikov.app.dao; import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Comment; import javax.persistence.EntityManager; @@ -17,8 +15,6 @@ */ @SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) -@Repository -@Transactional @RequiredArgsConstructor public class CommentDaoCustomImpl implements CommentDaoCustom { diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 982c856..2a95644 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -2,7 +2,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; /** @@ -13,7 +12,6 @@ */ @Repository -@Transactional public interface GenreDao extends JpaRepository { } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 8ab00fe..f722958 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -7,7 +7,6 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; @@ -39,7 +38,6 @@ class AuthorDaoJpaTest { @Test @DisplayName("Получение автора по id") - @Rollback void getById() { Optional author = authorDao.findById(1L); @@ -55,7 +53,6 @@ void getById() { @Test @DisplayName("Получение всех авторов") - @Rollback void getAllObjects() { List authors = authorDao.findAll(); @@ -71,7 +68,6 @@ void getAllObjects() { @Test @DisplayName("Добавление автора") - @Rollback void addObject() { Author author = authorDao.save(new Author("TestSurname", "TestFirstName", "TestSecondName")); Optional author_selected = authorDao.findById(4L); @@ -88,7 +84,6 @@ void addObject() { @Test @DisplayName("Удаление автора, который используется в таблице книг") - @Rollback void deleteObject() { authorDao.deleteById(1L); //assertThat(authorDao.count()).isEqualTo(1); @@ -97,7 +92,6 @@ void deleteObject() { @Test @DisplayName("Обновление автора") - @Rollback void updateObject() { authorDao.save( new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 698ec53..253f484 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; @@ -34,6 +33,7 @@ @ComponentScan("ru.otus.mkulikov.app") @DataJpaTest @TestPropertySource(locations= "classpath:application.yml") + class BookDaoJpaTest { @Autowired @@ -45,7 +45,6 @@ class BookDaoJpaTest { @Test @DisplayName("Получение книги по id") - @Rollback void getById() { Book book = bookDaoJpa.getById(1L); @@ -63,7 +62,6 @@ void getById() { @Test @DisplayName("Получение всех книг") - @Rollback void getAllObjects() { List books = bookDaoJpa.getAllObjects(); @@ -79,7 +77,6 @@ void getAllObjects() { @Test @DisplayName("Добавление книги") - @Rollback void addObject() { bookDaoJpa.save(getNewBook()); Book book = bookDaoJpa.getById(4L); @@ -97,7 +94,6 @@ void addObject() { @Test @DisplayName("Удаление книги по id") - @Rollback void deleteObject() { bookDaoJpa.deleteById(1L); Book book = bookDaoJpa.getById(1L); @@ -106,7 +102,6 @@ void deleteObject() { @Test @DisplayName("Обновление книги") - @Rollback void updateObject() { bookDaoJpa.save(getUpdatedBook()); Book book2 = bookDaoJpa.getById(1L); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java index fe4c23d..3621ee7 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.Import; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Book; @@ -42,7 +41,6 @@ class CommentDaoJpaTest { @Test @DisplayName("Получение комментария по id") - @Rollback void getById() { Comment comment = commentDaoJpa.getById(1L); @@ -59,7 +57,6 @@ void getById() { @Test @DisplayName("Получение всех комментариев") - @Rollback void getAllObjects() { List comments = commentDaoJpa.findAll(); @@ -76,7 +73,6 @@ void getAllObjects() { @Test @DisplayName("Получение всех комментариев для книги") - @Rollback void getObjectsByBook() { List comments = commentDaoJpa.getByBookId(1L); @@ -91,7 +87,6 @@ void getObjectsByBook() { @Test @DisplayName("Добавление комментария") - @Rollback void addObject() { Date date = new Date(); Book book = bookDaoJpa.getById(1L); @@ -112,7 +107,6 @@ void addObject() { @Test @DisplayName("Удаление комментария") - @Rollback void deleteObject() { commentDaoJpa.deleteById(1L); Comment comment = commentDaoJpa.getById(1L); @@ -121,7 +115,6 @@ void deleteObject() { @Test @DisplayName("Обновление комментария") - @Rollback void updateObject() { Comment comment1 = commentDaoJpa.getById(1L); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index 1f43565..6d697ce 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -7,7 +7,6 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; @@ -38,7 +37,6 @@ class GenreDaoJpaTest { @Test @DisplayName("Получение жанра по id") - @Rollback void getById() { Genre genre = genreDaoJpa.findById(1L).get(); @@ -52,7 +50,6 @@ void getById() { @Test @DisplayName("Получение всех жанров") - @Rollback void getAllObjects() { List genres = genreDaoJpa.findAll(); @@ -68,7 +65,6 @@ void getAllObjects() { @Test @DisplayName("Добавление жанра") - @Rollback void addObject() { genreDaoJpa.save(new Genre("Test4")); Genre genre = genreDaoJpa.findById(4L).get(); @@ -83,7 +79,6 @@ void addObject() { @Test @DisplayName("Удаление жанра, который используется в таблице книг") - @Rollback void deleteObject() { genreDaoJpa.deleteById(1L); //assertThat(authorDao.count()).isEqualTo(1); @@ -92,7 +87,6 @@ void deleteObject() { @Test @DisplayName("Обновление жанра") - @Rollback void updateObject() { genreDaoJpa.save(new Genre(1L, "UpdatedName")); Genre genre = genreDaoJpa.findById(1L).get(); diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 426e417..0fcbce3 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -7,7 +7,6 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; @@ -39,7 +38,6 @@ class AuthorManageSeviceImplTest { @Test @DisplayName("Получение автора по id") - @Rollback void getAuthorById() { Author author = authorManageService.getAuthorById(1L); @@ -55,7 +53,6 @@ void getAuthorById() { @Test @DisplayName("Получение всех авторов") - @Rollback void getAuthors() { List authors = authorManageService.getAuthors(); @@ -71,7 +68,6 @@ void getAuthors() { @Test @DisplayName("Добавление автора") - @Rollback void addAuthor() { long id = authorManageService.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); Author author_selected = authorManageService.getAuthorById(id); @@ -88,7 +84,6 @@ void addAuthor() { @Test @DisplayName("Обновление автора") - @Rollback void updateAuthor() { int count = authorManageService.updateAuthor(1L, "TestSurname", "TestFirstName", "TestSecondName"); Author author2 = authorManageService.getAuthorById(1L); @@ -104,7 +99,6 @@ void updateAuthor() { @Test @DisplayName("Удаление автора, который используется в таблице книг") - @Rollback void deleteAuthor() { assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(1L); }); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index a4902ed..42bc191 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Book; @@ -39,7 +38,6 @@ class BookManageSeviceImplTest { @Test @DisplayName("Получение книги по id") - @Rollback void getBookById() { Book book = booksManageSevice.getBookById(1L); @@ -59,7 +57,6 @@ void getBookById() { @Test @DisplayName("Получение всех книг") - @Rollback void getBooks() { List books = booksManageSevice.getBooks(); @@ -75,7 +72,6 @@ void getBooks() { @Test @DisplayName("Добавление книги") - @Rollback void addBook() { long id = booksManageSevice.addBook("Test_Book", 2, 3, "Test_Description"); Book book = booksManageSevice.getBookById(id); @@ -93,7 +89,6 @@ void addBook() { @Test @DisplayName("Обновление книги") - @Rollback void updateBook() { int count = booksManageSevice.updateBook(1L, "Test_Book", 1, 1, "Test_Description"); Book book2 = booksManageSevice.getBookById(1L); @@ -108,7 +103,6 @@ void updateBook() { @Test @DisplayName("Удаление книги по id") - @Rollback void deleteBook() { booksManageSevice.deleteBook(1L); assertNull(booksManageSevice.getBookById(1L)); diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index 33f6048..e886fd2 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Comment; @@ -38,7 +37,6 @@ class CommentManageSeviceImplTest { @Test @DisplayName("Получение комментария по id") - @Rollback void getCommentById() { Comment comment = commentManageService.getCommentById(1L); @@ -55,7 +53,6 @@ void getCommentById() { @Test @DisplayName("Получение всех комментариев") - @Rollback void getComments() { List comments = commentManageService.getComments(); @@ -72,7 +69,6 @@ void getComments() { @Test @DisplayName("Добавление комментария") - @Rollback void addComment() { long id = commentManageService.addComment(1L, "user5", "text5"); @@ -91,7 +87,6 @@ void addComment() { @Test @DisplayName("Получение комментариев по Id книги") - @Rollback void getCommentsByBookId() { List comments = commentManageService.getCommentsByBookId(1L); @@ -106,7 +101,6 @@ void getCommentsByBookId() { @Test @DisplayName("Обновление комментария") - @Rollback void updateComment() { Comment comment1 = commentManageService.getCommentById(1L); int count = commentManageService.updateComment(1L, "TestUser", "TestText"); @@ -128,7 +122,6 @@ void updateComment() { @Test @DisplayName("Удаление комментария") - @Rollback void deleteComment() { commentManageService.deleteComment(1L); assertNull(commentManageService.getCommentById(1L)); diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 4460d08..0e917c7 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -7,7 +7,6 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; @@ -39,7 +38,6 @@ class GenreManageSeviceImplTest { @Test @DisplayName("Получение жанра по id") - @Rollback void getGenreById() { Genre genre = genreManageService.getGenreById(1L); @@ -53,7 +51,6 @@ void getGenreById() { @Test @DisplayName("Получение всех жанров") - @Rollback void getGenres() { List genres = genreManageService.getGenres(); @@ -69,7 +66,6 @@ void getGenres() { @Test @DisplayName("Добавление жанра") - @Rollback void addGenre() { long id = genreManageService.addGenre("Test4"); Genre genre = genreManageService.getGenreById(id); @@ -84,7 +80,6 @@ void addGenre() { @Test @DisplayName("Обновление жанра") - @Rollback void updateGenre() { int count = genreManageService.updateGenre(1L, "UpdatedName"); Genre genre2 = genreManageService.getGenreById(1L); @@ -98,7 +93,6 @@ void updateGenre() { @Test @DisplayName("Удаление жанра, который используется в таблице книг") - @Rollback void deleteGenre() { assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(1L); }); } diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 9219289..26a0056 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -16,4 +16,4 @@ spring: format_sql: true liquibase: - enabled: true \ No newline at end of file + enabled: true From 691f77f9d27f68fa38b0ce5edb50b98e7397f39a Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 26 Jun 2019 18:09:17 +0300 Subject: [PATCH 37/70] =?UTF-8?q?-=20=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20@Run?= =?UTF-8?q?With(SpringRunner.class).=20-=20=D0=92=D0=BE=D0=B7=D0=B2=D1=80?= =?UTF-8?q?=D0=B0=D1=89=D0=B0=D1=8E=20Optional=20=D0=B2=20DAO.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../otus/mkulikov/app/dao/BookDaoCustom.java | 5 +++-- .../mkulikov/app/dao/BookDaoCustomImpl.java | 7 +++++-- .../mkulikov/app/dao/CommentDaoCustom.java | 3 ++- .../mkulikov/app/dao/CommentDaoCustomImpl.java | 7 +++++-- .../app/service/BookManageSeviceImpl.java | 2 +- .../app/service/CommentManageServiceImpl.java | 6 +++--- .../mkulikov/app/dao/AuthorDaoJpaTest.java | 16 +++++++++++----- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 12 +++++------- .../mkulikov/app/dao/CommentDaoJpaTest.java | 18 +++++++++--------- .../otus/mkulikov/app/dao/GenreDaoJpaTest.java | 3 +-- .../otus/mkulikov/app/model/DateUtilTest.java | 4 +++- .../service/AuthorManageSeviceImplTest.java | 7 +++++-- .../app/service/BookManageSeviceImplTest.java | 3 +-- .../service/CommentManageSeviceImplTest.java | 10 ++++------ .../app/service/GenreManageSeviceImplTest.java | 3 +-- 15 files changed, 59 insertions(+), 47 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java index 96385f9..fcb0cb1 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java @@ -4,6 +4,7 @@ import ru.otus.mkulikov.app.model.Book; import java.util.List; +import java.util.Optional; /** * Created by IntelliJ IDEA. @@ -15,7 +16,7 @@ @Repository public interface BookDaoCustom { - Book getById(long id); + Optional getById(long id); - List getAllObjects(); + List getAllObjects(); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java index d2480bc..5b4bce0 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java @@ -6,6 +6,7 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; +import java.util.Optional; /** * Created by IntelliJ IDEA. @@ -22,7 +23,7 @@ public class BookDaoCustomImpl implements BookDaoCustom { private EntityManager em; @Override - public Book getById(long id) { + public Optional getById(long id) { List books = em.createQuery("select b " + "from Book b " + "inner join fetch b.author a " @@ -32,7 +33,9 @@ public Book getById(long id) { .getResultList(); em.clear(); - return (books != null && !books.isEmpty()) ? books.get(0) : null; + return Optional.of( + (books != null && !books.isEmpty()) ? books.get(0) : null + ); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java index a799292..3dcabef 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java @@ -4,6 +4,7 @@ import ru.otus.mkulikov.app.model.Comment; import java.util.List; +import java.util.Optional; /** * Created by IntelliJ IDEA. @@ -15,7 +16,7 @@ @Repository public interface CommentDaoCustom { - T getById(long id); + Optional getById(long id); List getByBookId(long bookId); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java index a68607f..7a9e13c 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java @@ -6,6 +6,7 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; +import java.util.Optional; /** * Created by IntelliJ IDEA. @@ -22,7 +23,7 @@ public class CommentDaoCustomImpl implements CommentDaoCustom { private EntityManager em; @Override - public Comment getById(long id) { + public Optional getById(long id) { List list = em.createQuery( "select c " + "from Comment c " + @@ -32,7 +33,9 @@ public Comment getById(long id) { .getResultList(); em.clear(); - return (list != null && !list.isEmpty()) ? list.get(0) : null; + return Optional.of( + (list != null && !list.isEmpty()) ? list.get(0) : null + ); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index e96cfbd..a20c6bb 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -28,7 +28,7 @@ public class BookManageSeviceImpl implements BookManageSevice { @Override public Book getBookById(long id) { - return bookDao.getById(id); + return bookDao.getById(id).get(); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index 2791b06..bb03ccf 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -26,7 +26,7 @@ public class CommentManageServiceImpl implements CommentManageService { @Override public Comment getCommentById(long id) { - return commentDao.getById(id); + return commentDao.getById(id).get(); } @Override @@ -41,7 +41,7 @@ public List getCommentsByBookId(long bookId) { @Override public long addComment(long bookId, String userName, String text) { - Book book = bookDao.getById(bookId); + Book book = bookDao.getById(bookId).get(); Comment comment = commentDao.save(new Comment(book, new Date(), userName, text)); return comment.getId(); @@ -49,7 +49,7 @@ public long addComment(long bookId, String userName, String text) { @Override public int updateComment(long id, String userName, String text) { - Comment comment = commentDao.getById(id); + Comment comment = commentDao.getById(id).get(); comment.setAddRecordDate(new Date()); comment.setUserName(userName); comment.setText(text); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index f722958..35291ea 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -9,11 +9,14 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; import java.util.List; import java.util.Optional; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -26,10 +29,9 @@ * Time: 10:12 */ +@DataJpaTest @DisplayName("Класс AuthorDaoJpa") -@RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") -@DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class AuthorDaoJpaTest { @@ -84,10 +86,14 @@ void addObject() { @Test @DisplayName("Удаление автора, который используется в таблице книг") + @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteObject() { - authorDao.deleteById(1L); - //assertThat(authorDao.count()).isEqualTo(1); - assertThrows(DataIntegrityViolationException.class, () -> { authorDao.count(); }); + //authorDao.deleteById(1L); + ////assertThat(authorDao.count()).isEqualTo(1); + //assertThrows(DataIntegrityViolationException.class, () -> { authorDao.count(); }); + + assertThrows(DataIntegrityViolationException.class, () -> authorDao.deleteById(1L)); + assertThat(authorDao.count()).isEqualTo(3); } @Test diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 253f484..1ae9179 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -28,12 +28,10 @@ * Time: 13:16 */ +@DataJpaTest @DisplayName("Класс BookDaoJpa") -@RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") -@DataJpaTest @TestPropertySource(locations= "classpath:application.yml") - class BookDaoJpaTest { @Autowired @@ -46,7 +44,7 @@ class BookDaoJpaTest { @Test @DisplayName("Получение книги по id") void getById() { - Book book = bookDaoJpa.getById(1L); + Book book = bookDaoJpa.getById(1L).get(); assertAll( "book", @@ -79,7 +77,7 @@ void getAllObjects() { @DisplayName("Добавление книги") void addObject() { bookDaoJpa.save(getNewBook()); - Book book = bookDaoJpa.getById(4L); + Book book = bookDaoJpa.getById(4L).get(); assertAll( "book", @@ -96,7 +94,7 @@ void addObject() { @DisplayName("Удаление книги по id") void deleteObject() { bookDaoJpa.deleteById(1L); - Book book = bookDaoJpa.getById(1L); + Book book = bookDaoJpa.getById(1L).get(); assertNull(book); } @@ -104,7 +102,7 @@ void deleteObject() { @DisplayName("Обновление книги") void updateObject() { bookDaoJpa.save(getUpdatedBook()); - Book book2 = bookDaoJpa.getById(1L); + Book book2 = bookDaoJpa.getById(1L).get(); assertAll( "book", diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java index 3621ee7..e356272 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java @@ -5,6 +5,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; @@ -27,10 +28,9 @@ * Time: 9:45 */ -@DisplayName("Класс CommentDaoJpa") -@RunWith(SpringRunner.class) -@Import({CommentDaoCustomImpl.class, BookDaoCustomImpl.class}) @DataJpaTest +@DisplayName("Класс CommentDaoJpa") +@ComponentScan("ru.otus.mkulikov.app") @TestPropertySource(locations= "classpath:application.yml") class CommentDaoJpaTest { @@ -42,7 +42,7 @@ class CommentDaoJpaTest { @Test @DisplayName("Получение комментария по id") void getById() { - Comment comment = commentDaoJpa.getById(1L); + Comment comment = commentDaoJpa.getById(1L).get(); assertAll( "comment", @@ -89,10 +89,10 @@ void getObjectsByBook() { @DisplayName("Добавление комментария") void addObject() { Date date = new Date(); - Book book = bookDaoJpa.getById(1L); + Book book = bookDaoJpa.getById(1L).get(); commentDaoJpa.save(new Comment(book, date, "user5", "text5")); - Comment comment = commentDaoJpa.getById(5L); + Comment comment = commentDaoJpa.getById(5L).get(); assertAll( "comment", @@ -109,19 +109,19 @@ void addObject() { @DisplayName("Удаление комментария") void deleteObject() { commentDaoJpa.deleteById(1L); - Comment comment = commentDaoJpa.getById(1L); + Comment comment = commentDaoJpa.getById(1L).get(); assertNull(comment); } @Test @DisplayName("Обновление комментария") void updateObject() { - Comment comment1 = commentDaoJpa.getById(1L); + Comment comment1 = commentDaoJpa.getById(1L).get(); Date date = new Date(); commentDaoJpa.save(new Comment(1L, comment1.getBook(), date, "TestUser", "TestText")); - Comment comment2 = commentDaoJpa.getById(1L); + Comment comment2 = commentDaoJpa.getById(1L).get(); assertAll( "comment", diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index 6d697ce..ba74811 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -25,10 +25,9 @@ * Time: 9:45 */ +@DataJpaTest @DisplayName("Класс GenreDaoJpa") -@RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") -@DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class GenreDaoJpaTest { diff --git a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java index aaab80c..0f96cc4 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java @@ -2,7 +2,9 @@ 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.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.utils.DateUtil; @@ -22,7 +24,7 @@ */ @DisplayName("Класс DateUtil") -@RunWith(SpringRunner.class) +@ExtendWith({SpringExtension.class}) class DateUtilTest { @Test diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 0fcbce3..6857b10 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -9,10 +9,13 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -26,10 +29,9 @@ * Time: 15:59 */ +@DataJpaTest @DisplayName("Класс AuthorManageSevice") -@RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") -@DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class AuthorManageSeviceImplTest { @@ -99,6 +101,7 @@ void updateAuthor() { @Test @DisplayName("Удаление автора, который используется в таблице книг") + @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteAuthor() { assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(1L); }); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 42bc191..2467fc7 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -26,10 +26,9 @@ * Time: 13:40 */ +@DataJpaTest @DisplayName("Класс BookManageSevice") -@RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") -@DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class BookManageSeviceImplTest { diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index e886fd2..2022560 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -13,6 +13,7 @@ import java.util.List; +import static org.junit.Assert.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -25,10 +26,9 @@ * Time: 15:56 */ +@DataJpaTest @DisplayName("Класс CommentManageSevice") -@RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") -@DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class CommentManageSeviceImplTest { @@ -71,15 +71,13 @@ void getComments() { @DisplayName("Добавление комментария") void addComment() { long id = commentManageService.addComment(1L, "user5", "text5"); - - Comment comment = commentManageService.getCommentById(5L); + Comment comment = commentManageService.getCommentById(id); assertAll( "comment", () -> assertNotNull(comment), () -> assertNotNull(comment.getBook()), - () -> assertEquals(5L, id), - () -> assertEquals(5L, comment.getId()), + () -> assertNotEquals(0, id), () -> assertEquals("user5", comment.getUserName()), () -> assertEquals("text5", comment.getText()) ); diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 0e917c7..a94dd35 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -26,10 +26,9 @@ * Time: 15:56 */ +@DataJpaTest @DisplayName("Класс GenreManageSevice") -@RunWith(SpringRunner.class) @ComponentScan("ru.otus.mkulikov.app") -@DataJpaTest @TestPropertySource(locations= "classpath:application.yml") class GenreManageSeviceImplTest { From 39d6ef97fdac62c780cc9dfe6616a4bd4a02fd68 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 27 Jun 2019 16:13:30 +0300 Subject: [PATCH 38/70] =?UTF-8?q?=D0=98=D0=BD=D1=82=D0=B5=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20Mockito.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 +- .../otus/mkulikov/app/model/DateUtilTest.java | 4 +- .../service/AuthorManageSeviceImplTest.java | 131 +++++++++++------- .../app/service/BookManageSeviceImplTest.java | 6 +- .../service/CommentManageSeviceImplTest.java | 2 - .../service/GenreManageSeviceImplTest.java | 110 +++++++++------ 6 files changed, 158 insertions(+), 106 deletions(-) diff --git a/pom.xml b/pom.xml index 869c9eb..15ac820 100644 --- a/pom.xml +++ b/pom.xml @@ -80,8 +80,15 @@ org.mockito - mockito-all - 1.10.19 + mockito-core + 2.21.0 + test + + + + org.mockito + mockito-junit-jupiter + 2.23.0 test diff --git a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java index 0f96cc4..25f7006 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java @@ -1,11 +1,10 @@ package ru.otus.mkulikov.app.model; +import org.junit.Ignore; 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.test.context.junit.jupiter.SpringExtension; -import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.utils.DateUtil; import java.text.DateFormat; @@ -24,6 +23,7 @@ */ @DisplayName("Класс DateUtil") +@Ignore @ExtendWith({SpringExtension.class}) class DateUtilTest { diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 6857b10..4fd777e 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -1,26 +1,29 @@ package ru.otus.mkulikov.app.service; +import org.junit.Ignore; 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.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.ComponentScan; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; +import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.model.Author; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; /** * Created by IntelliJ IDEA. @@ -29,80 +32,102 @@ * Time: 15:59 */ -@DataJpaTest @DisplayName("Класс AuthorManageSevice") -@ComponentScan("ru.otus.mkulikov.app") @TestPropertySource(locations= "classpath:application.yml") +@ExtendWith(MockitoExtension.class) class AuthorManageSeviceImplTest { - @Autowired - private AuthorManageService authorManageService; + @Mock + private AuthorDao authorDao; + + @InjectMocks + private AuthorManageServiceImpl authorManageService; @Test @DisplayName("Получение автора по id") void getAuthorById() { + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); Author author = authorManageService.getAuthorById(1L); - assertAll( - "author", - () -> assertNotNull(author), - () -> assertEquals(1L, author.getId()), - () -> assertEquals("Surname", author.getSurname()), - () -> assertEquals("FirstName", author.getFirstName()), - () -> assertEquals("SecondName", author.getSecondName()) - ); + assertThat(author).isNotNull(); + assertThat(author).isEqualTo(getAuthor(1L)); } @Test @DisplayName("Получение всех авторов") void getAuthors() { + when(authorDao.findAll()).thenReturn( getAuthorList() ); List authors = authorManageService.getAuthors(); - assertAll( - "authors", - () -> assertNotNull(authors), - () -> assertEquals(3, authors.size()), - () -> assertEquals("Surname", authors.get(0).getSurname()), - () -> assertEquals("Surname2", authors.get(1).getSurname()), - () -> assertEquals("Surname3", authors.get(2).getSurname()) - ); + assertThat(authors).isNotNull(); + assertThat(authors).hasSize(3); + assertThat(authors).containsAll(getAuthorList()); } @Test @DisplayName("Добавление автора") void addAuthor() { - long id = authorManageService.addAuthor("TestSurname", "TestFirstName", "TestSecondName"); - Author author_selected = authorManageService.getAuthorById(id); - - assertAll( - "author", - () -> assertNotNull(author_selected), - () -> assertNotEquals(0, id), - () -> assertEquals("TestSurname", author_selected.getSurname()), - () -> assertEquals("TestFirstName", author_selected.getFirstName()), - () -> assertEquals("TestSecondName", author_selected.getSecondName()) - ); + when(authorDao.save(any(Author.class))).then(new Answer() { + int sequence = 1; + + @Override + public Author answer(InvocationOnMock invocationOnMock) throws Throwable { + Author author = (Author) invocationOnMock.getArgument(0); + author.setId(++sequence); + return author; + } + }); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(2L)) ); + + long id = authorManageService.addAuthor("Surname1", "FirstName1", "SecondName1"); + Author author = authorManageService.getAuthorById(id); + + assertThat(id).isEqualTo(2L); + assertThat(author).isNotNull(); + assertThat(author).isEqualTo(getAuthor(2L)); } @Test + @Ignore @DisplayName("Обновление автора") void updateAuthor() { - int count = authorManageService.updateAuthor(1L, "TestSurname", "TestFirstName", "TestSecondName"); - Author author2 = authorManageService.getAuthorById(1L); - - assertAll( - "author", - () -> assertEquals(1, count), - () -> assertEquals("TestSurname", author2.getSurname()), - () -> assertEquals("TestFirstName", author2.getFirstName()), - () -> assertEquals("TestSecondName", author2.getSecondName()) - ); + when(authorDao.save(any(Author.class))).then(new Answer() { + + @Override + public Author answer(InvocationOnMock invocationOnMock) throws Throwable { + Author author = (Author) invocationOnMock.getArgument(0); + author.setId(1L); + return author; + } + }); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); + + int count = authorManageService.updateAuthor(1L, "Surname1", "FirstName1", "SecondName1"); + Author author = authorManageService.getAuthorById(1L); + + assertThat(count).isEqualTo(1); + assertThat(author).isNotNull(); + assertThat(author).isEqualTo(getAuthor(1L)); } @Test + @Ignore @DisplayName("Удаление автора, который используется в таблице книг") - @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteAuthor() { + doThrow(DataIntegrityViolationException.class).when(authorDao).deleteById(1L); assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(1L); }); } + + private List getAuthorList() { + List authors = new ArrayList(); + authors.add(getAuthor(1L)); + authors.add(getAuthor(2L)); + authors.add(getAuthor(3L)); + return authors; + } + + private Author getAuthor(long id) { + return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + } + } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 2467fc7..73e988d 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -2,12 +2,10 @@ 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.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.utils.DateUtil; @@ -17,7 +15,7 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -104,7 +102,7 @@ void updateBook() { @DisplayName("Удаление книги по id") void deleteBook() { booksManageSevice.deleteBook(1L); - assertNull(booksManageSevice.getBookById(1L)); + assertThrows(NullPointerException.class, () -> { booksManageSevice.getBookById(1L); }); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index 2022560..baa45ad 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -2,12 +2,10 @@ 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.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.utils.DateUtil; diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index a94dd35..4c2a563 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -2,22 +2,27 @@ 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.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.ComponentScan; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; +import ru.otus.mkulikov.app.dao.GenreDao; import ru.otus.mkulikov.app.model.Genre; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; /** * Created by IntelliJ IDEA. @@ -26,73 +31,92 @@ * Time: 15:56 */ -@DataJpaTest @DisplayName("Класс GenreManageSevice") -@ComponentScan("ru.otus.mkulikov.app") +@ExtendWith(MockitoExtension.class) @TestPropertySource(locations= "classpath:application.yml") class GenreManageSeviceImplTest { - @Autowired - private GenreManageService genreManageService; + @Mock + private GenreDao genreDao; + + @InjectMocks + private GenreManageServiceImpl genreManageService; @Test @DisplayName("Получение жанра по id") void getGenreById() { + when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); Genre genre = genreManageService.getGenreById(1L); - assertAll( - "genre", - () -> assertNotNull(genre), - () -> assertEquals(1L, genre.getId()), - () -> assertEquals("Genre1", genre.getName()) - ); + assertThat(genre).isNotNull(); + assertThat(genre).isEqualTo(getGenre(1L)); } @Test @DisplayName("Получение всех жанров") void getGenres() { - List genres = genreManageService.getGenres(); - - assertAll( - "genres", - () -> assertNotNull(genres), - () -> assertEquals(3, genres.size()), - () -> assertEquals("Genre1", genres.get(0).getName()), - () -> assertEquals("Genre2", genres.get(1).getName()), - () -> assertEquals("Genre3", genres.get(2).getName()) - ); + when(genreDao.findAll()).thenReturn( getGenreList() ); + List authors = genreManageService.getGenres(); + + assertThat(authors).isNotNull(); + assertThat(authors).hasSize(3); + assertThat(authors).containsAll(getGenreList()); } @Test @DisplayName("Добавление жанра") void addGenre() { + when(genreDao.save(any(Genre.class))).then(new Answer() { + int sequence = 1; + + @Override + public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { + Genre author = (Genre) invocationOnMock.getArgument(0); + author.setId(++sequence); + return author; + } + }); + long id = genreManageService.addGenre("Test4"); - Genre genre = genreManageService.getGenreById(id); - - assertAll( - "genre", - () -> assertNotNull(genre), - () -> assertNotEquals(0, id), - () -> assertEquals("Test4", genre.getName()) - ); + + assertThat(id).isEqualTo(2L); } @Test @DisplayName("Обновление жанра") void updateGenre() { + when(genreDao.save(any(Genre.class))).then(new Answer() { + + @Override + public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { + Genre genre = (Genre) invocationOnMock.getArgument(0); + genre.setId(1L); + return genre; + } + }); + when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); + int count = genreManageService.updateGenre(1L, "UpdatedName"); - Genre genre2 = genreManageService.getGenreById(1L); - assertAll( - "genre", - () -> assertEquals(1, count), - () -> assertEquals("UpdatedName", genre2.getName()) - ); + assertThat(count).isEqualTo(1); } @Test @DisplayName("Удаление жанра, который используется в таблице книг") void deleteGenre() { + doThrow(DataIntegrityViolationException.class).when(genreDao).deleteById(1L); assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(1L); }); } + + private List getGenreList() { + List genres = new ArrayList(); + genres.add(getGenre(1L)); + genres.add(getGenre(2L)); + genres.add(getGenre(3L)); + return genres; + } + + private Genre getGenre(long id) { + return new Genre(id, "Genre" + id); + } } From 30868a5857d904b9bd82e2d9158e6061e4579aad Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 5 Jul 2019 18:07:55 +0300 Subject: [PATCH 39/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=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 --- .../app/service/CommentManageServiceImpl.java | 4 +- .../ru/otus/mkulikov/app/utils/DateUtil.java | 16 ++ .../otus/mkulikov/app/model/DateUtilTest.java | 27 ++- .../service/AuthorManageSeviceImplTest.java | 1 - .../service/CommentManageSeviceImplTest.java | 183 ++++++++++-------- 5 files changed, 138 insertions(+), 93 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index bb03ccf..8daa986 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -9,6 +9,7 @@ import java.util.Date; import java.util.List; +import java.util.Optional; /** * Created by IntelliJ IDEA. @@ -26,7 +27,8 @@ public class CommentManageServiceImpl implements CommentManageService { @Override public Comment getCommentById(long id) { - return commentDao.getById(id).get(); + Optional comment = commentDao.getById(id); + return comment.get(); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java index ffbce20..832025f 100644 --- a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java +++ b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java @@ -2,6 +2,10 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.Date; /** @@ -26,4 +30,16 @@ public static String dateTimeToString(Date date) { DateFormat dateFormat = new SimpleDateFormat(DATE_TIME_FORMAT); return date != null ? dateFormat.format(date) : null; } + + public static java.util.Date stringToDateTime(String stringDate) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_TIME_FORMAT); + LocalDateTime dateTime = LocalDateTime.parse(stringDate, formatter); + return dateTime != null ? convertToDateViaInstant(dateTime) : null; + } + + public static Date convertToDateViaInstant(LocalDateTime dateToConvert) { + return java.util.Date + .from(dateToConvert.atZone(ZoneId.systemDefault()) + .toInstant()); + } } diff --git a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java index 25f7006..b4a71c5 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java @@ -1,10 +1,7 @@ package ru.otus.mkulikov.app.model; -import org.junit.Ignore; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.test.context.junit.jupiter.SpringExtension; import ru.otus.mkulikov.app.utils.DateUtil; import java.text.DateFormat; @@ -23,15 +20,16 @@ */ @DisplayName("Класс DateUtil") -@Ignore -@ExtendWith({SpringExtension.class}) class DateUtilTest { + private final String DATE_PATTERN = "yyyy-MM-dd"; + private final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; + @Test - @DisplayName("Формат даты 'yyyy-MM-dd'") + @DisplayName("Перевод даты в строку, формат даты '" + DATE_PATTERN + "'") void dateToString() { Book book = getNewBook(); - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + DateFormat dateFormat = new SimpleDateFormat(DATE_PATTERN); assertAll( "book", @@ -41,10 +39,10 @@ void dateToString() { } @Test - @DisplayName("Формат даты 'yyyy-MM-dd HH:mm:ss'") + @DisplayName("Перевод даты в строку, формат даты '" + DATETIME_PATTERN + "'") void dateTimeToString() { Book book = getNewBook(); - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + DateFormat dateFormat = new SimpleDateFormat(DATETIME_PATTERN); assertAll( "book", @@ -53,6 +51,17 @@ void dateTimeToString() { ); } + @Test + @DisplayName("Перевод строки в дату, формат даты '" + DATETIME_PATTERN + "'") + void stringToDateTime() { + String datetime = "2019-01-01 10:01:01"; + + Date date = DateUtil.stringToDateTime(datetime); + DateFormat dateFormat = new SimpleDateFormat(DATETIME_PATTERN); + + assertEquals(datetime, dateFormat.format(date)); + } + private Book getNewBook() { Author author = new Author(1L, "TestSurname", "TestFirstName", "TestSecondName"); Genre genre = new Genre("Test4"); diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 4fd777e..a7a0fc7 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -129,5 +129,4 @@ private List getAuthorList() { private Author getAuthor(long id) { return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); } - } diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index baa45ad..d555abe 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -2,20 +2,29 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.ComponentScan; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; +import ru.otus.mkulikov.app.dao.CommentDao; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.utils.DateUtil; +import java.util.ArrayList; +import java.util.Date; import java.util.List; +import java.util.Optional; -import static org.junit.Assert.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; /** * Created by IntelliJ IDEA. @@ -24,102 +33,112 @@ * Time: 15:56 */ -@DataJpaTest @DisplayName("Класс CommentManageSevice") -@ComponentScan("ru.otus.mkulikov.app") +@ExtendWith(MockitoExtension.class) @TestPropertySource(locations= "classpath:application.yml") class CommentManageSeviceImplTest { - @Autowired - private CommentManageService commentManageService; + @Mock + private CommentDao commentDao; + + @InjectMocks + private CommentManageServiceImpl commentManageService; @Test @DisplayName("Получение комментария по id") void getCommentById() { - Comment comment = commentManageService.getCommentById(1L); - - assertAll( - "comment", - () -> assertNotNull(comment), - () -> assertNotNull(comment.getBook()), - () -> assertEquals(1L, comment.getId()), - () -> assertEquals("user1", comment.getUserName()), - () -> assertEquals("2019-01-01 10:01:01", DateUtil.dateTimeToString(comment.getAddRecordDate())), - () -> assertEquals("text1", comment.getText()) - ); + Comment comment = getComment(1L); + when(commentDao.getById(anyLong())).thenReturn( Optional.of(comment) ); + Comment commentById = commentManageService.getCommentById(1L); + + assertThat(commentById).isNotNull(); + assertThat(commentById).isEqualTo(comment); } @Test @DisplayName("Получение всех комментариев") void getComments() { + List commentsList = getCommentList(); + when(commentDao.findAll()).thenReturn( commentsList ); List comments = commentManageService.getComments(); - assertAll( - "comments", - () -> assertNotNull(comments), - () -> assertEquals(4, comments.size()), - () -> assertEquals("text1", comments.get(0).getText()), - () -> assertEquals("text2", comments.get(1).getText()), - () -> assertEquals("text3", comments.get(2).getText()), - () -> assertEquals("text4", comments.get(3).getText()) - ); + assertThat(comments).isNotNull(); + assertThat(comments).hasSize(4); + assertThat(comments).containsAll(commentsList); } - @Test - @DisplayName("Добавление комментария") - void addComment() { - long id = commentManageService.addComment(1L, "user5", "text5"); - Comment comment = commentManageService.getCommentById(id); - - assertAll( - "comment", - () -> assertNotNull(comment), - () -> assertNotNull(comment.getBook()), - () -> assertNotEquals(0, id), - () -> assertEquals("user5", comment.getUserName()), - () -> assertEquals("text5", comment.getText()) - ); - } + //@Test + //@DisplayName("Добавление комментария") + //void addComment() { + // long id = commentManageService.addComment(1L, "user5", "text5"); + // Comment comment = commentManageService.getCommentById(id); + // + // assertAll( + // "comment", + // () -> assertNotNull(comment), + // () -> assertNotNull(comment.getBook()), + // () -> assertNotEquals(0, id), + // () -> assertEquals("user5", comment.getUserName()), + // () -> assertEquals("text5", comment.getText()) + // ); + //} + + //@Test + //@DisplayName("Получение комментариев по Id книги") + //void getCommentsByBookId() { + // List comments = commentManageService.getCommentsByBookId(1L); + // + // assertAll( + // "comments", + // () -> assertNotNull(comments), + // () -> assertEquals(2, comments.size()), + // () -> assertEquals("text1", comments.get(0).getText()), + // () -> assertEquals("text2", comments.get(1).getText()) + // ); + //} + + //@Test + //@DisplayName("Обновление комментария") + //void updateComment() { + // Comment comment1 = commentManageService.getCommentById(1L); + // int count = commentManageService.updateComment(1L, "TestUser", "TestText"); + // Comment comment2 = commentManageService.getCommentById(1L); + // + // assertAll( + // "comment", + // () -> assertNotNull(comment1), + // () -> assertNotNull(comment2), + // () -> assertNotNull(comment1.getBook()), + // () -> assertNotNull(comment2.getBook()), + // () -> assertEquals(1, count), + // () -> assertEquals("user1", comment1.getUserName()), + // () -> assertEquals("text1", comment1.getText()), + // () -> assertEquals("TestUser", comment2.getUserName()), + // () -> assertEquals("TestText", comment2.getText()) + // ); + //} @Test - @DisplayName("Получение комментариев по Id книги") - void getCommentsByBookId() { - List comments = commentManageService.getCommentsByBookId(1L); - - assertAll( - "comments", - () -> assertNotNull(comments), - () -> assertEquals(2, comments.size()), - () -> assertEquals("text1", comments.get(0).getText()), - () -> assertEquals("text2", comments.get(1).getText()) - ); + @DisplayName("Удаление комментария") + void deleteComment() { + doThrow(DataIntegrityViolationException.class).when(commentDao).deleteById(1L); + assertThrows(DataIntegrityViolationException.class, () -> { commentManageService.deleteComment(1L); }); } - @Test - @DisplayName("Обновление комментария") - void updateComment() { - Comment comment1 = commentManageService.getCommentById(1L); - int count = commentManageService.updateComment(1L, "TestUser", "TestText"); - Comment comment2 = commentManageService.getCommentById(1L); - - assertAll( - "comment", - () -> assertNotNull(comment1), - () -> assertNotNull(comment2), - () -> assertNotNull(comment1.getBook()), - () -> assertNotNull(comment2.getBook()), - () -> assertEquals(1, count), - () -> assertEquals("user1", comment1.getUserName()), - () -> assertEquals("text1", comment1.getText()), - () -> assertEquals("TestUser", comment2.getUserName()), - () -> assertEquals("TestText", comment2.getText()) - ); + private Comment getComment(long id) { + Date date = DateUtil.stringToDateTime("2019-01-01 10:01:01"); + Author author = new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + Genre genre = new Genre(id, "Genre" + id); + Book book = new Book(id, "Test_Book", author, genre, "Test_Description"); + return new Comment(id, book, date, "user" + id, "text" + id); } - @Test - @DisplayName("Удаление комментария") - void deleteComment() { - commentManageService.deleteComment(1L); - assertNull(commentManageService.getCommentById(1L)); + private List getCommentList() { + List comments = new ArrayList(); + comments.add(getComment(1L)); + comments.add(getComment(2L)); + comments.add(getComment(3L)); + comments.add(getComment(4L)); + return comments; } } From cf5d07d3ffab77fa992995265c53c4af5b41a209 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 6 Jul 2019 17:08:47 +0300 Subject: [PATCH 40/70] =?UTF-8?q?-=20=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20Mockito=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=B2.=20-=20=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20@NamedEntityGraph.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- pom.xml | 4 + .../mkulikov/app/dao/BookDaoCustomImpl.java | 21 +-- .../app/dao/CommentDaoCustomImpl.java | 21 +-- .../ru/otus/mkulikov/app/model/Author.java | 8 +- .../java/ru/otus/mkulikov/app/model/Book.java | 42 +++-- .../ru/otus/mkulikov/app/model/Comment.java | 24 +-- .../ru/otus/mkulikov/app/model/Genre.java | 8 +- .../app/service/AuthorManageServiceImpl.java | 4 +- .../app/service/BookManageSeviceImpl.java | 12 +- .../app/service/CommentManageServiceImpl.java | 6 +- .../app/service/GenreManageServiceImpl.java | 4 +- .../ru/otus/mkulikov/app/utils/DateUtil.java | 1 - .../mkulikov/app/dao/AuthorDaoJpaTest.java | 31 ++-- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 28 ++-- .../mkulikov/app/dao/CommentDaoJpaTest.java | 24 ++- .../mkulikov/app/dao/GenreDaoJpaTest.java | 13 +- .../otus/mkulikov/app/model/DateUtilTest.java | 28 +--- .../service/AuthorManageSeviceImplTest.java | 3 - .../app/service/BookManageSeviceImplTest.java | 158 +++++++++++------- .../service/CommentManageSeviceImplTest.java | 116 +++++++------ .../service/GenreManageSeviceImplTest.java | 6 +- 22 files changed, 295 insertions(+), 273 deletions(-) diff --git a/README.md b/README.md index 14d6a5c..0c11d7a 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,8 @@ - Реализовать весь функционал работы с БД в приложении книг с использованием spring-data-jpa репозиториев. ### 19-06-22 Доработки -- Подключил liquibase. \ No newline at end of file +- Подключил liquibase. + +### 19-07-07 Доработки +- Использование Mockito для тестирования сервисов. +- Использование @NamedEntityGraph. diff --git a/pom.xml b/pom.xml index 15ac820..f2cd927 100644 --- a/pom.xml +++ b/pom.xml @@ -146,6 +146,10 @@ org.apache.maven.plugins maven-compiler-plugin + + 11 + 11 + diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java index 5b4bce0..7a4aec5 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import ru.otus.mkulikov.app.model.Book; +import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; @@ -24,27 +25,21 @@ public class BookDaoCustomImpl implements BookDaoCustom { @Override public Optional getById(long id) { - List books = em.createQuery("select b " - + "from Book b " - + "inner join fetch b.author a " - + "inner join fetch b.genre g " - + "where b.id = :id ", Book.class) + EntityGraph entityGraph = em.getEntityGraph("BookGraph"); + List books = em.createQuery("select b from Book b where b.id = :id ", Book.class) + .setHint("javax.persistence.fetchgraph", entityGraph) .setParameter("id", id) .getResultList(); em.clear(); - return Optional.of( - (books != null && !books.isEmpty()) ? books.get(0) : null - ); + return (books != null && !books.isEmpty()) ? Optional.of(books.get(0)) : Optional.empty(); } @Override public List getAllObjects() { - List books = em.createQuery("select b " - + "from Book b " - + "inner join fetch b.author a " - + "inner join fetch b.genre g " - + "order by b.id ", Book.class) + EntityGraph entityGraph = em.getEntityGraph("BookGraph"); + List books = em.createQuery("select b from Book b order by b.id ", Book.class) + .setHint("javax.persistence.fetchgraph", entityGraph) .getResultList(); em.clear(); diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java index 7a9e13c..080bc7d 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import ru.otus.mkulikov.app.model.Comment; +import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; @@ -24,27 +25,21 @@ public class CommentDaoCustomImpl implements CommentDaoCustom { @Override public Optional getById(long id) { - List list = em.createQuery( - "select c " + - "from Comment c " + - "inner join fetch c.book b " + - "where c.id = :id", Comment.class) + EntityGraph entityGraph = em.getEntityGraph("CommentGraph"); + List list = em.createQuery("select c from Comment c where c.id = :id ", Comment.class) + .setHint("javax.persistence.fetchgraph", entityGraph) .setParameter("id", id) .getResultList(); em.clear(); - return Optional.of( - (list != null && !list.isEmpty()) ? list.get(0) : null - ); + return (list != null && !list.isEmpty()) ? Optional.of(list.get(0)) : Optional.empty(); } @Override public List getByBookId(long bookId) { - List list = em.createQuery( - "select c " + - "from Comment c " + - "inner join fetch c.book b " + - "where c.book.id = :bookId", Comment.class) + EntityGraph entityGraph = em.getEntityGraph("CommentGraph"); + List list = em.createQuery("select c from Comment c where c.book.id = :bookId ", Comment.class) + .setHint("javax.persistence.fetchgraph", entityGraph) .setParameter("bookId", bookId) .getResultList(); diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index b126428..edca570 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -2,13 +2,7 @@ import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import javax.persistence.*; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index d2a68ca..0c9cb7c 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -4,15 +4,7 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import javax.persistence.*; import java.util.Date; /** @@ -25,8 +17,38 @@ @Data @Entity @Table(name = "BOOK") -public class Book { +@NamedEntityGraph( + name = "BookGraph", + attributeNodes = { + @NamedAttributeNode(value = "id"), + @NamedAttributeNode(value = "addRecordDate"), + @NamedAttributeNode(value = "caption"), + @NamedAttributeNode(value = "description"), + @NamedAttributeNode(value = "author", subgraph = "authorGraph"), + @NamedAttributeNode(value = "genre", subgraph = "genreGraph") + }, + subgraphs = { + @NamedSubgraph( + name = "authorGraph", + attributeNodes = { + @NamedAttributeNode(value = "id"), + @NamedAttributeNode(value = "surname"), + @NamedAttributeNode(value = "firstName"), + @NamedAttributeNode(value = "secondName") + } + ), + @NamedSubgraph( + name = "genreGraph", + attributeNodes = { + @NamedAttributeNode(value = "id"), + @NamedAttributeNode(value = "name") + } + ) + } +) + +public class Book { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_book") @SequenceGenerator(name = "sq_book", sequenceName = "sq_book", allocationSize = 1) diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java index 3902e58..fe03461 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Comment.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -4,17 +4,7 @@ import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.ManyToOne; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; +import javax.persistence.*; import java.util.Date; /** @@ -27,6 +17,17 @@ @Data @Entity @Table(name = "COMMENT") + +@NamedEntityGraph( + name = "CommentGraph", + attributeNodes = { + @NamedAttributeNode(value = "id"), + @NamedAttributeNode(value = "addRecordDate"), + @NamedAttributeNode(value = "userName"), + @NamedAttributeNode(value = "text"), + @NamedAttributeNode(value = "book") + } +) public class Comment { @Id @@ -72,6 +73,7 @@ public String toString() { ", addRecordDate=" + addRecordDate + ", userName=" + userName + ", text='" + text + '\'' + + ", book='" + book + '\'' + "}\n"; } } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 4e72005..dc37847 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -2,13 +2,7 @@ import lombok.Data; -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.SequenceGenerator; -import javax.persistence.Table; +import javax.persistence.*; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index be77cff..2cb2494 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -26,7 +26,7 @@ public class AuthorManageServiceImpl implements AuthorManageService { @Override public Author getAuthorById(long id) { Optional author = authorDao.findById(id); - return author.get(); + return author.orElse(null); } @Override @@ -47,7 +47,7 @@ public long addAuthor(String surname, String firstName, String secondName) { @Override public int updateAuthor(long id, String surname, String firstName, String secondName) { - Author author = authorDao.findById(id).get(); + Author author = authorDao.findById(id).orElse(null); author.setSurname(surname); author.setFirstName(firstName); author.setSecondName(secondName); diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index a20c6bb..4445926 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -28,7 +28,7 @@ public class BookManageSeviceImpl implements BookManageSevice { @Override public Book getBookById(long id) { - return bookDao.getById(id).get(); + return bookDao.getById(id).orElse(null); } @Override @@ -38,8 +38,8 @@ public List getBooks() { @Override public long addBook(String caption, long authorId, long genreId, String description) { - Author author = authorDao.findById(authorId).get(); - Genre genre = genreDao.findById(genreId).get(); + Author author = authorDao.findById(authorId).orElse(null); + Genre genre = genreDao.findById(genreId).orElse(null); Book book = bookDao.save(new Book(caption, author, genre, description)); return book.getId(); @@ -47,10 +47,10 @@ public long addBook(String caption, long authorId, long genreId, String descript @Override public int updateBook(long id, String caption, long authorId, long genreId, String description) { - Author author = authorDao.findById(authorId).get(); - Genre genre = genreDao.findById(genreId).get(); + Author author = authorDao.findById(authorId).orElse(null); + Genre genre = genreDao.findById(genreId).orElse(null); - Book book = bookDao.findById(id).get(); + Book book = bookDao.getById(id).orElse(null); book.setCaption(caption); book.setAuthor(author); book.setGenre(genre); diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index 8daa986..7607fe6 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -28,7 +28,7 @@ public class CommentManageServiceImpl implements CommentManageService { @Override public Comment getCommentById(long id) { Optional comment = commentDao.getById(id); - return comment.get(); + return comment.orElse(null); } @Override @@ -43,7 +43,7 @@ public List getCommentsByBookId(long bookId) { @Override public long addComment(long bookId, String userName, String text) { - Book book = bookDao.getById(bookId).get(); + Book book = bookDao.getById(bookId).orElse(null); Comment comment = commentDao.save(new Comment(book, new Date(), userName, text)); return comment.getId(); @@ -51,7 +51,7 @@ public long addComment(long bookId, String userName, String text) { @Override public int updateComment(long id, String userName, String text) { - Comment comment = commentDao.getById(id).get(); + Comment comment = commentDao.getById(id).orElse(null); comment.setAddRecordDate(new Date()); comment.setUserName(userName); comment.setText(text); diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index 4c9757e..e5c71d8 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -26,7 +26,7 @@ public class GenreManageServiceImpl implements GenreManageService { @Override public Genre getGenreById(long id) { Optional genre = genreDao.findById(id); - return genre.get(); + return genre.orElse(null); } @Override @@ -47,7 +47,7 @@ public long addGenre(String name) { @Override public int updateGenre(long id, String name) { - Genre genre = genreDao.findById(id).get(); + Genre genre = genreDao.findById(id).orElse(null); genre.setName(name); genreDao.save(genre); diff --git a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java index 832025f..68c0a16 100644 --- a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java +++ b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java @@ -2,7 +2,6 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; -import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 35291ea..261afcd 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -2,13 +2,11 @@ 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.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; @@ -17,10 +15,7 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. @@ -45,11 +40,11 @@ void getById() { assertAll( "author", - () -> assertNotNull(author.get()), - () -> assertEquals(1L, author.get().getId()), - () -> assertEquals("Surname", author.get().getSurname()), - () -> assertEquals("FirstName", author.get().getFirstName()), - () -> assertEquals("SecondName", author.get().getSecondName()) + () -> assertNotNull(author.orElse(null)), + () -> assertEquals(1L, author.orElse(null).getId()), + () -> assertEquals("Surname", author.orElse(null).getSurname()), + () -> assertEquals("FirstName", author.orElse(null).getFirstName()), + () -> assertEquals("SecondName", author.orElse(null).getSecondName()) ); } @@ -77,10 +72,10 @@ void addObject() { assertAll( "author", () -> assertNotNull(author_selected), - () -> assertEquals(4, author_selected.get().getId()), - () -> assertEquals(author.getSurname(), author_selected.get().getSurname()), - () -> assertEquals(author.getFirstName(), author_selected.get().getFirstName()), - () -> assertEquals(author.getSecondName(), author_selected.get().getSecondName()) + () -> assertEquals(4, author_selected.orElse(null).getId()), + () -> assertEquals(author.getSurname(), author_selected.orElse(null).getSurname()), + () -> assertEquals(author.getFirstName(), author_selected.orElse(null).getFirstName()), + () -> assertEquals(author.getSecondName(), author_selected.orElse(null).getSecondName()) ); } @@ -88,10 +83,6 @@ void addObject() { @DisplayName("Удаление автора, который используется в таблице книг") @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteObject() { - //authorDao.deleteById(1L); - ////assertThat(authorDao.count()).isEqualTo(1); - //assertThrows(DataIntegrityViolationException.class, () -> { authorDao.count(); }); - assertThrows(DataIntegrityViolationException.class, () -> authorDao.deleteById(1L)); assertThat(authorDao.count()).isEqualTo(3); } @@ -102,7 +93,7 @@ void updateObject() { authorDao.save( new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") ); - Author author = authorDao.findById(1L).get(); + Author author = authorDao.findById(1L).orElse(null); assertAll( "author", diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index 1ae9179..e397ace 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -2,12 +2,10 @@ 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.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; @@ -15,11 +13,9 @@ import java.util.Date; import java.util.List; +import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. @@ -36,15 +32,17 @@ class BookDaoJpaTest { @Autowired private BookDao bookDaoJpa; + @Autowired private AuthorDao authorDao; + @Autowired private GenreDao genreDao; @Test @DisplayName("Получение книги по id") void getById() { - Book book = bookDaoJpa.getById(1L).get(); + Book book = bookDaoJpa.getById(1L).orElse(null); assertAll( "book", @@ -77,7 +75,7 @@ void getAllObjects() { @DisplayName("Добавление книги") void addObject() { bookDaoJpa.save(getNewBook()); - Book book = bookDaoJpa.getById(4L).get(); + Book book = bookDaoJpa.getById(4L).orElse(null); assertAll( "book", @@ -94,15 +92,15 @@ void addObject() { @DisplayName("Удаление книги по id") void deleteObject() { bookDaoJpa.deleteById(1L); - Book book = bookDaoJpa.getById(1L).get(); - assertNull(book); + Optional book = bookDaoJpa.getById(1L); + assertTrue(book.isEmpty()); } @Test @DisplayName("Обновление книги") void updateObject() { bookDaoJpa.save(getUpdatedBook()); - Book book2 = bookDaoJpa.getById(1L).get(); + Book book2 = bookDaoJpa.getById(1L).orElse(null); assertAll( "book", @@ -112,14 +110,14 @@ void updateObject() { } private Book getNewBook() { - Author author = authorDao.findById(1L).get(); - Genre genre = genreDao.findById(1L).get(); + Author author = authorDao.findById(1L).orElse(null); + Genre genre = genreDao.findById(1L).orElse(null); return new Book("Test_Book", author, genre, "Test_Description"); } private Book getUpdatedBook() { - Author author = authorDao.findById(1L).get(); - Genre genre = genreDao.findById(1L).get(); + Author author = authorDao.findById(1L).orElse(null); + Genre genre = genreDao.findById(1L).orElse(null); return new Book(1L, new Date(), "Test_Book", author, genre, "Test_Description"); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java index e356272..9c82366 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java @@ -2,24 +2,19 @@ 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.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.utils.DateUtil; import java.util.Date; import java.util.List; +import java.util.Optional; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. @@ -36,13 +31,14 @@ class CommentDaoJpaTest { @Autowired private BookDao bookDaoJpa; + @Autowired private CommentDao commentDaoJpa; @Test @DisplayName("Получение комментария по id") void getById() { - Comment comment = commentDaoJpa.getById(1L).get(); + Comment comment = commentDaoJpa.getById(1L).orElse(null); assertAll( "comment", @@ -89,10 +85,10 @@ void getObjectsByBook() { @DisplayName("Добавление комментария") void addObject() { Date date = new Date(); - Book book = bookDaoJpa.getById(1L).get(); + Book book = bookDaoJpa.getById(1L).orElse(null); commentDaoJpa.save(new Comment(book, date, "user5", "text5")); - Comment comment = commentDaoJpa.getById(5L).get(); + Comment comment = commentDaoJpa.getById(5L).orElse(null); assertAll( "comment", @@ -109,19 +105,19 @@ void addObject() { @DisplayName("Удаление комментария") void deleteObject() { commentDaoJpa.deleteById(1L); - Comment comment = commentDaoJpa.getById(1L).get(); - assertNull(comment); + Optional comment = commentDaoJpa.getById(1L); + assertTrue(comment.isEmpty()); } @Test @DisplayName("Обновление комментария") void updateObject() { - Comment comment1 = commentDaoJpa.getById(1L).get(); + Comment comment1 = commentDaoJpa.getById(1L).orElse(null); Date date = new Date(); commentDaoJpa.save(new Comment(1L, comment1.getBook(), date, "TestUser", "TestText")); - Comment comment2 = commentDaoJpa.getById(1L).get(); + Comment comment2 = commentDaoJpa.getById(1L).orElse(null); assertAll( "comment", diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index ba74811..d2aa82c 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -2,21 +2,16 @@ 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.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; import ru.otus.mkulikov.app.model.Genre; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. @@ -37,7 +32,7 @@ class GenreDaoJpaTest { @Test @DisplayName("Получение жанра по id") void getById() { - Genre genre = genreDaoJpa.findById(1L).get(); + Genre genre = genreDaoJpa.findById(1L).orElse(null); assertAll( "genre", @@ -66,7 +61,7 @@ void getAllObjects() { @DisplayName("Добавление жанра") void addObject() { genreDaoJpa.save(new Genre("Test4")); - Genre genre = genreDaoJpa.findById(4L).get(); + Genre genre = genreDaoJpa.findById(4L).orElse(null); assertAll( "genre", @@ -88,7 +83,7 @@ void deleteObject() { @DisplayName("Обновление жанра") void updateObject() { genreDaoJpa.save(new Genre(1L, "UpdatedName")); - Genre genre = genreDaoJpa.findById(1L).get(); + Genre genre = genreDaoJpa.findById(1L).orElse(null); assertAll( "genre", diff --git a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java index b4a71c5..1065900 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java @@ -8,9 +8,7 @@ import java.text.SimpleDateFormat; import java.util.Date; -import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Created by IntelliJ IDEA. @@ -28,27 +26,19 @@ class DateUtilTest { @Test @DisplayName("Перевод даты в строку, формат даты '" + DATE_PATTERN + "'") void dateToString() { - Book book = getNewBook(); - DateFormat dateFormat = new SimpleDateFormat(DATE_PATTERN); + Date date = new Date(); - assertAll( - "book", - () -> assertNotNull(book), - () -> assertEquals(dateFormat.format(new Date()), DateUtil.dateToString(book.getAddRecordDate())) - ); + DateFormat dateFormat = new SimpleDateFormat(DATE_PATTERN); + assertEquals(dateFormat.format(date), DateUtil.dateToString(date)); } @Test @DisplayName("Перевод даты в строку, формат даты '" + DATETIME_PATTERN + "'") void dateTimeToString() { - Book book = getNewBook(); - DateFormat dateFormat = new SimpleDateFormat(DATETIME_PATTERN); + Date date = new Date(); - assertAll( - "book", - () -> assertNotNull(book), - () -> assertEquals(dateFormat.format(new Date()), DateUtil.dateTimeToString(book.getAddRecordDate())) - ); + DateFormat dateFormat = new SimpleDateFormat(DATETIME_PATTERN); + assertEquals(dateFormat.format(date), DateUtil.dateTimeToString(date)); } @Test @@ -61,10 +51,4 @@ void stringToDateTime() { assertEquals(datetime, dateFormat.format(date)); } - - private Book getNewBook() { - Author author = new Author(1L, "TestSurname", "TestFirstName", "TestSecondName"); - Genre genre = new Genre("Test4"); - return new Book(1L, new Date(), "Test_Book", author, genre, "Test_Comment"); - } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index a7a0fc7..74b63f5 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.app.service; -import org.junit.Ignore; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -88,7 +87,6 @@ public Author answer(InvocationOnMock invocationOnMock) throws Throwable { } @Test - @Ignore @DisplayName("Обновление автора") void updateAuthor() { when(authorDao.save(any(Author.class))).then(new Answer() { @@ -111,7 +109,6 @@ public Author answer(InvocationOnMock invocationOnMock) throws Throwable { } @Test - @Ignore @DisplayName("Удаление автора, который используется в таблице книг") void deleteAuthor() { doThrow(DataIntegrityViolationException.class).when(authorDao).deleteById(1L); diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 73e988d..0885b9f 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -2,20 +2,31 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.ComponentScan; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; +import ru.otus.mkulikov.app.dao.AuthorDao; +import ru.otus.mkulikov.app.dao.BookDao; +import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.utils.DateUtil; +import ru.otus.mkulikov.app.model.Genre; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; -import static org.junit.Assert.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; /** * Created by IntelliJ IDEA. @@ -24,85 +35,114 @@ * Time: 13:40 */ -@DataJpaTest @DisplayName("Класс BookManageSevice") -@ComponentScan("ru.otus.mkulikov.app") +@ExtendWith(MockitoExtension.class) @TestPropertySource(locations= "classpath:application.yml") class BookManageSeviceImplTest { - @Autowired - private BookManageSevice booksManageSevice; + @Mock + private BookDao bookDao; + + @Mock + private AuthorDao authorDao; + + @Mock + private GenreDao genreDao; + + @InjectMocks + private BookManageSeviceImpl booksManageSevice; @Test @DisplayName("Получение книги по id") void getBookById() { - Book book = booksManageSevice.getBookById(1L); - - assertAll( - "book", - () -> assertNotNull(book), - () -> assertNotNull(book.getAuthor()), - () -> assertNotNull(book.getGenre()), - () -> assertEquals(1L, book.getId()), - () -> assertEquals("2019-01-01", DateUtil.dateToString(book.getAddRecordDate())), - () -> assertEquals("book_1", book.getCaption()), - () -> assertEquals(1, book.getAuthor().getId()), - () -> assertEquals(1, book.getGenre().getId()), - () -> assertEquals("description", book.getDescription()) - ); + Book book = getBook(1L); + when(bookDao.getById(anyLong())).thenReturn( Optional.of(book) ); + Book bookById = booksManageSevice.getBookById(1L); + + assertThat(bookById).isNotNull(); + assertThat(bookById).isEqualTo(book); } @Test @DisplayName("Получение всех книг") void getBooks() { - List books = booksManageSevice.getBooks(); - - assertAll( - "books", - () -> assertNotNull(books), - () -> assertEquals(3, books.size()), - () -> assertEquals("book_1", books.get(0).getCaption()), - () -> assertEquals("book_2", books.get(1).getCaption()), - () -> assertEquals("book_3", books.get(2).getCaption()) - ); + List list = getBooksList(); + when(bookDao.getAllObjects()).thenReturn( list ); + List comments = booksManageSevice.getBooks(); + + assertThat(comments).isNotNull(); + assertThat(comments).hasSize(3); + assertThat(comments).containsAll(list); } @Test @DisplayName("Добавление книги") void addBook() { - long id = booksManageSevice.addBook("Test_Book", 2, 3, "Test_Description"); - Book book = booksManageSevice.getBookById(id); - - assertAll( - "book", - () -> assertNotNull(book), - () -> assertNotEquals(0, id), - () -> assertEquals("Test_Book", book.getCaption()), - () -> assertEquals(2, book.getAuthor().getId()), - () -> assertEquals(3, book.getGenre().getId()), - () -> assertEquals("Test_Description", book.getDescription()) - ); + when(bookDao.save(any(Book.class))).then(new Answer() { + int sequence = 1; + + @Override + public Book answer(InvocationOnMock invocationOnMock) throws Throwable { + Book book = (Book) invocationOnMock.getArgument(0); + book.setId(++sequence); + return book; + } + }); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); + when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); + + long id = booksManageSevice.addBook("Caption", 1L, 1L, "description"); + + assertThat(id).isEqualTo(2L); } @Test @DisplayName("Обновление книги") void updateBook() { - int count = booksManageSevice.updateBook(1L, "Test_Book", 1, 1, "Test_Description"); - Book book2 = booksManageSevice.getBookById(1L); - - assertAll( - "book", - () -> assertEquals(1, count), - () -> assertEquals("Test_Book", book2.getCaption()), - () -> assertEquals("Test_Description", book2.getDescription()) - ); + when(bookDao.save(any(Book.class))).then(new Answer() { + + @Override + public Book answer(InvocationOnMock invocationOnMock) throws Throwable { + Book book = (Book) invocationOnMock.getArgument(0); + book.setId(1L); + return book; + } + }); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); + when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); + when(bookDao.getById(anyLong())).thenReturn( Optional.of(getBook(1L)) ); + + int count = booksManageSevice.updateBook(1L, "Caption", 1L, 1L, "description"); + + assertThat(count).isEqualTo(1); } @Test @DisplayName("Удаление книги по id") void deleteBook() { - booksManageSevice.deleteBook(1L); - assertThrows(NullPointerException.class, () -> { booksManageSevice.getBookById(1L); }); + doThrow(DataIntegrityViolationException.class).when(bookDao).deleteById(1L); + assertThrows(DataIntegrityViolationException.class, () -> { booksManageSevice.deleteBook(1L); }); + } + + private Author getAuthor(long id) { + return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + } + + private Genre getGenre(long id) { + return new Genre(id, "Genre" + id); } + private Book getBook(long id) { + Author author = getAuthor(id); + Genre genre = getGenre(id); + return new Book(id, "Test_Book", author, genre, "Test_Description"); + } + + private List getBooksList() { + List list = new ArrayList<>(); + list.add(getBook(1L)); + list.add(getBook(2L)); + list.add(getBook(3L)); + return list; + } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index d555abe..40b9e65 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -5,9 +5,12 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.invocation.InvocationOnMock; import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; +import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.CommentDao; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; @@ -22,6 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; @@ -41,6 +45,9 @@ class CommentManageSeviceImplTest { @Mock private CommentDao commentDao; + @Mock + private BookDao bookDao; + @InjectMocks private CommentManageServiceImpl commentManageService; @@ -67,56 +74,57 @@ void getComments() { assertThat(comments).containsAll(commentsList); } - //@Test - //@DisplayName("Добавление комментария") - //void addComment() { - // long id = commentManageService.addComment(1L, "user5", "text5"); - // Comment comment = commentManageService.getCommentById(id); - // - // assertAll( - // "comment", - // () -> assertNotNull(comment), - // () -> assertNotNull(comment.getBook()), - // () -> assertNotEquals(0, id), - // () -> assertEquals("user5", comment.getUserName()), - // () -> assertEquals("text5", comment.getText()) - // ); - //} - - //@Test - //@DisplayName("Получение комментариев по Id книги") - //void getCommentsByBookId() { - // List comments = commentManageService.getCommentsByBookId(1L); - // - // assertAll( - // "comments", - // () -> assertNotNull(comments), - // () -> assertEquals(2, comments.size()), - // () -> assertEquals("text1", comments.get(0).getText()), - // () -> assertEquals("text2", comments.get(1).getText()) - // ); - //} - - //@Test - //@DisplayName("Обновление комментария") - //void updateComment() { - // Comment comment1 = commentManageService.getCommentById(1L); - // int count = commentManageService.updateComment(1L, "TestUser", "TestText"); - // Comment comment2 = commentManageService.getCommentById(1L); - // - // assertAll( - // "comment", - // () -> assertNotNull(comment1), - // () -> assertNotNull(comment2), - // () -> assertNotNull(comment1.getBook()), - // () -> assertNotNull(comment2.getBook()), - // () -> assertEquals(1, count), - // () -> assertEquals("user1", comment1.getUserName()), - // () -> assertEquals("text1", comment1.getText()), - // () -> assertEquals("TestUser", comment2.getUserName()), - // () -> assertEquals("TestText", comment2.getText()) - // ); - //} + @Test + @DisplayName("Добавление комментария") + void addComment() { + Book book = getBook(1L); + + when(commentDao.save(any(Comment.class))).then(new Answer() { + int sequence = 1; + + @Override + public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { + Comment comment = (Comment) invocationOnMock.getArgument(0); + comment.setId(++sequence); + return comment; + } + }); + when(bookDao.getById(anyLong())).thenReturn( Optional.of(book) ); + + long id = commentManageService.addComment(1L, "user5", "text5"); + + assertThat(id).isEqualTo(2L); + } + + @Test + @DisplayName("Получение комментариев по Id книги") + void getCommentsByBookId() { + List commentList = getCommentList(); + when(commentDao.getByBookId(anyLong())).thenReturn( commentList ); + List comments = commentManageService.getCommentsByBookId(1L); + + assertThat(comments).isNotNull(); + assertThat(comments).isEqualTo(commentList); + } + + @Test + @DisplayName("Обновление комментария") + void updateComment() { + when(commentDao.save(any(Comment.class))).then(new Answer() { + + @Override + public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { + Comment comment = (Comment) invocationOnMock.getArgument(0); + comment.setId(1L); + return comment; + } + }); + when(commentDao.getById(anyLong())).thenReturn( Optional.of(getComment(1L)) ); + + int count = commentManageService.updateComment(1L, "TestUser", "TestText"); + + assertThat(count).isEqualTo(1); + } @Test @DisplayName("Удаление комментария") @@ -127,10 +135,14 @@ void deleteComment() { private Comment getComment(long id) { Date date = DateUtil.stringToDateTime("2019-01-01 10:01:01"); + Book book = getBook(id); + return new Comment(id, book, date, "user" + id, "text" + id); + } + + private Book getBook(long id) { Author author = new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); Genre genre = new Genre(id, "Genre" + id); - Book book = new Book(id, "Test_Book", author, genre, "Test_Description"); - return new Comment(id, book, date, "user" + id, "text" + id); + return new Book(id, "Test_Book", author, genre, "Test_Description"); } private List getCommentList() { diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 4c2a563..fd97035 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -71,9 +71,9 @@ void addGenre() { @Override public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { - Genre author = (Genre) invocationOnMock.getArgument(0); - author.setId(++sequence); - return author; + Genre genre = (Genre) invocationOnMock.getArgument(0); + genre.setId(++sequence); + return genre; } }); From 057e0f9998a2852c1e49bba8ee7a7c5b81a73c27 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Sat, 6 Jul 2019 17:17:07 +0300 Subject: [PATCH 41/70] =?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 --- .../mkulikov/app/dao/GenreDaoJpaTest.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index d2aa82c..128679d 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -7,10 +7,13 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.test.context.TestPropertySource; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; /** @@ -27,12 +30,12 @@ class GenreDaoJpaTest { @Autowired - private GenreDao genreDaoJpa; + private GenreDao genreDao; @Test @DisplayName("Получение жанра по id") void getById() { - Genre genre = genreDaoJpa.findById(1L).orElse(null); + Genre genre = genreDao.findById(1L).orElse(null); assertAll( "genre", @@ -45,7 +48,7 @@ void getById() { @Test @DisplayName("Получение всех жанров") void getAllObjects() { - List genres = genreDaoJpa.findAll(); + List genres = genreDao.findAll(); assertAll( "genres", @@ -60,8 +63,8 @@ void getAllObjects() { @Test @DisplayName("Добавление жанра") void addObject() { - genreDaoJpa.save(new Genre("Test4")); - Genre genre = genreDaoJpa.findById(4L).orElse(null); + genreDao.save(new Genre("Test4")); + Genre genre = genreDao.findById(4L).orElse(null); assertAll( "genre", @@ -73,17 +76,17 @@ void addObject() { @Test @DisplayName("Удаление жанра, который используется в таблице книг") + @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteObject() { - genreDaoJpa.deleteById(1L); - //assertThat(authorDao.count()).isEqualTo(1); - assertThrows(DataIntegrityViolationException.class, () -> { genreDaoJpa.count(); }); + assertThrows(DataIntegrityViolationException.class, () -> genreDao.deleteById(1L)); + assertThat(genreDao.count()).isEqualTo(3); } @Test @DisplayName("Обновление жанра") void updateObject() { - genreDaoJpa.save(new Genre(1L, "UpdatedName")); - Genre genre = genreDaoJpa.findById(1L).orElse(null); + genreDao.save(new Genre(1L, "UpdatedName")); + Genre genre = genreDao.findById(1L).orElse(null); assertAll( "genre", From 0fe48d36c50e4b7ec8ffdec00081c091dd8b54cd Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 10 Jul 2019 21:25:34 +0300 Subject: [PATCH 42/70] =?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 | 13 +++---------- .../ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java | 4 ---- .../ru/otus/mkulikov/app/dao/BookDaoJpaTest.java | 4 ---- .../ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java | 4 ---- .../ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java | 4 ---- .../app/service/AuthorManageSeviceImplTest.java | 2 -- .../app/service/BookManageSeviceImplTest.java | 2 -- .../app/service/CommentManageSeviceImplTest.java | 2 -- .../app/service/GenreManageSeviceImplTest.java | 2 -- 9 files changed, 3 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 0c11d7a..1078344 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,5 @@ # OtusSpringHW-Library -Домашнее задание #7: -- Переделать билиотеку на Spring Data JPA. -- Реализовать весь функционал работы с БД в приложении книг с использованием spring-data-jpa репозиториев. - -### 19-06-22 Доработки -- Подключил liquibase. - -### 19-07-07 Доработки -- Использование Mockito для тестирования сервисов. -- Использование @NamedEntityGraph. +Домашнее задание #8: +- Использовать MongoDB и spring-data для хранения информации о книгах. +- Тесты реализовать с помощью spring-boot-strter-embedded-mongodb. diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index 261afcd..ee37dc3 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -4,9 +4,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.TestPropertySource; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; @@ -26,8 +24,6 @@ @DataJpaTest @DisplayName("Класс AuthorDaoJpa") -@ComponentScan("ru.otus.mkulikov.app") -@TestPropertySource(locations= "classpath:application.yml") class AuthorDaoJpaTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index e397ace..a39922f 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -4,8 +4,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.context.TestPropertySource; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; @@ -26,8 +24,6 @@ @DataJpaTest @DisplayName("Класс BookDaoJpa") -@ComponentScan("ru.otus.mkulikov.app") -@TestPropertySource(locations= "classpath:application.yml") class BookDaoJpaTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java index 9c82366..bb9e31f 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java @@ -4,8 +4,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.context.TestPropertySource; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.utils.DateUtil; @@ -25,8 +23,6 @@ @DataJpaTest @DisplayName("Класс CommentDaoJpa") -@ComponentScan("ru.otus.mkulikov.app") -@TestPropertySource(locations= "classpath:application.yml") class CommentDaoJpaTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index 128679d..8b399b3 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -4,9 +4,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.ComponentScan; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.TestPropertySource; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; @@ -25,8 +23,6 @@ @DataJpaTest @DisplayName("Класс GenreDaoJpa") -@ComponentScan("ru.otus.mkulikov.app") -@TestPropertySource(locations= "classpath:application.yml") class GenreDaoJpaTest { @Autowired diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 74b63f5..6101800 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -9,7 +9,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.stubbing.Answer; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.TestPropertySource; import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.model.Author; @@ -32,7 +31,6 @@ */ @DisplayName("Класс AuthorManageSevice") -@TestPropertySource(locations= "classpath:application.yml") @ExtendWith(MockitoExtension.class) class AuthorManageSeviceImplTest { diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 0885b9f..361c2b4 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -9,7 +9,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.stubbing.Answer; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.TestPropertySource; import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.GenreDao; @@ -37,7 +36,6 @@ @DisplayName("Класс BookManageSevice") @ExtendWith(MockitoExtension.class) -@TestPropertySource(locations= "classpath:application.yml") class BookManageSeviceImplTest { @Mock diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index 40b9e65..45fa676 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -9,7 +9,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.stubbing.Answer; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.TestPropertySource; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.CommentDao; import ru.otus.mkulikov.app.model.Author; @@ -39,7 +38,6 @@ @DisplayName("Класс CommentManageSevice") @ExtendWith(MockitoExtension.class) -@TestPropertySource(locations= "classpath:application.yml") class CommentManageSeviceImplTest { @Mock diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index fd97035..6958c1b 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -9,7 +9,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.stubbing.Answer; import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.test.context.TestPropertySource; import ru.otus.mkulikov.app.dao.GenreDao; import ru.otus.mkulikov.app.model.Genre; @@ -33,7 +32,6 @@ @DisplayName("Класс GenreManageSevice") @ExtendWith(MockitoExtension.class) -@TestPropertySource(locations= "classpath:application.yml") class GenreManageSeviceImplTest { @Mock From cc47af7cae0d85dde67f38702bac13bce29c8bfa Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 18 Jul 2019 00:00:30 +0300 Subject: [PATCH 43/70] =?UTF-8?q?-=20=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20MongoDB.=20-=20=D0=A3=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B0=20liquibase.=20-=20=D0=9F=D0=B5=D1=80?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D1=82=D0=B5?= =?UTF-8?q?=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 | 43 +---- .../ru/otus/mkulikov/app/dao/AuthorDao.java | 6 +- .../ru/otus/mkulikov/app/dao/BookDao.java | 6 +- .../otus/mkulikov/app/dao/BookDaoCustom.java | 22 --- .../mkulikov/app/dao/BookDaoCustomImpl.java | 49 ------ .../ru/otus/mkulikov/app/dao/CommentDao.java | 9 +- .../mkulikov/app/dao/CommentDaoCustom.java | 22 --- .../app/dao/CommentDaoCustomImpl.java | 49 ------ .../ru/otus/mkulikov/app/dao/GenreDao.java | 6 +- .../ru/otus/mkulikov/app/model/Author.java | 15 +- .../java/ru/otus/mkulikov/app/model/Book.java | 56 +------ .../ru/otus/mkulikov/app/model/Comment.java | 32 +--- .../ru/otus/mkulikov/app/model/Genre.java | 13 +- .../app/service/BookManageSeviceImpl.java | 6 +- .../app/service/CommentManageServiceImpl.java | 8 +- src/main/resources/application.yml | 14 +- .../1.0/2019-06-22--0001-schema.yaml | 154 ------------------ .../changelog/data/2019-06-22--0001-data.yaml | 14 -- .../data/sql/2019-06-22--0001-data-h2.sql | 39 ----- .../db/changelog/db.changelog-master.yaml | 5 - .../mkulikov/app/dao/AuthorDaoJpaTest.java | 88 +++++----- .../otus/mkulikov/app/dao/BookDaoJpaTest.java | 14 +- .../mkulikov/app/dao/CommentDaoJpaTest.java | 26 +-- .../mkulikov/app/dao/GenreDaoJpaTest.java | 85 +++++----- .../app/service/BookManageSeviceImplTest.java | 6 +- .../service/CommentManageSeviceImplTest.java | 10 +- src/test/resources/application.yml | 14 +- .../1.0/2019-06-22--0001-schema.yaml | 154 ------------------ .../changelog/data/2019-06-22--0001-data.yaml | 14 -- .../data/sql/2019-06-22--0001-data-h2.sql | 39 ----- .../db/changelog/db.changelog-master.yaml | 5 - 31 files changed, 180 insertions(+), 843 deletions(-) delete mode 100644 src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java delete mode 100644 src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java delete mode 100644 src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java delete mode 100644 src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java delete mode 100644 src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml delete mode 100644 src/main/resources/db/changelog/data/2019-06-22--0001-data.yaml delete mode 100644 src/main/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql delete mode 100644 src/main/resources/db/changelog/db.changelog-master.yaml delete mode 100644 src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml delete mode 100644 src/test/resources/db/changelog/data/2019-06-22--0001-data.yaml delete mode 100644 src/test/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql delete mode 100644 src/test/resources/db/changelog/db.changelog-master.yaml diff --git a/pom.xml b/pom.xml index f2cd927..b02bf04 100644 --- a/pom.xml +++ b/pom.xml @@ -116,24 +116,23 @@ 2.0.0.RELEASE - + - com.h2database - h2 - 1.4.199 + org.springframework.boot + spring-boot-starter-data-mongodb - org.liquibase - liquibase-core + de.flapdoodle.embed + de.flapdoodle.embed.mongo - - org.springframework.boot - spring-boot-starter-data-jpa + org.springframework.data + spring-data-keyvalue + org.springframework.data spring-data-jpa @@ -174,32 +173,6 @@ org.springframework.boot spring-boot-maven-plugin - - - org.liquibase - liquibase-maven-plugin - 3.6.3 - - true - false - classpath:/db/changelog/db.changelog-master.yaml - - - - - - - - - - - - org.yaml - snakeyaml - 1.23 - - - diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index b4b1933..cdca8e5 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.app.dao; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; +import org.springframework.data.mongodb.repository.MongoRepository; import ru.otus.mkulikov.app.model.Author; /** @@ -11,7 +10,6 @@ * Time: 17:06 */ -@Repository -public interface AuthorDao extends JpaRepository { +public interface AuthorDao extends MongoRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index 7cbcd93..2ed7dd6 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.app.dao; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; +import org.springframework.data.mongodb.repository.MongoRepository; import ru.otus.mkulikov.app.model.Book; /** @@ -11,7 +10,6 @@ * Time: 13:28 */ -@Repository -public interface BookDao extends JpaRepository, BookDaoCustom { +public interface BookDao extends MongoRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java deleted file mode 100644 index fcb0cb1..0000000 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustom.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.otus.mkulikov.app.dao; - -import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.app.model.Book; - -import java.util.List; -import java.util.Optional; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 24.06.2019 - * Time: 11:48 - */ - -@Repository -public interface BookDaoCustom { - - Optional getById(long id); - - List getAllObjects(); -} diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java deleted file mode 100644 index 7a4aec5..0000000 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDaoCustomImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.otus.mkulikov.app.dao; - -import lombok.RequiredArgsConstructor; -import ru.otus.mkulikov.app.model.Book; - -import javax.persistence.EntityGraph; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import java.util.List; -import java.util.Optional; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 23.05.2019 - * Time: 13:28 - */ - -@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) -@RequiredArgsConstructor -public class BookDaoCustomImpl implements BookDaoCustom { - - @PersistenceContext - private EntityManager em; - - @Override - public Optional getById(long id) { - EntityGraph entityGraph = em.getEntityGraph("BookGraph"); - List books = em.createQuery("select b from Book b where b.id = :id ", Book.class) - .setHint("javax.persistence.fetchgraph", entityGraph) - .setParameter("id", id) - .getResultList(); - - em.clear(); - return (books != null && !books.isEmpty()) ? Optional.of(books.get(0)) : Optional.empty(); - } - - @Override - public List getAllObjects() { - EntityGraph entityGraph = em.getEntityGraph("BookGraph"); - List books = em.createQuery("select b from Book b order by b.id ", Book.class) - .setHint("javax.persistence.fetchgraph", entityGraph) - .getResultList(); - - em.clear(); - return books; - } -} - diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index 47269b3..1b733b4 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -1,9 +1,10 @@ package ru.otus.mkulikov.app.dao; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; +import org.springframework.data.mongodb.repository.MongoRepository; import ru.otus.mkulikov.app.model.Comment; +import java.util.List; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -11,7 +12,7 @@ * Time: 23:48 */ -@Repository -public interface CommentDao extends JpaRepository, CommentDaoCustom { +public interface CommentDao extends MongoRepository { + List findByBookId(long bookId); } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java deleted file mode 100644 index 3dcabef..0000000 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustom.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.otus.mkulikov.app.dao; - -import org.springframework.stereotype.Repository; -import ru.otus.mkulikov.app.model.Comment; - -import java.util.List; -import java.util.Optional; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 20.06.2019 - * Time: 23:48 - */ - -@Repository -public interface CommentDaoCustom { - - Optional getById(long id); - - List getByBookId(long bookId); -} diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java deleted file mode 100644 index 080bc7d..0000000 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDaoCustomImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.otus.mkulikov.app.dao; - -import lombok.RequiredArgsConstructor; -import ru.otus.mkulikov.app.model.Comment; - -import javax.persistence.EntityGraph; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import java.util.List; -import java.util.Optional; - -/** - * Created by IntelliJ IDEA. - * Developer: Maksim Kulikov - * Date: 23.05.2019 - * Time: 17:06 - */ - -@SuppressWarnings({"SqlNoDataSourceInspection", "ConstantConditions", "SqlDialectInspection"}) -@RequiredArgsConstructor -public class CommentDaoCustomImpl implements CommentDaoCustom { - - @PersistenceContext - private EntityManager em; - - @Override - public Optional getById(long id) { - EntityGraph entityGraph = em.getEntityGraph("CommentGraph"); - List list = em.createQuery("select c from Comment c where c.id = :id ", Comment.class) - .setHint("javax.persistence.fetchgraph", entityGraph) - .setParameter("id", id) - .getResultList(); - - em.clear(); - return (list != null && !list.isEmpty()) ? Optional.of(list.get(0)) : Optional.empty(); - } - - @Override - public List getByBookId(long bookId) { - EntityGraph entityGraph = em.getEntityGraph("CommentGraph"); - List list = em.createQuery("select c from Comment c where c.book.id = :bookId ", Comment.class) - .setHint("javax.persistence.fetchgraph", entityGraph) - .setParameter("bookId", bookId) - .getResultList(); - - em.clear(); - return list; - } -} diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 2a95644..0c39b93 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -1,7 +1,6 @@ package ru.otus.mkulikov.app.dao; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; +import org.springframework.data.mongodb.repository.MongoRepository; import ru.otus.mkulikov.app.model.Genre; /** @@ -11,7 +10,6 @@ * Time: 17:07 */ -@Repository -public interface GenreDao extends JpaRepository { +public interface GenreDao extends MongoRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index edca570..264b740 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -1,8 +1,9 @@ package ru.otus.mkulikov.app.model; import lombok.Data; - -import javax.persistence.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; +import org.springframework.data.mongodb.core.mapping.Document; /** * Created by IntelliJ IDEA. @@ -12,20 +13,14 @@ */ @Data -@Entity -@Table(name = "AUTHOR") +@Document +@KeySpace("author") public class Author { @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_author") - @SequenceGenerator(name = "sq_author", sequenceName = "sq_author", allocationSize = 1) - @Column(name = "ID") private long id; - @Column(name = "SURNAME") private String surname; - @Column(name = "FIRST_NAME") private String firstName; - @Column(name = "SECOND_NAME") private String secondName; public Author() { diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 0c9cb7c..2837f01 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -1,10 +1,11 @@ package ru.otus.mkulikov.app.model; import lombok.Data; -import org.hibernate.annotations.Fetch; -import org.hibernate.annotations.FetchMode; +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; +import org.springframework.data.mongodb.core.mapping.DBRef; +import org.springframework.data.mongodb.core.mapping.Document; -import javax.persistence.*; import java.util.Date; /** @@ -15,58 +16,19 @@ */ @Data -@Entity -@Table(name = "BOOK") - -@NamedEntityGraph( - name = "BookGraph", - attributeNodes = { - @NamedAttributeNode(value = "id"), - @NamedAttributeNode(value = "addRecordDate"), - @NamedAttributeNode(value = "caption"), - @NamedAttributeNode(value = "description"), - @NamedAttributeNode(value = "author", subgraph = "authorGraph"), - @NamedAttributeNode(value = "genre", subgraph = "genreGraph") - }, - subgraphs = { - @NamedSubgraph( - name = "authorGraph", - attributeNodes = { - @NamedAttributeNode(value = "id"), - @NamedAttributeNode(value = "surname"), - @NamedAttributeNode(value = "firstName"), - @NamedAttributeNode(value = "secondName") - } - ), - @NamedSubgraph( - name = "genreGraph", - attributeNodes = { - @NamedAttributeNode(value = "id"), - @NamedAttributeNode(value = "name") - } - ) - } -) - +@Document +@KeySpace("book") public class Book { + @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_book") - @SequenceGenerator(name = "sq_book", sequenceName = "sq_book", allocationSize = 1) - @Column(name = "ID") private long id; - @Column(name = "ADD_RECORD_DATE") private Date addRecordDate; - @Column(name = "CAPTION") private String caption; - @Column(name = "DESCRIPTION") private String description; - @Fetch(FetchMode.JOIN) - @ManyToOne(optional=false, fetch = FetchType.EAGER) + @DBRef(db = "author") private Author author; - - @Fetch(FetchMode.JOIN) - @ManyToOne(optional=false, fetch = FetchType.EAGER) + @DBRef(db = "genre") private Genre genre; public Book() { diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java index fe03461..a339412 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Comment.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -1,10 +1,11 @@ package ru.otus.mkulikov.app.model; import lombok.Data; -import org.hibernate.annotations.Fetch; -import org.hibernate.annotations.FetchMode; +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; +import org.springframework.data.mongodb.core.mapping.DBRef; +import org.springframework.data.mongodb.core.mapping.Document; -import javax.persistence.*; import java.util.Date; /** @@ -15,36 +16,17 @@ */ @Data -@Entity -@Table(name = "COMMENT") - -@NamedEntityGraph( - name = "CommentGraph", - attributeNodes = { - @NamedAttributeNode(value = "id"), - @NamedAttributeNode(value = "addRecordDate"), - @NamedAttributeNode(value = "userName"), - @NamedAttributeNode(value = "text"), - @NamedAttributeNode(value = "book") - } -) +@Document +@KeySpace("comment") public class Comment { @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_comment") - @SequenceGenerator(name = "sq_comment", sequenceName = "sq_comment", allocationSize = 1) - @Column(name = "ID") private long id; - @Column(name = "ADD_RECORD_DATE") - @Temporal(TemporalType.TIMESTAMP) private Date addRecordDate; - @Column(name = "USER_NAME") private String userName; - @Column(name = "TEXT") private String text; - @Fetch(FetchMode.JOIN) - @ManyToOne(optional=false, fetch = FetchType.EAGER) + @DBRef(db = "book") private Book book; public Comment() { diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index dc37847..590cf03 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -1,8 +1,9 @@ package ru.otus.mkulikov.app.model; import lombok.Data; - -import javax.persistence.*; +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; +import org.springframework.data.mongodb.core.mapping.Document; /** * Created by IntelliJ IDEA. @@ -12,16 +13,12 @@ */ @Data -@Entity -@Table(name = "GENRE") +@Document +@KeySpace("genre") public class Genre { @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_genre") - @SequenceGenerator(name = "sq_genre", sequenceName = "sq_genre", allocationSize = 1) - @Column(name = "ID") private long id; - @Column(name = "NAME") private String name; public Genre() { diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 4445926..061a0f1 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -28,12 +28,12 @@ public class BookManageSeviceImpl implements BookManageSevice { @Override public Book getBookById(long id) { - return bookDao.getById(id).orElse(null); + return bookDao.findById(id).orElse(null); } @Override public List getBooks() { - return bookDao.getAllObjects(); + return bookDao.findAll(); } @Override @@ -50,7 +50,7 @@ public int updateBook(long id, String caption, long authorId, long genreId, Stri Author author = authorDao.findById(authorId).orElse(null); Genre genre = genreDao.findById(genreId).orElse(null); - Book book = bookDao.getById(id).orElse(null); + Book book = bookDao.findById(id).orElse(null); book.setCaption(caption); book.setAuthor(author); book.setGenre(genre); diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index 7607fe6..e3083e7 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -27,7 +27,7 @@ public class CommentManageServiceImpl implements CommentManageService { @Override public Comment getCommentById(long id) { - Optional comment = commentDao.getById(id); + Optional comment = commentDao.findById(id); return comment.orElse(null); } @@ -38,12 +38,12 @@ public List getComments() { @Override public List getCommentsByBookId(long bookId) { - return commentDao.getByBookId(bookId); + return commentDao.findByBookId(bookId); } @Override public long addComment(long bookId, String userName, String text) { - Book book = bookDao.getById(bookId).orElse(null); + Book book = bookDao.findById(bookId).orElse(null); Comment comment = commentDao.save(new Comment(book, new Date(), userName, text)); return comment.getId(); @@ -51,7 +51,7 @@ public long addComment(long bookId, String userName, String text) { @Override public int updateComment(long id, String userName, String text) { - Comment comment = commentDao.getById(id).orElse(null); + Comment comment = commentDao.findById(id).orElse(null); comment.setAddRecordDate(new Date()); comment.setUserName(userName); comment.setText(text); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1184619..20761b2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,18 +2,10 @@ spring: banner: location: "classpath:banner.txt" - datasource: - initialization-mode: always - platform: h2 - jpa: hibernate: ddl-auto: none - properties: - hibernate: - show_sql: false - format_sql: false - - liquibase: - enabled: true \ No newline at end of file + data: + mongodb: + database: library diff --git a/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml b/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml deleted file mode 100644 index 92d188b..0000000 --- a/src/main/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml +++ /dev/null @@ -1,154 +0,0 @@ -databaseChangeLog: -- changeSet: - id: 2019-06-22--0001-schema-author - author: KulikovMV - createTable: - tableName: author - columns: - - column: - name: id - type: number(20,0) - constraints: - nullable: false - primaryKey: true - primaryKeyName: pk_author - - column: - name: surname - type: varchar(100) - constraints: - nullable: false - - column: - name: first_name - type: varchar(100) - constraints: - nullable: false - - column: - name: second_name - type: varchar(100) -- changeSet: - id: 2019-06-22--0001-schema-genre - author: KulikovMV - createTable: - tableName: genre - columns: - - column: - name: id - type: number(20,0) - constraints: - nullable: false - primaryKey: true - primaryKeyName: pk_genre - - column: - name: name - type: varchar(100) - constraints: - nullable: false -- changeSet: - id: 2019-06-22--0001-schema-book - author: KulikovMV - createTable: - tableName: book - columns: - - column: - name: id - type: number(20,0) - constraints: - nullable: false - primaryKey: true - primaryKeyName: pk_book - - column: - name: add_record_date - type: timestamp - defaultValueDate: sysdate - constraints: - nullable: false - - column: - name: caption - type: varchar(255) - constraints: - nullable: false - - column: - name: author_id - type: number(20,0) - constraints: - nullable: false - foreignKeyName: fk_author - references: author(id) - - column: - name: genre_id - type: number(20,0) - constraints: - nullable: false - foreignKeyName: fk_genre - references: genre(id) - - column: - name: description - type: varchar(255) - constraints: - nullable: false -- changeSet: - id: 2019-06-22--0001-schema-comment - author: KulikovMV - createTable: - tableName: comment - columns: - - column: - name: id - type: number(20,0) - constraints: - nullable: false - primaryKey: true - primaryKeyName: pk_comment - - column: - name: book_id - type: number(20,0) - constraints: - nullable: false - foreignKeyName: fk_comment - references: book(id) - deleteCascade: true - onDelete: cascade - - column: - name: add_record_date - type: timestamp - defaultValueDate: sysdate - constraints: - nullable: false - - column: - name: user_name - type: varchar(20) - constraints: - nullable: false - - column: - name: text - type: varchar(500) - constraints: - nullable: false -- changeSet: - id: 2019-06-22--0001-schema-sequences - author: KulikovMV - changes: - - createSequence: - cycle: true - incrementBy: 1 - ordered: true - sequenceName: sq_author - startValue: 1 - - createSequence: - cycle: true - incrementBy: 1 - ordered: true - sequenceName: sq_genre - startValue: 1 - - createSequence: - cycle: true - incrementBy: 1 - ordered: true - sequenceName: sq_book - startValue: 1 - - createSequence: - cycle: true - incrementBy: 1 - ordered: true - sequenceName: sq_comment - startValue: 1 diff --git a/src/main/resources/db/changelog/data/2019-06-22--0001-data.yaml b/src/main/resources/db/changelog/data/2019-06-22--0001-data.yaml deleted file mode 100644 index cbfcff5..0000000 --- a/src/main/resources/db/changelog/data/2019-06-22--0001-data.yaml +++ /dev/null @@ -1,14 +0,0 @@ -databaseChangeLog: -- changeSet: - id: 0001-chema-sql - author: KulikovMV - context: test - changes: - - sqlFile: - dbms: h2, oracle - encoding: utf8 - endDelimiter: ; - path: sql/2019-06-22--0001-data-h2.sql - relativeToChangelogFile: true - splitStatements: true - stripComments: true \ No newline at end of file diff --git a/src/main/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql b/src/main/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql deleted file mode 100644 index bca97c4..0000000 --- a/src/main/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql +++ /dev/null @@ -1,39 +0,0 @@ -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (sq_author.nextval, 'Surname1', 'FirstName1', 'SecondName1'); - -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (sq_author.nextval, 'Surname2', 'FirstName2', 'SecondName2'); - -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (sq_author.nextval, 'Surname3', 'FirstName3', 'SecondName3'); - --------------------------- - -insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre1'); -insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre2'); -insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre3'); - --------------------------- - -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'description'); - -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'description'); - -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'description'); - --------------------------- - -insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 1, to_date('2019-01-01 10:01:01','YYYY-MM-DD HH24-MI-SS'), 'user1', 'text1'); - -insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 1, to_date('2019-01-01 10:01:02','YYYY-MM-DD HH24-MI-SS'), 'user2', 'text2'); - -insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 2, to_date('2019-01-01 10:01:03','YYYY-MM-DD HH24-MI-SS'), 'user3', 'text3'); - -insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 2, to_date('2019-01-01 10:01:04','YYYY-MM-DD HH24-MI-SS'), 'user4', 'text4'); \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml deleted file mode 100644 index 3adc919..0000000 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ /dev/null @@ -1,5 +0,0 @@ -databaseChangeLog: -- include: - file: db/changelog/1.0/2019-06-22--0001-schema.yaml -- include: - file: db/changelog/data/2019-06-22--0001-data.yaml \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java index ee37dc3..1872211 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java @@ -1,19 +1,21 @@ package ru.otus.mkulikov.app.dao; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -22,26 +24,27 @@ * Time: 10:12 */ -@DataJpaTest +@DataMongoTest @DisplayName("Класс AuthorDaoJpa") class AuthorDaoJpaTest { @Autowired private AuthorDao authorDao; + @BeforeEach + void init() { + authorDao.save(getAuthor(1L)); + authorDao.save(getAuthor(2L)); + authorDao.save(getAuthor(3L)); + } + @Test @DisplayName("Получение автора по id") void getById() { Optional author = authorDao.findById(1L); - assertAll( - "author", - () -> assertNotNull(author.orElse(null)), - () -> assertEquals(1L, author.orElse(null).getId()), - () -> assertEquals("Surname", author.orElse(null).getSurname()), - () -> assertEquals("FirstName", author.orElse(null).getFirstName()), - () -> assertEquals("SecondName", author.orElse(null).getSecondName()) - ); + assertThat(author).isNotEmpty(); + assertThat(author).contains(getAuthor(1L)); } @Test @@ -49,54 +52,51 @@ void getById() { void getAllObjects() { List authors = authorDao.findAll(); - assertAll( - "authors", - () -> assertNotNull(authors), - () -> assertEquals(3, authors.size()), - () -> assertEquals("Surname", authors.get(0).getSurname()), - () -> assertEquals("Surname2", authors.get(1).getSurname()), - () -> assertEquals("Surname3", authors.get(2).getSurname()) - ); + assertThat(authors).size().isEqualTo(3); + assertThat(authors).containsAll(getAuthors()); } @Test @DisplayName("Добавление автора") void addObject() { - Author author = authorDao.save(new Author("TestSurname", "TestFirstName", "TestSecondName")); - Optional author_selected = authorDao.findById(4L); - - assertAll( - "author", - () -> assertNotNull(author_selected), - () -> assertEquals(4, author_selected.orElse(null).getId()), - () -> assertEquals(author.getSurname(), author_selected.orElse(null).getSurname()), - () -> assertEquals(author.getFirstName(), author_selected.orElse(null).getFirstName()), - () -> assertEquals(author.getSecondName(), author_selected.orElse(null).getSecondName()) - ); + Author author = authorDao.save(getAuthor(4L)); + Optional author_selected = authorDao.findById(author.getId()); + + assertThat(author_selected).isNotEmpty(); + assertThat(author_selected).contains(getAuthor(4L)); } @Test - @DisplayName("Удаление автора, который используется в таблице книг") + @DisplayName("Удаление автора") @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteObject() { - assertThrows(DataIntegrityViolationException.class, () -> authorDao.deleteById(1L)); +// assertThrows(DataIntegrityViolationException.class, () -> authorDao.deleteById(1L)); + assertThat(authorDao.count()).isEqualTo(3); + authorDao.deleteById(1L); + assertThat(authorDao.count()).isEqualTo(2); } @Test @DisplayName("Обновление автора") void updateObject() { - authorDao.save( - new Author(1L, "TestSurname", "TestFirstName", "TestSecondName") - ); - Author author = authorDao.findById(1L).orElse(null); - - assertAll( - "author", - () -> assertEquals(1L, author.getId()), - () -> assertEquals("TestSurname", author.getSurname()), - () -> assertEquals("TestFirstName", author.getFirstName()), - () -> assertEquals("TestSecondName", author.getSecondName()) - ); + Author author = new Author(1L, "TestSurname", "TestFirstName", "TestSecondName"); + authorDao.save(author); + Optional author_selected = authorDao.findById(1L); + + assertThat(author_selected).isNotEmpty(); + assertThat(author_selected).contains(author); + } + + private Author getAuthor(long id) { + return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + } + + private List getAuthors() { + List authors = new ArrayList<>(); + authors.add(getAuthor(1L)); + authors.add(getAuthor(2L)); + authors.add(getAuthor(3L)); + return authors; } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java index a39922f..2e53601 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; @@ -22,7 +22,7 @@ * Time: 13:16 */ -@DataJpaTest +@DataMongoTest @DisplayName("Класс BookDaoJpa") class BookDaoJpaTest { @@ -38,7 +38,7 @@ class BookDaoJpaTest { @Test @DisplayName("Получение книги по id") void getById() { - Book book = bookDaoJpa.getById(1L).orElse(null); + Book book = bookDaoJpa.findById(1L).orElse(null); assertAll( "book", @@ -55,7 +55,7 @@ void getById() { @Test @DisplayName("Получение всех книг") void getAllObjects() { - List books = bookDaoJpa.getAllObjects(); + List books = bookDaoJpa.findAll(); assertAll( "books", @@ -71,7 +71,7 @@ void getAllObjects() { @DisplayName("Добавление книги") void addObject() { bookDaoJpa.save(getNewBook()); - Book book = bookDaoJpa.getById(4L).orElse(null); + Book book = bookDaoJpa.findById(4L).orElse(null); assertAll( "book", @@ -88,7 +88,7 @@ void addObject() { @DisplayName("Удаление книги по id") void deleteObject() { bookDaoJpa.deleteById(1L); - Optional book = bookDaoJpa.getById(1L); + Optional book = bookDaoJpa.findById(1L); assertTrue(book.isEmpty()); } @@ -96,7 +96,7 @@ void deleteObject() { @DisplayName("Обновление книги") void updateObject() { bookDaoJpa.save(getUpdatedBook()); - Book book2 = bookDaoJpa.getById(1L).orElse(null); + Book book2 = bookDaoJpa.findById(1L).orElse(null); assertAll( "book", diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java index bb9e31f..e051575 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.utils.DateUtil; @@ -12,7 +12,10 @@ import java.util.List; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hibernate.validator.internal.util.Contracts.assertNotNull; +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertAll; /** * Created by IntelliJ IDEA. @@ -21,7 +24,7 @@ * Time: 9:45 */ -@DataJpaTest +@DataMongoTest @DisplayName("Класс CommentDaoJpa") class CommentDaoJpaTest { @@ -34,7 +37,7 @@ class CommentDaoJpaTest { @Test @DisplayName("Получение комментария по id") void getById() { - Comment comment = commentDaoJpa.getById(1L).orElse(null); + Comment comment = commentDaoJpa.findById(1L).orElse(null); assertAll( "comment", @@ -66,7 +69,7 @@ void getAllObjects() { @Test @DisplayName("Получение всех комментариев для книги") void getObjectsByBook() { - List comments = commentDaoJpa.getByBookId(1L); + List comments = commentDaoJpa.findByBookId(1L); assertAll( "comments", @@ -81,10 +84,10 @@ void getObjectsByBook() { @DisplayName("Добавление комментария") void addObject() { Date date = new Date(); - Book book = bookDaoJpa.getById(1L).orElse(null); + Book book = bookDaoJpa.findById(1L).orElse(null); commentDaoJpa.save(new Comment(book, date, "user5", "text5")); - Comment comment = commentDaoJpa.getById(5L).orElse(null); + Comment comment = commentDaoJpa.findById(5L).orElse(null); assertAll( "comment", @@ -101,19 +104,19 @@ void addObject() { @DisplayName("Удаление комментария") void deleteObject() { commentDaoJpa.deleteById(1L); - Optional comment = commentDaoJpa.getById(1L); - assertTrue(comment.isEmpty()); + Optional comment = commentDaoJpa.findById(1L); + assertThat(comment).isNotEmpty(); } @Test @DisplayName("Обновление комментария") void updateObject() { - Comment comment1 = commentDaoJpa.getById(1L).orElse(null); + Comment comment1 = commentDaoJpa.findById(1L).orElse(null); Date date = new Date(); commentDaoJpa.save(new Comment(1L, comment1.getBook(), date, "TestUser", "TestText")); - Comment comment2 = commentDaoJpa.getById(1L).orElse(null); + Comment comment2 = commentDaoJpa.findById(1L).orElse(null); assertAll( "comment", @@ -128,5 +131,4 @@ void updateObject() { () -> assertEquals("TestText", comment2.getText()) ); } - } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java index 8b399b3..9b2a1c4 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java @@ -1,15 +1,18 @@ package ru.otus.mkulikov.app.dao; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @@ -21,24 +24,27 @@ * Time: 9:45 */ -@DataJpaTest +@DataMongoTest @DisplayName("Класс GenreDaoJpa") class GenreDaoJpaTest { @Autowired private GenreDao genreDao; + @BeforeEach + void init() { + genreDao.save(getGenre(1L)); + genreDao.save(getGenre(2L)); + genreDao.save(getGenre(3L)); + } + @Test @DisplayName("Получение жанра по id") void getById() { - Genre genre = genreDao.findById(1L).orElse(null); - - assertAll( - "genre", - () -> assertNotNull(genre), - () -> assertEquals(1L, genre.getId()), - () -> assertEquals("Genre1", genre.getName()) - ); + Optional genre = genreDao.findById(1L); + + assertThat(genre).isNotEmpty(); + assertThat(genre).contains(getGenre(1L)); } @Test @@ -46,48 +52,53 @@ void getById() { void getAllObjects() { List genres = genreDao.findAll(); - assertAll( - "genres", - () -> assertNotNull(genres), - () -> assertEquals(3, genres.size()), - () -> assertEquals("Genre1", genres.get(0).getName()), - () -> assertEquals("Genre2", genres.get(1).getName()), - () -> assertEquals("Genre3", genres.get(2).getName()) - ); + assertThat(genres).isNotEmpty(); + assertThat(genres).size().isEqualTo(3); + assertThat(genres).containsAll(getGenres()); } @Test @DisplayName("Добавление жанра") void addObject() { - genreDao.save(new Genre("Test4")); - Genre genre = genreDao.findById(4L).orElse(null); - - assertAll( - "genre", - () -> assertNotNull(genre), - () -> assertEquals(4L, genre.getId()), - () -> assertEquals("Test4", genre.getName()) - ); + Genre genre = genreDao.save(getGenre(4L)); + Optional genre_selected = genreDao.findById(genre.getId()); + + assertThat(genre_selected).isNotEmpty(); + assertThat(genre_selected).contains(genre); } @Test - @DisplayName("Удаление жанра, который используется в таблице книг") + @DisplayName("Удаление жанра") @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteObject() { - assertThrows(DataIntegrityViolationException.class, () -> genreDao.deleteById(1L)); +// assertThrows(DataIntegrityViolationException.class, () -> genreDao.deleteById(1L)); + assertThat(genreDao.count()).isEqualTo(3); + genreDao.deleteById(1L); + assertThat(genreDao.count()).isEqualTo(2); } @Test @DisplayName("Обновление жанра") void updateObject() { - genreDao.save(new Genre(1L, "UpdatedName")); - Genre genre = genreDao.findById(1L).orElse(null); - - assertAll( - "genre", - () -> assertEquals(1L, genre.getId()), - () -> assertEquals("UpdatedName", genre.getName()) - ); + Genre genre = new Genre(1L, "UpdatedName"); + + genreDao.save(genre); + Optional genre_updated = genreDao.findById(1L); + + assertThat(genre_updated).isNotEmpty(); + assertThat(genre_updated).contains(genre); + } + + private List getGenres() { + List genres = new ArrayList(); + genres.add(getGenre(1L)); + genres.add(getGenre(2L)); + genres.add(getGenre(3L)); + return genres; + } + + private Genre getGenre(long id) { + return new Genre(id, "Genre" + id); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 361c2b4..a2d5c2b 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -54,7 +54,7 @@ class BookManageSeviceImplTest { @DisplayName("Получение книги по id") void getBookById() { Book book = getBook(1L); - when(bookDao.getById(anyLong())).thenReturn( Optional.of(book) ); + when(bookDao.findById(anyLong())).thenReturn( Optional.of(book) ); Book bookById = booksManageSevice.getBookById(1L); assertThat(bookById).isNotNull(); @@ -65,7 +65,7 @@ void getBookById() { @DisplayName("Получение всех книг") void getBooks() { List list = getBooksList(); - when(bookDao.getAllObjects()).thenReturn( list ); + when(bookDao.findAll()).thenReturn( list ); List comments = booksManageSevice.getBooks(); assertThat(comments).isNotNull(); @@ -108,7 +108,7 @@ public Book answer(InvocationOnMock invocationOnMock) throws Throwable { }); when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); - when(bookDao.getById(anyLong())).thenReturn( Optional.of(getBook(1L)) ); + when(bookDao.findById(anyLong())).thenReturn( Optional.of(getBook(1L)) ); int count = booksManageSevice.updateBook(1L, "Caption", 1L, 1L, "description"); diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index 45fa676..6501156 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -1,5 +1,6 @@ package ru.otus.mkulikov.app.service; +import org.junit.Ignore; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -38,6 +39,7 @@ @DisplayName("Класс CommentManageSevice") @ExtendWith(MockitoExtension.class) +@Ignore class CommentManageSeviceImplTest { @Mock @@ -53,7 +55,7 @@ class CommentManageSeviceImplTest { @DisplayName("Получение комментария по id") void getCommentById() { Comment comment = getComment(1L); - when(commentDao.getById(anyLong())).thenReturn( Optional.of(comment) ); + when(commentDao.findById(anyLong())).thenReturn( Optional.of(comment) ); Comment commentById = commentManageService.getCommentById(1L); assertThat(commentById).isNotNull(); @@ -87,7 +89,7 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { return comment; } }); - when(bookDao.getById(anyLong())).thenReturn( Optional.of(book) ); + when(bookDao.findById(anyLong())).thenReturn( Optional.of(book) ); long id = commentManageService.addComment(1L, "user5", "text5"); @@ -98,7 +100,7 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { @DisplayName("Получение комментариев по Id книги") void getCommentsByBookId() { List commentList = getCommentList(); - when(commentDao.getByBookId(anyLong())).thenReturn( commentList ); + when(commentDao.findByBookId(anyLong())).thenReturn( commentList ); List comments = commentManageService.getCommentsByBookId(1L); assertThat(comments).isNotNull(); @@ -117,7 +119,7 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { return comment; } }); - when(commentDao.getById(anyLong())).thenReturn( Optional.of(getComment(1L)) ); + when(commentDao.findById(anyLong())).thenReturn( Optional.of(getComment(1L)) ); int count = commentManageService.updateComment(1L, "TestUser", "TestText"); diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 26a0056..f7c7121 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -2,18 +2,10 @@ spring: banner: location: "classpath:banner-test.txt" - datasource: - initialization-mode: always - platform: test - jpa: hibernate: ddl-auto: none - properties: - hibernate: - show_sql: true - format_sql: true - - liquibase: - enabled: true + data: + mongodb: + database: library_test diff --git a/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml b/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml deleted file mode 100644 index 92d188b..0000000 --- a/src/test/resources/db/changelog/1.0/2019-06-22--0001-schema.yaml +++ /dev/null @@ -1,154 +0,0 @@ -databaseChangeLog: -- changeSet: - id: 2019-06-22--0001-schema-author - author: KulikovMV - createTable: - tableName: author - columns: - - column: - name: id - type: number(20,0) - constraints: - nullable: false - primaryKey: true - primaryKeyName: pk_author - - column: - name: surname - type: varchar(100) - constraints: - nullable: false - - column: - name: first_name - type: varchar(100) - constraints: - nullable: false - - column: - name: second_name - type: varchar(100) -- changeSet: - id: 2019-06-22--0001-schema-genre - author: KulikovMV - createTable: - tableName: genre - columns: - - column: - name: id - type: number(20,0) - constraints: - nullable: false - primaryKey: true - primaryKeyName: pk_genre - - column: - name: name - type: varchar(100) - constraints: - nullable: false -- changeSet: - id: 2019-06-22--0001-schema-book - author: KulikovMV - createTable: - tableName: book - columns: - - column: - name: id - type: number(20,0) - constraints: - nullable: false - primaryKey: true - primaryKeyName: pk_book - - column: - name: add_record_date - type: timestamp - defaultValueDate: sysdate - constraints: - nullable: false - - column: - name: caption - type: varchar(255) - constraints: - nullable: false - - column: - name: author_id - type: number(20,0) - constraints: - nullable: false - foreignKeyName: fk_author - references: author(id) - - column: - name: genre_id - type: number(20,0) - constraints: - nullable: false - foreignKeyName: fk_genre - references: genre(id) - - column: - name: description - type: varchar(255) - constraints: - nullable: false -- changeSet: - id: 2019-06-22--0001-schema-comment - author: KulikovMV - createTable: - tableName: comment - columns: - - column: - name: id - type: number(20,0) - constraints: - nullable: false - primaryKey: true - primaryKeyName: pk_comment - - column: - name: book_id - type: number(20,0) - constraints: - nullable: false - foreignKeyName: fk_comment - references: book(id) - deleteCascade: true - onDelete: cascade - - column: - name: add_record_date - type: timestamp - defaultValueDate: sysdate - constraints: - nullable: false - - column: - name: user_name - type: varchar(20) - constraints: - nullable: false - - column: - name: text - type: varchar(500) - constraints: - nullable: false -- changeSet: - id: 2019-06-22--0001-schema-sequences - author: KulikovMV - changes: - - createSequence: - cycle: true - incrementBy: 1 - ordered: true - sequenceName: sq_author - startValue: 1 - - createSequence: - cycle: true - incrementBy: 1 - ordered: true - sequenceName: sq_genre - startValue: 1 - - createSequence: - cycle: true - incrementBy: 1 - ordered: true - sequenceName: sq_book - startValue: 1 - - createSequence: - cycle: true - incrementBy: 1 - ordered: true - sequenceName: sq_comment - startValue: 1 diff --git a/src/test/resources/db/changelog/data/2019-06-22--0001-data.yaml b/src/test/resources/db/changelog/data/2019-06-22--0001-data.yaml deleted file mode 100644 index cbfcff5..0000000 --- a/src/test/resources/db/changelog/data/2019-06-22--0001-data.yaml +++ /dev/null @@ -1,14 +0,0 @@ -databaseChangeLog: -- changeSet: - id: 0001-chema-sql - author: KulikovMV - context: test - changes: - - sqlFile: - dbms: h2, oracle - encoding: utf8 - endDelimiter: ; - path: sql/2019-06-22--0001-data-h2.sql - relativeToChangelogFile: true - splitStatements: true - stripComments: true \ No newline at end of file diff --git a/src/test/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql b/src/test/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql deleted file mode 100644 index 75ebe2d..0000000 --- a/src/test/resources/db/changelog/data/sql/2019-06-22--0001-data-h2.sql +++ /dev/null @@ -1,39 +0,0 @@ -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (sq_author.nextval, 'Surname', 'FirstName', 'SecondName'); - -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (sq_author.nextval, 'Surname2', 'FirstName2', 'SecondName2'); - -insert into AUTHOR (ID, SURNAME, FIRST_NAME, SECOND_NAME) -values (sq_author.nextval, 'Surname3', 'FirstName3', 'SecondName3'); - --------------------------- - -insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre1'); -insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre2'); -insert into GENRE (ID, NAME) values (sq_genre.nextval, 'Genre3'); - --------------------------- - -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_1', 1, 1, 'description'); - -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_2', 1, 1, 'description'); - -insert into BOOK (ID, ADD_RECORD_DATE, CAPTION, AUTHOR_ID, GENRE_ID, DESCRIPTION) -values (sq_book.nextval, to_date('2019-01-01','YYYY-MM-DD'), 'book_3', 1, 1, 'description'); - --------------------------- - -insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 1, to_date('2019-01-01 10:01:01','YYYY-MM-DD HH24-MI-SS'), 'user1', 'text1'); - -insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 1, to_date('2019-01-01 10:01:02','YYYY-MM-DD HH24-MI-SS'), 'user2', 'text2'); - -insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 2, to_date('2019-01-01 10:01:03','YYYY-MM-DD HH24-MI-SS'), 'user3', 'text3'); - -insert into COMMENT (ID, BOOK_ID, ADD_RECORD_DATE, USER_NAME, TEXT) -values (sq_comment.nextval, 2, to_date('2019-01-01 10:01:04','YYYY-MM-DD HH24-MI-SS'), 'user4', 'text4'); \ No newline at end of file diff --git a/src/test/resources/db/changelog/db.changelog-master.yaml b/src/test/resources/db/changelog/db.changelog-master.yaml deleted file mode 100644 index 3adc919..0000000 --- a/src/test/resources/db/changelog/db.changelog-master.yaml +++ /dev/null @@ -1,5 +0,0 @@ -databaseChangeLog: -- include: - file: db/changelog/1.0/2019-06-22--0001-schema.yaml -- include: - file: db/changelog/data/2019-06-22--0001-data.yaml \ No newline at end of file From 4dfc484c8d8ba32f9e4c29c73a71dc2b20e76b7c Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 18 Jul 2019 07:19:47 +0300 Subject: [PATCH 44/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=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 --- .../ru/otus/mkulikov/app/dao/CommentDao.java | 7 +- .../ru/otus/mkulikov/app/model/Author.java | 2 +- .../java/ru/otus/mkulikov/app/model/Book.java | 6 +- .../ru/otus/mkulikov/app/model/Comment.java | 5 +- .../ru/otus/mkulikov/app/model/Genre.java | 2 +- .../app/service/CommentManageServiceImpl.java | 4 +- ...thorDaoJpaTest.java => AuthorDaoTest.java} | 6 +- .../{BookDaoJpaTest.java => BookDaoTest.java} | 4 +- ...entDaoJpaTest.java => CommentDaoTest.java} | 101 +++++++++++++----- ...GenreDaoJpaTest.java => GenreDaoTest.java} | 6 +- .../service/CommentManageSeviceImplTest.java | 2 +- 11 files changed, 96 insertions(+), 49 deletions(-) rename src/test/java/ru/otus/mkulikov/app/dao/{AuthorDaoJpaTest.java => AuthorDaoTest.java} (93%) rename src/test/java/ru/otus/mkulikov/app/dao/{BookDaoJpaTest.java => BookDaoTest.java} (98%) rename src/test/java/ru/otus/mkulikov/app/dao/{CommentDaoJpaTest.java => CommentDaoTest.java} (57%) rename src/test/java/ru/otus/mkulikov/app/dao/{GenreDaoJpaTest.java => GenreDaoTest.java} (94%) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index 1b733b4..2f37487 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -1,6 +1,8 @@ package ru.otus.mkulikov.app.dao; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.mongodb.repository.MongoRepository; +import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import java.util.List; @@ -14,5 +16,8 @@ public interface CommentDao extends MongoRepository { - List findByBookId(long bookId); +// @Query(value = "{ 'book.id' : ?0 }") +// List findByBook(long id); + + List findByBook(Book book); } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index 264b740..2e49ab8 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -14,7 +14,7 @@ @Data @Document -@KeySpace("author") +//@KeySpace("author") public class Author { @Id diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 2837f01..2a0e5c6 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -17,7 +17,7 @@ @Data @Document -@KeySpace("book") +//@KeySpace("book") public class Book { @Id @@ -26,9 +26,9 @@ public class Book { private String caption; private String description; - @DBRef(db = "author") + @DBRef private Author author; - @DBRef(db = "genre") + @DBRef private Genre genre; public Book() { diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java index a339412..3efe48d 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Comment.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -5,6 +5,7 @@ import org.springframework.data.keyvalue.annotation.KeySpace; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; import java.util.Date; @@ -17,7 +18,7 @@ @Data @Document -@KeySpace("comment") +//@KeySpace("comment") public class Comment { @Id @@ -26,7 +27,7 @@ public class Comment { private String userName; private String text; - @DBRef(db = "book") + @DBRef private Book book; public Comment() { diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 590cf03..b49b901 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -14,7 +14,7 @@ @Data @Document -@KeySpace("genre") +//@KeySpace("genre") public class Genre { @Id diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index e3083e7..4fb584e 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -38,7 +38,9 @@ public List getComments() { @Override public List getCommentsByBookId(long bookId) { - return commentDao.findByBookId(bookId); + Optional book = bookDao.findById(bookId); + + return commentDao.findByBook(book.orElse(null)); } @Override diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java similarity index 93% rename from src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java rename to src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java index 1872211..86ebf1f 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java @@ -5,7 +5,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; @@ -15,7 +14,6 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; /** * Created by IntelliJ IDEA. @@ -25,8 +23,8 @@ */ @DataMongoTest -@DisplayName("Класс AuthorDaoJpa") -class AuthorDaoJpaTest { +@DisplayName("Класс AuthorDao") +class AuthorDaoTest { @Autowired private AuthorDao authorDao; diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java similarity index 98% rename from src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java rename to src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java index 2e53601..919d54c 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java @@ -23,8 +23,8 @@ */ @DataMongoTest -@DisplayName("Класс BookDaoJpa") -class BookDaoJpaTest { +@DisplayName("Класс BookDao") +class BookDaoTest { @Autowired private BookDao bookDaoJpa; diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java similarity index 57% rename from src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java rename to src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java index e051575..6409f0d 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java @@ -1,13 +1,17 @@ package ru.otus.mkulikov.app.dao; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.utils.DateUtil; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional; @@ -25,8 +29,14 @@ */ @DataMongoTest -@DisplayName("Класс CommentDaoJpa") -class CommentDaoJpaTest { +@DisplayName("Класс CommentDao") +class CommentDaoTest { + + @Autowired + private AuthorDao authorDao; + + @Autowired + private GenreDao genreDao; @Autowired private BookDao bookDaoJpa; @@ -34,20 +44,32 @@ class CommentDaoJpaTest { @Autowired private CommentDao commentDaoJpa; + @BeforeEach + void init() { + authorDao.save(getAuthor(1L)); + authorDao.save(getAuthor(2L)); + authorDao.save(getAuthor(3L)); + + genreDao.save(getGenre(1L)); + genreDao.save(getGenre(2L)); + genreDao.save(getGenre(3L)); + + bookDaoJpa.save(getBook(1L)); + bookDaoJpa.save(getBook(2L)); + + commentDaoJpa.save(getComment(1L, 1L)); + commentDaoJpa.save(getComment(2L, 1L)); + commentDaoJpa.save(getComment(3L, 2L)); + commentDaoJpa.save(getComment(4L, 2L)); + } + @Test @DisplayName("Получение комментария по id") void getById() { - Comment comment = commentDaoJpa.findById(1L).orElse(null); + Optional comment = commentDaoJpa.findById(1L); - assertAll( - "comment", - () -> assertNotNull(comment), - () -> assertNotNull(comment.getBook()), - () -> assertEquals(1L, comment.getId()), - () -> assertEquals("user1", comment.getUserName()), - () -> assertEquals("2019-01-01 10:01:01", DateUtil.dateTimeToString(comment.getAddRecordDate())), - () -> assertEquals("text1", comment.getText()) - ); + assertThat(comment).isNotEmpty(); + assertThat(comment).contains(getComment(1L, 1L)); } @Test @@ -55,29 +77,20 @@ void getById() { void getAllObjects() { List comments = commentDaoJpa.findAll(); - assertAll( - "comments", - () -> assertNotNull(comments), - () -> assertEquals(4, comments.size()), - () -> assertEquals("text1", comments.get(0).getText()), - () -> assertEquals("text2", comments.get(1).getText()), - () -> assertEquals("text3", comments.get(2).getText()), - () -> assertEquals("text4", comments.get(3).getText()) - ); + assertThat(comments).isNotEmpty(); + assertThat(comments).size().isEqualTo(4); + assertThat(comments).containsAll(getComments()); } @Test @DisplayName("Получение всех комментариев для книги") void getObjectsByBook() { - List comments = commentDaoJpa.findByBookId(1L); + Optional book = bookDaoJpa.findById(1L); + List comments = commentDaoJpa.findByBook(book.orElse(null)); - assertAll( - "comments", - () -> assertNotNull(comments), - () -> assertEquals(2, comments.size()), - () -> assertEquals("text1", comments.get(0).getText()), - () -> assertEquals("text2", comments.get(1).getText()) - ); + assertThat(comments).isNotEmpty(); + assertThat(comments).size().isEqualTo(2); + assertThat(comments).contains(getComment(1L, 1L), getComment(2L, 1L)); } @Test @@ -131,4 +144,34 @@ void updateObject() { () -> assertEquals("TestText", comment2.getText()) ); } + + private Comment getComment(long id, long bookId) { + Date date = DateUtil.stringToDateTime("2019-01-01 10:01:01"); + Book book = getBook(bookId); + return new Comment(id, book, date, "user" + id, "text" + id); + } + + private Book getBook(long id) { + Author author = getAuthor(id); + Genre genre = getGenre(id); + Date date = DateUtil.stringToDateTime("2019-01-01 10:01:01"); + return new Book(id, date, "Test_Book", author, genre, "Test_Description"); + } + + private Author getAuthor(long id) { + return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + } + + private Genre getGenre(long id) { + return new Genre(id, "Genre" + id); + } + + private List getComments() { + List comments = new ArrayList(); + comments.add(getComment(1L, 1L)); + comments.add(getComment(2L, 1L)); + comments.add(getComment(3L, 2L)); + comments.add(getComment(4L, 2L)); + return comments; + } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java similarity index 94% rename from src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java rename to src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java index 9b2a1c4..96a2ebe 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java @@ -5,7 +5,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; -import org.springframework.dao.DataIntegrityViolationException; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; @@ -15,7 +14,6 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; /** * Created by IntelliJ IDEA. @@ -25,8 +23,8 @@ */ @DataMongoTest -@DisplayName("Класс GenreDaoJpa") -class GenreDaoJpaTest { +@DisplayName("Класс GenreDao") +class GenreDaoTest { @Autowired private GenreDao genreDao; diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index 6501156..c0eb1a7 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -100,7 +100,7 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { @DisplayName("Получение комментариев по Id книги") void getCommentsByBookId() { List commentList = getCommentList(); - when(commentDao.findByBookId(anyLong())).thenReturn( commentList ); + when(commentDao.findByBook(getBook(1L))).thenReturn( commentList ); List comments = commentManageService.getCommentsByBookId(1L); assertThat(comments).isNotNull(); From 268a0abbd4707e5a548e01423fe8090b810ac07a Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Mon, 12 Aug 2019 00:33:58 +0300 Subject: [PATCH 45/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=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 --- .../ru/otus/mkulikov/app/dao/CommentDao.java | 1 - .../ru/otus/mkulikov/app/model/Author.java | 2 - .../java/ru/otus/mkulikov/app/model/Book.java | 2 - .../ru/otus/mkulikov/app/model/Comment.java | 3 - .../ru/otus/mkulikov/app/model/Genre.java | 2 - .../otus/mkulikov/app/dao/AuthorDaoTest.java | 52 +++--- .../ru/otus/mkulikov/app/dao/BookDaoTest.java | 158 +++++++++++------- .../otus/mkulikov/app/dao/CommentDaoTest.java | 74 ++++---- .../otus/mkulikov/app/dao/GenreDaoTest.java | 45 +++-- 9 files changed, 204 insertions(+), 135 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index 2f37487..4eb7725 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.app.dao; -import org.springframework.data.jpa.repository.Query; import org.springframework.data.mongodb.repository.MongoRepository; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index 2e49ab8..3e1b0a1 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -2,7 +2,6 @@ import lombok.Data; import org.springframework.data.annotation.Id; -import org.springframework.data.keyvalue.annotation.KeySpace; import org.springframework.data.mongodb.core.mapping.Document; /** @@ -14,7 +13,6 @@ @Data @Document -//@KeySpace("author") public class Author { @Id diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 2a0e5c6..d648a67 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -2,7 +2,6 @@ import lombok.Data; import org.springframework.data.annotation.Id; -import org.springframework.data.keyvalue.annotation.KeySpace; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; @@ -17,7 +16,6 @@ @Data @Document -//@KeySpace("book") public class Book { @Id diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java index 3efe48d..d61bcca 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Comment.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -2,10 +2,8 @@ import lombok.Data; import org.springframework.data.annotation.Id; -import org.springframework.data.keyvalue.annotation.KeySpace; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; -import org.springframework.data.mongodb.core.mapping.Field; import java.util.Date; @@ -18,7 +16,6 @@ @Data @Document -//@KeySpace("comment") public class Comment { @Id diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index b49b901..e4210e2 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -2,7 +2,6 @@ import lombok.Data; import org.springframework.data.annotation.Id; -import org.springframework.data.keyvalue.annotation.KeySpace; import org.springframework.data.mongodb.core.mapping.Document; /** @@ -14,7 +13,6 @@ @Data @Document -//@KeySpace("genre") public class Genre { @Id diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java index 86ebf1f..4962dcf 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java @@ -26,23 +26,39 @@ @DisplayName("Класс AuthorDao") class AuthorDaoTest { + private final long ID_1 = 1L; + private final long ID_2 = 2L; + private final long ID_3 = 3L; + private final long ID_4 = 4L; + + private final int OBJECT_COUNT_3 = 3; + private final int OBJECT_COUNT_2 = 2; + + private final String SURNAME = "Surname"; + private final String FIRST_NAME = "FirstName"; + private final String SECOND_NAME = "SecondName"; + + private final String TEST_SURNAME = "TestSurname"; + private final String TEST_FIRST_NAME = "TestFirstName"; + private final String TEST_SECOND_NAME = "TestSecondName"; + @Autowired private AuthorDao authorDao; @BeforeEach void init() { - authorDao.save(getAuthor(1L)); - authorDao.save(getAuthor(2L)); - authorDao.save(getAuthor(3L)); + authorDao.save(getAuthor(ID_1)); + authorDao.save(getAuthor(ID_2)); + authorDao.save(getAuthor(ID_3)); } @Test @DisplayName("Получение автора по id") void getById() { - Optional author = authorDao.findById(1L); + Optional author = authorDao.findById(ID_1); assertThat(author).isNotEmpty(); - assertThat(author).contains(getAuthor(1L)); + assertThat(author).contains(getAuthor(ID_1)); } @Test @@ -50,51 +66,49 @@ void getById() { void getAllObjects() { List authors = authorDao.findAll(); - assertThat(authors).size().isEqualTo(3); + assertThat(authors).size().isEqualTo(OBJECT_COUNT_3); assertThat(authors).containsAll(getAuthors()); } @Test @DisplayName("Добавление автора") void addObject() { - Author author = authorDao.save(getAuthor(4L)); + Author author = authorDao.save(getAuthor(ID_4)); Optional author_selected = authorDao.findById(author.getId()); assertThat(author_selected).isNotEmpty(); - assertThat(author_selected).contains(getAuthor(4L)); + assertThat(author_selected).contains(getAuthor(ID_4)); } @Test @DisplayName("Удаление автора") @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteObject() { -// assertThrows(DataIntegrityViolationException.class, () -> authorDao.deleteById(1L)); - - assertThat(authorDao.count()).isEqualTo(3); - authorDao.deleteById(1L); - assertThat(authorDao.count()).isEqualTo(2); + assertThat(authorDao.count()).isEqualTo(OBJECT_COUNT_3); + authorDao.deleteById(ID_1); + assertThat(authorDao.count()).isEqualTo(OBJECT_COUNT_2); } @Test @DisplayName("Обновление автора") void updateObject() { - Author author = new Author(1L, "TestSurname", "TestFirstName", "TestSecondName"); + Author author = new Author(ID_1, TEST_SURNAME, TEST_FIRST_NAME, TEST_SECOND_NAME); authorDao.save(author); - Optional author_selected = authorDao.findById(1L); + Optional author_selected = authorDao.findById(ID_1); assertThat(author_selected).isNotEmpty(); assertThat(author_selected).contains(author); } private Author getAuthor(long id) { - return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); } private List getAuthors() { List authors = new ArrayList<>(); - authors.add(getAuthor(1L)); - authors.add(getAuthor(2L)); - authors.add(getAuthor(3L)); + authors.add(getAuthor(ID_1)); + authors.add(getAuthor(ID_2)); + authors.add(getAuthor(ID_3)); return authors; } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java index 919d54c..095ab1e 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java @@ -1,5 +1,6 @@ package ru.otus.mkulikov.app.dao; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -9,11 +10,12 @@ import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.utils.DateUtil; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional; -import static org.junit.jupiter.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; /** * Created by IntelliJ IDEA. @@ -26,6 +28,30 @@ @DisplayName("Класс BookDao") class BookDaoTest { + private final long ID_1 = 1L; + private final long ID_2 = 2L; + private final long ID_3 = 3L; + private final long ID_4 = 4L; + + private final int OBJECT_COUNT_3 = 3; + private final int OBJECT_COUNT_2 = 2; + + private final String SURNAME = "Surname"; + private final String FIRST_NAME = "FirstName"; + private final String SECOND_NAME = "SecondName"; + + private final String TEST_SURNAME = "TestSurname"; + private final String TEST_FIRST_NAME = "TestFirstName"; + private final String TEST_SECOND_NAME = "TestSecondName"; + + private final String GENRE_NAME = "GenreName"; + private final String DATE_TIME = "2019-01-01 10:01:01"; + + private final String BOOK_NAME = "BookName"; + private final String UPDATED_BOOK_NAME = "UpdatedBookName"; + private final String DESCRIPTION = "Description"; + private final String UPDATED_DESCRIPTION = "UpdatedDescription"; + @Autowired private BookDao bookDaoJpa; @@ -35,85 +61,103 @@ class BookDaoTest { @Autowired private GenreDao genreDao; + @BeforeEach + void init() { + authorDao.save(getAuthor(ID_1)); + authorDao.save(getAuthor(ID_2)); + authorDao.save(getAuthor(ID_3)); + + genreDao.save(getGenre(ID_1)); + genreDao.save(getGenre(ID_2)); + genreDao.save(getGenre(ID_3)); + + bookDaoJpa.save(getBook(ID_1)); + bookDaoJpa.save(getBook(ID_2)); + } + @Test - @DisplayName("Получение книги по id") + @DisplayName("Получение книги по id") void getById() { - Book book = bookDaoJpa.findById(1L).orElse(null); - - assertAll( - "book", - () -> assertNotNull(book), - () -> assertEquals(1L, book.getId()), - () -> assertEquals("2019-01-01", DateUtil.dateToString(book.getAddRecordDate())), - () -> assertEquals("book_1", book.getCaption()), - () -> assertEquals(1, book.getAuthor().getId()), - () -> assertEquals(1, book.getGenre().getId()), - () -> assertEquals("description", book.getDescription()) - ); + Optional book = bookDaoJpa.findById(ID_1); + + assertThat(book).isNotEmpty(); + assertThat(book).contains(getBook(ID_1)); } @Test - @DisplayName("Получение всех книг") + @DisplayName("Получение всех книг") void getAllObjects() { List books = bookDaoJpa.findAll(); - assertAll( - "books", - () -> assertNotNull(books), - () -> assertEquals(3, books.size()), - () -> assertEquals("book_1", books.get(0).getCaption()), - () -> assertEquals("book_2", books.get(1).getCaption()), - () -> assertEquals("book_3", books.get(2).getCaption()) - ); + assertThat(books).size().isEqualTo(OBJECT_COUNT_2); + assertThat(books).containsAll(getBooks()); } @Test @DisplayName("Добавление книги") void addObject() { - bookDaoJpa.save(getNewBook()); - Book book = bookDaoJpa.findById(4L).orElse(null); - - assertAll( - "book", - () -> assertNotNull(book), - () -> assertEquals(4L, book.getId()), - () -> assertEquals("Test_Book", book.getCaption()), - () -> assertEquals(1, book.getAuthor().getId()), - () -> assertEquals(1, book.getGenre().getId()), - () -> assertEquals("Test_Description", book.getDescription()) - ); + bookDaoJpa.save(getBook(ID_4)); + Optional book = bookDaoJpa.findById(ID_4); + + + +// assertAll( +// "book", +// () -> assertNotNull(book), +// () -> assertEquals(4L, book.getId()), +// () -> assertEquals("Test_Book", book.getCaption()), +// () -> assertEquals(1, book.getAuthor().getId()), +// () -> assertEquals(1, book.getGenre().getId()), +// () -> assertEquals("Test_Description", book.getDescription()) +// ); + } +// +// @Test +// @DisplayName("Удаление книги по id") +// void deleteObject() { +// bookDaoJpa.deleteById(1L); +// Optional book = bookDaoJpa.findById(1L); +// assertThat(book).isEmpty(); +// } +// +// @Test +// @DisplayName("Обновление книги") +// void updateObject() { +// bookDaoJpa.save(getUpdatedBook()); +// Book book2 = bookDaoJpa.findById(1L).orElse(null); +// +// assertAll( +// "book", +// () -> assertEquals("Test_Book", book2.getCaption()), +// () -> assertEquals("Test_Description", book2.getDescription()) +// ); +// } + + private Book getBook(long id) { + Author author = getAuthor(id); + Genre genre = getGenre(id); + Date date = DateUtil.stringToDateTime(DATE_TIME); + return new Book(id, date, BOOK_NAME, author, genre, DESCRIPTION); } - @Test - @DisplayName("Удаление книги по id") - void deleteObject() { - bookDaoJpa.deleteById(1L); - Optional book = bookDaoJpa.findById(1L); - assertTrue(book.isEmpty()); + private Author getAuthor(long id) { + return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); } - @Test - @DisplayName("Обновление книги") - void updateObject() { - bookDaoJpa.save(getUpdatedBook()); - Book book2 = bookDaoJpa.findById(1L).orElse(null); - - assertAll( - "book", - () -> assertEquals("Test_Book", book2.getCaption()), - () -> assertEquals("Test_Description", book2.getDescription()) - ); + private Genre getGenre(long id) { + return new Genre(id, GENRE_NAME + id); } - private Book getNewBook() { - Author author = authorDao.findById(1L).orElse(null); - Genre genre = genreDao.findById(1L).orElse(null); - return new Book("Test_Book", author, genre, "Test_Description"); + private List getBooks() { + List books = new ArrayList(); + books.add(getBook(ID_1)); + books.add(getBook(ID_2)); + return books; } private Book getUpdatedBook() { Author author = authorDao.findById(1L).orElse(null); Genre genre = genreDao.findById(1L).orElse(null); - return new Book(1L, new Date(), "Test_Book", author, genre, "Test_Description"); + return new Book(1L, new Date(), UPDATED_BOOK_NAME, author, genre, UPDATED_DESCRIPTION); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java index 6409f0d..6d47f16 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java @@ -32,6 +32,18 @@ @DisplayName("Класс CommentDao") class CommentDaoTest { + private final long ID_1 = 1L; + private final long ID_2 = 2L; + private final long ID_3 = 3L; + private final long ID_4 = 4L; + + private final int OBJECT_COUNT_4 = 4; + private final int OBJECT_COUNT_3 = 3; + private final int OBJECT_COUNT_2 = 2; + + private final String TEST_DATE_TIME = "2019-01-01 10:01:01"; + private final String GENRE_NAME = "GenreName"; + @Autowired private AuthorDao authorDao; @@ -46,30 +58,30 @@ class CommentDaoTest { @BeforeEach void init() { - authorDao.save(getAuthor(1L)); - authorDao.save(getAuthor(2L)); - authorDao.save(getAuthor(3L)); + authorDao.save(getAuthor(ID_1)); + authorDao.save(getAuthor(ID_2)); + authorDao.save(getAuthor(ID_3)); - genreDao.save(getGenre(1L)); - genreDao.save(getGenre(2L)); - genreDao.save(getGenre(3L)); + genreDao.save(getGenre(ID_1)); + genreDao.save(getGenre(ID_2)); + genreDao.save(getGenre(ID_3)); - bookDaoJpa.save(getBook(1L)); - bookDaoJpa.save(getBook(2L)); + bookDaoJpa.save(getBook(ID_1)); + bookDaoJpa.save(getBook(ID_2)); - commentDaoJpa.save(getComment(1L, 1L)); - commentDaoJpa.save(getComment(2L, 1L)); - commentDaoJpa.save(getComment(3L, 2L)); - commentDaoJpa.save(getComment(4L, 2L)); + commentDaoJpa.save(getComment(ID_1, ID_1)); + commentDaoJpa.save(getComment(ID_2, ID_1)); + commentDaoJpa.save(getComment(ID_3, ID_2)); + commentDaoJpa.save(getComment(ID_4, ID_2)); } @Test @DisplayName("Получение комментария по id") void getById() { - Optional comment = commentDaoJpa.findById(1L); + Optional comment = commentDaoJpa.findById(ID_1); assertThat(comment).isNotEmpty(); - assertThat(comment).contains(getComment(1L, 1L)); + assertThat(comment).contains(getComment(ID_1, ID_1)); } @Test @@ -78,26 +90,26 @@ void getAllObjects() { List comments = commentDaoJpa.findAll(); assertThat(comments).isNotEmpty(); - assertThat(comments).size().isEqualTo(4); + assertThat(comments).size().isEqualTo(OBJECT_COUNT_4); assertThat(comments).containsAll(getComments()); } @Test @DisplayName("Получение всех комментариев для книги") void getObjectsByBook() { - Optional book = bookDaoJpa.findById(1L); + Optional book = bookDaoJpa.findById(ID_1); List comments = commentDaoJpa.findByBook(book.orElse(null)); assertThat(comments).isNotEmpty(); - assertThat(comments).size().isEqualTo(2); - assertThat(comments).contains(getComment(1L, 1L), getComment(2L, 1L)); + assertThat(comments).size().isEqualTo(OBJECT_COUNT_2); + assertThat(comments).contains(getComment(ID_1, ID_1), getComment(ID_2, ID_1)); } @Test @DisplayName("Добавление комментария") void addObject() { Date date = new Date(); - Book book = bookDaoJpa.findById(1L).orElse(null); + Book book = bookDaoJpa.findById(ID_1).orElse(null); commentDaoJpa.save(new Comment(book, date, "user5", "text5")); Comment comment = commentDaoJpa.findById(5L).orElse(null); @@ -116,20 +128,20 @@ void addObject() { @Test @DisplayName("Удаление комментария") void deleteObject() { - commentDaoJpa.deleteById(1L); - Optional comment = commentDaoJpa.findById(1L); + commentDaoJpa.deleteById(ID_1); + Optional comment = commentDaoJpa.findById(ID_1); assertThat(comment).isNotEmpty(); } @Test @DisplayName("Обновление комментария") void updateObject() { - Comment comment1 = commentDaoJpa.findById(1L).orElse(null); + Comment comment1 = commentDaoJpa.findById(ID_1).orElse(null); Date date = new Date(); - commentDaoJpa.save(new Comment(1L, comment1.getBook(), date, "TestUser", "TestText")); + commentDaoJpa.save(new Comment(ID_1, comment1.getBook(), date, "TestUser", "TestText")); - Comment comment2 = commentDaoJpa.findById(1L).orElse(null); + Comment comment2 = commentDaoJpa.findById(ID_1).orElse(null); assertAll( "comment", @@ -146,7 +158,7 @@ void updateObject() { } private Comment getComment(long id, long bookId) { - Date date = DateUtil.stringToDateTime("2019-01-01 10:01:01"); + Date date = DateUtil.stringToDateTime(TEST_DATE_TIME); Book book = getBook(bookId); return new Comment(id, book, date, "user" + id, "text" + id); } @@ -154,7 +166,7 @@ private Comment getComment(long id, long bookId) { private Book getBook(long id) { Author author = getAuthor(id); Genre genre = getGenre(id); - Date date = DateUtil.stringToDateTime("2019-01-01 10:01:01"); + Date date = DateUtil.stringToDateTime(TEST_DATE_TIME); return new Book(id, date, "Test_Book", author, genre, "Test_Description"); } @@ -163,15 +175,15 @@ private Author getAuthor(long id) { } private Genre getGenre(long id) { - return new Genre(id, "Genre" + id); + return new Genre(id, GENRE_NAME + id); } private List getComments() { List comments = new ArrayList(); - comments.add(getComment(1L, 1L)); - comments.add(getComment(2L, 1L)); - comments.add(getComment(3L, 2L)); - comments.add(getComment(4L, 2L)); + comments.add(getComment(ID_1, ID_1)); + comments.add(getComment(ID_2, ID_1)); + comments.add(getComment(ID_3, ID_2)); + comments.add(getComment(ID_4, ID_2)); return comments; } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java index 96a2ebe..52b289b 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java @@ -26,23 +26,34 @@ @DisplayName("Класс GenreDao") class GenreDaoTest { + private final long ID_1 = 1L; + private final long ID_2 = 2L; + private final long ID_3 = 3L; + private final long ID_4 = 4L; + + private final int OBJECT_COUNT_3 = 3; + private final int OBJECT_COUNT_2 = 2; + + private final String UPDATED_NAME = "UpdatedName"; + private final String GENRE_NAME = "GenreName"; + @Autowired private GenreDao genreDao; @BeforeEach void init() { - genreDao.save(getGenre(1L)); - genreDao.save(getGenre(2L)); - genreDao.save(getGenre(3L)); + genreDao.save(getGenre(ID_1)); + genreDao.save(getGenre(ID_2)); + genreDao.save(getGenre(ID_3)); } @Test @DisplayName("Получение жанра по id") void getById() { - Optional genre = genreDao.findById(1L); + Optional genre = genreDao.findById(ID_1); assertThat(genre).isNotEmpty(); - assertThat(genre).contains(getGenre(1L)); + assertThat(genre).contains(getGenre(ID_1)); } @Test @@ -51,14 +62,14 @@ void getAllObjects() { List genres = genreDao.findAll(); assertThat(genres).isNotEmpty(); - assertThat(genres).size().isEqualTo(3); + assertThat(genres).size().isEqualTo(OBJECT_COUNT_3); assertThat(genres).containsAll(getGenres()); } @Test @DisplayName("Добавление жанра") void addObject() { - Genre genre = genreDao.save(getGenre(4L)); + Genre genre = genreDao.save(getGenre(ID_4)); Optional genre_selected = genreDao.findById(genre.getId()); assertThat(genre_selected).isNotEmpty(); @@ -69,20 +80,18 @@ void addObject() { @DisplayName("Удаление жанра") @Transactional(propagation = Propagation.NOT_SUPPORTED) void deleteObject() { -// assertThrows(DataIntegrityViolationException.class, () -> genreDao.deleteById(1L)); - - assertThat(genreDao.count()).isEqualTo(3); - genreDao.deleteById(1L); - assertThat(genreDao.count()).isEqualTo(2); + assertThat(genreDao.count()).isEqualTo(OBJECT_COUNT_3); + genreDao.deleteById(ID_1); + assertThat(genreDao.count()).isEqualTo(OBJECT_COUNT_2); } @Test @DisplayName("Обновление жанра") void updateObject() { - Genre genre = new Genre(1L, "UpdatedName"); + Genre genre = new Genre(ID_1, UPDATED_NAME); genreDao.save(genre); - Optional genre_updated = genreDao.findById(1L); + Optional genre_updated = genreDao.findById(ID_1); assertThat(genre_updated).isNotEmpty(); assertThat(genre_updated).contains(genre); @@ -90,13 +99,13 @@ void updateObject() { private List getGenres() { List genres = new ArrayList(); - genres.add(getGenre(1L)); - genres.add(getGenre(2L)); - genres.add(getGenre(3L)); + genres.add(getGenre(ID_1)); + genres.add(getGenre(ID_2)); + genres.add(getGenre(ID_3)); return genres; } private Genre getGenre(long id) { - return new Genre(id, "Genre" + id); + return new Genre(id, GENRE_NAME + id); } } \ No newline at end of file From 1b4e4539d01d600373b4c6c6b0aa08a143180b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Mon, 12 Aug 2019 17:06:40 +0300 Subject: [PATCH 46/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=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 --- .../ru/otus/mkulikov/app/dao/BookDaoTest.java | 75 +++++++------- .../otus/mkulikov/app/dao/CommentDaoTest.java | 97 ++++++++----------- .../otus/mkulikov/app/model/DateUtilTest.java | 7 +- .../service/AuthorManageSeviceImplTest.java | 46 +++++---- .../service/CommentManageSeviceImplTest.java | 6 +- 5 files changed, 113 insertions(+), 118 deletions(-) diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java index 095ab1e..69776a8 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java @@ -33,17 +33,12 @@ class BookDaoTest { private final long ID_3 = 3L; private final long ID_4 = 4L; - private final int OBJECT_COUNT_3 = 3; private final int OBJECT_COUNT_2 = 2; private final String SURNAME = "Surname"; private final String FIRST_NAME = "FirstName"; private final String SECOND_NAME = "SecondName"; - private final String TEST_SURNAME = "TestSurname"; - private final String TEST_FIRST_NAME = "TestFirstName"; - private final String TEST_SECOND_NAME = "TestSecondName"; - private final String GENRE_NAME = "GenreName"; private final String DATE_TIME = "2019-01-01 10:01:01"; @@ -96,42 +91,35 @@ void getAllObjects() { @Test @DisplayName("Добавление книги") void addObject() { - bookDaoJpa.save(getBook(ID_4)); - Optional book = bookDaoJpa.findById(ID_4); + Book book = getNewBook(ID_4); + + bookDaoJpa.save(book); + Optional book_selected = bookDaoJpa.findById(ID_4); + + assertThat(book_selected).isNotEmpty(); + assertThat(book_selected).contains(book); + } + + @Test + @DisplayName("Удаление книги по id") + void deleteObject() { + bookDaoJpa.deleteById(ID_1); + Optional book = bookDaoJpa.findById(ID_1); +// assertThat(book).isNotEmpty(); + assertThat(book).isEmpty(); + } + @Test + @DisplayName("Обновление книги") + void updateObject() { + Book book = getUpdatedBook(); + bookDaoJpa.save(book); + Optional book_selected = bookDaoJpa.findById(ID_1); -// assertAll( -// "book", -// () -> assertNotNull(book), -// () -> assertEquals(4L, book.getId()), -// () -> assertEquals("Test_Book", book.getCaption()), -// () -> assertEquals(1, book.getAuthor().getId()), -// () -> assertEquals(1, book.getGenre().getId()), -// () -> assertEquals("Test_Description", book.getDescription()) -// ); + assertThat(book_selected).isNotEmpty(); + assertThat(book_selected).contains(book); } -// -// @Test -// @DisplayName("Удаление книги по id") -// void deleteObject() { -// bookDaoJpa.deleteById(1L); -// Optional book = bookDaoJpa.findById(1L); -// assertThat(book).isEmpty(); -// } -// -// @Test -// @DisplayName("Обновление книги") -// void updateObject() { -// bookDaoJpa.save(getUpdatedBook()); -// Book book2 = bookDaoJpa.findById(1L).orElse(null); -// -// assertAll( -// "book", -// () -> assertEquals("Test_Book", book2.getCaption()), -// () -> assertEquals("Test_Description", book2.getDescription()) -// ); -// } private Book getBook(long id) { Author author = getAuthor(id); @@ -156,8 +144,15 @@ private List getBooks() { } private Book getUpdatedBook() { - Author author = authorDao.findById(1L).orElse(null); - Genre genre = genreDao.findById(1L).orElse(null); - return new Book(1L, new Date(), UPDATED_BOOK_NAME, author, genre, UPDATED_DESCRIPTION); + Author author = authorDao.findById(ID_1).orElse(null); + Genre genre = genreDao.findById(ID_1).orElse(null); + return new Book(ID_1, new Date(), UPDATED_BOOK_NAME, author, genre, UPDATED_DESCRIPTION); + } + + private Book getNewBook(long id) { + Author author = authorDao.findById(ID_1).orElse(null); + Genre genre = genreDao.findById(ID_1).orElse(null); + Date date = DateUtil.stringToDateTime(DATE_TIME); + return new Book(id, date, UPDATED_BOOK_NAME, author, genre, UPDATED_DESCRIPTION); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java index 6d47f16..3325136 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java @@ -17,9 +17,6 @@ import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; -import static org.hibernate.validator.internal.util.Contracts.assertNotNull; -import static org.junit.Assert.assertEquals; -import static org.junit.jupiter.api.Assertions.assertAll; /** * Created by IntelliJ IDEA. @@ -36,12 +33,13 @@ class CommentDaoTest { private final long ID_2 = 2L; private final long ID_3 = 3L; private final long ID_4 = 4L; + private final long ID_5 = 5L; private final int OBJECT_COUNT_4 = 4; private final int OBJECT_COUNT_3 = 3; private final int OBJECT_COUNT_2 = 2; - private final String TEST_DATE_TIME = "2019-01-01 10:01:01"; + private final String DATE_TIME = "2019-01-01 10:01:01"; private final String GENRE_NAME = "GenreName"; @Autowired @@ -51,10 +49,10 @@ class CommentDaoTest { private GenreDao genreDao; @Autowired - private BookDao bookDaoJpa; + private BookDao bookDao; @Autowired - private CommentDao commentDaoJpa; + private CommentDao commentDao; @BeforeEach void init() { @@ -66,19 +64,19 @@ void init() { genreDao.save(getGenre(ID_2)); genreDao.save(getGenre(ID_3)); - bookDaoJpa.save(getBook(ID_1)); - bookDaoJpa.save(getBook(ID_2)); + bookDao.save(getBook(ID_1)); + bookDao.save(getBook(ID_2)); - commentDaoJpa.save(getComment(ID_1, ID_1)); - commentDaoJpa.save(getComment(ID_2, ID_1)); - commentDaoJpa.save(getComment(ID_3, ID_2)); - commentDaoJpa.save(getComment(ID_4, ID_2)); + commentDao.save(getComment(ID_1, ID_1)); + commentDao.save(getComment(ID_2, ID_1)); + commentDao.save(getComment(ID_3, ID_2)); + commentDao.save(getComment(ID_4, ID_2)); } @Test @DisplayName("Получение комментария по id") void getById() { - Optional comment = commentDaoJpa.findById(ID_1); + Optional comment = commentDao.findById(ID_1); assertThat(comment).isNotEmpty(); assertThat(comment).contains(getComment(ID_1, ID_1)); @@ -87,7 +85,7 @@ void getById() { @Test @DisplayName("Получение всех комментариев") void getAllObjects() { - List comments = commentDaoJpa.findAll(); + List comments = commentDao.findAll(); assertThat(comments).isNotEmpty(); assertThat(comments).size().isEqualTo(OBJECT_COUNT_4); @@ -97,8 +95,8 @@ void getAllObjects() { @Test @DisplayName("Получение всех комментариев для книги") void getObjectsByBook() { - Optional book = bookDaoJpa.findById(ID_1); - List comments = commentDaoJpa.findByBook(book.orElse(null)); + Optional book = bookDao.findById(ID_1); + List comments = commentDao.findByBook(book.orElse(null)); assertThat(comments).isNotEmpty(); assertThat(comments).size().isEqualTo(OBJECT_COUNT_2); @@ -108,57 +106,38 @@ void getObjectsByBook() { @Test @DisplayName("Добавление комментария") void addObject() { - Date date = new Date(); - Book book = bookDaoJpa.findById(ID_1).orElse(null); - commentDaoJpa.save(new Comment(book, date, "user5", "text5")); - - Comment comment = commentDaoJpa.findById(5L).orElse(null); - - assertAll( - "comment", - () -> assertNotNull(comment), - () -> assertNotNull(comment.getBook()), - () -> assertEquals(5L, comment.getId()), - () -> assertEquals(date, comment.getAddRecordDate()), - () -> assertEquals("user5", comment.getUserName()), - () -> assertEquals("text5", comment.getText()) - ); + Date date = DateUtil.stringToDateTime(DATE_TIME); + Book book = bookDao.findById(ID_1).orElse(null); + Comment comment = new Comment(ID_5, book, date, "user5", "text5"); + commentDao.save(comment); + + Optional comment_selected = commentDao.findById(5L); + + assertThat(comment_selected).isNotEmpty(); + assertThat(comment_selected).contains(comment); } @Test @DisplayName("Удаление комментария") void deleteObject() { - commentDaoJpa.deleteById(ID_1); - Optional comment = commentDaoJpa.findById(ID_1); - assertThat(comment).isNotEmpty(); + commentDao.deleteById(ID_1); + Optional comment = commentDao.findById(ID_1); + assertThat(comment).isEmpty(); } @Test @DisplayName("Обновление комментария") void updateObject() { - Comment comment1 = commentDaoJpa.findById(ID_1).orElse(null); - - Date date = new Date(); - commentDaoJpa.save(new Comment(ID_1, comment1.getBook(), date, "TestUser", "TestText")); - - Comment comment2 = commentDaoJpa.findById(ID_1).orElse(null); - - assertAll( - "comment", - () -> assertNotNull(comment1), - () -> assertNotNull(comment2), - () -> assertNotNull(comment1.getBook()), - () -> assertNotNull(comment2.getBook()), - () -> assertEquals("user1", comment1.getUserName()), - () -> assertEquals("text1", comment1.getText()), - () -> assertEquals(date, comment2.getAddRecordDate()), - () -> assertEquals("TestUser", comment2.getUserName()), - () -> assertEquals("TestText", comment2.getText()) - ); + Comment comment = getUpdatedComment(); + commentDao.save(comment); + Optional comment_selected = commentDao.findById(ID_1); + + assertThat(comment_selected).isNotEmpty(); + assertThat(comment_selected).contains(comment); } private Comment getComment(long id, long bookId) { - Date date = DateUtil.stringToDateTime(TEST_DATE_TIME); + Date date = DateUtil.stringToDateTime(DATE_TIME); Book book = getBook(bookId); return new Comment(id, book, date, "user" + id, "text" + id); } @@ -166,7 +145,7 @@ private Comment getComment(long id, long bookId) { private Book getBook(long id) { Author author = getAuthor(id); Genre genre = getGenre(id); - Date date = DateUtil.stringToDateTime(TEST_DATE_TIME); + Date date = DateUtil.stringToDateTime(DATE_TIME); return new Book(id, date, "Test_Book", author, genre, "Test_Description"); } @@ -186,4 +165,12 @@ private List getComments() { comments.add(getComment(ID_4, ID_2)); return comments; } + + private Comment getUpdatedComment() { + Comment comment = commentDao.findById(ID_1).orElse(null); + comment.setAddRecordDate(new Date()); + comment.setUserName("TestUser"); + comment.setText("TestText"); + return comment; + } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java index 1065900..62f8d72 100644 --- a/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java +++ b/src/test/java/ru/otus/mkulikov/app/model/DateUtilTest.java @@ -22,6 +22,7 @@ class DateUtilTest { private final String DATE_PATTERN = "yyyy-MM-dd"; private final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; + private final String DATE_TIME = "2019-01-01 10:01:01"; @Test @DisplayName("Перевод даты в строку, формат даты '" + DATE_PATTERN + "'") @@ -44,11 +45,9 @@ void dateTimeToString() { @Test @DisplayName("Перевод строки в дату, формат даты '" + DATETIME_PATTERN + "'") void stringToDateTime() { - String datetime = "2019-01-01 10:01:01"; - - Date date = DateUtil.stringToDateTime(datetime); + Date date = DateUtil.stringToDateTime(DATE_TIME); DateFormat dateFormat = new SimpleDateFormat(DATETIME_PATTERN); - assertEquals(datetime, dateFormat.format(date)); + assertEquals(DATE_TIME, dateFormat.format(date)); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 6101800..1558036 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -34,6 +34,16 @@ @ExtendWith(MockitoExtension.class) class AuthorManageSeviceImplTest { + private final long ID_1 = 1L; + private final long ID_2 = 2L; + private final long ID_3 = 3L; + + private final int OBJECT_COUNT_3 = 3; + + private final String SURNAME = "Surname"; + private final String FIRST_NAME = "FirstName"; + private final String SECOND_NAME = "SecondName"; + @Mock private AuthorDao authorDao; @@ -43,11 +53,11 @@ class AuthorManageSeviceImplTest { @Test @DisplayName("Получение автора по id") void getAuthorById() { - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); - Author author = authorManageService.getAuthorById(1L); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_1)) ); + Author author = authorManageService.getAuthorById(ID_1); assertThat(author).isNotNull(); - assertThat(author).isEqualTo(getAuthor(1L)); + assertThat(author).isEqualTo(getAuthor(ID_1)); } @Test @@ -57,7 +67,7 @@ void getAuthors() { List authors = authorManageService.getAuthors(); assertThat(authors).isNotNull(); - assertThat(authors).hasSize(3); + assertThat(authors).hasSize(OBJECT_COUNT_3); assertThat(authors).containsAll(getAuthorList()); } @@ -74,14 +84,14 @@ public Author answer(InvocationOnMock invocationOnMock) throws Throwable { return author; } }); - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(2L)) ); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_2)) ); long id = authorManageService.addAuthor("Surname1", "FirstName1", "SecondName1"); Author author = authorManageService.getAuthorById(id); - assertThat(id).isEqualTo(2L); + assertThat(id).isEqualTo(ID_2); assertThat(author).isNotNull(); - assertThat(author).isEqualTo(getAuthor(2L)); + assertThat(author).isEqualTo(getAuthor(ID_2)); } @Test @@ -92,36 +102,36 @@ void updateAuthor() { @Override public Author answer(InvocationOnMock invocationOnMock) throws Throwable { Author author = (Author) invocationOnMock.getArgument(0); - author.setId(1L); + author.setId(ID_1); return author; } }); - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_1)) ); - int count = authorManageService.updateAuthor(1L, "Surname1", "FirstName1", "SecondName1"); - Author author = authorManageService.getAuthorById(1L); + int count = authorManageService.updateAuthor(ID_1, "Surname1", "FirstName1", "SecondName1"); + Author author = authorManageService.getAuthorById(ID_1); assertThat(count).isEqualTo(1); assertThat(author).isNotNull(); - assertThat(author).isEqualTo(getAuthor(1L)); + assertThat(author).isEqualTo(getAuthor(ID_1)); } @Test @DisplayName("Удаление автора, который используется в таблице книг") void deleteAuthor() { - doThrow(DataIntegrityViolationException.class).when(authorDao).deleteById(1L); - assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(1L); }); + doThrow(DataIntegrityViolationException.class).when(authorDao).deleteById(ID_1); + assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(ID_1); }); } private List getAuthorList() { List authors = new ArrayList(); - authors.add(getAuthor(1L)); - authors.add(getAuthor(2L)); - authors.add(getAuthor(3L)); + authors.add(getAuthor(ID_1)); + authors.add(getAuthor(ID_2)); + authors.add(getAuthor(ID_3)); return authors; } private Author getAuthor(long id) { - return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); } } diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index c0eb1a7..686dd13 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -100,7 +100,11 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { @DisplayName("Получение комментариев по Id книги") void getCommentsByBookId() { List commentList = getCommentList(); - when(commentDao.findByBook(getBook(1L))).thenReturn( commentList ); + Optional book = Optional.of(getBook(1L)); + + when(bookDao.findById( anyLong() )).thenReturn( book ); + when(commentDao.findByBook( book.orElse(null) )).thenReturn( commentList ); + List comments = commentManageService.getCommentsByBookId(1L); assertThat(comments).isNotNull(); From 7d3e9d6373cee4e1206fdf5a86a1af75b4530453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Tue, 13 Aug 2019 11:23:47 +0300 Subject: [PATCH 47/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=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 --- .../otus/mkulikov/app/dao/CommentDaoTest.java | 27 +++++--- .../app/service/BookManageSeviceImplTest.java | 55 ++++++++++------ .../service/CommentManageSeviceImplTest.java | 66 ++++++++++++------- .../service/GenreManageSeviceImplTest.java | 39 ++++++----- 4 files changed, 122 insertions(+), 65 deletions(-) diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java index 3325136..ed567af 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java @@ -36,12 +36,23 @@ class CommentDaoTest { private final long ID_5 = 5L; private final int OBJECT_COUNT_4 = 4; - private final int OBJECT_COUNT_3 = 3; private final int OBJECT_COUNT_2 = 2; private final String DATE_TIME = "2019-01-01 10:01:01"; private final String GENRE_NAME = "GenreName"; + private final String COMMENT_USER_NAME = "user"; + private final String COMMENT_UPDATED_USER_NAME = "TestUser"; + private final String COMMENT_TEXT = "text"; + private final String COMMENT_UPDATED_TEXT = "TestText"; + + private final String AUTHOR_SURNAME = "Surname"; + private final String AUTHOR_FIRST_NAME = "FirstName"; + private final String AUTHOR_SECOND_NAME = "SecondName"; + + private final String BOOK_NAME = "BookName"; + private final String BOOK_DESCRIPTION = "Description"; + @Autowired private AuthorDao authorDao; @@ -108,10 +119,10 @@ void getObjectsByBook() { void addObject() { Date date = DateUtil.stringToDateTime(DATE_TIME); Book book = bookDao.findById(ID_1).orElse(null); - Comment comment = new Comment(ID_5, book, date, "user5", "text5"); + Comment comment = new Comment(ID_5, book, date, COMMENT_USER_NAME + ID_5, COMMENT_TEXT + ID_5); commentDao.save(comment); - Optional comment_selected = commentDao.findById(5L); + Optional comment_selected = commentDao.findById(ID_5); assertThat(comment_selected).isNotEmpty(); assertThat(comment_selected).contains(comment); @@ -139,18 +150,18 @@ void updateObject() { private Comment getComment(long id, long bookId) { Date date = DateUtil.stringToDateTime(DATE_TIME); Book book = getBook(bookId); - return new Comment(id, book, date, "user" + id, "text" + id); + return new Comment(id, book, date, COMMENT_USER_NAME + id, COMMENT_TEXT + id); } private Book getBook(long id) { Author author = getAuthor(id); Genre genre = getGenre(id); Date date = DateUtil.stringToDateTime(DATE_TIME); - return new Book(id, date, "Test_Book", author, genre, "Test_Description"); + return new Book(id, date, BOOK_NAME, author, genre, BOOK_DESCRIPTION); } private Author getAuthor(long id) { - return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + return new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); } private Genre getGenre(long id) { @@ -169,8 +180,8 @@ private List getComments() { private Comment getUpdatedComment() { Comment comment = commentDao.findById(ID_1).orElse(null); comment.setAddRecordDate(new Date()); - comment.setUserName("TestUser"); - comment.setText("TestText"); + comment.setUserName(COMMENT_UPDATED_USER_NAME); + comment.setText(COMMENT_UPDATED_TEXT); return comment; } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index a2d5c2b..04aff1e 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -38,6 +38,21 @@ @ExtendWith(MockitoExtension.class) class BookManageSeviceImplTest { + private final long ID_1 = 1L; + private final long ID_2 = 2L; + private final long ID_3 = 3L; + + private final int OBJECT_COUNT_3 = 3; + + private final String GENRE_NAME = "Genre"; + + private final String AUTHOR_SURNAME = "Surname"; + private final String AUTHOR_FIRST_NAME = "FirstName"; + private final String AUTHOR_SECOND_NAME = "SecondName"; + + private final String BOOK_NAME = "BookName"; + private final String BOOK_DESCRIPTION = "Description"; + @Mock private BookDao bookDao; @@ -53,9 +68,9 @@ class BookManageSeviceImplTest { @Test @DisplayName("Получение книги по id") void getBookById() { - Book book = getBook(1L); + Book book = getBook(ID_1); when(bookDao.findById(anyLong())).thenReturn( Optional.of(book) ); - Book bookById = booksManageSevice.getBookById(1L); + Book bookById = booksManageSevice.getBookById(ID_1); assertThat(bookById).isNotNull(); assertThat(bookById).isEqualTo(book); @@ -69,7 +84,7 @@ void getBooks() { List comments = booksManageSevice.getBooks(); assertThat(comments).isNotNull(); - assertThat(comments).hasSize(3); + assertThat(comments).hasSize(OBJECT_COUNT_3); assertThat(comments).containsAll(list); } @@ -86,12 +101,12 @@ public Book answer(InvocationOnMock invocationOnMock) throws Throwable { return book; } }); - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); - when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_1)) ); + when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(ID_1)) ); - long id = booksManageSevice.addBook("Caption", 1L, 1L, "description"); + long id = booksManageSevice.addBook(BOOK_NAME, ID_1, ID_1, BOOK_DESCRIPTION); - assertThat(id).isEqualTo(2L); + assertThat(id).isEqualTo(ID_2); } @Test @@ -102,15 +117,15 @@ void updateBook() { @Override public Book answer(InvocationOnMock invocationOnMock) throws Throwable { Book book = (Book) invocationOnMock.getArgument(0); - book.setId(1L); + book.setId(ID_1); return book; } }); - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(1L)) ); - when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); - when(bookDao.findById(anyLong())).thenReturn( Optional.of(getBook(1L)) ); + when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_1)) ); + when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(ID_1)) ); + when(bookDao.findById(anyLong())).thenReturn( Optional.of(getBook(ID_1)) ); - int count = booksManageSevice.updateBook(1L, "Caption", 1L, 1L, "description"); + int count = booksManageSevice.updateBook(ID_1, BOOK_NAME, ID_1, ID_1, BOOK_DESCRIPTION); assertThat(count).isEqualTo(1); } @@ -118,29 +133,29 @@ public Book answer(InvocationOnMock invocationOnMock) throws Throwable { @Test @DisplayName("Удаление книги по id") void deleteBook() { - doThrow(DataIntegrityViolationException.class).when(bookDao).deleteById(1L); - assertThrows(DataIntegrityViolationException.class, () -> { booksManageSevice.deleteBook(1L); }); + doThrow(DataIntegrityViolationException.class).when(bookDao).deleteById(ID_1); + assertThrows(DataIntegrityViolationException.class, () -> { booksManageSevice.deleteBook(ID_1); }); } private Author getAuthor(long id) { - return new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); + return new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); } private Genre getGenre(long id) { - return new Genre(id, "Genre" + id); + return new Genre(id, GENRE_NAME + id); } private Book getBook(long id) { Author author = getAuthor(id); Genre genre = getGenre(id); - return new Book(id, "Test_Book", author, genre, "Test_Description"); + return new Book(id, BOOK_NAME, author, genre, BOOK_DESCRIPTION); } private List getBooksList() { List list = new ArrayList<>(); - list.add(getBook(1L)); - list.add(getBook(2L)); - list.add(getBook(3L)); + list.add(getBook(ID_1)); + list.add(getBook(ID_2)); + list.add(getBook(ID_3)); return list; } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index 686dd13..d2998d6 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -42,6 +42,28 @@ @Ignore class CommentManageSeviceImplTest { + private final long ID_1 = 1L; + private final long ID_2 = 2L; + private final long ID_3 = 3L; + private final long ID_4 = 4L; + + private final int OBJECT_COUNT_4 = 4; + + private final String DATE_TIME = "2019-01-01 10:01:01"; + private final String GENRE_NAME = "GenreName"; + + private final String COMMENT_USER_NAME = "user"; + private final String COMMENT_UPDATED_USER_NAME = "TestUser"; + private final String COMMENT_TEXT = "text"; + private final String COMMENT_UPDATED_TEXT = "TestText"; + + private final String AUTHOR_SURNAME = "Surname"; + private final String AUTHOR_FIRST_NAME = "FirstName"; + private final String AUTHOR_SECOND_NAME = "SecondName"; + + private final String BOOK_NAME = "BookName"; + private final String BOOK_DESCRIPTION = "Description"; + @Mock private CommentDao commentDao; @@ -54,9 +76,9 @@ class CommentManageSeviceImplTest { @Test @DisplayName("Получение комментария по id") void getCommentById() { - Comment comment = getComment(1L); + Comment comment = getComment(ID_1); when(commentDao.findById(anyLong())).thenReturn( Optional.of(comment) ); - Comment commentById = commentManageService.getCommentById(1L); + Comment commentById = commentManageService.getCommentById(ID_1); assertThat(commentById).isNotNull(); assertThat(commentById).isEqualTo(comment); @@ -70,14 +92,14 @@ void getComments() { List comments = commentManageService.getComments(); assertThat(comments).isNotNull(); - assertThat(comments).hasSize(4); + assertThat(comments).hasSize(OBJECT_COUNT_4); assertThat(comments).containsAll(commentsList); } @Test @DisplayName("Добавление комментария") void addComment() { - Book book = getBook(1L); + Book book = getBook(ID_1); when(commentDao.save(any(Comment.class))).then(new Answer() { int sequence = 1; @@ -91,21 +113,21 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { }); when(bookDao.findById(anyLong())).thenReturn( Optional.of(book) ); - long id = commentManageService.addComment(1L, "user5", "text5"); + long id = commentManageService.addComment(ID_1, COMMENT_USER_NAME, COMMENT_TEXT); - assertThat(id).isEqualTo(2L); + assertThat(id).isEqualTo(ID_2); } @Test @DisplayName("Получение комментариев по Id книги") void getCommentsByBookId() { List commentList = getCommentList(); - Optional book = Optional.of(getBook(1L)); + Optional book = Optional.of(getBook(ID_1)); when(bookDao.findById( anyLong() )).thenReturn( book ); when(commentDao.findByBook( book.orElse(null) )).thenReturn( commentList ); - List comments = commentManageService.getCommentsByBookId(1L); + List comments = commentManageService.getCommentsByBookId(ID_1); assertThat(comments).isNotNull(); assertThat(comments).isEqualTo(commentList); @@ -119,13 +141,13 @@ void updateComment() { @Override public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { Comment comment = (Comment) invocationOnMock.getArgument(0); - comment.setId(1L); + comment.setId(ID_1); return comment; } }); - when(commentDao.findById(anyLong())).thenReturn( Optional.of(getComment(1L)) ); + when(commentDao.findById(anyLong())).thenReturn( Optional.of(getComment(ID_1)) ); - int count = commentManageService.updateComment(1L, "TestUser", "TestText"); + int count = commentManageService.updateComment(ID_1, COMMENT_UPDATED_USER_NAME, COMMENT_UPDATED_TEXT); assertThat(count).isEqualTo(1); } @@ -133,28 +155,28 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { @Test @DisplayName("Удаление комментария") void deleteComment() { - doThrow(DataIntegrityViolationException.class).when(commentDao).deleteById(1L); - assertThrows(DataIntegrityViolationException.class, () -> { commentManageService.deleteComment(1L); }); + doThrow(DataIntegrityViolationException.class).when(commentDao).deleteById(ID_1); + assertThrows(DataIntegrityViolationException.class, () -> { commentManageService.deleteComment(ID_1); }); } private Comment getComment(long id) { - Date date = DateUtil.stringToDateTime("2019-01-01 10:01:01"); + Date date = DateUtil.stringToDateTime(DATE_TIME); Book book = getBook(id); - return new Comment(id, book, date, "user" + id, "text" + id); + return new Comment(id, book, date, COMMENT_USER_NAME + id, COMMENT_TEXT + id); } private Book getBook(long id) { - Author author = new Author(id, "Surname" + id, "FirstName" + id, "SecondName" + id); - Genre genre = new Genre(id, "Genre" + id); - return new Book(id, "Test_Book", author, genre, "Test_Description"); + Author author = new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); + Genre genre = new Genre(id, GENRE_NAME + id); + return new Book(id, BOOK_NAME, author, genre, BOOK_DESCRIPTION); } private List getCommentList() { List comments = new ArrayList(); - comments.add(getComment(1L)); - comments.add(getComment(2L)); - comments.add(getComment(3L)); - comments.add(getComment(4L)); + comments.add(getComment(ID_1)); + comments.add(getComment(ID_2)); + comments.add(getComment(ID_3)); + comments.add(getComment(ID_4)); return comments; } } diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 6958c1b..ed977ed 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -34,6 +34,15 @@ @ExtendWith(MockitoExtension.class) class GenreManageSeviceImplTest { + private final long ID_1 = 1L; + private final long ID_2 = 2L; + private final long ID_3 = 3L; + + private final int OBJECT_COUNT_3 = 3; + + private final String GENRE_UPDATED_NAME = "UpdatedName"; + private final String GENRE_NAME = "GenreName"; + @Mock private GenreDao genreDao; @@ -43,11 +52,11 @@ class GenreManageSeviceImplTest { @Test @DisplayName("Получение жанра по id") void getGenreById() { - when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); - Genre genre = genreManageService.getGenreById(1L); + when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(ID_1)) ); + Genre genre = genreManageService.getGenreById(ID_1); assertThat(genre).isNotNull(); - assertThat(genre).isEqualTo(getGenre(1L)); + assertThat(genre).isEqualTo(getGenre(ID_1)); } @Test @@ -57,7 +66,7 @@ void getGenres() { List authors = genreManageService.getGenres(); assertThat(authors).isNotNull(); - assertThat(authors).hasSize(3); + assertThat(authors).hasSize(OBJECT_COUNT_3); assertThat(authors).containsAll(getGenreList()); } @@ -75,9 +84,9 @@ public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { } }); - long id = genreManageService.addGenre("Test4"); + long id = genreManageService.addGenre(GENRE_NAME); - assertThat(id).isEqualTo(2L); + assertThat(id).isEqualTo(ID_2); } @Test @@ -88,13 +97,13 @@ void updateGenre() { @Override public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { Genre genre = (Genre) invocationOnMock.getArgument(0); - genre.setId(1L); + genre.setId(ID_1); return genre; } }); - when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(1L)) ); + when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(ID_1)) ); - int count = genreManageService.updateGenre(1L, "UpdatedName"); + int count = genreManageService.updateGenre(ID_1, GENRE_UPDATED_NAME); assertThat(count).isEqualTo(1); } @@ -102,19 +111,19 @@ public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { @Test @DisplayName("Удаление жанра, который используется в таблице книг") void deleteGenre() { - doThrow(DataIntegrityViolationException.class).when(genreDao).deleteById(1L); - assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(1L); }); + doThrow(DataIntegrityViolationException.class).when(genreDao).deleteById(ID_1); + assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(ID_1); }); } private List getGenreList() { List genres = new ArrayList(); - genres.add(getGenre(1L)); - genres.add(getGenre(2L)); - genres.add(getGenre(3L)); + genres.add(getGenre(ID_1)); + genres.add(getGenre(ID_2)); + genres.add(getGenre(ID_3)); return genres; } private Genre getGenre(long id) { - return new Genre(id, "Genre" + id); + return new Genre(id, GENRE_NAME + id); } } From 6efbc36587a43a95274b4fd6bc74baa7416e2b83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Mon, 19 Aug 2019 11:02:49 +0300 Subject: [PATCH 48/70] =?UTF-8?q?=D0=A2=D0=B8=D0=BF=20id=20=D1=83=20=D1=81?= =?UTF-8?q?=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B8=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20=D0=BD=D0=B0=20String.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++ .../ru/otus/mkulikov/app/dao/AuthorDao.java | 2 +- .../ru/otus/mkulikov/app/dao/BookDao.java | 2 +- .../ru/otus/mkulikov/app/dao/CommentDao.java | 2 +- .../ru/otus/mkulikov/app/dao/GenreDao.java | 2 +- .../ru/otus/mkulikov/app/model/Author.java | 5 +- .../java/ru/otus/mkulikov/app/model/Book.java | 18 ++----- .../ru/otus/mkulikov/app/model/Comment.java | 5 +- .../ru/otus/mkulikov/app/model/Genre.java | 5 +- .../app/service/AuthorManageService.java | 8 +-- .../app/service/AuthorManageServiceImpl.java | 14 +++--- .../app/service/BookManageSevice.java | 8 +-- .../app/service/BookManageSeviceImpl.java | 15 +++--- .../app/service/CommentManageService.java | 10 ++-- .../app/service/CommentManageServiceImpl.java | 16 +++--- .../app/service/GenreManageService.java | 8 +-- .../app/service/GenreManageServiceImpl.java | 14 +++--- .../ru/otus/mkulikov/app/utils/DateUtil.java | 2 +- .../otus/mkulikov/shell/AuthorCommands.java | 14 +++--- .../ru/otus/mkulikov/shell/BookCommands.java | 16 +++--- .../otus/mkulikov/shell/CommentCommands.java | 18 +++---- .../ru/otus/mkulikov/shell/GenreCommands.java | 14 +++--- .../otus/mkulikov/app/dao/AuthorDaoTest.java | 12 ++--- .../ru/otus/mkulikov/app/dao/BookDaoTest.java | 16 +++--- .../otus/mkulikov/app/dao/CommentDaoTest.java | 18 +++---- .../otus/mkulikov/app/dao/GenreDaoTest.java | 10 ++-- .../service/AuthorManageSeviceImplTest.java | 45 +++++++++-------- .../app/service/BookManageSeviceImplTest.java | 49 ++++++++++--------- .../service/CommentManageSeviceImplTest.java | 46 ++++++++--------- .../service/GenreManageSeviceImplTest.java | 34 +++++++------ 30 files changed, 210 insertions(+), 221 deletions(-) diff --git a/README.md b/README.md index 1078344..ff80907 100644 --- a/README.md +++ b/README.md @@ -3,3 +3,6 @@ Домашнее задание #8: - Использовать MongoDB и spring-data для хранения информации о книгах. - Тесты реализовать с помощью spring-boot-strter-embedded-mongodb. + +### 19-08-19 Доработки: +- Тип id у сущностей изменен на String. \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java index cdca8e5..ee744cc 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java @@ -10,6 +10,6 @@ * Time: 17:06 */ -public interface AuthorDao extends MongoRepository { +public interface AuthorDao extends MongoRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index 2ed7dd6..e1c0754 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -10,6 +10,6 @@ * Time: 13:28 */ -public interface BookDao extends MongoRepository { +public interface BookDao extends MongoRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index 4eb7725..27ef753 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -13,7 +13,7 @@ * Time: 23:48 */ -public interface CommentDao extends MongoRepository { +public interface CommentDao extends MongoRepository { // @Query(value = "{ 'book.id' : ?0 }") // List findByBook(long id); diff --git a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java index 0c39b93..5c40169 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java @@ -10,6 +10,6 @@ * Time: 17:07 */ -public interface GenreDao extends MongoRepository { +public interface GenreDao extends MongoRepository { } diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index 3e1b0a1..07ace47 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -16,7 +16,7 @@ public class Author { @Id - private long id; + private String id; private String surname; private String firstName; private String secondName; @@ -24,7 +24,7 @@ public class Author { public Author() { } - public Author(long id, String surname, String firstName, String secondName) { + public Author(String id, String surname, String firstName, String secondName) { this.id = id; this.surname = surname; this.firstName = firstName; @@ -32,7 +32,6 @@ public Author(long id, String surname, String firstName, String secondName) { } public Author(String surname, String firstName, String secondName) { - this.id = 0L; this.surname = surname; this.firstName = firstName; this.secondName = secondName; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index d648a67..5aec76f 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -19,7 +19,7 @@ public class Book { @Id - private long id; + private String id; private Date addRecordDate; private String caption; private String description; @@ -32,7 +32,7 @@ public class Book { public Book() { } - public Book(long id, Date addRecordDate, String caption, Author author, Genre genre, String description) { + public Book(String id, Date addRecordDate, String caption, Author author, Genre genre, String description) { this.id = id; this.addRecordDate = addRecordDate; this.author = author; @@ -41,18 +41,8 @@ public Book(long id, Date addRecordDate, String caption, Author author, Genre ge this.description = description; } - public Book(long id, String caption, Author author, Genre genre, String description) { - this.id = id; - this.addRecordDate = new Date(); - this.caption = caption; - this.author = author; - this.genre = genre; - this.description = description; - } - - public Book(String caption, Author author, Genre genre, String description) { - this.id = 0L; - this.addRecordDate = new Date(); + public Book(Date addRecordDate, String caption, Author author, Genre genre, String description) { + this.addRecordDate = addRecordDate; this.caption = caption; this.author = author; this.genre = genre; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java index d61bcca..97e30d2 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Comment.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -19,7 +19,7 @@ public class Comment { @Id - private long id; + private String id; private Date addRecordDate; private String userName; private String text; @@ -30,7 +30,7 @@ public class Comment { public Comment() { } - public Comment(long id, Book book, Date addRecordDate, String userName, String text) { + public Comment(String id, Book book, Date addRecordDate, String userName, String text) { this.id = id; this.book = book; this.addRecordDate = addRecordDate; @@ -39,7 +39,6 @@ public Comment(long id, Book book, Date addRecordDate, String userName, String t } public Comment(Book book, Date addRecordDate, String userName, String text) { - this.id = 0L; this.book = book; this.addRecordDate = addRecordDate; this.userName = userName; diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index e4210e2..5250f9d 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -16,19 +16,18 @@ public class Genre { @Id - private long id; + private String id; private String name; public Genre() { } - public Genre(long id, String name) { + public Genre(String id, String name) { this.id = id; this.name = name; } public Genre(String name) { - this.id = 0L; this.name = name; } diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java index de2eaaf..77ed829 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java @@ -13,13 +13,13 @@ public interface AuthorManageService { - T getAuthorById(long id); + T getAuthorById(String id); List getAuthors(); - long addAuthor(String surname, String firstName, String secondName); + T addAuthor(String surname, String firstName, String secondName); - int updateAuthor(long id, String surname, String firstName, String secondName); + T updateAuthor(String id, String surname, String firstName, String secondName); - int deleteAuthor(long id); + int deleteAuthor(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index 2cb2494..c147782 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -24,7 +24,7 @@ public class AuthorManageServiceImpl implements AuthorManageService { private final AuthorDao authorDao; @Override - public Author getAuthorById(long id) { + public Author getAuthorById(String id) { Optional author = authorDao.findById(id); return author.orElse(null); } @@ -40,24 +40,22 @@ public List getAuthors() { } @Override - public long addAuthor(String surname, String firstName, String secondName) { - Author author = authorDao.save(new Author(surname, firstName, secondName)); - return author.getId(); + public Author addAuthor(String surname, String firstName, String secondName) { + return authorDao.save(new Author(surname, firstName, secondName)); } @Override - public int updateAuthor(long id, String surname, String firstName, String secondName) { + public Author updateAuthor(String id, String surname, String firstName, String secondName) { Author author = authorDao.findById(id).orElse(null); author.setSurname(surname); author.setFirstName(firstName); author.setSecondName(secondName); - authorDao.save(author); - return 1; + return authorDao.save(author); } @Override - public int deleteAuthor(long id) { + public int deleteAuthor(String id) { authorDao.deleteById(id); // при удалении записи, которая используется в другой таблице не выдает никакой ошибки, // ошибка выдается только при вызове следующей команды diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java index 4dab801..c245547 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -13,13 +13,13 @@ public interface BookManageSevice { - T getBookById(long id); + T getBookById(String id); List getBooks(); - long addBook(String caption, long authorId, long genreId, String description); + T addBook(String caption, String authorId, String genreId, String description); - int updateBook(long id, String caption, long authorId, long genreId, String description); + T updateBook(String id, String caption, String authorId, String genreId, String description); - int deleteBook(long id); + int deleteBook(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 061a0f1..a938366 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -9,6 +9,7 @@ import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; +import java.util.Date; import java.util.List; /** @@ -27,7 +28,7 @@ public class BookManageSeviceImpl implements BookManageSevice { private final GenreDao genreDao; @Override - public Book getBookById(long id) { + public Book getBookById(String id) { return bookDao.findById(id).orElse(null); } @@ -37,16 +38,15 @@ public List getBooks() { } @Override - public long addBook(String caption, long authorId, long genreId, String description) { + public Book addBook(String caption, String authorId, String genreId, String description) { Author author = authorDao.findById(authorId).orElse(null); Genre genre = genreDao.findById(genreId).orElse(null); - Book book = bookDao.save(new Book(caption, author, genre, description)); - return book.getId(); + return bookDao.save(new Book(new Date(), caption, author, genre, description)); } @Override - public int updateBook(long id, String caption, long authorId, long genreId, String description) { + public Book updateBook(String id, String caption, String authorId, String genreId, String description) { Author author = authorDao.findById(authorId).orElse(null); Genre genre = genreDao.findById(genreId).orElse(null); @@ -57,12 +57,11 @@ public int updateBook(long id, String caption, long authorId, long genreId, Stri book.setGenre(genre); book.setDescription(description); - bookDao.save(book); - return 1; + return bookDao.save(book); } @Override - public int deleteBook(long id) { + public int deleteBook(String id) { bookDao.deleteById(id); bookDao.count(); return 1; diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java index ebdf3e1..7dd63d4 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java @@ -12,15 +12,15 @@ */ public interface CommentManageService { - T getCommentById(long id); + T getCommentById(String id); List getComments(); - List getCommentsByBookId(long bookId); + List getCommentsByBookId(String bookId); - long addComment(long bookId, String userName, String text); + T addComment(String bookId, String userName, String text); - int updateComment(long id, String userName, String text); + T updateComment(String id, String userName, String text); - int deleteComment(long id); + int deleteComment(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index 4fb584e..de61a32 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -26,7 +26,7 @@ public class CommentManageServiceImpl implements CommentManageService { private final BookDao bookDao; @Override - public Comment getCommentById(long id) { + public Comment getCommentById(String id) { Optional comment = commentDao.findById(id); return comment.orElse(null); } @@ -37,33 +37,31 @@ public List getComments() { } @Override - public List getCommentsByBookId(long bookId) { + public List getCommentsByBookId(String bookId) { Optional book = bookDao.findById(bookId); return commentDao.findByBook(book.orElse(null)); } @Override - public long addComment(long bookId, String userName, String text) { + public Comment addComment(String bookId, String userName, String text) { Book book = bookDao.findById(bookId).orElse(null); - Comment comment = commentDao.save(new Comment(book, new Date(), userName, text)); - return comment.getId(); + return commentDao.save(new Comment(book, new Date(), userName, text)); } @Override - public int updateComment(long id, String userName, String text) { + public Comment updateComment(String id, String userName, String text) { Comment comment = commentDao.findById(id).orElse(null); comment.setAddRecordDate(new Date()); comment.setUserName(userName); comment.setText(text); - commentDao.save(comment); - return 1; + return commentDao.save(comment); } @Override - public int deleteComment(long id) { + public int deleteComment(String id) { commentDao.deleteById(id); commentDao.count(); return 1; diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java index f6b83ee..6b5f162 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java @@ -12,13 +12,13 @@ */ public interface GenreManageService { - T getGenreById(long id); + T getGenreById(String id); List getGenres(); - long addGenre(String name); + T addGenre(String name); - int updateGenre(long id, String name); + T updateGenre(String id, String name); - int deleteGenre(long id); + int deleteGenre(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index e5c71d8..00fb3f8 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -24,7 +24,7 @@ public class GenreManageServiceImpl implements GenreManageService { private final GenreDao genreDao; @Override - public Genre getGenreById(long id) { + public Genre getGenreById(String id) { Optional genre = genreDao.findById(id); return genre.orElse(null); } @@ -40,22 +40,20 @@ public List getGenres() { } @Override - public long addGenre(String name) { - Genre genre = genreDao.save(new Genre(name)); - return genre.getId(); + public Genre addGenre(String name) { + return genreDao.save(new Genre(name)); } @Override - public int updateGenre(long id, String name) { + public Genre updateGenre(String id, String name) { Genre genre = genreDao.findById(id).orElse(null); genre.setName(name); - genreDao.save(genre); - return 1; + return genreDao.save(genre); } @Override - public int deleteGenre(long id) { + public int deleteGenre(String id) { genreDao.deleteById(id); genreDao.count(); return 1; diff --git a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java index 68c0a16..2401e4f 100644 --- a/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java +++ b/src/main/java/ru/otus/mkulikov/app/utils/DateUtil.java @@ -39,6 +39,6 @@ public static java.util.Date stringToDateTime(String stringDate) { public static Date convertToDateViaInstant(LocalDateTime dateToConvert) { return java.util.Date .from(dateToConvert.atZone(ZoneId.systemDefault()) - .toInstant()); + .toInstant()); } } diff --git a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java index c239e0d..241ce94 100644 --- a/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/AuthorCommands.java @@ -23,7 +23,7 @@ public class AuthorCommands { private final AuthorManageService authorManageService; @ShellMethod(key = {"getAuthorById"}, value = "Select author by id.") - public String getAuthorById(@ShellOption long id) { + public String getAuthorById(@ShellOption String id) { Author author = authorManageService.getAuthorById(id); return author.toString(); } @@ -36,18 +36,18 @@ public String getAuthors() { @ShellMethod(key = {"addAuthor"}, value = "Add new author.") public String addAuthor(@ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { - long id = authorManageService.addAuthor(surname, firstName, secondName); - return "Add " + (id != 0 ? 1 : 0) + " row(s)"; + Author author = authorManageService.addAuthor(surname, firstName, secondName); + return "Add " + (author != null ? 1 : 0) + " row(s)\nID: " + author.getId(); } @ShellMethod(key = {"updateAuthor"}, value = "Update author by id.") - public String updateAuthor(@ShellOption long id, @ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { - int count = authorManageService.updateAuthor(id, surname, firstName, secondName); - return "Updated " + count + " row(s)"; + public String updateAuthor(@ShellOption String id, @ShellOption String surname, @ShellOption String firstName, @ShellOption String secondName) { + Author author = authorManageService.updateAuthor(id, surname, firstName, secondName); + return "Updated " + (author != null ? 1 : 0) + " row(s)\nID: " + author.getId(); } @ShellMethod(key = {"deleteAuthor"}, value = "Delete author by id.") - public String deleteAuthor(@ShellOption long id) { + public String deleteAuthor(@ShellOption String id) { int count = authorManageService.deleteAuthor(id); return "Deleted " + count + " row(s)"; } diff --git a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java index d33aed8..d5df2e2 100644 --- a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java @@ -23,7 +23,7 @@ public class BookCommands { private final BookManageSevice bookManageSevice; @ShellMethod(key = {"getBookById"}, value = "Select book by id.") - public String getBookById(@ShellOption long id) { + public String getBookById(@ShellOption String id) { Book book = bookManageSevice.getBookById(id); return book.toString(); } @@ -35,19 +35,19 @@ public String getBooks() { } @ShellMethod(key = {"addBook"}, value = "Add new book.") - public String addBook(@ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String description) { - long id = bookManageSevice.addBook(caption, authorId, genreId, description); - return "Add " + (id != 0 ? 1 : 0) + " row(s)"; + public String addBook(@ShellOption String caption, @ShellOption String authorId, @ShellOption String genreId, @ShellOption String description) { + Book book = bookManageSevice.addBook(caption, authorId, genreId, description); + return "Add " + (book != null ? 1 : 0) + " row(s)\nID: " + book.getId(); } @ShellMethod(key = {"updateBook"}, value = "Update book by id.") - public String updateBook(@ShellOption long id, @ShellOption String caption, @ShellOption int authorId, @ShellOption int genreId, @ShellOption String description) { - int count = bookManageSevice.updateBook(id, caption, authorId, genreId, description); - return "Updated " + count + " row(s)"; + public String updateBook(@ShellOption String id, @ShellOption String caption, @ShellOption String authorId, @ShellOption String genreId, @ShellOption String description) { + Book book = bookManageSevice.updateBook(id, caption, authorId, genreId, description); + return "Updated " + (book != null ? 1 : 0) + " row(s)\nID: " + book.getId(); } @ShellMethod(key = {"deleteBook"}, value = "Delete book by id.") - public String deleteBook(@ShellOption long id) { + public String deleteBook(@ShellOption String id) { int count = bookManageSevice.deleteBook(id); return "Deleted " + count + " row(s)"; } diff --git a/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java b/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java index e1dde06..abd452d 100644 --- a/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/CommentCommands.java @@ -23,7 +23,7 @@ public class CommentCommands { private final CommentManageService commentManageService; @ShellMethod(key = {"getCommentById"}, value = "Select comment by id.") - public String getCommentById(@ShellOption long id) { + public String getCommentById(@ShellOption String id) { Comment comment = commentManageService.getCommentById(id); return comment.toString(); } @@ -35,25 +35,25 @@ public String getComments() { } @ShellMethod(key = {"getCommentsByBookId"}, value = "Select all comments.") - public String getCommentsByBookId(@ShellOption long bookId) { + public String getCommentsByBookId(@ShellOption String bookId) { List allObjects = commentManageService.getCommentsByBookId(bookId); return allObjects.toString(); } @ShellMethod(key = {"addComment"}, value = "Add new comment.") - public String addComment(@ShellOption long bookId, @ShellOption String userName, @ShellOption String text) { - long id = commentManageService.addComment(bookId, userName, text); - return "Add " + (id != 0 ? 1 : 0) + " row(s)"; + public String addComment(@ShellOption String bookId, @ShellOption String userName, @ShellOption String text) { + Comment comment = commentManageService.addComment(bookId, userName, text); + return "Add " + (comment != null ? 1 : 0) + " row(s)\nID: " + comment.getId(); } @ShellMethod(key = {"updateComment"}, value = "Update comment by id.") - public String updateComment(@ShellOption long id, @ShellOption String userName, @ShellOption String text) { - int count = commentManageService.updateComment(id, userName, text); - return "Updated " + count + " row(s)"; + public String updateComment(@ShellOption String id, @ShellOption String userName, @ShellOption String text) { + Comment comment = commentManageService.updateComment(id, userName, text); + return "Updated " + (comment != null ? 1 : 0) + " row(s)\nID: " + comment.getId(); } @ShellMethod(key = {"deleteComment"}, value = "Delete comment by id.") - public String deleteComment(@ShellOption long id) { + public String deleteComment(@ShellOption String id) { int count = commentManageService.deleteComment(id); return "Deleted " + count + " row(s)"; } diff --git a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java index 9d73476..aa4b95a 100644 --- a/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/GenreCommands.java @@ -23,7 +23,7 @@ public class GenreCommands { private final GenreManageService genreManageService; @ShellMethod(key = {"getGenreById"}, value = "Select genre by id.") - public String getGenreById(@ShellOption long id) { + public String getGenreById(@ShellOption String id) { Genre genre = genreManageService.getGenreById(id); return genre.toString(); } @@ -36,18 +36,18 @@ public String getGenres() { @ShellMethod(key = {"addGenre"}, value = "Add new genre.") public String addGenre(@ShellOption String name) { - long id = genreManageService.addGenre(name); - return "Add " + (id != 0 ? 1 : 0) + " row(s)"; + Genre genre = genreManageService.addGenre(name); + return "Add " + (genre != null ? 1 : 0) + " row(s)\nID: " + genre.getId(); } @ShellMethod(key = {"updateGenre"}, value = "Update genre by id.") - public String updateGenre(@ShellOption long id, @ShellOption String name) { - int count = genreManageService.updateGenre(id, name); - return "Updated " + count + " row(s)"; + public String updateGenre(@ShellOption String id, @ShellOption String name) { + Genre genre = genreManageService.updateGenre(id, name); + return "Updated " + (genre != null ? 1 : 0) + " row(s)\nID: " + genre.getId(); } @ShellMethod(key = {"deleteGenre"}, value = "Delete genre by id.") - public String deleteGenre(@ShellOption long id) { + public String deleteGenre(@ShellOption String id) { int count = genreManageService.deleteGenre(id); return "Deleted " + count + " row(s)"; } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java index 4962dcf..f5180f2 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java @@ -26,10 +26,10 @@ @DisplayName("Класс AuthorDao") class AuthorDaoTest { - private final long ID_1 = 1L; - private final long ID_2 = 2L; - private final long ID_3 = 3L; - private final long ID_4 = 4L; + private final String ID_1 = "1"; + private final String ID_2 = "2"; + private final String ID_3 = "3"; + private final String ID_4 = "4"; private final int OBJECT_COUNT_3 = 3; private final int OBJECT_COUNT_2 = 2; @@ -92,7 +92,7 @@ void deleteObject() { @Test @DisplayName("Обновление автора") void updateObject() { - Author author = new Author(ID_1, TEST_SURNAME, TEST_FIRST_NAME, TEST_SECOND_NAME); + Author author = new Author(ID_1, TEST_SURNAME, TEST_FIRST_NAME, TEST_SECOND_NAME); authorDao.save(author); Optional author_selected = authorDao.findById(ID_1); @@ -100,7 +100,7 @@ void updateObject() { assertThat(author_selected).contains(author); } - private Author getAuthor(long id) { + private Author getAuthor(String id) { return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java index 69776a8..aac51cf 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java @@ -28,10 +28,10 @@ @DisplayName("Класс BookDao") class BookDaoTest { - private final long ID_1 = 1L; - private final long ID_2 = 2L; - private final long ID_3 = 3L; - private final long ID_4 = 4L; + private final String ID_1 = "1"; + private final String ID_2 = "2"; + private final String ID_3 = "3"; + private final String ID_4 = "4"; private final int OBJECT_COUNT_2 = 2; @@ -121,18 +121,18 @@ void updateObject() { assertThat(book_selected).contains(book); } - private Book getBook(long id) { + private Book getBook(String id) { Author author = getAuthor(id); Genre genre = getGenre(id); Date date = DateUtil.stringToDateTime(DATE_TIME); return new Book(id, date, BOOK_NAME, author, genre, DESCRIPTION); } - private Author getAuthor(long id) { + private Author getAuthor(String id) { return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); } - private Genre getGenre(long id) { + private Genre getGenre(String id) { return new Genre(id, GENRE_NAME + id); } @@ -149,7 +149,7 @@ private Book getUpdatedBook() { return new Book(ID_1, new Date(), UPDATED_BOOK_NAME, author, genre, UPDATED_DESCRIPTION); } - private Book getNewBook(long id) { + private Book getNewBook(String id) { Author author = authorDao.findById(ID_1).orElse(null); Genre genre = genreDao.findById(ID_1).orElse(null); Date date = DateUtil.stringToDateTime(DATE_TIME); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java index ed567af..69ff5dd 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java @@ -29,11 +29,11 @@ @DisplayName("Класс CommentDao") class CommentDaoTest { - private final long ID_1 = 1L; - private final long ID_2 = 2L; - private final long ID_3 = 3L; - private final long ID_4 = 4L; - private final long ID_5 = 5L; + private final String ID_1 = "1"; + private final String ID_2 = "2"; + private final String ID_3 = "3"; + private final String ID_4 = "4"; + private final String ID_5 = "5"; private final int OBJECT_COUNT_4 = 4; private final int OBJECT_COUNT_2 = 2; @@ -147,24 +147,24 @@ void updateObject() { assertThat(comment_selected).contains(comment); } - private Comment getComment(long id, long bookId) { + private Comment getComment(String id, String bookId) { Date date = DateUtil.stringToDateTime(DATE_TIME); Book book = getBook(bookId); return new Comment(id, book, date, COMMENT_USER_NAME + id, COMMENT_TEXT + id); } - private Book getBook(long id) { + private Book getBook(String id) { Author author = getAuthor(id); Genre genre = getGenre(id); Date date = DateUtil.stringToDateTime(DATE_TIME); return new Book(id, date, BOOK_NAME, author, genre, BOOK_DESCRIPTION); } - private Author getAuthor(long id) { + private Author getAuthor(String id) { return new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); } - private Genre getGenre(long id) { + private Genre getGenre(String id) { return new Genre(id, GENRE_NAME + id); } diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java index 52b289b..3b93864 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java @@ -26,10 +26,10 @@ @DisplayName("Класс GenreDao") class GenreDaoTest { - private final long ID_1 = 1L; - private final long ID_2 = 2L; - private final long ID_3 = 3L; - private final long ID_4 = 4L; + private final String ID_1 = "1"; + private final String ID_2 = "2"; + private final String ID_3 = "3"; + private final String ID_4 = "4"; private final int OBJECT_COUNT_3 = 3; private final int OBJECT_COUNT_2 = 2; @@ -105,7 +105,7 @@ private List getGenres() { return genres; } - private Genre getGenre(long id) { + private Genre getGenre(String id) { return new Genre(id, GENRE_NAME + id); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 1558036..0e39526 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; @@ -34,9 +34,9 @@ @ExtendWith(MockitoExtension.class) class AuthorManageSeviceImplTest { - private final long ID_1 = 1L; - private final long ID_2 = 2L; - private final long ID_3 = 3L; + private final String ID_1 = "1"; + private final String ID_2 = "2"; + private final String ID_3 = "3"; private final int OBJECT_COUNT_3 = 3; @@ -53,7 +53,7 @@ class AuthorManageSeviceImplTest { @Test @DisplayName("Получение автора по id") void getAuthorById() { - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_1)) ); + when(authorDao.findById(anyString())).thenReturn(Optional.of(getAuthor(ID_1))); Author author = authorManageService.getAuthorById(ID_1); assertThat(author).isNotNull(); @@ -63,7 +63,7 @@ void getAuthorById() { @Test @DisplayName("Получение всех авторов") void getAuthors() { - when(authorDao.findAll()).thenReturn( getAuthorList() ); + when(authorDao.findAll()).thenReturn(getAuthorList()); List authors = authorManageService.getAuthors(); assertThat(authors).isNotNull(); @@ -75,23 +75,21 @@ void getAuthors() { @DisplayName("Добавление автора") void addAuthor() { when(authorDao.save(any(Author.class))).then(new Answer() { - int sequence = 1; - @Override public Author answer(InvocationOnMock invocationOnMock) throws Throwable { Author author = (Author) invocationOnMock.getArgument(0); - author.setId(++sequence); + author.setId("2"); return author; } }); - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_2)) ); + when(authorDao.findById(anyString())).thenReturn(Optional.of(getAuthor(ID_2))); - long id = authorManageService.addAuthor("Surname1", "FirstName1", "SecondName1"); - Author author = authorManageService.getAuthorById(id); + Author author1 = authorManageService.addAuthor("Surname1", "FirstName1", "SecondName1"); + Author author2 = authorManageService.getAuthorById(author1.getId()); - assertThat(id).isEqualTo(ID_2); - assertThat(author).isNotNull(); - assertThat(author).isEqualTo(getAuthor(ID_2)); + assertThat(author1.getId()).isEqualTo(ID_2); + assertThat(author2).isNotNull(); + assertThat(author2).isEqualTo(getAuthor(ID_2)); } @Test @@ -106,21 +104,22 @@ public Author answer(InvocationOnMock invocationOnMock) throws Throwable { return author; } }); - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_1)) ); + when(authorDao.findById(anyString())).thenReturn(Optional.of(getAuthor(ID_1))); - int count = authorManageService.updateAuthor(ID_1, "Surname1", "FirstName1", "SecondName1"); - Author author = authorManageService.getAuthorById(ID_1); + Author author1 = authorManageService.updateAuthor(ID_1, "Surname1", "FirstName1", "SecondName1"); + Author author2 = authorManageService.getAuthorById(ID_1); - assertThat(count).isEqualTo(1); - assertThat(author).isNotNull(); - assertThat(author).isEqualTo(getAuthor(ID_1)); + assertThat(author1).isNotNull(); + assertThat(author2).isEqualTo(getAuthor(ID_1)); } @Test @DisplayName("Удаление автора, который используется в таблице книг") void deleteAuthor() { doThrow(DataIntegrityViolationException.class).when(authorDao).deleteById(ID_1); - assertThrows(DataIntegrityViolationException.class, () -> { authorManageService.deleteAuthor(ID_1); }); + assertThrows(DataIntegrityViolationException.class, () -> { + authorManageService.deleteAuthor(ID_1); + }); } private List getAuthorList() { @@ -131,7 +130,7 @@ private List getAuthorList() { return authors; } - private Author getAuthor(long id) { + private Author getAuthor(String id) { return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); } } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 04aff1e..b685124 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -17,13 +17,14 @@ import ru.otus.mkulikov.app.model.Genre; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; @@ -38,9 +39,9 @@ @ExtendWith(MockitoExtension.class) class BookManageSeviceImplTest { - private final long ID_1 = 1L; - private final long ID_2 = 2L; - private final long ID_3 = 3L; + private final String ID_1 = "1"; + private final String ID_2 = "2"; + private final String ID_3 = "3"; private final int OBJECT_COUNT_3 = 3; @@ -69,7 +70,7 @@ class BookManageSeviceImplTest { @DisplayName("Получение книги по id") void getBookById() { Book book = getBook(ID_1); - when(bookDao.findById(anyLong())).thenReturn( Optional.of(book) ); + when(bookDao.findById(anyString())).thenReturn(Optional.of(book)); Book bookById = booksManageSevice.getBookById(ID_1); assertThat(bookById).isNotNull(); @@ -80,7 +81,7 @@ void getBookById() { @DisplayName("Получение всех книг") void getBooks() { List list = getBooksList(); - when(bookDao.findAll()).thenReturn( list ); + when(bookDao.findAll()).thenReturn(list); List comments = booksManageSevice.getBooks(); assertThat(comments).isNotNull(); @@ -92,21 +93,20 @@ void getBooks() { @DisplayName("Добавление книги") void addBook() { when(bookDao.save(any(Book.class))).then(new Answer() { - int sequence = 1; - @Override public Book answer(InvocationOnMock invocationOnMock) throws Throwable { Book book = (Book) invocationOnMock.getArgument(0); - book.setId(++sequence); + book.setId("2"); return book; } }); - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_1)) ); - when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(ID_1)) ); + when(authorDao.findById(anyString())).thenReturn(Optional.of(getAuthor(ID_1))); + when(genreDao.findById(anyString())).thenReturn(Optional.of(getGenre(ID_1))); - long id = booksManageSevice.addBook(BOOK_NAME, ID_1, ID_1, BOOK_DESCRIPTION); + Book book = booksManageSevice.addBook(BOOK_NAME, ID_1, ID_1, BOOK_DESCRIPTION); - assertThat(id).isEqualTo(ID_2); + assertThat(book).isNotNull(); + assertThat(book.getId()).isEqualTo(ID_2); } @Test @@ -121,34 +121,37 @@ public Book answer(InvocationOnMock invocationOnMock) throws Throwable { return book; } }); - when(authorDao.findById(anyLong())).thenReturn( Optional.of(getAuthor(ID_1)) ); - when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(ID_1)) ); - when(bookDao.findById(anyLong())).thenReturn( Optional.of(getBook(ID_1)) ); + when(authorDao.findById(anyString())).thenReturn(Optional.of(getAuthor(ID_1))); + when(genreDao.findById(anyString())).thenReturn(Optional.of(getGenre(ID_1))); + when(bookDao.findById(anyString())).thenReturn(Optional.of(getBook(ID_1))); - int count = booksManageSevice.updateBook(ID_1, BOOK_NAME, ID_1, ID_1, BOOK_DESCRIPTION); + Book book = booksManageSevice.updateBook(ID_1, BOOK_NAME, ID_1, ID_1, BOOK_DESCRIPTION); - assertThat(count).isEqualTo(1); + assertThat(book).isNotNull(); + assertThat(book.getId()).isEqualTo(ID_1); } @Test @DisplayName("Удаление книги по id") void deleteBook() { doThrow(DataIntegrityViolationException.class).when(bookDao).deleteById(ID_1); - assertThrows(DataIntegrityViolationException.class, () -> { booksManageSevice.deleteBook(ID_1); }); + assertThrows(DataIntegrityViolationException.class, () -> { + booksManageSevice.deleteBook(ID_1); + }); } - private Author getAuthor(long id) { + private Author getAuthor(String id) { return new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); } - private Genre getGenre(long id) { + private Genre getGenre(String id) { return new Genre(id, GENRE_NAME + id); } - private Book getBook(long id) { + private Book getBook(String id) { Author author = getAuthor(id); Genre genre = getGenre(id); - return new Book(id, BOOK_NAME, author, genre, BOOK_DESCRIPTION); + return new Book(id, new Date(), BOOK_NAME, author, genre, BOOK_DESCRIPTION); } private List getBooksList() { diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index d2998d6..06600da 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -26,7 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; @@ -42,10 +42,10 @@ @Ignore class CommentManageSeviceImplTest { - private final long ID_1 = 1L; - private final long ID_2 = 2L; - private final long ID_3 = 3L; - private final long ID_4 = 4L; + private final String ID_1 = "1"; + private final String ID_2 = "2"; + private final String ID_3 = "3"; + private final String ID_4 = "4"; private final int OBJECT_COUNT_4 = 4; @@ -77,7 +77,7 @@ class CommentManageSeviceImplTest { @DisplayName("Получение комментария по id") void getCommentById() { Comment comment = getComment(ID_1); - when(commentDao.findById(anyLong())).thenReturn( Optional.of(comment) ); + when(commentDao.findById(anyString())).thenReturn(Optional.of(comment)); Comment commentById = commentManageService.getCommentById(ID_1); assertThat(commentById).isNotNull(); @@ -88,7 +88,7 @@ void getCommentById() { @DisplayName("Получение всех комментариев") void getComments() { List commentsList = getCommentList(); - when(commentDao.findAll()).thenReturn( commentsList ); + when(commentDao.findAll()).thenReturn(commentsList); List comments = commentManageService.getComments(); assertThat(comments).isNotNull(); @@ -102,20 +102,19 @@ void addComment() { Book book = getBook(ID_1); when(commentDao.save(any(Comment.class))).then(new Answer() { - int sequence = 1; - @Override public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { Comment comment = (Comment) invocationOnMock.getArgument(0); - comment.setId(++sequence); + comment.setId("2"); return comment; } }); - when(bookDao.findById(anyLong())).thenReturn( Optional.of(book) ); + when(bookDao.findById(anyString())).thenReturn(Optional.of(book)); - long id = commentManageService.addComment(ID_1, COMMENT_USER_NAME, COMMENT_TEXT); + Comment comment = commentManageService.addComment(ID_1, COMMENT_USER_NAME, COMMENT_TEXT); - assertThat(id).isEqualTo(ID_2); + assertThat(comment).isNotNull(); + assertThat(comment.getId()).isEqualTo(ID_2); } @Test @@ -124,8 +123,8 @@ void getCommentsByBookId() { List commentList = getCommentList(); Optional book = Optional.of(getBook(ID_1)); - when(bookDao.findById( anyLong() )).thenReturn( book ); - when(commentDao.findByBook( book.orElse(null) )).thenReturn( commentList ); + when(bookDao.findById(anyString())).thenReturn(book); + when(commentDao.findByBook(book.orElse(null))).thenReturn(commentList); List comments = commentManageService.getCommentsByBookId(ID_1); @@ -145,30 +144,33 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { return comment; } }); - when(commentDao.findById(anyLong())).thenReturn( Optional.of(getComment(ID_1)) ); + when(commentDao.findById(anyString())).thenReturn(Optional.of(getComment(ID_1))); - int count = commentManageService.updateComment(ID_1, COMMENT_UPDATED_USER_NAME, COMMENT_UPDATED_TEXT); + Comment comment = commentManageService.updateComment(ID_1, COMMENT_UPDATED_USER_NAME, COMMENT_UPDATED_TEXT); - assertThat(count).isEqualTo(1); + assertThat(comment).isNotNull(); + assertThat(comment.getId()).isEqualTo(ID_1); } @Test @DisplayName("Удаление комментария") void deleteComment() { doThrow(DataIntegrityViolationException.class).when(commentDao).deleteById(ID_1); - assertThrows(DataIntegrityViolationException.class, () -> { commentManageService.deleteComment(ID_1); }); + assertThrows(DataIntegrityViolationException.class, () -> { + commentManageService.deleteComment(ID_1); + }); } - private Comment getComment(long id) { + private Comment getComment(String id) { Date date = DateUtil.stringToDateTime(DATE_TIME); Book book = getBook(id); return new Comment(id, book, date, COMMENT_USER_NAME + id, COMMENT_TEXT + id); } - private Book getBook(long id) { + private Book getBook(String id) { Author author = new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); Genre genre = new Genre(id, GENRE_NAME + id); - return new Book(id, BOOK_NAME, author, genre, BOOK_DESCRIPTION); + return new Book(id, new Date(), BOOK_NAME, author, genre, BOOK_DESCRIPTION); } private List getCommentList() { diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index ed977ed..8ff4dd6 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; @@ -34,9 +34,9 @@ @ExtendWith(MockitoExtension.class) class GenreManageSeviceImplTest { - private final long ID_1 = 1L; - private final long ID_2 = 2L; - private final long ID_3 = 3L; + private final String ID_1 = "1"; + private final String ID_2 = "2"; + private final String ID_3 = "3"; private final int OBJECT_COUNT_3 = 3; @@ -52,7 +52,7 @@ class GenreManageSeviceImplTest { @Test @DisplayName("Получение жанра по id") void getGenreById() { - when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(ID_1)) ); + when(genreDao.findById(anyString())).thenReturn(Optional.of(getGenre(ID_1))); Genre genre = genreManageService.getGenreById(ID_1); assertThat(genre).isNotNull(); @@ -62,7 +62,7 @@ void getGenreById() { @Test @DisplayName("Получение всех жанров") void getGenres() { - when(genreDao.findAll()).thenReturn( getGenreList() ); + when(genreDao.findAll()).thenReturn(getGenreList()); List authors = genreManageService.getGenres(); assertThat(authors).isNotNull(); @@ -74,19 +74,18 @@ void getGenres() { @DisplayName("Добавление жанра") void addGenre() { when(genreDao.save(any(Genre.class))).then(new Answer() { - int sequence = 1; - @Override public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { Genre genre = (Genre) invocationOnMock.getArgument(0); - genre.setId(++sequence); + genre.setId(ID_2); return genre; } }); - long id = genreManageService.addGenre(GENRE_NAME); + Genre genre = genreManageService.addGenre(GENRE_NAME); - assertThat(id).isEqualTo(ID_2); + assertThat(genre).isNotNull(); + assertThat(genre.getId()).isEqualTo(ID_2); } @Test @@ -101,18 +100,21 @@ public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { return genre; } }); - when(genreDao.findById(anyLong())).thenReturn( Optional.of(getGenre(ID_1)) ); + when(genreDao.findById(anyString())).thenReturn(Optional.of(getGenre(ID_1))); - int count = genreManageService.updateGenre(ID_1, GENRE_UPDATED_NAME); + Genre genre = genreManageService.updateGenre(ID_1, GENRE_UPDATED_NAME); - assertThat(count).isEqualTo(1); + assertThat(genre).isNotNull(); + assertThat(genre.getId()).isEqualTo(ID_1); } @Test @DisplayName("Удаление жанра, который используется в таблице книг") void deleteGenre() { doThrow(DataIntegrityViolationException.class).when(genreDao).deleteById(ID_1); - assertThrows(DataIntegrityViolationException.class, () -> { genreManageService.deleteGenre(ID_1); }); + assertThrows(DataIntegrityViolationException.class, () -> { + genreManageService.deleteGenre(ID_1); + }); } private List getGenreList() { @@ -123,7 +125,7 @@ private List getGenreList() { return genres; } - private Genre getGenre(long id) { + private Genre getGenre(String id) { return new Genre(id, GENRE_NAME + id); } } From 38a5d8011fc4615266ab0a0e83b1f8dbe65ee233 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 20 Aug 2019 00:15:25 +0300 Subject: [PATCH 49/70] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B8=D0=BB=20Mongock.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- pom.xml | 6 ++ .../java/ru/otus/mkulikov/Application.java | 2 + .../otus/mkulikov/changelog/DbChangeLog.java | 73 +++++++++++++++++++ .../mkulikov/config/ApplicationConfig.java | 26 +++++++ .../ru/otus/mkulikov/config/MongoProps.java | 21 ++++++ src/main/resources/application.yml | 2 + 7 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/otus/mkulikov/changelog/DbChangeLog.java create mode 100644 src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java create mode 100644 src/main/java/ru/otus/mkulikov/config/MongoProps.java diff --git a/README.md b/README.md index ff80907..5601cef 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,7 @@ - Тесты реализовать с помощью spring-boot-strter-embedded-mongodb. ### 19-08-19 Доработки: -- Тип id у сущностей изменен на String. \ No newline at end of file +- Тип id у сущностей изменен на String. + +### 19-08-20 Доработки: +- Подключил Mongock. \ No newline at end of file diff --git a/pom.xml b/pom.xml index b02bf04..40e2454 100644 --- a/pom.xml +++ b/pom.xml @@ -132,6 +132,12 @@ spring-data-keyvalue + + com.github.cloudyrock.mongock + mongock-spring + 2.0.0 + + org.springframework.data diff --git a/src/main/java/ru/otus/mkulikov/Application.java b/src/main/java/ru/otus/mkulikov/Application.java index 9c2f534..005151d 100644 --- a/src/main/java/ru/otus/mkulikov/Application.java +++ b/src/main/java/ru/otus/mkulikov/Application.java @@ -2,6 +2,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; /** * Created by IntelliJ IDEA. @@ -11,6 +12,7 @@ */ @SpringBootApplication +@EnableConfigurationProperties public class Application { public static void main(String[] args) throws Exception { diff --git a/src/main/java/ru/otus/mkulikov/changelog/DbChangeLog.java b/src/main/java/ru/otus/mkulikov/changelog/DbChangeLog.java new file mode 100644 index 0000000..f84fb0f --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/changelog/DbChangeLog.java @@ -0,0 +1,73 @@ +package ru.otus.mkulikov.changelog; + +import com.github.cloudyrock.mongock.ChangeLog; +import com.github.cloudyrock.mongock.ChangeSet; +import com.mongodb.client.MongoDatabase; +import org.springframework.data.mongodb.core.MongoTemplate; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.utils.DateUtil; + +import java.util.Date; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 19.08.2019 + * Time: 23:33 + */ + +@ChangeLog(order = "001") +public class DbChangeLog { + + private final String DATE_TIME = "2019-01-01 10:01:01"; + private Date date = DateUtil.stringToDateTime(DATE_TIME); + + private Genre genre1; + private Genre genre2; + private Genre genre3; + + private Author author1; + private Author author2; + private Author author3; + + private Book book1; + private Book book2; + private Book book3; + + @ChangeSet(order = "000", id = "dropDB", author = "kulikov-mv", runAlways = true) + public void dropDB(MongoDatabase database) { + database.drop(); + } + + @ChangeSet(order = "001", id = "initGenres", author = "kulikov-mv", runAlways = true) + public void initGenres(MongoTemplate template) { + genre1 = template.save(new Genre("GenreName1")); + genre2 = template.save(new Genre("GenreName2")); + genre3 = template.save(new Genre("GenreName3")); + } + + @ChangeSet(order = "002", id = "initAuthors", author = "kulikov-mv", runAlways = true) + public void initAuthors(MongoTemplate template) { + author1 = template.save(new Author("Surname1", "FirstName1", "SecondName1")); + author2 = template.save(new Author("Surname2", "FirstName2", "SecondName2")); + author3 = template.save(new Author("Surname3", "FirstName3", "SecondName3")); + } + + @ChangeSet(order = "003", id = "initBooks", author = "kulikov-mv", runAlways = true) + public void initBooks(MongoTemplate template) { + book1 = template.save(new Book(date, "BookName1", author1, genre1, "Description1")); + book2 = template.save(new Book(date, "BookName2", author2, genre2, "Description2")); + book3 = template.save(new Book(date, "BookName3", author3, genre3, "Description3")); + } + + @ChangeSet(order = "004", id = "initComments", author = "kulikov-mv", runAlways = true) + public void initComments(MongoTemplate template) { + template.save(new Comment(book1, date, "user1", "text1")); + template.save(new Comment(book1, date, "user2", "text2")); + template.save(new Comment(book2, date, "user3", "text3")); + template.save(new Comment(book2, date, "user4", "text4")); + } +} diff --git a/src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java b/src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java new file mode 100644 index 0000000..f6d3f73 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java @@ -0,0 +1,26 @@ +package ru.otus.mkulikov.config; + +import com.github.cloudyrock.mongock.Mongock; +import com.github.cloudyrock.mongock.SpringMongockBuilder; +import com.mongodb.MongoClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 19.08.2019 + * Time: 23:56 + */ + +@Configuration +public class ApplicationConfig { + + private static final String CHANGELOGS_PACKAGE = "ru.otus.mkulikov.changelog"; + + @Bean + public Mongock mongock(MongoProps mongoProps, MongoClient mongoClient) { + return new SpringMongockBuilder(mongoClient, mongoProps.getDatabase(), CHANGELOGS_PACKAGE) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/config/MongoProps.java b/src/main/java/ru/otus/mkulikov/config/MongoProps.java new file mode 100644 index 0000000..60e2dc3 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/config/MongoProps.java @@ -0,0 +1,21 @@ +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.08.2019 + * Time: 23:55 + */ + +@Data +@Component +@ConfigurationProperties("spring.data.mongodb") +public class MongoProps { + private int port; + private String database; + private String uri; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 20761b2..6d67e9c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -8,4 +8,6 @@ spring: data: mongodb: + uri: mongodb://localhost + port: 27017 database: library From cd25af85f7963ded4085e949e23e9b8f6befd1ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Tue, 20 Aug 2019 12:23:30 +0300 Subject: [PATCH 50/70] =?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 --- .../ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java | 4 ---- .../ru/otus/mkulikov/app/service/BookManageSeviceImpl.java | 1 - .../otus/mkulikov/app/service/CommentManageServiceImpl.java | 1 - .../ru/otus/mkulikov/app/service/GenreManageServiceImpl.java | 1 - src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java | 4 +--- src/main/java/ru/otus/mkulikov/config/MongoProps.java | 1 + src/main/resources/application.yml | 1 + 7 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index c147782..e074793 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -57,10 +57,6 @@ public Author updateAuthor(String id, String surname, String firstName, String s @Override public int deleteAuthor(String id) { authorDao.deleteById(id); - // при удалении записи, которая используется в другой таблице не выдает никакой ошибки, - // ошибка выдается только при вызове следующей команды - // поэтому вызываю count - authorDao.count(); return 1; } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index a938366..b8799da 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -63,7 +63,6 @@ public Book updateBook(String id, String caption, String authorId, String genreI @Override public int deleteBook(String id) { bookDao.deleteById(id); - bookDao.count(); return 1; } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index de61a32..5178776 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -63,7 +63,6 @@ public Comment updateComment(String id, String userName, String text) { @Override public int deleteComment(String id) { commentDao.deleteById(id); - commentDao.count(); return 1; } } diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index 00fb3f8..e043efe 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -55,7 +55,6 @@ public Genre updateGenre(String id, String name) { @Override public int deleteGenre(String id) { genreDao.deleteById(id); - genreDao.count(); return 1; } } diff --git a/src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java b/src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java index f6d3f73..ab6f856 100644 --- a/src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java +++ b/src/main/java/ru/otus/mkulikov/config/ApplicationConfig.java @@ -16,11 +16,9 @@ @Configuration public class ApplicationConfig { - private static final String CHANGELOGS_PACKAGE = "ru.otus.mkulikov.changelog"; - @Bean public Mongock mongock(MongoProps mongoProps, MongoClient mongoClient) { - return new SpringMongockBuilder(mongoClient, mongoProps.getDatabase(), CHANGELOGS_PACKAGE) + return new SpringMongockBuilder(mongoClient, mongoProps.getDatabase(), mongoProps.getPack()) .build(); } } \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/config/MongoProps.java b/src/main/java/ru/otus/mkulikov/config/MongoProps.java index 60e2dc3..d195ebe 100644 --- a/src/main/java/ru/otus/mkulikov/config/MongoProps.java +++ b/src/main/java/ru/otus/mkulikov/config/MongoProps.java @@ -18,4 +18,5 @@ public class MongoProps { private int port; private String database; private String uri; + private String pack; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6d67e9c..d846c14 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,3 +11,4 @@ spring: uri: mongodb://localhost port: 27017 database: library + pack: "ru.otus.mkulikov.changelog" From d46d3459255248893b4a0a73f66b7f5f0dff26a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Wed, 21 Aug 2019 15:05:44 +0300 Subject: [PATCH 51/70] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20Thymeleaf.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 15 +++++- .../otus/mkulikov/rest/AuthorController.java | 26 ++++++++++ .../ru/otus/mkulikov/rest/BookController.java | 24 +++++++++ src/main/resources/templates/authors.html | 48 ++++++++++++++++++ src/main/resources/templates/books.html | 49 +++++++++++++++++++ 5 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/rest/AuthorController.java create mode 100644 src/main/java/ru/otus/mkulikov/rest/BookController.java create mode 100644 src/main/resources/templates/authors.html create mode 100644 src/main/resources/templates/books.html diff --git a/pom.xml b/pom.xml index 40e2454..1dc5829 100644 --- a/pom.xml +++ b/pom.xml @@ -116,6 +116,16 @@ 2.0.0.RELEASE + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + org.springframework.boot @@ -152,8 +162,8 @@ org.apache.maven.plugins maven-compiler-plugin - 11 - 11 + 8 + 8 @@ -191,6 +201,7 @@ **/*.yml **/*.sql **/*.yaml + **/*.html false diff --git a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java new file mode 100644 index 0000000..8e62849 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java @@ -0,0 +1,26 @@ +package ru.otus.mkulikov.rest; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.service.AuthorManageService; +import ru.otus.mkulikov.app.service.BookManageSevice; + +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class AuthorController { + + private final AuthorManageService authorManageService; + + @GetMapping("/list/authors") + public String listPage(Model model) { + List authors = authorManageService.getAuthors(); + model.addAttribute("authors", authors); + return "authors"; + } +} diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java new file mode 100644 index 0000000..83756aa --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -0,0 +1,24 @@ +package ru.otus.mkulikov.rest; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.service.BookManageSevice; + +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class BookController { + + private final BookManageSevice bookManageSevice; + + @GetMapping("/list/books") + public String listPage(Model model) { + List books = bookManageSevice.getBooks(); + model.addAttribute("books", books); + return "books"; + } +} diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html new file mode 100644 index 0000000..7c1dc55 --- /dev/null +++ b/src/main/resources/templates/authors.html @@ -0,0 +1,48 @@ + + + + + List of all authors + + + +

Authors:

+ + + + + + + + + + + + + + + + + +
IDSurnameFirstNameSecondName
1John DoeJohn DoeJohn Doe
+ +
+
+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html new file mode 100644 index 0000000..b06df66 --- /dev/null +++ b/src/main/resources/templates/books.html @@ -0,0 +1,49 @@ + + + + + List of all books + + + +

Books:

+ + + + + + + + + + + + + + + + + + +
IDDateCaptionDescription
1John DoeJohn DoeJohn Doe
+ +
+
+ +
+
+ +
+
+ + + \ No newline at end of file From aabb763680b927e2ca97e53d41f519d3dd3eb141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Wed, 21 Aug 2019 16:11:44 +0300 Subject: [PATCH 52/70] =?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=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D0=BB=D0=B5=D1=80=D0=BE=D0=B2=20=D0=B8=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B8=D1=86.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../otus/mkulikov/rest/AuthorController.java | 10 +++- .../otus/mkulikov/rest/CommentController.java | 26 +++++++++ .../otus/mkulikov/rest/GenreController.java | 34 +++++++++++ src/main/resources/templates/author.html | 54 ++++++++++++++++++ src/main/resources/templates/authors.html | 6 ++ src/main/resources/templates/books.html | 14 +++++ src/main/resources/templates/comments.html | 56 +++++++++++++++++++ src/main/resources/templates/genre.html | 51 +++++++++++++++++ src/main/resources/templates/genres.html | 51 +++++++++++++++++ 9 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/otus/mkulikov/rest/CommentController.java create mode 100644 src/main/java/ru/otus/mkulikov/rest/GenreController.java create mode 100644 src/main/resources/templates/author.html create mode 100644 src/main/resources/templates/comments.html create mode 100644 src/main/resources/templates/genre.html create mode 100644 src/main/resources/templates/genres.html diff --git a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java index 8e62849..27b9b7f 100644 --- a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java +++ b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.service.AuthorManageService; @@ -18,9 +19,16 @@ public class AuthorController { private final AuthorManageService authorManageService; @GetMapping("/list/authors") - public String listPage(Model model) { + public String getAll(Model model) { List authors = authorManageService.getAuthors(); model.addAttribute("authors", authors); return "authors"; } + + @GetMapping("/author") + public String getById(@RequestParam("id") String id, Model model) { + Author author = authorManageService.getAuthorById(id); + model.addAttribute("author", author); + return "author"; + } } diff --git a/src/main/java/ru/otus/mkulikov/rest/CommentController.java b/src/main/java/ru/otus/mkulikov/rest/CommentController.java new file mode 100644 index 0000000..d28810c --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/rest/CommentController.java @@ -0,0 +1,26 @@ +package ru.otus.mkulikov.rest; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.service.CommentManageService; +import ru.otus.mkulikov.app.service.GenreManageService; + +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class CommentController { + + private final CommentManageService commentManageService; + + @GetMapping("/list/comments") + public String listPage(Model model) { + List comments = commentManageService.getComments(); + model.addAttribute("comments", comments); + return "comments"; + } +} diff --git a/src/main/java/ru/otus/mkulikov/rest/GenreController.java b/src/main/java/ru/otus/mkulikov/rest/GenreController.java new file mode 100644 index 0000000..433e4de --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/rest/GenreController.java @@ -0,0 +1,34 @@ +package ru.otus.mkulikov.rest; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.service.BookManageSevice; +import ru.otus.mkulikov.app.service.GenreManageService; + +import java.util.List; + +@Controller +@RequiredArgsConstructor +public class GenreController { + + private final GenreManageService genreManageService; + + @GetMapping("/list/genres") + public String getAll(Model model) { + List genres = genreManageService.getGenres(); + model.addAttribute("genres", genres); + return "genres"; + } + + @GetMapping("/genre") + public String getById(@RequestParam("id") String id, Model model) { + Genre genre = genreManageService.getGenreById(id); + model.addAttribute("genre", genre); + return "genre"; + } +} diff --git a/src/main/resources/templates/author.html b/src/main/resources/templates/author.html new file mode 100644 index 0000000..33d0ea5 --- /dev/null +++ b/src/main/resources/templates/author.html @@ -0,0 +1,54 @@ + + + + + List of all authors + + + +

Authors:

+ + + + + + + + + + + + + + + + + +
IDSurnameFirstNameSecondName
1John DoeJohn DoeJohn Doe
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index 7c1dc55..0f15260 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -42,6 +42,12 @@

Authors:

+
+ +
+
+ +
diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html index b06df66..09e99b1 100644 --- a/src/main/resources/templates/books.html +++ b/src/main/resources/templates/books.html @@ -24,6 +24,8 @@

Books:

Date Caption Description + Author + Genre @@ -32,6 +34,12 @@

Books:

John Doe John Doe John Doe + + View + + + View + @@ -43,6 +51,12 @@

Books:

+
+ +
+
+ +
diff --git a/src/main/resources/templates/comments.html b/src/main/resources/templates/comments.html new file mode 100644 index 0000000..9ddad48 --- /dev/null +++ b/src/main/resources/templates/comments.html @@ -0,0 +1,56 @@ + + + + + List of all comments + + + +

Comments:

+ + + + + + + + + + + + + + + + + + + +
IDNameAddRecordDateUserNameText
1John DoeJohn DoeJohn Doe
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html new file mode 100644 index 0000000..e429efe --- /dev/null +++ b/src/main/resources/templates/genre.html @@ -0,0 +1,51 @@ + + + + + List of all genres + + + +

Genres:

+ + + + + + + + + + + + + + +
IDName
1John Doe
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html new file mode 100644 index 0000000..e8e0501 --- /dev/null +++ b/src/main/resources/templates/genres.html @@ -0,0 +1,51 @@ + + + + + List of all genres + + + +

Genres:

+ + + + + + + + + + + + + + +
IDName
1John Doe
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + \ No newline at end of file From 1c041f12a655492e2d360a0eb21197ee982af9e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Wed, 21 Aug 2019 18:15:06 +0300 Subject: [PATCH 53/70] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20bootstrap.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 21 +++++++++++ .../ru/otus/mkulikov/config/WebMvcConfig.java | 36 +++++++++++++++++++ .../ru/otus/mkulikov/rest/MainController.java | 15 ++++++++ src/main/resources/templates/index.html | 30 ++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java create mode 100644 src/main/java/ru/otus/mkulikov/rest/MainController.java create mode 100644 src/main/resources/templates/index.html diff --git a/pom.xml b/pom.xml index 1dc5829..ff4aecd 100644 --- a/pom.xml +++ b/pom.xml @@ -154,6 +154,27 @@ spring-data-jpa 2.0.8.RELEASE
+ + + + + org.webjars + jquery + 3.4.1 + + + + + org.webjars + popper.js + 1.15.0 + + + + org.webjars + bootstrap + 4.3.1 +
diff --git a/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java b/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java new file mode 100644 index 0000000..8eba578 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java @@ -0,0 +1,36 @@ +package ru.otus.mkulikov.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfig implements WebMvcConfigurer { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + // + // Access Bootstrap static resource: + // + + // + // http://somedomain/SomeContextPath/jquery/jquery.min.css + // + registry.addResourceHandler("/jquery/**") // + .addResourceLocations("classpath:/META-INF/resources/webjars/jquery/3.4.1/"); + + // + // http://somedomain/SomeContextPath/popper/popper.min.js + // + registry.addResourceHandler("/popper/**") // + .addResourceLocations("classpath:/META-INF/resources/webjars/popper.js/1.15.0/umd/"); + + // http://somedomain/SomeContextPath/bootstrap/css/bootstrap.min.css + // http://somedomain/SomeContextPath/bootstrap/js/bootstrap.min.js + // + registry.addResourceHandler("/bootstrap/**") // + .addResourceLocations("classpath:/META-INF/resources/webjars/bootstrap/4.3.1/"); + + } + +} \ No newline at end of file diff --git a/src/main/java/ru/otus/mkulikov/rest/MainController.java b/src/main/java/ru/otus/mkulikov/rest/MainController.java new file mode 100644 index 0000000..cff40c8 --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/rest/MainController.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.rest; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class MainController { + + @RequestMapping("/") + public String helloWorld(Model model) { + return "index"; + } + +} diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..faae427 --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,30 @@ + + + + + Twitter Bootstrap Example + + + + + + + + + + + + + + +

Hello Twitter Bootstrap

+ +
+ + + +
+ + + \ No newline at end of file From df7b8d3208f6ccff1b3256cf5322f555196d336f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Mon, 26 Aug 2019 18:19:51 +0300 Subject: [PATCH 54/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/otus/mkulikov/rest/BookController.java | 9 +++ src/main/resources/templates/author.html | 22 ++------ src/main/resources/templates/authors.html | 44 ++++++++++----- src/main/resources/templates/book.html | 48 ++++++++++++++++ src/main/resources/templates/books.html | 43 +++++++++----- src/main/resources/templates/comments.html | 48 ++++++++++------ src/main/resources/templates/genre.html | 21 +------ src/main/resources/templates/genres.html | 43 +++++++++----- src/main/resources/templates/index.html | 56 ++++++++++++++++--- 9 files changed, 230 insertions(+), 104 deletions(-) create mode 100644 src/main/resources/templates/book.html diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java index 83756aa..2f13eb9 100644 --- a/src/main/java/ru/otus/mkulikov/rest/BookController.java +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -4,6 +4,8 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.service.BookManageSevice; @@ -21,4 +23,11 @@ public String listPage(Model model) { model.addAttribute("books", books); return "books"; } + + @GetMapping("/book") + public String getById(@RequestParam("id") String id, Model model) { + Book book = bookManageSevice.getBookById(id); + model.addAttribute("book", book); + return "book"; + } } diff --git a/src/main/resources/templates/author.html b/src/main/resources/templates/author.html index 33d0ea5..c89299a 100644 --- a/src/main/resources/templates/author.html +++ b/src/main/resources/templates/author.html @@ -8,15 +8,16 @@ padding: 50px; } - .authors, .authors td { + .author, .author td { border: 1px solid lightgray; padding: 5px; } -

Authors:

- +

Author:

+ +
@@ -35,20 +36,5 @@

Authors:

ID
-
-
- -
-
- -
-
- -
-
- -
-
- \ No newline at end of file diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index 0f15260..303935c 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -16,6 +16,35 @@

Authors:

+ + + + + + + + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ @@ -35,20 +64,5 @@

Authors:

-
-
- -
-
- -
-
- -
-
- -
-
- \ No newline at end of file diff --git a/src/main/resources/templates/book.html b/src/main/resources/templates/book.html new file mode 100644 index 0000000..2a7d36b --- /dev/null +++ b/src/main/resources/templates/book.html @@ -0,0 +1,48 @@ + + + + + List of all books + + + +

Book:

+ + + + + + + + + + + + + + + + + + + + + + +
IDDateCaptionDescriptionAuthorGenre
1John DoeJohn DoeJohn Doe + View + + View +
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html index 09e99b1..81d7dec 100644 --- a/src/main/resources/templates/books.html +++ b/src/main/resources/templates/books.html @@ -17,6 +17,34 @@

Books:

+ + + + + + + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ @@ -44,20 +72,5 @@

Books:

-
-
- -
-
- -
-
- -
-
- -
-
- \ No newline at end of file diff --git a/src/main/resources/templates/comments.html b/src/main/resources/templates/comments.html index 9ddad48..fad5016 100644 --- a/src/main/resources/templates/comments.html +++ b/src/main/resources/templates/comments.html @@ -17,12 +17,40 @@

Comments:

+ + + + + + + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ - + @@ -31,26 +59,14 @@

Comments:

+
IDName AddRecordDateBook UserName Text
1 John Doe + View + John Doe John Doe
-
-
- -
-
- -
-
- -
-
- -
-
- \ No newline at end of file diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index e429efe..7bef441 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -8,16 +8,16 @@ padding: 50px; } - .genres, .genres td { + .genre, .genre td { border: 1px solid lightgray; padding: 5px; } -

Genres:

+

Genre:

- +
@@ -32,20 +32,5 @@

Genres:

ID
-
-
- -
-
- -
-
- -
-
- -
-
- \ No newline at end of file diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html index e8e0501..212799c 100644 --- a/src/main/resources/templates/genres.html +++ b/src/main/resources/templates/genres.html @@ -17,6 +17,34 @@

Genres:

+ + + + + + + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ @@ -32,20 +60,5 @@

Genres:

-
-
- -
-
- -
-
- -
-
- -
-
- \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index faae427..121da5e 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -13,18 +13,60 @@ - + -
- - - -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#ИмяФамилияUsername
1MarkOtto@mdo
2JacobThornton@fat
3Larrythe Bird@twitter
\ No newline at end of file From 2f84ebdab6912b53f013eb8b83196cf182bf61cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Tue, 27 Aug 2019 17:46:53 +0300 Subject: [PATCH 55/70] =?UTF-8?q?-=20=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?.=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=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 --- .../app/service/BookManageSevice.java | 2 + .../app/service/BookManageSeviceImpl.java | 5 ++ .../ru/otus/mkulikov/rest/BookController.java | 18 ++++- .../otus/mkulikov/rest/CommentController.java | 10 ++- src/main/resources/application.yml | 1 + src/main/resources/templates/author.html | 2 + src/main/resources/templates/book.html | 12 ++++ src/main/resources/templates/books.html | 4 ++ src/main/resources/templates/comment.html | 72 +++++++++++++++++++ src/main/resources/templates/genre.html | 2 + .../service/CommentManageSeviceImplTest.java | 1 - .../mkulikov/rest/BookControllerTest.java | 43 +++++++++++ src/test/resources/application.yml | 5 +- 13 files changed, 171 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/templates/comment.html create mode 100644 src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java index c245547..5c09fd4 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java @@ -21,5 +21,7 @@ public interface BookManageSevice { T updateBook(String id, String caption, String authorId, String genreId, String description); + T updateBook(T t); + int deleteBook(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index b8799da..3f20838 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -60,6 +60,11 @@ public Book updateBook(String id, String caption, String authorId, String genreI return bookDao.save(book); } + @Override + public Book updateBook(Book book) { + return bookDao.save(book); + } + @Override public int deleteBook(String id) { bookDao.deleteById(id); diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java index 2f13eb9..e98b9b9 100644 --- a/src/main/java/ru/otus/mkulikov/rest/BookController.java +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -3,11 +3,12 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.service.AuthorManageService; import ru.otus.mkulikov.app.service.BookManageSevice; +import ru.otus.mkulikov.app.service.GenreManageService; import java.util.List; @@ -18,7 +19,7 @@ public class BookController { private final BookManageSevice bookManageSevice; @GetMapping("/list/books") - public String listPage(Model model) { + public String getAll(Model model) { List books = bookManageSevice.getBooks(); model.addAttribute("books", books); return "books"; @@ -30,4 +31,15 @@ public String getById(@RequestParam("id") String id, Model model) { model.addAttribute("book", book); return "book"; } + + @PostMapping(value="/book/edit") + public String bookEdit(@ModelAttribute Book book, Model model) { + Book orig = bookManageSevice.getBookById(book.getId()); + orig.setCaption(book.getCaption()); + orig.setDescription(book.getDescription()); + + Book updated = bookManageSevice.updateBook(orig); + model.addAttribute("book", updated); + return "book"; + } } diff --git a/src/main/java/ru/otus/mkulikov/rest/CommentController.java b/src/main/java/ru/otus/mkulikov/rest/CommentController.java index d28810c..9511187 100644 --- a/src/main/java/ru/otus/mkulikov/rest/CommentController.java +++ b/src/main/java/ru/otus/mkulikov/rest/CommentController.java @@ -4,6 +4,7 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.service.CommentManageService; @@ -18,9 +19,16 @@ public class CommentController { private final CommentManageService commentManageService; @GetMapping("/list/comments") - public String listPage(Model model) { + public String getAll(Model model) { List comments = commentManageService.getComments(); model.addAttribute("comments", comments); return "comments"; } + + @GetMapping("/comment") + public String getById(@RequestParam("id") String id, Model model) { + Comment comment = commentManageService.getCommentById(id); + model.addAttribute("comment", comment); + return "comment"; + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d846c14..26247a0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,3 +12,4 @@ spring: port: 27017 database: library pack: "ru.otus.mkulikov.changelog" + diff --git a/src/main/resources/templates/author.html b/src/main/resources/templates/author.html index c89299a..a4b2ebe 100644 --- a/src/main/resources/templates/author.html +++ b/src/main/resources/templates/author.html @@ -15,6 +15,8 @@ + +

Author:

diff --git a/src/main/resources/templates/book.html b/src/main/resources/templates/book.html index 2a7d36b..2d02adf 100644 --- a/src/main/resources/templates/book.html +++ b/src/main/resources/templates/book.html @@ -15,6 +15,8 @@ + +

Book:

@@ -44,5 +46,15 @@

Book:

+

Edit

+
+

Id:

+

Caption:

+

Description:

+

+ +

+
+ \ No newline at end of file diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html index 81d7dec..24d0380 100644 --- a/src/main/resources/templates/books.html +++ b/src/main/resources/templates/books.html @@ -54,6 +54,7 @@

Books:

Description Author Genre + Edit @@ -68,6 +69,9 @@

Books:

View + + ... + diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html new file mode 100644 index 0000000..aa3a39e --- /dev/null +++ b/src/main/resources/templates/comment.html @@ -0,0 +1,72 @@ + + + + + List of all comments + + + + + +

Comment:

+ + + + + + + + + + + +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + +
IDAddRecordDateBookUserNameText
1John Doe + View + John DoeJohn Doe
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index 7bef441..6aa690f 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -15,6 +15,8 @@ + +

Genre:

diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index 06600da..efa035c 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -39,7 +39,6 @@ @DisplayName("Класс CommentManageSevice") @ExtendWith(MockitoExtension.class) -@Ignore class CommentManageSeviceImplTest { private final String ID_1 = "1"; diff --git a/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java new file mode 100644 index 0000000..8bd2926 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java @@ -0,0 +1,43 @@ +package ru.otus.mkulikov.rest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import ru.otus.mkulikov.app.service.BookManageSevice; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@WebMvcTest(BookController.class) +public class BookControllerTest { + + @MockBean + private BookManageSevice bookManageSevice; + + @Autowired + private MockMvc mockMvc; + + @Test + public void getAll() throws Exception { + this.mockMvc.perform(get("/list/books")).andDo(print()).andExpect(status().isOk()) + .andExpect(content().string(containsString("Books:"))); + } + + @Test + public void getById() throws Exception { + this.mockMvc.perform(get("/book")).andDo(print()).andExpect(status().isBadRequest()); + } + + @Test + public void bookEdit() throws Exception { + this.mockMvc.perform(get("/book/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); + } +} \ No newline at end of file diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index f7c7121..d09d306 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -1,6 +1,6 @@ spring: banner: - location: "classpath:banner-test.txt" + location: "classpath:banner.txt" jpa: hibernate: @@ -8,4 +8,7 @@ spring: data: mongodb: + uri: mongodb://localhost + port: 27017 database: library_test + pack: "ru.otus.mkulikov.changelog" From 2f389c14abab311ea0dca4470a46fb67e014caa7 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Fri, 30 Aug 2019 01:19:40 +0300 Subject: [PATCH 56/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 10 ++++------ .../java/ru/otus/mkulikov/config/WebMvcConfig.java | 10 ++++++++++ src/main/resources/static/css/header.css | 8 ++++++++ src/main/resources/templates/author.html | 10 +--------- src/main/resources/templates/authors.html | 10 +--------- src/main/resources/templates/book.html | 10 +--------- src/main/resources/templates/books.html | 10 +--------- src/main/resources/templates/comment.html | 10 +--------- src/main/resources/templates/comments.html | 10 +--------- src/main/resources/templates/genre.html | 10 +--------- src/main/resources/templates/genres.html | 10 +--------- 11 files changed, 30 insertions(+), 78 deletions(-) create mode 100644 src/main/resources/static/css/header.css diff --git a/pom.xml b/pom.xml index ff4aecd..a884528 100644 --- a/pom.xml +++ b/pom.xml @@ -183,8 +183,8 @@ org.apache.maven.plugins maven-compiler-plugin - 8 - 8 + 11 + 11 @@ -216,13 +216,11 @@ src/main/resources - **/*.csv - **/*.properties - **/*.txt **/*.yml - **/*.sql + **/*.txt **/*.yaml **/*.html + **/*.css false diff --git a/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java b/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java index 8eba578..e72e897 100644 --- a/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java +++ b/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java @@ -31,6 +31,16 @@ public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/bootstrap/**") // .addResourceLocations("classpath:/META-INF/resources/webjars/bootstrap/4.3.1/"); + registry.addResourceHandler( + "/webjars/**", + "/img/**", + "/css/**", + "/js/**") + .addResourceLocations( + "classpath:/META-INF/resources/webjars/", + "classpath:/static/img/", + "classpath:/static/css/", + "classpath:/static/js/"); } } \ No newline at end of file diff --git a/src/main/resources/static/css/header.css b/src/main/resources/static/css/header.css new file mode 100644 index 0000000..8463727 --- /dev/null +++ b/src/main/resources/static/css/header.css @@ -0,0 +1,8 @@ +body { + padding: 50px; +} + +table td { + border: 1px solid lightgray; + padding: 5px; +} \ No newline at end of file diff --git a/src/main/resources/templates/author.html b/src/main/resources/templates/author.html index a4b2ebe..72e705e 100644 --- a/src/main/resources/templates/author.html +++ b/src/main/resources/templates/author.html @@ -3,16 +3,8 @@ List of all authors - + diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index 303935c..a35bfc7 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -3,16 +3,8 @@ List of all authors - +

Authors:

diff --git a/src/main/resources/templates/book.html b/src/main/resources/templates/book.html index 2d02adf..d8e5c96 100644 --- a/src/main/resources/templates/book.html +++ b/src/main/resources/templates/book.html @@ -3,16 +3,8 @@ List of all books - + diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html index 24d0380..aef27c2 100644 --- a/src/main/resources/templates/books.html +++ b/src/main/resources/templates/books.html @@ -3,16 +3,8 @@ List of all books - +

Books:

diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index aa3a39e..3335374 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -3,16 +3,8 @@ List of all comments - + diff --git a/src/main/resources/templates/comments.html b/src/main/resources/templates/comments.html index fad5016..d2bdf70 100644 --- a/src/main/resources/templates/comments.html +++ b/src/main/resources/templates/comments.html @@ -3,16 +3,8 @@ List of all comments - +

Comments:

diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index 6aa690f..cfe9b38 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -3,16 +3,8 @@ List of all genres - + diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html index 212799c..8727a22 100644 --- a/src/main/resources/templates/genres.html +++ b/src/main/resources/templates/genres.html @@ -3,16 +3,8 @@ List of all genres - +

Genres:

From 4ef6dedc4352c9ffbc23455536793c82ea307bb3 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 3 Sep 2019 02:32:46 +0300 Subject: [PATCH 57/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BE?= =?UTF-8?q?=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/exception/ObjectNotFound.java | 15 +++++++++++ .../app/service/AuthorManageService.java | 2 ++ .../app/service/AuthorManageServiceImpl.java | 26 ++++++++++--------- .../app/service/BookManageSeviceImpl.java | 20 ++++++++------ .../app/service/CommentManageService.java | 2 ++ .../app/service/CommentManageServiceImpl.java | 25 +++++++++++------- .../app/service/GenreManageService.java | 2 ++ .../app/service/GenreManageServiceImpl.java | 24 ++++++++--------- .../otus/mkulikov/rest/AuthorController.java | 13 +++++++--- .../ru/otus/mkulikov/rest/BookController.java | 20 ++++++-------- .../otus/mkulikov/rest/CommentController.java | 13 +++++++--- .../otus/mkulikov/rest/GenreController.java | 13 +++++++--- src/main/resources/templates/authors.html | 8 +++--- src/main/resources/templates/books.html | 8 +++--- src/main/resources/templates/comment.html | 8 +++--- src/main/resources/templates/comments.html | 8 +++--- src/main/resources/templates/genres.html | 8 +++--- .../mkulikov/rest/BookControllerTest.java | 2 +- 18 files changed, 134 insertions(+), 83 deletions(-) create mode 100644 src/main/java/ru/otus/mkulikov/app/exception/ObjectNotFound.java diff --git a/src/main/java/ru/otus/mkulikov/app/exception/ObjectNotFound.java b/src/main/java/ru/otus/mkulikov/app/exception/ObjectNotFound.java new file mode 100644 index 0000000..43f598d --- /dev/null +++ b/src/main/java/ru/otus/mkulikov/app/exception/ObjectNotFound.java @@ -0,0 +1,15 @@ +package ru.otus.mkulikov.app.exception; + +/** + * Created by IntelliJ IDEA. + * Developer: Maksim Kulikov + * Date: 03.09.2019 + * Time: 1:58 + */ + +public class ObjectNotFound extends RuntimeException { + + public ObjectNotFound(String obj, String id) { + super("Not found object - " + obj + ", id - " + id); + } +} diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java index 77ed829..84dd68f 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageService.java @@ -21,5 +21,7 @@ public interface AuthorManageService { T updateAuthor(String id, String surname, String firstName, String secondName); + T updateAuthor(T t); + int deleteAuthor(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java index e074793..bca5644 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java @@ -3,12 +3,10 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import ru.otus.mkulikov.app.dao.AuthorDao; +import ru.otus.mkulikov.app.exception.ObjectNotFound; import ru.otus.mkulikov.app.model.Author; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; /** * Created by IntelliJ IDEA. @@ -25,18 +23,12 @@ public class AuthorManageServiceImpl implements AuthorManageService { @Override public Author getAuthorById(String id) { - Optional author = authorDao.findById(id); - return author.orElse(null); + return authorDao.findById(id).orElseThrow(() -> new ObjectNotFound("Author", id)); } @Override public List getAuthors() { - Iterable authors = authorDao.findAll(); - List list = StreamSupport - .stream(authors.spliterator(), false) - .collect(Collectors.toList()); - - return list; + return authorDao.findAll(); } @Override @@ -46,7 +38,7 @@ public Author addAuthor(String surname, String firstName, String secondName) { @Override public Author updateAuthor(String id, String surname, String firstName, String secondName) { - Author author = authorDao.findById(id).orElse(null); + Author author = authorDao.findById(id).orElseThrow(() -> new ObjectNotFound("Author", id)); author.setSurname(surname); author.setFirstName(firstName); author.setSecondName(secondName); @@ -54,6 +46,16 @@ public Author updateAuthor(String id, String surname, String firstName, String s return authorDao.save(author); } + @Override + public Author updateAuthor(Author author) { + Author orig = authorDao.findById(author.getId()).orElseThrow(() -> new ObjectNotFound("Author", author.getId())); + orig.setSurname(author.getSurname()); + orig.setFirstName(author.getFirstName()); + orig.setSecondName(author.getSecondName()); + + return authorDao.save(orig); + } + @Override public int deleteAuthor(String id) { authorDao.deleteById(id); diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java index 3f20838..f8a0f77 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java @@ -5,6 +5,7 @@ import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.exception.ObjectNotFound; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; @@ -29,7 +30,7 @@ public class BookManageSeviceImpl implements BookManageSevice { @Override public Book getBookById(String id) { - return bookDao.findById(id).orElse(null); + return bookDao.findById(id).orElseThrow(() -> new ObjectNotFound("Book", id)); } @Override @@ -39,22 +40,21 @@ public List getBooks() { @Override public Book addBook(String caption, String authorId, String genreId, String description) { - Author author = authorDao.findById(authorId).orElse(null); - Genre genre = genreDao.findById(genreId).orElse(null); + Author author = authorDao.findById(authorId).orElseThrow(() -> new ObjectNotFound("Author", authorId)); + Genre genre = genreDao.findById(genreId).orElseThrow(() -> new ObjectNotFound("Genre", genreId)); return bookDao.save(new Book(new Date(), caption, author, genre, description)); } @Override public Book updateBook(String id, String caption, String authorId, String genreId, String description) { - Author author = authorDao.findById(authorId).orElse(null); - Genre genre = genreDao.findById(genreId).orElse(null); + Author author = authorDao.findById(authorId).orElseThrow(() -> new ObjectNotFound("Author", authorId)); + Genre genre = genreDao.findById(genreId).orElseThrow(() -> new ObjectNotFound("Genre", genreId)); - Book book = bookDao.findById(id).orElse(null); + Book book = bookDao.findById(id).orElseThrow(() -> new ObjectNotFound("Book", id)); book.setCaption(caption); book.setAuthor(author); book.setGenre(genre); - book.setGenre(genre); book.setDescription(description); return bookDao.save(book); @@ -62,7 +62,11 @@ public Book updateBook(String id, String caption, String authorId, String genreI @Override public Book updateBook(Book book) { - return bookDao.save(book); + Book orig = bookDao.findById(book.getId()).orElseThrow(() -> new ObjectNotFound("Book", book.getId())); + orig.setCaption(book.getCaption()); + orig.setDescription(book.getDescription()); + + return bookDao.save(orig); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java index 7dd63d4..80ff9dc 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java @@ -22,5 +22,7 @@ public interface CommentManageService { T updateComment(String id, String userName, String text); + T updateComment(T t); + int deleteComment(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index 5178776..8b32f8c 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -4,12 +4,12 @@ import org.springframework.stereotype.Service; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.CommentDao; +import ru.otus.mkulikov.app.exception.ObjectNotFound; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import java.util.Date; import java.util.List; -import java.util.Optional; /** * Created by IntelliJ IDEA. @@ -27,8 +27,7 @@ public class CommentManageServiceImpl implements CommentManageService { @Override public Comment getCommentById(String id) { - Optional comment = commentDao.findById(id); - return comment.orElse(null); + return commentDao.findById(id).orElseThrow(() -> new ObjectNotFound("Comment", id)); } @Override @@ -38,21 +37,19 @@ public List getComments() { @Override public List getCommentsByBookId(String bookId) { - Optional book = bookDao.findById(bookId); - - return commentDao.findByBook(book.orElse(null)); + Book book = bookDao.findById(bookId).orElseThrow(() -> new ObjectNotFound("Book", bookId)); + return commentDao.findByBook(book); } @Override public Comment addComment(String bookId, String userName, String text) { - Book book = bookDao.findById(bookId).orElse(null); - + Book book = bookDao.findById(bookId).orElseThrow(() -> new ObjectNotFound("Book", bookId)); return commentDao.save(new Comment(book, new Date(), userName, text)); } @Override public Comment updateComment(String id, String userName, String text) { - Comment comment = commentDao.findById(id).orElse(null); + Comment comment = commentDao.findById(id).orElseThrow(() -> new ObjectNotFound("Comment", id)); comment.setAddRecordDate(new Date()); comment.setUserName(userName); comment.setText(text); @@ -60,6 +57,16 @@ public Comment updateComment(String id, String userName, String text) { return commentDao.save(comment); } + @Override + public Comment updateComment(Comment comment) { + Comment orig = commentDao.findById(comment.getId()).orElseThrow(() -> new ObjectNotFound("Comment", comment.getId())); + orig.setAddRecordDate(new Date()); + orig.setUserName(comment.getUserName()); + orig.setText(comment.getText()); + + return commentDao.save(orig); + } + @Override public int deleteComment(String id) { commentDao.deleteById(id); diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java index 6b5f162..d6bfbce 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageService.java @@ -20,5 +20,7 @@ public interface GenreManageService { T updateGenre(String id, String name); + T updateGenre(T t); + int deleteGenre(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index e043efe..3242783 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -3,12 +3,10 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import ru.otus.mkulikov.app.dao.GenreDao; +import ru.otus.mkulikov.app.exception.ObjectNotFound; import ru.otus.mkulikov.app.model.Genre; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; /** * Created by IntelliJ IDEA. @@ -25,18 +23,12 @@ public class GenreManageServiceImpl implements GenreManageService { @Override public Genre getGenreById(String id) { - Optional genre = genreDao.findById(id); - return genre.orElse(null); + return genreDao.findById(id).orElseThrow(() -> new ObjectNotFound("Genre", id)); } @Override public List getGenres() { - Iterable authors = genreDao.findAll(); - List list = StreamSupport - .stream(authors.spliterator(), false) - .collect(Collectors.toList()); - - return list; + return genreDao.findAll(); } @Override @@ -46,12 +38,20 @@ public Genre addGenre(String name) { @Override public Genre updateGenre(String id, String name) { - Genre genre = genreDao.findById(id).orElse(null); + Genre genre = genreDao.findById(id).orElseThrow(() -> new ObjectNotFound("Genre", id)); genre.setName(name); return genreDao.save(genre); } + @Override + public Genre updateGenre(Genre genre) { + Genre orig = genreDao.findById(genre.getId()).orElseThrow(() -> new ObjectNotFound("Genre", genre.getId())); + orig.setName(genre.getName()); + + return genreDao.save(orig); + } + @Override public int deleteGenre(String id) { genreDao.deleteById(id); diff --git a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java index 27b9b7f..56180d2 100644 --- a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java +++ b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java @@ -4,11 +4,11 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import ru.otus.mkulikov.app.model.Author; -import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.service.AuthorManageService; -import ru.otus.mkulikov.app.service.BookManageSevice; import java.util.List; @@ -18,7 +18,7 @@ public class AuthorController { private final AuthorManageService authorManageService; - @GetMapping("/list/authors") + @GetMapping("/author/list") public String getAll(Model model) { List authors = authorManageService.getAuthors(); model.addAttribute("authors", authors); @@ -31,4 +31,11 @@ public String getById(@RequestParam("id") String id, Model model) { model.addAttribute("author", author); return "author"; } + + @PostMapping(value = "/author/edit") + public String edit(@ModelAttribute Author author, Model model) { + Author updated = authorManageService.updateAuthor(author); + model.addAttribute("author", updated); + return "author"; + } } diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java index e98b9b9..9d0603c 100644 --- a/src/main/java/ru/otus/mkulikov/rest/BookController.java +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -3,12 +3,12 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.*; -import ru.otus.mkulikov.app.model.Author; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.service.AuthorManageService; import ru.otus.mkulikov.app.service.BookManageSevice; -import ru.otus.mkulikov.app.service.GenreManageService; import java.util.List; @@ -18,7 +18,7 @@ public class BookController { private final BookManageSevice bookManageSevice; - @GetMapping("/list/books") + @GetMapping("/book/list") public String getAll(Model model) { List books = bookManageSevice.getBooks(); model.addAttribute("books", books); @@ -32,13 +32,9 @@ public String getById(@RequestParam("id") String id, Model model) { return "book"; } - @PostMapping(value="/book/edit") - public String bookEdit(@ModelAttribute Book book, Model model) { - Book orig = bookManageSevice.getBookById(book.getId()); - orig.setCaption(book.getCaption()); - orig.setDescription(book.getDescription()); - - Book updated = bookManageSevice.updateBook(orig); + @PostMapping(value = "/book/edit") + public String edit(@ModelAttribute Book book, Model model) { + Book updated = bookManageSevice.updateBook(book); model.addAttribute("book", updated); return "book"; } diff --git a/src/main/java/ru/otus/mkulikov/rest/CommentController.java b/src/main/java/ru/otus/mkulikov/rest/CommentController.java index 9511187..f09329c 100644 --- a/src/main/java/ru/otus/mkulikov/rest/CommentController.java +++ b/src/main/java/ru/otus/mkulikov/rest/CommentController.java @@ -4,11 +4,11 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import ru.otus.mkulikov.app.model.Comment; -import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.service.CommentManageService; -import ru.otus.mkulikov.app.service.GenreManageService; import java.util.List; @@ -18,7 +18,7 @@ public class CommentController { private final CommentManageService commentManageService; - @GetMapping("/list/comments") + @GetMapping("/comment/list") public String getAll(Model model) { List comments = commentManageService.getComments(); model.addAttribute("comments", comments); @@ -31,4 +31,11 @@ public String getById(@RequestParam("id") String id, Model model) { model.addAttribute("comment", comment); return "comment"; } + + @PostMapping(value = "/comment/edit") + public String edit(@ModelAttribute Comment comment, Model model) { + Comment updated = commentManageService.updateComment(comment); + model.addAttribute("comment", updated); + return "comment"; + } } diff --git a/src/main/java/ru/otus/mkulikov/rest/GenreController.java b/src/main/java/ru/otus/mkulikov/rest/GenreController.java index 433e4de..c17dfe7 100644 --- a/src/main/java/ru/otus/mkulikov/rest/GenreController.java +++ b/src/main/java/ru/otus/mkulikov/rest/GenreController.java @@ -4,10 +4,10 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; -import ru.otus.mkulikov.app.service.BookManageSevice; import ru.otus.mkulikov.app.service.GenreManageService; import java.util.List; @@ -18,7 +18,7 @@ public class GenreController { private final GenreManageService genreManageService; - @GetMapping("/list/genres") + @GetMapping("/genre/list") public String getAll(Model model) { List genres = genreManageService.getGenres(); model.addAttribute("genres", genres); @@ -31,4 +31,11 @@ public String getById(@RequestParam("id") String id, Model model) { model.addAttribute("genre", genre); return "genre"; } + + @PostMapping(value = "/genre/edit") + public String edit(@ModelAttribute Genre genre, Model model) { + Genre updated = genreManageService.updateGenre(genre); + model.addAttribute("genre", updated); + return "genre"; + } } diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index a35bfc7..26e0371 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -14,22 +14,22 @@

Authors:

diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html index aef27c2..550c31f 100644 --- a/src/main/resources/templates/books.html +++ b/src/main/resources/templates/books.html @@ -14,22 +14,22 @@

Books:

diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index 3335374..da0bc2c 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -16,22 +16,22 @@

Comment:

diff --git a/src/main/resources/templates/comments.html b/src/main/resources/templates/comments.html index d2bdf70..d35ffd6 100644 --- a/src/main/resources/templates/comments.html +++ b/src/main/resources/templates/comments.html @@ -14,22 +14,22 @@

Comments:

diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html index 8727a22..06fe8e5 100644 --- a/src/main/resources/templates/genres.html +++ b/src/main/resources/templates/genres.html @@ -14,22 +14,22 @@

Genres:

diff --git a/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java index 8bd2926..03f30d8 100644 --- a/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java @@ -27,7 +27,7 @@ public class BookControllerTest { @Test public void getAll() throws Exception { - this.mockMvc.perform(get("/list/books")).andDo(print()).andExpect(status().isOk()) + this.mockMvc.perform(get("/book/list")).andDo(print()).andExpect(status().isOk()) .andExpect(content().string(containsString("Books:"))); } From 639c3b04b81a0068ecde442f8867d114d922a3be Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Tue, 3 Sep 2019 16:54:42 +0300 Subject: [PATCH 58/70] =?UTF-8?q?-=20=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=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= =?UTF-8?q?.=20-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B5=D0=B9=20=D0=B2=20html.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nageSevice.java => BookManageService.java} | 2 +- ...ceImpl.java => BookManageServiceImpl.java} | 2 +- .../ru/otus/mkulikov/rest/BookController.java | 4 +- .../ru/otus/mkulikov/shell/BookCommands.java | 4 +- src/main/resources/templates/author.html | 11 +++++ src/main/resources/templates/comment.html | 10 +++++ src/main/resources/templates/comments.html | 4 ++ src/main/resources/templates/genre.html | 9 ++++ .../app/service/BookManageSeviceImplTest.java | 2 +- .../mkulikov/rest/AuthorControllerTest.java | 43 ++++++++++++++++++ .../mkulikov/rest/BookControllerTest.java | 6 +-- .../mkulikov/rest/CommentControllerTest.java | 44 +++++++++++++++++++ .../mkulikov/rest/GenreControllerTest.java | 44 +++++++++++++++++++ 13 files changed, 175 insertions(+), 10 deletions(-) rename src/main/java/ru/otus/mkulikov/app/service/{BookManageSevice.java => BookManageService.java} (90%) rename src/main/java/ru/otus/mkulikov/app/service/{BookManageSeviceImpl.java => BookManageServiceImpl.java} (97%) create mode 100644 src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java create mode 100644 src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java create mode 100644 src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java similarity index 90% rename from src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java rename to src/main/java/ru/otus/mkulikov/app/service/BookManageService.java index 5c09fd4..d89260c 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSevice.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java @@ -11,7 +11,7 @@ * Time: 13:42 */ -public interface BookManageSevice { +public interface BookManageService { T getBookById(String id); diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java similarity index 97% rename from src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java rename to src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java index f8a0f77..f145c12 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java @@ -22,7 +22,7 @@ @Service @RequiredArgsConstructor -public class BookManageSeviceImpl implements BookManageSevice { +public class BookManageServiceImpl implements BookManageService { private final BookDao bookDao; private final AuthorDao authorDao; diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java index 9d0603c..8380e04 100644 --- a/src/main/java/ru/otus/mkulikov/rest/BookController.java +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -8,7 +8,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.service.BookManageSevice; +import ru.otus.mkulikov.app.service.BookManageService; import java.util.List; @@ -16,7 +16,7 @@ @RequiredArgsConstructor public class BookController { - private final BookManageSevice bookManageSevice; + private final BookManageService bookManageSevice; @GetMapping("/book/list") public String getAll(Model model) { diff --git a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java index d5df2e2..21036c8 100644 --- a/src/main/java/ru/otus/mkulikov/shell/BookCommands.java +++ b/src/main/java/ru/otus/mkulikov/shell/BookCommands.java @@ -5,7 +5,7 @@ import org.springframework.shell.standard.ShellMethod; import org.springframework.shell.standard.ShellOption; import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.service.BookManageSevice; +import ru.otus.mkulikov.app.service.BookManageService; import java.util.List; @@ -20,7 +20,7 @@ @RequiredArgsConstructor public class BookCommands { - private final BookManageSevice bookManageSevice; + private final BookManageService bookManageSevice; @ShellMethod(key = {"getBookById"}, value = "Select book by id.") public String getBookById(@ShellOption String id) { diff --git a/src/main/resources/templates/author.html b/src/main/resources/templates/author.html index 72e705e..49b0f63 100644 --- a/src/main/resources/templates/author.html +++ b/src/main/resources/templates/author.html @@ -30,5 +30,16 @@

Author:

-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+

Edit

+
+

Id:

+

Surname:

+

FirstName:

+

SecondName:

+

+ +

+
+ \ No newline at end of file diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index da0bc2c..f110f33 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -60,5 +60,15 @@

Comment:

+

Edit

+
+

Id:

+

UserName:

+

Text:

+

+ +

+
+ \ No newline at end of file diff --git a/src/main/resources/templates/comments.html b/src/main/resources/templates/comments.html index d35ffd6..096a495 100644 --- a/src/main/resources/templates/comments.html +++ b/src/main/resources/templates/comments.html @@ -45,6 +45,7 @@

Comments:

Book UserName Text + Edit @@ -56,6 +57,9 @@

Comments:

John Doe John Doe + + ... + diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index cfe9b38..907b4ff 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -26,5 +26,14 @@

Genre:

+

Edit

+
+

Id:

+

Name:

+

+ +

+
+ \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index b685124..64a57f7 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -64,7 +64,7 @@ class BookManageSeviceImplTest { private GenreDao genreDao; @InjectMocks - private BookManageSeviceImpl booksManageSevice; + private BookManageServiceImpl booksManageSevice; @Test @DisplayName("Получение книги по id") diff --git a/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java new file mode 100644 index 0000000..1e29096 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java @@ -0,0 +1,43 @@ +package ru.otus.mkulikov.rest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import ru.otus.mkulikov.app.service.AuthorManageService; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@WebMvcTest(AuthorController.class) +public class AuthorControllerTest { + + @MockBean + private AuthorManageService authorManageService; + + @Autowired + private MockMvc mockMvc; + + @Test + public void getAll() throws Exception { + this.mockMvc.perform(get("/author/list")).andDo(print()).andExpect(status().isOk()) + .andExpect(content().string(containsString("Authors:"))); + } + + @Test + public void getById() throws Exception { + this.mockMvc.perform(get("/author")).andDo(print()).andExpect(status().isBadRequest()); + } + + @Test + public void edit() throws Exception { + this.mockMvc.perform(get("/author/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java index 03f30d8..7d4357c 100644 --- a/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java @@ -7,7 +7,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; -import ru.otus.mkulikov.app.service.BookManageSevice; +import ru.otus.mkulikov.app.service.BookManageService; import static org.hamcrest.Matchers.containsString; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; @@ -20,7 +20,7 @@ public class BookControllerTest { @MockBean - private BookManageSevice bookManageSevice; + private BookManageService bookManageService; @Autowired private MockMvc mockMvc; @@ -37,7 +37,7 @@ public void getById() throws Exception { } @Test - public void bookEdit() throws Exception { + public void edit() throws Exception { this.mockMvc.perform(get("/book/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java new file mode 100644 index 0000000..50bd3cf --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java @@ -0,0 +1,44 @@ +package ru.otus.mkulikov.rest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import ru.otus.mkulikov.app.service.AuthorManageService; +import ru.otus.mkulikov.app.service.CommentManageService; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@WebMvcTest(CommentController.class) +public class CommentControllerTest { + + @MockBean + private CommentManageService commentManageService; + + @Autowired + private MockMvc mockMvc; + + @Test + public void getAll() throws Exception { + this.mockMvc.perform(get("/comment/list")).andDo(print()).andExpect(status().isOk()) + .andExpect(content().string(containsString("Comments:"))); + } + + @Test + public void getById() throws Exception { + this.mockMvc.perform(get("/comment")).andDo(print()).andExpect(status().isBadRequest()); + } + + @Test + public void edit() throws Exception { + this.mockMvc.perform(get("/comment/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); + } +} \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java new file mode 100644 index 0000000..0c2af3f --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java @@ -0,0 +1,44 @@ +package ru.otus.mkulikov.rest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import ru.otus.mkulikov.app.service.AuthorManageService; +import ru.otus.mkulikov.app.service.GenreManageService; + +import static org.hamcrest.Matchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RunWith(SpringRunner.class) +@WebMvcTest(GenreController.class) +public class GenreControllerTest { + + @MockBean + private GenreManageService genreManageService; + + @Autowired + private MockMvc mockMvc; + + @Test + public void getAll() throws Exception { + this.mockMvc.perform(get("/genre/list")).andDo(print()).andExpect(status().isOk()) + .andExpect(content().string(containsString("Genres:"))); + } + + @Test + public void getById() throws Exception { + this.mockMvc.perform(get("/genre")).andDo(print()).andExpect(status().isBadRequest()); + } + + @Test + public void edit() throws Exception { + this.mockMvc.perform(get("/genre/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); + } +} \ No newline at end of file From d7c0d9873d00e980e8e5008c8f05b71ee2587e74 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 4 Sep 2019 01:39:07 +0300 Subject: [PATCH 59/70] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=B5=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20id=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB?= =?UTF-8?q?=20=D0=BD=D0=B0=20readonly.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/otus/mkulikov/rest/AuthorController.java | 6 ++++++ src/main/resources/templates/author.html | 2 +- src/main/resources/templates/authors.html | 8 ++++++++ src/main/resources/templates/book.html | 2 +- src/main/resources/templates/comment.html | 2 +- src/main/resources/templates/genre.html | 2 +- src/main/resources/templates/genres.html | 4 ++++ 7 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java index 56180d2..ce24189 100644 --- a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java +++ b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java @@ -38,4 +38,10 @@ public String edit(@ModelAttribute Author author, Model model) { model.addAttribute("author", updated); return "author"; } + + @PostMapping(value = "/author/delete") + public String delete(@RequestParam("id") String id, Model model) { + authorManageService.deleteAuthor(id); + return getAll(model); + } } diff --git a/src/main/resources/templates/author.html b/src/main/resources/templates/author.html index 49b0f63..e60ddcf 100644 --- a/src/main/resources/templates/author.html +++ b/src/main/resources/templates/author.html @@ -32,7 +32,7 @@

Author:

Edit

-

Id:

+

Id:

Surname:

FirstName:

SecondName:

diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index 26e0371..5f64cdc 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -44,6 +44,8 @@

Authors:

Surname FirstName SecondName + Edit + Delete @@ -52,6 +54,12 @@

Authors:

John Doe John Doe John Doe + + ... + + + ... + diff --git a/src/main/resources/templates/book.html b/src/main/resources/templates/book.html index d8e5c96..93e7593 100644 --- a/src/main/resources/templates/book.html +++ b/src/main/resources/templates/book.html @@ -40,7 +40,7 @@

Book:

Edit

-

Id:

+

Id:

Caption:

Description:

diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index f110f33..0cb31f8 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -62,7 +62,7 @@

Comment:

Edit

-

Id:

+

Id:

UserName:

Text:

diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index 907b4ff..e48a74b 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -28,7 +28,7 @@

Genre:

Edit

-

Id:

+

Id:

Name:

diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html index 06fe8e5..7f88a13 100644 --- a/src/main/resources/templates/genres.html +++ b/src/main/resources/templates/genres.html @@ -42,12 +42,16 @@

Genres:

ID Name + Edit 1 John Doe + + ... + From 37fc204460b6fce7eb5038d10ec97053035677b1 Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Wed, 18 Sep 2019 08:20:46 +0300 Subject: [PATCH 60/70] =?UTF-8?q?-=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20rest=20=D0=B4=D0=BB=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D1=81=D1=83=D1=89?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20Author.=20-=20=D0=94=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=86.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/otus/mkulikov/app/dao/BookDao.java | 3 + .../app/service/BookManageService.java | 2 + .../app/service/BookManageServiceImpl.java | 5 ++ .../ru/otus/mkulikov/config/WebMvcConfig.java | 24 +----- .../otus/mkulikov/rest/AuthorController.java | 23 ++++-- src/main/resources/static/css/header.css | 74 ++++++++++++++++++- src/main/resources/templates/author.html | 33 +++------ src/main/resources/templates/authors.html | 40 +++++++--- src/main/resources/templates/books.html | 10 +-- src/main/resources/templates/comments.html | 10 +-- src/main/resources/templates/genres.html | 10 +-- 11 files changed, 155 insertions(+), 79 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index e1c0754..cc1b14b 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -3,6 +3,8 @@ import org.springframework.data.mongodb.repository.MongoRepository; import ru.otus.mkulikov.app.model.Book; +import java.util.List; + /** * Created by IntelliJ IDEA. * Developer: Maksim Kulikov @@ -12,4 +14,5 @@ public interface BookDao extends MongoRepository { + List findByAuthor_Id(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java index d89260c..8af166a 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java @@ -15,6 +15,8 @@ public interface BookManageService { T getBookById(String id); + List getBookByAuthorId(String id); + List getBooks(); T addBook(String caption, String authorId, String genreId, String description); diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java index f145c12..34b7fb3 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java @@ -33,6 +33,11 @@ public Book getBookById(String id) { return bookDao.findById(id).orElseThrow(() -> new ObjectNotFound("Book", id)); } + @Override + public List getBookByAuthorId(String id) { + return bookDao.findByAuthor_Id(id); + } + @Override public List getBooks() { return bookDao.findAll(); diff --git a/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java b/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java index e72e897..a6eb5ac 100644 --- a/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java +++ b/src/main/java/ru/otus/mkulikov/config/WebMvcConfig.java @@ -1,36 +1,16 @@ package ru.otus.mkulikov.config; import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration +@EnableWebMvc public class WebMvcConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - // - // Access Bootstrap static resource: - // - - // - // http://somedomain/SomeContextPath/jquery/jquery.min.css - // - registry.addResourceHandler("/jquery/**") // - .addResourceLocations("classpath:/META-INF/resources/webjars/jquery/3.4.1/"); - - // - // http://somedomain/SomeContextPath/popper/popper.min.js - // - registry.addResourceHandler("/popper/**") // - .addResourceLocations("classpath:/META-INF/resources/webjars/popper.js/1.15.0/umd/"); - - // http://somedomain/SomeContextPath/bootstrap/css/bootstrap.min.css - // http://somedomain/SomeContextPath/bootstrap/js/bootstrap.min.js - // - registry.addResourceHandler("/bootstrap/**") // - .addResourceLocations("classpath:/META-INF/resources/webjars/bootstrap/4.3.1/"); - registry.addResourceHandler( "/webjars/**", "/img/**", diff --git a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java index ce24189..fb4a1f0 100644 --- a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java +++ b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java @@ -8,7 +8,9 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.service.AuthorManageService; +import ru.otus.mkulikov.app.service.BookManageService; import java.util.List; @@ -17,6 +19,7 @@ public class AuthorController { private final AuthorManageService authorManageService; + private final BookManageService bookManageService; @GetMapping("/author/list") public String getAll(Model model) { @@ -32,16 +35,24 @@ public String getById(@RequestParam("id") String id, Model model) { return "author"; } + @GetMapping("/author/new") + public String getNew() { + Author author = authorManageService.addAuthor("", "", ""); + return "redirect:/author?id=" + author.getId(); + } + @PostMapping(value = "/author/edit") - public String edit(@ModelAttribute Author author, Model model) { + public String edit(@ModelAttribute Author author) { Author updated = authorManageService.updateAuthor(author); - model.addAttribute("author", updated); - return "author"; + return "redirect:/author?id=" + updated.getId(); } @PostMapping(value = "/author/delete") - public String delete(@RequestParam("id") String id, Model model) { - authorManageService.deleteAuthor(id); - return getAll(model); + public String delete(@RequestParam("id") String id) { + List books = bookManageService.getBookByAuthorId(id); + if (books == null || (books != null && books.isEmpty())) { + authorManageService.deleteAuthor(id); + } + return "redirect:/author/list"; } } diff --git a/src/main/resources/static/css/header.css b/src/main/resources/static/css/header.css index 8463727..f1541bf 100644 --- a/src/main/resources/static/css/header.css +++ b/src/main/resources/static/css/header.css @@ -2,7 +2,79 @@ body { padding: 50px; } -table td { +.btns td { + border: 1px solid white; + padding: 5px; +} + +.objects td { border: 1px solid lightgray; padding: 5px; +} + +/*https://cssgradientbutton.com/#*/ +.button-new { + border:1px solid #96f0ff; -webkit-border-radius: 3px; -moz-border-radius: 3px;border-radius: 3px;font-size:12px;font-family:arial, helvetica, sans-serif; padding: 10px 10px 10px 10px; text-decoration:none; display:inline-block;font-weight:bold; color: #000000; + background-color: #cef8ff; background-image: -webkit-gradient(linear, left top, left bottom, from(#cef8ff), to(#7fe0f8)); + background-image: -webkit-linear-gradient(top, #cef8ff, #7fe0f8); + background-image: -moz-linear-gradient(top, #cef8ff, #7fe0f8); + background-image: -ms-linear-gradient(top, #cef8ff, #7fe0f8); + background-image: -o-linear-gradient(top, #cef8ff, #7fe0f8); + background-image: linear-gradient(to bottom, #cef8ff, #7fe0f8); + filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#cef8ff, endColorstr=#7fe0f8); +} + +.button-new:hover { + border:1px solid #68e9ff; + background-color: #9bf1ff; background-image: -webkit-gradient(linear, left top, left bottom, from(#9bf1ff), to(#4fd4f5)); + background-image: -webkit-linear-gradient(top, #9bf1ff, #4fd4f5); + background-image: -moz-linear-gradient(top, #9bf1ff, #4fd4f5); + background-image: -ms-linear-gradient(top, #9bf1ff, #4fd4f5); + background-image: -o-linear-gradient(top, #9bf1ff, #4fd4f5); + background-image: linear-gradient(to bottom, #9bf1ff, #4fd4f5); + filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#9bf1ff, endColorstr=#4fd4f5); +} + +.button { + border:1px solid #d1dcdf; -webkit-border-radius: 3px; -moz-border-radius: 3px;border-radius: 3px;font-size:12px;font-family:arial, helvetica, sans-serif; padding: 10px 10px 10px 10px; text-decoration:none; display:inline-block;font-weight:bold; color: #000000; + background-color: #f2f5f6; background-image: -webkit-gradient(linear, left top, left bottom, from(#f2f5f6), to(#c8d7dc)); + background-image: -webkit-linear-gradient(top, #f2f5f6, #c8d7dc); + background-image: -moz-linear-gradient(top, #f2f5f6, #c8d7dc); + background-image: -ms-linear-gradient(top, #f2f5f6, #c8d7dc); + background-image: -o-linear-gradient(top, #f2f5f6, #c8d7dc); + background-image: linear-gradient(to bottom, #f2f5f6, #c8d7dc); + filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#f2f5f6, endColorstr=#c8d7dc); +} + +.button:hover { + border:1px solid #b6c7cc; + background-color: #d4dee1; background-image: -webkit-gradient(linear, left top, left bottom, from(#d4dee1), to(#a9c0c8)); + background-image: -webkit-linear-gradient(top, #d4dee1, #a9c0c8); + background-image: -moz-linear-gradient(top, #d4dee1, #a9c0c8); + background-image: -ms-linear-gradient(top, #d4dee1, #a9c0c8); + background-image: -o-linear-gradient(top, #d4dee1, #a9c0c8); + background-image: linear-gradient(to bottom, #d4dee1, #a9c0c8); + filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#d4dee1, endColorstr=#a9c0c8); +} + +.button-table { + border:1px solid #d1dcdf; -webkit-border-radius: 3px; -moz-border-radius: 3px;border-radius: 3px;font-size:12px;font-family:arial, helvetica, sans-serif; padding: 3px 3px 3px 3px; text-decoration:none; display:inline-block;font-weight:bold; color: #000000; + background-color: #f2f5f6; background-image: -webkit-gradient(linear, left top, left bottom, from(#f2f5f6), to(#c8d7dc)); + background-image: -webkit-linear-gradient(top, #f2f5f6, #c8d7dc); + background-image: -moz-linear-gradient(top, #f2f5f6, #c8d7dc); + background-image: -ms-linear-gradient(top, #f2f5f6, #c8d7dc); + background-image: -o-linear-gradient(top, #f2f5f6, #c8d7dc); + background-image: linear-gradient(to bottom, #f2f5f6, #c8d7dc); + filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#f2f5f6, endColorstr=#c8d7dc); +} + +.button-table:hover { + border:1px solid #b6c7cc; + background-color: #d4dee1; background-image: -webkit-gradient(linear, left top, left bottom, from(#d4dee1), to(#a9c0c8)); + background-image: -webkit-linear-gradient(top, #d4dee1, #a9c0c8); + background-image: -moz-linear-gradient(top, #d4dee1, #a9c0c8); + background-image: -ms-linear-gradient(top, #d4dee1, #a9c0c8); + background-image: -o-linear-gradient(top, #d4dee1, #a9c0c8); + background-image: linear-gradient(to bottom, #d4dee1, #a9c0c8); + filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=#d4dee1, endColorstr=#a9c0c8); } \ No newline at end of file diff --git a/src/main/resources/templates/author.html b/src/main/resources/templates/author.html index e60ddcf..d983e3e 100644 --- a/src/main/resources/templates/author.html +++ b/src/main/resources/templates/author.html @@ -2,42 +2,27 @@ - List of all authors + Author detail - + - -

Author:

+ +

+ +

+ - - - - - - - - - - - - - - - - - -
IDSurnameFirstNameSecondName
1John DoeJohn DoeJohn Doe
+

Author detail:

-

Edit

Id:

Surname:

FirstName:

SecondName:

- +

diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index 5f64cdc..94fd61f 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -1,10 +1,14 @@ - + - + + + + List of all authors +

Authors:

@@ -15,37 +19,42 @@

Authors:

- +
- +
- +
- + +
+ + +
+
- +
- - + + @@ -55,10 +64,19 @@

Authors:

diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html index 550c31f..248913b 100644 --- a/src/main/resources/templates/books.html +++ b/src/main/resources/templates/books.html @@ -15,29 +15,29 @@

Books:

ID Surname FirstName SecondNameEditDelete
John Doe John Doe - ... +
+

+ + +

+
- ... +
+

+ +

+
- +
- +
- +
- +
- +
diff --git a/src/main/resources/templates/comments.html b/src/main/resources/templates/comments.html index 096a495..849ffcf 100644 --- a/src/main/resources/templates/comments.html +++ b/src/main/resources/templates/comments.html @@ -15,29 +15,29 @@

Comments:

ID
- +
- +
- +
- +
- +
diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html index 7f88a13..a615826 100644 --- a/src/main/resources/templates/genres.html +++ b/src/main/resources/templates/genres.html @@ -15,29 +15,29 @@

Genres:

ID
- +
- +
- +
- +
- +
From 6463d82784d2163ab81095f195aa3181aa353cb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Wed, 18 Sep 2019 17:16:42 +0300 Subject: [PATCH 61/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/rest/BookController.java | 13 +++++++++++++ src/main/resources/templates/author.html | 11 +++++++---- src/main/resources/templates/authors.html | 1 - src/main/resources/templates/book.html | 14 +++++++++++--- src/main/resources/templates/books.html | 10 +++++++++- src/main/resources/templates/comment.html | 14 +++++++++++--- src/main/resources/templates/comments.html | 10 +++++++++- src/main/resources/templates/genre.html | 14 +++++++++++--- src/main/resources/templates/genres.html | 10 +++++++++- 9 files changed, 80 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java index 8380e04..d5e8162 100644 --- a/src/main/java/ru/otus/mkulikov/rest/BookController.java +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -7,8 +7,12 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.service.AuthorManageService; import ru.otus.mkulikov.app.service.BookManageService; +import ru.otus.mkulikov.app.service.GenreManageService; import java.util.List; @@ -17,6 +21,8 @@ public class BookController { private final BookManageService bookManageSevice; + private final AuthorManageService authorManageService; + private final GenreManageService genreManageService; @GetMapping("/book/list") public String getAll(Model model) { @@ -38,4 +44,11 @@ public String edit(@ModelAttribute Book book, Model model) { model.addAttribute("book", updated); return "book"; } + + @GetMapping("/book/new") + public String getNew() { + List listAuthor = authorManageService.getAuthors(); + Book book = bookManageSevice.addBook("", "", "", ""); + return "redirect:/book?id=" + book.getId(); + } } diff --git a/src/main/resources/templates/author.html b/src/main/resources/templates/author.html index d983e3e..481b222 100644 --- a/src/main/resources/templates/author.html +++ b/src/main/resources/templates/author.html @@ -1,16 +1,19 @@ - + + + + Author detail - +

- +

@@ -22,7 +25,7 @@

Author detail:

FirstName:

SecondName:

- +

diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index 94fd61f..6323ad8 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -8,7 +8,6 @@ List of all authors -

Authors:

diff --git a/src/main/resources/templates/book.html b/src/main/resources/templates/book.html index 93e7593..4d58764 100644 --- a/src/main/resources/templates/book.html +++ b/src/main/resources/templates/book.html @@ -1,13 +1,21 @@ - - List of all books + + + + + Book detail - + +
+

+ +

+

Book:

diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html index 248913b..96c9b7f 100644 --- a/src/main/resources/templates/books.html +++ b/src/main/resources/templates/books.html @@ -1,7 +1,10 @@ - + + + + List of all books @@ -33,6 +36,11 @@

Books:

+
ID +
+ +
+
diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index 0cb31f8..c0c5630 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -1,13 +1,21 @@ - - List of all comments + + + + + Comment detail - + +
+

+ +

+

Comment:

diff --git a/src/main/resources/templates/comments.html b/src/main/resources/templates/comments.html index 849ffcf..78044be 100644 --- a/src/main/resources/templates/comments.html +++ b/src/main/resources/templates/comments.html @@ -1,7 +1,10 @@ - + + + + List of all comments @@ -33,6 +36,11 @@

Comments:

+ +
+ +
+ diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index e48a74b..6c2cbb3 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -1,13 +1,21 @@ - - List of all genres + + + + + Genre detail - + +
+

+ +

+

Genre:

diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html index a615826..cc9d745 100644 --- a/src/main/resources/templates/genres.html +++ b/src/main/resources/templates/genres.html @@ -1,7 +1,10 @@ - + + + + List of all genres @@ -33,6 +36,11 @@

Genres:

+ +
+ +
+ From 2fe0c2d8729e8b03022d641302fa5e1abd6c79bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Wed, 18 Sep 2019 18:17:11 +0300 Subject: [PATCH 62/70] =?UTF-8?q?=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=B2?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B0=20=D0=B8=20=D0=B6=D0=B0=D0=BD=D1=80?= =?UTF-8?q?=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BD=D0=B8=D0=B3=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/otus/mkulikov/rest/BookController.java | 12 +++++++++--- src/main/resources/templates/book.html | 10 +++++++++- src/main/resources/templates/comment.html | 2 +- src/main/resources/templates/genre.html | 2 +- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java index d5e8162..5edb4ae 100644 --- a/src/main/java/ru/otus/mkulikov/rest/BookController.java +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -46,9 +46,15 @@ public String edit(@ModelAttribute Book book, Model model) { } @GetMapping("/book/new") - public String getNew() { - List listAuthor = authorManageService.getAuthors(); + public String getNew(Model model) { + List authors = authorManageService.getAuthors(); + List genres = genreManageService.getGenres(); Book book = bookManageSevice.addBook("", "", "", ""); - return "redirect:/book?id=" + book.getId(); + + model.addAttribute("authors", authors); + model.addAttribute("genres", genres); + model.addAttribute("book", book); + + return "book"; } } diff --git a/src/main/resources/templates/book.html b/src/main/resources/templates/book.html index 4d58764..2682265 100644 --- a/src/main/resources/templates/book.html +++ b/src/main/resources/templates/book.html @@ -49,10 +49,18 @@

Book:

Edit

Id:

+ +

Caption:

Description:

- +

diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index c0c5630..85e6912 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -74,7 +74,7 @@

Edit

UserName:

Text:

- +

diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index 6c2cbb3..b83fef7 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -39,7 +39,7 @@

Edit

Id:

Name:

- +

From de886cf4d996818b004ea67cb87f7ce957a91ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Wed, 18 Sep 2019 18:24:08 +0300 Subject: [PATCH 63/70] =?UTF-8?q?=D0=A0=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BD?= =?UTF-8?q?=D0=B8=D0=B3=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D1=8F.=20=D0=A0?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B6=D0=B0=D0=BD=D1=80=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../otus/mkulikov/rest/CommentController.java | 16 ++++++++++++++++ src/main/resources/templates/comment.html | 4 ++++ src/main/resources/templates/genre.html | 18 +----------------- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/rest/CommentController.java b/src/main/java/ru/otus/mkulikov/rest/CommentController.java index f09329c..b4e90ac 100644 --- a/src/main/java/ru/otus/mkulikov/rest/CommentController.java +++ b/src/main/java/ru/otus/mkulikov/rest/CommentController.java @@ -7,7 +7,11 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.service.BookManageService; import ru.otus.mkulikov.app.service.CommentManageService; import java.util.List; @@ -16,6 +20,7 @@ @RequiredArgsConstructor public class CommentController { + private final BookManageService bookManageSevice; private final CommentManageService commentManageService; @GetMapping("/comment/list") @@ -38,4 +43,15 @@ public String edit(@ModelAttribute Comment comment, Model model) { model.addAttribute("comment", updated); return "comment"; } + + @GetMapping("/comment/new") + public String getNew(Model model) { + List books = bookManageSevice.getBooks(); + Comment comment = commentManageService.addComment("", "", ""); + + model.addAttribute("books", books); + model.addAttribute("comment", comment); + + return "comment"; + } } diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index 85e6912..08566d2 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -71,6 +71,10 @@

Comment:

Edit

Id:

+

UserName:

Text:

diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index b83fef7..e943990 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -17,24 +17,8 @@

-

Genre:

+

Genre detail:

- - - - - - - - - - - - - -
IDName
1John Doe
- -

Edit

Id:

Name:

From 7b1eda7f181738384eb11f37f8b3adda1bd0215c Mon Sep 17 00:00:00 2001 From: Maksim Kulikov Date: Thu, 19 Sep 2019 08:15:51 +0300 Subject: [PATCH 64/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/otus/mkulikov/app/dao/BookDao.java | 2 + .../app/service/BookManageService.java | 2 + .../app/service/BookManageServiceImpl.java | 12 ++-- .../app/service/CommentManageService.java | 2 + .../app/service/CommentManageServiceImpl.java | 14 ++-- .../ru/otus/mkulikov/rest/BookController.java | 35 +++++++++- .../otus/mkulikov/rest/CommentController.java | 20 +++++- .../otus/mkulikov/rest/GenreController.java | 18 +++++ src/main/resources/templates/book.html | 61 ++++++---------- src/main/resources/templates/books.html | 21 ++++-- src/main/resources/templates/comment.html | 70 ++++--------------- src/main/resources/templates/comments.html | 19 ++++- src/main/resources/templates/genre.html | 2 +- src/main/resources/templates/genres.html | 17 ++++- 14 files changed, 172 insertions(+), 123 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java index cc1b14b..c44a9bf 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/BookDao.java @@ -15,4 +15,6 @@ public interface BookDao extends MongoRepository { List findByAuthor_Id(String id); + + List findByGenre_Id(String id); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java index 8af166a..48991bd 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageService.java @@ -17,6 +17,8 @@ public interface BookManageService { List getBookByAuthorId(String id); + List getBookByGenreId(String id); + List getBooks(); T addBook(String caption, String authorId, String genreId, String description); diff --git a/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java index 34b7fb3..87e1e97 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/BookManageServiceImpl.java @@ -38,6 +38,11 @@ public List getBookByAuthorId(String id) { return bookDao.findByAuthor_Id(id); } + @Override + public List getBookByGenreId(String id) { + return bookDao.findByGenre_Id(id); + } + @Override public List getBooks() { return bookDao.findAll(); @@ -67,11 +72,8 @@ public Book updateBook(String id, String caption, String authorId, String genreI @Override public Book updateBook(Book book) { - Book orig = bookDao.findById(book.getId()).orElseThrow(() -> new ObjectNotFound("Book", book.getId())); - orig.setCaption(book.getCaption()); - orig.setDescription(book.getDescription()); - - return bookDao.save(orig); + book.setAddRecordDate(new Date()); + return bookDao.save(book); } @Override diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java index 80ff9dc..1618f08 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageService.java @@ -25,4 +25,6 @@ public interface CommentManageService { T updateComment(T t); int deleteComment(String id); + + int deleteComments(List list); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java index 8b32f8c..ee0ffce 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/CommentManageServiceImpl.java @@ -59,12 +59,8 @@ public Comment updateComment(String id, String userName, String text) { @Override public Comment updateComment(Comment comment) { - Comment orig = commentDao.findById(comment.getId()).orElseThrow(() -> new ObjectNotFound("Comment", comment.getId())); - orig.setAddRecordDate(new Date()); - orig.setUserName(comment.getUserName()); - orig.setText(comment.getText()); - - return commentDao.save(orig); + comment.setAddRecordDate(new Date()); + return commentDao.save(comment); } @Override @@ -72,4 +68,10 @@ public int deleteComment(String id) { commentDao.deleteById(id); return 1; } + + @Override + public int deleteComments(List list) { + commentDao.deleteAll(list); + return 1; + } } diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java index 5edb4ae..167bbf6 100644 --- a/src/main/java/ru/otus/mkulikov/rest/BookController.java +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -9,9 +9,11 @@ import org.springframework.web.bind.annotation.RequestParam; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.service.AuthorManageService; import ru.otus.mkulikov.app.service.BookManageService; +import ru.otus.mkulikov.app.service.CommentManageService; import ru.otus.mkulikov.app.service.GenreManageService; import java.util.List; @@ -23,6 +25,7 @@ public class BookController { private final BookManageService bookManageSevice; private final AuthorManageService authorManageService; private final GenreManageService genreManageService; + private final CommentManageService commentManageService; @GetMapping("/book/list") public String getAll(Model model) { @@ -33,15 +36,27 @@ public String getAll(Model model) { @GetMapping("/book") public String getById(@RequestParam("id") String id, Model model) { + List authors = authorManageService.getAuthors(); + List genres = genreManageService.getGenres(); Book book = bookManageSevice.getBookById(id); + model.addAttribute("book", book); + model.addAttribute("authors", authors); + model.addAttribute("genres", genres); + return "book"; } @PostMapping(value = "/book/edit") public String edit(@ModelAttribute Book book, Model model) { + List authors = authorManageService.getAuthors(); + List genres = genreManageService.getGenres(); Book updated = bookManageSevice.updateBook(book); + model.addAttribute("book", updated); + model.addAttribute("authors", authors); + model.addAttribute("genres", genres); + return "book"; } @@ -49,12 +64,28 @@ public String edit(@ModelAttribute Book book, Model model) { public String getNew(Model model) { List authors = authorManageService.getAuthors(); List genres = genreManageService.getGenres(); - Book book = bookManageSevice.addBook("", "", "", ""); + String authorId = (authors != null && !authors.isEmpty()) + ? authors.get(0).getId() + : ""; + String genreId = (genres != null && !genres.isEmpty()) + ? genres.get(0).getId() + : ""; + + Book book = bookManageSevice.addBook("", authorId, genreId, ""); + + model.addAttribute("book", book); model.addAttribute("authors", authors); model.addAttribute("genres", genres); - model.addAttribute("book", book); return "book"; } + + @PostMapping(value = "/book/delete") + public String delete(@RequestParam("id") String id) { + List comments = commentManageService.getCommentsByBookId(id); + commentManageService.deleteComments(comments); + bookManageSevice.deleteBook(id); + return "redirect:/book/list"; + } } diff --git a/src/main/java/ru/otus/mkulikov/rest/CommentController.java b/src/main/java/ru/otus/mkulikov/rest/CommentController.java index b4e90ac..bce898a 100644 --- a/src/main/java/ru/otus/mkulikov/rest/CommentController.java +++ b/src/main/java/ru/otus/mkulikov/rest/CommentController.java @@ -32,26 +32,44 @@ public String getAll(Model model) { @GetMapping("/comment") public String getById(@RequestParam("id") String id, Model model) { + List books = bookManageSevice.getBooks(); Comment comment = commentManageService.getCommentById(id); + + model.addAttribute("books", books); model.addAttribute("comment", comment); + return "comment"; } @PostMapping(value = "/comment/edit") public String edit(@ModelAttribute Comment comment, Model model) { + List books = bookManageSevice.getBooks(); Comment updated = commentManageService.updateComment(comment); + + model.addAttribute("books", books); model.addAttribute("comment", updated); + return "comment"; } @GetMapping("/comment/new") public String getNew(Model model) { List books = bookManageSevice.getBooks(); - Comment comment = commentManageService.addComment("", "", ""); + + String bookId = (books != null && !books.isEmpty()) + ? books.get(0).getId() + : ""; + Comment comment = commentManageService.addComment(bookId, "", ""); model.addAttribute("books", books); model.addAttribute("comment", comment); return "comment"; } + + @PostMapping(value = "/comment/delete") + public String delete(@RequestParam("id") String id) { + commentManageService.deleteComment(id); + return "redirect:/comment/list"; + } } diff --git a/src/main/java/ru/otus/mkulikov/rest/GenreController.java b/src/main/java/ru/otus/mkulikov/rest/GenreController.java index c17dfe7..0e3fc85 100644 --- a/src/main/java/ru/otus/mkulikov/rest/GenreController.java +++ b/src/main/java/ru/otus/mkulikov/rest/GenreController.java @@ -7,7 +7,9 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; +import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.service.BookManageService; import ru.otus.mkulikov.app.service.GenreManageService; import java.util.List; @@ -16,6 +18,7 @@ @RequiredArgsConstructor public class GenreController { + private final BookManageService bookManageService; private final GenreManageService genreManageService; @GetMapping("/genre/list") @@ -32,10 +35,25 @@ public String getById(@RequestParam("id") String id, Model model) { return "genre"; } + @GetMapping("/genre/new") + public String getNew() { + Genre genre = genreManageService.addGenre(""); + return "redirect:/genre?id=" + genre.getId(); + } + @PostMapping(value = "/genre/edit") public String edit(@ModelAttribute Genre genre, Model model) { Genre updated = genreManageService.updateGenre(genre); model.addAttribute("genre", updated); return "genre"; } + + @PostMapping(value = "/genre/delete") + public String delete(@RequestParam("id") String id) { + List books = bookManageService.getBookByGenreId(id); + if (books == null || (books != null && books.isEmpty())) { + genreManageService.deleteGenre(id); + } + return "redirect:/genre/list"; + } } diff --git a/src/main/resources/templates/book.html b/src/main/resources/templates/book.html index 2682265..602d475 100644 --- a/src/main/resources/templates/book.html +++ b/src/main/resources/templates/book.html @@ -17,50 +17,29 @@

-

Book:

+

Book detail:

- - - - - - - - - - - - - - - - - - - - - -
IDDateCaptionDescriptionAuthorGenre
1John DoeJohn DoeJohn Doe - View - - View -
- -

Edit

-
+

Id:

- - -

Caption:

-

Description:

+ +

Author:

+ +

Genre:

+ +

Caption:

+

Description:

- +

diff --git a/src/main/resources/templates/books.html b/src/main/resources/templates/books.html index 96c9b7f..6d792b3 100644 --- a/src/main/resources/templates/books.html +++ b/src/main/resources/templates/books.html @@ -54,7 +54,8 @@

Books:

Description Author Genre - Edit + + @@ -64,13 +65,25 @@

Books:

John Doe John Doe - View + - View + - ... +
+

+ + +

+
+ + +
+

+ +

+
diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index 08566d2..9d6f12e 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -17,68 +17,22 @@

-

Comment:

+

Comment detail:

- - - - - - - - - - -
-
- -
-
-
- -
-
-
- -
-
-
- -
-
- - - - - - - - - - - - - - - - - - -
IDAddRecordDateBookUserNameText
1John Doe - View - John DoeJohn Doe
- -

Edit

Id:

- -

UserName:

-

Text:

+ +

Book:

+ +

UserName:

+

Text:

- +

diff --git a/src/main/resources/templates/comments.html b/src/main/resources/templates/comments.html index 78044be..90a696a 100644 --- a/src/main/resources/templates/comments.html +++ b/src/main/resources/templates/comments.html @@ -53,7 +53,8 @@

Comments:

Book UserName Text - Edit + + @@ -61,12 +62,24 @@

Comments:

1 John Doe - View + John Doe John Doe - ... +
+

+ + +

+
+ + +
+

+ +

+
diff --git a/src/main/resources/templates/genre.html b/src/main/resources/templates/genre.html index e943990..84a31df 100644 --- a/src/main/resources/templates/genre.html +++ b/src/main/resources/templates/genre.html @@ -23,7 +23,7 @@

Genre detail:

Id:

Name:

- +

diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html index cc9d745..d8f3973 100644 --- a/src/main/resources/templates/genres.html +++ b/src/main/resources/templates/genres.html @@ -50,7 +50,8 @@

Genres:

ID Name - Edit + + @@ -58,7 +59,19 @@

Genres:

1 John Doe - ... +
+

+ + +

+
+ + +
+

+ +

+
From 186f7a63d58a05a8318527ef61cda06b336a225a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Thu, 19 Sep 2019 14:30:55 +0300 Subject: [PATCH 65/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=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 --- .../ru/otus/mkulikov/app/dao/CommentDao.java | 3 - .../app/service/GenreManageServiceImpl.java | 5 +- .../otus/mkulikov/rest/AuthorController.java | 4 +- .../ru/otus/mkulikov/rest/BookController.java | 2 +- .../otus/mkulikov/rest/CommentController.java | 4 +- .../otus/mkulikov/rest/GenreController.java | 2 +- .../ru/otus/mkulikov/app/dao/BookDaoTest.java | 20 ++++++- .../service/AuthorManageSeviceImplTest.java | 21 +++++++ .../app/service/BookManageSeviceImplTest.java | 59 +++++++++++++++++-- .../service/CommentManageSeviceImplTest.java | 19 +++++- .../service/GenreManageSeviceImplTest.java | 18 ++++++ .../mkulikov/rest/AuthorControllerTest.java | 39 ++++++++++-- .../mkulikov/rest/CommentControllerTest.java | 1 - .../mkulikov/rest/GenreControllerTest.java | 1 - 14 files changed, 171 insertions(+), 27 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java index 27ef753..aeb0f7d 100644 --- a/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java +++ b/src/main/java/ru/otus/mkulikov/app/dao/CommentDao.java @@ -15,8 +15,5 @@ public interface CommentDao extends MongoRepository { -// @Query(value = "{ 'book.id' : ?0 }") -// List findByBook(long id); - List findByBook(Book book); } diff --git a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java index 3242783..53bb46b 100644 --- a/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java +++ b/src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java @@ -46,10 +46,7 @@ public Genre updateGenre(String id, String name) { @Override public Genre updateGenre(Genre genre) { - Genre orig = genreDao.findById(genre.getId()).orElseThrow(() -> new ObjectNotFound("Genre", genre.getId())); - orig.setName(genre.getName()); - - return genreDao.save(orig); + return genreDao.save(genre); } @Override diff --git a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java index fb4a1f0..83f5038 100644 --- a/src/main/java/ru/otus/mkulikov/rest/AuthorController.java +++ b/src/main/java/ru/otus/mkulikov/rest/AuthorController.java @@ -43,8 +43,8 @@ public String getNew() { @PostMapping(value = "/author/edit") public String edit(@ModelAttribute Author author) { - Author updated = authorManageService.updateAuthor(author); - return "redirect:/author?id=" + updated.getId(); + authorManageService.updateAuthor(author); + return "redirect:/author/list"; } @PostMapping(value = "/author/delete") diff --git a/src/main/java/ru/otus/mkulikov/rest/BookController.java b/src/main/java/ru/otus/mkulikov/rest/BookController.java index 167bbf6..c7c8dbf 100644 --- a/src/main/java/ru/otus/mkulikov/rest/BookController.java +++ b/src/main/java/ru/otus/mkulikov/rest/BookController.java @@ -57,7 +57,7 @@ public String edit(@ModelAttribute Book book, Model model) { model.addAttribute("authors", authors); model.addAttribute("genres", genres); - return "book"; + return "redirect:/book/list"; } @GetMapping("/book/new") diff --git a/src/main/java/ru/otus/mkulikov/rest/CommentController.java b/src/main/java/ru/otus/mkulikov/rest/CommentController.java index bce898a..4e98ccd 100644 --- a/src/main/java/ru/otus/mkulikov/rest/CommentController.java +++ b/src/main/java/ru/otus/mkulikov/rest/CommentController.java @@ -7,10 +7,8 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; -import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.service.BookManageService; import ru.otus.mkulikov.app.service.CommentManageService; @@ -49,7 +47,7 @@ public String edit(@ModelAttribute Comment comment, Model model) { model.addAttribute("books", books); model.addAttribute("comment", updated); - return "comment"; + return "redirect:/comment/list"; } @GetMapping("/comment/new") diff --git a/src/main/java/ru/otus/mkulikov/rest/GenreController.java b/src/main/java/ru/otus/mkulikov/rest/GenreController.java index 0e3fc85..7683485 100644 --- a/src/main/java/ru/otus/mkulikov/rest/GenreController.java +++ b/src/main/java/ru/otus/mkulikov/rest/GenreController.java @@ -45,7 +45,7 @@ public String getNew() { public String edit(@ModelAttribute Genre genre, Model model) { Genre updated = genreManageService.updateGenre(genre); model.addAttribute("genre", updated); - return "genre"; + return "redirect:/genre/list"; } @PostMapping(value = "/genre/delete") diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java index aac51cf..997a3ff 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java @@ -33,6 +33,7 @@ class BookDaoTest { private final String ID_3 = "3"; private final String ID_4 = "4"; + private final int OBJECT_COUNT_1 = 1; private final int OBJECT_COUNT_2 = 2; private final String SURNAME = "Surname"; @@ -79,6 +80,24 @@ void getById() { assertThat(book).contains(getBook(ID_1)); } + @Test + @DisplayName("Получение книг по id автора") + void getByAuthorId() { + List books = bookDaoJpa.findByAuthor_Id(ID_1); + + assertThat(books).isNotEmpty(); + assertThat(books).size().isEqualTo(OBJECT_COUNT_1); + } + + @Test + @DisplayName("Получение книг по id жанра") + void getByGenreId() { + List books = bookDaoJpa.findByGenre_Id(ID_1); + + assertThat(books).isNotEmpty(); + assertThat(books).size().isEqualTo(OBJECT_COUNT_2); + } + @Test @DisplayName("Получение всех книг") void getAllObjects() { @@ -105,7 +124,6 @@ void addObject() { void deleteObject() { bookDaoJpa.deleteById(ID_1); Optional book = bookDaoJpa.findById(ID_1); -// assertThat(book).isNotEmpty(); assertThat(book).isEmpty(); } diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 0e39526..53eb9e4 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -113,6 +113,27 @@ public Author answer(InvocationOnMock invocationOnMock) throws Throwable { assertThat(author2).isEqualTo(getAuthor(ID_1)); } + @Test + @DisplayName("Обновление автора объектом") + void updateAuthorByObject() { + when(authorDao.save(any(Author.class))).then(new Answer() { + + @Override + public Author answer(InvocationOnMock invocationOnMock) throws Throwable { + Author author = (Author) invocationOnMock.getArgument(0); + author.setId(ID_1); + return author; + } + }); + when(authorDao.findById(anyString())).thenReturn(Optional.of(getAuthor(ID_1))); + + Author author1 = authorManageService.updateAuthor(getAuthor(ID_1)); + Author author2 = authorManageService.getAuthorById(ID_1); + + assertThat(author1).isNotNull(); + assertThat(author2).isEqualTo(getAuthor(ID_1)); + } + @Test @DisplayName("Удаление автора, который используется в таблице книг") void deleteAuthor() { diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index 64a57f7..eda0b1e 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -43,6 +43,7 @@ class BookManageSeviceImplTest { private final String ID_2 = "2"; private final String ID_3 = "3"; + private final int OBJECT_COUNT_1 = 1; private final int OBJECT_COUNT_3 = 3; private final String GENRE_NAME = "Genre"; @@ -82,11 +83,43 @@ void getBookById() { void getBooks() { List list = getBooksList(); when(bookDao.findAll()).thenReturn(list); - List comments = booksManageSevice.getBooks(); + List books = booksManageSevice.getBooks(); - assertThat(comments).isNotNull(); - assertThat(comments).hasSize(OBJECT_COUNT_3); - assertThat(comments).containsAll(list); + assertThat(books).isNotNull(); + assertThat(books).hasSize(OBJECT_COUNT_3); + assertThat(books).containsAll(list); + } + + @Test + @DisplayName("Получение книг по id автора") + void getBooksByAuthorId() { + Book book = getBook(ID_1); + + List list = new ArrayList<>(); + list.add(book); + + when(bookDao.findByAuthor_Id(anyString())).thenReturn(list); + List books = booksManageSevice.getBookByAuthorId(ID_1); + + assertThat(books).isNotNull(); + assertThat(books).hasSize(OBJECT_COUNT_1); + assertThat(books).contains(book); + } + + @Test + @DisplayName("Получение книг по id жанра") + void getBooksByGenreId() { + Book book = getBook(ID_1); + + List list = new ArrayList<>(); + list.add(book); + + when(bookDao.findByGenre_Id(anyString())).thenReturn(list); + List books = booksManageSevice.getBookByGenreId(ID_1); + + assertThat(books).isNotNull(); + assertThat(books).hasSize(OBJECT_COUNT_1); + assertThat(books).contains(book); } @Test @@ -131,6 +164,24 @@ public Book answer(InvocationOnMock invocationOnMock) throws Throwable { assertThat(book.getId()).isEqualTo(ID_1); } + @Test + @DisplayName("Обновление книги объектом") + void updateBookByObject() { + when(bookDao.save(any(Book.class))).then(new Answer() { + + @Override + public Book answer(InvocationOnMock invocationOnMock) throws Throwable { + Book book = (Book) invocationOnMock.getArgument(0); + book.setId(ID_1); + return book; + } + }); + Book book = booksManageSevice.updateBook(getBook(ID_1)); + + assertThat(book).isNotNull(); + assertThat(book.getId()).isEqualTo(ID_1); + } + @Test @DisplayName("Удаление книги по id") void deleteBook() { diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index efa035c..df33121 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -1,6 +1,5 @@ package ru.otus.mkulikov.app.service; -import org.junit.Ignore; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -151,6 +150,24 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { assertThat(comment.getId()).isEqualTo(ID_1); } + @Test + @DisplayName("Обновление комментария объектом") + void updateCommentByObject() { + when(commentDao.save(any(Comment.class))).then(new Answer() { + + @Override + public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { + Comment comment = (Comment) invocationOnMock.getArgument(0); + comment.setId(ID_1); + return comment; + } + }); + Comment comment = commentManageService.updateComment(getComment(ID_1)); + + assertThat(comment).isNotNull(); + assertThat(comment.getId()).isEqualTo(ID_1); + } + @Test @DisplayName("Удаление комментария") void deleteComment() { diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index 8ff4dd6..c4b560d 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -108,6 +108,24 @@ public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { assertThat(genre.getId()).isEqualTo(ID_1); } + @Test + @DisplayName("Обновление жанра объектом") + void updateGenreByObject() { + when(genreDao.save(any(Genre.class))).then(new Answer() { + + @Override + public Genre answer(InvocationOnMock invocationOnMock) throws Throwable { + Genre genre = (Genre) invocationOnMock.getArgument(0); + genre.setId(ID_1); + return genre; + } + }); + Genre genre = genreManageService.updateGenre(getGenre(ID_1)); + + assertThat(genre).isNotNull(); + assertThat(genre.getId()).isEqualTo(ID_1); + } + @Test @DisplayName("Удаление жанра, который используется в таблице книг") void deleteGenre() { diff --git a/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java index 1e29096..4acd0fc 100644 --- a/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java @@ -1,43 +1,72 @@ package ru.otus.mkulikov.rest; import org.junit.Test; +import org.junit.jupiter.api.DisplayName; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.service.AuthorManageService; +import ru.otus.mkulikov.app.service.BookManageService; import static org.hamcrest.Matchers.containsString; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringRunner.class) +@DisplayName("Класс rest-контроллеров для автора") @WebMvcTest(AuthorController.class) public class AuthorControllerTest { + private final String SURNAME = "Surname"; + private final String FIRST_NAME = "FirstName"; + private final String SECOND_NAME = "SecondName"; + @MockBean private AuthorManageService authorManageService; + @MockBean + private BookManageService bookManageService; @Autowired private MockMvc mockMvc; @Test + @DisplayName("Получение всех авторов") public void getAll() throws Exception { - this.mockMvc.perform(get("/author/list")).andDo(print()).andExpect(status().isOk()) + this.mockMvc.perform(get("/author/list")) + .andDo(print()) + .andExpect(status().isOk()) .andExpect(content().string(containsString("Authors:"))); } @Test + @DisplayName("Получение автора по id") public void getById() throws Exception { - this.mockMvc.perform(get("/author")).andDo(print()).andExpect(status().isBadRequest()); + when(authorManageService.getAuthorById(anyString())).thenReturn(getAuthor("1")); + + this.mockMvc.perform(get("/author").param("id", "1")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Author detail:"))); } - @Test - public void edit() throws Exception { - this.mockMvc.perform(get("/author/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); +// @Test +// @DisplayName("Редактирование автора") +// public void edit() throws Exception { +// this.mockMvc.perform(get("/author/edit")) +// .andDo(print()) +// .andExpect(status().isOk()) +// .andExpect(content().string(containsString("Authors:"))); +// } + + private Author getAuthor(String id) { + return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java index 50bd3cf..b575c31 100644 --- a/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java @@ -7,7 +7,6 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; -import ru.otus.mkulikov.app.service.AuthorManageService; import ru.otus.mkulikov.app.service.CommentManageService; import static org.hamcrest.Matchers.containsString; diff --git a/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java index 0c2af3f..18d5544 100644 --- a/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java @@ -7,7 +7,6 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; -import ru.otus.mkulikov.app.service.AuthorManageService; import ru.otus.mkulikov.app.service.GenreManageService; import static org.hamcrest.Matchers.containsString; From 6b919811d485571c920d32687019e87e782257bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Thu, 19 Sep 2019 15:20:55 +0300 Subject: [PATCH 66/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=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 --- src/main/resources/templates/authors.html | 4 ++ src/main/resources/templates/genres.html | 4 ++ .../otus/mkulikov/app/dao/AuthorDaoTest.java | 21 ++------ .../ru/otus/mkulikov/app/dao/BookDaoTest.java | 40 ++++------------ .../otus/mkulikov/app/dao/CommentDaoTest.java | 48 +++---------------- .../otus/mkulikov/app/dao/GenreDaoTest.java | 18 ++----- .../service/AuthorManageSeviceImplTest.java | 26 +++------- .../app/service/BookManageSeviceImplTest.java | 36 ++------------ .../service/CommentManageSeviceImplTest.java | 47 +++--------------- .../service/GenreManageSeviceImplTest.java | 15 +----- .../mkulikov/generators/GenerateAuthor.java | 29 +++++++++++ .../mkulikov/generators/GenerateBook.java | 40 ++++++++++++++++ .../mkulikov/generators/GenerateComment.java | 39 +++++++++++++++ .../mkulikov/generators/GenerateGenre.java | 27 +++++++++++ .../mkulikov/rest/AuthorControllerTest.java | 5 +- 15 files changed, 183 insertions(+), 216 deletions(-) create mode 100644 src/test/java/ru/otus/mkulikov/generators/GenerateAuthor.java create mode 100644 src/test/java/ru/otus/mkulikov/generators/GenerateBook.java create mode 100644 src/test/java/ru/otus/mkulikov/generators/GenerateComment.java create mode 100644 src/test/java/ru/otus/mkulikov/generators/GenerateGenre.java diff --git a/src/main/resources/templates/authors.html b/src/main/resources/templates/authors.html index 6323ad8..94ff040 100644 --- a/src/main/resources/templates/authors.html +++ b/src/main/resources/templates/authors.html @@ -81,5 +81,9 @@

Authors:

+
+Сущности, у которых есть связи с другими объектами, удаляться не будут +
+ \ No newline at end of file diff --git a/src/main/resources/templates/genres.html b/src/main/resources/templates/genres.html index d8f3973..1dda84c 100644 --- a/src/main/resources/templates/genres.html +++ b/src/main/resources/templates/genres.html @@ -77,5 +77,9 @@

Genres:

+
+Сущности, у которых есть связи с другими объектами, удаляться не будут +
+ \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java index f5180f2..78b3e55 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java @@ -9,11 +9,12 @@ import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthor; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthorList; /** * Created by IntelliJ IDEA. @@ -34,10 +35,6 @@ class AuthorDaoTest { private final int OBJECT_COUNT_3 = 3; private final int OBJECT_COUNT_2 = 2; - private final String SURNAME = "Surname"; - private final String FIRST_NAME = "FirstName"; - private final String SECOND_NAME = "SecondName"; - private final String TEST_SURNAME = "TestSurname"; private final String TEST_FIRST_NAME = "TestFirstName"; private final String TEST_SECOND_NAME = "TestSecondName"; @@ -67,7 +64,7 @@ void getAllObjects() { List authors = authorDao.findAll(); assertThat(authors).size().isEqualTo(OBJECT_COUNT_3); - assertThat(authors).containsAll(getAuthors()); + assertThat(authors).containsAll(getAuthorList()); } @Test @@ -99,16 +96,4 @@ void updateObject() { assertThat(author_selected).isNotEmpty(); assertThat(author_selected).contains(author); } - - private Author getAuthor(String id) { - return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); - } - - private List getAuthors() { - List authors = new ArrayList<>(); - authors.add(getAuthor(ID_1)); - authors.add(getAuthor(ID_2)); - authors.add(getAuthor(ID_3)); - return authors; - } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java index 997a3ff..c09ef1c 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java @@ -10,12 +10,15 @@ import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.utils.DateUtil; -import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthor; +import static ru.otus.mkulikov.generators.GenerateBook.getBook; +import static ru.otus.mkulikov.generators.GenerateBook.getBooksList; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenre; /** * Created by IntelliJ IDEA. @@ -35,17 +38,11 @@ class BookDaoTest { private final int OBJECT_COUNT_1 = 1; private final int OBJECT_COUNT_2 = 2; + private final int OBJECT_COUNT_3 = 3; - private final String SURNAME = "Surname"; - private final String FIRST_NAME = "FirstName"; - private final String SECOND_NAME = "SecondName"; - - private final String GENRE_NAME = "GenreName"; private final String DATE_TIME = "2019-01-01 10:01:01"; - private final String BOOK_NAME = "BookName"; private final String UPDATED_BOOK_NAME = "UpdatedBookName"; - private final String DESCRIPTION = "Description"; private final String UPDATED_DESCRIPTION = "UpdatedDescription"; @Autowired @@ -69,6 +66,7 @@ void init() { bookDaoJpa.save(getBook(ID_1)); bookDaoJpa.save(getBook(ID_2)); + bookDaoJpa.save(getBook(ID_3)); } @Test @@ -103,8 +101,8 @@ void getByGenreId() { void getAllObjects() { List books = bookDaoJpa.findAll(); - assertThat(books).size().isEqualTo(OBJECT_COUNT_2); - assertThat(books).containsAll(getBooks()); + assertThat(books).size().isEqualTo(OBJECT_COUNT_3); + assertThat(books).containsAll(getBooksList()); } @Test @@ -139,28 +137,6 @@ void updateObject() { assertThat(book_selected).contains(book); } - private Book getBook(String id) { - Author author = getAuthor(id); - Genre genre = getGenre(id); - Date date = DateUtil.stringToDateTime(DATE_TIME); - return new Book(id, date, BOOK_NAME, author, genre, DESCRIPTION); - } - - private Author getAuthor(String id) { - return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); - } - - private Genre getGenre(String id) { - return new Genre(id, GENRE_NAME + id); - } - - private List getBooks() { - List books = new ArrayList(); - books.add(getBook(ID_1)); - books.add(getBook(ID_2)); - return books; - } - private Book getUpdatedBook() { Author author = authorDao.findById(ID_1).orElse(null); Genre genre = genreDao.findById(ID_1).orElse(null); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java index 69ff5dd..ffae5d0 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java @@ -5,18 +5,20 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; -import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; -import ru.otus.mkulikov.app.model.Genre; import ru.otus.mkulikov.app.utils.DateUtil; -import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthor; +import static ru.otus.mkulikov.generators.GenerateBook.getBook; +import static ru.otus.mkulikov.generators.GenerateComment.getComment; +import static ru.otus.mkulikov.generators.GenerateComment.getCommentList; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenre; /** * Created by IntelliJ IDEA. @@ -39,20 +41,12 @@ class CommentDaoTest { private final int OBJECT_COUNT_2 = 2; private final String DATE_TIME = "2019-01-01 10:01:01"; - private final String GENRE_NAME = "GenreName"; private final String COMMENT_USER_NAME = "user"; private final String COMMENT_UPDATED_USER_NAME = "TestUser"; private final String COMMENT_TEXT = "text"; private final String COMMENT_UPDATED_TEXT = "TestText"; - private final String AUTHOR_SURNAME = "Surname"; - private final String AUTHOR_FIRST_NAME = "FirstName"; - private final String AUTHOR_SECOND_NAME = "SecondName"; - - private final String BOOK_NAME = "BookName"; - private final String BOOK_DESCRIPTION = "Description"; - @Autowired private AuthorDao authorDao; @@ -100,7 +94,7 @@ void getAllObjects() { assertThat(comments).isNotEmpty(); assertThat(comments).size().isEqualTo(OBJECT_COUNT_4); - assertThat(comments).containsAll(getComments()); + assertThat(comments).containsAll(getCommentList()); } @Test @@ -147,36 +141,6 @@ void updateObject() { assertThat(comment_selected).contains(comment); } - private Comment getComment(String id, String bookId) { - Date date = DateUtil.stringToDateTime(DATE_TIME); - Book book = getBook(bookId); - return new Comment(id, book, date, COMMENT_USER_NAME + id, COMMENT_TEXT + id); - } - - private Book getBook(String id) { - Author author = getAuthor(id); - Genre genre = getGenre(id); - Date date = DateUtil.stringToDateTime(DATE_TIME); - return new Book(id, date, BOOK_NAME, author, genre, BOOK_DESCRIPTION); - } - - private Author getAuthor(String id) { - return new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); - } - - private Genre getGenre(String id) { - return new Genre(id, GENRE_NAME + id); - } - - private List getComments() { - List comments = new ArrayList(); - comments.add(getComment(ID_1, ID_1)); - comments.add(getComment(ID_2, ID_1)); - comments.add(getComment(ID_3, ID_2)); - comments.add(getComment(ID_4, ID_2)); - return comments; - } - private Comment getUpdatedComment() { Comment comment = commentDao.findById(ID_1).orElse(null); comment.setAddRecordDate(new Date()); diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java index 3b93864..c9790ea 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java @@ -9,11 +9,12 @@ import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; -import java.util.ArrayList; import java.util.List; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenre; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenreList; /** * Created by IntelliJ IDEA. @@ -35,7 +36,6 @@ class GenreDaoTest { private final int OBJECT_COUNT_2 = 2; private final String UPDATED_NAME = "UpdatedName"; - private final String GENRE_NAME = "GenreName"; @Autowired private GenreDao genreDao; @@ -63,7 +63,7 @@ void getAllObjects() { assertThat(genres).isNotEmpty(); assertThat(genres).size().isEqualTo(OBJECT_COUNT_3); - assertThat(genres).containsAll(getGenres()); + assertThat(genres).containsAll(getGenreList()); } @Test @@ -96,16 +96,4 @@ void updateObject() { assertThat(genre_updated).isNotEmpty(); assertThat(genre_updated).contains(genre); } - - private List getGenres() { - List genres = new ArrayList(); - genres.add(getGenre(ID_1)); - genres.add(getGenre(ID_2)); - genres.add(getGenre(ID_3)); - return genres; - } - - private Genre getGenre(String id) { - return new Genre(id, GENRE_NAME + id); - } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java index 53eb9e4..818a794 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/AuthorManageSeviceImplTest.java @@ -12,7 +12,6 @@ import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.model.Author; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -22,6 +21,8 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthor; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthorList; /** * Created by IntelliJ IDEA. @@ -36,13 +37,12 @@ class AuthorManageSeviceImplTest { private final String ID_1 = "1"; private final String ID_2 = "2"; - private final String ID_3 = "3"; private final int OBJECT_COUNT_3 = 3; - private final String SURNAME = "Surname"; - private final String FIRST_NAME = "FirstName"; - private final String SECOND_NAME = "SecondName"; + private final String SURNAME = "Surname1"; + private final String FIRST_NAME = "FirstName1"; + private final String SECOND_NAME = "SecondName1"; @Mock private AuthorDao authorDao; @@ -84,7 +84,7 @@ public Author answer(InvocationOnMock invocationOnMock) throws Throwable { }); when(authorDao.findById(anyString())).thenReturn(Optional.of(getAuthor(ID_2))); - Author author1 = authorManageService.addAuthor("Surname1", "FirstName1", "SecondName1"); + Author author1 = authorManageService.addAuthor(SURNAME, FIRST_NAME, SECOND_NAME); Author author2 = authorManageService.getAuthorById(author1.getId()); assertThat(author1.getId()).isEqualTo(ID_2); @@ -106,7 +106,7 @@ public Author answer(InvocationOnMock invocationOnMock) throws Throwable { }); when(authorDao.findById(anyString())).thenReturn(Optional.of(getAuthor(ID_1))); - Author author1 = authorManageService.updateAuthor(ID_1, "Surname1", "FirstName1", "SecondName1"); + Author author1 = authorManageService.updateAuthor(ID_1, SURNAME, FIRST_NAME, SECOND_NAME); Author author2 = authorManageService.getAuthorById(ID_1); assertThat(author1).isNotNull(); @@ -142,16 +142,4 @@ void deleteAuthor() { authorManageService.deleteAuthor(ID_1); }); } - - private List getAuthorList() { - List authors = new ArrayList(); - authors.add(getAuthor(ID_1)); - authors.add(getAuthor(ID_2)); - authors.add(getAuthor(ID_3)); - return authors; - } - - private Author getAuthor(String id) { - return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); - } } diff --git a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java index eda0b1e..b5e416a 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/BookManageSeviceImplTest.java @@ -12,12 +12,9 @@ import ru.otus.mkulikov.app.dao.AuthorDao; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.GenreDao; -import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; -import ru.otus.mkulikov.app.model.Genre; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Optional; @@ -27,6 +24,10 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthor; +import static ru.otus.mkulikov.generators.GenerateBook.getBook; +import static ru.otus.mkulikov.generators.GenerateBook.getBooksList; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenre; /** * Created by IntelliJ IDEA. @@ -41,17 +42,10 @@ class BookManageSeviceImplTest { private final String ID_1 = "1"; private final String ID_2 = "2"; - private final String ID_3 = "3"; private final int OBJECT_COUNT_1 = 1; private final int OBJECT_COUNT_3 = 3; - private final String GENRE_NAME = "Genre"; - - private final String AUTHOR_SURNAME = "Surname"; - private final String AUTHOR_FIRST_NAME = "FirstName"; - private final String AUTHOR_SECOND_NAME = "SecondName"; - private final String BOOK_NAME = "BookName"; private final String BOOK_DESCRIPTION = "Description"; @@ -190,26 +184,4 @@ void deleteBook() { booksManageSevice.deleteBook(ID_1); }); } - - private Author getAuthor(String id) { - return new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); - } - - private Genre getGenre(String id) { - return new Genre(id, GENRE_NAME + id); - } - - private Book getBook(String id) { - Author author = getAuthor(id); - Genre genre = getGenre(id); - return new Book(id, new Date(), BOOK_NAME, author, genre, BOOK_DESCRIPTION); - } - - private List getBooksList() { - List list = new ArrayList<>(); - list.add(getBook(ID_1)); - list.add(getBook(ID_2)); - list.add(getBook(ID_3)); - return list; - } } \ No newline at end of file diff --git a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java index df33121..e1d6775 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/CommentManageSeviceImplTest.java @@ -11,14 +11,9 @@ import org.springframework.dao.DataIntegrityViolationException; import ru.otus.mkulikov.app.dao.BookDao; import ru.otus.mkulikov.app.dao.CommentDao; -import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; -import ru.otus.mkulikov.app.model.Genre; -import ru.otus.mkulikov.app.utils.DateUtil; -import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Optional; @@ -28,6 +23,9 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; +import static ru.otus.mkulikov.generators.GenerateBook.getBook; +import static ru.otus.mkulikov.generators.GenerateComment.getComment; +import static ru.otus.mkulikov.generators.GenerateComment.getCommentList; /** * Created by IntelliJ IDEA. @@ -42,26 +40,14 @@ class CommentManageSeviceImplTest { private final String ID_1 = "1"; private final String ID_2 = "2"; - private final String ID_3 = "3"; - private final String ID_4 = "4"; private final int OBJECT_COUNT_4 = 4; - private final String DATE_TIME = "2019-01-01 10:01:01"; - private final String GENRE_NAME = "GenreName"; - private final String COMMENT_USER_NAME = "user"; private final String COMMENT_UPDATED_USER_NAME = "TestUser"; private final String COMMENT_TEXT = "text"; private final String COMMENT_UPDATED_TEXT = "TestText"; - private final String AUTHOR_SURNAME = "Surname"; - private final String AUTHOR_FIRST_NAME = "FirstName"; - private final String AUTHOR_SECOND_NAME = "SecondName"; - - private final String BOOK_NAME = "BookName"; - private final String BOOK_DESCRIPTION = "Description"; - @Mock private CommentDao commentDao; @@ -74,7 +60,7 @@ class CommentManageSeviceImplTest { @Test @DisplayName("Получение комментария по id") void getCommentById() { - Comment comment = getComment(ID_1); + Comment comment = getComment(ID_1, ID_1); when(commentDao.findById(anyString())).thenReturn(Optional.of(comment)); Comment commentById = commentManageService.getCommentById(ID_1); @@ -142,7 +128,7 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { return comment; } }); - when(commentDao.findById(anyString())).thenReturn(Optional.of(getComment(ID_1))); + when(commentDao.findById(anyString())).thenReturn(Optional.of(getComment(ID_1, ID_1))); Comment comment = commentManageService.updateComment(ID_1, COMMENT_UPDATED_USER_NAME, COMMENT_UPDATED_TEXT); @@ -162,7 +148,7 @@ public Comment answer(InvocationOnMock invocationOnMock) throws Throwable { return comment; } }); - Comment comment = commentManageService.updateComment(getComment(ID_1)); + Comment comment = commentManageService.updateComment(getComment(ID_1, ID_1)); assertThat(comment).isNotNull(); assertThat(comment.getId()).isEqualTo(ID_1); @@ -176,25 +162,4 @@ void deleteComment() { commentManageService.deleteComment(ID_1); }); } - - private Comment getComment(String id) { - Date date = DateUtil.stringToDateTime(DATE_TIME); - Book book = getBook(id); - return new Comment(id, book, date, COMMENT_USER_NAME + id, COMMENT_TEXT + id); - } - - private Book getBook(String id) { - Author author = new Author(id, AUTHOR_SURNAME + id, AUTHOR_FIRST_NAME + id, AUTHOR_SECOND_NAME + id); - Genre genre = new Genre(id, GENRE_NAME + id); - return new Book(id, new Date(), BOOK_NAME, author, genre, BOOK_DESCRIPTION); - } - - private List getCommentList() { - List comments = new ArrayList(); - comments.add(getComment(ID_1)); - comments.add(getComment(ID_2)); - comments.add(getComment(ID_3)); - comments.add(getComment(ID_4)); - return comments; - } } diff --git a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java index c4b560d..9a4572a 100644 --- a/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java +++ b/src/test/java/ru/otus/mkulikov/app/service/GenreManageSeviceImplTest.java @@ -12,7 +12,6 @@ import ru.otus.mkulikov.app.dao.GenreDao; import ru.otus.mkulikov.app.model.Genre; -import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -22,6 +21,8 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenre; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenreList; /** * Created by IntelliJ IDEA. @@ -36,7 +37,6 @@ class GenreManageSeviceImplTest { private final String ID_1 = "1"; private final String ID_2 = "2"; - private final String ID_3 = "3"; private final int OBJECT_COUNT_3 = 3; @@ -135,15 +135,4 @@ void deleteGenre() { }); } - private List getGenreList() { - List genres = new ArrayList(); - genres.add(getGenre(ID_1)); - genres.add(getGenre(ID_2)); - genres.add(getGenre(ID_3)); - return genres; - } - - private Genre getGenre(String id) { - return new Genre(id, GENRE_NAME + id); - } } diff --git a/src/test/java/ru/otus/mkulikov/generators/GenerateAuthor.java b/src/test/java/ru/otus/mkulikov/generators/GenerateAuthor.java new file mode 100644 index 0000000..53adc55 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/generators/GenerateAuthor.java @@ -0,0 +1,29 @@ +package ru.otus.mkulikov.generators; + +import ru.otus.mkulikov.app.model.Author; + +import java.util.ArrayList; +import java.util.List; + +public class GenerateAuthor { + + private static final String ID_1 = "1"; + private static final String ID_2 = "2"; + private static final String ID_3 = "3"; + + private static final String SURNAME = "Surname"; + private static final String FIRST_NAME = "FirstName"; + private static final String SECOND_NAME = "SecondName"; + + public static List getAuthorList() { + List authors = new ArrayList(); + authors.add(getAuthor(ID_1)); + authors.add(getAuthor(ID_2)); + authors.add(getAuthor(ID_3)); + return authors; + } + + public static Author getAuthor(String id) { + return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); + } +} diff --git a/src/test/java/ru/otus/mkulikov/generators/GenerateBook.java b/src/test/java/ru/otus/mkulikov/generators/GenerateBook.java new file mode 100644 index 0000000..6e56762 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/generators/GenerateBook.java @@ -0,0 +1,40 @@ +package ru.otus.mkulikov.generators; + +import ru.otus.mkulikov.app.model.Author; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.utils.DateUtil; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthor; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenre; + +public class GenerateBook { + + private static final String ID_1 = "1"; + private static final String ID_2 = "2"; + private static final String ID_3 = "3"; + + private static final String DATE_TIME = "2019-01-01 10:01:01"; + + private static final String BOOK_NAME = "BookName"; + private static final String BOOK_DESCRIPTION = "Description"; + + public static Book getBook(String id) { + Author author = getAuthor(id); + Genre genre = getGenre(id); + Date date = DateUtil.stringToDateTime(DATE_TIME); + return new Book(id, date, BOOK_NAME, author, genre, BOOK_DESCRIPTION); + } + + public static List getBooksList() { + List list = new ArrayList<>(); + list.add(getBook(ID_1)); + list.add(getBook(ID_2)); + list.add(getBook(ID_3)); + return list; + } +} diff --git a/src/test/java/ru/otus/mkulikov/generators/GenerateComment.java b/src/test/java/ru/otus/mkulikov/generators/GenerateComment.java new file mode 100644 index 0000000..0c36416 --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/generators/GenerateComment.java @@ -0,0 +1,39 @@ +package ru.otus.mkulikov.generators; + +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.utils.DateUtil; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static ru.otus.mkulikov.generators.GenerateBook.getBook; + +public class GenerateComment { + + private static final String ID_1 = "1"; + private static final String ID_2 = "2"; + private static final String ID_3 = "3"; + private static final String ID_4 = "4"; + + private static final String DATE_TIME = "2019-01-01 10:01:01"; + + private static final String COMMENT_USER_NAME = "user"; + private static final String COMMENT_TEXT = "text"; + + public static Comment getComment(String id, String bookId) { + Date date = DateUtil.stringToDateTime(DATE_TIME); + Book book = getBook(bookId); + return new Comment(id, book, date, COMMENT_USER_NAME + id, COMMENT_TEXT + id); + } + + public static List getCommentList() { + List comments = new ArrayList(); + comments.add(getComment(ID_1, ID_1)); + comments.add(getComment(ID_2, ID_1)); + comments.add(getComment(ID_3, ID_2)); + comments.add(getComment(ID_4, ID_2)); + return comments; + } +} diff --git a/src/test/java/ru/otus/mkulikov/generators/GenerateGenre.java b/src/test/java/ru/otus/mkulikov/generators/GenerateGenre.java new file mode 100644 index 0000000..fb929cc --- /dev/null +++ b/src/test/java/ru/otus/mkulikov/generators/GenerateGenre.java @@ -0,0 +1,27 @@ +package ru.otus.mkulikov.generators; + +import ru.otus.mkulikov.app.model.Genre; + +import java.util.ArrayList; +import java.util.List; + +public class GenerateGenre { + + private static final String ID_1 = "1"; + private static final String ID_2 = "2"; + private static final String ID_3 = "3"; + + private static final String GENRE_NAME = "GenreName"; + + public static List getGenreList() { + List genres = new ArrayList(); + genres.add(getGenre(ID_1)); + genres.add(getGenre(ID_2)); + genres.add(getGenre(ID_3)); + return genres; + } + + public static Genre getGenre(String id) { + return new Genre(id, GENRE_NAME + id); + } +} diff --git a/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java index 4acd0fc..05698ae 100644 --- a/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java @@ -19,6 +19,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthor; @RunWith(SpringRunner.class) @DisplayName("Класс rest-контроллеров для автора") @@ -65,8 +66,4 @@ public void getById() throws Exception { // .andExpect(status().isOk()) // .andExpect(content().string(containsString("Authors:"))); // } - - private Author getAuthor(String id) { - return new Author(id, SURNAME + id, FIRST_NAME + id, SECOND_NAME + id); - } } \ No newline at end of file From 9545062dcee9084232cf19a3e784eace102aa5bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Thu, 19 Sep 2019 18:04:17 +0300 Subject: [PATCH 67/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20res?= =?UTF-8?q?t-=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mkulikov/rest/AuthorControllerTest.java | 55 +++++++++++++------ 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java index 05698ae..d81fa6c 100644 --- a/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/AuthorControllerTest.java @@ -13,23 +13,22 @@ import ru.otus.mkulikov.app.service.BookManageService; import static org.hamcrest.Matchers.containsString; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthor; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthorList; +import static ru.otus.mkulikov.generators.GenerateBook.getBooksList; @RunWith(SpringRunner.class) @DisplayName("Класс rest-контроллеров для автора") @WebMvcTest(AuthorController.class) public class AuthorControllerTest { - private final String SURNAME = "Surname"; - private final String FIRST_NAME = "FirstName"; - private final String SECOND_NAME = "SecondName"; - @MockBean private AuthorManageService authorManageService; @MockBean @@ -41,6 +40,8 @@ public class AuthorControllerTest { @Test @DisplayName("Получение всех авторов") public void getAll() throws Exception { + when(authorManageService.getAuthors()).thenReturn(getAuthorList()); + this.mockMvc.perform(get("/author/list")) .andDo(print()) .andExpect(status().isOk()) @@ -49,7 +50,7 @@ public void getAll() throws Exception { @Test @DisplayName("Получение автора по id") - public void getById() throws Exception { + public void getAuthorById() throws Exception { when(authorManageService.getAuthorById(anyString())).thenReturn(getAuthor("1")); this.mockMvc.perform(get("/author").param("id", "1")) @@ -58,12 +59,34 @@ public void getById() throws Exception { .andExpect(content().string(containsString("Author detail:"))); } -// @Test -// @DisplayName("Редактирование автора") -// public void edit() throws Exception { -// this.mockMvc.perform(get("/author/edit")) -// .andDo(print()) -// .andExpect(status().isOk()) -// .andExpect(content().string(containsString("Authors:"))); -// } -} \ No newline at end of file + @Test + @DisplayName("Добавление автора") + public void addAuthor() throws Exception { + when(authorManageService.addAuthor(anyString(), anyString(), anyString())).thenReturn(getAuthor("1")); + + this.mockMvc.perform(get("/author/new")) + .andDo(print()) + .andExpect(redirectedUrl("/author?id=1")); + } + + @Test + @DisplayName("Изменение автора") + public void edit() throws Exception { + when(authorManageService.updateAuthor(any(Author.class))).thenReturn(getAuthor("1")); + + this.mockMvc.perform(post("/author/edit").requestAttr("Author", getAuthor("1"))) + .andDo(print()) + .andExpect(redirectedUrl("/author/list")); + } + + @Test + @DisplayName("Удаление автора") + public void delete() throws Exception { + when(bookManageService.getBookByAuthorId(anyString())).thenReturn(getBooksList()); + when(authorManageService.deleteAuthor(anyString())).thenReturn(1); + + this.mockMvc.perform(post("/author/delete").param("id", "1")) + .andDo(print()) + .andExpect(redirectedUrl("/author/list")); + } +} From ddd0ec8cd87a864fc22b165f05aae8a729607e2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Fri, 20 Sep 2019 14:01:26 +0300 Subject: [PATCH 68/70] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20rest-=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=BB=D0=BB=D0=B5=D1=80=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mkulikov/generators/GenerateComment.java | 7 ++ .../mkulikov/rest/BookControllerTest.java | 72 +++++++++++++++++-- .../mkulikov/rest/CommentControllerTest.java | 60 ++++++++++++++-- .../mkulikov/rest/GenreControllerTest.java | 55 ++++++++++++-- 4 files changed, 176 insertions(+), 18 deletions(-) diff --git a/src/test/java/ru/otus/mkulikov/generators/GenerateComment.java b/src/test/java/ru/otus/mkulikov/generators/GenerateComment.java index 0c36416..960b0d0 100644 --- a/src/test/java/ru/otus/mkulikov/generators/GenerateComment.java +++ b/src/test/java/ru/otus/mkulikov/generators/GenerateComment.java @@ -36,4 +36,11 @@ public static List getCommentList() { comments.add(getComment(ID_4, ID_2)); return comments; } + + public static List getCommentList(String bookId) { + List comments = new ArrayList(); + comments.add(getComment(ID_1, bookId)); + comments.add(getComment(ID_2, bookId)); + return comments; + } } diff --git a/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java index 7d4357c..598bd55 100644 --- a/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/BookControllerTest.java @@ -1,43 +1,103 @@ package ru.otus.mkulikov.rest; import org.junit.Test; +import org.junit.jupiter.api.DisplayName; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import ru.otus.mkulikov.app.model.Book; +import ru.otus.mkulikov.app.service.AuthorManageService; import ru.otus.mkulikov.app.service.BookManageService; +import ru.otus.mkulikov.app.service.CommentManageService; +import ru.otus.mkulikov.app.service.GenreManageService; import static org.hamcrest.Matchers.containsString; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static ru.otus.mkulikov.generators.GenerateAuthor.getAuthorList; +import static ru.otus.mkulikov.generators.GenerateBook.getBook; +import static ru.otus.mkulikov.generators.GenerateComment.getCommentList; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenreList; @RunWith(SpringRunner.class) +@DisplayName("Класс rest-контроллеров для книг") @WebMvcTest(BookController.class) public class BookControllerTest { @MockBean private BookManageService bookManageService; + @MockBean + private AuthorManageService authorManageService; + @MockBean + private GenreManageService genreManageService; + @MockBean + private CommentManageService commentManageService; @Autowired private MockMvc mockMvc; @Test + @DisplayName("Получение всех книг") public void getAll() throws Exception { - this.mockMvc.perform(get("/book/list")).andDo(print()).andExpect(status().isOk()) + this.mockMvc.perform(get("/book/list")) + .andDo(print()) + .andExpect(status().isOk()) .andExpect(content().string(containsString("Books:"))); } @Test + @DisplayName("Получение книги по id") public void getById() throws Exception { - this.mockMvc.perform(get("/book")).andDo(print()).andExpect(status().isBadRequest()); + when(bookManageService.getBookById(anyString())).thenReturn(getBook("1")); + when(authorManageService.getAuthors()).thenReturn(getAuthorList()); + when(genreManageService.getGenres()).thenReturn(getGenreList()); + + this.mockMvc.perform(get("/book").param("id", "1")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Book detail:"))); } @Test + @DisplayName("Добавление книги") + public void addBook() throws Exception { + when(bookManageService.addBook(anyString(), anyString(), anyString(), anyString())).thenReturn(getBook("1")); + when(authorManageService.getAuthors()).thenReturn(getAuthorList()); + when(genreManageService.getGenres()).thenReturn(getGenreList()); + + this.mockMvc.perform(get("/book/new")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Book detail:"))); + } + + @Test + @DisplayName("Изменение книги") public void edit() throws Exception { - this.mockMvc.perform(get("/book/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); + when(bookManageService.updateBook(any(Book.class))).thenReturn(getBook("1")); + + this.mockMvc.perform(post("/book/edit").requestAttr("Book", getBook("1"))) + .andDo(print()) + .andExpect(redirectedUrl("/book/list")); + } + + @Test + @DisplayName("Удаление книги") + public void delete() throws Exception { + when(commentManageService.getCommentsByBookId(anyString())).thenReturn(getCommentList("1")); + when(commentManageService.deleteComments(getCommentList())).thenReturn(1); + when(bookManageService.deleteBook(anyString())).thenReturn(1); + + this.mockMvc.perform(post("/book/delete").param("id", "1")) + .andDo(print()) + .andExpect(redirectedUrl("/book/list")); } -} \ No newline at end of file +} diff --git a/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java index b575c31..6e0c084 100644 --- a/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/CommentControllerTest.java @@ -1,24 +1,35 @@ package ru.otus.mkulikov.rest; import org.junit.Test; +import org.junit.jupiter.api.DisplayName; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import ru.otus.mkulikov.app.model.Comment; +import ru.otus.mkulikov.app.service.BookManageService; import ru.otus.mkulikov.app.service.CommentManageService; import static org.hamcrest.Matchers.containsString; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static ru.otus.mkulikov.generators.GenerateBook.getBooksList; +import static ru.otus.mkulikov.generators.GenerateComment.getComment; @RunWith(SpringRunner.class) +@DisplayName("Класс rest-контроллеров для комментариев") @WebMvcTest(CommentController.class) public class CommentControllerTest { + @MockBean + private BookManageService bookManageService; @MockBean private CommentManageService commentManageService; @@ -26,18 +37,55 @@ public class CommentControllerTest { private MockMvc mockMvc; @Test + @DisplayName("Получение всех комментариев") public void getAll() throws Exception { - this.mockMvc.perform(get("/comment/list")).andDo(print()).andExpect(status().isOk()) + this.mockMvc.perform(get("/comment/list")).andDo(print()) + .andExpect(status().isOk()) .andExpect(content().string(containsString("Comments:"))); } @Test + @DisplayName("Получение комментария по id") public void getById() throws Exception { - this.mockMvc.perform(get("/comment")).andDo(print()).andExpect(status().isBadRequest()); + when(commentManageService.getCommentById(anyString())).thenReturn(getComment("1", "1")); + when(bookManageService.getBooks()).thenReturn(getBooksList()); + + this.mockMvc.perform(get("/comment").param("id", "1")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Comment detail:"))); } @Test + @DisplayName("Изменение комментария") public void edit() throws Exception { - this.mockMvc.perform(get("/comment/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); + when(bookManageService.getBooks()).thenReturn(getBooksList()); + when(commentManageService.updateComment(any(Comment.class))).thenReturn(getComment("1", "1")); + + this.mockMvc.perform(post("/comment/edit").requestAttr("Comment", getComment("1", "1"))) + .andDo(print()) + .andExpect(redirectedUrl("/comment/list")); + } + + @Test + @DisplayName("Добавление комментария") + public void addComment() throws Exception { + when(bookManageService.getBooks()).thenReturn(getBooksList()); + when(commentManageService.addComment(anyString(), anyString(), anyString())).thenReturn(getComment("1", "1")); + + this.mockMvc.perform(get("/comment/new")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Comment detail:"))); + } + + @Test + @DisplayName("Удаление комментария") + public void delete() throws Exception { + when(commentManageService.deleteComment(anyString())).thenReturn(1); + + this.mockMvc.perform(post("/comment/delete").param("id", "1")) + .andDo(print()) + .andExpect(redirectedUrl("/comment/list")); } -} \ No newline at end of file +} diff --git a/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java b/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java index 18d5544..31e3f84 100644 --- a/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java +++ b/src/test/java/ru/otus/mkulikov/rest/GenreControllerTest.java @@ -1,24 +1,34 @@ package ru.otus.mkulikov.rest; import org.junit.Test; +import org.junit.jupiter.api.DisplayName; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; +import ru.otus.mkulikov.app.model.Genre; +import ru.otus.mkulikov.app.service.BookManageService; import ru.otus.mkulikov.app.service.GenreManageService; import static org.hamcrest.Matchers.containsString; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static ru.otus.mkulikov.generators.GenerateGenre.getGenre; @RunWith(SpringRunner.class) +@DisplayName("Класс rest-контроллеров для жанров") @WebMvcTest(GenreController.class) public class GenreControllerTest { + @MockBean + private BookManageService bookManageService; @MockBean private GenreManageService genreManageService; @@ -26,18 +36,51 @@ public class GenreControllerTest { private MockMvc mockMvc; @Test + @DisplayName("Получение всех жанров") public void getAll() throws Exception { - this.mockMvc.perform(get("/genre/list")).andDo(print()).andExpect(status().isOk()) + this.mockMvc.perform(get("/genre/list")).andDo(print()) + .andExpect(status().isOk()) .andExpect(content().string(containsString("Genres:"))); } @Test + @DisplayName("Получение жанра по id") public void getById() throws Exception { - this.mockMvc.perform(get("/genre")).andDo(print()).andExpect(status().isBadRequest()); + when(genreManageService.getGenreById(anyString())).thenReturn(getGenre("1")); + + this.mockMvc.perform(get("/genre").param("id", "1")) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Genre detail:"))); + } + + @Test + @DisplayName("Добавление жанра") + public void addGenre() throws Exception { + when(genreManageService.addGenre(anyString())).thenReturn(getGenre("1")); + + this.mockMvc.perform(get("/genre/new")) + .andDo(print()) + .andExpect(redirectedUrl("/genre?id=1")); } @Test + @DisplayName("Изменение жанра") public void edit() throws Exception { - this.mockMvc.perform(get("/genre/edit")).andDo(print()).andExpect(status().isMethodNotAllowed()); + when(genreManageService.updateGenre(any(Genre.class))).thenReturn(getGenre("1")); + + this.mockMvc.perform(post("/genre/edit").requestAttr("Genre", getGenre("1"))) + .andDo(print()) + .andExpect(redirectedUrl("/genre/list")); + } + + @Test + @DisplayName("Удаление жанра") + public void delete() throws Exception { + when(genreManageService.deleteGenre(anyString())).thenReturn(1); + + this.mockMvc.perform(post("/genre/delete").param("id", "1")) + .andDo(print()) + .andExpect(redirectedUrl("/genre/list")); } -} \ No newline at end of file +} From b68cd30cf69f3403843d9380525ecc22d63e3eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Fri, 20 Sep 2019 14:24:51 +0300 Subject: [PATCH 69/70] =?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 --- .../ru/otus/mkulikov/app/model/Author.java | 4 +++ .../java/ru/otus/mkulikov/app/model/Book.java | 4 +++ .../ru/otus/mkulikov/app/model/Comment.java | 4 +++ .../ru/otus/mkulikov/app/model/Genre.java | 2 ++ src/main/resources/application.yml | 4 --- .../otus/mkulikov/app/dao/AuthorDaoTest.java | 10 +++++-- .../ru/otus/mkulikov/app/dao/BookDaoTest.java | 22 ++++++++------ .../otus/mkulikov/app/dao/CommentDaoTest.java | 30 +++++++++---------- .../otus/mkulikov/app/dao/GenreDaoTest.java | 10 +++++-- src/test/resources/application.yml | 10 ------- 10 files changed, 55 insertions(+), 45 deletions(-) diff --git a/src/main/java/ru/otus/mkulikov/app/model/Author.java b/src/main/java/ru/otus/mkulikov/app/model/Author.java index 07ace47..5866262 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Author.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Author.java @@ -3,6 +3,7 @@ import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; /** * Created by IntelliJ IDEA. @@ -17,8 +18,11 @@ public class Author { @Id private String id; + @Field(value = "surname") private String surname; + @Field(value = "firstName") private String firstName; + @Field(value = "secondName") private String secondName; public Author() { diff --git a/src/main/java/ru/otus/mkulikov/app/model/Book.java b/src/main/java/ru/otus/mkulikov/app/model/Book.java index 5aec76f..86ae6e3 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Book.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Book.java @@ -4,6 +4,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; import java.util.Date; @@ -20,8 +21,11 @@ public class Book { @Id private String id; + @Field(value = "addRecordDate") private Date addRecordDate; + @Field(value = "caption") private String caption; + @Field(value = "description") private String description; @DBRef diff --git a/src/main/java/ru/otus/mkulikov/app/model/Comment.java b/src/main/java/ru/otus/mkulikov/app/model/Comment.java index 97e30d2..6cfeaaf 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Comment.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Comment.java @@ -4,6 +4,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.DBRef; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; import java.util.Date; @@ -20,8 +21,11 @@ public class Comment { @Id private String id; + @Field(value = "addRecordDate") private Date addRecordDate; + @Field(value = "userName") private String userName; + @Field(value = "text") private String text; @DBRef diff --git a/src/main/java/ru/otus/mkulikov/app/model/Genre.java b/src/main/java/ru/otus/mkulikov/app/model/Genre.java index 5250f9d..14ca394 100644 --- a/src/main/java/ru/otus/mkulikov/app/model/Genre.java +++ b/src/main/java/ru/otus/mkulikov/app/model/Genre.java @@ -3,6 +3,7 @@ import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; +import org.springframework.data.mongodb.core.mapping.Field; /** * Created by IntelliJ IDEA. @@ -17,6 +18,7 @@ public class Genre { @Id private String id; + @Field(value = "name") private String name; public Genre() { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 26247a0..43cd088 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,10 +2,6 @@ spring: banner: location: "classpath:banner.txt" - jpa: - hibernate: - ddl-auto: none - data: mongodb: uri: mongodb://localhost diff --git a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java index 78b3e55..6c3c185 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Author; @@ -39,14 +40,17 @@ class AuthorDaoTest { private final String TEST_FIRST_NAME = "TestFirstName"; private final String TEST_SECOND_NAME = "TestSecondName"; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired private AuthorDao authorDao; @BeforeEach void init() { - authorDao.save(getAuthor(ID_1)); - authorDao.save(getAuthor(ID_2)); - authorDao.save(getAuthor(ID_3)); + mongoTemplate.save(getAuthor(ID_1)); + mongoTemplate.save(getAuthor(ID_2)); + mongoTemplate.save(getAuthor(ID_3)); } @Test diff --git a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java index c09ef1c..6695308 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/BookDaoTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.data.mongodb.core.MongoTemplate; import ru.otus.mkulikov.app.model.Author; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Genre; @@ -45,6 +46,9 @@ class BookDaoTest { private final String UPDATED_BOOK_NAME = "UpdatedBookName"; private final String UPDATED_DESCRIPTION = "UpdatedDescription"; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired private BookDao bookDaoJpa; @@ -56,17 +60,17 @@ class BookDaoTest { @BeforeEach void init() { - authorDao.save(getAuthor(ID_1)); - authorDao.save(getAuthor(ID_2)); - authorDao.save(getAuthor(ID_3)); + mongoTemplate.save(getAuthor(ID_1)); + mongoTemplate.save(getAuthor(ID_2)); + mongoTemplate.save(getAuthor(ID_3)); - genreDao.save(getGenre(ID_1)); - genreDao.save(getGenre(ID_2)); - genreDao.save(getGenre(ID_3)); + mongoTemplate.save(getGenre(ID_1)); + mongoTemplate.save(getGenre(ID_2)); + mongoTemplate.save(getGenre(ID_3)); - bookDaoJpa.save(getBook(ID_1)); - bookDaoJpa.save(getBook(ID_2)); - bookDaoJpa.save(getBook(ID_3)); + mongoTemplate.save(getBook(ID_1)); + mongoTemplate.save(getBook(ID_2)); + mongoTemplate.save(getBook(ID_3)); } @Test diff --git a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java index ffae5d0..cfa7b0c 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/CommentDaoTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.data.mongodb.core.MongoTemplate; import ru.otus.mkulikov.app.model.Book; import ru.otus.mkulikov.app.model.Comment; import ru.otus.mkulikov.app.utils.DateUtil; @@ -48,10 +49,7 @@ class CommentDaoTest { private final String COMMENT_UPDATED_TEXT = "TestText"; @Autowired - private AuthorDao authorDao; - - @Autowired - private GenreDao genreDao; + private MongoTemplate mongoTemplate; @Autowired private BookDao bookDao; @@ -61,21 +59,21 @@ class CommentDaoTest { @BeforeEach void init() { - authorDao.save(getAuthor(ID_1)); - authorDao.save(getAuthor(ID_2)); - authorDao.save(getAuthor(ID_3)); + mongoTemplate.save(getAuthor(ID_1)); + mongoTemplate.save(getAuthor(ID_2)); + mongoTemplate.save(getAuthor(ID_3)); - genreDao.save(getGenre(ID_1)); - genreDao.save(getGenre(ID_2)); - genreDao.save(getGenre(ID_3)); + mongoTemplate.save(getGenre(ID_1)); + mongoTemplate.save(getGenre(ID_2)); + mongoTemplate.save(getGenre(ID_3)); - bookDao.save(getBook(ID_1)); - bookDao.save(getBook(ID_2)); + mongoTemplate.save(getBook(ID_1)); + mongoTemplate.save(getBook(ID_2)); - commentDao.save(getComment(ID_1, ID_1)); - commentDao.save(getComment(ID_2, ID_1)); - commentDao.save(getComment(ID_3, ID_2)); - commentDao.save(getComment(ID_4, ID_2)); + mongoTemplate.save(getComment(ID_1, ID_1)); + mongoTemplate.save(getComment(ID_2, ID_1)); + mongoTemplate.save(getComment(ID_3, ID_2)); + mongoTemplate.save(getComment(ID_4, ID_2)); } @Test diff --git a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java index c9790ea..f5aa9dc 100644 --- a/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java +++ b/src/test/java/ru/otus/mkulikov/app/dao/GenreDaoTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; +import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import ru.otus.mkulikov.app.model.Genre; @@ -37,14 +38,17 @@ class GenreDaoTest { private final String UPDATED_NAME = "UpdatedName"; + @Autowired + private MongoTemplate mongoTemplate; + @Autowired private GenreDao genreDao; @BeforeEach void init() { - genreDao.save(getGenre(ID_1)); - genreDao.save(getGenre(ID_2)); - genreDao.save(getGenre(ID_3)); + mongoTemplate.save(getGenre(ID_1)); + mongoTemplate.save(getGenre(ID_2)); + mongoTemplate.save(getGenre(ID_3)); } @Test diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index d09d306..a47425c 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -2,13 +2,3 @@ spring: banner: location: "classpath:banner.txt" - jpa: - hibernate: - ddl-auto: none - - data: - mongodb: - uri: mongodb://localhost - port: 27017 - database: library_test - pack: "ru.otus.mkulikov.changelog" From 94d75cc555e874143498f8762ac9869063eb7f3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D0=BB=D0=B8=D0=BA=D0=BE=D0=B2=20=D0=9C=D0=B0?= =?UTF-8?q?=D0=BA=D1=81=D0=B8=D0=BC=20=D0=92=D0=B0=D0=BB=D0=B5=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=D0=B8=D1=87?= Date: Fri, 20 Sep 2019 14:27:27 +0300 Subject: [PATCH 70/70] =?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 | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 5601cef..af503c6 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,7 @@ # OtusSpringHW-Library -Домашнее задание #8: -- Использовать MongoDB и spring-data для хранения информации о книгах. -- Тесты реализовать с помощью spring-boot-strter-embedded-mongodb. - -### 19-08-19 Доработки: -- Тип id у сущностей изменен на String. - -### 19-08-20 Доработки: -- Подключил Mongock. \ No newline at end of file +Домашнее задание #9: +- CRUD приложение с Web UI и хранением данных в БД. +- Создайте приложение с хранением сущностей в БД (можно взять DAOs из прошлых занятий). +- Использовать классический View, предусмотреть страницу отображения всех сущностей и создания/редактирования. +- View на Thymeleaf, classic Controllers. \ No newline at end of file