From c5f0d5443d36ac5396945004cb71c6e2241604e7 Mon Sep 17 00:00:00 2001 From: Leonid Date: Wed, 5 Mar 2025 16:57:32 +0300 Subject: [PATCH] =?UTF-8?q?-=20=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=20=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D1=8C=20"=D0=BB=D0=B0=D0=B9=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D1=8C"=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B8=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE?= =?UTF-8?q?=20"=D0=BB=D0=B0=D0=B9=D0=BA=D0=B0=D1=85".?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://www.youtube.com/watch?v=QhMBtnS6SrI&list=PLU2ftbIeotGpAYRP9Iv2KLIwK36-o_qYk&index=32 --- .../sweater/controller/MainController.java | 24 ++-- .../sweater/controller/MessageController.java | 115 ++++++++++++++++++ .../sweater/controller/UserController.java | 2 +- .../controller/UserMessagesController.java | 73 ----------- .../sytes/kashey/sweater/domain/Message.java | 23 +++- .../net/sytes/kashey/sweater/domain/User.java | 6 +- .../kashey/sweater/domain/dto/MessageDto.java | 68 +++++++++++ .../sweater/domain/util/MessageHelper.java | 9 ++ .../sweater/repository/MessageRepository.java | 36 +++++- .../sweater/service/MessageService.java | 33 +++++ .../migration/V4__Add_message_likes_table.sql | 8 ++ src/main/resources/templates/parts/common.ftl | 23 +++- .../resources/templates/parts/messageList.ftl | 52 ++++---- src/main/resources/templates/parts/pager.ftl | 78 ++++++------ .../controller/MainControllerTest.java | 10 +- src/test/resources/import.sql | 11 ++ 16 files changed, 413 insertions(+), 158 deletions(-) create mode 100644 src/main/java/net/sytes/kashey/sweater/controller/MessageController.java delete mode 100644 src/main/java/net/sytes/kashey/sweater/controller/UserMessagesController.java create mode 100644 src/main/java/net/sytes/kashey/sweater/domain/dto/MessageDto.java create mode 100644 src/main/java/net/sytes/kashey/sweater/domain/util/MessageHelper.java create mode 100644 src/main/java/net/sytes/kashey/sweater/service/MessageService.java create mode 100644 src/main/resources/db/migration/V4__Add_message_likes_table.sql diff --git a/src/main/java/net/sytes/kashey/sweater/controller/MainController.java b/src/main/java/net/sytes/kashey/sweater/controller/MainController.java index 28ca0b2..d9e9423 100644 --- a/src/main/java/net/sytes/kashey/sweater/controller/MainController.java +++ b/src/main/java/net/sytes/kashey/sweater/controller/MainController.java @@ -2,9 +2,13 @@ package net.sytes.kashey.sweater.controller; import jakarta.validation.Valid; import net.sytes.kashey.sweater.domain.Message; +import net.sytes.kashey.sweater.domain.User; +import net.sytes.kashey.sweater.domain.dto.MessageDto; import net.sytes.kashey.sweater.repository.MessageRepository; import net.sytes.kashey.sweater.security.CustomUserDetails; +import net.sytes.kashey.sweater.service.MessageService; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.web.PageableDefault; @@ -24,12 +28,15 @@ import java.util.Map; public class MainController { private final MessageRepository messageRepository; + private final MessageService messageService; @Value("${upload.path}") private String uploadPath; - public MainController(MessageRepository messageRepository) { + public MainController(MessageRepository messageRepository, MessageService messageService) { this.messageRepository = messageRepository; + this.messageService = messageService; + } @GetMapping("/") @@ -40,13 +47,11 @@ public class MainController { @GetMapping("/main") public String findAllMessages(@RequestParam(required = false, defaultValue = "") String tag, Model model, - @PageableDefault(sort = {"id"}, direction = Sort.Direction.DESC) Pageable pageable) { + @PageableDefault(sort = {"id"}, direction = Sort.Direction.DESC) Pageable pageable, + @AuthenticationPrincipal CustomUserDetails customUserDetails) { - if (tag == null || tag.isEmpty()) { - model.addAttribute("page", messageRepository.findAll(pageable)); - } else { - model.addAttribute("page", messageRepository.findByTag(tag, pageable)); - } + Page page = messageService.getFilteredMessagePage(tag, pageable, customUserDetails); + model.addAttribute("page", page); model.addAttribute("tag", tag); model.addAttribute("url", "/main"); return "main"; @@ -61,7 +66,8 @@ public class MainController { @RequestParam("file") MultipartFile file ) throws IOException { - message.setAuthor(customUserDetails.getUser()); + User user = customUserDetails.getUser(); + message.setAuthor(user); if (bindingResult.hasErrors()) { Map errorsMap = ControllerUtils.getErrors(bindingResult); @@ -72,7 +78,7 @@ public class MainController { messageRepository.save(message); model.addAttribute("message", null); } - model.addAttribute("page", messageRepository.findAll(pageable)); + model.addAttribute("page", messageRepository.findAll(pageable, user)); model.addAttribute("url", "/main"); model.addAttribute("tag", ""); return "main"; diff --git a/src/main/java/net/sytes/kashey/sweater/controller/MessageController.java b/src/main/java/net/sytes/kashey/sweater/controller/MessageController.java new file mode 100644 index 0000000..871262c --- /dev/null +++ b/src/main/java/net/sytes/kashey/sweater/controller/MessageController.java @@ -0,0 +1,115 @@ +package net.sytes.kashey.sweater.controller; + + +import jakarta.transaction.Transactional; +import net.sytes.kashey.sweater.domain.Message; +import net.sytes.kashey.sweater.domain.User; +import net.sytes.kashey.sweater.domain.dto.MessageDto; +import net.sytes.kashey.sweater.repository.MessageRepository; +import net.sytes.kashey.sweater.security.CustomUserDetails; +import net.sytes.kashey.sweater.service.MessageService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; + +import java.io.IOException; +import java.util.Set; + +@Controller +@RequestMapping("/") +public class MessageController { + + private final MessageRepository messageRepository; + private final MessageService messageService; + + @Value("${upload.path}") + private String uploadPath; + + public MessageController(MessageRepository messageRepository, MessageService messageService) { + + this.messageRepository = messageRepository; + this.messageService = messageService; + } + + @GetMapping("/user-messages/{author}") + public String getUserMessages( + @PathVariable User author, + @RequestParam(required = false) Message message, + @AuthenticationPrincipal CustomUserDetails customUserDetails, + @PageableDefault(sort = {"id"}, direction = Sort.Direction.DESC) Pageable pageable, + Model model) { + + User currentUser = customUserDetails.getUser(); + model.addAttribute("isCurrentUser", author.equals(currentUser)); + model.addAttribute("message", message); + model.addAttribute("userChannel", author); + model.addAttribute("subscribersCount", author.getSubscribers().size()); + model.addAttribute("subscriptionsCount", author.getSubscriptions().size()); + model.addAttribute("isSubscriber", author.getSubscribers().contains(currentUser)); + model.addAttribute("url", "/user-messages/" + author.getId()); + Page page = messageService.getMessagesByUserPage(currentUser, pageable, author); + model.addAttribute("page", page); + + return "user_messages"; + } + + @PostMapping("/user-messages/{userId}") + public String getUserMessage(@AuthenticationPrincipal CustomUserDetails customUserDetails, + @PathVariable(name = "userId") Long userId, + @ModelAttribute Message message, + @RequestParam String text, + @RequestParam String tag, + @RequestParam("file") MultipartFile file + ) throws IOException { + + message.setAuthor(customUserDetails.getUser()); + + if (!ObjectUtils.isEmpty(text)) { + message.setText(text); + } + + if (!ObjectUtils.isEmpty(tag)) { + message.setTag(tag); + } + + ControllerUtils.saveFile(message, file, uploadPath); + messageRepository.save(message); + return "redirect:/user-messages/" + userId; + } + + @GetMapping("/messages/{message}/like") + @Transactional + public String like(@AuthenticationPrincipal CustomUserDetails customUserDetails, + @PathVariable Message message, + RedirectAttributes redirectAttributes, + @RequestHeader(required = false) String referer) { + + User currentUser = customUserDetails.getUser(); + Set likes = message.getLikes(); + + if (likes.contains(currentUser)) { + likes.remove(currentUser); + } else { + likes.add(currentUser); + } + + UriComponents components = UriComponentsBuilder.fromHttpUrl(referer).build(); + + components.getQueryParams() + .entrySet() + .forEach(pair -> redirectAttributes.addAttribute(pair.getKey(), pair.getValue())); + + return "redirect:" + components.getPath(); + } +} \ No newline at end of file diff --git a/src/main/java/net/sytes/kashey/sweater/controller/UserController.java b/src/main/java/net/sytes/kashey/sweater/controller/UserController.java index c3770eb..f46549b 100644 --- a/src/main/java/net/sytes/kashey/sweater/controller/UserController.java +++ b/src/main/java/net/sytes/kashey/sweater/controller/UserController.java @@ -79,7 +79,7 @@ public class UserController { if ("subscribers".equals(type)) { model.addAttribute("users", user.getSubscribers()); } else if ("subscriptions".equals(type)) { - model.addAttribute("users", user.getSubscribtions()); + model.addAttribute("users", user.getSubscriptions()); } return "subscriptions"; diff --git a/src/main/java/net/sytes/kashey/sweater/controller/UserMessagesController.java b/src/main/java/net/sytes/kashey/sweater/controller/UserMessagesController.java deleted file mode 100644 index e486b17..0000000 --- a/src/main/java/net/sytes/kashey/sweater/controller/UserMessagesController.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.sytes.kashey.sweater.controller; - - -import net.sytes.kashey.sweater.domain.Message; -import net.sytes.kashey.sweater.domain.User; -import net.sytes.kashey.sweater.repository.MessageRepository; -import net.sytes.kashey.sweater.security.CustomUserDetails; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.util.ObjectUtils; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; - -@Controller -@RequestMapping("/") -public class UserMessagesController { - - private final MessageRepository messageRepository; - - @Value("${upload.path}") - private String uploadPath; - - public UserMessagesController(MessageRepository messageRepository) { - - this.messageRepository = messageRepository; - } - - @GetMapping("/user-messages/{user}") - public String getUserMessages(@PathVariable User user, - @RequestParam(required = false) Message message, - @AuthenticationPrincipal CustomUserDetails customUserDetails, - Model model) { - - User currentUser = customUserDetails.getUser(); - model.addAttribute("isCurrentUser", user.equals(currentUser)); - model.addAttribute("messages", user.getMessages()); - model.addAttribute("message", message); - model.addAttribute("userChannel", user); - model.addAttribute("subscribersCount", user.getSubscribers().size()); - model.addAttribute("subscriptionsCount", user.getSubscribtions().size()); - model.addAttribute("isSubscriber", user.getSubscribers().contains(currentUser)); - - return "user_messages"; - } - - @PostMapping("/user-messages/{userId}") - public String getUserMessage(@AuthenticationPrincipal CustomUserDetails customUserDetails, - @PathVariable(name = "userId") Long userId, - @ModelAttribute Message message, - @RequestParam String text, - @RequestParam String tag, - @RequestParam("file") MultipartFile file - ) throws IOException { - - message.setAuthor(customUserDetails.getUser()); - - if (!ObjectUtils.isEmpty(text)) { - message.setText(text); - } - - if (!ObjectUtils.isEmpty(tag)) { - message.setTag(tag); - } - - ControllerUtils.saveFile(message, file, uploadPath); - messageRepository.save(message); - return "redirect:/user-messages/" + userId; - } -} \ No newline at end of file diff --git a/src/main/java/net/sytes/kashey/sweater/domain/Message.java b/src/main/java/net/sytes/kashey/sweater/domain/Message.java index 81b8510..b3a6470 100644 --- a/src/main/java/net/sytes/kashey/sweater/domain/Message.java +++ b/src/main/java/net/sytes/kashey/sweater/domain/Message.java @@ -2,8 +2,12 @@ package net.sytes.kashey.sweater.domain; import jakarta.persistence.*; import jakarta.validation.constraints.NotBlank; +import net.sytes.kashey.sweater.domain.util.MessageHelper; import org.hibernate.validator.constraints.Length; +import java.util.HashSet; +import java.util.Set; + @Entity public class Message { @Id @@ -22,6 +26,14 @@ public class Message { @JoinColumn(name = "user_id") private User author; + @ManyToMany + @JoinTable( + name = "message_likes", + joinColumns = {@JoinColumn(name = "message_id")}, + inverseJoinColumns = {@JoinColumn(name = "user_id")} + ) + private Set likes = new HashSet<>(); + public Message() { } @@ -64,7 +76,8 @@ public class Message { } public String getAuthorName() { - return author == null ? "<none>" : author.getUsername(); + + return MessageHelper.getAuthorName(author); } public String getFilename() { @@ -74,4 +87,12 @@ public class Message { public void setFilename(String filename) { this.filename = filename; } + + public Set getLikes() { + return likes; + } + + public void setLikes(Set likes) { + this.likes = likes; + } } diff --git a/src/main/java/net/sytes/kashey/sweater/domain/User.java b/src/main/java/net/sytes/kashey/sweater/domain/User.java index 7ac6ed9..ce69b8c 100644 --- a/src/main/java/net/sytes/kashey/sweater/domain/User.java +++ b/src/main/java/net/sytes/kashey/sweater/domain/User.java @@ -145,11 +145,11 @@ public class User implements Serializable { this.subscribers = subscribers; } - public Set getSubscribtions() { + public Set getSubscriptions() { return subscribtions; } - public void setSubscribtions(Set subscribtions) { - this.subscribtions = subscribtions; + public void setSubscriptions(Set subscriptions) { + this.subscribtions = subscriptions; } } diff --git a/src/main/java/net/sytes/kashey/sweater/domain/dto/MessageDto.java b/src/main/java/net/sytes/kashey/sweater/domain/dto/MessageDto.java new file mode 100644 index 0000000..dc11b83 --- /dev/null +++ b/src/main/java/net/sytes/kashey/sweater/domain/dto/MessageDto.java @@ -0,0 +1,68 @@ +package net.sytes.kashey.sweater.domain.dto; + +import net.sytes.kashey.sweater.domain.Message; +import net.sytes.kashey.sweater.domain.User; +import net.sytes.kashey.sweater.domain.util.MessageHelper; + +public class MessageDto { + private final Long id; + private final String text; + private final String tag; + private final User author; + private final String filename; + private final Long likes; + private final Boolean meLiked; + + public MessageDto(Message message, Long likes, Boolean meLiked) { + this.id = message.getId(); + this.text = message.getText(); + this.tag = message.getTag(); + this.author = message.getAuthor(); + this.filename = message.getFilename(); + this.likes = likes; + this.meLiked = meLiked; + } + + public String getAuthorName() { + return MessageHelper.getAuthorName(author); + } + + public Long getId() { + return id; + } + + public String getText() { + return text; + } + + public String getTag() { + return tag; + } + + public User getAuthor() { + return author; + } + + + public String getFilename() { + return filename; + } + + public Long getLikes() { + return likes; + } + + public Boolean getMeLiked() { + return meLiked; + } + + @Override + public String toString() { + return "MessageDto{" + + "id=" + id + + ", author=" + author + + ", likes=" + likes + + ", meLiked=" + meLiked + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/net/sytes/kashey/sweater/domain/util/MessageHelper.java b/src/main/java/net/sytes/kashey/sweater/domain/util/MessageHelper.java new file mode 100644 index 0000000..118bba0 --- /dev/null +++ b/src/main/java/net/sytes/kashey/sweater/domain/util/MessageHelper.java @@ -0,0 +1,9 @@ +package net.sytes.kashey.sweater.domain.util; + +import net.sytes.kashey.sweater.domain.User; + +public abstract class MessageHelper { + public static String getAuthorName(User author) { + return author == null ? "<none>" : author.getUsername(); + } +} \ No newline at end of file diff --git a/src/main/java/net/sytes/kashey/sweater/repository/MessageRepository.java b/src/main/java/net/sytes/kashey/sweater/repository/MessageRepository.java index f61a68f..5883ef5 100644 --- a/src/main/java/net/sytes/kashey/sweater/repository/MessageRepository.java +++ b/src/main/java/net/sytes/kashey/sweater/repository/MessageRepository.java @@ -1,13 +1,45 @@ package net.sytes.kashey.sweater.repository; import net.sytes.kashey.sweater.domain.Message; +import net.sytes.kashey.sweater.domain.User; +import net.sytes.kashey.sweater.domain.dto.MessageDto; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; public interface MessageRepository extends CrudRepository { - Page findByTag(String tag, Pageable pageable); + @Query("select new net.sytes.kashey.sweater.domain.dto.MessageDto(\n" + + " m, \n" + + " count(ml), \n" + + " sum(case when ml = :user then 1 else 0 end) > 0\n" + + ") \n" + + "from Message as m " + + "left join m.likes as ml \n" + + "where m.tag = :tag \n" + + "group by m") + Page findByTag(@Param("tag") String tag, Pageable pageable, @Param("user") User user); - Page findAll(Pageable pageable); + @Query("select new net.sytes.kashey.sweater.domain.dto.MessageDto(\n" + + " m, \n" + + " count(ml), \n" + + " sum(case when ml = :user then 1 else 0 end) > 0\n" + + ") \n" + + "from Message as m \n" + + "left join m.likes as ml \n" + + "group by m") + Page findAll(Pageable pageable, @Param("user") User user); + + @Query("select new net.sytes.kashey.sweater.domain.dto.MessageDto(\n" + + " m, \n" + + " count(ml), \n" + + " sum(case when ml = :user then 1 else 0 end) > 0\n" + + ") \n" + + "from Message as m " + + "left join m.likes as ml \n" + + "where m.author = :author\n" + + "group by m") + Page findByUser(@Param("author") User author, Pageable pageable, @Param("user") User user); } diff --git a/src/main/java/net/sytes/kashey/sweater/service/MessageService.java b/src/main/java/net/sytes/kashey/sweater/service/MessageService.java new file mode 100644 index 0000000..c09b446 --- /dev/null +++ b/src/main/java/net/sytes/kashey/sweater/service/MessageService.java @@ -0,0 +1,33 @@ +package net.sytes.kashey.sweater.service; + +import net.sytes.kashey.sweater.domain.User; +import net.sytes.kashey.sweater.domain.dto.MessageDto; +import net.sytes.kashey.sweater.repository.MessageRepository; +import net.sytes.kashey.sweater.security.CustomUserDetails; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +@Service +public class MessageService { + + private final MessageRepository messageRepository; + + public MessageService(MessageRepository messageRepository) { + this.messageRepository = messageRepository; + } + + public Page getMessagesByUserPage(User user, Pageable pageable, User author) { + + return messageRepository.findByUser(user, pageable, author); + } + + public Page getFilteredMessagePage(String tag, Pageable pageable, CustomUserDetails customUserDetails) { + User user = customUserDetails.getUser(); + if (tag == null || tag.isEmpty()) { + return messageRepository.findAll(pageable, user); + } else { + return messageRepository.findByTag(tag, pageable, user); + } + } +} \ No newline at end of file diff --git a/src/main/resources/db/migration/V4__Add_message_likes_table.sql b/src/main/resources/db/migration/V4__Add_message_likes_table.sql new file mode 100644 index 0000000..4b02e19 --- /dev/null +++ b/src/main/resources/db/migration/V4__Add_message_likes_table.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS message_likes +( + message_id BIGINT NOT NULL, + user_id BIGINT NOT NULL, + PRIMARY KEY (message_id, user_id), + CONSTRAINT fk_message_likes_message FOREIGN KEY (message_id) REFERENCES message (id), + CONSTRAINT fk_message_likes_user FOREIGN KEY (user_id) REFERENCES usr (id) +) ENGINE = InnoDB; \ No newline at end of file diff --git a/src/main/resources/templates/parts/common.ftl b/src/main/resources/templates/parts/common.ftl index 6abe296..41a4e75 100644 --- a/src/main/resources/templates/parts/common.ftl +++ b/src/main/resources/templates/parts/common.ftl @@ -3,21 +3,32 @@ Sweater - + - + + <#include "navbar.ftl">
- <#nested> + <#nested>
- - - + + + diff --git a/src/main/resources/templates/parts/messageList.ftl b/src/main/resources/templates/parts/messageList.ftl index 8240885..9f62054 100644 --- a/src/main/resources/templates/parts/messageList.ftl +++ b/src/main/resources/templates/parts/messageList.ftl @@ -2,28 +2,38 @@ <#import "pager.ftl" as p> <@p.pager url page! /> -
- <#list page.content as message> -
-
- <#if message.filename??> - - -
- ${message.text}
- #${message.tag} -
- + <#else> + No message + +
<@p.pager url page /> \ No newline at end of file diff --git a/src/main/resources/templates/parts/pager.ftl b/src/main/resources/templates/parts/pager.ftl index a789ef4..5298c39 100644 --- a/src/main/resources/templates/parts/pager.ftl +++ b/src/main/resources/templates/parts/pager.ftl @@ -14,43 +14,47 @@ <#else> <#assign body = 1..page.getTotalPages()> -
-
    -
  • - Pages -
  • - <#list body as p> - <#if (p - 1) == page.getNumber()> -
  • - ${p} -
  • - <#elseif p == -1> -
  • - ... -
  • - <#else> -
  • - ${p} -
  • - - -
