diff --git a/src/main/java/account/Portfolio.java b/src/main/java/account/Portfolio.java index 3c7dda6..f708cc0 100644 --- a/src/main/java/account/Portfolio.java +++ b/src/main/java/account/Portfolio.java @@ -1,18 +1,22 @@ package account; import org.decimal4j.util.DoubleRounder; -import stocks.StockEnum; +import stocks.Stock; +import stocks.Transaction; +import utilities.Console; +import utilities.Messages; + +import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; public class Portfolio { - private Map portfolio; + private ArrayList mainPortfolio; + Console console = new Console(System.in,System.out); private Double buyingPower; private Double currentPortfolioValue; public Portfolio() { - this.portfolio = new HashMap<>(); + this.mainPortfolio = new ArrayList<>(); this.buyingPower = 2500.00; this.currentPortfolioValue = 0.00; } @@ -25,84 +29,84 @@ public Double getCurrentPortfolioValue() { return currentPortfolioValue + buyingPower; } - public boolean addStockToBasePortfolio(StockEnum stock, Integer numberOfShares){ - double costOfShares = stock.getOpen() * numberOfShares; - if (costOfShares < buyingPower){ - if(portfolio.containsKey(stock)){ - portfolio.replace(stock, portfolio.get(stock),portfolio.get(stock) + numberOfShares); - } else { - portfolio.put(stock,numberOfShares); + public void addStockToPortfolio(Stock stock){ + mainPortfolio.add(stock); + } + + public void purchaseStock(String stockSymbol, String month, Integer numOfShares){ + Double costOfPurchase = DoubleRounder.round(Stock.checkStockPrice(stockSymbol,month) * numOfShares,2); + if(costOfPurchase < buyingPower){ + if(checkToSeeIfOwnStock(stockSymbol)){ + getStockFromPortfolio(stockSymbol).addTransaction(Transaction.makeTransaction(stockSymbol,month,numOfShares)); + } else { + //TODO resolve way to get name for stock per symbol + Stock stock = new Stock(stockSymbol,"TempName"); + stock.addTransaction(Transaction.makeTransaction(stockSymbol,month,numOfShares)); + addStockToPortfolio(stock); + } + buyingPower = buyingPower - costOfPurchase; + } else{ + console.println(Messages.notEnough); } - currentPortfolioValue = currentPortfolioValue + DoubleRounder.round((costOfShares),2); - buyingPower = DoubleRounder.round((buyingPower - costOfShares),2); - return true; - } else { - return false; - } } - public Double getEquityOfShare(String stock){ - for (Map.Entry s : portfolio.entrySet()) { - if (stock.equalsIgnoreCase(String.valueOf(s.getKey()))){ - return DoubleRounder.round((s.getKey().getOpen() * s.getValue()),2); + public Boolean checkToSeeIfOwnStock(String stockSymbol){ + Boolean result = false; + for (Stock s : mainPortfolio) { + if(s.symbol.equalsIgnoreCase(stockSymbol)){ + result = true; + break; } } - return null; + return result; } - public Integer getNumberOfShares(String stock){ - for(Map.Entry s : portfolio.entrySet()){ - if (stock.equalsIgnoreCase(String.valueOf(s.getKey()))){ - return s.getValue(); + public Stock getStockFromPortfolio(String stockSymbol){ + for (Stock s: mainPortfolio) { + if(s.symbol.equalsIgnoreCase(stockSymbol)){ + return s; } } return null; } - public Double getPortfolioDiversityOfShare(String stock){ - Double result = 0.00; - Double equityOfShare = getEquityOfShare(stock); - if(!stock.equalsIgnoreCase("cash")){ - result = DoubleRounder.round ((equityOfShare/getCurrentPortfolioValue()),2); - }else{ - result = DoubleRounder.round ((getBuyingPower()/getCurrentPortfolioValue()),2); + public void updateCurrentPortfolioValue(String month){ + Double newCurrentValue = 0.0; + for (Stock s: mainPortfolio) { + s.updateCurrentStockPrice(s.symbol,month); + newCurrentValue += getEquityOfStock(s); } - - return result; + currentPortfolioValue = newCurrentValue; } - public Double getDiversityPercentage(String stock){ - return (getPortfolioDiversityOfShare(stock)*100); + public Double getEquityOfStock(Stock stock){ + return DoubleRounder.round((stock.getCurrentStockPrice() * stock.getTotalNumOfShares()),2); } - - public String getPositionOfShare(String stock){ - StockEnum currentStock = getStock(stock); + public String getPositionOfStock(String stockSymbol){ StringBuilder builder = new StringBuilder(); - builder.append("****YOUR POSITION****") - .append(String.format("\nSymbol = %s\nShares = %d\nEquity = %.2f\nDiversity = %.2f", - currentStock.getSymbol(), getNumberOfShares(stock),getEquityOfShare(stock),getDiversityPercentage(stock))); - builder.append("%"); + Stock stock = getStockFromPortfolio(stockSymbol); + builder.append("Name : ") + .append(stock.name) + .append("\nSymbol : ") + .append(stock.symbol) + .append("\nNumber of Shares : ") + .append(stock.totalNumOfShares) + .append("\nCurrent Price : ") + .append(stock.currentStockPrice) + .append("\nEquity : ") + .append(stock.valueOfPosition); return builder.toString(); } - private StockEnum getStock(String stock){ - for (Map.Entry s: portfolio.entrySet()){ - if (String.valueOf(s.getKey()).equalsIgnoreCase(stock)){ - return s.getKey(); - } - } - return null; - } - - public String getAllPositions(){ + public String getAllPositionsFromPortfolio(){ StringBuilder builder = new StringBuilder(); - for (Map.Entry s: portfolio.entrySet()) { - builder.append(getPositionOfShare(String.valueOf(s.getKey()))) + for (Stock s : mainPortfolio) { + builder.append("*******************") + .append("\n") + .append(getPositionOfStock(s.symbol)) .append("\n"); } return builder.toString(); } - - } diff --git a/src/main/java/sql/SqlController.java b/src/main/java/sql/SqlController.java index 8c778aa..e722dc2 100644 --- a/src/main/java/sql/SqlController.java +++ b/src/main/java/sql/SqlController.java @@ -22,7 +22,6 @@ public static void connectSqlServer(){ System.exit(0); } System.out.println("Database still open"); - } public static void insertStock(){ @@ -43,6 +42,7 @@ public static void insertStock(){ public static TransactionMeta getStock(String stockSymbol, String month){ TransactionMeta.TransactionMetaBuilder builder = new TransactionMeta.TransactionMetaBuilder(); + connectSqlServer(); try{ Statement statement = connection.createStatement(); String sql = "SELECT * FROM " + stockSymbol + diff --git a/src/main/java/stocks/Stock.java b/src/main/java/stocks/Stock.java index 00d38df..d80d44b 100644 --- a/src/main/java/stocks/Stock.java +++ b/src/main/java/stocks/Stock.java @@ -1,5 +1,8 @@ package stocks; +import org.decimal4j.util.DoubleRounder; +import sql.SqlController; + import java.util.ArrayList; import java.util.List; @@ -38,12 +41,19 @@ public String getInfo(){ return info; } - //TODO - CONNECT TO DB PER DATE public Double getCurrentStockPrice(){ return currentStockPrice; } - //TODO - CONNECT TO DB PER DATE + public void updateCurrentStockPrice(String stockSymbol,String month){ + currentStockPrice = checkStockPrice(stockSymbol,month); + valueOfPosition = DoubleRounder.round(totalNumOfShares * currentStockPrice,2); + } + + public static Double checkStockPrice(String stockSymbol,String month){ + return SqlController.getStock(stockSymbol,month).getClose(); + } + public Double getValueOfPosition(){ return valueOfPosition; } diff --git a/src/main/java/stocks/Transaction.java b/src/main/java/stocks/Transaction.java index c7e0656..1eb6001 100644 --- a/src/main/java/stocks/Transaction.java +++ b/src/main/java/stocks/Transaction.java @@ -1,5 +1,6 @@ package stocks; +import org.decimal4j.util.DoubleRounder; import sql.SqlController; public class Transaction { @@ -28,13 +29,11 @@ public Double getCostPerShare(){ } public Double calculateTransactionTotal(){ - return costPerShare * numOfShare; + return DoubleRounder.round(costPerShare * numOfShare,2); } - public Transaction makeTransaction(){ - SqlController.connectSqlServer(); - TransactionMeta.TransactionMetaBuilder builder = TransactionMeta.TransactionMetaBuilder.newInstance(); - - return null; + public static Transaction makeTransaction(String stockSymbol,String month,Integer numOfShares){ + TransactionMeta transactionMeta = SqlController.getStock(stockSymbol,month); + return new Transaction(transactionMeta,numOfShares); } } diff --git a/src/main/java/utilities/Messages.java b/src/main/java/utilities/Messages.java index cc26fc7..a82aabd 100644 --- a/src/main/java/utilities/Messages.java +++ b/src/main/java/utilities/Messages.java @@ -6,6 +6,7 @@ public class Messages { public static String enterLastName = "Please enter your last name."; public static String startingGuide = "Lets get you started!\nWe have created a basic portfolio for with a buying power of $2500.\nUse these funds to purchase stocks from the list below."; public static String chooseNum = "Choose a number to make a selection:"; + public static String notEnough = "Sorry, you don't have enough funds to make that purchase"; @@ -31,4 +32,5 @@ public static String startingStocks(){ } + } diff --git a/src/test/java/account/PortfolioTest.java b/src/test/java/account/PortfolioTest.java index 9a1286c..8474bce 100644 --- a/src/test/java/account/PortfolioTest.java +++ b/src/test/java/account/PortfolioTest.java @@ -3,10 +3,9 @@ import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; -import stocks.StockEnum; -import stocks.StockEnumTest; -import java.util.logging.Level; +import stocks.Stock; +import stocks.Transaction; import java.util.logging.Logger; public class PortfolioTest { @@ -19,90 +18,70 @@ public void setUP(){ portfolio = new Portfolio(); } - @Test - public void addSingleStockTest(){ - assertTrue(portfolio.addStockToBasePortfolio(StockEnum.APPLE,4)); - assertEquals(2500.00, portfolio.getCurrentPortfolioValue(), 0.00); - assertEquals(2134.80, portfolio.getBuyingPower(), 0.00); - } @Test - public void addStockFailTest(){ - assertFalse(portfolio.addStockToBasePortfolio(StockEnum.APPLE,900)); + public void checkToSeeIfOwnStockTest(){ + Stock stock = new Stock("MSFT", "Microsoft"); + Transaction transaction = Transaction.makeTransaction("Test","_2020-03",10); + stock.addTransaction(transaction); + portfolio.addStockToPortfolio(stock); + assertTrue(portfolio.checkToSeeIfOwnStock("MSFT")); } @Test - public void addMultipleStocks(){ - portfolio.addStockToBasePortfolio(StockEnum.MICROSOFT,5); - portfolio.addStockToBasePortfolio(StockEnum.APPLE,5); - portfolio.addStockToBasePortfolio(StockEnum.JPMORGANCHASE,5); - Double expected = 2500.00; - Double actual = portfolio.getCurrentPortfolioValue(); + public void getEquityOfStockTest(){ + Stock stock = new Stock("Test", "Microsoft"); + Transaction transaction = Transaction.makeTransaction("Test","_2020-03",10); + stock.addTransaction(transaction); + portfolio.addStockToPortfolio(stock); + stock.updateCurrentStockPrice("Test", "_2020-03"); + Integer expectedNumOfShares = 10; + Integer actualNumOfShares = stock.getTotalNumOfShares(); + Double expected = 1457.00; + Double actual = portfolio.getEquityOfStock(portfolio.getStockFromPortfolio("Test")); + assertEquals(expectedNumOfShares,actualNumOfShares); assertEquals(expected,actual); - assertEquals(1790.80, portfolio.getBuyingPower(), 0.0); } @Test - public void getEquityOfShareTest(){ - portfolio.addStockToBasePortfolio(StockEnum.MICROSOFT,5); - portfolio.addStockToBasePortfolio(StockEnum.APPLE,5); - portfolio.addStockToBasePortfolio(StockEnum.JPMORGANCHASE,5); - Double expected = 153.35; - Double actual = portfolio.getEquityOfShare("jpmorganchase"); - assertEquals(expected,actual); + public void purchaseStockTest(){ + assertFalse(portfolio.checkToSeeIfOwnStock("test")); + portfolio.purchaseStock("Test","_2020-03", 10); + assertTrue(portfolio.checkToSeeIfOwnStock("test")); + portfolio.updateCurrentPortfolioValue("_2020-03"); + Double expectedBuyingPower = 1043.00; + Double actualBuyingPower = portfolio.getBuyingPower(); + Double expectedPortfolioValue = 2500.00; + Double actualPortfolioValue = portfolio.getCurrentPortfolioValue(); + assertEquals(expectedPortfolioValue,actualPortfolioValue); + assertEquals(expectedBuyingPower,actualBuyingPower); } @Test - public void numberOfSharesTest(){ - portfolio.addStockToBasePortfolio(StockEnum.MICROSOFT,5); - portfolio.addStockToBasePortfolio(StockEnum.APPLE,5); - portfolio.addStockToBasePortfolio(StockEnum.JPMORGANCHASE,10); - Integer expected = 10; - Integer actual = portfolio.getNumberOfShares("jpmorganchase"); + public void getPositionOfStock(){ + Stock stock = new Stock("Test", "Microsoft"); + Transaction transaction = Transaction.makeTransaction("Test","_2020-03",10); + stock.addTransaction(transaction); + portfolio.addStockToPortfolio(stock); + portfolio.updateCurrentPortfolioValue("_2020-03"); + String expected = "Name : Microsoft\nSymbol : Test\nNumber of Shares : 10\nCurrent Price : 145.7\nEquity : 1457.0"; + String actual = portfolio.getPositionOfStock("Test"); assertEquals(expected,actual); } @Test - public void currentPortfolioValueTest(){ - portfolio.addStockToBasePortfolio(StockEnum.MICROSOFT,5); - portfolio.addStockToBasePortfolio(StockEnum.APPLE,5); - portfolio.addStockToBasePortfolio(StockEnum.JPMORGANCHASE,10); - Double expected = 2500.00; - Double actual = portfolio.getCurrentPortfolioValue(); - assertEquals(expected,actual); - } - - - @Test - public void portfolioDiversityOfShareTest(){ - portfolio.addStockToBasePortfolio(StockEnum.MICROSOFT,5); - portfolio.addStockToBasePortfolio(StockEnum.APPLE,5); - portfolio.addStockToBasePortfolio(StockEnum.JPMORGANCHASE,5); - assertEquals(0.06, portfolio.getPortfolioDiversityOfShare("jpmorganchase"), 0.00); - assertEquals(0.04, portfolio.getPortfolioDiversityOfShare("microsoft"), 0.00); - assertEquals(0.18, portfolio.getPortfolioDiversityOfShare("Apple"), 0.00); - assertEquals(0.72, portfolio.getPortfolioDiversityOfShare("cash"), 0.00); - logger.log(Level.INFO, portfolio.getPositionOfShare("Apple")); - } - - @Test - public void diversityPercentageTest(){ - portfolio.addStockToBasePortfolio(StockEnum.MICROSOFT,5); - portfolio.addStockToBasePortfolio(StockEnum.APPLE,5); - portfolio.addStockToBasePortfolio(StockEnum.JPMORGANCHASE,5); - assertEquals(18.0, portfolio.getDiversityPercentage("Apple"),0.00); - } - - @Test - public void getAllPositionsTest(){ - portfolio.addStockToBasePortfolio(StockEnum.MICROSOFT,5); - portfolio.addStockToBasePortfolio(StockEnum.APPLE,5); - portfolio.addStockToBasePortfolio(StockEnum.JPMORGANCHASE,5); - logger.log(Level.INFO, portfolio.getAllPositions()); + public void getPositionOfAllStock(){ + Stock stock = new Stock("test", "Microsoft"); + Transaction transaction = Transaction.makeTransaction("test","_2020-03",10); + stock.addTransaction(transaction); + Stock stock2 = new Stock("test2", "Apple"); + Transaction transaction2 = Transaction.makeTransaction("test2","_2020-03",4); + stock.addTransaction(transaction); + stock2.addTransaction(transaction2); + portfolio.addStockToPortfolio(stock); + portfolio.addStockToPortfolio(stock2); + portfolio.updateCurrentPortfolioValue("_2020-03"); + System.out.println(portfolio.getAllPositionsFromPortfolio()); } - - - - } diff --git a/src/test/java/controller/ApiControllerTest.java b/src/test/java/controller/ApiControllerTest.java index d004f1f..28b270b 100644 --- a/src/test/java/controller/ApiControllerTest.java +++ b/src/test/java/controller/ApiControllerTest.java @@ -2,10 +2,15 @@ import org.junit.Test; +import java.util.logging.Level; +import java.util.logging.Logger; + import static org.junit.Assert.assertEquals; public class ApiControllerTest { + Logger logger = Logger.getLogger(ApiControllerTest.class.getName()); + @Test public void testCreateApiQuery(){ String symbol = "msft"; @@ -18,9 +23,9 @@ public void testCreateApiQuery(){ // IMPORTANT! This test makes calls to the API, change the symbol to retrieve different stock tickers! @Test public void testFetchApiQuery(){ - String symbol = "HD"; + String symbol = "AAPL"; String resultOfCall = ApiController.fetchApiQuery(ApiController.createApiQuery(symbol)); - System.out.println(resultOfCall); + logger.log(Level.INFO,resultOfCall); } } diff --git a/src/test/java/sql/SqlControllerTest.java b/src/test/java/sql/SqlControllerTest.java index a316be2..fec62d2 100644 --- a/src/test/java/sql/SqlControllerTest.java +++ b/src/test/java/sql/SqlControllerTest.java @@ -14,8 +14,7 @@ public void connectionTest(){ @Test public void getStockTest(){ - SqlController.connectSqlServer(); - TransactionMeta stock = SqlController.getStock("msft", "_2020-03"); + TransactionMeta stock = SqlController.getStock("test", "_2020-03"); Integer actual = stock.getVolume(); Integer expected = 636200296; assertEquals(actual, expected); diff --git a/src/test/java/stocks/StockTest.java b/src/test/java/stocks/StockTest.java index 91deede..b052287 100644 --- a/src/test/java/stocks/StockTest.java +++ b/src/test/java/stocks/StockTest.java @@ -93,8 +93,40 @@ public void getTransactionTest(){ } @Test -// @Test(expected = NullPointerException.class) public void getTransactionTest2(){ test.getTransaction(expectedDate); } + + @Test + public void updateCurrentStockPriceTest(){ + test.currentStockPrice = 0.0; + test.updateCurrentStockPrice("test","_2020-03"); + Double expected = 145.70; + Double actual = test.getCurrentStockPrice(); + assertEquals(expected,actual); + + } + + @Test + public void getValueOfPositionTest(){ + test.currentStockPrice = 0.0; + test.addTransaction(transaction); + test.updateCurrentStockPrice("test","_2020-03"); + Double expected = 437.10; + Double actual = test.getValueOfPosition(); + assertEquals(expected,actual); + } + + @Test + public void addTransactionCallingServerTest(){ + test.addTransaction(Transaction.makeTransaction("test","_2020-03",10)); + test.updateCurrentStockPrice("test","_2020-03"); + Integer expectedNumOfShares = 10; + Integer actualNumOfShares = test.getTotalNumOfShares(); + Double expectedValOfPosition = 1457.00; + Double actualValOfPosition = test.getValueOfPosition(); + assertEquals(expectedNumOfShares,actualNumOfShares); + assertEquals(expectedValOfPosition,actualValOfPosition); + } + } diff --git a/src/test/java/stocks/TransactionTest.java b/src/test/java/stocks/TransactionTest.java index c032365..20e14a7 100644 --- a/src/test/java/stocks/TransactionTest.java +++ b/src/test/java/stocks/TransactionTest.java @@ -49,4 +49,26 @@ public void calculateTransactionTest(){ assertEquals(expectedTotal, actualTotal); } + + @Test + public void makeTransactionTest(){ + Transaction transaction = Transaction.makeTransaction("Test","_2020-03",10); + String expected = "_2020-03"; + String actual = transaction.getDateOfTrade(); + assertEquals(expected,actual); + } + + @Test + public void makeTransactionDetailsTest(){ + Transaction transaction = Transaction.makeTransaction("Test","_2020-03",10); + String expectedDate = "_2020-03"; + String actualDate = transaction.getDateOfTrade(); + Double expectedCostPerShare = 145.70; + Double actualCostPerShare = transaction.getCostPerShare(); + Double expectedTransactionTotal = 1457.00; + Double actualTransactionTotal = transaction.calculateTransactionTotal(); + assertEquals(expectedDate,actualDate); + assertEquals(expectedCostPerShare,actualCostPerShare); + assertEquals(expectedTransactionTotal,actualTransactionTotal); + } } \ No newline at end of file