"""Tests for the Montreal Exchange universe."""
from openbb_tmx.utils.mx import (
INSTRUMENT_CLASSES,
INTEREST_RATE_PRODUCTS,
_parse_selectors,
)
PAGE = """
"""
class TestParseSelectors:
"""Reading the instrument selectors off the quotes page."""
def test_parses_every_known_class(self):
rows = _parse_selectors(PAGE)
assert {r["symbol"] for r in rows} == {"AC", "BCE", "CGB", "LGB"}
def test_unknown_selector_is_ignored(self):
assert all(r["symbol"] != "ZZ" for r in _parse_selectors(PAGE))
def test_blank_option_is_skipped(self):
assert all(r["symbol"] for r in _parse_selectors(PAGE))
def test_asset_class_is_labelled(self):
rows = {r["symbol"]: r for r in _parse_selectors(PAGE)}
assert rows["AC"]["asset_class"] == "equity_option"
assert rows["CGB"]["asset_class"] == "interest_rate_derivative"
def test_interest_rate_products_are_named(self):
rows = {r["symbol"]: r for r in _parse_selectors(PAGE)}
assert rows["CGB"]["name"] == INTEREST_RATE_PRODUCTS["CGB"]
def test_quote_symbol_is_attached_for_futures(self):
rows = {r["symbol"]: r for r in _parse_selectors(PAGE)}
assert rows["CGB"]["quote_symbol"] == "/CGB"
assert rows["AC"]["quote_symbol"] is None
def test_empty_page(self):
assert _parse_selectors("") == []
def test_every_class_maps_to_a_label_and_type(self):
assert all(len(v) == 3 for v in INSTRUMENT_CLASSES.values())
def test_index_and_rate_selectors_classify_per_product(self):
from openbb_tmx.utils.mx import _instrument_type
assert _instrument_type("SXO", None) == "option"
assert _instrument_type("OGB", None) == "option"
assert _instrument_type("CGB", None) == "future"
assert _instrument_type("SXF", None) == "future"
assert _instrument_type("AC", "option") == "option"
def test_unknown_product_has_no_name(self):
rows = {r["symbol"]: r for r in _parse_selectors(PAGE)}
assert rows["AC"]["name"] is None
assert rows["CGB"]["name"] == INTEREST_RATE_PRODUCTS["CGB"]