killbill-aplcache

Details

diff --git a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
index c9f5aa9..3cf1386 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
@@ -16,50 +16,122 @@
 
 package com.ning.billing.invoice.notification;
 
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.joda.time.DateTime;
 import org.skife.config.ConfigurationObjectFactory;
+import org.skife.jdbi.v2.DBI;
+import org.skife.jdbi.v2.Transaction;
+import org.skife.jdbi.v2.TransactionStatus;
+import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.google.common.eventbus.Subscribe;
 import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
-import com.ning.billing.config.CatalogConfig;
 import com.ning.billing.config.InvoiceConfig;
+import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.lifecycle.KillbillService.ServiceException;
 import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.DefaultClock;
+import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.eventbus.Bus;
+import com.ning.billing.util.eventbus.Bus.EventBusException;
 import com.ning.billing.util.eventbus.MemoryEventBus;
 import com.ning.billing.util.notificationq.DefaultNotificationQueueService;
+import com.ning.billing.util.notificationq.DummySqlTest;
 import com.ning.billing.util.notificationq.NotificationQueueService;
+import com.ning.billing.util.notificationq.dao.NotificationSqlDao;
 
 public class TestNextBillingDateNotifier {
 
 	private Clock clock;
-	private NextBillingDateNotifier notifier;
+	private DefaultNextBillingDateNotifier notifier;
+	private DummySqlTest dao;
+	private Bus eventBus;
+	private MysqlTestingHelper helper;
 	
 	@BeforeClass(groups={"setup"})
-	public void setup() throws ServiceException {
+	public void setup() throws ServiceException, IOException, ClassNotFoundException, SQLException {
 		//TestApiBase.loadSystemPropertiesFromClasspath("/entitlement.properties");
-        final Injector g = Guice.createInjector(Stage.PRODUCTION, new AbstractModule() {
+        final Injector g = Guice.createInjector(Stage.PRODUCTION,  new AbstractModule() {
 			protected void configure() {
-				 bind(Clock.class).to(DefaultClock.class).asEagerSingleton();
+				 bind(Clock.class).to(ClockMock.class).asEagerSingleton();
 				 bind(NextBillingDateNotifier.class).to(DefaultNextBillingDateNotifier.class).asEagerSingleton();
 				 bind(Bus.class).to(MemoryEventBus.class).asEagerSingleton();
 				 bind(NotificationQueueService.class).to(DefaultNotificationQueueService.class).asEagerSingleton();
 				 final InvoiceConfig config = new ConfigurationObjectFactory(System.getProperties()).build(InvoiceConfig.class);
-			        bind(InvoiceConfig.class).toInstance(config);
+				 bind(InvoiceConfig.class).toInstance(config);
+				 final MysqlTestingHelper helper = new MysqlTestingHelper();
+				 bind(MysqlTestingHelper.class).toInstance(helper);
+				 DBI dbi = helper.getDBI();
+				 bind(DBI.class).toInstance(dbi);
+
 			}  	
         });
 
-        notifier = g.getInstance(NextBillingDateNotifier.class);
+        notifier = (DefaultNextBillingDateNotifier) g.getInstance(NextBillingDateNotifier.class);
         clock = g.getInstance(Clock.class);
-       
+        DBI dbi = g.getInstance(DBI.class);
+        dao = dbi.onDemand(DummySqlTest.class);
+        eventBus = g.getInstance(Bus.class);
+        helper = g.getInstance(MysqlTestingHelper.class);
+        startMysql();
+	}
+	
+	private void startMysql() throws IOException, ClassNotFoundException, SQLException {
+		final String ddl = IOUtils.toString(NotificationSqlDao.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
+		final String testDdl = IOUtils.toString(NotificationSqlDao.class.getResourceAsStream("/com/ning/billing/util/ddl_test.sql"));
+		helper.startMysql();
+		helper.initDb(ddl);
+		helper.initDb(testDdl);
+	}
+
+	public static class NextBillingEventListener {
+		private int eventCount=0;
+
+		public int getEventCount() {
+			return eventCount;
+		}
+
+		@Subscribe
+		public synchronized void processEvent(NextBillingDateEvent event) {
+			eventCount++;
+			//log.debug("Got event {} {}", event.name, event.value);
+		}
 	}
 	
-	@Test(enabled=false, groups="fast")
-	public void test() {
+	@Test(enabled=true, groups="slow")
+	public void test() throws EventBusException, InterruptedException {
+		final UUID subscriptionId = new UUID(0L,1L);
+		final DateTime now = new DateTime();
+		final DateTime readyTime = now.plusMillis(2000);
+
+		NextBillingEventListener listener = new NextBillingEventListener();
+		eventBus.start();
+		notifier.initialize();
+		notifier.start();
+		
+        eventBus.register(listener);
+		dao.inTransaction(new Transaction<Void, DummySqlTest>() {
+			@Override
+			public Void inTransaction(DummySqlTest transactional,
+					TransactionStatus status) throws Exception {
+
+				notifier.insertNextBillingNotification(transactional, subscriptionId, readyTime);
+				return null;
+			}
+		});
+
+		// Move time in the future after the notification effectiveDate
+		((ClockMock) clock).setDeltaFromReality(3000);
+		Thread.sleep(1000); //Ugly - waiting for thread to be scheduled. hmmm.
 		
+		Assert.assertEquals(listener.getEventCount(), 1);
 	}
 }