+
+
+
    +
  • + Pages +
  • + <#list body as p> + <#if (p - 1) == page.getNumber()> +
  • + ${p} +
  • + <#elseif p == -1> +
  • + ... +
  • + <#else> +
  • + ${p} +
  • + + +
-
    -
  • - Items per page -
  • - <#list [5, 10, 25, 50] as c> - <#if c == page.getSize()> -
  • - ${c} -
  • - <#else> -
  • - ${c} -
  • - - -
+
    +
  • + Items per page +
  • + <#list [5, 10, 25, 50] as c> + <#if c == page.getSize()> +
  • + ${c} +
  • + <#else> +
  • + ${c} +
  • + + +
+
\ No newline at end of file diff --git a/src/test/java/net/sytes/kashey/sweater/controller/MainControllerTest.java b/src/test/java/net/sytes/kashey/sweater/controller/MainControllerTest.java index 8413fe2..a2ded77 100644 --- a/src/test/java/net/sytes/kashey/sweater/controller/MainControllerTest.java +++ b/src/test/java/net/sytes/kashey/sweater/controller/MainControllerTest.java @@ -79,8 +79,8 @@ public class MainControllerTest { .andDo(print()) .andExpect(authenticated()) .andExpect(xpath("//*[@id='message-list']/div").nodeCount(2)) - .andExpect(xpath("//*[@id='message-list']/div/div[@data-id='1']").exists()) - .andExpect(xpath("//*[@id='message-list']/div/div[@data-id='3']").exists()); + .andExpect(xpath("/html/body/div/div[4]/div[@data-id='1']").exists()) + .andExpect(xpath("/html/body/div/div[4]/div[@data-id='3']").exists()); } @Test @@ -95,8 +95,8 @@ public class MainControllerTest { .andDo(print()) .andExpect(authenticated()) .andExpect(xpath("//*[@id='message-list']/div").nodeCount(5)) - .andExpect(xpath("//*[@id='message-list']/div/div[@data-id='5']").exists()) - .andExpect(xpath("//*[@id='message-list']/div/div[@data-id='5']/div/span").string("fifth")) - .andExpect(xpath("//*[@id='message-list']/div/div[@data-id='5']/div/i").string("#new one")); + .andExpect(xpath("/html/body/div/div[4]/div[@data-id='5']").exists()) + .andExpect(xpath("/html/body/div/div[4]/div[@data-id='5']/div/span").string("fifth")) + .andExpect(xpath("/html/body/div/div[4]/div[@data-id='5']/div/i").string("#new one")); } } \ No newline at end of file diff --git a/src/test/resources/import.sql b/src/test/resources/import.sql index c158121..e4eacb3 100644 --- a/src/test/resources/import.sql +++ b/src/test/resources/import.sql @@ -1,5 +1,7 @@ +DROP TABLE IF EXISTS message_likes; DROP TABLE IF EXISTS message; + CREATE TABLE IF NOT EXISTS message ( id BIGINT AUTO_INCREMENT PRIMARY KEY, @@ -26,6 +28,15 @@ CREATE TABLE IF NOT EXISTS usr primary key (id) ) engine = InnoDB; +CREATE TABLE IF NOT EXISTS message_likes +( + message_id BIGINT NOT NULL, + user_id BIGINT NOT NULL, + PRIMARY KEY (message_id, user_id), + CONSTRAINT fk_message_likes_message FOREIGN KEY (message_id) REFERENCES message (id), + CONSTRAINT fk_message_likes_user FOREIGN KEY (user_id) REFERENCES usr (id) +) ENGINE = InnoDB; + DELETE FROM user_role;