package org.dicadeveloper.weplantaforest.articlemanager.article;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.transaction.Transactional;
import org.dicadeveloper.weplantaforest.articlemanager.FileSystemInjector;
import org.dicadeveloper.weplantaforest.articlemanager.articles.Article;
import org.dicadeveloper.weplantaforest.articlemanager.articles.Article.ArticleType;
import org.dicadeveloper.weplantaforest.articlemanager.articles.ArticleRepository;
import org.dicadeveloper.weplantaforest.articlemanager.articles.Paragraph;
import org.dicadeveloper.weplantaforest.articlemanager.articles.ParagraphRepository;
import org.dicadeveloper.weplantaforest.articlemanager.testSupport.DbInjecter;
import org.dicadeveloper.weplantaforest.articlemanager.user.UserRepository;
import org.dicadeveloper.weplantaforest.common.support.Language;
import org.dicadeveloper.weplantaforest.common.testSupport.CleanDbRule;
import org.dicadeveloper.weplantaforest.common.testSupport.TestUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.web.context.WebApplicationContext;
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringBootTest({ "spring.profiles.active=test" })
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class ArticleControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webApplicationContext;
@Rule
@Autowired
public CleanDbRule _cleanDbRule;
@Autowired
private DbInjecter _dbInjecter;
@Autowired
private UserRepository _userRepository;
@Autowired
private ArticleRepository _articleRepository;
@Autowired
private ParagraphRepository _paragraphRepository;
@Before
public void setup() {
mockMvc = webAppContextSetup(this.webApplicationContext).build();
}
@After
public void cleanUp() {
TestUtil.deleteFilesInDirectory(new File(FileSystemInjector.getArticleFolder()));
}
@Test
@Transactional
public void testCreateArticle() throws Exception {
_dbInjecter.injectUser("Adam");
Article article = new Article();
article.setArticleType(ArticleType.BLOG);
article.setCreatedOn(1000000L);
article.setIntro("intro bintro blablabla");
article.setLang(Language.DEUTSCH);
article.setLastEditedOn(2000000L);
article.setOwner(_userRepository.findByName("Adam"));
article.setTitle("created Article!");
article.setVisible(true);
List<Paragraph> paragraphs = new ArrayList<>();
Paragraph paragraph = new Paragraph();
paragraph.setTitle("title title title");
paragraph.setText("paragraph text text text");
paragraphs.add(paragraph);
article.setParagraphs(paragraphs);
mockMvc.perform(post("/backOffice/article/create").contentType(TestUtil.APPLICATION_JSON_UTF8)
.param("userName", "Adam")
.content(TestUtil.convertObjectToJsonBytes(article)))
.andExpect(status().isOk());
assertThat(_articleRepository.count()).isEqualTo(1L);
Article createdArticle = _articleRepository.findOne(1L);
assertThat(createdArticle.getParagraphs()).isNotNull();
assertThat(createdArticle.getParagraphs()
.size()).isEqualTo(1);
}
@Test
public void testDeleteArticle() throws IOException, Exception {
_dbInjecter.injectUser("manager");
Article article = _dbInjecter.injectArticle("title", "intro", ArticleType.BLOG, "manager", 1000000L);
_dbInjecter.injectParagraphToArticle(article, "paragraph title", "paragraph text");
assertThat(_articleRepository.count()).isEqualTo(1L);
assertThat(_paragraphRepository.count()).isEqualTo(1L);
mockMvc.perform(post("/backOffice/article/delete").contentType(MediaType.APPLICATION_JSON)
.param("articleId", "1"))
.andExpect(status().isOk());
assertThat(_articleRepository.count()).isEqualTo(0);
assertThat(_paragraphRepository.count()).isEqualTo(0);
}
@Test
public void testAddArticleImage() throws Exception {
_dbInjecter.injectUser("manager");
_dbInjecter.injectArticle("title", "intro", ArticleType.BLOG, "manager", 1000000L);
FileInputStream fileInputStream = new FileInputStream("src/test/resources/images/" + "article1.jpg");
MockMultipartFile image = new MockMultipartFile("file", "file.jpg","image/jpg", fileInputStream);
MediaType mediaType = new MediaType("multipart", "form-data");
mockMvc.perform(MockMvcRequestBuilders.fileUpload("/article/upload/image")
.file(image)
.contentType(mediaType)
.param("articleId", "1"))
.andExpect(status().isOk());
assertThat(_articleRepository.findOne(1L)
.getImageFileName()).isEqualTo("article_1_main.jpg");
TestUtil.deleteFilesInDirectory(new File(FileSystemInjector.getArticleFolder()));
}
@Test
public void testAddParagraphImage() throws Exception {
_dbInjecter.injectUser("manager");
Article article = _dbInjecter.injectArticle("title", "intro", ArticleType.BLOG, "manager", 1000000L);
_dbInjecter.injectParagraphToArticle(article, "paragraph title", "paragraph text");
FileInputStream fileInputStream = new FileInputStream("src/test/resources/images/" + "article1.jpg");
MockMultipartFile image = new MockMultipartFile("file", "file.jpg","image/jpg", fileInputStream);
MediaType mediaType = new MediaType("multipart", "form-data");
mockMvc.perform(MockMvcRequestBuilders.fileUpload("/paragraph/upload/image")
.file(image)
.contentType(mediaType)
.param("articleId", "1")
.param("paragraphId", "1"))
.andExpect(status().isOk());
assertThat(_paragraphRepository.findOne(1L)
.getImageFileName()).isEqualTo("article_1_paragraph_1.jpg");
TestUtil.deleteFilesInDirectory(new File(FileSystemInjector.getArticleFolder()));
}
}