/* * 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.util.tester; import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import java.util.List; import org.junit.Assert; import org.junit.Test; /** * Test of TagTester */ public class TagTesterTest extends Assert { /** Mock markup 1 */ private static final String MARKUP_1 = "<p id=\"test\" class=\"class1\"><span class=\"class2\" id=\"test2\">mock</span></p>"; private static final String AJAX_MARKUP_1 = "<?xml version='1.0' encoding='UTF-8'?>" + "<ajax-response><component id='comp1'><![CDATA[<div class='cls' id='compId'></div>]]></component></ajax-response>"; // WICKET-5874 private static final String NON_CLOSED_INPUT = "<p wicket:id=\"p\"><input wicket:id=\"wicketId\" type=\"text\"></p>"; /** * WICKET-6278 */ @Test public void tagNoRequiredClose() { TagTester tester = TagTester.createTagByAttribute(NON_CLOSED_INPUT, "wicket:id", "p"); assertEquals("<input wicket:id=\"wicketId\" type=\"text\">", tester.getValue()); } /** * https://issues.apache.org/jira/browse/WICKET-5874 */ @Test public void getTagTesterForNonClosedTag() { TagTester tester = TagTester.createTagByAttribute(NON_CLOSED_INPUT, "wicket:id", "wicketId"); assertThat(tester, is(notNullValue())); String type = tester.getAttribute("type"); assertThat(type, is(equalTo("text"))); assertThat(tester.getValue(), is(nullValue())); } /** * https://issues.apache.org/jira/browse/WICKET-6172 */ @Test public void getTagTestersForNonClosedTag() { List<TagTester> testers = TagTester.createTagsByAttribute(NON_CLOSED_INPUT, "wicket:id", "wicketId", false); assertThat(testers, is(notNullValue())); assertThat(testers.size(), is(1)); String type = testers.get(0).getAttribute("type"); assertThat(type, is(equalTo("text"))); assertThat(testers.get(0).getValue(), is(nullValue())); } /** * https://issues.apache.org/jira/browse/WICKET-5137 */ @Test public void getTagInAjaxResponse() { TagTester tester = TagTester.createTagByAttribute(AJAX_MARKUP_1, "id", "compId"); assertNotNull(tester); String cls = tester.getAttribute("class"); assertEquals("cls", cls); } /** * Test the static factory method */ @Test public void createTagByAttribute() { TagTester tester = TagTester.createTagByAttribute(null, null, null); assertNull(tester); tester = TagTester.createTagByAttribute("<p id=\"test\">mock</p>", null, null); assertNull(tester); tester = TagTester.createTagByAttribute("<p id=\"test\">mock</p>", "id", null); assertNull(tester); tester = TagTester.createTagByAttribute("<p id=\"test\">mock</p>", "id", "test"); assertNotNull(tester); } /** * Test that getName returns the correct tag name. */ @Test public void getName() { TagTester tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertNotNull(tester); assertEquals("p", tester.getName()); tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test2"); assertNotNull(tester); assertEquals("span", tester.getName()); } /** * Test that hasAttribute return true if the tag has the given attribute. * * It also tests that the order of the attributes doesn't matter. */ @Test public void hasAttribute() { TagTester tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertNotNull(tester); assertTrue(tester.hasAttribute("class")); tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test2"); assertNotNull(tester); assertTrue(tester.hasAttribute("class")); } /** * Get attribute should return the value of the attribute. * * If the attribute doesn't exist on the tag, the method should return null. */ @Test public void getAttribute() { TagTester tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertNotNull(tester); assertEquals("class1", tester.getAttribute("class")); // Nested tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test2"); assertNotNull(tester); assertEquals("class2", tester.getAttribute("class")); // Case insensitive tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test2"); assertNotNull(tester); assertEquals("class2", tester.getAttribute("CLASS")); // Return null if no attribute tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertNotNull(tester); assertNull(tester.getAttribute("noattribute")); // Test that an empty attribute is returned as an empty string tester = TagTester.createTagByAttribute("<p id=\"test\" empty=\"\">Mock</p>", "id", "test"); assertNotNull(tester); assertEquals("", tester.getAttribute("empty")); } /** * getAttributeContains should only return true if the attribute value contains the expected * value. It should not be case in-sensitive and not trim the attribute value. */ @Test public void getAttributeContains() { TagTester tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertNotNull(tester); assertTrue(tester.getAttributeContains("class", "ss1")); assertTrue(tester.getAttributeContains("class", "clas")); assertTrue(tester.getAttributeContains("class", "s")); assertTrue(tester.getAttributeContains("class", "1")); assertTrue(tester.getAttributeContains("CLASS", "1")); assertFalse(tester.getAttributeContains("class", "classs")); assertFalse(tester.getAttributeContains("class", "CLASS")); assertFalse(tester.getAttributeContains("class", "cLass1")); assertFalse(tester.getAttributeContains("class", "class1 ")); assertFalse(tester.getAttributeContains("class", " class1")); } /** * Test the convenience method getAttributeIs, which returns true if the attributes value is * exactly the same as the parameter. */ @Test public void getAttributeIs() { TagTester tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertNotNull(tester); assertTrue(tester.getAttributeIs("class", "class1")); assertFalse(tester.getAttributeIs("class", "class1 ")); assertFalse(tester.getAttributeIs("class", " class1")); assertFalse(tester.getAttributeIs("class", "Class1")); assertTrue(tester.getAttributeIs("noattribute", null)); assertFalse(tester.getAttributeIs("noattribute", "somevalue")); assertFalse(tester.getAttributeIs("class", null)); } /** * getAttributeEndsWith behaves the same as getAttributeContains, but the parameter which should * be contained must only be at the end. */ @Test public void getAttributeEndsWith() { TagTester tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertNotNull(tester); assertTrue(tester.getAttributeEndsWith("class", "1")); assertTrue(tester.getAttributeEndsWith("class", "")); assertTrue(tester.getAttributeEndsWith("class", "ss1")); assertTrue(tester.getAttributeEndsWith("class", "lass1")); assertFalse(tester.getAttributeEndsWith("class", "1 ")); assertFalse(tester.getAttributeEndsWith("class", " ")); assertFalse(tester.getAttributeEndsWith("class", "class 1")); assertFalse(tester.getAttributeEndsWith("class", "SS1")); } /** * */ @Test public void hasChildTag() { TagTester tester = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertTrue(tester.hasChildTag("span")); assertTrue(tester.hasChildTag("SPAN")); assertFalse(tester.hasChildTag("span ")); assertFalse(tester.hasChildTag("p")); try { tester.hasChildTag(""); fail(); } catch (IllegalArgumentException e) { // expected } catch (Exception e) { fail(e.getMessage()); } try { tester.hasChildTag(null); fail(); } catch (IllegalArgumentException e) { // expected } catch (Exception e) { fail(e.getMessage()); } tester = TagTester.createTagByAttribute("<p id=\"test\">mock</p>", "id", "test"); assertFalse(tester.hasChildTag("span")); assertFalse(tester.hasChildTag("p")); } @Test public void getChildByTagName() { TagTester tester = TagTester.createTagByAttribute( "<div id=\"id\">" + "<div class=\"radio\">" + "<label>" + "<input name=\"id\" type=\"radio\" value=\"0\" id=\"id1-0\"/> One" + "</label>" + "</div>" + "</div>", "id", "id"); assertThat(tester.getChild("DIV"), is(notNullValue())); // case-insensitive TagTester divClassRadioTagTester = tester.getChild("div"); assertThat(divClassRadioTagTester, is(notNullValue())); TagTester labelTagTester = divClassRadioTagTester.getChild("label"); String labelMarkup = labelTagTester.getValue(); assertThat(labelMarkup, endsWith(" One")); } /** * Test getMarkup returns the open-tag + content + close-tag */ @Test public void getMarkup() { TagTester tagTester = TagTester.createTagByAttribute(MARKUP_1, "id", "test2"); assertEquals("<span class=\"class2\" id=\"test2\">mock</span>", tagTester.getMarkup()); } /** * Test getValue returns the data between the open and close tag. */ @Test public void getValue() { TagTester tagTester = TagTester.createTagByAttribute(MARKUP_1, "id", "test2"); assertEquals("mock", tagTester.getValue()); // Check that getValue also returns tags if the content of a tag is containing tags TagTester tagTester2 = TagTester.createTagByAttribute(MARKUP_1, "id", "test"); assertEquals(tagTester.getMarkup(), tagTester2.getValue()); } /** * https://issues.apache.org/jira/browse/WICKET-6173 */ @Test public void valueFromTagsByAttribute() { TagTester tagTester = TagTester.createTagByAttribute(MARKUP_1, "id", "test2"); assertEquals("mock", tagTester.getValue()); } private static final String MARKUP = "<wicket:panel>" + "<ul wicket:id=\"container\">" + "<wicket:container wicket:id=\"items\">" + "<li wicket:id=\"item\" id=\"item1\">" + "<p wicket:id=\"p\" id=\"p1\">" + "<img wicket:id=\"img\" src=\"bild1.jpg\">" + "</p>" + "<hr wicket:id=\"hr\" id=\"hr1\"/>" + "</li>" + "<li wicket:id=\"item\" id=\"item2\">" + "<p wicket:id=\"p\" id=\"p2\">" + "<img wicket:id=\"img\" src=\"bild2.jpg\">" + "<hr wicket:id=\"hr\" id=\"hr2\"/>" + "</li>" + "</wicket:container>" + "</ul>" + "</wicket:panel>"; private static final String WRONG_MARKUP = "<wicket:panel>" + "<ul wicket:id=\"container\">" + "<wicket:container wicket:id=\"items\">" + "<li wicket:id=\"item\" id=\"item1\">" + "<span wicket:id=\"p\" id=\"p1\">" + "<img wicket:id=\"img\" src=\"bild1.jpg\">" + "<hr wicket:id=\"hr\" id=\"hr1\"/>" + "</li>" + "<li wicket:id=\"item\" id=\"item2\">" + "<span wicket:id=\"p\" id=\"p2\">" + "<img wicket:id=\"img\" src=\"bild2.jpg\">" + "<hr wicket:id=\"hr\" id=\"hr2\"/>" + "</span>" + "</li>" + "</wicket:container>" + "</ul>" + "</wicket:panel>"; /** * WICKET-6220 */ @Test public void testOpenAndClose() { List<TagTester> tags = TagTester.createTagsByAttribute(MARKUP, "wicket:id", "item", false); assertEquals(2, tags.size()); assertEquals("li", tags.get(0).getName()); assertEquals("item1", tags.get(0).getAttribute("id")); assertEquals("<p wicket:id=\"p\" id=\"p1\"><img wicket:id=\"img\" src=\"bild1.jpg\"></p><hr wicket:id=\"hr\" id=\"hr1\"/>", tags.get(0).getValue()); assertEquals("li", tags.get(1).getName()); assertEquals("item2", tags.get(1).getAttribute("id")); assertEquals("<p wicket:id=\"p\" id=\"p2\"><img wicket:id=\"img\" src=\"bild2.jpg\"><hr wicket:id=\"hr\" id=\"hr2\"/>", tags.get(1).getValue()); } /** * WICKET-6220 */ @Test public void testWrongHtmlStructure() { List<TagTester> tags = TagTester.createTagsByAttribute(WRONG_MARKUP, "wicket:id", "p", false); assertEquals(1, tags.size()); assertEquals("span", tags.get(0).getName()); assertEquals("p2", tags.get(0).getAttribute("id")); assertEquals("<img wicket:id=\"img\" src=\"bild2.jpg\"><hr wicket:id=\"hr\" id=\"hr2\"/>", tags.get(0).getValue()); } /** * WICKET-6220 */ @Test public void testOpenOrClose() { List<TagTester> tags = TagTester.createTagsByAttribute(MARKUP, "wicket:id", "p", false); assertEquals(2, tags.size()); assertEquals("p", tags.get(0).getName()); assertEquals("p1", tags.get(0).getAttribute("id")); assertEquals("<img wicket:id=\"img\" src=\"bild1.jpg\">", tags.get(0).getValue()); assertEquals("p", tags.get(1).getName()); assertEquals("p2", tags.get(1).getAttribute("id")); assertEquals("<p wicket:id=\"p\" id=\"p2\">", tags.get(1).getMarkup()); } /** * WICKET-6220 */ @Test public void testOpen() { List<TagTester> tags = TagTester.createTagsByAttribute(MARKUP, "wicket:id", "img", false); assertEquals(2, tags.size()); assertEquals("img", tags.get(0).getName()); assertEquals("bild1.jpg", tags.get(0).getAttribute("src")); assertEquals("<img wicket:id=\"img\" src=\"bild1.jpg\">", tags.get(0).getMarkup()); assertEquals("img", tags.get(1).getName()); assertEquals("bild2.jpg", tags.get(1).getAttribute("src")); assertEquals("<img wicket:id=\"img\" src=\"bild2.jpg\">", tags.get(1).getMarkup()); } /** * WICKET-6220 */ @Test public void testOpenClose() { List<TagTester> tags = TagTester.createTagsByAttribute(MARKUP, "wicket:id", "hr", false); assertEquals(2, tags.size()); assertEquals("hr", tags.get(0).getName()); assertEquals("hr1", tags.get(0).getAttribute("id")); assertEquals("<hr wicket:id=\"hr\" id=\"hr1\"/>", tags.get(0).getMarkup()); assertEquals("hr", tags.get(1).getName()); assertEquals("hr2", tags.get(1).getAttribute("id")); assertEquals("<hr wicket:id=\"hr\" id=\"hr2\"/>", tags.get(1).getMarkup()); } }