diff --git a/src/main/java/de/thm/arsnova/controller/AbstractController.java b/src/main/java/de/thm/arsnova/controller/AbstractController.java index 983a998ce5b76151836096d4d81047a7f61a35cd..755a5625b6b01262b89c700902282acbd20491bc 100644 --- a/src/main/java/de/thm/arsnova/controller/AbstractController.java +++ b/src/main/java/de/thm/arsnova/controller/AbstractController.java @@ -12,6 +12,7 @@ import de.thm.arsnova.exceptions.BadRequestException; import de.thm.arsnova.exceptions.ForbiddenException; import de.thm.arsnova.exceptions.NoContentException; import de.thm.arsnova.exceptions.NotFoundException; +import de.thm.arsnova.exceptions.NotImplementedException; import de.thm.arsnova.exceptions.PreconditionFailedException; import de.thm.arsnova.exceptions.UnauthorizedException; @@ -58,4 +59,9 @@ public class AbstractController { @ExceptionHandler(PreconditionFailedException.class) public void handlePreconditionFailedException(final Exception e, final HttpServletRequest request) { } + + @ResponseStatus(HttpStatus.NOT_IMPLEMENTED) + @ExceptionHandler(NotImplementedException.class) + public void handleNotImplementedException(final Exception e, final HttpServletRequest request) { + } } diff --git a/src/main/java/de/thm/arsnova/controller/CourseController.java b/src/main/java/de/thm/arsnova/controller/CourseController.java index 4276c453aade6a3b15538e9e6c248fd8c1d85311..b6178e368c3c1ae0a2c0ce3cc2909c6ca5a92262 100644 --- a/src/main/java/de/thm/arsnova/controller/CourseController.java +++ b/src/main/java/de/thm/arsnova/controller/CourseController.java @@ -35,7 +35,8 @@ import org.springframework.web.bind.annotation.RestController; import de.thm.arsnova.connector.client.ConnectorClient; import de.thm.arsnova.connector.model.Course; import de.thm.arsnova.connector.model.UserRole; -import de.thm.arsnova.exceptions.NotFoundException; +import de.thm.arsnova.entities.User; +import de.thm.arsnova.exceptions.NotImplementedException; import de.thm.arsnova.exceptions.UnauthorizedException; import de.thm.arsnova.services.IUserService; @@ -55,19 +56,20 @@ public class CourseController extends AbstractController { public final List<Course> myCourses( @RequestParam(value = "sortby", defaultValue = "name") final String sortby ) { - String username = userService.getCurrentUser().getUsername(); - if (username == null) { + final User currentUser = userService.getCurrentUser(); + + if (currentUser == null || currentUser.getUsername() == null) { throw new UnauthorizedException(); } if (connectorClient == null) { - throw new NotFoundException(); + throw new NotImplementedException(); } - List<Course> result = new ArrayList<Course>(); + final List<Course> result = new ArrayList<Course>(); - for (Course course : connectorClient.getCourses(username).getCourse()) { + for (final Course course : connectorClient.getCourses(currentUser.getUsername()).getCourse()) { if ( course.getMembership().isMember() && course.getMembership().getUserrole().equals(UserRole.TEACHER) @@ -76,7 +78,7 @@ public class CourseController extends AbstractController { } } - if (sortby != null && sortby.equals("shortname")) { + if ("shortname".equals(sortby)) { Collections.sort(result, new CourseShortNameComperator()); } else { Collections.sort(result, new CourseNameComperator()); @@ -89,7 +91,7 @@ public class CourseController extends AbstractController { private static final long serialVersionUID = 1L; @Override - public int compare(Course course1, Course course2) { + public int compare(final Course course1, final Course course2) { return course1.getFullname().compareToIgnoreCase(course2.getFullname()); } } @@ -98,7 +100,7 @@ public class CourseController extends AbstractController { private static final long serialVersionUID = 1L; @Override - public int compare(Course course1, Course course2) { + public int compare(final Course course1, final Course course2) { return course1.getShortname().compareToIgnoreCase(course2.getShortname()); } } diff --git a/src/test/java/de/thm/arsnova/controller/CourseControllerTest.java b/src/test/java/de/thm/arsnova/controller/CourseControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..7b122982ca65b02e078cdf85140ceea5efca3dcc --- /dev/null +++ b/src/test/java/de/thm/arsnova/controller/CourseControllerTest.java @@ -0,0 +1,85 @@ +package de.thm.arsnova.controller; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +import de.thm.arsnova.connector.client.ConnectorClient; +import de.thm.arsnova.services.StubUserService; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(locations = { + "file:src/main/webapp/WEB-INF/spring/arsnova-servlet.xml", + "file:src/main/webapp/WEB-INF/spring/spring-main.xml", + "file:src/main/webapp/WEB-INF/spring/spring-security.xml", + "file:src/test/resources/test-config.xml", + "file:src/test/resources/test-socketioconfig.xml" +}) +public class CourseControllerTest { + + private MockMvc mockMvc; + + @InjectMocks + private final CourseController courseController = new CourseController(); + + @Autowired + private WebApplicationContext webApplicationContext; + + @Autowired + private StubUserService userService; + + @Mock + private ConnectorClient connectorClient; + + private void setAuthenticated(final boolean isAuthenticated, final String username) { + if (isAuthenticated) { + final List<GrantedAuthority> ga = new ArrayList<GrantedAuthority>(); + final UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, "secret", ga); + SecurityContextHolder.getContext().setAuthentication(token); + userService.setUserAuthenticated(isAuthenticated, username); + } else { + userService.setUserAuthenticated(isAuthenticated); + } + } + + @Before + public void setup() { + mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); + } + + @Test + public final void testShouldIndicateNotImplementedIfInactiveClient() throws Exception { + setAuthenticated(true, "ptsr00"); + + mockMvc.perform(get("/mycourses").accept(MediaType.TEXT_PLAIN)) + .andExpect(status().isNotImplemented()); + } + + @Test + public final void testShouldNotReturnCurrentUsersCoursesIfUnauthorized() throws Exception { + setAuthenticated(false, "nobody"); + + mockMvc.perform(get("/mycourses").accept(MediaType.TEXT_PLAIN)) + .andExpect(status().isUnauthorized()); + } +}