/* * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.seam.wiki.test.editing; import org.dbunit.operation.DatabaseOperation; import org.jboss.seam.wiki.core.action.DocumentHome; import org.jboss.seam.wiki.core.wikitext.engine.WikiLink; import org.jboss.seam.wiki.core.wikitext.engine.WikiLinkResolver; import org.jboss.seam.wiki.core.wikitext.renderer.WikiTextRenderer; import org.jboss.seam.wiki.core.model.WikiDocument; import org.jboss.seam.wiki.core.model.WikiUpload; import org.jboss.seam.mock.DBUnitSeamTest; import org.jboss.seam.wiki.util.WikiUtil; import org.testng.annotations.Test; import javax.persistence.EntityManager; import java.util.HashMap; import java.util.HashSet; import java.util.Map; public class Linking extends DBUnitSeamTest { protected void prepareDBUnitOperations() { beforeTestOperations.add( new DataSetOperation("org/jboss/seam/wiki/test/WikiBaseData.dbunit.xml", DatabaseOperation.CLEAN_INSERT) ); beforeTestOperations.add( new DataSetOperation("org/jboss/seam/wiki/test/UploadData.dbunit.xml", DatabaseOperation.INSERT) ); beforeTestOperations.add( new DataSetOperation("org/jboss/seam/wiki/test/HelpDocuments.dbunit.xml", DatabaseOperation.INSERT) ); } @Test public void linkToKnownProtocols() throws Exception { final String conversationId = new NonFacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("documentId", "6"); } }.run(); new FacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("cid", conversationId); } protected void invokeApplication() throws Exception { DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class); assert docHome.getInstance().getId().equals(6l); // Init! docHome.getTextEditor().setValue("[=>http://foo.bar]"); docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance()); assert docHome.getInstance().getContent().equals("[=>http://foo.bar]"); docHome.getTextEditor().setValue("[=>https://foo.bar]"); docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance()); assert docHome.getInstance().getContent().equals("[=>https://foo.bar]"); docHome.getTextEditor().setValue("[=>ftp://foo.bar]"); docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance()); assert docHome.getInstance().getContent().equals("[=>ftp://foo.bar]"); docHome.getTextEditor().setValue("[=>mailto:foo@bar.tld]"); docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance()); assert docHome.getInstance().getContent().equals("[=>mailto:foo@bar.tld]"); docHome.getTextEditor().setValue("[Foo Bar=>http://foo.bar]"); docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance()); assert docHome.getInstance().getContent().equals("[Foo Bar=>http://foo.bar]"); docHome.getTextEditor().setValue("[Foo Bar=>https://foo.bar]"); docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance()); assert docHome.getInstance().getContent().equals("[Foo Bar=>https://foo.bar]"); docHome.getTextEditor().setValue("[Foo Bar=>ftp://foo.bar]"); docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance()); assert docHome.getInstance().getContent().equals("[Foo Bar=>ftp://foo.bar]"); docHome.getTextEditor().setValue("[Foo Bar=>mailto:foo@bar.tld]"); docHome.syncEditorToInstance(docHome.getParentNode().getId(), docHome.getInstance()); assert docHome.getInstance().getContent().equals("[Foo Bar=>mailto:foo@bar.tld]"); } }.run(); } @Test public void linkToCustomProtocols() throws Exception { final String conversationId = new NonFacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("documentId", "6"); } }.run(); new FacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("cid", conversationId); } protected void invokeApplication() throws Exception { DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class); assert docHome.getInstance().getId().equals(6l); // Init! WikiLinkResolver resolver = (WikiLinkResolver)getInstance("wikiLinkResolver"); Map<String, WikiLink> links = new HashMap<String, WikiLink>(); docHome.getTextEditor().setValue("[=>hhh://1234]"); resolver.resolveLinkText(3l, links, "hhh://1234"); assert links.size()==1; assert links.get("hhh://1234").getUrl().equals("http://opensource.atlassian.com/projects/hibernate/browse/HHH-1234"); } }.run(); } @Test public void linkToDocuments() throws Exception { final String conversationId = new NonFacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("documentId", "6"); } }.run(); new FacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("cid", conversationId); } protected void invokeApplication() throws Exception { DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class); assert docHome.getInstance().getId().equals(6l); // Init! WikiLinkResolver resolver = (WikiLinkResolver)getInstance("wikiLinkResolver"); checkLink(resolver, 7l, "[=>Two]", "[=>wiki://7]"); checkLink(resolver, 7l, "[Foo Bar=>Two]", "[Foo Bar=>wiki://7]"); checkLink(resolver, 9l, "[=>BBB|Four]", "[=>wiki://9]"); checkLink(resolver, 9l, "[Foo Bar=>BBB|Four]", "[Foo Bar=>wiki://9]"); checkLink(resolver, null, "[=>Four]", "[=>Four]"); // Broken link checkLink(resolver, null, "[Foo Bar=>Four]", "[Foo Bar=>Four]"); // Broken link } }.run(); } @Test public void linkToDocumentFragments() throws Exception { final String conversationId = new NonFacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("documentId", "6"); } }.run(); new FacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("cid", conversationId); } protected void invokeApplication() throws Exception { DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class); assert docHome.getInstance().getId().equals(6l); // Init! WikiLinkResolver resolver = (WikiLinkResolver)getInstance("wikiLinkResolver"); final String FRAGMENT = "#foo123.,; baz -?!()/&"; checkLink(resolver, 7l, "[=>Two"+FRAGMENT+"]", "[=>wiki://7"+FRAGMENT+"]", FRAGMENT); checkLink(resolver, 9l, "[=>BBB|Four"+FRAGMENT+"]", "[=>wiki://9"+FRAGMENT+"]", FRAGMENT); } }.run(); } @Test public void linkToUploads() throws Exception { final String conversationId = new NonFacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("documentId", "6"); } }.run(); new FacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("cid", conversationId); } protected void invokeApplication() throws Exception { DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class); assert docHome.getInstance().getId().equals(6l); // Init! WikiLinkResolver resolver = (WikiLinkResolver)getInstance("wikiLinkResolver"); checkLink(resolver, 30l, "[=>BBB|Test Image]", "[=>wiki://30]"); } }.run(); } @Test public void linkSourceTargetTracking() throws Exception { final String conversationId = new NonFacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("documentId", "6"); } }.run(); new FacesRequest("/docEdit_d.xhtml") { protected void beforeRequest() { setParameter("cid", conversationId); } protected void invokeApplication() throws Exception { DocumentHome docHome = (DocumentHome)getInstance(DocumentHome.class); assert docHome.getInstance().getId().equals(6l); // Init! assert docHome.getInstance().getOutgoingLinks().size() == 0; docHome.getTextEditor().setValue("[=>Two] and [=>Three] and [=>BBB|Test Image]"); assert invokeMethod("#{documentHome.update}").equals("updated"); assert docHome.getInstance().getContent().equals("[=>wiki://7] and [=>wiki://8] and [=>wiki://30]"); assert docHome.getInstance().getOutgoingLinks().size() == 3; } }.run(); new FacesRequest() { protected void invokeApplication() throws Exception { EntityManager em = (EntityManager) getInstance("restrictedEntityManager"); WikiDocument d = (WikiDocument) em.createQuery("select d from WikiDocument d left join fetch d.incomingLinks where d.id = :id") .setParameter("id", 7l) .getSingleResult(); assert d.getIncomingLinks().size() == 1; em.clear(); d = (WikiDocument) em.createQuery("select d from WikiDocument d left join fetch d.incomingLinks where d.id = :id") .setParameter("id", 8l) .getSingleResult(); assert d.getIncomingLinks().size() == 2; em.clear(); WikiUpload f = (WikiUpload) em.createQuery("select f from WikiUpload f left join fetch f.incomingLinks where f.id = :id") .setParameter("id", 30l) .getSingleResult(); assert f.getIncomingLinks().size() == 1; } }.run(); } private void checkLink(WikiLinkResolver resolver, Long fileId, String wikiText, String databaseText) { checkLink(resolver, fileId, wikiText, databaseText, null); } private void checkLink(WikiLinkResolver resolver, Long fileId, String wikiText, String databaseText, String fragment) { assert resolver.convertToWikiProtocol(new HashSet(), 3l, wikiText).equals(databaseText); assert resolver.convertFromWikiProtocol(3l, databaseText).equals(wikiText); Map<String, WikiLink> links = new HashMap<String, WikiLink>(); resolver.resolveLinkText(3l, links, databaseText); assert links.size()==1; if (fileId == null) { assert links.get(databaseText).isBroken(); } else { assert links.get(databaseText).getFile().getId().equals(fileId); if (fragment != null) { assert links.get(databaseText).getFragment().equals(fragment); assert links.get(databaseText).getEncodedFragment().equals( WikiTextRenderer.HEADLINE_ID_PREFIX+WikiUtil.convertToWikiName(fragment) ); } } } }