diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..78c55a7b3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM openjdk:17.0.2-jdk-slim-buster +ARG JAR_FILE=target/*.jar +COPY resources /resources +COPY ${JAR_FILE} app.jar +EXPOSE 8080 +ENTRYPOINT ["java", "-jar","app.jar"] diff --git a/README.md b/README.md index 719b268f5..ca0aa3162 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,4 @@ - https://habr.com/ru/articles/259055/ Список выполненных задач: -... \ No newline at end of file +2, 3, 6, 11, 4, 5, 9 \ No newline at end of file diff --git a/pom.xml b/pom.xml index f6c152c68..c07b42483 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,19 @@ 1.5.3.Final UTF-8 UTF-8 + 1.18.3 + + + + org.testcontainers + testcontainers-bom + ${testcontainers.version} + pom + import + + + @@ -142,6 +154,18 @@ junit-platform-launcher test + + + org.testcontainers + junit-jupiter + test + + + + org.testcontainers + postgresql + test + diff --git a/resources/mails/email-confirmation.html b/resources/mails/email-confirmation.html index 106e6129a..621a76f86 100644 --- a/resources/mails/email-confirmation.html +++ b/resources/mails/email-confirmation.html @@ -1,13 +1,12 @@ - JiraRush - подтверждение почты + -

-

Чтобы завершить настройку учетной записи и начать пользоваться JiraRush, подтвердите, что вы правильно указали вашу - электронную почту.

-Подтвердить почту +

+

+ \ No newline at end of file diff --git a/resources/mails/password-reset.html b/resources/mails/password-reset.html index b37a49007..0493da515 100644 --- a/resources/mails/password-reset.html +++ b/resources/mails/password-reset.html @@ -1,12 +1,12 @@ - JiraRush - установить новый пароль + -

-

-Установить пароль +

+

+ \ No newline at end of file diff --git a/resources/view/index.html b/resources/view/index.html index e8656ef96..346c8b074 100644 --- a/resources/view/index.html +++ b/resources/view/index.html @@ -4,7 +4,7 @@ -

JiraRush Home page

+

diff --git a/resources/view/login.html b/resources/view/login.html index 8765ca8ff..d49ce5691 100644 --- a/resources/view/login.html +++ b/resources/view/login.html @@ -48,14 +48,6 @@

Sign in

type="button"> - - - - - - diff --git a/resources/view/unauth/register.html b/resources/view/unauth/register.html index 2ba955045..52a892bd3 100644 --- a/resources/view/unauth/register.html +++ b/resources/view/unauth/register.html @@ -77,14 +77,6 @@

Registration

type="button"> - - - - - - diff --git a/src/main/java/com/javarush/jira/JiraRushApplication.java b/src/main/java/com/javarush/jira/JiraRushApplication.java index 58be49fe7..c227a100c 100644 --- a/src/main/java/com/javarush/jira/JiraRushApplication.java +++ b/src/main/java/com/javarush/jira/JiraRushApplication.java @@ -13,5 +13,6 @@ public class JiraRushApplication { public static void main(String[] args) { SpringApplication.run(JiraRushApplication.class, args); + } } diff --git a/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java b/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java index 6cffbe175..516a991f9 100644 --- a/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java +++ b/src/main/java/com/javarush/jira/bugtracking/attachment/FileUtil.java @@ -28,9 +28,9 @@ public static void upload(MultipartFile multipartFile, String directoryPath, Str File dir = new File(directoryPath); if (dir.exists() || dir.mkdirs()) { File file = new File(directoryPath + fileName); - try (OutputStream outStream = new FileOutputStream(file)) { - outStream.write(multipartFile.getBytes()); - } catch (IOException ex) { + try { + multipartFile.transferTo(file); + } catch (IOException e) { throw new IllegalRequestDataException("Failed to upload file" + multipartFile.getOriginalFilename()); } } diff --git a/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java b/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java index b53f7ff37..6249327c6 100644 --- a/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java +++ b/src/main/java/com/javarush/jira/bugtracking/task/TaskController.java @@ -156,4 +156,7 @@ public TaskTreeNode(TaskTo taskTo) { this(taskTo, new LinkedList<>()); } } + + + } diff --git a/src/main/java/com/javarush/jira/common/internal/config/MvcConfig.java b/src/main/java/com/javarush/jira/common/internal/config/MvcConfig.java index 8a434a807..74dfaaff5 100644 --- a/src/main/java/com/javarush/jira/common/internal/config/MvcConfig.java +++ b/src/main/java/com/javarush/jira/common/internal/config/MvcConfig.java @@ -19,6 +19,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping; import org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.mvc.UrlFilenameViewController; import java.time.Duration; @@ -56,6 +57,7 @@ public void preHandle(WebRequest request) { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authInterceptor).excludePathPatterns("/api/**"); + registry.addInterceptor(localeChangeInterceptor()); } // http://www.codejava.net/frameworks/spring/spring-mvc-url-based-view-resolution-with-urlfilenameviewcontroller-example @@ -95,4 +97,11 @@ public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { .setReadTimeout(Duration.ofSeconds(10)) .build(); } + + @Bean + public LocaleChangeInterceptor localeChangeInterceptor(){ + LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); + lci.setParamName("lang"); + return lci; + } } diff --git a/src/main/java/com/javarush/jira/common/internal/config/ThymeleafConfig.java b/src/main/java/com/javarush/jira/common/internal/config/ThymeleafConfig.java index fd5871674..eb1443744 100644 --- a/src/main/java/com/javarush/jira/common/internal/config/ThymeleafConfig.java +++ b/src/main/java/com/javarush/jira/common/internal/config/ThymeleafConfig.java @@ -3,10 +3,13 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; import org.thymeleaf.spring6.SpringTemplateEngine; import org.thymeleaf.templatemode.TemplateMode; import org.thymeleaf.templateresolver.FileTemplateResolver; +import java.util.Locale; import java.util.Set; @Configuration @@ -38,4 +41,11 @@ private FileTemplateResolver createTemplateResolver(String pfx) { setCharacterEncoding("UTF-8"); }}; } + + @Bean + public LocaleResolver localResolver(){ + SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver(); + sessionLocaleResolver.setDefaultLocale(Locale.US); + return sessionLocaleResolver; + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 000000000..17eebe6f8 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,30 @@ +spring.datasource.url=jdbc:postgresql://localhost:5432/jira +spring.datasource.username=jira +spring.datasource.password=JiraRush + +spring.security.oauth2.client.registration.github.client-id=3d0d8738e65881fff266 +spring.security.oauth2.client.registration.github.client-secret=0f97031ce6178b7dfb67a6af587f37e222a16120 +spring.security.oauth2.client.registration.github.scope=email + +spring.security.oauth2.client.registration.google.client-id=329113642700-f8if6pu68j2repq3ef6umd5jgiliup60.apps.googleusercontent.com +spring.security.oauth2.client.registration.google.client-secret=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 +spring.security.oauth2.client.registration.google.scope=email, profile + +spring.security.oauth2.client.registration.gitlab.client-id=b8520a3266089063c0d8261cce36971defa513f5ffd9f9b7a3d16728fc83a494 +spring.security.oauth2.client.registration.gitlab.client-secret=e72c65320cf9d6495984a37b0f9cc03ec46be0bb6f071feaebbfe75168117004 +spring.security.oauth2.client.registration.gitlab.client-name=GitLab +spring.security.oauth2.client.registration.gitlab.redirect-uri="{baseUrl}/login/oauth2/code/{registrationId}" +spring.security.oauth2.client.registration.gitlab.authorization-grant-type=authorization_code +spring.security.oauth2.client.registration.gitlab.scope=read_user + +spring.security.oauth2.client.provider.gitlab.authorization-uri=https://gitlab.com/oauth/authorize +spring.security.oauth2.client.provider.gitlab.token-uri=https://gitlab.com/oauth/token +spring.security.oauth2.client.provider.gitlab.user-info-uri=https://gitlab.com/api/v4/user +spring.security.oauth2.client.provider.gitlab.user-name-attribute=email + +spring.mail.host=smtp.gmail.com +spring.mail.username=jira4jr@gmail.com +spring.mail.password=zdfzsrqvgimldzyj +spring.mail.port=587 + + diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 7fcba1570..4437215a3 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -8,7 +8,12 @@ app: max-pool-size: 100 spring: + messages: + basename: language/messages + encoding: UTF-8 + init: + mode: never jpa: show-sql: true @@ -25,10 +30,6 @@ spring: default_batch_fetch_size: 20 # https://stackoverflow.com/questions/21257819/what-is-the-difference-between-hibernate-jdbc-fetch-size-and-hibernate-jdbc-batc jdbc.batch_size: 20 - datasource: - url: jdbc:postgresql://localhost:5432/jira - username: jira - password: JiraRush liquibase: changeLog: "classpath:db/changelog.sql" @@ -46,59 +47,6 @@ spring: cache-names: users caffeine.spec: maximumSize=10000,expireAfterAccess=5m - security: - oauth2: - client: - registration: - github: - client-id: 3d0d8738e65881fff266 - client-secret: 0f97031ce6178b7dfb67a6af587f37e222a16120 - scope: - - email - google: - client-id: 329113642700-f8if6pu68j2repq3ef6umd5jgiliup60.apps.googleusercontent.com - client-secret: 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 - scope: - - email - - profile - vk: - client-id: 51562377 - client-secret: jNM1YHQy1362Mqs49wUN - client-name: Vkontakte - redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" - client-authentication-method: client_secret_post - authorization-grant-type: authorization_code - scope: email - yandex: - client-id: 2f3395214ba84075956b76a34b231985 - client-secret: ed236c501e444a609b0f419e5e88f1e1 - client-name: Yandex - redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" - authorization-grant-type: authorization_code - gitlab: - client-id: b8520a3266089063c0d8261cce36971defa513f5ffd9f9b7a3d16728fc83a494 - client-secret: e72c65320cf9d6495984a37b0f9cc03ec46be0bb6f071feaebbfe75168117004 - client-name: GitLab - redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}" - authorization-grant-type: authorization_code - scope: read_user - provider: - vk: - authorization-uri: https://oauth.vk.com/authorize - token-uri: https://oauth.vk.com/access_token - user-info-uri: https://api.vk.com/method/users.get?v=8.1 - user-name-attribute: response - yandex: - authorization-uri: https://oauth.yandex.ru/authorize - token-uri: https://oauth.yandex.ru/token - user-info-uri: https://login.yandex.ru/info - user-name-attribute: login - gitlab: - authorization-uri: https://gitlab.com/oauth/authorize - token-uri: https://gitlab.com/oauth/token - user-info-uri: https://gitlab.com/api/v4/user - user-name-attribute: email - sql: init: mode: always @@ -110,10 +58,6 @@ spring: starttls: enable: true auth: true - host: smtp.gmail.com - username: jira4jr@gmail.com - password: zdfzsrqvgimldzyj - port: 587 thymeleaf.check-template-location: false mvc.throw-exception-if-no-handler-found: true diff --git a/src/main/resources/language/messages.properties b/src/main/resources/language/messages.properties new file mode 100644 index 000000000..ddb6d6869 --- /dev/null +++ b/src/main/resources/language/messages.properties @@ -0,0 +1,16 @@ +#-----------Mails----------------------- +mails.confirmation.greetings = \u041F\u0440\u0438\u0432\u0435\u0442 +mails.confirmation.title = JiraRush - \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0435 \u043F\u043E\u0447\u0442\u044B +mails.confirmation.text = \u0427\u0442\u043E\u0431\u044B \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0443 \u0443\u0447\u0435\u0442\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 \u0438 \u043D\u0430\u0447\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F JiraRush, \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043E \u0432\u044B \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0443\u043A\u0430\u0437\u0430\u043B\u0438 \u0432\u0430\u0448\u0443 \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0443\u044E \u043F\u043E\u0447\u0442\u0443. +mails.button.confirm-mail = \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C \u043F\u043E\u0447\u0442\u0443 +mails.password-reset.title = JiraRush - \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u043F\u0430\u0440\u043E\u043B\u044C +mails.password-reset.greetings = \u041F\u0440\u0438\u0432\u0435\u0442 +mails.password-reset.request = \u041C\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u043B\u0438 \u0437\u0430\u043F\u0440\u043E\u0441 \u043D\u0430 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0443 \u043D\u043E\u0432\u043E\u0433\u043E \u043F\u0430\u0440\u043E\u043B\u044F JiraRush \u0434\u043B\u044F \u0443\u0447\u0435\u0442\u043D\u043E\u0439 \u0437\u0430\u043F\u0438\u0441\u0438 +mails.button.reset = \u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C + +#----------Index---------------- +index.title = JiraRush \u0414\u043E\u043C\u0430\u0448\u043D\u044F\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 + + + + diff --git a/src/main/resources/language/messages_en.properties b/src/main/resources/language/messages_en.properties new file mode 100644 index 000000000..7d5c92c6e --- /dev/null +++ b/src/main/resources/language/messages_en.properties @@ -0,0 +1,16 @@ +#-----------Mails----------------------- +mails.confirmation.greetings = Hello +mails.confirmation.title = JiraRush - confirm email +mails.confirmation.text = To complete your account setup and start using JiraRush, please confirm that you have entered your email correctly. +mails.button.confirm-mail = Confirm email +mails.password-reset.title = JiraRush - set a new password +mails.password-reset.greetings = Hello +mails.password-reset.request = We have received a request to set a new JiraRush account password +mails.button.reset = Set password + +#----------Index---------------- +index.title = JiraRush Home page + + + + diff --git a/src/test/java/com/javarush/jira/EnableTestContainers.java b/src/test/java/com/javarush/jira/EnableTestContainers.java new file mode 100644 index 000000000..29c2975a1 --- /dev/null +++ b/src/test/java/com/javarush/jira/EnableTestContainers.java @@ -0,0 +1,15 @@ +package com.javarush.jira; + + +import org.springframework.test.context.ContextConfiguration; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@ContextConfiguration(initializers = TestcontainersInitializer.class) +public @interface EnableTestContainers { +} diff --git a/src/test/java/com/javarush/jira/JiraRushApplicationTests.java b/src/test/java/com/javarush/jira/JiraRushApplicationTests.java index 287178598..ad6a50099 100644 --- a/src/test/java/com/javarush/jira/JiraRushApplicationTests.java +++ b/src/test/java/com/javarush/jira/JiraRushApplicationTests.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.Test; +@EnableTestContainers class JiraRushApplicationTests extends BaseTests { @Test void contextLoads() { diff --git a/src/test/java/com/javarush/jira/TestcontainersInitializer.java b/src/test/java/com/javarush/jira/TestcontainersInitializer.java new file mode 100644 index 000000000..ebb0bbe5b --- /dev/null +++ b/src/test/java/com/javarush/jira/TestcontainersInitializer.java @@ -0,0 +1,27 @@ +package com.javarush.jira; + +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.context.ApplicationContextInitializer; +import org.springframework.context.ConfigurableApplicationContext; +import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.lifecycle.Startables; +import org.testcontainers.utility.DockerImageName; + +public class TestcontainersInitializer implements ApplicationContextInitializer { + + static PostgreSQLContainer postgres = new PostgreSQLContainer<>(DockerImageName.parse("postgres:15.1")); + + static { + Startables.deepStart(postgres).join(); + } + + + @Override + public void initialize(ConfigurableApplicationContext applicationContext) { + TestPropertyValues.of( + "spring.datasource.url=" + postgres.getJdbcUrl(), + "spring.datasource.username=" + postgres.getUsername(), + "spring.datasource.password=" + postgres.getPassword() + ).applyTo(applicationContext.getEnvironment()); + } +} diff --git a/src/test/java/com/javarush/jira/bugtracking/sprint/SprintControllerTest.java b/src/test/java/com/javarush/jira/bugtracking/sprint/SprintControllerTest.java index 503e58781..adb64c5d9 100644 --- a/src/test/java/com/javarush/jira/bugtracking/sprint/SprintControllerTest.java +++ b/src/test/java/com/javarush/jira/bugtracking/sprint/SprintControllerTest.java @@ -1,6 +1,7 @@ package com.javarush.jira.bugtracking.sprint; import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.EnableTestContainers; import com.javarush.jira.bugtracking.sprint.to.SprintTo; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +20,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +@EnableTestContainers class SprintControllerTest extends AbstractControllerTest { private static final String SPRINTS_REST_URL = REST_URL + "/sprints/"; private static final String SPRINTS_BY_PROJECT_REST_URL = SPRINTS_REST_URL + "by-project"; diff --git a/src/test/java/com/javarush/jira/bugtracking/task/TaskControllerTest.java b/src/test/java/com/javarush/jira/bugtracking/task/TaskControllerTest.java index b5c25e992..e92fa89e0 100644 --- a/src/test/java/com/javarush/jira/bugtracking/task/TaskControllerTest.java +++ b/src/test/java/com/javarush/jira/bugtracking/task/TaskControllerTest.java @@ -1,6 +1,7 @@ package com.javarush.jira.bugtracking.task; import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.EnableTestContainers; import com.javarush.jira.bugtracking.UserBelongRepository; import com.javarush.jira.bugtracking.task.to.ActivityTo; import com.javarush.jira.bugtracking.task.to.TaskToExt; @@ -25,6 +26,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +@EnableTestContainers class TaskControllerTest extends AbstractControllerTest { private static final String TASKS_REST_URL_SLASH = REST_URL + "/"; private static final String TASKS_BY_PROJECT_REST_URL = REST_URL + "/by-project"; diff --git a/src/test/java/com/javarush/jira/login/internal/web/AdminUserControllerTest.java b/src/test/java/com/javarush/jira/login/internal/web/AdminUserControllerTest.java index 43a770b22..0597c2441 100644 --- a/src/test/java/com/javarush/jira/login/internal/web/AdminUserControllerTest.java +++ b/src/test/java/com/javarush/jira/login/internal/web/AdminUserControllerTest.java @@ -1,6 +1,7 @@ package com.javarush.jira.login.internal.web; import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.EnableTestContainers; import com.javarush.jira.login.Role; import com.javarush.jira.login.User; import com.javarush.jira.login.internal.UserRepository; @@ -23,6 +24,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +@EnableTestContainers class AdminUserControllerTest extends AbstractControllerTest { private static final String REST_URL_SLASH = REST_URL + '/'; diff --git a/src/test/java/com/javarush/jira/login/internal/web/RegisterControllerTest.java b/src/test/java/com/javarush/jira/login/internal/web/RegisterControllerTest.java index 6d1e1d55f..6c8b08f24 100644 --- a/src/test/java/com/javarush/jira/login/internal/web/RegisterControllerTest.java +++ b/src/test/java/com/javarush/jira/login/internal/web/RegisterControllerTest.java @@ -1,6 +1,7 @@ package com.javarush.jira.login.internal.web; import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.EnableTestContainers; import com.javarush.jira.login.UserTo; import com.javarush.jira.login.internal.verification.ConfirmData; import org.junit.jupiter.api.Test; @@ -17,6 +18,7 @@ import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +@EnableTestContainers class RegisterControllerTest extends AbstractControllerTest { @Test diff --git a/src/test/java/com/javarush/jira/login/internal/web/UserControllerTest.java b/src/test/java/com/javarush/jira/login/internal/web/UserControllerTest.java index d6790ff3b..57b086f77 100644 --- a/src/test/java/com/javarush/jira/login/internal/web/UserControllerTest.java +++ b/src/test/java/com/javarush/jira/login/internal/web/UserControllerTest.java @@ -1,6 +1,7 @@ package com.javarush.jira.login.internal.web; import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.EnableTestContainers; import com.javarush.jira.login.User; import com.javarush.jira.login.UserTo; import com.javarush.jira.login.internal.UserMapper; @@ -23,6 +24,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +@EnableTestContainers class UserControllerTest extends AbstractControllerTest { @Autowired diff --git a/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java b/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java index a6fd5e3bf..11ff32a36 100644 --- a/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java +++ b/src/test/java/com/javarush/jira/profile/internal/web/ProfileRestControllerTest.java @@ -1,8 +1,113 @@ package com.javarush.jira.profile.internal.web; import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.EnableTestContainers; +import com.javarush.jira.profile.ProfileTo; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.test.context.support.WithUserDetails; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import static com.javarush.jira.common.util.JsonUtil.writeValue; +import static com.javarush.jira.login.internal.web.UserTestData.USER_MAIL; +import static com.javarush.jira.profile.internal.web.ProfileRestController.REST_URL; +import static com.javarush.jira.profile.internal.web.ProfileTestData.*; +import static org.springframework.http.MediaType.APPLICATION_JSON; +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; +@SpringBootTest +@EnableTestContainers class ProfileRestControllerTest extends AbstractControllerTest { + @Test + @WithUserDetails(value = USER_MAIL) + void getWithAdminEmail() throws Exception { + perform(MockMvcRequestBuilders.get(REST_URL)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)); + } + + @Test + void getUnauthorized() throws Exception { + perform(MockMvcRequestBuilders.get(REST_URL)) + .andExpect(status().isUnauthorized()) + .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)); + } + + @Test + @WithUserDetails(value = USER_MAIL) + void get() throws Exception { + perform(MockMvcRequestBuilders.get(REST_URL)) + .andDo(print()) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) + .andExpect(PROFILE_TO_MATCHER.contentJson(USER_PROFILE_TO)); + } + + @Test + @WithUserDetails(value = USER_MAIL) + void update() throws Exception { + ProfileTo updatedTo = getUpdatedTo(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(APPLICATION_JSON).content(writeValue(updatedTo))) + .andExpect(status().isNoContent()); + + perform(MockMvcRequestBuilders.get(REST_URL)) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith(APPLICATION_JSON)) + .andExpect(PROFILE_TO_MATCHER.contentJson(getUpdatedTo())); + } + + @Test + @WithUserDetails(value = USER_MAIL) + void updateInvalid() throws Exception { + ProfileTo updatedTo = getInvalidTo(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(APPLICATION_JSON).content(writeValue(updatedTo))) + .andExpect(status().isUnprocessableEntity()); + } + + @Test + @WithUserDetails(value = USER_MAIL) + void updateWithUnknownNotificationTo() throws Exception { + ProfileTo updatedTo = getWithUnknownNotificationTo(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(APPLICATION_JSON).content(writeValue(updatedTo))) + .andExpect(status().isUnprocessableEntity()); + } + + @Test + @WithUserDetails(value = USER_MAIL) + void updateWithUnknownContactTo() throws Exception { + ProfileTo updatedTo = getWithUnknownContactTo(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(APPLICATION_JSON).content(writeValue(updatedTo))) + .andExpect(status().isUnprocessableEntity()); + } + + @Test + @WithUserDetails(value = USER_MAIL) + void updateWithContactHtmlUnsafeTo() throws Exception { + ProfileTo updatedTo = getWithContactHtmlUnsafeTo(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(APPLICATION_JSON).content(writeValue(updatedTo))) + .andExpect(status().isUnprocessableEntity()); + } + + @Test + @WithUserDetails(value = USER_MAIL) + void getNew() throws Exception { + ProfileTo newTo = getNewTo(); + perform(MockMvcRequestBuilders.put(REST_URL) + .contentType(APPLICATION_JSON).content(writeValue(newTo))) + .andExpect(status().is2xxSuccessful()); + } + + + + + } \ No newline at end of file diff --git a/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java b/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java index fb4407268..454549729 100644 --- a/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java +++ b/src/test/java/com/javarush/jira/profile/internal/web/ProfileTestData.java @@ -10,9 +10,14 @@ import java.util.Set; public class ProfileTestData { + + public static MatcherFactory.Matcher PROFILE_MATCHER = MatcherFactory.usingIgnoringFieldsComparator(Profile.class, "user"); + public static MatcherFactory.Matcher PROFILE_TO_MATCHER = + MatcherFactory.usingIgnoringFieldsComparator(ProfileTo.class, "user", "id"); + public static ProfileTo USER_PROFILE_TO = new ProfileTo(null, Set.of("assigned", "overdue", "deadline"), Set.of(new ContactTo("skype", "userSkype"), diff --git a/src/test/java/com/javarush/jira/project/internal/web/ProjectControllerTest.java b/src/test/java/com/javarush/jira/project/internal/web/ProjectControllerTest.java index 4e49e9beb..b4bfb910c 100644 --- a/src/test/java/com/javarush/jira/project/internal/web/ProjectControllerTest.java +++ b/src/test/java/com/javarush/jira/project/internal/web/ProjectControllerTest.java @@ -1,6 +1,7 @@ package com.javarush.jira.project.internal.web; import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.EnableTestContainers; import com.javarush.jira.bugtracking.project.Project; import com.javarush.jira.bugtracking.project.ProjectRepository; import com.javarush.jira.common.BaseHandler; @@ -19,6 +20,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +@EnableTestContainers public class ProjectControllerTest extends AbstractControllerTest { private static final String REST_URL_PROJECT = BaseHandler.REST_URL + "/projects"; private static final String REST_URL_MNGR_PROJECT = BaseHandler.REST_URL + "/mngr/projects"; diff --git a/src/test/java/com/javarush/jira/ref/internal/web/ReferenceControllerTest.java b/src/test/java/com/javarush/jira/ref/internal/web/ReferenceControllerTest.java index 7164e6435..42e02e09e 100644 --- a/src/test/java/com/javarush/jira/ref/internal/web/ReferenceControllerTest.java +++ b/src/test/java/com/javarush/jira/ref/internal/web/ReferenceControllerTest.java @@ -1,6 +1,7 @@ package com.javarush.jira.ref.internal.web; import com.javarush.jira.AbstractControllerTest; +import com.javarush.jira.EnableTestContainers; import com.javarush.jira.ref.RefTo; import com.javarush.jira.ref.RefType; import com.javarush.jira.ref.ReferenceService; @@ -23,7 +24,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - +@EnableTestContainers public class ReferenceControllerTest extends AbstractControllerTest { private static final String REST_URL = ReferenceController.REST_URL + "/"; diff --git a/src/test/resources/application-test.yaml b/src/test/resources/application-test.yaml index 51137fd06..90a2e75c3 100644 --- a/src/test/resources/application-test.yaml +++ b/src/test/resources/application-test.yaml @@ -1,8 +1,9 @@ spring.cache.type: none spring: - init: - mode: always - datasource: - url: jdbc:postgresql://localhost:5433/jira-test - username: jira - password: JiraRush \ No newline at end of file + sql: + init: + mode: always + + mail: + username: test@gmail.com + password: test \ No newline at end of file