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