| /* |
| * $Id$ |
| * |
| * Copyright 2006 The Apache Software Foundation. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.struts2.views.jsp; |
| |
| import java.text.MessageFormat; |
| import java.util.ArrayList; |
| import java.util.Date; |
| import java.util.List; |
| import java.util.Locale; |
| |
| import javax.servlet.jsp.JspException; |
| import javax.servlet.jsp.tagext.BodyTag; |
| |
| import org.apache.struts2.ServletActionContext; |
| import org.apache.struts2.StrutsException; |
| import org.apache.struts2.TestAction; |
| import org.apache.struts2.components.Text; |
| import org.apache.struts2.views.jsp.ui.StrutsBodyContent; |
| import org.apache.struts2.views.jsp.ui.TestAction1; |
| |
| import com.mockobjects.servlet.MockJspWriter; |
| import com.opensymphony.xwork2.Action; |
| import com.opensymphony.xwork2.ActionContext; |
| import com.opensymphony.xwork2.util.OgnlValueStack; |
| |
| |
| /** |
| * TextTagTest |
| * |
| */ |
| public class TextTagTest extends AbstractTagTest { |
| |
| private String fooValue = "org.apache.struts2.views.jsp.TextTagTest.fooValue"; |
| private TextTag tag; |
| |
| |
| public Action getAction() { |
| TestAction action = new TestAction(); |
| action.setFoo(fooValue); |
| |
| return action; |
| } |
| |
| public void testDefaultMessageOk() throws Exception { |
| // NOTE: |
| // simulate the condition |
| // <s:text name="some.invalid.key">My Default Message</s:text> |
| |
| StrutsMockBodyContent mockBodyContent = new StrutsMockBodyContent(new MockJspWriter()); |
| mockBodyContent.setString("Sample Of Default Message"); |
| tag.setBodyContent(mockBodyContent); |
| tag.setName("some.invalid.key.so.we.should.get.the.default.message"); |
| int startStatus = tag.doStartTag(); |
| tag.doEndTag(); |
| |
| assertEquals(startStatus, BodyTag.EVAL_BODY_BUFFERED); |
| assertEquals("Sample Of Default Message", writer.toString()); |
| } |
| |
| public void testExpressionsEvaluated() throws Exception { |
| String key = "expressionKey"; |
| String value = "Foo is " + fooValue; |
| tag.setName(key); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(value, writer.toString()); |
| } |
| |
| public void testCorrectI18NKey() throws Exception { |
| String key = "foo.bar.baz"; |
| String value = "This should start with foo"; |
| tag.setName(key); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(value, writer.toString()); |
| } |
| |
| public void testCorrectI18NKey2() throws Exception { |
| String key = "bar.baz"; |
| String value = "No foo here"; |
| tag.setName(key); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(value, writer.toString()); |
| } |
| |
| public void testMessageFormatWorks() throws Exception { |
| String key = "messageFormatKey"; |
| String pattern = "Params are {0} {1} {2}"; |
| Object param1 = new Integer(12); |
| Object param2 = new Date(); |
| Object param3 = "StringVal"; |
| List params = new ArrayList(); |
| params.add(param1); |
| params.add(param2); |
| params.add(param3); |
| |
| String expected = MessageFormat.format(pattern, params.toArray()); |
| tag.setName(key); |
| tag.doStartTag(); |
| ((Text) tag.component).addParameter(param1); |
| ((Text) tag.component).addParameter(param2); |
| ((Text) tag.component).addParameter(param3); |
| tag.doEndTag(); |
| assertEquals(expected, writer.toString()); |
| } |
| |
| public void testSimpleKeyValueWorks() throws JspException { |
| String key = "simpleKey"; |
| String value = "Simple Message"; |
| tag.setName(key); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(value, writer.toString()); |
| } |
| |
| private Locale getForeignLocale() { |
| if (Locale.getDefault().getLanguage().equals("de")) { |
| return Locale.FRANCE; |
| } else { |
| return Locale.GERMANY; |
| } |
| } |
| |
| private Locale getDefaultLocale() { |
| if (Locale.getDefault().getLanguage().equals("de")) { |
| return Locale.GERMANY; |
| } else if (Locale.getDefault().getLanguage().equals("fr")) { |
| return Locale.FRANCE; |
| } else { |
| return Locale.US; |
| } |
| } |
| |
| private String getLocalizedMessage(Locale locale) { |
| if (locale.getLanguage().equals("de")) { |
| return "This is TestBean1 in German"; |
| } else if (locale.getLanguage().equals("fr")) { |
| return "This is TestBean1 in French"; |
| } else { |
| return "This is TestBean1"; |
| } |
| } |
| |
| public void testTextTagUsesValueStackInRequestNotActionContext() throws JspException { |
| String key = "simpleKey"; |
| String value1 = "Simple Message"; |
| Locale foreignLocale = getForeignLocale(); |
| String value2 = getLocalizedMessage(foreignLocale); |
| tag.setName(key); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(value1, writer.toString()); |
| final StringBuffer buffer = writer.getBuffer(); |
| buffer.delete(0, buffer.length()); |
| OgnlValueStack newStack = new OgnlValueStack(); |
| newStack.getContext().put(ActionContext.LOCALE, foreignLocale); |
| newStack.push(new TestAction1()); |
| request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack); |
| assertNotSame(ActionContext.getContext().getValueStack().peek(), newStack.peek()); |
| |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(value2, writer.toString()); |
| } |
| |
| public void testTextTagUsesLocaleFromValueStack() throws JspException { |
| stack.pop(); |
| stack.push(new TestAction1()); |
| |
| Locale defaultLocale = getDefaultLocale(); |
| Locale foreignLocale = getForeignLocale(); |
| assertNotSame(defaultLocale, foreignLocale); |
| |
| ActionContext.getContext().setLocale(defaultLocale); |
| String key = "simpleKey"; |
| String value_default = getLocalizedMessage(defaultLocale); |
| tag.setName(key); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(value_default, writer.toString()); |
| |
| final StringBuffer buffer = writer.getBuffer(); |
| buffer.delete(0, buffer.length()); |
| String value_int = getLocalizedMessage(foreignLocale); |
| assertFalse(value_default.equals(value_int)); |
| OgnlValueStack newStack = new OgnlValueStack(stack); |
| newStack.getContext().put(ActionContext.LOCALE, foreignLocale); |
| assertNotSame(newStack.getContext().get(ActionContext.LOCALE), ActionContext.getContext().getLocale()); |
| request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, newStack); |
| assertEquals(ActionContext.getContext().getValueStack().peek(), newStack.peek()); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(value_int, writer.toString()); |
| } |
| |
| public void testWithNoMessageAndBodyIsNotEmptyBodyIsReturned() throws Exception { |
| final String key = "key.does.not.exist"; |
| final String bodyText = "body text"; |
| tag.setName(key); |
| |
| StrutsBodyContent bodyContent = new StrutsBodyContent(null); |
| bodyContent.print(bodyText); |
| tag.setBodyContent(bodyContent); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(bodyText, writer.toString()); |
| } |
| |
| public void testWithNoMessageAndNoDefaultKeyReturned() throws JspException { |
| final String key = "key.does.not.exist"; |
| tag.setName("'" + key + "'"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals(key, writer.toString()); |
| } |
| |
| public void testNoNameDefined() throws Exception { |
| String msg = "tag 'text', field 'name': You must specify the i18n key. Example: welcome.header"; |
| try { |
| tag.doStartTag(); |
| tag.doEndTag(); |
| fail("Should have thrown a RuntimeException"); |
| } catch (StrutsException e) { |
| assertEquals(msg, e.getMessage()); |
| } |
| } |
| |
| public void testBlankNameDefined() throws Exception { |
| tag.setName(""); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals("", writer.toString()); |
| } |
| |
| public void testPutId() throws Exception { |
| assertEquals(null, stack.findString("myId")); // nothing in stack |
| tag.setId("myId"); |
| tag.setName("bar.baz"); |
| tag.doStartTag(); |
| tag.doEndTag(); |
| assertEquals("", writer.toString()); |
| assertEquals("No foo here", stack.findString("myId")); // is in stack now |
| } |
| |
| /** |
| * todo remove ActionContext set after LocalizedTextUtil is fixed to not use ThreadLocal |
| * |
| * @throws Exception |
| */ |
| protected void setUp() throws Exception { |
| super.setUp(); |
| tag = new TextTag(); |
| tag.setPageContext(pageContext); |
| ActionContext.setContext(new ActionContext(stack.getContext())); |
| } |
| |
| protected void tearDown() throws Exception { |
| OgnlValueStack valueStack = new OgnlValueStack(); |
| ActionContext.setContext(new ActionContext(valueStack.getContext())); |
| } |
| } |