Since XWiki 7.3M1 It's now possible to write unit tests for wiki pages on the filesystem (in XML format).
Since XWiki 10.5RC1 Tests extending PageTest must now be using JUnit5.

The way those tests work is that the XML file representing the wiki pages are loaded from the filesystem into XWikiDocument instances and a stubbed environment is defined so that XWikiDocument can then ben rendered in the desired syntax.

To write such a test:

  • Make your POM depend on the org.xwiki.platform:xwiki-platform-test-page module
  • Write a Java test class that extends PageTest
  • Possibly add some extra component registration that you need through existing annotations (*ComponentList annotations) or through the custom ComponentList annotation. Note that when extending PageTest this automatically brings some base components registration (the list defined in PageComponentList and ReferenceComponentList). Example of other existing annotations:
    • XWikiSyntax20ComponentList: XWiki Syntax 2.0-related components
    • XWikiSyntax21ComponentList: XWiki Syntax 2.1-related components
    • XHTML10ComponentList: XHTML 1.0-related components
  • You then verify the rendering of a page by setting the output syntax you wish to have, the query parameters and then call renderPage(). For example:
    setOutputSyntax(Syntax.XHTML_1_0);
    request.put("section", "Links");
    request.put("xpage", "print");
    ...
    String result = renderPage(new DocumentReference("xwiki", "XWiki", "XWikiSyntax"));
    assertTrue("...explanation if test fails", result.contains("...content that we wish to verify..."));
  • If you need to have some other pages loaded from sources too (for example if the page you're rendering contains an include macro that loads another page), you'll use the

    loadPage() API as in:loadPage(new DocumentReference("xwiki", "XWiki", "XWikiSyntaxLinks"));

Here's a full example:

@XWikiSyntax20ComponentList
@XHTML10ComponentList
public class WebRssTest extends PageTest
{
   private ScriptQuery query;

   @Before
   public void setUp() throws Exception
   {
        setOutputSyntax(Syntax.PLAIN_1_0);
        request.put("outputSyntax", "plain");
        request.put("xpage", "plain");

        QueryManagerScriptService qmss = mock(QueryManagerScriptService.class);
        oldcore.getMocker().registerComponent(ScriptService.class, "query", qmss);
        query = mock(ScriptQuery.class);
        when(qmss.xwql("where 1=1 order by doc.date desc")).thenReturn(query);
   }

   @Test
   public void webRssFiltersHiddenDocuments() throws Exception
   {
       // Render the page to test
       renderPage(new DocumentReference("xwiki", "Main", "WebRss"));

       // This is the real test!!
       // We want to verify that the hidden document filter is called when executing the XWQL
       // query to get the list of modified pages
       verify(query).addFilter("hidden/document");
   }

   @Test
   public void webRssDisplay() throws Exception
   {
        when(query.addFilter(anyString())).thenReturn(query);
        when(query.setLimit(20)).thenReturn(query);
        when(query.setOffset(0)).thenReturn(query);
        when(query.execute()).thenReturn(Arrays.<Object>asList("Space1.Page1", "Space2.Page2"));

        FeedPlugin plugin = new FeedPlugin("feed", FeedPlugin.class.getName(), context);
        FeedPluginApi pluginApi = new FeedPluginApi(plugin, context);
        when(xwiki.getPluginApi("feed", context)).thenReturn(pluginApi);

       // Render the page to test
       String xml = renderPage(new DocumentReference("xwiki", "Main", "WebRss"));

        assertTrue(xml.contains("<title>activity.rss.feed.description</title>"));
        assertTrue(xml.contains("<title>Page1</title>"));
        assertTrue(xml.contains("<title>Page2</title>"));
   }
}
Tags:
Created by Vincent Massol on 2018/11/25 11:28
   

Get Connected