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 junit.framework.TestCase;
8
9 import java.io.IOException;
10 import java.io.StringWriter;
11 import java.io.Writer;
12 import java.util.Collections;
13 import java.util.Map;
14
15 import static org.mockito.Matchers.eq;
16 import static org.mockito.Matchers.isA;
17 import static org.mockito.Matchers.isNull;
18 import static org.mockito.Matchers.same;
19 import static org.mockito.Mockito.doThrow;
20 import static org.mockito.Mockito.mock;
21 import static org.mockito.Mockito.when;
22
23 public class EmbeddedTemplateWebPanelTest extends TestCase {
24 private PluginAccessor accessorMock;
25 private WebPanelRenderer rendererMock;
26 private Map<String, Object> emptyContext = Collections.emptyMap();
27
28 @Override
29 protected void setUp() throws Exception {
30 accessorMock = mock(PluginAccessor.class);
31 rendererMock = mock(WebPanelRenderer.class);
32 }
33
34 @Override
35 protected void tearDown() throws Exception {
36 accessorMock = null;
37 rendererMock = null;
38 }
39
40 public void testWriteHtml() throws IOException {
41 EmbeddedTemplateWebPanel webPanel = newEmbeddedTemplateWebPanel(accessorMock, "static");
42
43 StringWriter out = new StringWriter();
44 webPanel.writeHtml(out, Collections.<String, Object>emptyMap());
45 assertEquals("<body>", out.toString());
46 }
47
48 public void testWriteHtmlErrorMessagesEscaped() throws IOException {
49 setMocksToThrowException(accessorMock, rendererMock);
50
51 EmbeddedTemplateWebPanel webPanel = newEmbeddedTemplateWebPanel(accessorMock, "cheese");
52
53 StringWriter out = new StringWriter();
54 webPanel.writeHtml(out, emptyContext);
55 assertEquals("Error rendering WebPanel: <cheese>\nTemplate contents: <body>", out.toString());
56 }
57
58 public void testGetHtml() {
59 EmbeddedTemplateWebPanel webPanel = newEmbeddedTemplateWebPanel(accessorMock, "static");
60
61 assertEquals("<body>", webPanel.getHtml(Collections.<String, Object>emptyMap()));
62 }
63
64 public void testErrorMessagesEscaped() throws IOException {
65 setMocksToThrowException(accessorMock, rendererMock);
66
67 EmbeddedTemplateWebPanel webPanel = newEmbeddedTemplateWebPanel(accessorMock, "cheese");
68
69 assertEquals("Error rendering WebPanel: <cheese>\nTemplate contents: <body>", webPanel.getHtml(emptyContext));
70 }
71
72 private void setMocksToThrowException(PluginAccessor accessorMock, WebPanelRenderer rendererMock) throws IOException {
73 WebPanelTestUtils.mockPluginAccessorReturning(accessorMock, rendererMock);
74
75 when(rendererMock.getResourceType()).thenReturn("cheese");
76 doThrow(new RendererException("<cheese>")).when(rendererMock).renderFragment(isA(Writer.class), eq("<body>"), (Plugin) isNull(), same(emptyContext));
77 }
78
79 public void testUnsupportedResourceType() {
80 when(rendererMock.getResourceType()).thenReturn("velocity");
81 WebPanelTestUtils.mockPluginAccessorReturning(accessorMock, rendererMock);
82
83 EmbeddedTemplateWebPanel webPanel = newEmbeddedTemplateWebPanel(accessorMock, "unsupported-type");
84
85 String result = webPanel.getHtml(emptyContext);
86 assertNotNull(result);
87 assertTrue(result.toLowerCase().contains("error"));
88 }
89
90 private EmbeddedTemplateWebPanel newEmbeddedTemplateWebPanel(PluginAccessor accessorMock, String resourceType) {
91 EmbeddedTemplateWebPanel webPanel = new EmbeddedTemplateWebPanel(accessorMock);
92 webPanel.setResourceType(resourceType);
93 webPanel.setTemplateBody("<body>");
94 return webPanel;
95 }
96 }