View Javadoc

1   /*
2    * $Id: TextTagTest.java 471756 2006-11-06 15:01:43Z husted $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  package org.apache.struts2.views.jsp;
22  
23  import java.text.MessageFormat;
24  import java.util.ArrayList;
25  import java.util.Date;
26  import java.util.List;
27  import java.util.Locale;
28  
29  import javax.servlet.jsp.JspException;
30  import javax.servlet.jsp.tagext.BodyTag;
31  
32  import org.apache.struts2.ServletActionContext;
33  import org.apache.struts2.StrutsException;
34  import org.apache.struts2.TestAction;
35  import org.apache.struts2.components.Text;
36  import org.apache.struts2.views.jsp.ui.StrutsBodyContent;
37  import org.apache.struts2.views.jsp.ui.TestAction1;
38  
39  import com.mockobjects.servlet.MockJspWriter;
40  import com.opensymphony.xwork2.Action;
41  import com.opensymphony.xwork2.ActionContext;
42  import com.opensymphony.xwork2.util.ValueStack;
43  import com.opensymphony.xwork2.util.ValueStackFactory;
44  
45  
46  /***
47   * TextTagTest
48   *
49   */
50  public class TextTagTest extends AbstractTagTest {
51  
52      private String fooValue = "org.apache.struts2.views.jsp.TextTagTest.fooValue";
53      private TextTag tag;
54  
55  
56      public Action getAction() {
57          TestAction action = new TestAction();
58          action.setFoo(fooValue);
59  
60          return action;
61      }
62  
63      public void testDefaultMessageOk() throws Exception {
64          // NOTE:
65          // simulate the condition
66          // <s:text name="some.invalid.key">My Default Message</s:text>
67  
68          StrutsMockBodyContent mockBodyContent = new StrutsMockBodyContent(new MockJspWriter());
69          mockBodyContent.setString("Sample Of Default Message");
70          tag.setBodyContent(mockBodyContent);
71          tag.setName("some.invalid.key.so.we.should.get.the.default.message");
72          int startStatus = tag.doStartTag();
73          tag.doEndTag();
74  
75          assertEquals(startStatus, BodyTag.EVAL_BODY_BUFFERED);
76          assertEquals("Sample Of Default Message", writer.toString());
77      }
78  
79      public void testExpressionsEvaluated() throws Exception {
80          String key = "expressionKey";
81          String value = "Foo is " + fooValue;
82          tag.setName(key);
83          tag.doStartTag();
84          tag.doEndTag();
85          assertEquals(value, writer.toString());
86      }
87  
88      public void testCorrectI18NKey() throws Exception {
89          String key = "foo.bar.baz";
90          String value = "This should start with foo";
91          tag.setName(key);
92          tag.doStartTag();
93          tag.doEndTag();
94          assertEquals(value, writer.toString());
95      }
96  
97      public void testCorrectI18NKey2() throws Exception {
98          String key = "bar.baz";
99          String value = "No foo here";
100         tag.setName(key);
101         tag.doStartTag();
102         tag.doEndTag();
103         assertEquals(value, writer.toString());
104     }
105 
106     public void testMessageFormatWorks() throws Exception {
107         String key = "messageFormatKey";
108         String pattern = "Params are {0} {1} {2}";
109         Object param1 = new Integer(12);
110         Object param2 = new Date();
111         Object param3 = "StringVal";
112         List params = new ArrayList();
113         params.add(param1);
114         params.add(param2);
115         params.add(param3);
116 
117         String expected = MessageFormat.format(pattern, params.toArray());
118         tag.setName(key);
119         tag.doStartTag();
120         ((Text) tag.component).addParameter(param1);
121         ((Text) tag.component).addParameter(param2);
122         ((Text) tag.component).addParameter(param3);
123         tag.doEndTag();
124         assertEquals(expected, writer.toString());
125     }
126 
127     public void testSimpleKeyValueWorks() throws JspException {
128         String key = "simpleKey";
129         String value = "Simple Message";
130         tag.setName(key);
131         tag.doStartTag();
132         tag.doEndTag();
133         assertEquals(value, writer.toString());
134     }
135 
136     private Locale getForeignLocale() {
137         if (Locale.getDefault().getLanguage().equals("de")) {
138             return Locale.FRANCE;
139         } else {
140             return Locale.GERMANY;
141         }
142     }
143 
144     private Locale getDefaultLocale() {
145         if (Locale.getDefault().getLanguage().equals("de")) {
146             return Locale.GERMANY;
147         } else if (Locale.getDefault().getLanguage().equals("fr")) {
148             return Locale.FRANCE;
149         } else {
150             return Locale.US;
151         }
152     }
153 
154     private String getLocalizedMessage(Locale locale) {
155         if (locale.getLanguage().equals("de")) {
156             return "This is TestBean1 in German";
157         } else if (locale.getLanguage().equals("fr")) {
158             return "This is TestBean1 in French";
159         } else {
160             return "This is TestBean1";
161         }
162     }
163 
164     public void testTextTagUsesValueStackInRequestNotActionContext() throws JspException {
165         String key = "simpleKey";
166         String value1 = "Simple Message";
167         Locale foreignLocale = getForeignLocale();
168         String value2 = getLocalizedMessage(foreignLocale);
169         tag.setName(key);
170         tag.doStartTag();
171         tag.doEndTag();
172         assertEquals(value1, writer.toString());
173         final StringBuffer buffer = writer.getBuffer();
174         buffer.delete(0, buffer.length());
175         ValueStack newStack = ValueStackFactory.getFactory().createValueStack();
176         newStack.getContext().put(ActionContext.LOCALE, foreignLocale);
177         newStack.push(new TestAction1());
178         request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack);
179         assertNotSame(ActionContext.getContext().getValueStack().peek(), newStack.peek());
180 
181         tag.doStartTag();
182         tag.doEndTag();
183         assertEquals(value2, writer.toString());
184     }
185 
186     public void testTextTagUsesLocaleFromValueStack() throws JspException {
187         stack.pop();
188         stack.push(new TestAction1());
189 
190         Locale defaultLocale = getDefaultLocale();
191         Locale foreignLocale = getForeignLocale();
192         assertNotSame(defaultLocale, foreignLocale);
193 
194         ActionContext.getContext().setLocale(defaultLocale);
195         String key = "simpleKey";
196         String value_default = getLocalizedMessage(defaultLocale);
197         tag.setName(key);
198         tag.doStartTag();
199         tag.doEndTag();
200         assertEquals(value_default, writer.toString());
201 
202         final StringBuffer buffer = writer.getBuffer();
203         buffer.delete(0, buffer.length());
204         String value_int = getLocalizedMessage(foreignLocale);
205         assertFalse(value_default.equals(value_int));
206         ValueStack newStack = ValueStackFactory.getFactory().createValueStack(stack);
207         newStack.getContext().put(ActionContext.LOCALE, foreignLocale);
208         assertNotSame(newStack.getContext().get(ActionContext.LOCALE), ActionContext.getContext().getLocale());
209         request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack);
210         assertEquals(ActionContext.getContext().getValueStack().peek(), newStack.peek());
211         tag.doStartTag();
212         tag.doEndTag();
213         assertEquals(value_int, writer.toString());
214     }
215 
216     public void testWithNoMessageAndBodyIsNotEmptyBodyIsReturned() throws Exception {
217         final String key = "key.does.not.exist";
218         final String bodyText = "body text";
219         tag.setName(key);
220 
221         StrutsBodyContent bodyContent = new StrutsBodyContent(null);
222         bodyContent.print(bodyText);
223         tag.setBodyContent(bodyContent);
224         tag.doStartTag();
225         tag.doEndTag();
226         assertEquals(bodyText, writer.toString());
227     }
228 
229     public void testWithNoMessageAndNoDefaultKeyReturned() throws JspException {
230         final String key = "key.does.not.exist";
231         tag.setName("'" + key + "'");
232         tag.doStartTag();
233         tag.doEndTag();
234         assertEquals(key, writer.toString());
235     }
236 
237     public void testNoNameDefined() throws Exception {
238         String msg = "tag 'text', field 'name': You must specify the i18n key. Example: welcome.header";
239         try {
240             tag.doStartTag();
241             tag.doEndTag();
242             fail("Should have thrown a RuntimeException");
243         } catch (StrutsException e) {
244             assertEquals(msg, e.getMessage());
245         }
246     }
247 
248     public void testBlankNameDefined() throws Exception {
249         tag.setName("");
250         tag.doStartTag();
251         tag.doEndTag();
252         assertEquals("", writer.toString());
253     }
254 
255     public void testPutId() throws Exception {
256         assertEquals(null, stack.findString("myId")); // nothing in stack
257         tag.setId("myId");
258         tag.setName("bar.baz");
259         tag.doStartTag();
260         tag.doEndTag();
261         assertEquals("", writer.toString());
262         assertEquals("No foo here", stack.findString("myId")); // is in stack now
263     }
264 
265     /***
266      * todo remove ActionContext set after LocalizedTextUtil is fixed to not use ThreadLocal
267      *
268      * @throws Exception
269      */
270     protected void setUp() throws Exception {
271         super.setUp();
272         tag = new TextTag();
273         tag.setPageContext(pageContext);
274         ActionContext.setContext(new ActionContext(stack.getContext()));
275     }
276 
277     protected void tearDown() throws Exception {
278         ValueStack valueStack = ValueStackFactory.getFactory().createValueStack();
279         ActionContext.setContext(new ActionContext(valueStack.getContext()));
280     }
281 }