package edu.brown.cs.student; import java.time.Instant; import java.util.ArrayList; import java.util.List; import edu.brown.cs.student.term.DatabaseQuerier; import edu.brown.cs.student.term.trade.Trade; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; public class DBQuerierTest { /** these should span the entire mock dataset */ //12 am on 3/11 in UTC private Instant start = Instant.parse("2021-03-11T05:00:00.00Z"); //12 am on 3/28 in UTC private Instant end = Instant.parse("2021-03-28T05:00:00.00Z"); private DatabaseQuerier db; @Before public void setUp() { try{ db = new DatabaseQuerier("data/mock_trades.sqlite3"); } catch(Exception e){ System.out.println("DBQuerier Test, couldn't connect to db???"); } } @After public void tearDown() { db = null; } @Test public void testNonExistentStock(){ setUp(); List fakeStockList = new ArrayList<>(); try{ fakeStockList = db.getTradeByStock("NONO", 1, start, end); } catch(Exception e) { System.out.println("Error in test"); } assertTrue(fakeStockList.isEmpty()); tearDown(); } @Test public void testEmptyDatabase(){ try{ db = new DatabaseQuerier("data/testing/empty.sqlite3"); } catch(Exception e){ System.out.println("DBQuerier Test, couldn't connect to db???"); } List gmeBadDatesList = new ArrayList<>(); List noStocks = new ArrayList<>(); List> noTrades = new ArrayList<>(); try { gmeBadDatesList = db.getTradeByStock("GME", 1, start, end); noStocks = db.getRecentStocks(start, end); noTrades = db.getAllTradesByStock(start, end); } catch (Exception e){ System.out.println("ERROR: in test"); } assertTrue(gmeBadDatesList.isEmpty()); assertTrue(noStocks.isEmpty()); assertTrue(noTrades.isEmpty()); tearDown(); } @Test public void testEmptyStringStock(){ setUp(); List fakeStockList = new ArrayList<>(); try{ fakeStockList = db.getTradeByStock("", 1, start, end); } catch(Exception e) { System.out.println("Error in test"); } assertTrue(fakeStockList.isEmpty()); tearDown(); } @Test public void testNeitherIsBuyOrSell(){ setUp(); List fakeStockList = new ArrayList<>(); try{ fakeStockList = db.getTradeByStock("GME", 3, start, end); } catch(Exception e) { System.out.println("Error in test"); } assertTrue(fakeStockList.isEmpty()); tearDown(); } @Test public void testIsSell(){ setUp(); List sellGMEList = new ArrayList<>(); try{ sellGMEList = db.getTradeByStock("GME", 0, start, end); } catch(Exception e) { System.out.println("Error in test"); } assertEquals(7, sellGMEList.size()); for(Trade t: sellGMEList){ assertFalse(t.isBuy()); } tearDown(); } @Test public void testFlippedDates(){ setUp(); List gmeBadDatesList = new ArrayList<>(); List noStocks = new ArrayList<>(); List> noTrades = new ArrayList<>(); try{ gmeBadDatesList = db.getTradeByStock("GME", 1, end, start); noStocks = db.getRecentStocks(end, start); noTrades = db.getAllTradesByStock(end, start); } catch(Exception e) { System.out.println("Error in test"); } assertTrue(gmeBadDatesList.isEmpty()); assertTrue(noStocks.isEmpty()); assertTrue(noTrades.isEmpty()); tearDown(); } @Test public void testTradeByStockNameBuy(){ setUp(); List gmeBuyList = new ArrayList<>(); List teslaBuyList = new ArrayList<>(); try{ gmeBuyList = db.getTradeByStock("GME", 1, start, end); teslaBuyList = db.getTradeByStock("TSLA", 1, start, end); } catch(Exception e) { System.out.println("Error in testTradeByStockName"); } System.out.println(gmeBuyList); assertEquals(gmeBuyList.size(), 6); assertEquals(gmeBuyList.get(0).getId(), 482); assertEquals(gmeBuyList.get(3).getId(), 149); assertEquals(gmeBuyList.get(4).getId(), 275); assertEquals(gmeBuyList.get(5).getId(), 30); assertEquals(teslaBuyList.size(), 16); assertEquals(teslaBuyList.get(0).getId(), 328); assertEquals(teslaBuyList.get(7).getId(), 241); assertEquals(teslaBuyList.get(15).getId(), 774); tearDown(); } @Test public void testTradeByNameOrdering(){ setUp(); List gmeSellList = new ArrayList<>(); List amznBuyList = new ArrayList<>(); try{ gmeSellList = db.getTradeByStock("GME", 0, start, end); amznBuyList = db.getTradeByStock("AMZN", 1, start, end); } catch(Exception e) { System.out.println("Error in test"); } for(int i = 1; i < gmeSellList.size(); i++){ assertTrue(gmeSellList.get(i-1).getTimestamp() < gmeSellList.get(i).getTimestamp()); } for(int i = 1; i < amznBuyList.size(); i++){ assertTrue(amznBuyList.get(i-1).getTimestamp() < amznBuyList.get(i).getTimestamp()); } tearDown(); } @Test public void testGetRecentStocks(){ setUp(); List stockNames = new ArrayList<>(); try { stockNames = db.getRecentStocks(start, end); }catch(Exception e){ System.out.println("Error in test"); } assertEquals(50, stockNames.size()); tearDown(); } @Test public void testGetAllTradesByStock(){ setUp(); List> trades = new ArrayList<>(); try { trades = db.getAllTradesByStock(start, end); }catch(Exception e){ System.out.println("Error in test"); } assertEquals(100, trades.size()); for(List tList: trades){ Trade first = tList.get(0); for(Trade t: tList){ //all things in each list should be for the same stock and same isBuy type assertEquals(first.isBuy(), t.isBuy()); assertEquals(first.getStock(), t.getStock()); } } tearDown(); } }