org.eclipse.skalli.core.feed.jpa.JPAFeedServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.skalli.core.feed.jpa.JPAFeedServiceTest.java

Source

/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 * SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.core.feed.jpa;

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.apache.commons.codec.digest.DigestUtils;
import org.eclipse.skalli.services.feed.Entry;
import org.eclipse.skalli.services.feed.FeedEntry;
import org.eclipse.skalli.services.feed.FeedPersistenceService;
import org.eclipse.skalli.services.feed.FeedService;
import org.eclipse.skalli.testutil.BundleManager;
import org.eclipse.skalli.testutil.TestUUIDs;
import org.junit.Test;

public class JPAFeedServiceTest {
    final private static UUID defaultProjectUuid = TestUUIDs.TEST_UUIDS[0];
    final private static UUID allFieldsProjectUuid = TestUUIDs.TEST_UUIDS[1];
    final private static UUID notPersistedProjectUuid = TestUUIDs.TEST_UUIDS[2];
    final private static UUID testFindProjectUuid = TestUUIDs.TEST_UUIDS[3];

    protected FeedPersistenceService getFeedPersistenceService() throws Exception {
        FeedPersistenceService service = BundleManager.waitService(FeedPersistenceService.class,
                JPAFeedPersistenceComponent.class, 1000);
        if (service == null) {
            fail(JPAFeedPersistenceComponent.class.getName() + " is not active");
        }
        return service;
    }

    protected FeedService getFeedService() throws Exception {
        FeedService service = BundleManager.waitService(FeedService.class, JPAFeedComponent.class, 1000);
        if (service == null) {
            fail(JPAFeedComponent.class.getName() + " is not active");
        }
        return service;
    }

    @Test
    public void testMergeWithFind() throws Exception {
        final String source = ("source-" + JPAFeedPersistenceServiceTest.class.getSimpleName()).substring(0,
                EntryJPA.SOURCE_LENGTH);
        final String title = "TestAllFields";
        final Date testDate = new Date(1318946441120L);
        final String author_name = "Jon Smith";
        final String author_email = "JonSmith@somehwere";
        final String content_value = "test content";
        final String link_title = "link title";
        final String link_href = "href info";

        FeedPersistenceService jPAFeedPersistenceService = getFeedPersistenceService();
        FeedEntry newEntry = jPAFeedPersistenceService.createEntry();
        newEntry.setSource(source);
        newEntry.setProjectId(allFieldsProjectUuid);
        newEntry.setTitle(title);
        newEntry.setPublished(testDate);
        newEntry.getAuthor().setName(author_name);
        newEntry.getAuthor().setEmail(author_email);
        newEntry.getContent().setType("text");
        newEntry.getContent().setValue(content_value);
        newEntry.getLink().setTitle(link_title);
        newEntry.getLink().setHref(link_href);

        final String id = DigestUtils
                .shaHex(newEntry.getProjectId().toString() + newEntry.getTitle() + newEntry.getSource());
        newEntry.setId(id);

        Collection<FeedEntry> entries = new ArrayList<FeedEntry>();
        entries.add(newEntry);
        jPAFeedPersistenceService.merge(entries);

        FeedService jPAFeedService = getFeedService();
        List<Entry> foundEntries = jPAFeedService.findEntries(allFieldsProjectUuid, 10);
        assertThat(foundEntries.size(), is(1));

        Entry foundEntry = foundEntries.get(0);
        assertNotNull(foundEntry);
        assertThat(foundEntry.getId(), is(id));
        assertThat(foundEntry.getSource(), is(source));
        assertThat(foundEntry.getProjectId(), is(allFieldsProjectUuid));
        assertThat(foundEntry.getTitle(), is(title));
        assertThat(foundEntry.getPublished(), is(testDate));
        assertThat(foundEntry.getAuthor().getName(), is(author_name));
        assertThat(foundEntry.getAuthor().getEmail(), is(author_email));
        assertThat(foundEntry.getContent().getType(), is("text"));
        assertThat(foundEntry.getContent().getValue(), is(content_value));
        assertThat(foundEntry.getLink().getTitle(), is(link_title));
        assertThat(foundEntry.getLink().getHref(), is(link_href));

        // now update the entry and check that it updated
        final String newTitle = "new changed Title";
        newEntry.setTitle(newTitle);
        entries = new ArrayList<FeedEntry>();
        entries.add(newEntry);
        jPAFeedPersistenceService.merge(entries);
        foundEntries = jPAFeedService.findEntries(allFieldsProjectUuid, 10);
        assertThat(foundEntries.size(), is(1));
        foundEntry = foundEntries.get(0);
        assertNotNull(foundEntry);
        assertThat(foundEntry.getId(), is(id));
        assertThat(foundEntry.getTitle(), is(newTitle));
    }

