YahooChartParserTests.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using Infrastructure.StockData;
  2. namespace Application.Tests;
  3. [TestClass]
  4. public sealed class YahooChartParserTests
  5. {
  6. [TestMethod]
  7. public void Parse_MapsMetaFields_LowercasesSymbol()
  8. {
  9. // Yahoo v8 chart 표준 응답 축약 (meta 만) — 실제 ^GSPC 응답 형태
  10. const string json = """
  11. {"chart":{"result":[{"meta":{"symbol":"^GSPC","regularMarketTime":1783543721,"gmtoffset":-14400,"regularMarketPrice":7482.71,"chartPreviousClose":7499.36,"regularMarketDayHigh":7488.51,"regularMarketDayLow":7421.82,"regularMarketVolume":2874621000}}],"error":null}}
  12. """;
  13. var q = YahooChartParser.Parse(json, "^GSPC");
  14. Assert.IsNotNull(q);
  15. Assert.AreEqual("^gspc", q.Symbol, "심볼은 소문자 정규화");
  16. Assert.AreEqual(7482.71m, q.Close);
  17. Assert.AreEqual(7488.51m, q.High);
  18. Assert.AreEqual(7421.82m, q.Low);
  19. Assert.AreEqual(2874621000L, q.Volume);
  20. Assert.AreEqual(7482.71m, q.Open, "시가 미제공 → 종가로 대체");
  21. Assert.AreEqual(2026, q.TradeDate.Year);
  22. Assert.AreEqual(7, q.TradeDate.Month);
  23. }
  24. [TestMethod]
  25. public void Parse_MissingPriceOrTime_ReturnsNull()
  26. {
  27. // 종가 없음
  28. Assert.IsNull(YahooChartParser.Parse("""{"chart":{"result":[{"meta":{"symbol":"^X","regularMarketTime":1783543721}}]}}""", "^X"));
  29. // 거래시각 없음
  30. Assert.IsNull(YahooChartParser.Parse("""{"chart":{"result":[{"meta":{"symbol":"^X","regularMarketPrice":100.0}}]}}""", "^X"));
  31. }
  32. [TestMethod]
  33. public void Parse_EmptyOrError_ReturnsNull()
  34. {
  35. Assert.IsNull(YahooChartParser.Parse("", "^X"));
  36. Assert.IsNull(YahooChartParser.Parse(" ", "^X"));
  37. Assert.IsNull(YahooChartParser.Parse("""{"chart":{"result":null,"error":{"code":"Not Found"}}}""", "^X"));
  38. Assert.IsNull(YahooChartParser.Parse("not json", "^X"));
  39. }
  40. }