1 package com.atlassian.asap.core.server.filter;
2
3 import com.atlassian.asap.api.server.http.RequestAuthenticator;
4 import com.atlassian.asap.core.server.AuthenticationContext;
5 import com.atlassian.asap.core.server.http.RequestAuthenticatorFactory;
6 import org.junit.Before;
7 import org.junit.Rule;
8 import org.junit.Test;
9 import org.junit.rules.ExpectedException;
10 import org.mockito.Mock;
11 import org.mockito.MockitoAnnotations;
12 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
13 import org.springframework.web.context.WebApplicationContext;
14
15 import javax.servlet.FilterConfig;
16 import javax.servlet.ServletContext;
17
18 import static com.atlassian.asap.core.server.filter.SpringRequestAuthenticatorSupplier.SPRING_CONTEXT_NAME_INIT_PARAM_KEY;
19 import static org.junit.Assert.assertNotNull;
20 import static org.mockito.Matchers.any;
21 import static org.mockito.Mockito.spy;
22 import static org.mockito.Mockito.verify;
23 import static org.mockito.Mockito.when;
24
25 public class SpringRequestAuthenticatorSupplierTest {
26 private static final AuthenticationContext AUTHENTICATION_CONTEXT = new AuthenticationContext("The Audience", "https://mock.invalid/");
27
28 @Rule
29 public ExpectedException expectedException = ExpectedException.none();
30
31 @Mock
32 private FilterConfig filterConfig;
33 @Mock
34 private ServletContext servletContext;
35 @Mock
36 private WebApplicationContext springContext;
37
38 private SpringRequestAuthenticatorSupplier supplier;
39
40 @Before
41 public void setUp() {
42 MockitoAnnotations.initMocks(this);
43
44 setupMockSpringContext();
45
46 supplier = new SpringRequestAuthenticatorSupplier(filterConfig);
47 }
48
49 private void setupMockSpringContext() {
50 when(filterConfig.getServletContext()).thenReturn(servletContext);
51 when(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)).thenReturn(springContext);
52 when(springContext.getBean(AuthenticationContext.class)).thenReturn(AUTHENTICATION_CONTEXT);
53 }
54
55 @Test
56 public void resolvesSpringContextWithCustomName() {
57 when(filterConfig.getInitParameter(SPRING_CONTEXT_NAME_INIT_PARAM_KEY)).thenReturn("customSpringContext");
58 SpringRequestAuthenticatorSupplier customContextSupplier = new SpringRequestAuthenticatorSupplier(filterConfig);
59 verify(servletContext).getAttribute("customSpringContext");
60 }
61
62 @Test
63 public void getSucceedsWithDefaultRequestAuthenticatorFactory() {
64 when(springContext.getBean(RequestAuthenticatorFactory.class)).thenThrow(new NoSuchBeanDefinitionException("no such bean"));
65 RequestAuthenticator requestAuthenticator = supplier.get();
66 assertNotNull(requestAuthenticator);
67 }
68
69 @Test
70 public void getSucceedsWithCustomRequestAuthenticatorFactory() {
71 RequestAuthenticatorFactory customRequestAuthenticatorFactory = spy(new RequestAuthenticatorFactory());
72 when(springContext.getBean(RequestAuthenticatorFactory.class)).thenReturn(customRequestAuthenticatorFactory);
73 RequestAuthenticator requestAuthenticator = supplier.get();
74 assertNotNull(requestAuthenticator);
75 verify(customRequestAuthenticatorFactory).create(any(AuthenticationContext.class));
76 }
77
78 @Test
79 public void getFailsIfAuthenticationContextIsMissing() {
80 when(springContext.getBean(RequestAuthenticatorFactory.class)).thenThrow(new NoSuchBeanDefinitionException("no such bean"));
81 when(springContext.getBean(AuthenticationContext.class)).thenThrow(new NoSuchBeanDefinitionException("no such bean"));
82 expectedException.expectMessage("Unable to find unique bean");
83 expectedException.expectMessage(AuthenticationContext.class.getName());
84
85 supplier.get();
86 }
87 }