    @Test
    public void testMerge() throws Exception {
        FeedPersistenceService jPAFeedPersistenceService = getFeedPersistenceService();
        FeedEntry entry1 = createDummyTestEntry(jPAFeedPersistenceService, "1");
        FeedEntry entry2 = createDummyTestEntry(jPAFeedPersistenceService, "2");
        FeedEntry entry3 = createDummyTestEntry(jPAFeedPersistenceService, "3");

        Collection<FeedEntry> entries = new ArrayList<FeedEntry>();
        entries.add(entry1);
        entries.add(entry2);
        jPAFeedPersistenceService.merge(entries);
        assertEntriesExist(new String[] { entry1.getId(), entry2.getId() });

        // update again and add a third entry
        entries = new ArrayList<FeedEntry>();
        // entries.add(entry1); // do not set all entries, only some, and check
        // that the old once are not deleted.
        entries.add(entry2);
        entries.add(entry3);
        jPAFeedPersistenceService.merge(entries);

        assertEntriesExist(new String[] { entry1.getId(), entry2.getId(), entry3.getId() });
    }

    private void assertEntriesExist(String[] expectedEntryIds) throws Exception {
        FeedService jPAFeedService = getFeedService();
        List<Entry> foundEntries = jPAFeedService.findEntries(defaultProjectUuid, expectedEntryIds.length + 100);
        assertThat(foundEntries.size(), is(expectedEntryIds.length));
        for (String expectedId : expectedEntryIds) {
            assertHasEntry(foundEntries, expectedId);
        }
    }

    private void assertHasEntry(List<Entry> foundEntries, String expectedId) {
        boolean hasEntry = false;
        for (Entry entry : foundEntries) {
            if (expectedId.equals(entry.getId())) {
                hasEntry = true;
            }
        }
        assertThat(hasEntry, is(true));
    }

    private FeedEntry createDummyTestEntry(FeedPersistenceService s, String title) {
        FeedEntry newEntry = s.createEntry();
        newEntry.setSource(("source-" + JPAFeedPersistenceServiceTest.class.getSimpleName()).substring(0,
                EntryJPA.SOURCE_LENGTH));
        newEntry.setProjectId(defaultProjectUuid);
        newEntry.setTitle(title);
        newEntry.setPublished(new Date());
        updateId(newEntry);
        return newEntry;
    }

