package io.dropwizard.views; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.common.collect.ImmutableMap; import io.dropwizard.Configuration; import io.dropwizard.jersey.setup.JerseyEnvironment; import io.dropwizard.setup.Environment; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import javax.validation.constraints.NotNull; import javax.ws.rs.WebApplicationException; import java.io.IOException; import java.io.OutputStream; import java.util.Collections; import java.util.Locale; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class ViewBundleTest { @Rule public final MockitoRule mockitoRule = MockitoJUnit.rule(); @Mock private JerseyEnvironment jerseyEnvironment; private final Environment environment = mock(Environment.class); private static class MyConfiguration extends Configuration { @NotNull private Map<String, Map<String, String>> viewRendererConfiguration = Collections.emptyMap(); @JsonProperty("viewRendererConfiguration") public Map<String, Map<String, String>> getViewRendererConfiguration() { return viewRendererConfiguration; } @JsonProperty("viewRendererConfiguration") public void setViewRendererConfiguration(Map<String, Map<String, String>> viewRendererConfiguration) { ImmutableMap.Builder<String, Map<String, String>> builder = ImmutableMap.builder(); for (Map.Entry<String, Map<String, String>> entry : viewRendererConfiguration.entrySet()) { builder.put(entry.getKey(), ImmutableMap.copyOf(entry.getValue())); } this.viewRendererConfiguration = builder.build(); } } @Before public void setUp() throws Exception { when(environment.jersey()).thenReturn(jerseyEnvironment); } @Test public void addsTheViewMessageBodyWriterToTheEnvironment() throws Exception { new ViewBundle<>().run(null, environment); verify(jerseyEnvironment).register(any(ViewMessageBodyWriter.class)); } @Test public void addsTheViewMessageBodyWriterWithSingleViewRendererToTheEnvironment() throws Exception { final String viewSuffix = ".ftl"; final String testKey = "testKey"; final Map<String, String> freeMarkerConfig = Collections.singletonMap(testKey, "yes"); final Map<String, Map<String, String>> viewRendererConfig = Collections.singletonMap(viewSuffix, freeMarkerConfig); final MyConfiguration myConfiguration = new MyConfiguration(); myConfiguration.setViewRendererConfiguration(viewRendererConfig); ViewRenderer renderer = new ViewRenderer() { @Override public boolean isRenderable(View view) { return false; } @Override public void render(View view, Locale locale, OutputStream output) throws IOException, WebApplicationException { //nothing to do } @Override public void configure(Map<String, String> options) { assertThat(options).containsKey(testKey); } @Override public String getSuffix() { return viewSuffix; } }; new ViewBundle<MyConfiguration>(Collections.singletonList(renderer)) { @Override public Map<String, Map<String, String>> getViewConfiguration(MyConfiguration configuration) { return configuration.getViewRendererConfiguration(); } }.run(myConfiguration, environment); final ArgumentCaptor<ViewMessageBodyWriter> captor = ArgumentCaptor.forClass(ViewMessageBodyWriter.class); verify(jerseyEnvironment).register(captor.capture()); final ViewMessageBodyWriter capturedRenderer = captor.getValue(); final Iterable<ViewRenderer> configuredRenderers = capturedRenderer.getRenderers(); assertThat(configuredRenderers).hasSize(1); assertThat(configuredRenderers).contains(renderer); } }