/******************************************************************************* * 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.services.entity; import static org.easymock.EasyMock.*; import java.util.ArrayList; import java.util.SortedSet; import java.util.TreeSet; import org.eclipse.skalli.model.Issue; import org.eclipse.skalli.model.Issuer; import org.eclipse.skalli.model.Severity; import org.eclipse.skalli.model.ValidationException; import org.eclipse.skalli.services.event.EventService; import org.eclipse.skalli.services.persistence.PersistenceService; import org.eclipse.skalli.testutil.AssertUtils; import org.eclipse.skalli.testutil.BundleManager; import org.eclipse.skalli.testutil.TestEntityBase1; import org.eclipse.skalli.testutil.TestUUIDs; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @SuppressWarnings("nls") public class EntityServiceBaseTest { private static final String USERID = "hugo"; private static final Class<? extends Issuer> ISSUER = TestEntityServiceImpl.class; private TestEntityServiceImpl entityService; private Object[] mocks; private PersistenceService mockIPS; private EventService mockES; private TestEntityBase1 validEntity; private TestEntityBase1 noUuidEntity; private TestEntityBase1 invalidEntity; private ArrayList<TestEntityBase1> entities; private class TestEntityServiceImpl extends EntityServiceBase<TestEntityBase1> implements Issuer { public TestEntityServiceImpl(PersistenceService persistenceService, EventService eventService) { bindPersistenceService(persistenceService); bindEventService(eventService); } @Override public Class<TestEntityBase1> getEntityClass() { return TestEntityBase1.class; } @Override public int getModelVersion() { return 0; } @Override protected void validateEntity(TestEntityBase1 entity) throws ValidationException { SortedSet<Issue> issues = validateEntity(entity, Severity.FATAL); if (issues.size() > 0) { throw new ValidationException("FAILED", issues); } } @Override protected SortedSet<Issue> validateEntity(TestEntityBase1 entity, Severity minSeverity) { TreeSet<Issue> issues = new TreeSet<Issue>(); if (invalidEntity.equals(entity)) { issues.add(new Issue(Severity.FATAL, ISSUER, invalidEntity.getUuid())); } if (minSeverity.equals(Severity.WARNING)) { issues.add(new Issue(Severity.WARNING, ISSUER, entity.getUuid())); } return issues; } } @Before public void setup() throws Exception { BundleManager.startBundles(); validEntity = new TestEntityBase1(TestUUIDs.TEST_UUIDS[0]); noUuidEntity = new TestEntityBase1(); invalidEntity = new TestEntityBase1(TestUUIDs.TEST_UUIDS[1]); entities = new ArrayList<TestEntityBase1>(); for (int i = 0; i < TestUUIDs.TEST_UUIDS.length; ++i) { entities.add(new TestEntityBase1(TestUUIDs.TEST_UUIDS[i])); } mockIPS = createNiceMock(PersistenceService.class); mockES = createNiceMock(EventService.class); mocks = new Object[] { mockIPS, mockES }; entityService = new TestEntityServiceImpl(mockIPS, mockES); Assert.assertNotNull(entityService.getPersistenceService()); } @Test public void testGetters() throws Exception { reset(mocks); mockIPS.getEntity(eq(TestEntityBase1.class), eq(TestUUIDs.TEST_UUIDS[0])); expectLastCall().andReturn(entities.get(0)).anyTimes(); mockIPS.getEntities(eq(TestEntityBase1.class)); expectLastCall().andReturn(entities).anyTimes(); mockIPS.loadEntity(eq(TestEntityBase1.class), eq(TestUUIDs.TEST_UUIDS[0])); expectLastCall().andReturn(entities.get(0)).anyTimes(); replay(mocks); Assert.assertEquals(entities.get(0), entityService.getByUUID(TestUUIDs.TEST_UUIDS[0])); AssertUtils.assertEquals("getAll()", entities, entityService.getAll()); Assert.assertEquals(entities.get(0), entityService.loadEntity(TestEntityBase1.class, TestUUIDs.TEST_UUIDS[0])); verify(mocks); } // persist @Test public void testPersist() throws Exception { reset(mocks); mockIPS.persist(eq(TestEntityBase1.class), eq(validEntity), eq(USERID)); expectLastCall(); mockIPS.persist(eq(TestEntityBase1.class), eq(noUuidEntity), eq(USERID)); expectLastCall(); mockES.fireEvent(isA(EventEntityUpdate.class)); expectLastCall(); replay(mocks); entityService.persist(validEntity, USERID); entityService.persist(noUuidEntity, USERID); Assert.assertNotNull(noUuidEntity.getUuid()); verify(mocks); } @Test(expected = ValidationException.class) public void testPersist_invalidEntity() throws Exception { reset(mocks); mockIPS.persist(eq(TestEntityBase1.class), eq(validEntity), eq(USERID)); expectLastCall(); mockIPS.persist(eq(TestEntityBase1.class), eq(noUuidEntity), eq(USERID)); expectLastCall(); mockES.fireEvent(isA(EventEntityUpdate.class)); expectLastCall(); replay(mocks); entityService.persist(invalidEntity, USERID); } @Test public void testValidate() throws Exception { Assert.assertTrue(entityService.validate(validEntity, Severity.FATAL).isEmpty()); TreeSet<Issue> expected = new TreeSet<Issue>(); expected.add(new Issue(Severity.FATAL, ISSUER, invalidEntity.getUuid())); AssertUtils.assertEquals("validate(invalid)", expected, entityService.validate(invalidEntity, Severity.FATAL)); expected.add(new Issue(Severity.WARNING, ISSUER, invalidEntity.getUuid())); AssertUtils.assertEquals("validate(invalid,WARNING)", expected, entityService.validate(invalidEntity, Severity.WARNING)); } public void testValidateAll() throws Exception { reset(mocks); mockIPS.getEntities(eq(TestEntityBase1.class)); expectLastCall().andReturn(entities).anyTimes(); replay(mocks); TreeSet<Issue> expected = new TreeSet<Issue>(); expected.add(new Issue(Severity.FATAL, ISSUER, invalidEntity.getUuid())); AssertUtils.assertEquals("validateAll()", expected, entityService.validateAll(Severity.FATAL)); expected.add(new Issue(Severity.WARNING, ISSUER, invalidEntity.getUuid())); AssertUtils.assertEquals("validateAll(WARNING)", expected, entityService.validateAll(Severity.WARNING)); verify(mocks); } private static Issue[] ISSUES = new Issue[] { new Issue(Severity.FATAL, ISSUER, TestUUIDs.TEST_UUIDS[0]), new Issue(Severity.ERROR, ISSUER, TestUUIDs.TEST_UUIDS[0]), new Issue(Severity.ERROR, ISSUER, TestUUIDs.TEST_UUIDS[1]), new Issue(Severity.WARNING, ISSUER, TestUUIDs.TEST_UUIDS[0]), new Issue(Severity.INFO, ISSUER, TestUUIDs.TEST_UUIDS[0]) }; private static TreeSet<Issue> getIssues() { TreeSet<Issue> issues = new TreeSet<Issue>(); issues.add(clone(ISSUES[0])); issues.add(clone(ISSUES[1])); issues.add(clone(ISSUES[2])); issues.add(clone(ISSUES[3])); issues.add(clone(ISSUES[4])); return issues; } private static Issue clone(Issue issue) { return new Issue(issue.getSeverity(), issue.getIssuer(), issue.getEntityId()); } @Test public void testValidateIssues() { TestEntityServiceImpl service = new TestEntityServiceImpl(mockIPS, mockES); TreeSet<Issue> issues = getIssues(); assertTimestamps(issues, true); service.validateIssues(TestUUIDs.TEST_UUIDS[0], Severity.FATAL, issues); Assert.assertTrue(issues.contains(ISSUES[0])); Assert.assertFalse(issues.contains(ISSUES[1])); Assert.assertFalse(issues.contains(ISSUES[2])); Assert.assertFalse(issues.contains(ISSUES[3])); Assert.assertFalse(issues.contains(ISSUES[4])); assertTimestamps(issues, false); issues = getIssues(); assertTimestamps(issues, true); service.validateIssues(TestUUIDs.TEST_UUIDS[0], Severity.ERROR, issues); Assert.assertTrue(issues.contains(ISSUES[0])); Assert.assertTrue(issues.contains(ISSUES[1])); Assert.assertFalse(issues.contains(ISSUES[2])); Assert.assertFalse(issues.contains(ISSUES[3])); Assert.assertFalse(issues.contains(ISSUES[4])); assertTimestamps(issues, false); issues = getIssues(); assertTimestamps(issues, true); service.validateIssues(TestUUIDs.TEST_UUIDS[0], Severity.WARNING, issues); Assert.assertTrue(issues.contains(ISSUES[0])); Assert.assertTrue(issues.contains(ISSUES[1])); Assert.assertFalse(issues.contains(ISSUES[2])); Assert.assertTrue(issues.contains(ISSUES[3])); Assert.assertFalse(issues.contains(ISSUES[4])); assertTimestamps(issues, false); } private void assertTimestamps(TreeSet<Issue> issues, boolean isInitial) { for (Issue issue : issues) { if (isInitial) { Assert.assertFalse(issue.getTimestamp() > 0); } else { Assert.assertTrue(issue.getTimestamp() > 0); } } } }