View Javadoc

1   package org.melati.template.test;
2   
3   import java.util.Properties;
4   
5   import org.melati.Melati;
6   import org.melati.MelatiConfig;
7   import org.melati.PoemContext;
8   import org.melati.poem.AccessPoemException;
9   import org.melati.poem.BaseFieldAttributes;
10  import org.melati.poem.Capability;
11  import org.melati.poem.Column;
12  import org.melati.poem.Field;
13  import org.melati.poem.PoemLocale;
14  import org.melati.poem.PoemThread;
15  import org.melati.util.test.Node;
16  import org.melati.util.test.TreeDatabase;
17  import org.melati.template.AttributeMarkupLanguage;
18  import org.melati.template.HTMLMarkupLanguage;
19  import org.melati.template.MarkupLanguage;
20  import org.melati.template.TemplateContext;
21  import org.melati.template.TemplateEngine;
22  import org.melati.template.TemplateEngineException;
23  import org.melati.util.JSStaticTree;
24  import org.melati.util.MelatiException;
25  import org.melati.util.MelatiStringWriter;
26  import org.melati.util.Tree;
27  
28  import junit.framework.TestCase;
29  
30  
31  /**
32   * An abstract test which is run against most permutations of configuaration.
33   * 
34   * @author timp
35   * @since 14-May-2006
36   */
37  abstract public class MarkupLanguageSpec extends TreeTestCase {
38  
39    protected static MelatiConfig mc = null;
40    protected static TemplateEngine templateEngine = null;
41    protected static MarkupLanguage ml = null;
42    protected static AttributeMarkupLanguage aml = null;
43    protected static Melati m = null;
44  
45    /**
46     * Constructor for PoemTest.
47     * @param arg0
48     */
49    public MarkupLanguageSpec(String arg0) {
50      super(arg0);
51    }
52    /**
53     * Constructor.
54     */
55    public MarkupLanguageSpec() {
56      super();
57    }
58    
59  
60   
61    /**
62     * @see TestCase#setUp()
63     */
64    protected void setUp() throws Exception
65    {
66      super.setUp();
67      melatiConfig();
68      templateEngine = mc.getTemplateEngine();
69      //System.err.println("About to init " + templateEngine.getClass().getName());
70      templateEngine.init(mc);
71      m = new Melati(mc, new MelatiStringWriter());
72      m.setTemplateEngine(templateEngine);
73      m.setPoemContext(new PoemContext());
74      assertNotNull(m.getTemplateEngine());
75      TemplateContext templateContext =
76        templateEngine.getTemplateContext(m);
77      m.setTemplateContext(templateContext);
78    }
79    
80    abstract protected void melatiConfig() throws MelatiException ;
81    
82    
83    
84    /**
85     * Test method for rendered(Exception).
86     * @throws Exception 
87     * 
88     * @see org.melati.template.HTMLAttributeMarkupLanguage#
89     *      rendered(AccessPoemException)
90     */
91    public void testRenderedAccessPoemException() throws Exception {
92      
93      assertEquals("java.lang.Exception",aml.rendered(new Exception()));
94  
95      AccessPoemException ape = new AccessPoemException(
96            getDb().getUserTable().guestUser(), new Capability("Cool"));
97      assertTrue(ml.rendered(ape),ml.rendered(ape).indexOf("[Access denied to Melati guest user]") != -1);
98      ape = new AccessPoemException();
99      assertEquals("", aml.rendered(ape));
100     //System.err.println(m.getWriter().toString());
101     assertTrue(m.getWriter().toString().indexOf("[Access denied to [UNRENDERABLE EXCEPTION!]") != -1);
102     ape = new AccessPoemException(
103           getDb().getUserTable().guestUser(), new Capability("Cool"));
104     assertEquals("", aml.rendered(ape));
105       // NB Not at all sure how this value changed 
106       //System.err.println(m.getWriter().toString());
107       //assertTrue(m.getWriter().toString().indexOf("[Access denied to Melati guest user]") != -1);
108     assertTrue(m.getWriter().toString().indexOf("[Access denied to _guest_]") != -1);
109 
110   }
111 
112   /**
113    * Test method for Constructor. 
114    * 
115    * @see org.melati.template.HTMLMarkupLanguage#
116    *   HTMLMarkupLanguage(Melati, TempletLoader, PoemLocale)
117    */
118   public void testHTMLMarkupLanguageMelatiTempletLoaderPoemLocale() {
119 
120   }
121 
122   /**
123    * Test method for Constructor 
124    * @see org.melati.template.HTMLMarkupLanguage#
125    *          HTMLMarkupLanguage(String, HTMLMarkupLanguage)
126    */
127   public void testHTMLMarkupLanguageStringHTMLMarkupLanguage() {
128 
129   }
130 
131   /**
132    * Test method for getAttr().
133    * 
134    * @see org.melati.template.HTMLMarkupLanguage#getAttr()
135    */
136   public void testGetAttr() {
137     assertEquals(aml.getClass(), ml.getAttr().getClass());
138   }
139 
140   /**
141    * Test method for escaped(String).
142    * 
143    * @see org.melati.template.HTMLLikeMarkupLanguage#escaped(String)
144    */
145   public void testEscapedString() throws Exception {
146 
147   }
148   
149   /**
150    * Test entity substitution.
151    */
152   public void testEntitySubstitution() throws Exception { 
153     char pound[] = {163};
154     assertEquals("£", ml.rendered(new String(pound)));
155     assertEquals("£", aml.rendered(new String(pound)));
156   }
157 
158   /**
159    * Test method for escaped(Persistent).
160    * 
161    * @see org.melati.template.HTMLLikeMarkupLanguage#escaped(Persistent)
162    */
163   public void testEscapedPersistent() {
164     assertEquals("Melati guest user",ml.escaped(getDb().getUserTable().getUserObject(0)));
165   }
166 
167   /**
168    * Test method for encoded.
169    * 
170    * @see org.melati.template.HTMLLikeMarkupLanguage#encoded(String)
171    */
172   public void testEncoded() {
173     assertEquals("+", ml.encoded(" "));
174     assertEquals("+", aml.encoded(" "));
175     assertEquals("%26", ml.encoded("&"));
176     assertEquals("%26", aml.encoded("&"));
177   }
178 
179   /**
180    * Test method for rendered(Object).
181    * 
182    * @see org.melati.template.MarkupLanguage#rendered(Object)
183    */
184   public void testRenderedObject() throws Exception {
185     assertEquals("Fredd$", ml.rendered("Fredd$"));
186     // Note velocity seems to leave the line end on
187     assertEquals("[1]", ml.rendered(new Integer("1")).trim());
188     
189     assertEquals("1", ml.getAttr().rendered(new Integer("1")));
190     try { 
191       ml.getAttr().rendered(new Bomber());
192       fail("Should have bombed");
193     } catch (Exception e) {
194       e = null;
195     }
196     
197     try { 
198       ml.rendered(new Bomber());
199       fail("Should have bombed");
200     } catch (Exception e) {
201       e = null;
202     }
203     
204     Node persistent = (Node)getDb().getTable("node").newPersistent();
205     persistent.setName("Mum");
206     persistent.makePersistent();
207     m.setPoemContext(new PoemContext());
208      
209     String renderedPersistent = ml.rendered(persistent);
210     //System.err.println(renderedPersistent);
211     assertEquals("Mum", renderedPersistent);
212 
213   }
214   /**
215    * @see org.melati.template.MarkupLanguage#renderedMarkup
216    */
217   public void testRenderedMarkupString() throws Exception { 
218     assertEquals("</a>",ml.renderedMarkup("</a>"));
219     assertEquals("&lt;/a&gt;",ml.rendered("</a>"));
220   }
221   
222   /**
223    * Test that a syntax error in a templet is handled.
224    */
225   public void testSyntaxErrorInTemplet() throws Exception { 
226     Object templated = new TemplatedWithSyntaxError();
227     try { 
228       ml.rendered(templated);
229       fail("Should have bombed");
230     } catch (TemplateEngineException e) { 
231       e = null;
232     }
233   }
234   /**
235    * Test that an evaluation error in a templet is handled.
236    */
237   public void testEvaluationErrorInTemplet() throws Exception { 
238     Object templated = new TemplatedWithBombingToString();
239     try { 
240       ml.rendered(templated);
241       fail("Should have bombed");
242     } catch (TemplateEngineException e) { 
243       e = null;
244     }
245   }
246   
247   /**
248    * Test that a syntax error in a WM templet is handled by Velocity.
249    */
250   public void testSyntaxErrorInWMTemplet() throws Exception { 
251     Object templated = new TemplatedWithWMSyntaxError();
252     try { 
253       ml.rendered(templated);
254       fail("Should have bombed");
255     } catch (TemplateEngineException e) { 
256       e = null;
257     }
258   }
259   
260   /**
261    * Test that we can find a template on the classpath.
262    */
263   public void testTemplateFoundOnClasspath() throws Exception { 
264     Templated templated = new Templated();
265     String rendered = ml.rendered(templated);
266     assertEquals("Hi, this is from a template.", rendered);    
267   }
268   
269   /**
270    * Test that toString is used if no template found.
271    */
272   public void testUntemplatedObjectUsesToString() throws Exception { 
273     
274     String rendered = ml.rendered(new Properties());
275     // Webmacro, incorrectly, puts a newline at front
276     assertEquals("[{}]", rendered.trim());
277   }
278   /**
279    * Test that special templets are found.
280    */
281   public void testSpecialTemplateFound() throws Exception { 
282     Column<Integer> column = getDb().getGroupMembershipTable().getUserColumn();
283     BaseFieldAttributes<Integer> fa = new BaseFieldAttributes<Integer>(column, column.getType());
284     Field<Integer> field = new Field<Integer>(getDb().getUserTable().administratorUser().troid(), fa);
285     Object adminUtil = m.getContextUtil("org.melati.admin.AdminUtils");
286     assertTrue(adminUtil instanceof org.melati.admin.AdminUtils);
287     assertTrue(ml.input(field).indexOf("add_rule(\"field_user\",") != -1);
288   }
289 
290   /**
291    * An object which throws an exception when its toString method is called.
292    */
293   class Bomber {
294     /**
295      * Constructor.
296      */
297     public Bomber() {}
298     /** 
299      * Throw exception.
300      */
301     public String toString() {
302       throw new RuntimeException("Bomber bombed.");
303     }
304   }
305   /**
306    * Test method for rendered(String).
307    * 
308    * @see org.melati.template.MarkupLanguage#rendered(String)
309    */
310   public void testRenderedString() throws Exception {
311     assertEquals("Fredd$", ml.rendered("Fredd$"));
312   }
313 
314   /**
315    * Test NPE thrown.
316    */
317   public void testNull() throws Exception {
318     try { 
319       ml.rendered(null);
320       fail("should have bombed");      
321     } catch (NullPointerException e) { 
322       e = null;
323     }
324     
325   }
326   /**
327    * Test method for rendered(String, int).
328    * 
329    * @see org.melati.template.MarkupLanguage#rendered(String, int)
330    */
331   public void testRenderedStringInt() throws Exception {
332       assertEquals("Fre...", ml.rendered("Fredd$", 3));
333   }
334 
335   /**
336    * Test method for rendered(Field).
337    * 
338    * @see org.melati.template.MarkupLanguage#rendered(Field)
339    */
340   public void testRenderedField() throws Exception {
341     Field<?> userName = getDb().getUserTable().getUserObject(0).getField("login");
342     assertEquals("_guest_", ml.rendered(userName));
343   }
344   /**
345    * Test method for rendered(Field, int).
346    * 
347    * @see org.melati.template.MarkupLanguage#rendered(Field, int)
348    */
349   public void testRenderedFieldInt() throws Exception {
350     Field<?> userName = getDb().getUserTable().getUserObject(0).getField("login");
351     assertEquals("_guest_", ml.rendered(userName,3));
352   }
353 
354   /**
355    * Test method for rendered(Field, int, int).
356    * 
357    * @see org.melati.template.MarkupLanguage#rendered(Field, int, int)
358    */
359   public void testRenderedFieldIntInt() throws Exception {
360     Field<?> userName = getDb().getUserTable().getUserObject(0).getField("login");
361     assertEquals("_gu...", ml.rendered(userName,3,3));
362   }
363 
364 
365   /**
366    * Test method for renderedStart(Field).
367    * 
368    * @see org.melati.template.MarkupLanguage#renderedStart(Field)
369    */
370   public void testRenderedStart() throws Exception {
371     Field<?> userName = getDb().getUserTable().getUserObject(0).getField("login");
372     assertEquals("_guest_", ml.renderedStart(userName));
373   }
374 
375   /**
376    * Test method for input(Field).
377    * 
378    * @see org.melati.template.MarkupLanguage#input(Field)
379    */
380   public void testInputField() throws Exception {
381     Field<?> userName = getDb().getUserTable().getUserObject(0).getField("login");
382     assertTrue(ml.input(userName).toLowerCase().indexOf("<input name=\"field_login\"") != -1);
383   }
384   /**
385    * Test method for input(Field) where field to be rendered as a dropdown.
386    * 
387    * @see org.melati.template.MarkupLanguage#input(Field)
388    */
389   public void testInputFieldSelection() throws Exception {
390     //Selection dropdown of references    
391     Field<?> group = getDb().getGroupMembershipTable().getGroupMembershipObject(0).getField("group");
392     System.err.println(ml.input(group));
393     assertTrue(ml.input(group).indexOf("name=\"field_group\"") != -1);
394     assertTrue(ml.input(group).indexOf("id=\"field_group\"") != -1);
395     assertTrue(ml.input(group).indexOf("<select") != -1);
396   }
397   /**
398    * Test method for input(Field) where the renderinfo is selectionWindow.
399    * 
400    * @see org.melati.template.MarkupLanguage#input(Field)
401    */
402   public void testSelectionWindowField() throws Exception {
403     Field<?> owningTable = getDb().getColumnInfoTable().getColumnInfoObject(0).getField("tableinfo");
404     assertTrue(ml.input(owningTable).indexOf("<input type=\"text\" name=\"field_tableinfo_dummy\"") != -1);
405     Field<?> user = getDb().getGroupMembershipTable().getGroupMembershipObject(0).getField("user");
406     assertTrue(ml.input(user).indexOf("<input type=\"text\" name=\"field_user_dummy\"") != -1);
407   }
408 
409   /**
410    * Test access to password field.
411    */
412   public void testInputFieldForRestrictedField() throws Exception { 
413     PoemThread.setAccessToken(getDb().getUserTable().guestUser());
414     Field<?> password = getDb().getUserTable().getPasswordColumn().asEmptyField();
415     assertTrue(ml.input(password).toLowerCase().indexOf("name=\"field_password\"") != -1);
416     //System.err.println(ml.rendered(getDb().getUserTable().administratorUser()));
417   }
418   
419   /**
420    * Test method for inputAs(Field, String).
421    * 
422    * @see org.melati.template.MarkupLanguage#inputAs(Field, String)
423    */
424   public void testInputAs() throws Exception {
425     Field<?> userName = getDb().getUserTable().getUserObject(0).getField("login");
426     try {
427       assertTrue(ml.inputAs(userName, "nonExistantTemplateName").toLowerCase().indexOf("<input name=\"field_login\"") != -1);
428       fail("Should have bombed");
429     } catch (Exception e) {
430       e = null;
431     }
432     assertTrue(ml.inputAs(userName, "org.melati.poem.StringPoemType").toLowerCase().indexOf("<input name=\"field_login\"") != -1);
433   }
434 
435   /**
436    * Test method for searchInput(Field, String).
437    * 
438    * @see org.melati.template.MarkupLanguage#searchInput(Field, String)
439    */
440   public void testSearchInput() throws Exception {
441     Field<?> userName = getDb().getUserTable().getUserObject(0).getField("login");
442     assertTrue(ml.searchInput(userName, "None").toLowerCase().indexOf("<input name=\"field_login\"") != -1);
443   }
444 
445 
446   /**
447    * Test method for rendered(Treeable).
448    * 
449    * @see org.melati.template.MarkupLanguage#rendered(Object)
450    */
451   public void testRenderedTreeable() throws Exception {
452     Node parent = (Node)((TreeDatabase)getDb()).getNodeTable().newPersistent();
453     parent.setName("Mum");
454     parent.makePersistent();
455     Node kid1 = (Node)((TreeDatabase)getDb()).getNodeTable().newPersistent();
456     kid1.setName("K1");
457     kid1.setParent(parent);
458     kid1.makePersistent();
459     Node kid2 = (Node)((TreeDatabase)getDb()).getNodeTable().newPersistent();
460     kid2.setName("K2");
461     kid2.setParent(parent);
462     kid2.makePersistent();
463     Tree testTree = new Tree(parent);
464     JSStaticTree tree = new JSStaticTree(testTree, "/melati-static/admin/static");
465     m.setPoemContext(new PoemContext());
466       
467     String renderedTree = ml.rendered(tree);
468     //System.err.println(":" + renderedTree + ":");
469     assertTrue(renderedTree.indexOf("init") != -1);
470    
471   }
472   
473   
474 }