package catering.staff; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.endsWith; import static org.salespointframework.core.Currencies.EURO; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.javamoney.moneta.Money; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.HttpHeaders; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; @AutoConfigureMockMvc @SpringBootTest class StaffControllerIntegrationTests { @Autowired MockMvc mvc; MockHttpServletRequestBuilder createStaff = post("/staff/add") .param("name", "Karl Baum") .param("wage", "10") .param("job", "COOK"); @Autowired private StaffManagement staffManagement; Employee defaultEmployee; Long defaultEmployeeId; @BeforeEach void setup() throws Exception { defaultEmployee = staffManagement.save(new Employee("Dieter Baum", JobType.COOK, Money.of(0, EURO))); defaultEmployeeId = defaultEmployee.getId(); } @AfterEach void tearDown() throws Exception { staffManagement.delete(defaultEmployeeId); defaultEmployee = null; defaultEmployeeId = null; } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void viewStaff() throws Exception { mvc.perform(get("/staff")) .andExpect(status().isOk()) .andExpect(content().string(containsString(defaultEmployee.getName()))); } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void viewStaffEditPage() throws Exception { mvc.perform(get("/staff/edit/" + defaultEmployeeId.toString())) .andExpect(status().isOk()) .andExpect(content().string(containsString(defaultEmployee.getName()))); } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void addStaff() throws Exception { assertThat(staffManagement.findAll().stream()) .extracting("name") .doesNotContain("Karl Baum"); mvc.perform(createStaff).andExpect(redirectedUrl("/staff")); assertThat(staffManagement.findAll().stream()) .extracting("name") .contains("Karl Baum"); } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void modifyStaff() throws Exception { mvc.perform(post("/staff/edit/" + defaultEmployeeId.toString()) .param("name", "Dieter Bäume") .param("wage", "10") .param("job", "SERVICE")).andExpect(redirectedUrl("/staff")) .andExpect(redirectedUrl("/staff")); assertThat(staffManagement.findById(defaultEmployeeId).get()) .extracting("name", "job") .containsExactly("Dieter Bäume", JobType.SERVICE); } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void removeStaff() throws Exception { assertThat(staffManagement.findAll().stream()) .extracting("name") .contains("Dieter Baum"); mvc.perform(post("/staff/remove").param("id", defaultEmployeeId.toString())); assertThat(staffManagement.findAll().stream()) .extracting("name") .doesNotContain("Dieter Baum"); } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void addStaffWrong() throws Exception { mvc.perform(post("/staff/add")) .andExpect(content().string(containsString("Ungültiger Name"))) .andExpect(content().string(containsString("Ungültiger Lohn"))) .andExpect(content().string(containsString("Ungültiger Job"))); } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void editStaffWrong() throws Exception { mvc.perform(post("/staff/edit/" + defaultEmployeeId.toString())) .andExpect(content().string(containsString("Ungültiger Name"))) .andExpect(content().string(containsString("Ungültiger Lohn"))) .andExpect(content().string(containsString("Ungültiger Job"))); assertThat(staffManagement.findById(defaultEmployeeId).get()) .extracting("name", "job") .containsExactly("Dieter Baum", JobType.COOK); } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void addStaffWithWrongJobType() throws Exception { assertThat(staffManagement.findAll().stream()) .extracting("name") .doesNotContain("Paul Kunst"); mvc.perform(post("/staff/add") .param("name", "Paul Kunst") .param("wage", "10") .param("job", "notAJob")) .andExpect(content().string(containsString("Ungültiger Job"))); assertThat(staffManagement.findAll().stream()) .extracting("name") .doesNotContain("Paul Kunst"); } @Test @WithMockUser(username = "admin", password = "admin", roles = "ADMIN") void editStaffWithWrongJobType() throws Exception { mvc.perform( post("/staff/edit/" + defaultEmployeeId.toString()) .param("name", defaultEmployee.getName()) .param("wage", "10") .param("job", "notAJob")) .andExpect(content().string(containsString("Ungültiger Job"))); assertThat(staffManagement.findById(defaultEmployeeId).get()) .extracting("name", "job") .containsExactly("Dieter Baum", JobType.COOK); } @Test @WithMockUser(username = "dieter", password = "123", roles = "CUSTOMER") void refuseCustomer() throws Exception { mvc.perform(get("/staff")).andExpect(status().isForbidden()); mvc.perform(get("/staff/edit/" + defaultEmployeeId.toString())).andExpect(status().isForbidden()); } @Test @WithAnonymousUser void refuseAnonymous() throws Exception { mvc.perform(get("/staff")) .andExpect(status().is3xxRedirection()) .andExpect(header().string(HttpHeaders.LOCATION, endsWith("/login"))); mvc.perform(get("/staff/edit/" + defaultEmployeeId)) .andExpect(status().is3xxRedirection()) .andExpect(header().string(HttpHeaders.LOCATION, endsWith("/login"))); } }