/* * * This is a simple Content Management System (CMS) * Copyright (C) 2012 Imran M Yousuf (imyousuf@smartitengineering.com) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.smartitengineering.cms.spi.impl.events; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.smartitengineering.cms.api.content.Content; import com.smartitengineering.cms.api.content.ContentId; import com.smartitengineering.cms.api.event.Event; import com.smartitengineering.cms.api.event.EventListener; import com.smartitengineering.cms.api.type.ContentType; import com.smartitengineering.cms.api.type.ContentTypeId; import com.smartitengineering.cms.api.workspace.Sequence; import com.smartitengineering.cms.api.workspace.SequenceId; import com.smartitengineering.cms.api.workspace.WorkspaceId; import com.smartitengineering.events.async.api.EventPublisher; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.StringUtils; import org.jmock.Expectations; import org.jmock.Mockery; import org.junit.Before; import org.junit.Test; /** * * @author imyousuf */ public class EventPublisherTest { public static final String CONTENT_ID = "someId"; public static final String WORKSPACE_NAME = "globalWorkspaceName"; public static final String WORSPACE_NS = "globalWorkspaceNamespace"; public static final String CONTENT_TYPE_NAME = "contentTypeName"; public static final String CONTENT_TYPE_NS = "contentTypeNamespace"; public static final String SEQUENCE_NAME = "globalWorkspaceName"; private final Mockery mockery = new Mockery(); private final EventPublisher mockPublisher = mockery.mock(EventPublisher.class); private Injector injector; @Before public void setup() { injector = Guice.createInjector(new EventPublicationListenerModule()); } @Test public void testPublicationOfContent() { EventListener listener = injector.getInstance(EventListener.class); final Event mockEvent = mockery.mock(Event.class); final Content mockContent = mockery.mock(Content.class); final ContentId mockContentId = mockery.mock(ContentId.class); final WorkspaceId mockWorkspaceId = mockery.mock(WorkspaceId.class); final String msgContent = getContentMsg(); mockery.checking(new Expectations() { { exactly(1).of(mockEvent).getEventSourceType(); will(returnValue(Event.Type.CONTENT)); exactly(1).of(mockEvent).getEventType(); will(returnValue(Event.EventType.CREATE)); exactly(1).of(mockEvent).getSource(); will(returnValue(mockContent)); exactly(1).of(mockContent).getContentId(); will(returnValue(mockContentId)); exactly(2).of(mockContentId).getWorkspaceId(); will(returnValue(mockWorkspaceId)); exactly(1).of(mockContentId).getId(); will(returnValue(StringUtils.getBytesUtf8(CONTENT_ID))); exactly(1).of(mockWorkspaceId).getGlobalNamespace(); will(returnValue(WORSPACE_NS)); exactly(1).of(mockWorkspaceId).getName(); will(returnValue(WORKSPACE_NAME)); exactly(1).of(mockPublisher).publishEvent(with("text/plain"), with(msgContent)); will(returnValue(Boolean.TRUE)); } }); listener.notify(mockEvent); mockery.assertIsSatisfied(); } @Test public void testPublicationOfContentType() { EventListener listener = injector.getInstance(EventListener.class); final Event mockEvent = mockery.mock(Event.class); final ContentType mockContentType = mockery.mock(ContentType.class); final ContentTypeId mockContentTypeId = mockery.mock(ContentTypeId.class); final WorkspaceId mockWorkspaceId = mockery.mock(WorkspaceId.class); final String msgContent = getContentTypeMsg(); mockery.checking(new Expectations() { { exactly(1).of(mockEvent).getEventSourceType(); will(returnValue(Event.Type.CONTENT_TYPE)); exactly(1).of(mockEvent).getEventType(); will(returnValue(Event.EventType.CREATE)); exactly(1).of(mockEvent).getSource(); will(returnValue(mockContentType)); exactly(1).of(mockContentType).getContentTypeID(); will(returnValue(mockContentTypeId)); exactly(2).of(mockContentTypeId).getWorkspace(); will(returnValue(mockWorkspaceId)); exactly(1).of(mockContentTypeId).getNamespace(); will(returnValue(CONTENT_TYPE_NS)); exactly(1).of(mockContentTypeId).getName(); will(returnValue(CONTENT_TYPE_NAME)); exactly(1).of(mockWorkspaceId).getGlobalNamespace(); will(returnValue(WORSPACE_NS)); exactly(1).of(mockWorkspaceId).getName(); will(returnValue(WORKSPACE_NAME)); exactly(1).of(mockPublisher).publishEvent(with("text/plain"), with(msgContent)); will(returnValue(Boolean.TRUE)); } }); listener.notify(mockEvent); mockery.assertIsSatisfied(); } @Test public void testPublicationOfSequence() { EventListener listener = injector.getInstance(EventListener.class); final Event mockEvent = mockery.mock(Event.class); final Sequence mockSequence = mockery.mock(Sequence.class); final SequenceId mockSequenceId = mockery.mock(SequenceId.class); final WorkspaceId mockWorkspaceId = mockery.mock(WorkspaceId.class); final String msgContent = getSequenceMsg(); mockery.checking(new Expectations() { { exactly(1).of(mockEvent).getEventSourceType(); will(returnValue(Event.Type.SEQUENCE)); exactly(1).of(mockEvent).getEventType(); will(returnValue(Event.EventType.CREATE)); exactly(1).of(mockEvent).getSource(); will(returnValue(mockSequence)); exactly(1).of(mockSequence).getSequenceId(); will(returnValue(mockSequenceId)); exactly(2).of(mockSequenceId).getWorkspaceId(); will(returnValue(mockWorkspaceId)); exactly(1).of(mockSequenceId).getName(); will(returnValue(SEQUENCE_NAME)); exactly(1).of(mockWorkspaceId).getGlobalNamespace(); will(returnValue(WORSPACE_NS)); exactly(1).of(mockWorkspaceId).getName(); will(returnValue(WORKSPACE_NAME)); exactly(1).of(mockPublisher).publishEvent(with("text/plain"), with(msgContent)); will(returnValue(Boolean.TRUE)); } }); listener.notify(mockEvent); mockery.assertIsSatisfied(); } @Test public void testPublicationOfUnknown() { EventListener listener = injector.getInstance(EventListener.class); final Event mockEvent = mockery.mock(Event.class); mockery.checking(new Expectations() { { exactly(1).of(mockEvent).getEventSourceType(); will(returnValue(Event.Type.REPRESENTATION)); } }); listener.notify(mockEvent); mockery.assertIsSatisfied(); } private final class EventPublicationListenerModule extends AbstractModule { @Override protected void configure() { bind(EventPublisher.class).toInstance(mockPublisher); bind(EventListener.class).to(EventPublicationListener.class); } } public static String getContentMsg() { final byte[] contentId = StringUtils.getBytesUtf8(new StringBuilder(WORSPACE_NS).append('\n').append(WORKSPACE_NAME). append('\n').append(CONTENT_ID).toString()); final String msgContent = new StringBuilder("CONTENT\nCREATE\n").append(Base64.encodeBase64URLSafeString(contentId)). toString(); return msgContent; } public static String getContentTypeMsg() { final byte[] contentId = StringUtils.getBytesUtf8(new StringBuilder(WORSPACE_NS).append('\n').append(WORKSPACE_NAME). append('\n').append(CONTENT_TYPE_NS).append('\n').append(CONTENT_TYPE_NAME).toString()); final String msgContent = new StringBuilder("CONTENT_TYPE\nCREATE\n").append(Base64.encodeBase64URLSafeString( contentId)). toString(); return msgContent; } public static String getSequenceMsg() { final byte[] contentId = StringUtils.getBytesUtf8(new StringBuilder(WORSPACE_NS).append('\n').append(WORKSPACE_NAME). append('\n').append(SEQUENCE_NAME).toString()); final String msgContent = new StringBuilder("SEQUENCE\nCREATE\n").append(Base64.encodeBase64URLSafeString(contentId)). toString(); return msgContent; } }