opencv/src/test/java/pl/edu/amu/wmi/bookapi/Integration/api/BookControllerInt.java

183 lines
7.5 KiB
Java

package pl.edu.amu.wmi.bookapi.Integration.api;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.web.servlet.MockMvc;
import pl.edu.amu.wmi.bookapi.fixtures.IntegrationTestUtil;
import pl.edu.amu.wmi.bookapi.fixtures.api.BookControllerRequest;
import pl.edu.amu.wmi.bookapi.fixtures.api.UserControllerRequests;
import pl.edu.amu.wmi.bookapi.models.BookDocument;
import java.util.List;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertEquals;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@SpringBootTest
@AutoConfigureMockMvc
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
public class BookControllerInt {
@Autowired
MongoTemplate mongoTemplate;
@Autowired
MockMvc mvc;
@Autowired
IntegrationTestUtil testUtil;
private BookControllerRequest bookRequests;
private UserControllerRequests userRequests;
@BeforeEach
void cleanCollections() {
this.bookRequests = new BookControllerRequest(mvc, new ObjectMapper());
this.userRequests = new UserControllerRequests(mvc, new ObjectMapper());
testUtil.cleanCollections();
}
@Test
void should_add_a_book() throws Exception {
userRequests.registerUser("a-1", "p-1");
String bearer = userRequests.loginAsUserAndReturnAuthorizationHeader("a-1", "p-1");
this.bookRequests.addBook(bearer, "12345", "auth", "title")
.andExpect(status().isOk());
assertEquals(mongoTemplate.findAll(BookDocument.class).get(0).getEan(), "12345");
assertEquals(mongoTemplate.findAll(BookDocument.class).get(0).getOwnerUsername(), "a-1");
}
@Test
void should_list_books_for_user() throws Exception {
userRequests.registerUser("a","b");
String user1 = userRequests.loginAsUserAndReturnAuthorizationHeader("a", "b");
userRequests.registerUser("b","b");
String user2 = userRequests.loginAsUserAndReturnAuthorizationHeader("b", "b");
this.bookRequests.addBook(user1, "12345", "auth", "title")
.andExpect(status().isOk());
this.bookRequests.addBook(user1, "12345", "auth", "title")
.andExpect(status().isOk());
this.bookRequests.addBook(user2, "12345", "auth", "title")
.andExpect(status().isOk());
bookRequests.getBooksForUser(user1)
.andExpect(status().isOk())
.andExpect(jsonPath("$.*.ownerUsername", equalTo(List.of("a", "a"))));
}
@Test
void should_delete_a_book() throws Exception {
userRequests.registerUser("a","b");
String user1 = userRequests.loginAsUserAndReturnAuthorizationHeader("a", "b");
userRequests.registerUser("b","b");
String user2 = userRequests.loginAsUserAndReturnAuthorizationHeader("b", "b");
this.bookRequests.addBook(user1, "12345", "auth", "title")
.andExpect(status().isOk());
BookDocument foundBook = mongoTemplate.findAll(BookDocument.class).get(0);
assertEquals(foundBook.getEan(), "12345");
// Should not allow other users to delete books
this.bookRequests.deleteBook(user2, foundBook.getId());
assertEquals(1, mongoTemplate.findAll(BookDocument.class).size());
this.bookRequests.deleteBook(user1, foundBook.getId());
assertEquals(0, mongoTemplate.findAll(BookDocument.class).size());
}
@Test
void should_list_all_books() throws Exception {
userRequests.registerUser("a-1", "p-1");
String bearer1 = userRequests.loginAsUserAndReturnAuthorizationHeader("a-1", "p-1");
userRequests.registerUser("a-2", "p-1");
String bearer2 = userRequests.loginAsUserAndReturnAuthorizationHeader("a-1", "p-1");
userRequests.registerUser("a-3", "p-1");
String bearer3 = userRequests.loginAsUserAndReturnAuthorizationHeader("a-1", "p-1");
userRequests.registerUser("a-4", "p-1");
String bearer4 = userRequests.loginAsUserAndReturnAuthorizationHeader("a-1", "p-1");
this.bookRequests.addBook(bearer1, "123451", "auth1", "title1")
.andExpect(status().isOk());
this.bookRequests.addBook(bearer2, "123452", "auth2", "title2")
.andExpect(status().isOk());
this.bookRequests.addBook(bearer3, "123453", "auth3", "title3")
.andExpect(status().isOk());
this.bookRequests.getAllBooks(bearer4)
.andExpect(status().isOk())
.andExpect(jsonPath("$").isArray());
}
@Test
void should_update_a_book() throws Exception {
userRequests.registerUser("a-1", "p-1");
String bearer = userRequests.loginAsUserAndReturnAuthorizationHeader("a-1", "p-1");
userRequests.registerUser("a-2", "p-1");
String otherUser = userRequests.loginAsUserAndReturnAuthorizationHeader("a-2", "p-1");
this.bookRequests.addBook(bearer, "12345", "1", "2")
.andExpect(status().isOk());
BookDocument foundBook = mongoTemplate.findAll(BookDocument.class).get(0);
String bookId = foundBook.getId();
ObjectMapper objectMapper = new ObjectMapper();
this.bookRequests.updateBook(bookId, bearer,
"{\n" +
" \"ean\": " + objectMapper.writeValueAsString("ean") + ",\n" +
" \"author\": " + objectMapper.writeValueAsString("author") + ",\n" +
" \"title\": " + objectMapper.writeValueAsString("title") + "\n" +
"}").andExpect(status().isOk());
BookDocument foundBookAfterUpdate = mongoTemplate.findAll(BookDocument.class).get(0);
assertEquals("ean", foundBookAfterUpdate.getEan());
assertEquals("author", foundBookAfterUpdate.getAuthor());
assertEquals("title", foundBookAfterUpdate.getTitle());
// And should allow for partial update
this.bookRequests.updateBook(bookId, bearer,
"{\n" +
"\"ean\": " + objectMapper.writeValueAsString("ean-1-modified") + "\n" +
"}").andExpect(status().isOk());
BookDocument foundBookAfterPartialUpdate = mongoTemplate.findAll(BookDocument.class).get(0);
assertEquals("ean-1-modified", foundBookAfterPartialUpdate.getEan());
assertEquals("author", foundBookAfterPartialUpdate.getAuthor());
assertEquals("title", foundBookAfterPartialUpdate.getTitle());
// And should not allow other users to modify book
this.bookRequests.updateBook(bookId, otherUser, "{\n" +
"\"ean\": " + objectMapper.writeValueAsString("abc") + "\n" +
"}");
BookDocument foundBookAfterOtherUserUpdate = mongoTemplate.findAll(BookDocument.class).get(0);
assertEquals("ean-1-modified", foundBookAfterOtherUserUpdate.getEan());
}
}