diff --git a/piker/watchlists.py b/piker/watchlists.py index a57e7a32..b2c95295 100644 --- a/piker/watchlists.py +++ b/piker/watchlists.py @@ -8,9 +8,9 @@ log = get_logger(__name__) def write_sorted_json(watchlist, path): for key in watchlist: - watchlist[key].sort() s = set(watchlist[key]) watchlist[key] = list(s) + watchlist[key].sort() with open(path, 'w') as f: json.dump(watchlist, f, sort_keys=True) diff --git a/tests/test_cli.py b/tests/test_cli.py index d45ca31f..819aa021 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -8,7 +8,7 @@ import tempfile import os.path import logging -from piker.watchlists import make_config_dir +import piker.watchlists as wl def run(cmd): """Run cmd and check for zero return code. @@ -91,16 +91,107 @@ def test_api_method_not_found(nyse_tickers, capfd): assert f'No api method `{bad_meth}` could be found?' in err -def test_watchlists_config_dir_created(caplog): +@pytest.fixture +def temp_dir(): + #Create temporary directory + with tempfile.TemporaryDirectory() as tempdir: + config_dir = os.path.join(tempdir, 'piker') + yield config_dir + + +@pytest.fixture +def piker_dir(temp_dir): + wl.make_config_dir(temp_dir) + path = os.path.join(temp_dir, 'watchlists.json') + yield path + + +def test_watchlist_is_sorted_and_saved_to_file(piker_dir): + """Ensure that watchlist is sorted and saved to file + """ + wl_temp = {'test': ['TEST.CN', 'AAA'], 'AA': ['TEST.CN']} + wl_sort = {'AA': ['TEST.CN'], 'test': ['AAA', 'TEST.CN']} + wl.write_sorted_json(wl_temp, piker_dir) + temp_sorted = wl.ensure_watchlists(piker_dir) + assert temp_sorted == wl_sort + + +def test_watchlists_config_dir_created(caplog, temp_dir): """Ensure that a config directory is created """ - #Create temporary directory - config_dir = os.path.join(tempfile.gettempdir(), 'piker') with caplog.at_level(logging.DEBUG): - make_config_dir(config_dir) + wl.make_config_dir(temp_dir) assert len(caplog.records) == 1 record = caplog.records[0] assert record.levelname == 'DEBUG' - assert record.message == f"Creating config dir {config_dir}" - assert os.path.isdir(config_dir) - os.rmdir(config_dir) + assert record.message == f"Creating config dir {temp_dir}" + assert os.path.isdir(temp_dir) + #Test that there is no error and that a log message is not generatd + #when trying to create a directory that already exists + with caplog.at_level(logging.DEBUG): + wl.make_config_dir(temp_dir) + assert len(caplog.records) == 1 + + +def test_watchlist_is_read_from_file(piker_dir): + """Ensure json info is read from file or an empty dict is generated + """ + wl_temp = wl.ensure_watchlists(piker_dir) + assert wl_temp == {} + wl_temp2 = '{"AA": ["TEST.CN"]}' + wl.load_watchlists(wl_temp2, piker_dir) + assert json.loads(wl_temp2) == wl.ensure_watchlists(piker_dir) + + +def test_watchlist_loaded(piker_dir): + """Ensure that text respresentation of a watchlist is loaded to file + """ + wl_temp = '{"test": ["TEST.CN"]}' + wl.load_watchlists(wl_temp, piker_dir) + wl_temp2 = wl.ensure_watchlists(piker_dir) + assert wl_temp == json.dumps(wl_temp2) + + +def test_new_watchlist_group_added(piker_dir): + """Ensure that a new watchlist key is added to the watchlists dictionary + """ + wl_temp = {} + wl.new_group('test', wl_temp, piker_dir) + wl_temp = wl.ensure_watchlists(piker_dir) + assert len(wl_temp.keys()) == 1 + + +def test_new_ticker_added(piker_dir): + """Ensure that a new ticker is added to a watchlist + """ + wl_temp = {'test': []} + wl.add_ticker('test', 'TEST.CN', wl_temp, piker_dir) + wl_temp = wl.ensure_watchlists(piker_dir) + assert len(wl_temp['test']) == 1 + + +def test_ticker_is_removed(piker_dir): + """Verify that passed in ticker is removed + """ + wl_temp = {'test': ['TEST.CN']} + wl.remove_ticker('test', 'TEST.CN', wl_temp, piker_dir) + wl_temp = wl.ensure_watchlists(piker_dir) + assert wl_temp == {'test': []} + +def test_group_is_deleted(piker_dir): + """Check that watchlist group is removed + """ + wl_temp = {'test': ['TEST.CN']} + wl.delete_group('test', wl_temp, piker_dir) + wl_temp = wl.ensure_watchlists(piker_dir) + assert wl_temp.get('test') == None + + +def test_watchlist_is_merged(piker_dir): + """Ensure that watchlist is merged + """ + wl_temp = {'test': ['TEST.CN']} + wl_temp2 = '{"test2": ["TEST2.CN"]}' + wl.merge_watchlist(wl_temp2, wl_temp, piker_dir) + wl_temp3 = wl.ensure_watchlists(piker_dir) + assert wl_temp3 == {'test': ['TEST.CN'], 'test2': ['TEST2.CN']}