/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.wicket.markup.html.internal.headeritems;
import static org.hamcrest.number.OrderingComparison.lessThan;
import org.apache.wicket.markup.MarkupException;
import org.apache.wicket.util.tester.WicketTestCase;
import org.apache.wicket.Page;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.tester.DummyPanelPage;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Test;
/**
* Tests for <wicket:header-items/> element
*/
public class HtmlHeaderItemsContainerTest extends WicketTestCase
{
@Test
public void withHeaderItems()
{
tester.startPage(PageWithHeaderItems.class);
String responseAsString = tester.getLastResponseAsString();
int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
assertThat("<meta charset> should be rendered before <meta name=\"panel-wicket-head\"",
idxMetaCharset, lessThan(idxMetaPanelWicketHead));
assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
assertThat("<script src=wicket-ajax-jquery.js> should be rendered before the <title> element",
idxWicketAjaxJs, lessThan(idxTitleElement));
assertThat("<meta name='fromBasePage'> should be rendered before the <title> element",
idxMetaFromBasePage, lessThan(idxTitleElement));
}
@Test
public void withoutHeaderItems()
{
tester.startPage(PageWithoutHeaderItems.class);
String responseAsString = tester.getLastResponseAsString();
int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
assertThat("<script src=wicket-ajax-jquery.js> should be rendered before <meta charset>",
idxWicketAjaxJs, lessThan(idxMetaCharset));
assertThat("<meta charset> should be rendered before the <title> element",
idxMetaCharset, lessThan(idxTitleElement));
assertThat("<title> should be rendered before the <meta name='fromBasePage'> element",
idxTitleElement, lessThan(idxMetaFromBasePage));
}
@Test
public void withoutHeaderItemsWithWicketHead()
{
tester.startPage(SubPageWithoutHeaderItemsAndWicketHead.class);
String responseAsString = tester.getLastResponseAsString();
int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithoutHeaderItemsAndWicketHead\"");
assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
assertThat("<script src=wicket-ajax-jquery.js> should be rendered before <meta charset>",
idxWicketAjaxJs, lessThan(idxMetaCharset));
assertThat("<meta charset> should be rendered before the <title> element",
idxMetaCharset, lessThan(idxTitleElement));
assertThat("<title> should be rendered before the <meta name=\"SubPageWithoutHeaderItemsAndWicketHead\" element",
idxTitleElement, lessThan(idxMetaFromSubPage));
assertThat("<meta name='fromBasePage'> should be rendered before the <meta name=\"SubPageWithoutHeaderItemsAndWicketHead\" element",
idxMetaFromSubPage, lessThan(idxMetaFromBasePage));
}
@Test
public void withHeaderItemsWithWicketHead()
{
tester.startPage(SubPageWithHeaderItemsAndWicketHead.class);
String responseAsString = tester.getLastResponseAsString();
int idxMetaCharset = responseAsString.indexOf("<meta charset=\"utf-8\"");
int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithHeaderItemsAndWicketHead\"");
assertThat("<meta charset> should be rendered before <meta name=\"panel-wicket-head\"",
idxMetaCharset, lessThan(idxMetaPanelWicketHead));
assertThat("<meta name=\"panel-wicket-head\"> should be rendered before <script src=wicket-ajax-jquery.js>",
idxMetaPanelWicketHead, lessThan(idxWicketAjaxJs));
assertThat("<script src=wicket-ajax-jquery.js> should be rendered before the <title> element",
idxWicketAjaxJs, lessThan(idxTitleElement));
assertThat("<meta name=\"SubPageWithoutHeaderItemsAndWicketHead\"> should be rendered before the <meta name='fromBasePage'> element",
idxMetaFromSubPage, lessThan(idxMetaFromBasePage));
assertThat("<meta name='fromBasePage'> should be rendered before the <title> element",
idxMetaFromBasePage, lessThan(idxTitleElement));
}
/**
* Only one <wicket:header-items/> is allowed only in <head>
* @see org.apache.wicket.markup.parser.filter.HtmlHeaderSectionHandler
*/
@Test(expected = MarkupException.class)
public void pageWithTwoHeaderItems()
{
tester.startPage(PageWithTwoHeaderItems.class);
}
/**
* <wicket:header-items/> is allowed only in <head>
* @see org.apache.wicket.markup.parser.filter.HtmlHeaderSectionHandler
*/
@Test(expected = MarkupException.class)
public void pageWithHeaderItemsOutOfHead()
{
tester.startPage(PageWithHeaderItemsOutOfHead.class);
}
/**
* Verifies that all header contributions from <wicket:head> containers
* and IHeaderResponse are rendered exactly once
*
* https://issues.apache.org/jira/browse/WICKET-5531
*/
@Test
public void withHeaderItemsWithWicketHeadNoDuplicates()
{
tester.startPage(SubPageWithHeaderItemsAndWicketHead.class);
String responseAsString = tester.getLastResponseAsString();
{
int idxMetaPanelWicketHead = responseAsString.indexOf("meta name=\"panel-wicket-head\"");
int lastIdxMetaPanelWicketHead = responseAsString.lastIndexOf("meta name=\"panel-wicket-head\"");
assertEquals(idxMetaPanelWicketHead, lastIdxMetaPanelWicketHead);
}
{
int idxWicketAjaxJs = responseAsString.indexOf("wicket-ajax-jquery.js");
int lastIdxWicketAjaxJs = responseAsString.lastIndexOf("wicket-ajax-jquery.js");
assertEquals(idxWicketAjaxJs, lastIdxWicketAjaxJs);
}
{
int idxTitleElement = responseAsString.indexOf("<title>Apache Wicket Quickstart</title>");
int lastIdxTitleElement = responseAsString.lastIndexOf("<title>Apache Wicket Quickstart</title>");
assertEquals(idxTitleElement, lastIdxTitleElement);
}
{
int idxMetaFromBasePage = responseAsString.indexOf("<meta name='fromBasePage' content='1'");
int lastIdxMetaFromBasePage = responseAsString.lastIndexOf("<meta name='fromBasePage' content='1'");
assertEquals(idxMetaFromBasePage, lastIdxMetaFromBasePage);
}
{
int idxMetaFromSubPage = responseAsString.indexOf("<meta name=\"SubPageWithHeaderItemsAndWicketHead\"");
int lastIdxMetaFromSubPage = responseAsString.lastIndexOf("<meta name=\"SubPageWithHeaderItemsAndWicketHead\"");
assertEquals(idxMetaFromSubPage, lastIdxMetaFromSubPage);
}
}
/**
* https://issues.apache.org/jira/browse/WICKET-5989
*/
@Test
public void pageWithBasePageWithHeaderItems() {
WicketTesterForBasePageWithHeaderItems tester = new WicketTesterForBasePageWithHeaderItems();
try
{
tester.startComponentInPage(new PanelA(DummyPanelPage.TEST_PANEL_ID));
}
finally
{
tester.destroy();
}
}
private static class WicketTesterForBasePageWithHeaderItems extends WicketTester
{
@Override
protected Page createPage() {
return new PageExtendingBasePageWithHeaderItems(new PageParameters());
}
@Override
protected String createPageMarkup(final String componentId) {
return new PageExtendingBasePageWithHeaderItems(new PageParameters()).getMarkup().toString(true);
}
}
}