    @Test
    public void testFindCalls() throws Exception {

        final Date testDate = new Date(1318946441120L);

        FeedPersistenceService jPAFeedPersistenceService = getFeedPersistenceService();
        FeedEntry e1 = jPAFeedPersistenceService.createEntry();
        e1.setSource("source-a");
        e1.setProjectId(testFindProjectUuid);
        e1.setTitle("t1");
        e1.setPublished(testDate);
        updateId(e1);

        FeedEntry e2 = jPAFeedPersistenceService.createEntry();
        e2.setSource("source-a");
        e2.setProjectId(testFindProjectUuid);
        e2.setTitle("t2");
        e2.setPublished(new Date(testDate.getTime() + 1));
        updateId(e2);

        FeedEntry e3 = jPAFeedPersistenceService.createEntry();
        e3.setSource("source-a");
        e3.setProjectId(testFindProjectUuid);
        e3.setTitle("t3");
        e3.setPublished(new Date(testDate.getTime() + 2));
        updateId(e3);

        FeedEntry e4 = jPAFeedPersistenceService.createEntry();
        e4.setSource("source-b");
        e4.setProjectId(testFindProjectUuid);
        e4.setTitle("t4");
        e4.setPublished(new Date(testDate.getTime() + 3));
        updateId(e4);

        Collection<FeedEntry> entries = new ArrayList<FeedEntry>();
        entries.add(e1);
        entries.add(e2);
        entries.add(e3);
        entries.add(e4);
        jPAFeedPersistenceService.merge(entries);

        // findEntries: check that the maxResult parameter of findEnties works:
        FeedService jPAFeedService = getFeedService();
        for (int maxResults = 0; maxResults < 10; maxResults++) {
            List<Entry> foundEntries = jPAFeedService.findEntries(testFindProjectUuid, maxResults);
            assertThat(foundEntries.size(), is(Math.min(maxResults, 4)));

            if (maxResults > 0) {
                // check that the entries are ordered desc by published
                for (int i = 1; i < foundEntries.size(); i++) {
                    Date date0 = foundEntries.get(i - 1).getPublished();
                    Date date1 = foundEntries.get(i).getPublished();
                    assertTrue("expected: " + date0.getTime() + ">" + date1.getTime(), date0.compareTo(date1) > 0);
                }
            }
        }

        // findEntries: check find with 1 source
        List<Entry> foundEntries = jPAFeedService.findEntries(testFindProjectUuid,
                Collections.singleton("source-a"), 10);
        assertThat(foundEntries.size(), is(3));
        for (Entry entry : foundEntries) {
            assertThat(entry.getSource(), is("source-a"));
        }

        // findEntries:: check find with 2 different sources
        Collection<String> sources = new ArrayList<String>();
        sources.add("source-a");
        sources.add("source-b");
        foundEntries = jPAFeedService.findEntries(testFindProjectUuid, sources, 10);
        assertThat(foundEntries.size(), is(4));
        for (Entry entry : foundEntries) {
            assertThat(entry.getSource(), isIn(sources));
        }

        // findEntries: check find with 1 sources and second one not existing
        sources = new ArrayList<String>();
        sources.add("source-a");
        sources.add("notExistingSource");
        foundEntries = jPAFeedService.findEntries(testFindProjectUuid, sources, 10);
        assertThat(foundEntries.size(), is(3));
        for (Entry entry : foundEntries) {
            assertThat(entry.getSource(), is("source-a"));
        }

        // findEntries: check find with 1 sources not persisted source
        sources = new ArrayList<String>();
        sources.add("notExistingSource");
        foundEntries = jPAFeedService.findEntries(testFindProjectUuid, sources, 10);
        assertThat(foundEntries.size(), is(0));

        // findSources
        List<String> foundSources = jPAFeedService.findSources(testFindProjectUuid);
        assertThat(foundSources.size(), is(2));
        // sources are expected to be order by there name
        assertThat(foundSources.get(0), is("source-a"));
        assertThat(foundSources.get(1), is("source-b"));
    }

    private void updateId(FeedEntry newEntry) {
        // in this test we calculate the id via project, title and source.
        String id = newEntry.getProjectId().toString() + newEntry.getTitle() + newEntry.getSource();
        newEntry.setId(DigestUtils.shaHex(id));
    }

    @Test
    public void testfindEntriesIllegalParameters() throws Exception {

        FeedService jPAFeedService = getFeedService();
        try {
            jPAFeedService.findEntries(null, 4711);
            fail("IllegalArgumentException was expected.");
        } catch (IllegalArgumentException e) {
            assertThat(e.getMessage(), containsString("projectId"));
        }

        try {
            jPAFeedService.findEntries(null, Collections.EMPTY_LIST, 4711);
            fail("IllegalArgumentException was expected.");
        } catch (IllegalArgumentException e) {
            assertThat(e.getMessage(), containsString("projectId"));
        }
    }

    @Test
    public void testfindEmptyResult() throws Exception {
        FeedService jPAFeedService = getFeedService();
        assertThat(jPAFeedService.findEntries(defaultProjectUuid, Collections.EMPTY_LIST, 4711).size(), is(0));
        assertThat(jPAFeedService.findEntries(defaultProjectUuid, Collections.EMPTY_LIST, FeedService.SELECT_ALL)
                .size(), is(0));
        assertThat(jPAFeedService.findEntries(defaultProjectUuid, Collections.EMPTY_LIST, -4711).size(), is(0));
        assertThat(jPAFeedService.findEntries(defaultProjectUuid, null, 0).size(), is(0));
        assertThat(jPAFeedService.findEntries(notPersistedProjectUuid, 10).size(), is(0));
    }

    @Test
    public void testFindSourcesIllegalParameters() throws Exception {
        FeedService jPAFeedService = getFeedService();
        try {
            jPAFeedService.findSources(null);
            fail("IllegalArgumentException was expected.");
        } catch (IllegalArgumentException e) {
            assertThat(e.getMessage(), containsString("projectId"));
        }
    }
}