From e5da16dcfb57d6a49116ed74ae54e971f53bed84 Mon Sep 17 00:00:00 2001 From: Noah Scharrenberg Date: Sat, 16 Mar 2019 13:33:13 +0100 Subject: [PATCH] All Service Tests & Coverage added + minor fixes --- docs/images/testcoverage.PNG | Bin 0 -> 8962 bytes pom.xml | 1 - src/main/java/domain/Tweet.java | 3 + src/main/java/domain/User.java | 2 - src/main/java/service/TweetService.java | 37 +- src/main/test/service/TweetServiceTest.java | 1138 +++++++++++++++---- 6 files changed, 938 insertions(+), 243 deletions(-) create mode 100644 docs/images/testcoverage.PNG diff --git a/docs/images/testcoverage.PNG b/docs/images/testcoverage.PNG new file mode 100644 index 0000000000000000000000000000000000000000..9b9ec175887ec9c516ee91a12be6785a29247f96 GIT binary patch literal 8962 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.3 provided - diff --git a/src/main/java/domain/Tweet.java b/src/main/java/domain/Tweet.java index 6bbbba7..a219361 100644 --- a/src/main/java/domain/Tweet.java +++ b/src/main/java/domain/Tweet.java @@ -92,6 +92,9 @@ public User getAuthor() { public void setAuthor(User author) { this.author = author; + if(author != null) { + author.addTweet(this); + } } public Date getCreatedAt() { diff --git a/src/main/java/domain/User.java b/src/main/java/domain/User.java index 164c6e7..b47d725 100644 --- a/src/main/java/domain/User.java +++ b/src/main/java/domain/User.java @@ -182,7 +182,6 @@ public void setTweets(Set tweets) { public void addTweet(Tweet tweet) { this.tweets.add(tweet); - tweet.setAuthor(this); } public void removeTweet(Tweet tweet) { @@ -195,7 +194,6 @@ private void addFollower(User user) { public void removeFollowing(User user) { this.following.remove(user); - user.removeFollower(this); } private void removeFollower(User user) { diff --git a/src/main/java/service/TweetService.java b/src/main/java/service/TweetService.java index 2f45148..f976ee4 100644 --- a/src/main/java/service/TweetService.java +++ b/src/main/java/service/TweetService.java @@ -98,13 +98,13 @@ public ObjectResponse> getByAuthorId(int id) { return new ObjectResponse<>(getUserByIdResponse.getCode(), getUserByIdResponse.getMessage()); } - ObjectResponse> getTweetsByAuthorIdResponse = getByAuthorId(id); + List getTweetsByAuthorIdResponse = tr.getByAuthorId(id); - if(getTweetsByAuthorIdResponse.getObject() == null || getTweetsByAuthorIdResponse.getObject().isEmpty()) { - return getTweetsByAuthorIdResponse; + if(getTweetsByAuthorIdResponse == null) { + return new ObjectResponse<>(HttpStatusCodes.INTERNAL_SERVER_ERROR, "List of tweet from author " + getUserByIdResponse.getObject().getUsername() + " is never instantiated."); } - return new ObjectResponse<>(HttpStatusCodes.OK, getTweetsByAuthorIdResponse.getObject().size() + " tweets from " + getUserByIdResponse.getObject().getUsername() + " loaded", getTweetsByAuthorIdResponse.getObject()); + return new ObjectResponse<>(HttpStatusCodes.OK, getTweetsByAuthorIdResponse.size() + " tweets from " + getUserByIdResponse.getObject().getUsername() + " loaded", getTweetsByAuthorIdResponse); } /** @@ -136,8 +136,14 @@ public ObjectResponse create(Tweet tweet) { return new ObjectResponse<>(HttpStatusCodes.NOT_ACCEPTABLE, "Tweet must have a message"); } - if(tweet.getAuthor() == null || ur.getById(tweet.getAuthor().getId()) == null) { - return new ObjectResponse<>(HttpStatusCodes.NOT_FOUND, "Author not found"); + if(tweet.getAuthor() == null) { + return new ObjectResponse<>(HttpStatusCodes.NOT_ACCEPTABLE, "Tweet must have an author"); + } + + ObjectResponse getUserById = ur.getById(tweet.getAuthor().getId()); + + if(getUserById.getObject() == null) { + return new ObjectResponse<>(getUserById.getCode(), getUserById.getMessage()); } if(tweet.getMessage().length() > 140) { @@ -155,7 +161,7 @@ public ObjectResponse create(Tweet tweet) { Tweet created = tr.create(tweet); if(created != null) { - return new ObjectResponse<>(HttpStatusCodes.OK, "Tweet with message: " + tweet.getMessage() + " created", tweet); + return new ObjectResponse<>(HttpStatusCodes.CREATED, "Tweet with message: " + tweet.getMessage() + " created", tweet); } else { return new ObjectResponse<>(HttpStatusCodes.INTERNAL_SERVER_ERROR, "Could not create a new tweet due to an unknown error"); } @@ -185,6 +191,14 @@ public ObjectResponse update(Tweet tweet) { return getByIdResponse; } + if(tweet.getAuthor() == null) { + return new ObjectResponse<>(HttpStatusCodes.NOT_ACCEPTABLE, "Author can not be null, must meet original author with id " + getByIdResponse.getObject().getAuthor().getId()); + } + + if(tweet.getAuthor().getId() != getByIdResponse.getObject().getAuthor().getId()) { + return new ObjectResponse<>(HttpStatusCodes.NOT_ACCEPTABLE, "Author can not be changed!"); + } + ObjectResponse> getMentionsByMessageResponse = getMentionsByMessage(tweet.getMessage()); if(getMentionsByMessageResponse.getObject() == null) { @@ -245,7 +259,7 @@ public ObjectResponse like(Tweet tweet, User user) { return new ObjectResponse<>(getUserByIdResponse.getCode(), getUserByIdResponse.getMessage()); } - ObjectResponse getTweetByIdResponse = getById(user.getId()); + ObjectResponse getTweetByIdResponse = getById(tweet.getId()); if(getTweetByIdResponse.getObject() == null) { return getTweetByIdResponse; @@ -268,11 +282,8 @@ public ObjectResponse like(Tweet tweet, User user) { * @param tweet - the tweet * @param user - the user that unlikes the tweet * @return the tweet - * @throws InvalidContentException - * @throws ActionForbiddenException - * @throws NotFoundException */ - public ObjectResponse unlike(Tweet tweet, User user) throws ActionForbiddenException, InvalidContentException, NotFoundException { + public ObjectResponse unlike(Tweet tweet, User user) { if(user.getId() <= 0) { return new ObjectResponse<>(HttpStatusCodes.NOT_ACCEPTABLE, "Invalid User ID"); } @@ -287,7 +298,7 @@ public ObjectResponse unlike(Tweet tweet, User user) throws ActionForbidd return new ObjectResponse<>(getUserByIdResponse.getCode(), getUserByIdResponse.getMessage()); } - ObjectResponse getTweetByIdResponse = getById(user.getId()); + ObjectResponse getTweetByIdResponse = getById(tweet.getId()); if(getTweetByIdResponse.getObject() == null) { return getTweetByIdResponse; diff --git a/src/main/test/service/TweetServiceTest.java b/src/main/test/service/TweetServiceTest.java index 0cc96f0..495d5d0 100644 --- a/src/main/test/service/TweetServiceTest.java +++ b/src/main/test/service/TweetServiceTest.java @@ -11,18 +11,18 @@ import org.mockito.junit.MockitoJUnitRunner; import repository.interfaces.TweetRepository; import repository.interfaces.UserRepository; +import responses.HttpStatusCodes; +import responses.ObjectResponse; import javax.swing.*; import java.security.NoSuchAlgorithmException; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.*; import static org.mockito.Mockito.*; import static org.mockito.MockitoAnnotations.initMocks; @@ -47,345 +47,1029 @@ public void tweetServiceTest() { assertNotNull(tweetService); } + private User user; + private User user2; + private User user3; + @Before + public void init() { + user = new User(); + user.setId(1); + user.setUsername("testUser1"); + user.setEmail("testUser1@mail.com"); + user.setPassword("Password123"); + + user2 = new User(); + user2.setId(2); + user2.setUsername("testUser2"); + user2.setEmail("testUser2@mail.com"); + user2.setPassword("Password123"); + + user3 = new User(); + user3.setId(3); + user3.setUsername("testUser3"); + user3.setEmail("testUser3@mail.com"); + user3.setPassword("Password123"); + } + + private List tweetList() { + // Arrange + List list = new ArrayList<>(); + + for(int i = 0; i < 5; i++) { + Tweet t = new Tweet(); + t.setId(list.size() + 1); + t.setMessage("This is a message by testUser1 - " + i); + t.setAuthor(user); + t.setCreatedAt(new Date()); + list.add(t); + } + + for(int i = 0; i < 2; i++) { + Tweet t = new Tweet(); + t.setId(list.size() + 1); + t.setMessage("This is a message by testUser2 - " + i); + t.setAuthor(user2); + t.setCreatedAt(new Date()); + list.add(t); + } + + Tweet t = new Tweet(); + t.setId(list.size() + 1); + t.setMessage("@testUser2 I'm mentioning you"); + t.setAuthor(user); + t.setCreatedAt(new Date()); + t.addMention(user2); + list.add(t); + + return list; + } + + /* + * Get All Users Test + */ @Test - public void getById() throws InvalidContentException, NotFoundException { - int id = 324; + public void all_StatusCodeOk() { + // Arrange + List list = tweetList(); + when(tr.all()).thenReturn(list); + + // Act + ObjectResponse> response = tweetService.all(); + + // Assert + verify(tr, atLeastOnce()).all(); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(list, response.getObject()); + assertEquals(list.size(), response.getObject().size()); + assertEquals(8, response.getObject().size()); + } + + /* + * Get Tweet By Id Tests + */ + @Test + public void getById_ExistingId_StatusCodeOk() { + // Arange + int id = 6; + String message = "This is a message"; + User author = user; + Tweet tweet = new Tweet(); tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); when(tr.getById(id)).thenReturn(tweet); - tweetService.getById(id); + // Act + ObjectResponse response = tweetService.getById(id); + + // Assert verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(tweet, response.getObject()); } - @Test(expected = NotFoundException.class) - public void getByIdNotFound() throws InvalidContentException, NotFoundException { - int id = 324; + @Test + public void getById_IdNull_StatusCodeNotAcceptable() { + // Arange + int id = 0; + String message = "This is a message"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + // Act + ObjectResponse response = tweetService.getById(id); + + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void getById_TweetDoesNotExist_StatusCodeOk() { + // Arange + int id = 6; + String message = "This is a message"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); when(tr.getById(id)).thenReturn(null); - tweetService.getById(id); - verify(tr, never()).getById(id); + // Act + ObjectResponse response = tweetService.getById(id); + + // Assert + verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); + } + + /* + * Get Tweet By Username Tests + */ + @Test + public void getByAuthorName_ExistingUserName_StatusCodeOk() { + // Arange + + when(ur.getByUsername(user.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user.getUsername() + " found", user)); + when(ur.getById(user.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user.getUsername() + " found", user)); + when(tr.getByAuthorId(user.getId())).thenReturn(new ArrayList<>(user.getTweets())); + + // Act + ObjectResponse> response = tweetService.getByAuthorName(user.getUsername()); + + // Assert + verify(ur, atLeastOnce()).getByUsername(user.getUsername()); + verify(ur, atLeastOnce()).getById(user.getId()); + verify(tr, atLeastOnce()).getByAuthorId(user.getId()); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(new ArrayList<>(user.getTweets()), response.getObject()); } @Test - public void getByAuthorName() throws InvalidContentException, NotFoundException { - // Tweet 1 - int tweetId = 324; + public void getByAuthorName_UsernameEmpty_StatusCodeNotAcceptable() { + // Arange + String username = ""; + + // Act + ObjectResponse> response = tweetService.getByAuthorName(username); + + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void getByAuthorName_UsernameDoesNotExist_StatusCodeNotFound() { + // Arange + String username = "iDoNotExist"; + + when(ur.getByUsername(username)).thenReturn(new ObjectResponse<>(HttpStatusCodes.NOT_FOUND, "User not found")); + + // Act + ObjectResponse> response = tweetService.getByAuthorName(username); + + // Assert + verify(ur, atLeastOnce()).getByUsername(username); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); + } + + /* + * Get Tweet By User Id Tests + */ + @Test + public void getByAuthorId_ExistingId_StatusCodeOk() { + // Arange + when(ur.getById(user.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user.getUsername() + " found", user)); + when(tr.getByAuthorId(user.getId())).thenReturn(new ArrayList<>(user.getTweets())); + + // Act + ObjectResponse> response = tweetService.getByAuthorId(user.getId()); + + // Assert + verify(ur, atLeastOnce()).getById(user.getId()); + verify(tr, atLeastOnce()).getByAuthorId(user.getId()); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(new ArrayList<>(user.getTweets()), response.getObject()); + } + + @Test + public void getByAuthorId_IdNull_StatusCodeNotAcceptable() { + // Arange + int id = 0; + + // Act + ObjectResponse> response = tweetService.getByAuthorId(id); + + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void getByAuthorId_IdDoesNotExist_StatusCodeNotFound() { + // Arange + int id = 156; + + when(ur.getById(id)).thenReturn(new ObjectResponse<>(HttpStatusCodes.NOT_FOUND, "User not found")); + + // Act + ObjectResponse> response = tweetService.getByAuthorId(id); + + // Assert + verify(ur, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); + } + + /* + * Create Tweet Tests + */ + @Test + public void create_newWithProperItems_StatusCodeOk() { + // Arange + String message = "This is a message of a tweet"; + User author = user; + Tweet tweet = new Tweet(); - tweet.setId(tweetId); + tweet.setMessage(message); + tweet.setAuthor(author); - // Tweet 2 - int tweetId2 = 324; - Tweet tweet2 = new Tweet(); - tweet2.setId(tweetId2); + when(ur.getById(user.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user.getUsername() + " found", user)); + when(tr.create(tweet)).thenReturn(tweet); - // User - int userId = 4563; - String username = "thisTestUser"; - User user = new User(); - user.setId(userId); - user.setUsername(username); + // Act + ObjectResponse response = tweetService.create(tweet); - user.addTweet(tweet); - user.addTweet(tweet2); + // Assert + verify(ur, atLeastOnce()).getById(user.getId()); + verify(tr, atLeastOnce()).create(tweet); + assertEquals(HttpStatusCodes.CREATED, response.getCode()); + assertEquals(tweet, response.getObject()); + } + + @Test + public void create_EmptyMessage_StatusCodeNotAcceptable() { + // Arange + String message = ""; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setMessage(message); + tweet.setAuthor(author); - when(ur.getByUsername(username).getObject()).thenReturn(user); - when(tr.getByAuthorId(userId)).thenReturn(new ArrayList<>(user.getTweets())); + // Act + ObjectResponse response = tweetService.create(tweet); - tweetService.getByAuthorName(username); - verify(tr, atLeastOnce()).getByAuthorId(userId); + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); } @Test - public void getByAuthorId() throws InvalidContentException, NotFoundException { - // Tweet 1 - int tweetId = 324; + public void create_EmptyAuthor_StatusCodeNotAcceptable() { + // Arange + String message = "This is a message"; + User author = user; + Tweet tweet = new Tweet(); - tweet.setId(tweetId); + tweet.setMessage(message); - // Tweet 2 - int tweetId2 = 324; - Tweet tweet2 = new Tweet(); - tweet2.setId(tweetId2); + // Act + ObjectResponse response = tweetService.create(tweet); - // Tweet 3 - int tweetId3 = 324; - Tweet tweet3 = new Tweet(); - tweet3.setId(tweetId3); + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } - // User - int userId = 4563; - String username = "thisTestUser"; - User user = new User(); - user.setId(userId); - user.setUsername(username); + @Test + public void create_AuthorDoesNotExist_StatusCodeNotFound() { + // Arange + String message = "This is a message of a tweet"; + User author = user; - user.addTweet(tweet); - user.addTweet(tweet3); + Tweet tweet = new Tweet(); + tweet.setMessage(message); + tweet.setAuthor(author); - when(tr.getByAuthorId(userId)).thenReturn(new ArrayList<>(user.getTweets())); + when(ur.getById(user.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.NOT_FOUND, "User not found")); - tweetService.getByAuthorId(userId); - verify(tr, atLeastOnce()).getByAuthorId(userId); + // Act + ObjectResponse response = tweetService.create(tweet); + + // Assert + verify(ur, atLeastOnce()).getById(user.getId()); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); } @Test - public void getByCreatedDate() throws InvalidContentException, NotFoundException, ParseException { - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - Date wantedDate = dateFormat.parse("2019-03-09"); + public void create_newWithProperItemsAndOneMentions_StatusCodeOk() { + // Arange + String message = "@testUser2 This is a message of a tweet"; + User author = user; - // Tweet 1 - int tweetId = 324; - Date date = format.parse("2019-03-09 12:56:12"); Tweet tweet = new Tweet(); - tweet.setId(tweetId); - tweet.setCreatedAt(date); + tweet.setMessage(message); + tweet.setAuthor(author); - // Tweet 2 - int tweetId2 = 324; - Date date2 = format.parse("2019-03-09 12:52:12"); - Tweet tweet2 = new Tweet(); - tweet2.setId(tweetId2); - tweet2.setCreatedAt(date2); + Set expectedMentions = new HashSet<>(); + expectedMentions.add(user2); - // Tweet 3 - int tweetId3 = 324; - Date date3 = format.parse("2019-02-26 15:56:12"); - Tweet tweet3 = new Tweet(); - tweet3.setId(tweetId3); - tweet3.setCreatedAt(date3); + when(ur.getById(user.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user.getUsername() + " found", user)); + when(ur.getByUsername(user2.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user2.getUsername() + " found", user2)); + when(tr.create(tweet)).thenReturn(tweet); + + // Act + ObjectResponse response = tweetService.create(tweet); + + // Assert + verify(ur, atLeastOnce()).getById(user.getId()); + verify(ur, atLeastOnce()).getByUsername(user2.getUsername()); + verify(tr, atLeastOnce()).create(tweet); + assertEquals(HttpStatusCodes.CREATED, response.getCode()); + assertEquals(tweet, response.getObject()); + assertEquals(expectedMentions, response.getObject().getMentions()); + } - // Tweet 4 - int tweetId4 = 324; - Date date4 = format.parse("2019-03-09 15:56:12"); - Tweet tweet4 = new Tweet(); - tweet4.setId(tweetId4); - tweet4.setCreatedAt(date4); + @Test + public void create_newWithProperItemsAndMultipleMentions_StatusCodeOk() { + // Arange + String message = "@testUser3 @testUser2 This is a message of a tweet"; + User author = user; - List expected = new ArrayList<>(); - expected.add(tweet); - expected.add(tweet2); - expected.add(tweet4); + Tweet tweet = new Tweet(); + tweet.setMessage(message); + tweet.setAuthor(author); - when(tr.getByCreatedDate(wantedDate)).thenReturn(expected); + Set expectedMentions = new HashSet<>(); + expectedMentions.add(user2); + expectedMentions.add(user3); + + when(ur.getById(user.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user.getUsername() + " found", user)); + when(ur.getByUsername(user2.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user2.getUsername() + " found", user2)); + when(ur.getByUsername(user3.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user3.getUsername() + " found", user3)); + when(tr.create(tweet)).thenReturn(tweet); - tweetService.getByCreatedDate(wantedDate); - verify(tr, atLeastOnce()).getByCreatedDate(wantedDate); + // Act + ObjectResponse response = tweetService.create(tweet); + + // Assert + verify(ur, atLeastOnce()).getById(user.getId()); + verify(ur, atLeastOnce()).getByUsername(user2.getUsername()); + verify(ur, atLeastOnce()).getByUsername(user3.getUsername()); + verify(tr, atLeastOnce()).create(tweet); + assertEquals(HttpStatusCodes.CREATED, response.getCode()); + assertEquals(tweet, response.getObject()); + assertEquals(expectedMentions, response.getObject().getMentions()); } @Test - public void createTweet() throws CreationFailedException, NotFoundException, InvalidContentException { - // User - int id = 32454; - User user = new User(); - user.setId(id); + public void create_newWithProperItemsAndMultipleMentionsNotAllExisting_StatusCodeOk() { + // Arange + String message = "@testUser3 @testUser2 @iDoNotExist This is a message of a tweet"; + User author = user; - String text = "This is my tweet"; Tweet tweet = new Tweet(); - tweet.setMessage(text); - tweet.setAuthor(user); - when(ur.getById(id).getObject()).thenReturn(user); + tweet.setMessage(message); + tweet.setAuthor(author); + + Set expectedMentions = new HashSet<>(); + expectedMentions.add(user2); + expectedMentions.add(user3); + + when(ur.getById(user.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user.getUsername() + " found", user)); + when(ur.getByUsername(user2.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user2.getUsername() + " found", user2)); + when(ur.getByUsername(user3.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user3.getUsername() + " found", user3)); + when(ur.getByUsername("iDoNotExist")).thenReturn(new ObjectResponse<>(HttpStatusCodes.NOT_FOUND, "User not found")); when(tr.create(tweet)).thenReturn(tweet); - tweetService.create(tweet); + // Act + ObjectResponse response = tweetService.create(tweet); + + // Assert + verify(ur, atLeastOnce()).getById(user.getId()); + verify(ur, atLeastOnce()).getByUsername(user2.getUsername()); + verify(ur, atLeastOnce()).getByUsername(user3.getUsername()); + verify(ur, atLeastOnce()).getByUsername("iDoNotExist"); verify(tr, atLeastOnce()).create(tweet); + assertEquals(HttpStatusCodes.CREATED, response.getCode()); + assertEquals(tweet, response.getObject()); + assertEquals(expectedMentions, response.getObject().getMentions()); } - @Test(expected = InvalidContentException.class) - public void createTweetWithoutMessage() throws CreationFailedException, NotFoundException, InvalidContentException { - // User - int id = 32454; - User user = new User(); - user.setId(id); + /* + * update Tweets Tests + */ + @Test + public void update_newWithProperItems_StatusCodeOk() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; Tweet tweet = new Tweet(); - tweet.setAuthor(user); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); - tweetService.create(tweet); - verify(tr, never()).create(tweet); + when(tr.getById(id)).thenReturn(tweet); + when(tr.update(tweet)).thenReturn(tweet); + + // Act + ObjectResponse response = tweetService.update(tweet); + + // Assert + verify(tr, atLeastOnce()).getById(id); + verify(tr, atLeastOnce()).update(tweet); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(tweet, response.getObject()); } - @Test(expected = NotFoundException.class) - public void createTweetWithoutAuthor() throws CreationFailedException, NotFoundException, InvalidContentException { - String text = "This is my tweet"; + @Test + public void update_EmptyMessage_StatusCodeNotAcceptable() { + // Arange + int id = 6; + String message = ""; + User author = user; + Tweet tweet = new Tweet(); - tweet.setMessage(text); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + // Act + ObjectResponse response = tweetService.update(tweet); - tweetService.create(tweet); - verify(tr, never()).create(tweet); + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); } @Test - public void updateTweet() throws NotFoundException, InvalidContentException { - // User - int userId = 32454; - User user = new User(); - user.setId(userId); + public void update_EmptyAuthor_StatusCodeNotAcceptable() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; - int tweetId = 123123; - String text = "This is my tweet"; - String newText = "This is my updated Tweet"; Tweet tweet = new Tweet(); - tweet.setId(123123); - tweet.setMessage(text); - tweet.setAuthor(user); - when(tr.getById(tweetId)).thenReturn(tweet); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + Tweet updated = new Tweet(); + updated.setId(id); + updated.setMessage(message); + + when(tr.getById(id)).thenReturn(tweet); + + // Act + ObjectResponse response = tweetService.update(updated); + + // Assert + verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void update_changeAuthor_StatusCodeNotAcceptable() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + User updatedAuthor = user2; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + Tweet updated= new Tweet(); + updated.setId(id); + updated.setMessage(message); + updated.setAuthor(updatedAuthor); + + when(tr.getById(id)).thenReturn(tweet); + + // Act + ObjectResponse response = tweetService.update(updated); + + // Assert + verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void update_newWithProperItemsAndOneMentions_StatusCodeOk() { + // Arange + int id = 6; + String message = "@testUser2 This is a message of a tweet"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + Set expectedMentions = new HashSet<>(); + expectedMentions.add(user2); + + when(tr.getById(id)).thenReturn(tweet); + when(ur.getByUsername(user2.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user2.getUsername() + " found", user2)); + when(tr.update(tweet)).thenReturn(tweet); + + // Act + ObjectResponse response = tweetService.update(tweet); + + // Assert + verify(tr, atLeastOnce()).getById(id); + verify(ur, atLeastOnce()).getByUsername(user2.getUsername()); + verify(tr, atLeastOnce()).update(tweet); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(tweet, response.getObject()); + assertEquals(expectedMentions, response.getObject().getMentions()); + } + + @Test + public void update_newWithProperItemsAndMultipleMentions_StatusCodeOk() { + // Arange + int id = 6; + String message = "@testUser3 @testUser2 This is a message of a tweet"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); - tweet.setMessage(newText); + Set expectedMentions = new HashSet<>(); + expectedMentions.add(user2); + expectedMentions.add(user3); + when(tr.getById(id)).thenReturn(tweet); + when(ur.getByUsername(user2.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user2.getUsername() + " found", user2)); + when(ur.getByUsername(user3.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user3.getUsername() + " found", user3)); when(tr.update(tweet)).thenReturn(tweet); - tweetService.update(tweet); + // Act + ObjectResponse response = tweetService.update(tweet); + + // Assert + verify(tr, atLeastOnce()).getById(id); + verify(ur, atLeastOnce()).getByUsername(user2.getUsername()); + verify(ur, atLeastOnce()).getByUsername(user3.getUsername()); verify(tr, atLeastOnce()).update(tweet); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(tweet, response.getObject()); + assertEquals(expectedMentions, response.getObject().getMentions()); } @Test - public void deleteTweet() throws NotFoundException, InvalidContentException { - int id = 234; - String msg = "this is my tweet"; + public void update_newWithProperItemsAndMultipleMentionsNotAllExisting_StatusCodeOk() { + // Arange + int id = 6; + String message = "@testUser3 @testUser2 @iDoNotExist This is a message of a tweet"; + User author = user; + Tweet tweet = new Tweet(); tweet.setId(id); - tweet.setMessage(msg); + tweet.setMessage(message); + tweet.setAuthor(author); + + Set expectedMentions = new HashSet<>(); + expectedMentions.add(user2); + expectedMentions.add(user3); + when(tr.getById(id)).thenReturn(tweet); + when(ur.getByUsername(user2.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user2.getUsername() + " found", user2)); + when(ur.getByUsername(user3.getUsername())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + user3.getUsername() + " found", user3)); + when(ur.getByUsername("iDoNotExist")).thenReturn(new ObjectResponse<>(HttpStatusCodes.NOT_FOUND, "User not found")); + when(tr.update(tweet)).thenReturn(tweet); + + // Act + ObjectResponse response = tweetService.update(tweet); + + // Assert + verify(tr, atLeastOnce()).getById(id); + verify(ur, atLeastOnce()).getByUsername(user2.getUsername()); + verify(ur, atLeastOnce()).getByUsername(user3.getUsername()); + verify(ur, atLeastOnce()).getByUsername("iDoNotExist"); + verify(tr, atLeastOnce()).update(tweet); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(tweet, response.getObject()); + assertEquals(expectedMentions, response.getObject().getMentions()); + } + + + /* + * Delete Tweet Tests + */ + @Test + public void delete_ExistingId_StatusCodeOk() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); when(tr.getById(id)).thenReturn(tweet); when(tr.delete(tweet)).thenReturn(true); - tweetService.delete(tweet); + // Act + ObjectResponse response = tweetService.delete(tweet); + + // Assert + verify(tr, atLeastOnce()).getById(id); verify(tr, atLeastOnce()).delete(tweet); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertNull(response.getObject()); } @Test - public void likeTweet() throws InvalidContentException, NotFoundException, ActionForbiddenException { - int id = 234; - String msg = "this is my tweet"; + public void delete_IdNull_StatusCodeNotAcceptable() { + // Arange + int id = 0; + String message = "This is a message of a tweet"; + User author = user; + Tweet tweet = new Tweet(); tweet.setId(id); - tweet.setMessage(msg); + tweet.setMessage(message); + tweet.setAuthor(author); - int userId = 5456; - User user = new User(); - user.setId(userId); + // Act + ObjectResponse response = tweetService.delete(tweet); - when(tr.getById(id)).thenReturn(tweet); - when(ur.getById(userId).getObject()).thenReturn(user); - when(tr.like(tweet, user)).thenReturn(tweet); + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void delete_TweetDoesNotExist_StatusCodeNotFound() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; - tweetService.like(tweet, user); - verify(tr, atLeastOnce()).like(tweet, user); + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + when(tr.getById(id)).thenReturn(null); + + // Act + ObjectResponse response = tweetService.delete(tweet); + + // Assert + verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); } - @Test(expected = ActionForbiddenException.class) - public void likeTweetYouAlreadyLike() throws InvalidContentException, NotFoundException, ActionForbiddenException { - int id = 234; - String msg = "this is my tweet"; + /* + * Like Tweet Tests + */ + @Test + public void like_withExistingUserAndtweet_StatusCodeOk() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + Tweet tweet = new Tweet(); tweet.setId(id); - tweet.setMessage(msg); + tweet.setMessage(message); + tweet.setAuthor(author); - int userId = 5456; - User user = new User(); - user.setId(userId); + User liker = user2; - tweet.addLike(user); + Tweet expected = new Tweet(); + expected.setId(id); + expected.setMessage(message); + expected.setAuthor(author); + expected.addLike(liker); + when(ur.getById(liker.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + liker.getUsername() + " found", liker)); when(tr.getById(id)).thenReturn(tweet); - when(ur.getById(userId).getObject()).thenReturn(user); + when(tr.like(tweet, liker)).thenReturn(expected); + + // Act + ObjectResponse response = tweetService.like(tweet, liker); - tweetService.like(tweet, user); - verify(tr, never()).like(tweet, user); + // Assert + verify(ur, atLeastOnce()).getById(liker.getId()); + verify(tr, atLeastOnce()).getById(id); + verify(tr, atLeastOnce()).like(tweet, liker); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(tweet.getId(), response.getObject().getId()); + assertTrue(response.getObject().getLikes().contains(liker)); } @Test - public void unlikeTweet() throws InvalidContentException, NotFoundException, ActionForbiddenException { - int id = 234; - String msg = "this is my tweet"; + public void like_UserIdNull_StatusCodeNotAcceptable() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + Tweet tweet = new Tweet(); tweet.setId(id); - tweet.setMessage(msg); + tweet.setMessage(message); + tweet.setAuthor(author); - int userId = 5456; - User user = new User(); - user.setId(userId); + User liker = user2; - tweet.addLike(user); + liker.setId(0); - when(tr.getById(id)).thenReturn(tweet); - when(ur.getById(userId).getObject()).thenReturn(user); - when(tr.unlike(tweet, user)).thenReturn(tweet); + // Act + ObjectResponse response = tweetService.like(tweet, liker); + + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void like_TweetIdNull_StatusCodeNotAcceptable() { + // Arange + int id = 0; + String message = "This is a message of a tweet"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + User liker = user2; + + // Act + ObjectResponse response = tweetService.like(tweet, liker); + + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); +} + + @Test + public void like_UserDoesNotExist_StatusCodeNotFound() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + User liker = user2; + + when(ur.getById(liker.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.NOT_FOUND, "User not found")); + + // Act + ObjectResponse response = tweetService.like(tweet, liker); + + // Assert + verify(ur, atLeastOnce()).getById(liker.getId()); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void like_TweetDoesNotExist_StatusCodeNotFound() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + User liker = user2; - tweetService.unlike(tweet, user); - verify(tr, atLeastOnce()).unlike(tweet, user); + when(ur.getById(liker.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + liker.getUsername() + " found", liker)); + when(tr.getById(id)).thenReturn(null); + + // Act + ObjectResponse response = tweetService.like(tweet, liker); + + // Assert + verify(ur, atLeastOnce()).getById(liker.getId()); + verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); } - @Test(expected = ActionForbiddenException.class) - public void unlikeTweetYouDoNotLike() throws InvalidContentException, NotFoundException, ActionForbiddenException { - int id = 234; - String msg = "this is my tweet"; + @Test + public void like_UserAlreadyLikesTweet_StatusCodeForbidden() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + Tweet tweet = new Tweet(); tweet.setId(id); - tweet.setMessage(msg); + tweet.setMessage(message); + tweet.setAuthor(author); - int userId = 5456; - User user = new User(); - user.setId(userId); + User liker = user2; + tweet.addLike(liker); + when(ur.getById(liker.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + liker.getUsername() + " found", liker)); when(tr.getById(id)).thenReturn(tweet); - when(ur.getById(userId).getObject()).thenReturn(user); - - tweetService.unlike(tweet, user); - verify(tr, never()).unlike(tweet, user); - } - - @Test - public void getMentions() throws InvalidContentException, NotFoundException, CreationFailedException { - // User 1 - int userId1 = 456456; - String username1 = "user1"; - User user1 = new User(); - user1.setId(userId1); - user1.setUsername(username1); - - // User 2 - int userId2 = 1231685; - String username2 = "user2"; - User user2 = new User(); - user2.setId(userId2); - user2.setUsername(username2); - - // User 3 - int userId3 = 7865245; - String username3 = "user3"; - User user3 = new User(); - user3.setId(userId3); - user3.setUsername(username3); - - // User 4 - int userId4 = 83435; - String username4 = "user4"; - User user4 = new User(); - user4.setId(userId4); - user4.setUsername(username4); - - // Tweet - int id = 443; - String message = "@user3 @user2 check this awesomething out"; + + // Act + ObjectResponse response = tweetService.like(tweet, liker); + + // Assert + verify(ur, atLeastOnce()).getById(liker.getId()); + verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.FORBIDDEN, response.getCode()); + assertNull(response.getObject()); + } + + /* + * Unlike Tweet Tests + */ + @Test + public void unlike_withExistingUserAndtweet_StatusCodeOk() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + User liker = user2; + Tweet tweet = new Tweet(); tweet.setId(id); tweet.setMessage(message); - tweet.setAuthor(user4); + tweet.setAuthor(author); + tweet.addLike(liker); - when(ur.getById(userId4).getObject()).thenReturn(user4); - when(ur.getByUsername(username3).getObject()).thenReturn(user3); - when(ur.getByUsername(username2).getObject()).thenReturn(user2); - when(tr.create(tweet)).thenReturn(tweet); + Tweet expected = new Tweet(); + expected.setId(id); + expected.setMessage(message); + expected.setAuthor(author); - Tweet result = tweetService.create(tweet).getObject(); - assertEquals(tweet.getMentions(), result.getMentions()); - verify(tr, atLeastOnce()).create(tweet); + when(ur.getById(liker.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + liker.getUsername() + " found", liker)); + when(tr.getById(id)).thenReturn(tweet); + when(tr.unlike(tweet, liker)).thenReturn(expected); + + // Act + ObjectResponse response = tweetService.unlike(tweet, liker); + + // Assert + verify(ur, atLeastOnce()).getById(liker.getId()); + verify(tr, atLeastOnce()).getById(id); + verify(tr, atLeastOnce()).unlike(tweet, liker); + assertEquals(HttpStatusCodes.OK, response.getCode()); + assertEquals(tweet.getId(), response.getObject().getId()); + assertFalse(response.getObject().getLikes().contains(liker)); + } + + @Test + public void unlike_UserIdNull_StatusCodeNotAcceptable() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + User liker = user2; + liker.setId(0); + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + tweet.addLike(liker); + + // Act + ObjectResponse response = tweetService.unlike(tweet, liker); + + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void unlike_TweetIdNull_StatusCodeNotAcceptable() { + // Arange + int id = 0; + String message = "This is a message of a tweet"; + User author = user; + User liker = user2; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + tweet.addLike(liker); + + // Act + ObjectResponse response = tweetService.unlike(tweet, liker); + + // Assert + assertEquals(HttpStatusCodes.NOT_ACCEPTABLE, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void unlike_UserDoesNotExist_StatusCodeNotFound() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + User liker = user2; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + tweet.addLike(liker); + + when(ur.getById(liker.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.NOT_FOUND, "User not found")); + + // Act + ObjectResponse response = tweetService.unlike(tweet, liker); + + // Assert + verify(ur, atLeastOnce()).getById(liker.getId()); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void unlike_TweetDoesNotExist_StatusCodeNotFound() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + User liker = user2; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + tweet.addLike(liker); + + when(ur.getById(liker.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + liker.getUsername() + " found", liker)); + when(tr.getById(id)).thenReturn(null); + + // Act + ObjectResponse response = tweetService.unlike(tweet, liker); + + // Assert + verify(ur, atLeastOnce()).getById(liker.getId()); + verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.NOT_FOUND, response.getCode()); + assertNull(response.getObject()); + } + + @Test + public void unlike_UserDoesNotLikeTweet_StatusCodeForbidden() { + // Arange + int id = 6; + String message = "This is a message of a tweet"; + User author = user; + + Tweet tweet = new Tweet(); + tweet.setId(id); + tweet.setMessage(message); + tweet.setAuthor(author); + + User liker = user2; + + when(ur.getById(liker.getId())).thenReturn(new ObjectResponse<>(HttpStatusCodes.OK, "User with username: " + liker.getUsername() + " found", liker)); + when(tr.getById(id)).thenReturn(tweet); + + // Act + ObjectResponse response = tweetService.unlike(tweet, liker); + + // Assert + verify(ur, atLeastOnce()).getById(liker.getId()); + verify(tr, atLeastOnce()).getById(id); + assertEquals(HttpStatusCodes.FORBIDDEN, response.getCode()); + assertNull(response.getObject()); } }