diff options
Diffstat (limited to 'src')
3 files changed, 118 insertions, 18 deletions
diff --git a/src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java b/src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java index 0a19bcb..0ef87c3 100644 --- a/src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java +++ b/src/main/java/edu/brown/cs/student/term/profit/ProfitCalculation.java @@ -19,6 +19,11 @@ import java.sql.PreparedStatement;  import java.sql.ResultSet;  import java.sql.SQLException;  import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.LinkedList; +import java.util.HashMap; +import java.util.List; +import java.util.Map;  import java.util.*;  public class ProfitCalculation { @@ -243,11 +248,12 @@ public class ProfitCalculation {      if (currentStockPrices.containsKey(ticker)) {        return currentStockPrices.get(ticker);      } else { +      SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");        String url = "https://data.alpaca.markets/v1/bars/"            + "day?"            + "symbols=" + ticker -          + "&start=" + startTime -          + "&end=" + endTime; +          + "&start=" + localDateFormat.format(startTime) +          + "&end=" + localDateFormat.format(endTime);        HttpClient client = HttpClient.newHttpClient();        HttpRequest request = HttpRequest.newBuilder() @@ -293,6 +299,11 @@ public class ProfitCalculation {    }    public List<StockHolding> getHoldingsList() { +    if (conn == null) { +      System.out.println("ERROR: No database connection"); +      return new LinkedList<>(); +    } +      if (!tablesFilled) {        organizeOrders();        getRealizedGains(); @@ -325,11 +336,12 @@ public class ProfitCalculation {     * return percent change in SPY (SP 500) over the time period.     */    public double compareToSP500() { +    SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");      String url = "https://data.alpaca.markets/v1/bars/"          + "day?"          + "symbols=SPY" -        + "&start=" + startTime.toString() + "T09:30:00-04:00" -        + "&end=" + endTime.toString() + "T09:30:00-04:00"; +        + "&start=" + localDateFormat.format(startTime) +        + "&end=" + localDateFormat.format(endTime);      HttpClient client = HttpClient.newHttpClient();      HttpRequest request = HttpRequest.newBuilder() @@ -365,6 +377,10 @@ public class ProfitCalculation {     */    public Map<Integer, Double> getProfitMap() {      Map<Integer, Double> profitMap = new HashMap<>(); +    if (conn == null) { +      System.out.println("ERROR: no database connection"); +      return profitMap; +    }      try {        PreparedStatement prep;        prep = @@ -402,15 +418,4 @@ public class ProfitCalculation {      tablesFilled = false;    } -  public void setConnection(String filename) throws SQLException, ClassNotFoundException { - -    // Initialize the database connection, turn foreign keys on -    Class.forName("org.sqlite.JDBC"); -    String urlToDB = "jdbc:sqlite:" + filename; -    conn = DriverManager.getConnection(urlToDB); - -    Statement stat = conn.createStatement(); -    stat.executeUpdate("PRAGMA foreign_keys=ON;"); -  } -  } diff --git a/src/main/java/edu/brown/cs/student/term/profit/StockHolding.java b/src/main/java/edu/brown/cs/student/term/profit/StockHolding.java index f7924f2..5edb5f7 100644 --- a/src/main/java/edu/brown/cs/student/term/profit/StockHolding.java +++ b/src/main/java/edu/brown/cs/student/term/profit/StockHolding.java @@ -1,11 +1,21 @@  package edu.brown.cs.student.term.profit; +/** + * class to map holding info for JSON. + */  public class StockHolding {    private String ticker;    private Double realizedGain;    private Double unrealizedGain;    private int shares; +  /** +   * constructor. +   * @param ticker - stock. +   * @param realizedGain realized gain. +   * @param unrealizedGain unrealized gain. +   * @param shares - number of shares +   */    public StockHolding(String ticker, Double realizedGain, Double unrealizedGain, int shares) {      this.ticker = ticker;      this.realizedGain = realizedGain; @@ -13,11 +23,27 @@ public class StockHolding {      this.shares = shares;    } +  /** +   * getter method. +   * @return realized gain. +   */    public Double getRealizedGain() {      return realizedGain;    } +  /** +   * getter method. +   * @return unrealized gain. +   */    public Double getUnrealizedGain() {      return unrealizedGain;    } + +  /** +   * getter method for testing. +   * @return shares. +   */ +  public int getShares() { +    return shares; +  }  }
\ No newline at end of file diff --git a/src/test/java/edu/brown/cs/student/ProfitCalculationTest.java b/src/test/java/edu/brown/cs/student/ProfitCalculationTest.java index a4baa53..1291245 100644 --- a/src/test/java/edu/brown/cs/student/ProfitCalculationTest.java +++ b/src/test/java/edu/brown/cs/student/ProfitCalculationTest.java @@ -13,6 +13,8 @@ import org.junit.Before;  import org.junit.Test;  import java.time.LocalDate; +import java.util.HashMap; +import java.util.LinkedList;  import java.util.List;  import java.sql.Date;  import java.time.Instant; @@ -36,7 +38,7 @@ public class ProfitCalculationTest {    @Before    public void setUp() {      try { -      db = new DatabaseQuerier("data/lil_mock.sqlite3"); +      db = new DatabaseQuerier("data/profit_testing.sqlite3");      } catch (Exception e) {        System.out.println("DBQuerier Test, couldn't connect to db???");      } @@ -59,16 +61,83 @@ public class ProfitCalculationTest {      assertEquals(trade.get(0).getUnrealizedGain(), 3842.25, .25);      assertEquals(trade.get(0).getRealizedGain(), 0, .01); +    //just sell +    profitCalculation = +        new ProfitCalculation(DatabaseQuerier.getConn(), "SELL", new Date(1518010558000l), +            new Date(1618698807000l)); +    trade = profitCalculation.getHoldingsList(); +    assertTrue(trade.isEmpty()); +    assertEquals(profitCalculation.calculateGains(), 0, 0.001); + +    tearDown();    } -  public void checkAPICalls() { +  @Test +  public void otherBuySellCases() { +    setUp(); +    //buy and sell at same timestamp +    ProfitCalculation profitCalculation = +        new ProfitCalculation(DatabaseQuerier.getConn(), "concurrentBS", new Date(1518010558000l), +            new Date(1715629591000l)); + +    assertEquals(profitCalculation.getProfitMap().get(100), 1, .01); + +    //buys at multiple prices +    profitCalculation = +        new ProfitCalculation(DatabaseQuerier.getConn(), "mulitpleBuyPrices", +            new Date(1518010558000l), +            new Date(1715629591000l)); +    assertEquals(profitCalculation.getProfitMap().get(101), 1, .01); +    assertEquals(profitCalculation.getMoneyInput(), 3750, .01); +    assertEquals(profitCalculation.getHoldingsList().get(0).getRealizedGain(), 3750, 0.01); + +    //left over holdings +    profitCalculation = +        new ProfitCalculation(DatabaseQuerier.getConn(), "dontSellAll", +            new Date(1518010558000l), +            new Date(1715629591000l)); + +    assertEquals(profitCalculation.getHoldingsList().get(0).getShares(), 25, .01); +    tearDown(); +  } + +  @Test +  public void testAPICalls() {      ProfitCalculation profitCalculation =          new ProfitCalculation(DatabaseQuerier.getConn(), "Don", new Date(1618234200000l), -            new Date(1618814264000l)); +            new Date(1618703800000l));      //check sp500 calculation. 411.28 to 417.30      assertEquals(profitCalculation.compareToSP500(), .01464, .001); +    tearDown(); + +  } + +  @Test +  public void databaseAndConnectionIssues() { +    //no database connection +    ProfitCalculation profitCalculation = +        new ProfitCalculation(null, "Don", new Date(1518010558000l), +            new Date(1618698807000l)); +    assertEquals(profitCalculation.getProfitMap(), new HashMap<>()); + +    assertEquals(profitCalculation.getHoldingsList(), new LinkedList<>()); + +    setUp(); +    //invalid person +    profitCalculation = +        new ProfitCalculation(DatabaseQuerier.getConn(), "1234", new Date(1518010558000l), +            new Date(1618698807000l)); +    assertEquals(profitCalculation.getHoldingsList(), new LinkedList<>()); + + +    //invalid stock ticker +    profitCalculation = +        new ProfitCalculation(DatabaseQuerier.getConn(), "invalidTicker", new Date(1518010558000l), +            new Date(1618698807000l)); +    assertEquals(profitCalculation.getHoldingsList().get(0).getRealizedGain(), 0, .01); +    assertEquals(profitCalculation.getHoldingsList().get(0).getUnrealizedGain(), 0, .01);    }  | 
