Add coverage to Tiingo Client for Tickers Endpoint

This commit is contained in:
Cameron Yick
2017-08-28 22:45:33 -04:00
parent 1127113ef4
commit 9b5685dd82
2 changed files with 69 additions and 26 deletions

View File

@@ -2,9 +2,12 @@
# -*- coding: utf-8 -*-
"""Tests for `tiingo` package."""
import csv
import pytest
from unittest import TestCase
from tiingo import TiingoClient
# TODO
# Add tests for
# Invalid API key
@@ -16,21 +19,6 @@ from tiingo import TiingoClient
# Expand test coverage
# Refactor fixtures into separate file
@pytest.fixture
def ticker_price_response():
"""Test /tiingo/<ticker>/prices endpoint"""
t = TiingoClient()
return t.get_ticker_price("GOOGL")
@pytest.fixture
def ticker_metadata_response():
"""Test /tiingo/<ticker> endpoint"""
t = TiingoClient()
return t.get_ticker_metadata("GOOGL")
@pytest.fixture
def fund_metadata_response():
"""Test /tiingo/<ticker> endpoint"""
@@ -45,22 +33,62 @@ def fund_metrics_response():
return t.get_fund_metrics("VFINX")
# PRICES ENDPOINTS
class TestTickerPrices(object):
def test_ticker_price(self, ticker_price_response):
"""Test the EOD Prices Endpoint"""
assert len(ticker_price_response) == 1
assert ticker_price_response[0].get('adjClose')
def test_client_repr():
"""Test representation of client when logged to console"""
client = TiingoClient()
base_url = "https://api.tiingo.com"
assert repr(client) == "<TiingoClient(url=\"{}\")>".format(base_url)
def test_ticker_metadata(self, ticker_metadata_response):
# PRICES ENDPOINTS
class TestTickerPrices(TestCase):
def setUp(self):
self._client = TiingoClient()
# Stub all endpoints that get reused
self._ticker_price_response = self._client.get_ticker_price("GOOGL")
self._ticker_metadata_response = \
self._client.get_ticker_metadata("GOOGL")
def test_ticker_price(self):
"""Test the EOD Prices Endpoint"""
assert len(self._ticker_price_response) == 1
assert self._ticker_price_response[0].get('adjClose')
def test_ticker_price_with_date(self):
"""Test the EOD Prices Endpoint with data param"""
prices = self._client.get_ticker_price("GOOGL",
startDate="2015-01-01",
endDate="2015-01-05")
self.assertGreater(len(prices), 1)
def test_ticker_price_with_csv(self):
"""Confirm that CSV endpoint works"""
prices_csv = self._client.get_ticker_price("GOOGL",
startDate="2015-01-01",
endDate="2015-01-05",
fmt='csv')
reader = csv.reader(prices_csv.splitlines(), delimiter=",")
rows = list(reader)
assert len(rows) > 2 # more than 1 day of data
def test_ticker_metadata(self):
"""Refactor this with python data schemavalidation"""
assert ticker_metadata_response.get('ticker') == "GOOGL"
assert ticker_metadata_response.get("name")
assert self._ticker_metadata_response.get('ticker') == "GOOGL"
assert self._ticker_metadata_response.get("name")
def test_list_tickers(self):
"""Update this test when the method is added."""
with self.assertRaises(NotImplementedError):
response = self._client.list_tickers()
assert not response
# FUND ENDPOINTS
# tiingo/funds
# Try to get a working API key from Tiingo development for testing purposes
@pytest.mark.skip(reason="My API key doesn't have access to mutual funds API")
class TestMutualFunds(object):
class TestMutualFunds(TestCase):
def test_fund_metadata(self, fund_metadata_response):
"""Refactor this with python data schemavalidation"""
@@ -72,3 +100,18 @@ class TestMutualFunds(object):
"""Test Fund Level Metrics"""
assert len(fund_metrics_response) > 0
assert fund_metrics_response[0].get('managementFee')
# News Feed
# tiingo/news
class TestNews(TestCase):
def setUp(self):
self._client = TiingoClient()
def test_get_news_articles(self):
"""Rewrite when method is implemented
"""
with self.assertRaises(NotImplementedError) as context:
self.get_news()
print(context)

View File

@@ -85,7 +85,7 @@ class TiingoClient(RestClient):
if fmt == "json":
return response.json()
else:
return response.content
return response.content.decode("utf-8")
# FUND DATA (From over 26,000 mutual funds)
# https://api.tiingo.com/docs/tiingo/funds