/*
 * See the NOTICE file distributed with this work for additional
 * information regarding copyright ownership.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package com.xpn.xwiki.web;

import java.util.Arrays;
import java.util.List;

import javax.servlet.ServletOutputStream;

import org.junit.Rule;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.xwiki.filter.input.InputFilterStream;
import org.xwiki.filter.input.InputFilterStreamFactory;
import org.xwiki.filter.instance.input.DocumentInstanceInputProperties;
import org.xwiki.filter.output.BeanOutputFilterStream;
import org.xwiki.filter.output.BeanOutputFilterStreamFactory;
import org.xwiki.filter.output.OutputFilterStreamFactory;
import org.xwiki.filter.type.FilterStreamType;
import org.xwiki.filter.xar.output.XAROutputProperties;
import org.xwiki.model.reference.DocumentReference;
import org.xwiki.model.reference.DocumentReferenceResolver;
import org.xwiki.query.Query;
import org.xwiki.query.QueryManager;

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;

import com.xpn.xwiki.XWikiContext;
import com.xpn.xwiki.test.MockitoOldcoreRule;

/**
 * Unit tests for {@link com.xpn.xwiki.web.ExportAction}.
 *
 * @version $Id$
 * @since 6.3M2
 */
public class ExportActionTest
{
    @Rule
    public MockitoOldcoreRule oldcore = new MockitoOldcoreRule();

    @Test
    public void exportFullSpaceUsingWildcardsAsXAR() throws Exception
    {
        ExportAction action = new ExportAction();

        XWikiContext context = oldcore.getXWikiContext();

        // Make it a XAR export
        XWikiRequest request = mock(XWikiRequest.class);
        when(request.get("format")).thenReturn("xar");
        context.setRequest(request);

        // Set other request parameters
        when(request.get("name")).thenReturn("myexport");
        // Export all pages in the "Space" space
        when(request.getParameterValues("pages")).thenReturn(new String[] {"Space.%"});

        // Make the current user have programming rights
        when(oldcore.getMockRightService().hasWikiAdminRights(context)).thenReturn(true);

        // Query Manager-related mocking
        QueryManager queryManager = oldcore.getMocker().registerMockComponent(QueryManager.class);
        Query query = mock(Query.class);
        when(queryManager.createQuery(anyString(), eq(Query.HQL))).thenReturn(query);
        when(query.setWiki("xwiki")).thenReturn(query);
        when(query.bindValues(any(List.class))).thenReturn(query);
        when(query.execute()).thenReturn(Arrays.asList("Space.Page1", "Space.Page2"));

        // Register some mock resolver to resolve passed page references
        when(oldcore.getMockRightService().hasAccessLevel("view", "XWiki.XWikiGuest", "xwiki:Space.Page1", context))
            .thenReturn(true);
        when(oldcore.getMockRightService().hasAccessLevel("view", "XWiki.XWikiGuest", "xwiki:Space.Page2", context))
            .thenReturn(true);
        DocumentReferenceResolver<String> resolver =
            oldcore.getMocker().registerMockComponent(DocumentReferenceResolver.TYPE_STRING, "current");
        when(resolver.resolve("xwiki:Space.Page1")).thenReturn(new DocumentReference("xwiki", "Space", "Page1"));
        when(resolver.resolve("xwiki:Space.Page2")).thenReturn(new DocumentReference("xwiki", "Space", "Page2"));

        // Register some mock filters so that the export does nothing.
        InputFilterStreamFactory inputFilterStreamFactory = oldcore.getMocker().registerMockComponent(
            InputFilterStreamFactory.class, FilterStreamType.XWIKI_INSTANCE.serialize());
        when(inputFilterStreamFactory.createInputFilterStream(anyMap())).thenReturn(mock(InputFilterStream.class));
        BeanOutputFilterStreamFactory beanOutputFilterStreamFactory = mock(BeanOutputFilterStreamFactory.class);
        oldcore.getMocker().registerComponent(OutputFilterStreamFactory.class,
            FilterStreamType.XWIKI_XAR_CURRENT.serialize(), beanOutputFilterStreamFactory);
        when(beanOutputFilterStreamFactory.createOutputFilterStream(any(XAROutputProperties.class))).thenReturn(
            mock(BeanOutputFilterStream.class));

        // Set response stream
        XWikiResponse response = mock(XWikiResponse.class);
        ServletOutputStream outputStream = mock(ServletOutputStream.class);
        when(response.getOutputStream()).thenReturn(outputStream);
        context.setResponse(response);

        String result = action.render(oldcore.getXWikiContext());

        // The tests are below this line!

        // Verify null is returned (this means the response has been returned)
        assertNull(result);

        // Verify that the parameters passed to the input stream factory are defining the correct pages
        ArgumentCaptor<DocumentInstanceInputProperties> properties =
            ArgumentCaptor.forClass(DocumentInstanceInputProperties.class);
        verify(inputFilterStreamFactory).createInputFilterStream(properties.capture());
        assertEquals(false, properties.getValue().isVerbose());
        assertEquals(false, properties.getValue().isWithJRCSRevisions());
        assertEquals(false, properties.getValue().isWithRevisions());
        assertEquals(true, properties.getValue().getEntities().matches(
            new DocumentReference("xwiki", "Space", "Page1")));
        assertEquals(true, properties.getValue().getEntities().matches(
            new DocumentReference("xwiki", "Space", "Page2")));
    }
}

@@ -1028,30 +1028,19 @@
 nit.
-Rule;%0Aimport org.junit
+jupiter.api
 .Tes
@@ -1711,16 +1711,184 @@
 anager;%0A
+import org.xwiki.test.annotation.AllComponents;%0A%0Aimport static org.junit.jupiter.api.Assertions.assertEquals;%0Aimport static org.junit.jupiter.api.Assertions.assertNull;
 %0Aimport 
@@ -1920,42 +1920,8 @@
 o.*;
-%0Aimport static org.junit.Assert.*;
 %0A%0Aim
@@ -1993,20 +1993,133 @@
 oOldcore
-Rule
+;%0Aimport com.xpn.xwiki.test.junit5.mockito.InjectMockitoOldcore;%0Aimport com.xpn.xwiki.test.junit5.mockito.OldcoreTest
 ;%0A%0A/**%0A 
@@ -2215,16 +2215,44 @@
 3M2%0A */%0A
+@OldcoreTest%0A@AllComponents%0A
 public c
@@ -2280,19 +2280,35 @@
 %0A%7B%0A    @
-Rul
+InjectMockitoOldcor
 e%0A    pu
@@ -2330,20 +2330,16 @@
 core
-Rule
  oldcore
  = n
@@ -2338,35 +2338,8 @@
 core
- = new MockitoOldcoreRule()
 ;%0A%0A 

Refactor ExportActionTest to use JUnit 5