blob: 372f1d5abb4f2f5bedbdab326c23451d59a74229 [file] [log] [blame]
/*
* $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()));
}
}