1 package com.atlassian.plugin.web.model;
2
3 import com.atlassian.plugin.Plugin;
4 import com.atlassian.plugin.PluginAccessor;
5 import com.atlassian.plugin.web.renderer.RendererException;
6 import com.atlassian.plugin.web.renderer.WebPanelRenderer;
7 import com.google.common.collect.ImmutableList;
8 import junit.framework.TestCase;
9
10 import java.io.IOException;
11 import java.io.StringWriter;
12 import java.io.Writer;
13 import java.util.Collections;
14 import java.util.Map;
15
16 import static org.mockito.Matchers.*;
17 import static org.mockito.Mockito.doThrow;
18 import static org.mockito.Mockito.mock;
19 import static org.mockito.Mockito.when;
20
21 public class ResourceTemplateWebPanelTest extends TestCase
22 {
23 private static final String TEMPLATE_FILE_TEXT = "This <file> is used as web panel contents in unit tests.\n" +
24 "Do not change its contents.";
25
26 private PluginAccessor accessorMock;
27 private WebPanelRenderer rendererMock;
28 private Plugin pluginMock;
29 private Map<String, Object> emptyContext = Collections.emptyMap();
30
31 @Override
32 protected void setUp() throws Exception
33 {
34 accessorMock = mock(PluginAccessor.class);
35 rendererMock = mock(WebPanelRenderer.class);
36 pluginMock = mock(Plugin.class);
37 when(pluginMock.getClassLoader()).thenReturn(this.getClass().getClassLoader());
38 }
39
40 @Override
41 protected void tearDown() throws Exception
42 {
43 accessorMock = null;
44 rendererMock = null;
45 pluginMock = null;
46 }
47
48 public void testGetHtml()
49 {
50 when(accessorMock.getEnabledModulesByClass(WebPanelRenderer.class)).thenReturn(Collections.<WebPanelRenderer>emptyList());
51
52 String resourceFilename = "ResourceTemplateWebPanelTest.txt";
53 String resourceType = "static";
54 final ResourceTemplateWebPanel webPanel = newResourceTemplateWebPanel(resourceFilename, resourceType);
55
56 assertEquals(TEMPLATE_FILE_TEXT, webPanel.getHtml(Collections.<String, Object>emptyMap()));
57 }
58
59 public void testWriteHtml() throws IOException
60 {
61 when(accessorMock.getEnabledModulesByClass(WebPanelRenderer.class)).thenReturn(Collections.<WebPanelRenderer>emptyList());
62
63 ResourceTemplateWebPanel webPanel = newResourceTemplateWebPanel("ResourceTemplateWebPanelTest.txt", "static");
64
65 StringWriter out = new StringWriter();
66 webPanel.writeHtml(out, emptyContext);
67 assertEquals(TEMPLATE_FILE_TEXT, out.toString());
68 }
69
70 public void testErrorMessagesEscaped() throws IOException
71 {
72 WebPanelTestUtils.mockPluginAccessorReturning(accessorMock, rendererMock);
73 when(rendererMock.getResourceType()).thenReturn("cheese");
74
75 doThrow(new RendererException("<cheese>")).when(rendererMock).render(eq("<filename>.txt"), same(pluginMock), same(emptyContext), isA(Writer.class));
76
77 ResourceTemplateWebPanel webPanel = newResourceTemplateWebPanel("<filename>.txt", "cheese");
78 assertEquals("Error rendering WebPanel (<filename>.txt): <cheese>", webPanel.getHtml(emptyContext));
79 }
80
81 public void testErrorMessagesEscapedInWriteHtml() throws IOException
82 {
83 WebPanelTestUtils.mockPluginAccessorReturning(accessorMock, rendererMock);
84 when(rendererMock.getResourceType()).thenReturn("cheese");
85 doThrow(new RendererException("<cheese>")).when(rendererMock).render(eq("<filename>.txt"), same(pluginMock), same(emptyContext), isA(Writer.class));
86
87 ResourceTemplateWebPanel webPanel = newResourceTemplateWebPanel("<filename>.txt", "cheese");
88
89 StringWriter out = new StringWriter();
90 webPanel.writeHtml(out, emptyContext);
91 assertEquals("Error rendering WebPanel (<filename>.txt): <cheese>", out.toString());
92 }
93
94 public void testUnsupportedResourceType()
95 {
96 when(rendererMock.getResourceType()).thenReturn("velocity");
97 WebPanelTestUtils.mockPluginAccessorReturning(accessorMock, rendererMock);
98
99 ResourceTemplateWebPanel webPanel = newResourceTemplateWebPanel("ResourceTemplateWebPanelTest.txt", "unsupported-type");
100
101 String result = webPanel.getHtml(emptyContext);
102 assertEquals("Error rendering WebPanel (ResourceTemplateWebPanelTest.txt): No renderer found for resource type: unsupported-type", result);
103 }
104
105 private ResourceTemplateWebPanel newResourceTemplateWebPanel(String resourceFilename, String resourceType)
106 {
107 final ResourceTemplateWebPanel webPanel = new ResourceTemplateWebPanel(accessorMock);
108 webPanel.setPlugin(pluginMock);
109 webPanel.setResourceType(resourceType);
110 webPanel.setResourceFilename(resourceFilename);
111 return webPanel;
112 }
113 }