Package org.structr.web.entity.dom

Source Code of org.structr.web.entity.dom.PageTest

/**
* Copyright (C) 2010-2014 Morgner UG (haftungsbeschränkt)
*
* This file is part of Structr <http://structr.org>.
*
* Structr is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Structr is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Structr.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.structr.web.entity.dom;

import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;
import static junit.framework.TestCase.fail;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.structr.common.error.FrameworkException;
import org.structr.core.graph.Tx;
import org.structr.web.common.StructrUiTest;
import org.w3c.dom.DOMException;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
*
* @author Christian Morgner
*/
public class PageTest extends StructrUiTest {

  public void testGetElementsByTagName() {

    final String pageName = "page-01";
    try {
      try (final Tx tx = app.tx()) {

        Page page = Page.createNewPage(securityContext, pageName);

        assertTrue(page != null);
        assertTrue(page instanceof Page);

        DOMNode html = (DOMNode) page.createElement("html");
        DOMNode head = (DOMNode) page.createElement("head");
        DOMNode body = (DOMNode) page.createElement("body");
        DOMNode title = (DOMNode) page.createElement("title");
        DOMNode h1 = (DOMNode) page.createElement("h1");
        DOMNode div1 = (DOMNode) page.createElement("div");
        DOMNode p1 = (DOMNode) page.createElement("p");
        DOMNode div2 = (DOMNode) page.createElement("div");
        DOMNode p2 = (DOMNode) page.createElement("p");
        DOMNode div3 = (DOMNode) page.createElement("div");
        DOMNode p3 = (DOMNode) page.createElement("p");

        // add HTML element to page
        page.appendChild(html);

        // add HEAD and BODY elements to HTML
        html.appendChild(head);
        html.appendChild(body);

        // add TITLE element to HEAD
        head.appendChild(title);

        // add H1 element to BODY
        body.appendChild(h1);

        // add DIV element 1 to BODY
        body.appendChild(div1);
        div1.appendChild(p1);

        // add DIV element 2 to DIV
        div1.appendChild(div2);
        div2.appendChild(p2);

        // add DIV element 3 to DIV
        div2.appendChild(div3);
        div3.appendChild(p3);

        NodeList divs = page.getElementsByTagName("p");
        assertEquals(p1, divs.item(0));
        assertEquals(p2, divs.item(1));
        assertEquals(p3, divs.item(2));

        tx.success();

      } catch (Exception ex) {

        throw new FrameworkException(422, ex.getMessage());

      }

    } catch (FrameworkException ex) {

      fail("Unexpected exception");

    }

  }

  public void testAdoptNodes() {

    try {
      try (final Tx tx = app.tx()) {

        Page srcPage = Page.createNewPage(securityContext, "srcPage");

        assertTrue(srcPage != null);
        assertTrue(srcPage instanceof Page);

        Node html = srcPage.createElement("html");
        Node head = srcPage.createElement("head");
        Node body = srcPage.createElement("body");
        Node title = srcPage.createElement("title");
        Node h1 = srcPage.createElement("h1");
        Node div = srcPage.createElement("div");
        Node p = srcPage.createElement("p");

        // add HTML element to page
        srcPage.appendChild(html);

        // add HEAD and BODY elements to HTML
        html.appendChild(head);
        html.appendChild(body);

        // add TITLE element to HEAD
        head.appendChild(title);

        // add H1 element to BODY
        body.appendChild(h1);

        // add DIV element to BODY
        body.appendChild(div);
        div.appendChild(p);

        // add text element to P
        p.appendChild(srcPage.createTextNode("First Paragraph"));

        Page dstPage = Page.createNewPage(securityContext, "dstPage");
        assertNotNull(dstPage);

        // test adopt method
        dstPage.adoptNode(html);

        // has parent been removed for the source element?
        assertNull(html.getParentNode());

        // has owner changed for all elements?
        assertEquals(dstPage, html.getOwnerDocument());
        assertEquals(dstPage, head.getOwnerDocument());
        assertEquals(dstPage, body.getOwnerDocument());
        assertEquals(dstPage, title.getOwnerDocument());
        assertEquals(dstPage, h1.getOwnerDocument());
        assertEquals(dstPage, div.getOwnerDocument());
        assertEquals(dstPage, p.getOwnerDocument());

        // have parents been kept for all other elements?
        assertEquals(html, head.getParentNode());
        assertEquals(html, body.getParentNode());
        assertEquals(head, title.getParentNode());
        assertEquals(body, h1.getParentNode());
        assertEquals(body, div.getParentNode());
        assertEquals(div, p.getParentNode());

        // srcPage should not have a document element any more
        assertNull(srcPage.getDocumentElement());

        // srcPage should have exactly one child element
        assertEquals(1, srcPage.getChildNodes().getLength());

        tx.success();

      } catch (DOMException dex) {

        throw new FrameworkException(422, dex.getMessage());
      }

    } catch (FrameworkException ex) {

      fail("Unexpected exception");
    }
  }

