From 76ed6985d88053153e187a217a18e89d0d231e2a Mon Sep 17 00:00:00 2001 From: DOHA Date: Tue, 3 Mar 2015 23:09:29 +0200 Subject: [PATCH] modify schedule reddit --- ...yAuthorizationCodeAccessTokenProvider.java | 27 +++-- .../org/baeldung/config/SessionListener.java | 8 +- .../persistence/dao/PostRepository.java | 4 +- .../persistence/dao/UserRepository.java | 5 +- .../org/baeldung/persistence/model/Post.java | 5 + .../org/baeldung/persistence/model/User.java | 18 +++- .../reddit/util/RedditApiConstants.java | 19 ++++ .../org/baeldung/web/RedditController.java | 56 +++++----- .../baeldung/web/RestExceptionHandler.java | 4 +- .../baeldung/web/schedule/ScheduledTasks.java | 42 ++++---- .../src/main/resources/persistence.properties | 2 +- .../persistence/PersistenceJPATest.java | 100 ++++++++++++++++++ 12 files changed, 214 insertions(+), 76 deletions(-) create mode 100644 spring-security-oauth/src/main/java/org/baeldung/reddit/util/RedditApiConstants.java create mode 100644 spring-security-oauth/src/test/java/org/baeldung/persistence/PersistenceJPATest.java diff --git a/spring-security-oauth/src/main/java/org/baeldung/config/MyAuthorizationCodeAccessTokenProvider.java b/spring-security-oauth/src/main/java/org/baeldung/config/MyAuthorizationCodeAccessTokenProvider.java index 598f97a556..586e8a964d 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/config/MyAuthorizationCodeAccessTokenProvider.java +++ b/spring-security-oauth/src/main/java/org/baeldung/config/MyAuthorizationCodeAccessTokenProvider.java @@ -25,11 +25,11 @@ public class MyAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAcc private static final long serialVersionUID = 3822611002661972274L; - private StateKeyGenerator stateKeyGenerator = new DefaultStateKeyGenerator(); + private final StateKeyGenerator stateKeyGenerator = new DefaultStateKeyGenerator(); @Override public OAuth2AccessToken obtainAccessToken(OAuth2ProtectedResourceDetails details, AccessTokenRequest request) throws UserRedirectRequiredException, UserApprovalRequiredException, AccessDeniedException, OAuth2AccessDeniedException { - AuthorizationCodeResourceDetails resource = (AuthorizationCodeResourceDetails) details; + final AuthorizationCodeResourceDetails resource = (AuthorizationCodeResourceDetails) details; if (request.getAuthorizationCode() == null) { if (request.getStateKey() == null) { @@ -41,16 +41,16 @@ public class MyAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAcc } private HttpHeaders getHeadersForTokenRequest(AccessTokenRequest request) { - HttpHeaders headers = new HttpHeaders(); + final HttpHeaders headers = new HttpHeaders(); return headers; } private MultiValueMap getParametersForTokenRequest(AuthorizationCodeResourceDetails resource, AccessTokenRequest request) { - MultiValueMap form = new LinkedMultiValueMap(); + final MultiValueMap form = new LinkedMultiValueMap(); form.set("grant_type", "authorization_code"); form.set("code", request.getAuthorizationCode()); - Object preservedState = request.getPreservedState(); + final Object preservedState = request.getPreservedState(); if (request.getStateKey() != null) { if (preservedState == null) { throw new InvalidRequestException("Possible CSRF detected - state parameter was present but no state could be found"); @@ -64,7 +64,7 @@ public class MyAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAcc redirectUri = resource.getRedirectUri(request); } - if (redirectUri != null && !"NONE".equals(redirectUri)) { + if ((redirectUri != null) && !"NONE".equals(redirectUri)) { form.set("redirect_uri", redirectUri); } @@ -72,24 +72,23 @@ public class MyAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAcc } private UserRedirectRequiredException getRedirectForAuthorization(AuthorizationCodeResourceDetails resource, AccessTokenRequest request) { - TreeMap requestParameters = new TreeMap(); + final TreeMap requestParameters = new TreeMap(); requestParameters.put("response_type", "code"); requestParameters.put("client_id", resource.getClientId()); requestParameters.put("duration", "permanent"); - System.out.println("===== at private message redirect ==="); - String redirectUri = resource.getRedirectUri(request); + final String redirectUri = resource.getRedirectUri(request); if (redirectUri != null) { requestParameters.put("redirect_uri", redirectUri); } if (resource.isScoped()) { - StringBuilder builder = new StringBuilder(); - List scope = resource.getScope(); + final StringBuilder builder = new StringBuilder(); + final List scope = resource.getScope(); if (scope != null) { - Iterator scopeIt = scope.iterator(); + final Iterator scopeIt = scope.iterator(); while (scopeIt.hasNext()) { builder.append(scopeIt.next()); if (scopeIt.hasNext()) { @@ -101,9 +100,9 @@ public class MyAuthorizationCodeAccessTokenProvider extends AuthorizationCodeAcc requestParameters.put("scope", builder.toString()); } - UserRedirectRequiredException redirectException = new UserRedirectRequiredException(resource.getUserAuthorizationUri(), requestParameters); + final UserRedirectRequiredException redirectException = new UserRedirectRequiredException(resource.getUserAuthorizationUri(), requestParameters); - String stateKey = stateKeyGenerator.generateKey(resource); + final String stateKey = stateKeyGenerator.generateKey(resource); redirectException.setStateKey(stateKey); request.setStateKey(stateKey); redirectException.setStateToPreserve(redirectUri); diff --git a/spring-security-oauth/src/main/java/org/baeldung/config/SessionListener.java b/spring-security-oauth/src/main/java/org/baeldung/config/SessionListener.java index 95e41714f9..57007a6928 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/config/SessionListener.java +++ b/spring-security-oauth/src/main/java/org/baeldung/config/SessionListener.java @@ -3,16 +3,20 @@ package org.baeldung.config; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + public class SessionListener implements HttpSessionListener { + private final Logger logger = LoggerFactory.getLogger(getClass()); @Override public void sessionCreated(HttpSessionEvent event) { - System.out.println("==== Session is created ===="); + logger.info("==== Session is created ===="); event.getSession().setMaxInactiveInterval(30 * 60); } @Override public void sessionDestroyed(HttpSessionEvent event) { - System.out.println("==== Session is destroyed ===="); + logger.info("==== Session is destroyed ===="); } } \ No newline at end of file diff --git a/spring-security-oauth/src/main/java/org/baeldung/persistence/dao/PostRepository.java b/spring-security-oauth/src/main/java/org/baeldung/persistence/dao/PostRepository.java index 04644f03ef..60c7582dd8 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/persistence/dao/PostRepository.java +++ b/spring-security-oauth/src/main/java/org/baeldung/persistence/dao/PostRepository.java @@ -9,7 +9,7 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface PostRepository extends JpaRepository { - public List findBySubmissionDateBeforeAndIsSent(Date date, boolean isSent); + List findBySubmissionDateBeforeAndIsSent(Date date, boolean isSent); - public List findByUser(User user); + List findByUser(User user); } \ No newline at end of file diff --git a/spring-security-oauth/src/main/java/org/baeldung/persistence/dao/UserRepository.java b/spring-security-oauth/src/main/java/org/baeldung/persistence/dao/UserRepository.java index bfbd4d5cf0..ec2221c73d 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/persistence/dao/UserRepository.java +++ b/spring-security-oauth/src/main/java/org/baeldung/persistence/dao/UserRepository.java @@ -4,7 +4,8 @@ import org.baeldung.persistence.model.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository { - public User findByUsername(String username); - public User findByAccessToken(String token); + User findByUsername(String username); + + User findByAccessToken(String token); } \ No newline at end of file diff --git a/spring-security-oauth/src/main/java/org/baeldung/persistence/model/Post.java b/spring-security-oauth/src/main/java/org/baeldung/persistence/model/Post.java index 3f0f7cac5f..2ddfc9b649 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/persistence/model/Post.java +++ b/spring-security-oauth/src/main/java/org/baeldung/persistence/model/Post.java @@ -100,4 +100,9 @@ public class Post { this.submissionResponse = submissionResponse; } + @Override + public String toString() { + return "Post [title=" + title + ", subreddit=" + subreddit + ", url=" + url + ", submissionDate=" + submissionDate + ", user=" + user + "]"; + } + } \ No newline at end of file diff --git a/spring-security-oauth/src/main/java/org/baeldung/persistence/model/User.java b/spring-security-oauth/src/main/java/org/baeldung/persistence/model/User.java index a854c33807..43bc410c70 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/persistence/model/User.java +++ b/spring-security-oauth/src/main/java/org/baeldung/persistence/model/User.java @@ -83,22 +83,30 @@ public class User { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((username == null) ? 0 : username.hashCode()); + result = (prime * result) + ((username == null) ? 0 : username.hashCode()); return result; } @Override public boolean equals(final Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } final User user = (User) obj; - if (!username.equals(user.username)) + if (!username.equals(user.username)) { return false; + } return true; } + @Override + public String toString() { + return "User [username=" + username + "]"; + } } \ No newline at end of file diff --git a/spring-security-oauth/src/main/java/org/baeldung/reddit/util/RedditApiConstants.java b/spring-security-oauth/src/main/java/org/baeldung/reddit/util/RedditApiConstants.java new file mode 100644 index 0000000000..cd53726012 --- /dev/null +++ b/spring-security-oauth/src/main/java/org/baeldung/reddit/util/RedditApiConstants.java @@ -0,0 +1,19 @@ +package org.baeldung.reddit.util; + +/** + * Specified by Reddit API at http://www.reddit.com/dev/api#POST_api_submit + */ +public final class RedditApiConstants { + public static final String API_TYPE = "api_type"; + public static final String URL = "url"; + public static final String SR = "sr"; + public static final String TITLE = "title"; + public static final String THEN = "then"; + public static final String SENDREPLIES = "sendreplies"; + public static final String RESUBMIT = "resubmit"; + public static final String KIND = "kind"; + + private RedditApiConstants() { + throw new AssertionError(); + } +} diff --git a/spring-security-oauth/src/main/java/org/baeldung/web/RedditController.java b/spring-security-oauth/src/main/java/org/baeldung/web/RedditController.java index 7bc9ee7eb1..e6dd16764c 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/web/RedditController.java +++ b/spring-security-oauth/src/main/java/org/baeldung/web/RedditController.java @@ -11,6 +11,7 @@ import org.baeldung.persistence.dao.PostRepository; import org.baeldung.persistence.dao.UserRepository; import org.baeldung.persistence.model.Post; import org.baeldung.persistence.model.User; +import org.baeldung.reddit.util.RedditApiConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -43,8 +44,8 @@ public class RedditController { @RequestMapping("/info") public final String getInfo(Model model) { - JsonNode node = redditRestTemplate.getForObject("https://oauth.reddit.com/api/v1/me", JsonNode.class); - String name = node.get("name").asText(); + final JsonNode node = redditRestTemplate.getForObject("https://oauth.reddit.com/api/v1/me", JsonNode.class); + final String name = node.get("name").asText(); addUser(name, redditRestTemplate.getAccessToken()); model.addAttribute("info", name); return "reddit"; @@ -52,30 +53,30 @@ public class RedditController { @RequestMapping("/submit") public final String submit(Model model, @RequestParam Map formParams) { - MultiValueMap param = new LinkedMultiValueMap(); - param.add("api_type", "json"); - param.add("kind", "link"); - param.add("resubmit", "true"); - param.add("sendreplies", "false"); - param.add("then", "comments"); + final MultiValueMap param = new LinkedMultiValueMap(); + param.add(RedditApiConstants.API_TYPE, "json"); + param.add(RedditApiConstants.KIND, "link"); + param.add(RedditApiConstants.RESUBMIT, "true"); + param.add(RedditApiConstants.SENDREPLIES, "false"); + param.add(RedditApiConstants.THEN, "comments"); - for (Map.Entry entry : formParams.entrySet()) { + for (final Map.Entry entry : formParams.entrySet()) { param.add(entry.getKey(), entry.getValue()); } logger.info("User submitting Link with these parameters: " + formParams.entrySet()); - JsonNode node = redditRestTemplate.postForObject("https://oauth.reddit.com/api/submit", param, JsonNode.class); + final JsonNode node = redditRestTemplate.postForObject("https://oauth.reddit.com/api/submit", param, JsonNode.class); logger.info("Full Reddit Response: " + node.toString()); - String responseMsg = parseResponse(node); + final String responseMsg = parseResponse(node); model.addAttribute("msg", responseMsg); return "submissionResponse"; } @RequestMapping("/post") public final String showSubmissionForm(Model model) { - String needsCaptchaResult = needsCaptcha(); + final String needsCaptchaResult = needsCaptcha(); if (needsCaptchaResult.equalsIgnoreCase("true")) { - String iden = getNewCaptcha(); + final String iden = getNewCaptcha(); model.addAttribute("iden", iden); } return "submissionForm"; @@ -83,7 +84,7 @@ public class RedditController { @RequestMapping("/postSchedule") public final String showSchedulePostForm(Model model) { - String needsCaptchaResult = needsCaptcha(); + final String needsCaptchaResult = needsCaptcha(); if (needsCaptchaResult.equalsIgnoreCase("true")) { model.addAttribute("msg", "Sorry, You do not have enought karma"); return "submissionResponse"; @@ -94,8 +95,8 @@ public class RedditController { @RequestMapping("/schedule") public final String schedule(Model model, @RequestParam Map formParams) throws ParseException { logger.info("User scheduling Post with these parameters: " + formParams.entrySet()); - User user = userReopsitory.findByAccessToken(redditRestTemplate.getAccessToken().getValue()); - Post post = new Post(); + final User user = userReopsitory.findByAccessToken(redditRestTemplate.getAccessToken().getValue()); + final Post post = new Post(); post.setUser(user); post.setSent(false); post.setTitle(formParams.get("title")); @@ -108,15 +109,15 @@ public class RedditController { return "submissionResponse"; } postReopsitory.save(post); - List posts = postReopsitory.findByUser(user); + final List posts = postReopsitory.findByUser(user); model.addAttribute("posts", posts); return "postListView"; } @RequestMapping("/posts") public final String getScheduledPosts(Model model) { - User user = userReopsitory.findByAccessToken(redditRestTemplate.getAccessToken().getValue()); - List posts = postReopsitory.findByUser(user); + final User user = userReopsitory.findByAccessToken(redditRestTemplate.getAccessToken().getValue()); + final List posts = postReopsitory.findByUser(user); model.addAttribute("posts", posts); return "postListView"; } @@ -124,32 +125,33 @@ public class RedditController { // === private private final String needsCaptcha() { - String result = redditRestTemplate.getForObject("https://oauth.reddit.com/api/needs_captcha.json", String.class); + final String result = redditRestTemplate.getForObject("https://oauth.reddit.com/api/needs_captcha.json", String.class); return result; } private final String getNewCaptcha() { - Map param = new HashMap(); + final Map param = new HashMap(); param.put("api_type", "json"); - String result = redditRestTemplate.postForObject("https://oauth.reddit.com/api/new_captcha", param, String.class, param); - String[] split = result.split("\""); + final String result = redditRestTemplate.postForObject("https://oauth.reddit.com/api/new_captcha", param, String.class, param); + final String[] split = result.split("\""); return split[split.length - 2]; } private final String parseResponse(JsonNode node) { String result = ""; - JsonNode errorNode = node.get("json").get("errors").get(0); + final JsonNode errorNode = node.get("json").get("errors").get(0); if (errorNode != null) { - for (JsonNode child : errorNode) { + for (final JsonNode child : errorNode) { result = result + child.toString().replaceAll("\"|null", "") + "
"; } return result; } else { - if (node.get("json").get("data") != null && node.get("json").get("data").get("url") != null) + if ((node.get("json").get("data") != null) && (node.get("json").get("data").get("url") != null)) { return "Post submitted successfully check it out "; - else + } else { return "Error Occurred"; + } } } diff --git a/spring-security-oauth/src/main/java/org/baeldung/web/RestExceptionHandler.java b/spring-security-oauth/src/main/java/org/baeldung/web/RestExceptionHandler.java index 61ee78be43..cf835d87d3 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/web/RestExceptionHandler.java +++ b/spring-security-oauth/src/main/java/org/baeldung/web/RestExceptionHandler.java @@ -26,7 +26,7 @@ public class RestExceptionHandler extends ResponseEntityExceptionHandler impleme // 500 @ExceptionHandler({ UserApprovalRequiredException.class, UserRedirectRequiredException.class }) public ResponseEntity handleRedirect(final RuntimeException ex, final WebRequest request) { - logger.error("500 Status Code", ex); + logger.info(ex.getLocalizedMessage()); throw ex; } @@ -34,7 +34,7 @@ public class RestExceptionHandler extends ResponseEntityExceptionHandler impleme public ResponseEntity handleInternal(final RuntimeException ex, final WebRequest request) { logger.info(request.getHeader("x-ratelimit-remaining")); logger.error("500 Status Code", ex); - String response = "Error Occurred : " + ex.getMessage(); + final String response = "Error Occurred : " + ex.getMessage(); return handleExceptionInternal(ex, response, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR, request); } } \ No newline at end of file diff --git a/spring-security-oauth/src/main/java/org/baeldung/web/schedule/ScheduledTasks.java b/spring-security-oauth/src/main/java/org/baeldung/web/schedule/ScheduledTasks.java index 8e3b3f580d..bfdfb3c5ff 100644 --- a/spring-security-oauth/src/main/java/org/baeldung/web/schedule/ScheduledTasks.java +++ b/spring-security-oauth/src/main/java/org/baeldung/web/schedule/ScheduledTasks.java @@ -7,6 +7,7 @@ import java.util.List; import org.baeldung.persistence.dao.PostRepository; import org.baeldung.persistence.model.Post; import org.baeldung.persistence.model.User; +import org.baeldung.reddit.util.RedditApiConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -34,50 +35,49 @@ public class ScheduledTasks { @Scheduled(fixedRate = 1 * 60 * 1000) public void reportCurrentTime() { - List posts = postReopsitory.findBySubmissionDateBeforeAndIsSent(new Date(), false); + final List posts = postReopsitory.findBySubmissionDateBeforeAndIsSent(new Date(), false); logger.info(posts.size() + " Posts in the queue."); - for (Post post : posts) { + for (final Post post : posts) { submitPost(post); } } private void submitPost(Post post) { try { - User user = post.getUser(); - DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(user.getAccessToken()); + final User user = post.getUser(); + final DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(user.getAccessToken()); token.setRefreshToken(new DefaultOAuth2RefreshToken((user.getRefreshToken()))); token.setExpiration(user.getTokenExpiration()); redditRestTemplate.getOAuth2ClientContext().setAccessToken(token); // - UsernamePasswordAuthenticationToken userAuthToken = new UsernamePasswordAuthenticationToken(user.getUsername(), token.getValue(), Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"))); + final UsernamePasswordAuthenticationToken userAuthToken = new UsernamePasswordAuthenticationToken(user.getUsername(), token.getValue(), Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"))); SecurityContextHolder.getContext().setAuthentication(userAuthToken); // - - MultiValueMap param = new LinkedMultiValueMap(); - param.add("api_type", "json"); - param.add("kind", "link"); - param.add("resubmit", "true"); - param.add("sendreplies", "false"); - param.add("then", "comments"); - param.add("title", post.getTitle()); - param.add("sr", post.getSubreddit()); - param.add("url", post.getUrl()); + final MultiValueMap param = new LinkedMultiValueMap(); + param.add(RedditApiConstants.TITLE, post.getTitle()); + param.add(RedditApiConstants.SR, post.getSubreddit()); + param.add(RedditApiConstants.URL, post.getUrl()); + param.add(RedditApiConstants.API_TYPE, "json"); + param.add(RedditApiConstants.KIND, "link"); + param.add(RedditApiConstants.RESUBMIT, "true"); + param.add(RedditApiConstants.SENDREPLIES, "false"); + param.add(RedditApiConstants.THEN, "comments"); logger.info("Submit link with these parameters: " + param.entrySet()); - JsonNode node = redditRestTemplate.postForObject("https://oauth.reddit.com/api/submit", param, JsonNode.class); - JsonNode errorNode = node.get("json").get("errors").get(0); + final JsonNode node = redditRestTemplate.postForObject("https://oauth.reddit.com/api/submit", param, JsonNode.class); + final JsonNode errorNode = node.get("json").get("errors").get(0); if (errorNode == null) { post.setSent(true); post.setSubmissionResponse("Successfully sent"); postReopsitory.save(post); - logger.info("Successfully sent"); + logger.info("Successfully sent " + post.toString()); } else { post.setSubmissionResponse(errorNode.toString()); postReopsitory.save(post); - logger.info("Error occurred: " + errorNode.toString()); + logger.info("Error occurred: " + errorNode.toString() + "while submitting post " + post.toString()); } - } catch (Exception e) { - logger.error("Error occurred", e); + } catch (final Exception e) { + logger.error("Error occurred while submitting post " + post.toString(), e); } } diff --git a/spring-security-oauth/src/main/resources/persistence.properties b/spring-security-oauth/src/main/resources/persistence.properties index 0bfb48fce4..75df42e5d0 100644 --- a/spring-security-oauth/src/main/resources/persistence.properties +++ b/spring-security-oauth/src/main/resources/persistence.properties @@ -1,6 +1,6 @@ ################### DataSource Configuration ########################## jdbc.driverClassName=com.mysql.jdbc.Driver -jdbc.url=jdbc:mysql://localhost:3306/oauth_reddit?createDatabaseIfNotExist=true +jdbc.url=jdbc:mysql://localhost:3606/oauth_reddit?createDatabaseIfNotExist=true jdbc.user=tutorialuser jdbc.pass=tutorialmy5ql init-db=false diff --git a/spring-security-oauth/src/test/java/org/baeldung/persistence/PersistenceJPATest.java b/spring-security-oauth/src/test/java/org/baeldung/persistence/PersistenceJPATest.java new file mode 100644 index 0000000000..91fac82c87 --- /dev/null +++ b/spring-security-oauth/src/test/java/org/baeldung/persistence/PersistenceJPATest.java @@ -0,0 +1,100 @@ +package org.baeldung.persistence; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsIn.isIn; +import static org.hamcrest.core.IsNot.not; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.List; + +import org.baeldung.config.PersistenceJPAConfig; +import org.baeldung.persistence.dao.PostRepository; +import org.baeldung.persistence.dao.UserRepository; +import org.baeldung.persistence.model.Post; +import org.baeldung.persistence.model.User; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.transaction.TransactionConfiguration; +import org.springframework.transaction.annotation.Transactional; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { PersistenceJPAConfig.class }) +@Transactional +@TransactionConfiguration +public class PersistenceJPATest { + @Autowired + private PostRepository postRepository; + + @Autowired + private UserRepository userRepository; + + private Post alreadySentPost, notSentYetOld, notSentYet; + + private User userJohn, userTom; + + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + @Before + public void init() throws ParseException { + userJohn = new User(); + userJohn.setUsername("John"); + userRepository.save(userJohn); + + userTom = new User(); + userTom.setUsername("Tom"); + userRepository.save(userTom); + + alreadySentPost = new Post(); + alreadySentPost.setTitle("First post title"); + alreadySentPost.setSent(true); + alreadySentPost.setSubmissionDate(dateFormat.parse("2015-03-03 10:30")); + alreadySentPost.setUser(userJohn); + postRepository.save(alreadySentPost); + + notSentYetOld = new Post(); + notSentYetOld.setTitle("Second post title"); + notSentYetOld.setSent(false); + notSentYetOld.setSubmissionDate(dateFormat.parse("2015-03-03 11:00")); + notSentYetOld.setUser(userTom); + postRepository.save(notSentYetOld); + + notSentYet = new Post(); + notSentYet.setTitle("Second post title"); + notSentYet.setSent(false); + notSentYet.setSubmissionDate(dateFormat.parse("2015-03-03 11:30")); + notSentYet.setUser(userJohn); + postRepository.save(notSentYet); + } + + @Test + public void whenGettingListOfSentPosts_thenCorrect() throws ParseException { + final List results = postRepository.findBySubmissionDateBeforeAndIsSent(dateFormat.parse("2015-03-03 11:50"), true); + + assertThat(alreadySentPost, isIn(results)); + assertThat(notSentYet, not(isIn(results))); + assertThat(notSentYetOld, not(isIn(results))); + } + + @Test + public void whenGettingListOfOldPosts_thenCorrect() throws ParseException { + final List results = postRepository.findBySubmissionDateBeforeAndIsSent(dateFormat.parse("2015-03-03 11:01"), false); + + assertThat(notSentYetOld, isIn(results)); + assertThat(notSentYet, not(isIn(results))); + assertThat(alreadySentPost, not(isIn(results))); + } + + @Test + public void whenGettingListOfSpecificuser_thenCorrect() throws ParseException { + final List results = postRepository.findByUser(userTom); + assertThat(notSentYetOld, isIn(results)); + assertThat(notSentYet, not(isIn(results))); + assertThat(alreadySentPost, not(isIn(results))); + } + +}