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