fr.paris.lutece.portal.service.search.LuceneSearchEngineTest.java Source code

Java tutorial

Introduction

Here is the source code for fr.paris.lutece.portal.service.search.LuceneSearchEngineTest.java

Source

/*
 * Copyright (c) 2002-2017, Mairie de Paris
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice
 *     and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright notice
 *     and the following disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *
 *  3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * License 1.0
 */
package fr.paris.lutece.portal.service.search;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.FieldType;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.store.Directory;
import org.springframework.mock.web.MockHttpServletRequest;

import fr.paris.lutece.portal.business.page.Page;
import fr.paris.lutece.portal.service.init.LuteceInitException;
import fr.paris.lutece.portal.service.security.LuteceUser;
import fr.paris.lutece.portal.service.security.MokeLuteceAuthentication;
import fr.paris.lutece.portal.service.security.SecurityService;
import fr.paris.lutece.portal.service.spring.SpringContextService;
import fr.paris.lutece.portal.service.util.AppPropertiesService;
import fr.paris.lutece.test.LuteceTestCase;

/**
 * Test the LuceneSearchEngine class
 */
public class LuceneSearchEngineTest extends LuteceTestCase {

    private static final String BEAN_SEARCH_ENGINE = "searchEngine";

    private static boolean firstRun = true;
    private static SearchEngine _engine;

    /* mimic initialization in IndexationService.processIndexing */
    private IndexWriter getIndexWriter() throws Exception {
        Directory dir = IndexationService.getDirectoryIndex();
        IndexWriterConfig conf = new IndexWriterConfig(IndexationService.getAnalyser());
        conf.setOpenMode(OpenMode.CREATE);
        return new IndexWriter(dir, conf);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        if (firstRun) {
            firstRun = false;

            _engine = SpringContextService.getBean(BEAN_SEARCH_ENGINE);

            FieldType ft = new FieldType(StringField.TYPE_STORED);
            ft.setOmitNorms(false);
            Document doc = new Document();
            doc.add(new Field(SearchItem.FIELD_DATE, "2014-06-06", ft));
            doc.add(new Field(SearchItem.FIELD_CONTENTS, "lutecefoo lutecebar", TextField.TYPE_NOT_STORED));
            doc.add(new StringField(SearchItem.FIELD_METADATA, "lutecetag", Field.Store.NO));

            doc.add(new Field(SearchItem.FIELD_TYPE, "lutecetype", ft));
            doc.add(new Field(SearchItem.FIELD_ROLE, "role1", ft));

            // Not using IndexationService.write(doc) because it needs to be
            // called by IndexationService.processIndexing() (or else it throws null pointer exception)
            IndexWriter indexWriter = getIndexWriter();
            indexWriter.addDocument(doc);

            doc = new Document();
            doc.add(new Field(SearchItem.FIELD_CONTENTS, "lutecebaz", TextField.TYPE_NOT_STORED));
            doc.add(new Field(SearchItem.FIELD_ROLE, Page.ROLE_NONE, ft));
            indexWriter.addDocument(doc);

            indexWriter.close();
        }
    }

