Files
OpenBB/tests/test_cryptocurrency/test_coingecko_crypto.py
jp 28e3970912 Refactoring crypto menu 2nd part (#724)
* Add separate view for finbrain for crypto curreny sentiment analysis

* Move json with symbols to separate directory, little refactoring, update readme

* Add screenshot of finbrain for PolkaDot

* Remove not used methods, remove binance_view, binance_model from discovery menu (It's not needed, as we use all_coins view for finding coins from all sources

* Refactoring Due Diligence menu. Changing views, moving argparsers to controller

* Refactor cryptomenu. Overview, Discovery, DD menu - move argparsers to controllers, add typing hints, change names of views/models, adjust tests

* Adjust tests

* Move finbrain and find/coins method to controller

* Move report argparser into controller. Adjust tests

* Adjust docstrings

* Add helper method to take care about retry/wait for coingecko scraping

* Fix failing test

* Adjust newlines, docstrings, cmd descriptions

* Add use tabulate df flag for all crypto views

* Add status code for coingecko

* Add note, that some coingecko commands can fail

Co-authored-by: Jakub Pluta <jakub.pluta@cdq.com>
2021-09-05 17:15:35 +01:00

385 lines
13 KiB
Python

from unittest import mock, TestCase
import json
import os
import vcr
from pycoingecko import CoinGeckoAPI
from gamestonk_terminal.cryptocurrency.overview import (
pycoingecko_view as ov_pycoingecko_view,
)
from gamestonk_terminal.cryptocurrency.due_diligence import (
pycoingecko_view as dd_pycoingecko_view,
)
from gamestonk_terminal.cryptocurrency.discovery import (
pycoingecko_view as disc_pycoingecko_view,
)
from gamestonk_terminal.cryptocurrency.due_diligence.pycoingecko_model import Coin
from gamestonk_terminal.cryptocurrency.cryptocurrency_helpers import (
plot_chart,
load,
load_ta_data,
)
from tests.helpers import check_print
# pylint: disable=unused-import
@mock.patch(
"gamestonk_terminal.cryptocurrency.due_diligence.pycoingecko_model.CoinGeckoAPI.get_coin_market_chart_by_id"
)
def get_bitcoin(mock_load):
# pylint: disable=unused-argument
print(os.getcwd())
with open("tests/data/btc_usd_test_data.json", encoding="utf8") as f:
sample_return = json.load(f)
mock_load.return_value = sample_return
coin, _ = load(coin="bitcoin", source="cg")
return coin
# pylint: disable=R0904
class TestCoinGeckoAPI(TestCase):
# pylint: disable = no-value-for-parameter
coin = get_bitcoin()
def test_coin_api_load(self):
"""
Mock load function through get_coin_market_chart_by_id.
Mock returns a dict saved as .json
"""
self.assertEqual(self.coin.coin_symbol, "bitcoin")
self.assertIsInstance(self.coin, Coin)
@mock.patch(
"gamestonk_terminal.cryptocurrency.due_diligence.pycoingecko_model.CoinGeckoAPI.get_coin_market_chart_by_id"
)
def test_coin_api_load_df_for_ta(self, mock_load):
"""
Mock load function through get_coin_market_chart_by_id.
Mock returns a dict saved as .json
"""
with open("tests/data/btc_usd_test_data.json", encoding="utf8") as f:
sample_return = json.load(f)
mock_load.return_value = sample_return
mock_return, vs = load_ta_data(
coin=self.coin,
source="cg",
currency="usd",
days=30,
)
self.assertTrue(mock_return.shape == (31, 4))
self.assertTrue(vs == "usd")
@check_print()
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_get_coins.yaml",
record_mode="new_episodes",
)
def test_get_coins(self):
"""Test that pycoingecko retrieves the major coins"""
coins = CoinGeckoAPI().get_coins()
bitcoin_list = [coin["id"] for coin in coins]
test_coins = ["bitcoin", "ethereum", "dogecoin"]
for test in test_coins:
self.assertIn(test, bitcoin_list)
@check_print(assert_in="\n")
@mock.patch("matplotlib.pyplot.show")
def test_coin_chart(self, mock_matplot):
# pylint: disable=unused-argument
plot_chart(coin=self.coin, source="cg", currency="usd", days=30)
@check_print(assert_in="Market Cap Rank")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_info.yaml",
record_mode="new_episodes",
)
def test_coin_info(self):
dd_pycoingecko_view.display_info(self.coin, export="")
@check_print(assert_in="Homepage")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_web.yaml",
record_mode="new_episodes",
)
def test_coin_web(self):
dd_pycoingecko_view.display_web(self.coin, export="")
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_social.yaml",
record_mode="new_episodes",
)
def test_coin_social(self):
dd_pycoingecko_view.display_social(self.coin, export="")
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_dev.yaml",
record_mode="new_episodes",
)
def test_coin_dev(self):
dd_pycoingecko_view.display_dev(self.coin, export="")
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_ath.yaml",
record_mode="new_episodes",
)
def test_coin_ath(self):
dd_pycoingecko_view.display_ath(self.coin, export="", currency="usd")
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_atl.yaml",
record_mode="new_episodes",
)
def test_coin_atl(self):
dd_pycoingecko_view.display_atl(self.coin, export="", currency="usd")
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_score.yaml",
record_mode="new_episodes",
)
def test_coin_score(self):
dd_pycoingecko_view.display_score(self.coin, export="")
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_bc.yaml",
record_mode="new_episodes",
)
def test_coin_bc(self):
dd_pycoingecko_view.display_bc(self.coin, export="")
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_market.yaml",
record_mode="new_episodes",
)
def test_coin_market(self):
dd_pycoingecko_view.display_market(self.coin, export="")
@check_print(assert_in="Total Bitcoin Holdings")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_overview.yaml",
record_mode="new_episodes",
)
def test_coin_holdings_overview(self):
ov_pycoingecko_view.display_holdings_overview(coin="bitcoin", export="")
@check_print(assert_in="═══════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_holding_comapnies.yaml",
record_mode="new_episodes",
)
def test_coin_holdings_companies_list(self):
ov_pycoingecko_view.display_holdings_companies_list(
coin="ethereum", export="", links=False
)
@check_print(assert_in="Rank")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_gainers.yaml",
record_mode="new_episodes",
)
def test_coin_gainers(self):
disc_pycoingecko_view.display_gainers(
period="24h", top=15, sortby="Change", descend=True, links=False, export=""
)
@check_print(assert_in="Rank")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_losers.yaml",
record_mode="new_episodes",
)
def test_coin_losers(self):
disc_pycoingecko_view.display_losers(
period="24h", top=15, sortby="Change", descend=True, links=False, export=""
)
@check_print(assert_in="CryptoBlades")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_discover.yaml",
record_mode="new_episodes",
)
def test_coin_discover(self):
disc_pycoingecko_view.display_discover(
category="trending",
top=15,
sortby="Rank",
descend=True,
links=False,
export="",
)
@check_print(assert_in="═════════════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_news.yaml",
record_mode="new_episodes",
)
def test_coin_news(self):
ov_pycoingecko_view.display_news(
top=15, sortby="Index", descend=True, links=False, export=""
)
@check_print(assert_in="Decentralized Finance")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_categories.yaml",
record_mode="new_episodes",
)
def test_coin_categories(self):
ov_pycoingecko_view.display_categories(
top=15, sortby="Rank", descend=True, links=False, export=""
)
@check_print(assert_in="════════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_recently_added.yaml",
record_mode="new_episodes",
)
def test_coin_recently_added(self):
disc_pycoingecko_view.display_recently_added(
top=15, sortby="Rank", descend=True, links=False, export=""
)
@check_print(assert_in="════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_stablecoins.yaml",
record_mode="new_episodes",
)
def test_coin_stablecoins(self):
ov_pycoingecko_view.display_stablecoins(
top=15, sortby="Rank", descend=True, links=False, export=""
)
@check_print(assert_in="════════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_yfarms.yaml",
record_mode="new_episodes",
)
def test_coin_yfarms(self):
disc_pycoingecko_view.display_yieldfarms(
top=15, sortby="Rank", descend=True, export=""
)
@check_print(assert_in="════════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_top_volume_coins.yaml",
record_mode="new_episodes",
)
def test_coin_top_volume_coins(self):
disc_pycoingecko_view.display_top_volume_coins(
top=15, sortby="Rank", descend=True, export=""
)
@check_print(assert_in="═════════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_top_defi_coins.yaml",
record_mode="new_episodes",
)
def test_coin_top_defi_coins(self):
disc_pycoingecko_view.display_top_defi_coins(
top=15, sortby="Rank", descend=True, links=False, export=""
)
@check_print(assert_in="════════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_top_dex.yaml",
record_mode="new_episodes",
)
def test_coin_top_dex(self):
disc_pycoingecko_view.display_top_dex(
top=15, sortby="Rank", descend=True, export=""
)
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_nft_market-status.yaml",
record_mode="new_episodes",
)
def test_coin_nft_market_status(self):
ov_pycoingecko_view.display_nft_market_status(export="")
@check_print(assert_in="═══════════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_exchanges.yaml",
record_mode="new_episodes",
)
def test_coin_exchanges(self):
ov_pycoingecko_view.display_exchanges(
top=15, sortby="Rank", descend=True, links=False, export=""
)
@check_print(assert_in="Rank")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_platforms.yaml",
record_mode="new_episodes",
)
def test_coin_platforms(self):
ov_pycoingecko_view.display_platforms(
top=15, sortby="Rank", descend=True, export=""
)
@check_print(assert_in="Rank")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_products.yaml",
record_mode="new_episodes",
)
def test_coin_products(self):
ov_pycoingecko_view.display_products(
top=15, sortby="Rank", descend=True, export=""
)
@check_print(assert_in="Rank")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_indexes.yaml",
record_mode="new_episodes",
)
def test_coin_indexes(self):
ov_pycoingecko_view.display_indexes(
top=15, sortby="Rank", descend=True, export=""
)
@check_print(assert_in="═════════")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_derivatives.yaml",
record_mode="new_episodes",
)
def test_coin_derivatives(self):
ov_pycoingecko_view.display_derivatives(
top=15, sortby="Rank", descend=True, export=""
)
@check_print(assert_in="Index")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_exchange_rates.yaml",
record_mode="new_episodes",
)
def test_coin_exchange_rates(self):
ov_pycoingecko_view.display_exchange_rates(
top=15, sortby="Index", descend=True, export=""
)
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_global_market_info.yaml",
record_mode="new_episodes",
)
def test_coin_global_market_info(self):
ov_pycoingecko_view.display_global_market_info(export="")
@check_print(assert_in="Metric")
@vcr.use_cassette(
"tests/cassettes/test_cryptocurrency/test_coingecko/test_coin_global_defo_info.yaml",
record_mode="new_episodes",
)
def test_coin_global_defi_info(self):
ov_pycoingecko_view.display_global_defi_info(export="")
# TODO: Re-add tests for coin_list and find