Merge MKDT_UNITTESTS
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -11,6 +11,8 @@ MarketData/MarketData/*.log
|
||||
MarketData/MarketData/marketdata.log
|
||||
MarketData/MarketData/logs/marketdata_echo.log
|
||||
MarketData/MarketData/logs/marketdata_loadheadlineswatchlist.log
|
||||
MarketDataUnitTests/bin/**
|
||||
MarketDataUnitTests/obj/**
|
||||
Translate/Translate/bin/**
|
||||
Translate/Translate/obj/**
|
||||
eNavigator/eNavigatorUI/.vscode/chrome-debug/**
|
||||
|
||||
26
.vscode/launch.json
vendored
26
.vscode/launch.json
vendored
@@ -39,6 +39,28 @@
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
|
||||
{
|
||||
"name": ".NET Core Launch (unit tests)",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
"program": "/usr/local/bin/dotnet",
|
||||
"args": ["test"],
|
||||
"cwd": "${workspaceFolder}/MarketDataUnitTests",
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false
|
||||
},
|
||||
{
|
||||
"name": ".NET Core Launch (debug unit tests)",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
"program": "${workspaceFolder}/MarketDataUnitTests/bin/Debug/net8.0/MarketDataUnitTests.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false,
|
||||
"internalConsoleOptions": "openOnSessionStart"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDataServer", "MarketD
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IPMonitor", "IPMonitor\IPMonitor.csproj", "{EAC3FB58-9112-4446-98BF-DC33F96357B5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MarketDataUnitTests", "MarketDataUnitTests\MarketDataUnitTests.csproj", "{EAC3FB58-9112-4446-98BF-DC33F96357B5}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
|
||||
@@ -333,9 +333,9 @@ namespace MarketData.Helper
|
||||
if(null!=httpNetResponse)httpNetResponse.Dispose();
|
||||
}
|
||||
}
|
||||
// ***************************************************************************************************************************************************************************************
|
||||
// ************************************************************************** S P L I T S F R O M E O D D A T A **********************************************************************
|
||||
// ***************************************************************************************************************************************************************************************
|
||||
// ***************************************************************************************************************************************************************************************
|
||||
// ************************************************************************** S P L I T S F R O M E O D D A T A **********************************************************************
|
||||
// ***************************************************************************************************************************************************************************************
|
||||
public static Splits GetSplits()
|
||||
{
|
||||
HttpNetResponse httpNetResponse = null;
|
||||
@@ -386,7 +386,7 @@ namespace MarketData.Helper
|
||||
if (null != httpNetResponse) httpNetResponse.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************************************************************************************************************************
|
||||
// ************************************************************************** G D P P E R C A P I T A D A T A W O R L D B A N K *************************************************
|
||||
// ***************************************************************************************************************************************************************************************
|
||||
@@ -1916,7 +1916,7 @@ namespace MarketData.Helper
|
||||
WebProxy webProxy=HttpNetRequest.GetProxy("GetConsumerPriceIndices");
|
||||
strRequest=sb.ToString();
|
||||
MDTrace.WriteLine(LogLevel.DEBUG, String.Format("GetConsumerPriceIndices: {0}", strRequest));
|
||||
httpNetResponse=HttpNetRequest.GetRequestNoEncodingV5C(strRequest,"www.bls.gov",300000,webProxy);
|
||||
httpNetResponse=HttpNetRequest.GetRequestNoEncodingV5C(strRequest,"www.bls.gov", 300000,webProxy);
|
||||
if(!httpNetResponse.Success)
|
||||
{
|
||||
MDTrace.WriteLine(LogLevel.DEBUG,String.Format("GetConsumerPriceIndices Request:{0} failed with status {1}",httpNetResponse.Request,httpNetResponse.StatusCode));
|
||||
|
||||
@@ -141,6 +141,7 @@ namespace MarketData.Utils
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
//"Aug 23, 2013"
|
||||
public static DateTime ParseValueDateTimeMonthFormat(String strText)
|
||||
{
|
||||
@@ -158,6 +159,7 @@ namespace MarketData.Utils
|
||||
return DateTime.Parse("01-01-0001");
|
||||
}
|
||||
}
|
||||
|
||||
// "Apr. 04"
|
||||
// "1:00pm"
|
||||
public static DateTime ParseValueDateTimeMonth(String strText)
|
||||
@@ -195,7 +197,6 @@ namespace MarketData.Utils
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Sep. 25, 2022 at 4:31 p.m. ET
|
||||
public static DateTime ParseValueDateTimeMonthFormatTZ(String strText)
|
||||
{
|
||||
@@ -249,6 +250,7 @@ namespace MarketData.Utils
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public static double ParseValue(String strText)
|
||||
{
|
||||
double value = double.NaN;
|
||||
|
||||
562
MarketDataUnitTests/MarketDataUnitTestClass.cs
Normal file
562
MarketDataUnitTests/MarketDataUnitTestClass.cs
Normal file
@@ -0,0 +1,562 @@
|
||||
using System.Reflection;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using MarketData.DataAccess;
|
||||
using MarketData.Generator.CMMomentum;
|
||||
using MarketData.Helper;
|
||||
using MarketData.MarketDataModel;
|
||||
using MarketData.Utils;
|
||||
using MarketData;
|
||||
using MarketData.Configuration;
|
||||
using System.Diagnostics;
|
||||
using System.Net.Http.Headers;
|
||||
|
||||
|
||||
// https://www.google.com/search?q=launch.json+for+debugging+c%23+unit+test&client=firefox-b-1-d&sca_esv=f0447ad3867c1f39&ei=OMQHaYOlB9GFwbkPgJbUiAs&ved=0ahUKEwiDocWOrNSQAxXRQjABHQALFbEQ4dUDCBE&uact=5&oq=launch.json+for+debugging+c%23+unit+test&gs_lp=Egxnd3Mtd2l6LXNlcnAiJmxhdW5jaC5qc29uIGZvciBkZWJ1Z2dpbmcgYyMgdW5pdCB0ZXN0MgUQABjvBTIIEAAYgAQYogQyCBAAGKIEGIkFMgUQABjvBUjvFFDdCFjtDXABeAGQAQCYAX6gAdICqgEDMC4zuAEDyAEA-AEBmAIEoALkAsICChAAGLADGNYEGEfCAgoQIRigARjDBBgKwgIIECEYoAEYwwSYAwCIBgGQBgiSBwMxLjOgB_AHsgcDMC4zuAffAsIHBTAuMi4yyAcJ&sclient=gws-wiz-serp
|
||||
|
||||
namespace MarketDataUnitTests;
|
||||
|
||||
[TestClass]
|
||||
public class MarketDataUnitTestClass
|
||||
{
|
||||
private IConfigurationBuilder builder;
|
||||
private IConfiguration configuration;
|
||||
|
||||
public MarketDataUnitTestClass()
|
||||
{
|
||||
builder = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
|
||||
IConfigurationRoot configurationRoot = builder.Build();
|
||||
configuration = configurationRoot;
|
||||
GlobalConfig.Instance.Configuration = configuration;
|
||||
CreateLogging("unittest");
|
||||
}
|
||||
|
||||
private static bool CreateLogging(String task)
|
||||
{
|
||||
if (String.IsNullOrEmpty(task)) return false;
|
||||
task = task.ToLower();
|
||||
MDTrace.LogLevel = LogLevel.DEBUG;
|
||||
String logFolder = "/logs";
|
||||
DateTime currentDate = DateTime.Now;
|
||||
String strLogFile = "marketdata_" + task + ".log";
|
||||
String currentWorkingDirectory = Directory.GetCurrentDirectory();
|
||||
Console.WriteLine($"Current directory is {currentWorkingDirectory}");
|
||||
Utility.EnsureLogFolder(currentWorkingDirectory + logFolder);
|
||||
Utility.ExpireLogs(currentWorkingDirectory + logFolder, 1);
|
||||
Trace.Listeners.Remove("Default");
|
||||
Console.WriteLine($"Adding Trace Listener :{currentWorkingDirectory + logFolder + "/" + strLogFile}");
|
||||
Trace.Listeners.Add(new TextWriterTraceListener(currentWorkingDirectory + logFolder + "/" + strLogFile));
|
||||
MDTrace.WriteLine($"Trace Listener added.");
|
||||
Utility.ShowLogs(currentWorkingDirectory + logFolder);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// public static Price GetLatestPriceBarChart(string symbol);
|
||||
// public static Price GetLatestPriceGoogle(string symbol);
|
||||
// public static Price GetLatestPriceRobinhood(string symbol);
|
||||
|
||||
[TestMethod]
|
||||
public void GetDailyPricesYahooRetrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
DateTime analysisDate = DateTime.Now;
|
||||
DateGenerator dateGenerator = new DateGenerator();
|
||||
analysisDate = dateGenerator.FindPrevBusinessDay(analysisDate);
|
||||
Prices prices = MarketDataHelper.GetDailyPrices(symbol, analysisDate, analysisDate);
|
||||
Assert.IsTrue(null != prices && prices.Count > 0, "No Price");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LatestPriceRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Price price = MarketDataHelper.GetLatestPrice(symbol);
|
||||
|
||||
Assert.IsTrue(null != price && price.IsValid);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LatestPriceGoogleRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Price price = MarketDataHelper.GetLatestPriceGoogle(symbol);
|
||||
|
||||
Assert.IsTrue(null != price && price.IsValid);
|
||||
}
|
||||
|
||||
// The GetLatestPriceYahoo feed may return a price that only contains the previous close.
|
||||
// This can happen after market hours and does not mean that the feed is broken.
|
||||
[TestMethod]
|
||||
public void LatestPriceYahooRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Price price = MarketDataHelper.GetLatestPriceYahoo(symbol);
|
||||
|
||||
Assert.IsTrue(null != price, "No Price from Yahoo");
|
||||
Assert.IsTrue(price.IsValid || !double.IsNaN(price.PrevClose), "The feed is not working.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LatestPriceBarChartRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Price price = MarketDataHelper.GetLatestPriceBarChart(symbol);
|
||||
|
||||
Assert.IsTrue(null != price, "No Price from BarChart");
|
||||
Assert.IsTrue(price.IsValid || !double.IsNaN(price.PrevClose), "The feed is not working.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LatestPriceRobinhoodRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Price price = MarketDataHelper.GetLatestPriceRobinhood(symbol);
|
||||
|
||||
Assert.IsTrue(null != price, "No Price from Robinhood");
|
||||
Assert.IsTrue(price.IsValid || !double.IsNaN(price.PrevClose), "The feed is not working.");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DailyPricesYahoo()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
DateGenerator dateGenerator = new DateGenerator();
|
||||
DateTime lastBusinessDate = DateTime.Now;
|
||||
|
||||
lastBusinessDate = dateGenerator.GetPrevBusinessDay(lastBusinessDate);
|
||||
|
||||
DateTime startDate = lastBusinessDate;
|
||||
DateTime endDate = startDate;
|
||||
|
||||
Prices prices = MarketDataHelper.GetDailyPrices(symbol, startDate, endDate);
|
||||
Assert.IsTrue(null != prices, "No Price from DailyPricesYahoo");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CNNPredictionTest()
|
||||
{
|
||||
String cnnHostName = "10.0.0.240";
|
||||
CMCandidate cmCandidate = new CMCandidate();
|
||||
CMParams cmParams = new CMParams();
|
||||
|
||||
cmParams.UseCNN = true;
|
||||
cmParams.UseCNNHost = "http://" + cnnHostName + ":5000";
|
||||
cmParams.UseCNNDayCount = 270;
|
||||
cmParams.UseCNNRewardPercentDecimal = 0.25;
|
||||
|
||||
cmCandidate.Symbol = "MIDD";
|
||||
cmCandidate.TradeDate = DateTime.Parse("07-01-2024");
|
||||
|
||||
bool result = CMMomentumGenerator.PredictCandidate(cmCandidate, cmParams);
|
||||
|
||||
Assert.IsTrue(result);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void PremarketRetrieval()
|
||||
{
|
||||
PremarketElements premarketElements = MarketDataHelper.GetPremarketData();
|
||||
Assert.IsTrue(null != premarketElements && premarketElements.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ETFHoldingsYahooRetrieval()
|
||||
{
|
||||
String[] etfSymbols = { "JFNNX", "ACWX", "ACES", "BBH" };
|
||||
List<ETFHoldings> results = new List<ETFHoldings>();
|
||||
|
||||
foreach (String etfSymbol in etfSymbols)
|
||||
{
|
||||
ETFHoldings etfHoldings = MarketDataHelper.GetETFHoldings(etfSymbol);
|
||||
if (null != etfHoldings && 0 != etfHoldings.Count)
|
||||
{
|
||||
results.Add(MarketDataHelper.GetETFHoldings(etfSymbol));
|
||||
}
|
||||
try { Thread.Sleep(500); } catch (Exception) {; }
|
||||
}
|
||||
|
||||
bool result = results.Any(x => x != null);
|
||||
|
||||
Assert.IsTrue(result, String.Format("{0} items failed.", etfSymbols.Length));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ConsumerPriceIndexBureauOfLaborStatisticsRetrieval()
|
||||
{
|
||||
PriceIndices priceIndices = MarketDataHelper.GetConsumerPriceIndices();
|
||||
Assert.IsTrue(null != priceIndices && priceIndices.Count > 0);
|
||||
}
|
||||
|
||||
// Yahoo Fundamental feed is very poor quality and lots of misses. It's a last resort.
|
||||
[TestMethod]
|
||||
public void FundamentalYahooRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Fundamental fundamental = MarketDataHelper.GetFundamental(symbol);
|
||||
Assert.IsTrue(null != fundamental);
|
||||
// Assert.IsTrue(!Utility.IsEpoch(fundamental.NextEarningsDate),"NextEarningsDate");
|
||||
// Assert.IsTrue(!double.IsNaN(fundamental.Beta),"Beta");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Low52), "Low52");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.High52), "High52");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Volume), "Volume");
|
||||
// Assert.IsTrue(!double.IsNaN(fundamental.MarketCap),"MarketCap");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.PE), "PE");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.EPS), "EPS");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.PEG), "PEG");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.ReturnOnAssets), "ReturnOnAssets");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.ReturnOnEquity), "ReturnOnEquity");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.TotalCash), "TotalCash");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.TotalDebt), "TotalDebt");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.SharesOutstanding), "SharesOutstanding");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Revenue), "Revenue");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.RevenuePerShare), "RevenuePerShare");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.QtrlyRevenueGrowth), "QtrlyRevenueGrowth");
|
||||
// Assert.IsTrue(!double.IsNaN(fundamental.GrossProfit),"GrossProfit");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.EBITDA), "EBITDA");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.NetIncomeAvailableToCommon), "NetIncomeAvailableToCommon");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.BookValuePerShare), "BookValuePerShare");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.OperatingCashflow), "OperatingCashflow");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.LeveragedFreeCashflow), "LeveragedFreeCashflow");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Equity), "Equity");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.TrailingPE), "TrailingPE");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.EnterpriseValue), "EnterpriseValue");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.EBIT), "EBIT");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.DebtToEquity), "DebtToEquity");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void DividendHistoryRetrieval()
|
||||
{
|
||||
Dictionary<String, bool> items = new Dictionary<String, bool>();
|
||||
String dividendSymbol1 = "AAPL";
|
||||
String dividendSymbol2 = "ZIM";
|
||||
String dividendSymbol3 = "IVR";
|
||||
|
||||
DividendHistory dividendHistory1 = MarketDataHelper.GetDividendHistory(dividendSymbol1);
|
||||
DividendHistory dividendHistory2 = MarketDataHelper.GetDividendHistory(dividendSymbol2);
|
||||
DividendHistory dividendHistory3 = MarketDataHelper.GetDividendHistory(dividendSymbol3);
|
||||
Assert.IsTrue((null != dividendHistory1 && dividendHistory1.Count > 0) ||
|
||||
(null != dividendHistory2 && dividendHistory2.Count > 0) ||
|
||||
(null != dividendHistory3 && dividendHistory3.Count > 0));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void EarningsAnnouncementsaRetrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
EarningsAnnouncements earningsAnnouncements = MarketDataHelper.GetEarningsAnnouncements(symbol);
|
||||
Assert.IsTrue(null != earningsAnnouncements && earningsAnnouncements.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void ZacksRankRetrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
ZacksRank zacksRank = MarketDataHelper.GetZacksRank(symbol);
|
||||
Assert.IsTrue(null != zacksRank && null != zacksRank.Rank);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void GetSplitsRetrieval()
|
||||
{
|
||||
Splits splits = MarketDataHelper.GetSplits();
|
||||
Assert.IsTrue(null != splits && splits.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void GDPPerCapitaRetrieval()
|
||||
{
|
||||
EconomicIndicators economicIndicators = MarketDataHelper.GetGDPPerCapita();
|
||||
Assert.IsTrue(null != economicIndicators && economicIndicators.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void LatestAnalystRatingsRetrieval()
|
||||
{
|
||||
AnalystRatings analystRatings = MarketDataHelper.GetLatestAnalystRatings();
|
||||
Assert.IsTrue(null != analystRatings && analystRatings.Count > 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This is not working because the website has changed formats
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
[Ignore]
|
||||
public void AnalystRatingsMarketBeatRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
AnalystRatings analystRatings = MarketDataHelper.GetAnalystRatingsMarketBeat(symbol);
|
||||
Assert.IsTrue(null != analystRatings && analystRatings.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SECCIKRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
String strCik = MarketDataHelper.GetCIK(symbol);
|
||||
Assert.IsTrue(null != strCik);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void SECFilingsRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
String strCik = MarketDataHelper.GetCIK(symbol);
|
||||
Assert.IsTrue(null != strCik);
|
||||
SECFilings secFilings = MarketDataHelper.GetSECFilings(symbol, strCik, 1);
|
||||
Assert.IsTrue(null != secFilings && secFilings.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void YieldCurveRetrieval()
|
||||
{
|
||||
DateGenerator dateGenerator = new DateGenerator();
|
||||
DateTime analysisDate = dateGenerator.FindPrevBusinessDay(DateTime.Now);
|
||||
YieldCurve yieldCurve = MarketDataHelper.GetYieldCurve(analysisDate.Year);
|
||||
Assert.IsTrue(null != yieldCurve && yieldCurve.Count > 0);
|
||||
Assert.IsTrue(yieldCurve[yieldCurve.Count - 1].Date.Month.Equals(analysisDate.Month));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void InsiderTransactionRetrieval()
|
||||
{
|
||||
DateTime now = DateTime.Now;
|
||||
DateGenerator dateGenerator = new DateGenerator();
|
||||
InsiderTransactions insiderTransactions = InsiderTransactionDA.GetLatestInsiderTransactions();
|
||||
Assert.IsTrue(null != insiderTransactions && insiderTransactions.Count > 0);
|
||||
InsiderTransaction insiderTransaction = insiderTransactions[0];
|
||||
int daysBetween = dateGenerator.DaysBetween(now, insiderTransaction.TransactionDate) + 1;
|
||||
Assert.IsTrue(daysBetween < 10);
|
||||
InsiderTransactions latestTransactions = MarketDataHelper.GetInsiderTransactions(insiderTransaction.Symbol, daysBetween);
|
||||
Assert.IsTrue(null != latestTransactions && latestTransactions.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void CompanyProfileRetrieval()
|
||||
{
|
||||
String symbol = "MOD";
|
||||
CompanyProfile companyProfile = MarketDataHelper.GetCompanyProfile(symbol);
|
||||
Assert.IsTrue(null != companyProfile);
|
||||
}
|
||||
|
||||
// Test all feeds
|
||||
[TestMethod]
|
||||
public void HeadlinesRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Headlines companyHeadlines = HeadlinesMarketDataHelper.GetHeadlinesEx(symbol);
|
||||
Assert.IsTrue(null != companyHeadlines && companyHeadlines.Count > 0);
|
||||
}
|
||||
|
||||
// Test MarketWatch feed
|
||||
// https://www.marketwatch.com/investing/stock/AAPL?mod=search_symbol
|
||||
/// <summary>
|
||||
/// MarketWatch/BigCharts is no longer working
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
[Ignore]
|
||||
public void HeadlinesMarketWatchRetrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
Headlines companyHeadlines = MarketDataHelper.GetCompanyHeadlinesMarketWatch(symbol);
|
||||
Assert.IsTrue(null != companyHeadlines && companyHeadlines.Count > 0);
|
||||
}
|
||||
|
||||
// Test NASDAQ Headlines feed
|
||||
[TestMethod]
|
||||
public void HeadlinesNASDAQRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Headlines companyHeadlines = MarketDataHelper.GetCompanyHeadlinesNASDAQ(symbol);
|
||||
Assert.IsTrue(null != companyHeadlines && companyHeadlines.Count > 0);
|
||||
}
|
||||
|
||||
// Test SEEKING ALPHA Headlines feed
|
||||
/// <summary>
|
||||
/// SeekingAlpha headlines feed is not working
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
[Ignore]
|
||||
public void HeadlinesSeekingAlphaRetrieval()
|
||||
{
|
||||
String symbol = "GLD";
|
||||
Headlines companyHeadlines = MarketDataHelper.GetCompanyHeadlinesSeekingAlpha(symbol);
|
||||
Assert.IsTrue(null != companyHeadlines && companyHeadlines.Count > 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SeekingAlpha feed is not working
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
[Ignore]
|
||||
public void HeadlinesSeekingAlphaV3Retrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
Headlines companyHeadlines = MarketDataHelper.GetCompanyHeadlinesSeekingAlphaV3(symbol, true);
|
||||
Assert.IsTrue(null != companyHeadlines && companyHeadlines.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void AnalystPriceTargetMarketBeatRetrieval()
|
||||
{
|
||||
String symbol = "MGPI";
|
||||
AnalystPriceTarget analystPriceTarget = MarketDataHelper.GetAnalystPriceTargetMarketBeat(symbol);
|
||||
Assert.IsTrue(null != analystPriceTarget);
|
||||
Assert.IsTrue(!Double.IsNaN(analystPriceTarget.HighTargetPrice));
|
||||
Assert.IsTrue(!Double.IsNaN(analystPriceTarget.LowTargetPrice));
|
||||
Assert.IsTrue(!Double.IsNaN(analystPriceTarget.MeanTargetPrice));
|
||||
Assert.IsTrue(!Double.IsNaN(analystPriceTarget.MedianTargetPrice));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Need to figure out why this is not working
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
public void HistoricalRetrieval()
|
||||
{
|
||||
String symbol = "AAPL";
|
||||
Dictionary<TimeSeriesElement.ElementType, TimeSeriesCollection> timeSeries = MarketDataHelper.GetHistoricalValues(symbol);
|
||||
Assert.IsTrue(null != timeSeries);
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.ROA), "Missing ROA");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.ROIC), "Missing ROIC");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.BVPS), "Missing BVPS");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.Inventory), "Missing Inventory");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.AccountsReceivable), "Missing AccountsReceivable");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.COGS), "Missing COGS");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.OperatingIncome), "Missing OperatingIncome");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.InterestExpense), "Missing InterestExpense");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.TaxRate), "Missing TaxRate");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.Revenue), "Missing Revenue");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.NetIncomeAvailableToCommonShareholders), "Missing NetIncomeAvailableToCommonShareholders");
|
||||
Assert.IsTrue(timeSeries.ContainsKey(TimeSeriesElement.ElementType.OperatingCashflow), "Missing OperatingCashflow");
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void IncomeStatementNASDAQRetrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
List<IncomeStatement> incomeStatements = MarketDataHelper.GetIncomeStatementNASDAQ(symbol, IncomeStatement.PeriodType.Annual);
|
||||
Assert.IsTrue(null != incomeStatements && incomeStatements.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void IncomeStatementFinVizRetrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
List<IncomeStatement> incomeStatements = MarketDataHelper.GetIncomeStatementFinViz(symbol, IncomeStatement.PeriodType.Annual);
|
||||
Assert.IsTrue(null != incomeStatements && incomeStatements.Count > 0);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void BalanceSheetNASDAQRetrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
List<BalanceSheet> balanceSheets = MarketDataHelper.GetBalanceSheetNASDAQ(symbol, BalanceSheet.PeriodType.Annual);
|
||||
Assert.IsTrue(null != balanceSheets && balanceSheets.Count > 0);
|
||||
BalanceSheet balanceSheet = balanceSheets[0];
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.CashAndCashEquivalents), "CashAndCashEquivalents");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.DeferredLongTermLiabilities), "DeferredLongTermLiabilities");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.IntangibleAssets), "IntangibleAssets");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.Inventory), "Inventory");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.LongTermDebt), "LongTermDebt");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.NetCurrentAssetValue), "NetCurrentAssetValue");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.NetFixedAssets), "NetFixedAssets");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.OtherLiabilities), "OtherLiabilities");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.PropertyPlantAndEquipment), "PropertyPlantAndEquipment");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.TotalAssets), "TotalAssets");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.TotalCurrentAssets), "TotalCurrentAssets");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.TotalCurrentLiabilities), "TotalCurrentLiabilities");
|
||||
Assert.IsTrue(!double.IsNaN(balanceSheet.TotalLiabilities), "TotalLiabilities");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Need to figure out why this is not working.
|
||||
/// </summary>
|
||||
[TestMethod]
|
||||
public void CashflowStatementMorningStarRetrieval()
|
||||
{
|
||||
String[] symbols = { "AZEK", "CPRT", "DOCU", "ESTC", "HLNE" };
|
||||
|
||||
Dictionary<String, List<CashflowStatement>> cashflowStatementsDict = new Dictionary<String, List<CashflowStatement>>();
|
||||
|
||||
foreach (String symbol in symbols)
|
||||
{
|
||||
List<CashflowStatement> cashflowStatements = MarketDataHelper.GetCashflowStatement(symbol, CashflowStatement.PeriodType.Annual);
|
||||
if (null == cashflowStatements) continue;
|
||||
cashflowStatementsDict.Add(symbol, cashflowStatements);
|
||||
}
|
||||
|
||||
Assert.IsTrue(cashflowStatementsDict.Count != 0, "Error retrieving cashflow statements.");
|
||||
|
||||
List<String> keys = cashflowStatementsDict.Keys.ToList();
|
||||
|
||||
foreach (String key in keys)
|
||||
{
|
||||
List<CashflowStatement> cashflowStatements = cashflowStatementsDict[key];
|
||||
CashflowStatement cashflowStatement = cashflowStatements[0];
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.DepreciationAndAmortization), $"DepreciationAndAmortization for {key}");
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.DeferredIncomeTaxes), $"DeferredIncomeTaxes for {key}");
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.StockBasedCompensation), $"StockBasedCompensation for {key}");
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.AccountsReceivable), $"AccountsReceivable for {key}");
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.Inventory), $"Inventory for {key}");
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.AccountsPayable), $"AccountsPayable for {key}");
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.AccruedLiabilities), $"AccruedLiabilities for {key}");
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.OperatingCashflow), $"OperatingCashflow for {key}");
|
||||
Assert.IsTrue(!double.IsNaN(cashflowStatement.FreeCashflow), $"FreeCashflow for {key}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[TestMethod]
|
||||
public void CurrencyConversionXERetrieval()
|
||||
{
|
||||
DateGenerator dateGenerator = new DateGenerator();
|
||||
String sourceCurrency = "USD";
|
||||
DateTime analysisDate = DateTime.Now;
|
||||
analysisDate = dateGenerator.FindPrevBusinessDay(analysisDate);
|
||||
CurrencyConversionCollection currencyConversionCollection = MarketDataHelper.GetCurrencyConversion(sourceCurrency, analysisDate);
|
||||
Assert.IsTrue(null != currencyConversionCollection && currencyConversionCollection.Count > 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Need to figure out why we are missing EBITDA, OperatingCashflow, LeveragedFreeCashflow
|
||||
///
|
||||
[TestMethod]
|
||||
public void FundamentalFinVizRetrieval()
|
||||
{
|
||||
String symbol = "MIDD";
|
||||
Fundamental fundamental = MarketDataHelper.GetFundamentalFinViz(symbol);
|
||||
Assert.IsTrue(null != fundamental);
|
||||
Assert.IsTrue(!Utility.IsEpoch(fundamental.NextEarningsDate), "NextEarningsDate");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Beta), "Beta");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Low52), "Low52");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.High52), "High52");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Volume), "Volume");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.MarketCap), "MarketCap");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.PE), "PE");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.EPS), "EPS");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.PEG), "PEG");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.ReturnOnAssets), "ReturnOnAssets");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.ReturnOnEquity), "ReturnOnEquity");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.TotalCash), "TotalCash");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.TotalDebt), "TotalDebt");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.SharesOutstanding), "SharesOutstanding");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Revenue), "Revenue");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.RevenuePerShare), "RevenuePerShare");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.QtrlyRevenueGrowth), "QtrlyRevenueGrowth");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.GrossProfit), "GrossProfit");
|
||||
// Assert.IsTrue(!double.IsNaN(fundamental.EBITDA), "EBITDA");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.NetIncomeAvailableToCommon), "NetIncomeAvailableToCommon");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.BookValuePerShare), "BookValuePerShare");
|
||||
// Assert.IsTrue(!double.IsNaN(fundamental.OperatingCashflow), "OperatingCashflow");
|
||||
// Assert.IsTrue(!double.IsNaN(fundamental.LeveragedFreeCashflow), "LeveragedFreeCashflow");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.Equity), "Equity");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.TrailingPE), "TrailingPE");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.EnterpriseValue), "EnterpriseValue");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.EBIT), "EBIT");
|
||||
Assert.IsTrue(!double.IsNaN(fundamental.DebtToEquity), "DebtToEquity");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
37
MarketDataUnitTests/MarketDataUnitTests.csproj
Normal file
37
MarketDataUnitTests/MarketDataUnitTests.csproj
Normal file
@@ -0,0 +1,37 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="coverlet.collector" Version="6.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
||||
<PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
|
||||
<PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../MarketData/MarketDataLib/MarketDataLib.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../MarketData/MarketData/MarketData.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="appsettings.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
17
MarketDataUnitTests/appsettings.json
Executable file
17
MarketDataUnitTests/appsettings.json
Executable file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"market_data" : "Database=market_data;Datasource=adrastea;Username=guest;Password=guest",
|
||||
"portfolio_data" : "Database=portfolio_data;Datasource=adrastea;Username=guest;Password=guest",
|
||||
"user_data" : "Database=user_data;Datasource=adrastea;Username=guest;Password=guest",
|
||||
"sms_smtpaddress" : "smtp.gmail.com",
|
||||
"sms_smsusername" : "skessler1964@gmail.com",
|
||||
"sms_smspassword" : "xjfo isnf gmyi zovr",
|
||||
"sms_smsrecipients" : "skessler1964@gmail.com",
|
||||
"proxy_address" : "http://euporie:8182",
|
||||
"proxy_GetLatestPriceYahoo" : "false",
|
||||
"proxy_GetLatestPriceBigCharts" : "false",
|
||||
"proxy_GetETFHoldings" : "false",
|
||||
"proxy_GetDailyPrices" : "false",
|
||||
"proxy_GetFundamentalEx" : "false",
|
||||
"proxy_GetDividendHistory" : "false",
|
||||
"proxy_GetAnalystPriceTargetMarketBeat" : "false"
|
||||
}
|
||||
10
README.md
10
README.md
@@ -168,11 +168,11 @@ Notes: There is a c++ program that performs the file transfer between Isonoe and
|
||||
|
||||
|
||||
# Miscellaneous Notes
|
||||
TO-DO
|
||||
1) MariaDb online
|
||||
2) MarketDataServer
|
||||
dotnet add package Microsoft.AspNet.WebApi.SelfHost --version 5.3.0
|
||||
dotnet add package System.ServiceModel.Primitives --version 4.0.0
|
||||
To run unit tests we need to enable "Code Lens" so that the "Run Test" "Debug Test" options are visible and clickable in the source file.
|
||||
So make sure to go to File->Preferences->Settings in VsCode and type "Editor: Code Lense" and sure it's checked.
|
||||
If so you should see options to debug a single unit test right under the [TestMethod] annotation.
|
||||
To run unit tests from the CLI go to the unit test project folder in Terminal and run dotnet clean, dotnet build, dotnet test
|
||||
|
||||
|
||||
Git Delete Remote Branch
|
||||
git push <remote_name> --delete <branch_name>
|
||||
|
||||
Reference in New Issue
Block a user