    public void testSearchSimpleMatch() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        List<SearchResult> listResults = _engine.getSearchResults("lutecefoo", request);
        assertTrue("The search results list should have one element. Got : " + listResults,
                listResults != null && listResults.size() == 1);
    }

    public void testSearchSimpleNoMatch() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        List<SearchResult> listResults = _engine.getSearchResults("lutecebadfoo", request);
        assertTrue("The search results list should have no elements. Got : " + listResults,
                listResults != null && listResults.size() == 0);
    }

    public void testSearchDateMatch() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("date_after", "01/01/2014");
        request.setParameter("date_before", "01/10/2015");
        List<SearchResult> listResults = _engine.getSearchResults("lutecefoo", request);
        assertTrue("The search results list should have one element. Got : " + listResults,
                listResults != null && listResults.size() == 1);
    }

    public void testSearchDateNoMatch() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("date_after", "01/01/2010");
        request.setParameter("date_before", "01/10/2011");
        List<SearchResult> listResults = _engine.getSearchResults("lutecefoo", request);
        assertTrue("The search results list should have no elements. Got : " + listResults,
                listResults != null && listResults.size() == 0);
    }

    public void testSearchTypeMatch() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("type_filter", "lutecetype");
        List<SearchResult> listResults = _engine.getSearchResults("lutecefoo", request);
        assertTrue("The search results list should have one element. Got : " + listResults,
                listResults != null && listResults.size() == 1);
    }

    public void testSearchTypeNoMatch() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("type_filter", "lutecebadtype");
        List<SearchResult> listResults = _engine.getSearchResults("lutecefoo", request);
        assertTrue("The search results list should have no elements. Got : " + listResults,
                listResults != null && listResults.size() == 0);
    }

    public void testSearchTagMatch() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("tag_filter", "lutecetag");
        List<SearchResult> listResults = _engine.getSearchResults("lutecetag", request);
        assertTrue("The search results list should have one element. Got : " + listResults,
                listResults != null && listResults.size() == 1);
    }

    public void testSearchTagNoMatch() throws Exception {
        MockHttpServletRequest request = new MockHttpServletRequest();
        request.setParameter("tag_filter", "lutecetag");
        List<SearchResult> listResults = _engine.getSearchResults("lutecebadtag", request);
        assertTrue("The search results list should have no elements. Got : " + listResults,
                listResults != null && listResults.size() == 0);
    }

    public void testSearchUserMatch() throws Exception {

        // XXX copy pasted from PortalMenuServiceTest
        boolean authStatus;
        authStatus = enableAuthentication();
        try {
            LuteceUser user = new LuteceUser("junit", SecurityService.getInstance().getAuthenticationService()) {
            };

            user.setRoles(Arrays.asList("role1"));
            MockHttpServletRequest request = new MockHttpServletRequest();
            request.getSession().setAttribute("lutece_user", user);

            List<SearchResult> listResults = _engine.getSearchResults("lutecefoo", request);
            assertTrue("The search results list should have one element. Got : " + listResults,
                    listResults != null && listResults.size() == 1);
        } finally {
            restoreAuthentication(authStatus);
        }
    }

    public void testSearchUserNoMatch() throws Exception {

        // XXX copy pasted from PortalMenuServiceTest
        boolean authStatus;
        authStatus = enableAuthentication();
        try {
            LuteceUser user = new LuteceUser("junit", SecurityService.getInstance().getAuthenticationService()) {
            };

            user.setRoles(Arrays.asList("role2"));
            MockHttpServletRequest request = new MockHttpServletRequest();
            request.getSession().setAttribute("lutece_user", user);

            List<SearchResult> listResults = _engine.getSearchResults("lutecefoo", request);
            assertTrue("The search results list should have no elements. Got : " + listResults,
                    listResults != null && listResults.size() == 0);
        } finally {
            restoreAuthentication(authStatus);
        }
    }

    public void testSearchUserNoMatchNoUser() throws Exception {

        // XXX copy pasted from PortalMenuServiceTest
        boolean authStatus;
        authStatus = enableAuthentication();
        try {
            MockHttpServletRequest request = new MockHttpServletRequest();

            List<SearchResult> listResults = _engine.getSearchResults("lutecebadfoo", request);
            assertTrue("The search results list should have no elements. Got : " + listResults,
                    listResults != null && listResults.size() == 0);
        } finally {
            restoreAuthentication(authStatus);
        }
    }

    // /XXX refactor, this is copy pasted from PortalMenuServiceTest
    private void restoreAuthentication(boolean status) throws IOException, LuteceInitException {
        if (!status) {
            File luteceProperties = new File(getResourcesDir(), "WEB-INF/conf/lutece.properties");
            Properties props = new Properties();
            InputStream is = new FileInputStream(luteceProperties);
            props.load(is);
            is.close();
            props.remove("mylutece.authentication.enable");
            props.remove("mylutece.authentication.class");

            OutputStream os = new FileOutputStream(luteceProperties);
            props.store(os, "saved for junit " + this.getClass().getCanonicalName());
            os.close();
            AppPropertiesService.reloadAll();
            SecurityService.init();
        }
    }

    // /XXX refactor, this is copy pasted from PortalMenuServiceTest
    private boolean enableAuthentication() throws IOException, LuteceInitException {
        boolean status = SecurityService.isAuthenticationEnable();

        if (!status) {
            File luteceProperties = new File(getResourcesDir(), "WEB-INF/conf/lutece.properties");
            Properties props = new Properties();
            InputStream is = new FileInputStream(luteceProperties);
            props.load(is);
            is.close();
            props.setProperty("mylutece.authentication.enable", "true");
            props.setProperty("mylutece.authentication.class", MokeLuteceAuthentication.class.getName());

            OutputStream os = new FileOutputStream(luteceProperties);
            props.store(os, "saved for junit " + this.getClass().getCanonicalName());
            os.close();
            AppPropertiesService.reloadAll();
            SecurityService.init();
        }

        return status;
    }
}