def test_optional_list_of_str_param(): @serde class Params: p: Optional[List[str]] = None params = from_url(Params, "?p=1") assert params.p == ["1"] params = from_url(Params, "") assert params.p is None
def test_int_param(): @serde class Params: p: int params = from_url(Params, "?p=1") assert params.p == 1 with pytest.raises(InvalidPageParametersError): from_url(Params, "")
def test_optional_str_param(): @serde class Params: p: Optional[str] = None params = from_url(Params, "?p=1") assert params.p == "1" params = from_url(Params, "") assert params.p is None
def test_list_of_str_param(): @serde class Params: p: List[str] params = from_url(Params, "?p=1") assert params.p == ["1"] with pytest.raises(InvalidPageParametersError): from_url(Params, "")
def test_bool_param(): @serde class Params: p: bool params = from_url(Params, "?p=true") assert params.p is True params = from_url(Params, "?p=false") assert params.p is False
def test_optional_list_of_float_param(): @serde class Params: p: Optional[List[float]] = None params = from_url(Params, "?p=1") assert params.p == [1.0] params = from_url(Params, "") assert params.p is None
def test_list_of_float_param(): @serde class Params: p: List[float] params = from_url(Params, "?p=1") assert params.p == [1.0] with pytest.raises(InvalidPageParametersError): from_url(Params, "")
def test_optional_float_param(): @serde class Params: p: Optional[float] = None params = from_url(Params, "?p=1") assert isinstance(params.p, float) assert params.p == 1.0 params = from_url(Params, "") assert params.p is None
def test_optional_int_param(): @serde class Params: p: Optional[int] = None params = from_url(Params, "?p=1") assert isinstance(params.p, int) assert params.p == 1 params = from_url(Params, "") assert params.p is None
def test_optional_bool_param(): @serde class Params: p: Optional[bool] = None params = from_url(Params, "?p=true") assert params.p is True params = from_url(Params, "?p=false") assert params.p is False params = from_url(Params, "") assert params.p is None
def test_ignore_unknown_flag(): @serde class StrictParams: a: Optional[int] = None with pytest.raises(InvalidPageParametersError) as e: from_url(StrictParams, "?foo=1", ignore_unknown=False) assert "unexpected parameter foo" in str(e.value) @serde class NonStrictParams: a: Optional[int] = None from_url(NonStrictParams, "?foo=1")
def render_page(pathname: str, param_string: str, current_path_data): if pathname is None: raise PreventUpdate logger.debug("Attempting to render page %s", pathname) if pathname != "/" and pathname.endswith("/") or pathname.endswith( "#"): pathname = pathname[:-1] if current_path_data: # If nothing in the path / param_string has changed, don't actually do anything. # NOTE: this is kind of a hack, since sometimes we have buttons w/ href='#', # and we don't want to actually re-render the pages content when clicked. if (current_path_data["pathname"] == pathname and current_path_data["param_string"] == param_string): raise PreventUpdate updated_data = {"pathname": pathname, "param_string": param_string} try: PageClass = Page.by_name(pathname) if PageClass.permissions: if not current_user.is_authenticated: PageClass = Page.by_name("/login") params = PageClass.Params(next_pathname=pathname, next_params=param_string) return PageClass.from_params(params).render() + ( None, updated_data) if PageClass.permissions > current_user.permissions: raise NotPermittedError( "You do not have adequate permissions to view this page" ) params = from_url(PageClass.Params, param_string) return PageClass.from_params(params).render() + (None, updated_data) except RegistrationError: return ( [], [], [], dbc.Toast(f"Page {pathname} not found", header="404", icon="danger"), updated_data, ) except InvalidPageParametersError as e: return ( [], [], [], dbc.Toast(str(e), header="Bad page parameters", icon="danger"), updated_data, ) except Exception as e: logger.exception(e) return ( [], [], [], dbc.Toast(str(e), header=e.__class__.__name__, icon="danger"), updated_data, )
def test_from_url_and_serialize(): @serde class Params: a: int params = from_url(Params, "?a=1") assert params.a == 1 assert params == deserialize(Params, serialize(params))