/*
* 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.esigate.esi;
import java.io.IOException;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.esigate.HttpErrorPage;
public class ChooseElementTest extends AbstractElementTest {
public void testChoose() throws IOException, HttpErrorPage {
String page = "begin <esi:choose>inside choose</esi:choose> end";
String result = render(page);
assertEquals("begin inside choose end", result);
}
public void testSingleWhen() throws IOException, HttpErrorPage {
String page =
"begin <esi:choose>" + "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Advanced'\">inside when</esi:when>"
+ "</esi:choose> end";
getRequestBuilder().addCookie(new BasicClientCookie("group", "Advanced"));
String result = render(page);
assertEquals("begin inside when end", result);
}
public void testMultipleWhen() throws IOException, HttpErrorPage {
String page =
"begin <esi:choose>" + "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Advanced'\">"
+ "<esi:vars>unexpected cookie '$(HTTP_COOKIE{group})'</esi:vars>" + "</esi:when>"
+ "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Beginner'\">"
+ "<esi:vars>expected cookie '$(HTTP_COOKIE{group})'</esi:vars>" + "</esi:when>"
+ "</esi:choose> end";
getRequestBuilder().addCookie(new BasicClientCookie("group", "Beginner"));
String result = render(page);
assertEquals("begin expected cookie 'Beginner' end", result);
}
public void testMultipleWhenEvaluated() throws IOException, HttpErrorPage {
String page =
"begin <esi:choose>"
+ "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Beginner'\">expected cookie</esi:when>"
+ "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Beginner'\">unexpected cookie</esi:when>"
+ "</esi:choose> end";
getRequestBuilder().addCookie(new BasicClientCookie("group", "Beginner"));
String result = render(page);
assertEquals("begin expected cookie end", result);
}
public void testMultipleWhenOtherwise1() throws IOException, HttpErrorPage {
String page =
"begin <esi:choose>"
+ "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Advanced'\">expected cookie</esi:when>"
+ "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Beginner'\">unexpected cookie</esi:when>"
+ "<esi:otherwise>inside otherwise</esi:otherwise>" + "</esi:choose> end";
getRequestBuilder().addCookie(new BasicClientCookie("group", "Intermediate"));
String result = render(page);
assertEquals("begin inside otherwise end", result);
}
public void testMultipleWhenOtherwise2() throws IOException, HttpErrorPage {
String page =
"begin <esi:choose>" + "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Advanced'\">"
+ "<esi:vars>expected cookie '$(HTTP_COOKIE{group})'</esi:vars>" + "</esi:when>"
+ "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Beginner'\">"
+ "<esi:vars>unexpected cookie '$(HTTP_COOKIE{group})'</esi:vars>" + "</esi:when>"
+ "<esi:otherwise>inside otherwise</esi:otherwise>" + "</esi:choose> end";
getRequestBuilder().addCookie(new BasicClientCookie("group", "Advanced"));
String result = render(page);
assertEquals("begin expected cookie 'Advanced' end", result);
}
public void testOtherwise() throws IOException, HttpErrorPage {
String page =
"begin <esi:choose>" + "<esi:when test=\"'$(HTTP_COOKIE{group})'=='Beginner'\">inside when</esi:when>"
+ "<esi:otherwise>"
+ "<esi:vars>inside otherwise with '$(HTTP_COOKIE{group})' cookie</esi:vars>"
+ "</esi:otherwise>" + "</esi:choose> end";
getRequestBuilder().addCookie(new BasicClientCookie("group", "Advanced"));
String result = render(page);
assertEquals("begin inside otherwise with 'Advanced' cookie end", result);
}
/**
* Checks that includes inside a <when> block are evaluated only if needed.
*
* @throws Exception
* if anything goes wrong
*/
public void testWhenWithIncludeOnlyEvaluatedWhenRequired() throws Exception {
String page =
"<esi:choose>\r\n" + " <esi:when test=\"'$(HTTP_COOKIE{username})' != ''\">\r\n"
+ " <esi:include src=\"/esi/include/a\" />\r\n" + " </esi:when>\r\n"
+ " <esi:otherwise>\r\n" + " <esi:include src=\"/esi/include/b\" />\r\n"
+ " </esi:otherwise>\r\n" + "</esi:choose>";
addResource("/esi/include/b", "anonymous");
String result = render(page);
assertEquals("anonymous", result.trim());
getRequestBuilder().addCookie(new BasicClientCookie("username", "someUser"));
addResource("/esi/include/a", "logged in");
result = render(page);
assertEquals("logged in", result.trim());
}
/**
* Checks that includes inside a <otherwise> block are evaluated only if needed.
*
* @throws Exception
* if anything goes wrong
*/
public void testOtherwiseWithIncludeOnlyEvaluatedWhenRequired() throws Exception {
String page =
"<esi:choose>\r\n" + " <esi:when test=\"'$(HTTP_COOKIE{username})' != ''\">\r\n"
+ " <esi:include src=\"/esi/include/a\" />\r\n" + " </esi:when>\r\n"
+ " <esi:otherwise>\r\n" + " <esi:include src=\"/esi/include/b\" />\r\n"
+ " </esi:otherwise>\r\n" + "</esi:choose>";
addResource("/esi/include/a", "logged in");
getRequestBuilder().addCookie(new BasicClientCookie("username", "someUser"));
String result = render(page);
assertEquals("logged in", result.trim());
}
/**
* @see <a href="https://github.com/esigate/esigate/issues/152">NullPointerException on Nested Choose/when/otherwise
* tags #152</a>
* @throws Exception
*/
public void testNestedChoose() throws Exception {
String page =
"<esi:choose>\n" + "<esi:when test=\"$exists($(HTTP_COOKIE{'FIRST_COOKIE'}))\">\n" + "<esi:choose>\n"
+ "<esi:when test=\"$exists($(HTTP_COOKIE{'SECOND_COOKIE'}))\">\n" + "HAS SECOND COOKIE\n"
+ "</esi:when>\n" + "<esi:otherwise>\n" + "NO SECOND COOKIE\n" + "</esi:otherwise>\n"
+ "</esi:choose>\n" + "</esi:when>\n" + "<esi:otherwise>\n" + "NO FIRST COOKIE\n"
+ "</esi:otherwise>\n" + "</esi:choose>";
String result = render(page);
assertEquals("NO FIRST COOKIE", result.trim());
getRequestBuilder().addCookie(new BasicClientCookie("FIRST_COOKIE", "value"));
result = render(page);
assertEquals("NO SECOND COOKIE", result.trim());
getRequestBuilder().addCookie(new BasicClientCookie("SECOND_COOKIE", "value"));
result = render(page);
assertEquals("HAS SECOND COOKIE", result.trim());
}
}