package org.jvalue.ods.notifications; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.jvalue.commons.utils.Cache; import org.jvalue.ods.api.notifications.Client; import org.jvalue.ods.api.notifications.GcmClient; import org.jvalue.ods.api.notifications.HttpClient; import org.jvalue.ods.api.sources.DataSource; import org.jvalue.ods.db.DataRepository; import org.jvalue.ods.db.NotificationClientRepository; import org.jvalue.ods.db.RepositoryFactory; import org.jvalue.ods.notifications.sender.Sender; import org.jvalue.ods.notifications.sender.SenderCache; import org.jvalue.ods.notifications.sender.SenderResult; import java.util.Arrays; import mockit.Expectations; import mockit.Mocked; import mockit.NonStrictExpectations; import mockit.Verifications; import mockit.integration.junit4.JMockit; @RunWith(JMockit.class) public final class NotificationManagerTest { @Mocked private SenderCache senderCache; @Mocked private Cache<NotificationClientRepository> clientRepositoryCache; @Mocked private RepositoryFactory repositoryFactory; @Mocked private NotificationClientRepository clientRepository; @Mocked private Sender<HttpClient> httpSender; @Mocked private Sender<GcmClient> gcmSender; private final DataSource source = new DataSource("someId", null, null, null); private final HttpClient httpClient = new HttpClient("someId", "someCallbackUrl", false); private final GcmClient gcmClient = new GcmClient("someId", "someDeviceId"); private NotificationManager notificationManager; @Before public void setupNotificationManager() { notificationManager = new NotificationManager(clientRepositoryCache, repositoryFactory, senderCache); } @Before public void setupSenderCache() { new NonStrictExpectations() {{ senderCache.get(source, httpClient); result = httpSender; senderCache.get(source, gcmClient); result = gcmSender; }}; } @Test public void testOnNewDataStart() { new Expectations(notificationManager) {{ notificationManager.getAll(source); result = Arrays.asList(httpClient, gcmClient); }}; notificationManager.onNewDataStart(source); new Verifications() {{ httpSender.onNewDataStart(); gcmSender.onNewDataStart(); }}; } @Test public void testOnNewDataItem() { new Expectations(notificationManager) {{ notificationManager.getAll(source); result = Arrays.asList(httpClient, gcmClient); }}; final ObjectNode data = new ObjectNode(JsonNodeFactory.instance); data.put("hello", "world"); notificationManager.onNewDataItem(source, data); new Verifications() {{ httpSender.onNewDataItem(data); gcmSender.onNewDataItem(data); }}; } @Test public void testOnNewDataCompleteSuccess() { testOnNewDataCompleteHelper(SenderResult.Status.SUCCESS); } @Test public void testOnNewDataCompleteError() { testOnNewDataCompleteHelper(SenderResult.Status.ERROR); } @Test public void testOnNewDataCompleteRemove() { new Expectations(notificationManager) {{ notificationManager.getAll(source); result = Arrays.asList(gcmClient); gcmSender.getSenderResult().getStatus(); result = SenderResult.Status.REMOVE_CLIENT; gcmSender.getSenderResult().getOldClient(); result = gcmClient; clientRepositoryCache.contains(anyString); result = true; clientRepositoryCache.get(anyString); result = clientRepository; }}; notificationManager.onNewDataComplete(source); new Verifications() {{ gcmSender.onNewDataComplete(); senderCache.release(source, gcmClient); clientRepository.remove(gcmClient); }}; } @Test public void testOnNewDataCompleteUpdate() { final GcmClient newGcmClient = new GcmClient("someOtherId", "someOtherDeviceId"); new Expectations(notificationManager) {{ notificationManager.getAll(source); result = Arrays.asList(gcmClient); gcmSender.getSenderResult().getStatus(); result = SenderResult.Status.UPDATE_CLIENT; gcmSender.getSenderResult().getOldClient(); result = gcmClient; gcmSender.getSenderResult().getNewClient(); result = newGcmClient; clientRepositoryCache.contains(anyString); result = true; clientRepositoryCache.get(anyString); result = clientRepository; }}; notificationManager.onNewDataComplete(source); new Verifications() {{ gcmSender.onNewDataComplete(); senderCache.release(source, gcmClient); clientRepository.remove(gcmClient); clientRepository.add(newGcmClient); }}; } private void testOnNewDataCompleteHelper(final SenderResult.Status status) { new NonStrictExpectations(notificationManager) {{ notificationManager.getAll(source); result = Arrays.asList(gcmClient); gcmSender.getSenderResult().getStatus(); result = status; notificationManager.remove((DataSource) any, (DataRepository) any, (Client) any); result = new IllegalStateException("this method should not have been called"); }}; notificationManager.onNewDataComplete(source); new Verifications() {{ gcmSender.onNewDataComplete(); senderCache.release(source, gcmClient); }}; } }