/** * Copyright 2010-2016 Ralph Schaer <ralphschaer@gmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ch.ralscha.extdirectspring.controller; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import java.util.List; import java.util.Map; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.util.StringUtils; import org.springframework.web.context.WebApplicationContext; import ch.ralscha.extdirectspring.bean.api.Action; import ch.ralscha.extdirectspring.bean.api.PollingProvider; import ch.ralscha.extdirectspring.bean.api.RemotingApi; import ch.ralscha.extdirectspring.util.ApiCache; import ch.ralscha.extdirectspring.util.MethodInfoCache; @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration("classpath:/testApplicationContext.xml") public class ApiControllerWithConfigurationTest { @Autowired private WebApplicationContext wac; private MockMvc mockMvc; @Autowired private ConfigurationService configurationService; @Autowired private MethodInfoCache methodInfoCache; @Autowired private ApiCache apiCache; @Before public void setupApiController() throws Exception { this.methodInfoCache.clear(); this.apiCache.clear(); this.wac.publishEvent(new ContextRefreshedEvent(this.wac)); Configuration config = new Configuration(); ReflectionTestUtils.setField(this.configurationService, "configuration", config); this.configurationService.afterPropertiesSet(); this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); } private void updateConfiguration(ApiRequestParams params, Configuration preConfiguredConfig) { Configuration config; if (preConfiguredConfig == null) { config = new Configuration(); } else { config = preConfiguredConfig; } if (params.getActionNs() != null) { config.setActionNs(params.getActionNs()); } if (params.getApiNs() != null) { config.setApiNs(params.getApiNs()); } if (params.getBaseRouterUrl() != null) { config.setBaseRouterUrl(params.getBaseRouterUrl()); } if (params.getPollingUrlsVar() != null) { config.setPollingUrlsVar(params.getPollingUrlsVar()); } if (params.getRemotingApiVar() != null) { config.setRemotingApiVar(params.getRemotingApiVar()); } if (params.isFullRouterUrl() != null) { config.setFullRouterUrl(params.isFullRouterUrl()); } ReflectionTestUtils.setField(this.configurationService, "configuration", config); this.configurationService.afterPropertiesSet(); } @Test public void testNoActionNamespaceDebugDefaultConfig() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("remotingApiVar").pollingUrlsVar("pollingUrlsVar") .build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.allApis(null)); } @Test public void testNoActionNamespaceDebugCustomConfig() throws Exception { Configuration config = new Configuration(); config.setEnableBuffer(10); config.setMaxRetries(2); config.setTimeout(12000); ApiRequestParams params = ApiRequestParams.builder().apiNs("testC") .remotingApiVar("remotingApiV").pollingUrlsVar("pollingUrlsV") .configuration(config).build(); updateConfiguration(params, config); runTest(this.mockMvc, params, ApiControllerTest.allApis(null)); } @Test public void testWithActionNamespaceDefaultConfig() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("Ext.ns") .actionNs("actionns").remotingApiVar("TEST_REMOTING_API") .pollingUrlsVar("TEST_POLLING_URLS").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.allApis("actionns")); } @Test public void testWithActionNamespaceCustomConfig() throws Exception { Configuration config = new Configuration(); config.setEnableBuffer(Boolean.FALSE); config.setTimeout(10000); ApiRequestParams params = ApiRequestParams.builder().apiNs("Ext.ns") .actionNs("actionns").remotingApiVar("TEST_REMOTING_API") .pollingUrlsVar("TEST_POLLING_URLS").configuration(config).build(); updateConfiguration(params, config); runTest(this.mockMvc, params, ApiControllerTest.allApis("actionns")); } @Test public void testEmptyGroupDefaultConfig() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.emptyGroupApis(null)); } @Test public void testBlankStringGroupDefaultConfig() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group(" ").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.emptyGroupApis(null)); } @Test public void testEmptyGroupCustomConfig() throws Exception { Configuration config = new Configuration(); config.setEnableBuffer(Boolean.TRUE); config.setTimeout(33333); ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("").configuration(config).build(); updateConfiguration(params, config); runTest(this.mockMvc, params, ApiControllerTest.emptyGroupApis(null)); } @Test public void testBlankStringGroupCustomConfig() throws Exception { Configuration config = new Configuration(); config.setEnableBuffer(Boolean.TRUE); config.setTimeout(33333); config.setBufferLimit(null); ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group(" ").configuration(config).build(); updateConfiguration(params, config); runTest(this.mockMvc, params, ApiControllerTest.emptyGroupApis(null)); } @Test public void testBlankStringGroupCustomConfigBufferLimit() throws Exception { Configuration config = new Configuration(); config.setEnableBuffer(Boolean.TRUE); config.setTimeout(222); config.setBufferLimit(5); ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group(" ").configuration(config).build(); updateConfiguration(params, config); runTest(this.mockMvc, params, ApiControllerTest.emptyGroupApis(null)); } @Test public void testUnknownGroupDefaultConfig() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("xy").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.noApis(null)); } @Test public void testUnknownGroupCustomConfig() throws Exception { Configuration config = new Configuration(); config.setEnableBuffer(Boolean.TRUE); ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("xy").configuration(config).build(); updateConfiguration(params, config); runTest(this.mockMvc, params, ApiControllerTest.noApis(null)); } @Test public void testGroup1() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("Ext.ns") .actionNs("actionns").group("group1").configuration(null).build(); updateConfiguration(params, null); testGroup1(null, null); testGroup1(null, null); this.apiCache.clear(); testGroup1(null, "-1.0.0"); this.apiCache.clear(); testGroup1(null, "-fingerprinted"); } @Test public void testGroup1WithConfig() throws Exception { Configuration config = new Configuration(); config.setTimeout(12000); ApiRequestParams params = ApiRequestParams.builder().apiNs("Ext.ns") .actionNs("actionns").group("group1").configuration(config).build(); updateConfiguration(params, config); testGroup1(config, null); testGroup1(config, null); this.apiCache.clear(); testGroup1(config, "-1.0.0"); } private void testGroup1(Configuration config, String fingerprint) throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("Ext.ns") .actionNs("actionns").group("group1").configuration(config).build(); doTest("/api-debug-doc.js", params, ApiControllerTest.group1Apis("actionns")); doTest("/api-debug.js", params, ApiControllerTest.group1Apis("actionns")); if (fingerprint == null) { doTest("/api.js", params, ApiControllerTest.group1Apis("actionns")); } else { MvcResult result = doTest("/api" + fingerprint + ".js", params, ApiControllerTest.group1Apis("actionns")); MockHttpServletResponse response = result.getResponse(); assertThat(response.getHeaderNames()).hasSize(5); assertThat(response.getHeader("ETag")).isNotNull(); assertThat(response.getHeader("Cache-Control")) .isEqualTo("public, max-age=" + 6 * 30 * 24 * 60 * 60); String expiresHeader = (String) response.getHeaderValue("Expires"); DateTimeFormatter fmt = DateTimeFormat .forPattern("EEE, dd MMM yyyy HH:mm:ss z"); DateTime expires = DateTime.parse(expiresHeader, fmt); DateTime inSixMonths = DateTime.now(DateTimeZone.UTC) .plusSeconds(6 * 30 * 24 * 60 * 60); assertThat(expires.getYear()).isEqualTo(inSixMonths.getYear()); assertThat(expires.getMonthOfYear()).isEqualTo(inSixMonths.getMonthOfYear()); assertThat(expires.getDayOfMonth()).isEqualTo(inSixMonths.getDayOfMonth()); assertThat(expires.getHourOfDay()).isEqualTo(inSixMonths.getHourOfDay()); assertThat(expires.getMinuteOfDay()).isEqualTo(inSixMonths.getMinuteOfDay()); } } @Test public void testGroup2() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("group2").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null)); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null)); } @Test public void testGroup3() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("Extns").actionNs("ns") .remotingApiVar("RAPI").pollingUrlsVar("PURLS").group("group3").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group3Apis("ns")); runTest(this.mockMvc, params, ApiControllerTest.group3Apis("ns")); } @Test public void testGroup4() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("test").actionNs("") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("group4").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group4Apis(null)); params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("group4").build(); runTest(this.mockMvc, params, ApiControllerTest.group4Apis(null)); } @Test public void testGroup1and2() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("Ext.ns") .actionNs("actionns").group("group1,group2").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group1and2Apis("actionns")); } @Test public void testGroup1andUnknown() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("Ext.ns") .actionNs("actionns").group("group1,unknown").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group1Apis("actionns")); } @Test public void testInterfaceGroup() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("test").actionNs("") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("interface").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.interfaceApis(null)); params = ApiRequestParams.builder().apiNs("test") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("interface").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.interfaceApis(null)); } @Test public void testNoApiNs() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("").actionNs("") .remotingApiVar("TEST_REMOTING_API").pollingUrlsVar("TEST_POLLING_URLS") .group("group4").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group4Apis(null)); params = ApiRequestParams.builder().apiNs("").remotingApiVar("TEST_REMOTING_API") .pollingUrlsVar("TEST_POLLING_URLS").group("group4").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group4Apis(null)); } @Test public void testFullRouterUrl() throws Exception { ApiRequestParams params = ApiRequestParams.builder().apiNs("apiNs").actionNs("") .remotingApiVar("TEST_RMT_API").pollingUrlsVar("TEST_POLL_URLS") .fullRouterUrl(Boolean.TRUE).group("group2").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null, "http://localhost/router")); params = ApiRequestParams.builder().apiNs("apiNs").remotingApiVar("TEST_RMT_API") .pollingUrlsVar("TEST_POLL_URLS").fullRouterUrl(Boolean.TRUE) .group("group2").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null, "http://localhost/router")); params = ApiRequestParams.builder().apiNs("apiNs").actionNs("") .remotingApiVar("TEST_RMT_API").pollingUrlsVar("TEST_POLL_URLS") .fullRouterUrl(Boolean.FALSE).group("group2").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null, "/router")); params = ApiRequestParams.builder().apiNs("apiNs").remotingApiVar("TEST_RMT_API") .pollingUrlsVar("TEST_POLL_URLS").fullRouterUrl(Boolean.FALSE) .group("group2").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null, "/router")); } @Test public void testFormat() throws Exception { ApiRequestParams params = ApiRequestParams.builder().actionNs("").apiNs("apiNs") .remotingApiVar("TEST_RMT_API").pollingUrlsVar("TEST_POLL_URLS") .group("group2").format("json").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null, "http://localhost/router")); params = ApiRequestParams.builder().actionNs("ns").apiNs("") .remotingApiVar("TEST_RMT_API").pollingUrlsVar("TEST_POLL_URLS") .group("group2").format("json").fullRouterUrl(Boolean.TRUE).build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis("ns", "http://localhost/router")); } @Test public void testBaseRouterUrl() throws Exception { ApiRequestParams params = ApiRequestParams.builder().actionNs("").apiNs("an") .remotingApiVar("rapi").pollingUrlsVar("papi").group("group2") .baseRouterUrl("test").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null, "test/router")); } @Test public void testBaseRouterUrlWithEndingSlash() throws Exception { ApiRequestParams params = ApiRequestParams.builder().actionNs("").apiNs("an") .remotingApiVar("rapi").pollingUrlsVar("papi").group("group2") .fullRouterUrl(Boolean.TRUE).baseRouterUrl("service/test/").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null, "service/test/router")); } @Test public void testBaseRouterUrlEmptyString() throws Exception { ApiRequestParams params = ApiRequestParams.builder().actionNs("").apiNs("an") .remotingApiVar("rapi").pollingUrlsVar("papi").group("group2") .baseRouterUrl("").build(); updateConfiguration(params, null); runTest(this.mockMvc, params, ApiControllerTest.group2Apis(null, "/router")); } static void runTest(MockMvc mockMvc, ApiRequestParams params, RemotingApi api) throws Exception { doTest(mockMvc, "/api-debug-doc.js", params, api); doTest(mockMvc, "/api-debug.js", params, api); doTest(mockMvc, "/api.js", params, api); } private MvcResult doTest(String url, ApiRequestParams params, RemotingApi expectedApi) throws Exception { return doTest(this.mockMvc, url, params, expectedApi); } private static MvcResult doTest(MockMvc mockMvc, String url, ApiRequestParams params, RemotingApi expectedApi) throws Exception { MockHttpServletRequestBuilder request = get(url).accept(MediaType.ALL) .characterEncoding("UTF-8"); if (params.getFormat() != null) { request.param("format", params.getFormat()); } if (params.getGroup() != null) { request.param("group", params.getGroup()); } String contentType = "application/javascript"; if ("json".equals(params.getFormat())) { contentType = "application/json;charset=UTF-8"; } else if (params.getConfiguration() != null) { contentType = params.getConfiguration().getJsContentType(); } MvcResult result = mockMvc.perform(request).andExpect(status().isOk()) .andExpect(content().contentType(contentType)).andReturn(); if ("json".equals(params.getFormat())) { ApiControllerTest.compareJson(result, expectedApi, params); } else { ApiControllerTest.compare(result, expectedApi, params); } return result; } @SuppressWarnings("unchecked") public static void compare(String contentString, String contentTypeString, RemotingApi remotingApi, ApiRequestParams params) { String content = contentString; content = content.replace(";", ";\n"); content = content.replace("{", "{\n"); content = content.replace("}", "}\n"); String contentType = contentTypeString; int cs = contentType.indexOf(';'); if (cs != -1) { contentType = contentType.substring(0, cs); } Configuration configuration = params.getConfiguration(); if (configuration != null) { assertThat(contentType).isEqualTo(configuration.getJsContentType()); } else { assertThat(contentType).isEqualTo("application/javascript"); } assertThat(content).isNotEmpty(); String[] lines = content.split("\n"); String remotingApiLine; String pollingApiLine; String apiNs = params.getApiNs(); if (apiNs == null) { apiNs = "Ext.app"; } String remotingApiVar = params.getRemotingApiVar(); if (remotingApiVar == null) { remotingApiVar = "REMOTING_API"; } String pollingUrlsVar = params.getPollingUrlsVar(); if (pollingUrlsVar == null) { pollingUrlsVar = "POLLING_URLS"; } if (StringUtils.hasText(apiNs)) { String extNsLine = "Ext.ns('" + apiNs + "');"; ApiControllerTest.assertContains(extNsLine, lines); remotingApiLine = apiNs + "." + remotingApiVar + " = {"; pollingApiLine = apiNs + "." + pollingUrlsVar + " = {"; } else { ApiControllerTest.assertDoesNotContains("Ext.ns(", lines); remotingApiLine = remotingApiVar + " = {"; pollingApiLine = pollingUrlsVar + " = {"; } int startRemotingApi = ApiControllerTest.assertContains(remotingApiLine, lines); int startPollingApi = lines.length; if (!remotingApi.getPollingProviders().isEmpty()) { startPollingApi = ApiControllerTest.assertContains(pollingApiLine, lines); } else { ApiControllerTest.assertDoesNotContains(pollingApiLine, lines); } if (remotingApi.getNamespace() != null) { String actionNs = "Ext.ns('" + remotingApi.getNamespace() + "');"; ApiControllerTest.assertContains(actionNs, lines); } String remotingJson = "{"; for (int i = startRemotingApi + 1; i < startPollingApi; i++) { remotingJson += lines[i]; } String pollingJson = "{"; if (!remotingApi.getPollingProviders().isEmpty()) { for (int i = startPollingApi + 1; i < startPollingApi; i++) { pollingJson += lines[i]; } } int noOfconfigOptions = 0; if (configuration != null) { if (configuration.getTimeout() != null) { noOfconfigOptions++; } if (configuration.getEnableBuffer() != null) { noOfconfigOptions++; } if (configuration.getMaxRetries() != null) { noOfconfigOptions++; } } Map<String, Object> rootAsMap = ControllerUtil.readValue(remotingJson, Map.class); if (remotingApi.getNamespace() == null) { if (3 + noOfconfigOptions != rootAsMap.size()) { for (String key : rootAsMap.keySet()) { System.out.println(key + "->" + rootAsMap.get(key)); } } assertThat(rootAsMap).hasSize(3 + noOfconfigOptions); } else { if (4 + noOfconfigOptions != rootAsMap.size()) { System.out.println("NOOFCONFIG: " + noOfconfigOptions); for (String key : rootAsMap.keySet()) { System.out.println(key + "->" + rootAsMap.get(key)); } } assertThat(rootAsMap).hasSize(4 + noOfconfigOptions); } assertThat(rootAsMap.get("url")).isEqualTo(remotingApi.getUrl()); if (params.getProviderType() != null) { assertThat(rootAsMap.get("type")).isEqualTo(params.getProviderType()); } else { assertThat(rootAsMap.get("type")).isEqualTo("remoting"); } assertThat(rootAsMap.containsKey("actions")).isTrue(); if (remotingApi.getNamespace() != null) { assertThat(rootAsMap.get("namespace")).isEqualTo(remotingApi.getNamespace()); } if (configuration != null) { if (configuration.getTimeout() != null) { assertThat(rootAsMap.get("timeout")) .isEqualTo(configuration.getTimeout()); } else { assertThat(rootAsMap.get("timeout")).isNull(); } if (configuration.getEnableBuffer() != null) { assertThat(rootAsMap.get("enableBuffer")) .isEqualTo(configuration.getEnableBuffer()); } else { assertThat(rootAsMap.get("enableBuffer")).isNull(); } if (configuration.getMaxRetries() != null) { assertThat(rootAsMap.get("maxRetries")) .isEqualTo(configuration.getMaxRetries()); } else { assertThat(rootAsMap.get("maxRetries")).isNull(); } if (params.getConfiguration().getBufferLimit() != null) { assertThat(rootAsMap.get("bufferLimit")) .isEqualTo(params.getConfiguration().getBufferLimit()); } else { assertThat(rootAsMap.containsKey("bufferLimit")).isFalse(); } } else { assertThat(rootAsMap.get("timeout")).isNull(); assertThat(rootAsMap.get("enableBuffer")).isNull(); assertThat(rootAsMap.get("maxRetries")).isNull(); assertThat(rootAsMap.get("bufferLimit")).isNull(); } Map<String, Object> beans = (Map<String, Object>) rootAsMap.get("actions"); assertThat(beans.size()).isEqualTo(remotingApi.getActions().size()); for (String beanName : remotingApi.getActions().keySet()) { List<Map<String, Object>> actions = (List<Map<String, Object>>) beans .get(beanName); List<Action> expectedActions = remotingApi.getActions().get(beanName); ApiControllerTest.compare(expectedActions, actions); } if (!remotingApi.getPollingProviders().isEmpty()) { Map<String, Object> pollingMap = ControllerUtil.readValue(pollingJson, Map.class); assertThat(pollingMap).hasSize(remotingApi.getPollingProviders().size()); for (PollingProvider pp : remotingApi.getPollingProviders()) { String url = (String) pollingMap.get(pp.getEvent()); assertThat(url).isNotNull(); assertEquals(String.format("%s/%s/%s/%s", remotingApi.getUrl().replace("router", "poll"), pp.getBeanName(), pp.getMethod(), pp.getEvent()), url); } } } }