  public void testImportNodesDeep() {

    try (final Tx tx = app.tx()) {

      Page srcPage = Page.createNewPage(securityContext, "srcPage");

      assertTrue(srcPage != null);
      assertTrue(srcPage instanceof Page);

      Node html = srcPage.createElement("html");
      Node head = srcPage.createElement("head");
      Node body = srcPage.createElement("body");
      Node title = srcPage.createElement("title");
      Node h1 = srcPage.createElement("h1");
      Node div = srcPage.createElement("div");
      Node p = srcPage.createElement("p");

      // add HTML element to page
      srcPage.appendChild(html);

      // add HEAD and BODY elements to HTML
      html.appendChild(head);
      html.appendChild(body);

      // add TITLE element to HEAD
      head.appendChild(title);

      // add H1 element to BODY
      body.appendChild(h1);

      // add DIV element to BODY
      body.appendChild(div);
      div.appendChild(p);

      // add text element to P
      p.appendChild(srcPage.createTextNode("First Paragraph"));

      Page dstPage = Page.createNewPage(securityContext, "dstPage");
      assertNotNull(dstPage);
     
      // test
      assertEquals(srcPage, html.getOwnerDocument());

      makePublic(srcPage, dstPage, html, head, body, title, h1, div, p);

      // test import method
      dstPage.importNode(html, true);

      // has parent been removed for the source element?
      assertNull(html.getParentNode());

      // same owner for all elements?
      assertEquals(srcPage, html.getOwnerDocument());
      assertEquals(srcPage, head.getOwnerDocument());
      assertEquals(srcPage, body.getOwnerDocument());
      assertEquals(srcPage, title.getOwnerDocument());
      assertEquals(srcPage, h1.getOwnerDocument());
      assertEquals(srcPage, div.getOwnerDocument());
      assertEquals(srcPage, p.getOwnerDocument());

      // have parents been kept for all other elements?
      assertEquals(html, head.getParentNode());
      assertEquals(html, body.getParentNode());
      assertEquals(head, title.getParentNode());
      assertEquals(body, h1.getParentNode());
      assertEquals(body, div.getParentNode());
      assertEquals(div, p.getParentNode());
     
      tx.success();

    } catch (Exception ex) {
      ex.printStackTrace();
      fail("Unexpected exception");
    }

    try (final Tx tx = app.tx()) {
   
      Document srcDoc = Jsoup.connect(baseUri + "srcPage").get();
      Document dstDoc = Jsoup.connect(baseUri + "dstPage").get();

      // pages should render exactly identical
      assertEquals(srcDoc.outerHtml(), dstDoc.outerHtml());

      tx.success();

    } catch (Exception ex) {
      ex.printStackTrace();
      fail("Unexpected exception");
    }
  }

  public void testCloneNode() {

    try {
      try (final Tx tx = app.tx()) {

        Page page = Page.createNewPage(securityContext, "srcPage");

        assertTrue(page != null);
        assertTrue(page instanceof Page);
        Node html = page.createElement("html");
        Node head = page.createElement("head");
        Node body = page.createElement("body");
        Node title = page.createElement("title");
        Node h1 = page.createElement("h1");
        Node div = page.createElement("div");
        Node p = page.createElement("p");
        try {
          // add HTML element to page
          page.appendChild(html);

          // add HEAD and BODY elements to HTML
          html.appendChild(head);
          html.appendChild(body);

          // add TITLE element to HEAD
          head.appendChild(title);

          // add H1 element to BODY
          body.appendChild(h1);

          // add DIV element to BODY
          body.appendChild(div);
          div.appendChild(p);

          // add text element to P
          p.appendChild(page.createTextNode("First Paragraph"));

          Node clone = body.cloneNode(false);

          assertTrue(isClone(clone, body));

          tx.success();

        } catch (DOMException dex) {

          throw new FrameworkException(422, dex.getMessage());
        }

      }

    } catch (FrameworkException ex) {

      fail("Unexpected exception");
    }

  }

  private boolean isClone(final Node n1, final Node n2) {

    boolean isClone = true;

    isClone &= StringUtils.equals(n1.getNodeName(), n2.getNodeName());
    isClone &= n1.getNodeType() == n2.getNodeType();
    isClone &= StringUtils.equals(n1.getNodeValue(), n2.getNodeValue());

    NamedNodeMap attrs1 = n1.getAttributes();
    NamedNodeMap attrs2 = n2.getAttributes();

    for (int i = 0; i < attrs1.getLength(); i++) {

      Node a1 = attrs1.item(i);
      isClone &= isClone(a1, attrs2.item(i));

    }

    return isClone;
  }

}
TOP

Related Classes of org.structr.web.entity.dom.PageTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.