package com.indeed.imhotep.shortlink; import com.google.common.collect.ImmutableMap; import static org.easymock.EasyMock.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import org.junit.Before; import org.junit.Test; import org.springframework.web.servlet.view.RedirectView; import org.springframework.web.util.UriComponentsBuilder; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestShortLinkController { private HttpServletRequest request; private HttpServletResponse response; private ShortLinkRepository mockRepo; private ShortLinkController controller; @Before public void init() { request = createMock(HttpServletRequest.class); response = createMock(HttpServletResponse.class); mockRepo = createMock(ShortLinkRepository.class); } private void assertCreateResponse(String status, String urlPattern, Object response) { ImmutableMap<String, String> map = (ImmutableMap<String, String>) response; assertEquals("response status", status, map.get("status")); if (urlPattern != null) { assertTrue("short code URL", map.get("url").matches(urlPattern)); } else { assertFalse("no URL returned", map.containsKey("url")); } } @Test public void testCreate() throws Exception { expect(mockRepo.isEnabled()).andReturn(true).anyTimes(); response.setHeader((String) anyObject(), (String) anyObject()); expectLastCall().times(4); final String params = "q[]=from%20mydataset%202016-01-01%202016-01-02"; expect(mockRepo.mapShortCode(matches("[A-Z0-9]{6}"), eq(params))).andReturn(true).once(); replay(mockRepo, request, response); final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl("http://imhotep"); controller = new ShortLinkController(mockRepo); assertCreateResponse("ok", "http://imhotep/q/[A-Z0-9]{6}", controller.create(request, response, uriBuilder, params)); verify(mockRepo, request, response); } @Test public void testCreate_retriesSucceed() throws Exception { expect(mockRepo.isEnabled()).andReturn(true).anyTimes(); response.setHeader((String) anyObject(), (String) anyObject()); expectLastCall().times(4); final String params = "q[]=from%20mydataset%202016-01-01%202016-01-02"; expect(mockRepo.mapShortCode(matches("[A-Z0-9]{6}"), eq(params))).andReturn(false).times(49); expect(mockRepo.mapShortCode(matches("[A-Z0-9]{6}"), eq(params))).andReturn(true).once(); replay(mockRepo, request, response); final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl("http://imhotep"); controller = new ShortLinkController(mockRepo); assertCreateResponse("ok", "http://imhotep/q/[A-Z0-9]{6}", controller.create(request, response, uriBuilder, params)); verify(mockRepo, request, response); } @Test public void testCreate_retriesFail() throws Exception { expect(mockRepo.isEnabled()).andReturn(true).anyTimes(); response.setHeader((String) anyObject(), (String) anyObject()); expectLastCall().times(4); final String params = "q[]=from%20mydataset%202016-01-01%202016-01-02"; expect(mockRepo.mapShortCode(matches("[A-Z0-9]{6}"), eq(params))).andReturn(false).times(50); replay(mockRepo, request, response); final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl("http://imhotep"); controller = new ShortLinkController(mockRepo); try { controller.create(request, response, uriBuilder, params); fail("Should have thrown exception"); } catch (RuntimeException e) { // expected } verify(mockRepo, request, response); } @Test public void testCreate_disabled() throws Exception { expect(mockRepo.isEnabled()).andReturn(false).anyTimes(); replay(mockRepo, request, response); final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl("http://imhotep"); controller = new ShortLinkController(mockRepo); assertCreateResponse("disabled", null, controller.create(request, response, uriBuilder, "")); verify(mockRepo, request, response); } @Test public void testRedirect() throws Exception { expect(mockRepo.isEnabled()).andReturn(true).anyTimes(); final String params = "q[]=from%20mydataset%202016-01-01%202016-01-02"; expect(mockRepo.resolveShortCode(matches("[A-Z0-9]{6}"))).andReturn(params).once(); replay(mockRepo, request, response); controller = new ShortLinkController(mockRepo); RedirectView view = (RedirectView) controller.redirect("JFA39D"); assertEquals("/iql/#" + params, view.getUrl()); verify(mockRepo, request, response); } @Test public void testRedirect_disabled() throws Exception { expect(mockRepo.isEnabled()).andReturn(false).anyTimes(); replay(mockRepo, request, response); controller = new ShortLinkController(mockRepo); RedirectView view = (RedirectView) controller.redirect("JFA39D"); assertEquals("/iql/", view.getUrl()); verify(mockRepo, request, response); } }