make integration tests pass

This commit is contained in:
Khaleel Al-Adhami 2024-08-16 16:28:21 -07:00
parent 3d7ea3735c
commit 69f0d1db0b
8 changed files with 31 additions and 18 deletions

View File

@ -268,6 +268,8 @@ async def test_submit(driver, form_submit: AppHarness):
form_data = format.collect_form_dict_names(form_data) form_data = format.collect_form_dict_names(form_data)
print(form_data)
assert form_data["name_input"] == "foo" assert form_data["name_input"] == "foo"
assert form_data["pin_input"] == pin_values assert form_data["pin_input"] == pin_values
assert form_data["number_input"] == "-3" assert form_data["number_input"] == "-3"

View File

@ -107,7 +107,7 @@ def test_tailwind_app(tailwind_app: AppHarness, tailwind_disabled: bool):
assert len(paragraphs) == 3 assert len(paragraphs) == 3
for p in paragraphs: for p in paragraphs:
assert tailwind_app.poll_for_content(p, exp_not_equal="") == PARAGRAPH_TEXT assert tailwind_app.poll_for_content(p, exp_not_equal="") == PARAGRAPH_TEXT
assert p.value_of_css_property("font-family") == "monospace" assert p.value_of_css_property("font-family") == '"monospace"'
if tailwind_disabled: if tailwind_disabled:
# expect default color, not "text-red-500" from tailwind utility class # expect default color, not "text-red-500" from tailwind utility class
assert p.value_of_css_property("color") not in TEXT_RED_500_COLOR assert p.value_of_css_property("color") not in TEXT_RED_500_COLOR

View File

@ -1113,7 +1113,11 @@ class App(MiddlewareMixin, LifespanMixin, Base):
Returns: Returns:
Task if the event was backgroundable, otherwise None Task if the event was backgroundable, otherwise None
""" """
# print("Processing background", repr(event))
substate, handler = state._get_event_handler(event) substate, handler = state._get_event_handler(event)
# print("Substate", substate)
# print("Handler", handler)
if not handler.is_background: if not handler.is_background:
return None return None

View File

@ -4,10 +4,12 @@ from __future__ import annotations
from typing import Optional from typing import Optional
import reflex as rx
from reflex.components.chakra import ChakraComponent, LiteralInputVariant from reflex.components.chakra import ChakraComponent, LiteralInputVariant
from reflex.components.component import Component from reflex.components.component import Component
from reflex.components.tags.tag import Tag from reflex.components.tags.tag import Tag
from reflex.event import EventHandler from reflex.event import EventHandler
from reflex.ivars import ArrayVar
from reflex.utils import format from reflex.utils import format
from reflex.utils.imports import ImportDict, merge_imports from reflex.utils.imports import ImportDict, merge_imports
from reflex.vars import Var from reflex.vars import Var
@ -186,7 +188,10 @@ class PinInputField(ChakraComponent):
props["name"] = f"{name}-{i}" props["name"] = f"{name}-{i}"
return PinInputField.create(**props, index=i, key=i) return PinInputField.create(**props, index=i, key=i)
return Var.range(length).foreach(_create) # type: ignore return rx.foreach( # type: ignore
ArrayVar.range(length), # type: ignore
_create,
)
def _get_ref_hook(self) -> Optional[str]: def _get_ref_hook(self) -> Optional[str]:
return None return None

View File

@ -11,7 +11,7 @@ from reflex.components.el.element import Element
from reflex.components.tags.tag import Tag from reflex.components.tags.tag import Tag
from reflex.constants import Dirs, EventTriggers from reflex.constants import Dirs, EventTriggers
from reflex.event import EventChain, EventHandler from reflex.event import EventChain, EventHandler
from reflex.ivars.base import ImmutableVar from reflex.ivars.base import ImmutableVar, LiteralVar
from reflex.utils.format import format_event_chain from reflex.utils.format import format_event_chain
from reflex.utils.imports import ImportDict from reflex.utils.imports import ImportDict
from reflex.vars import Var, VarData from reflex.vars import Var, VarData
@ -185,7 +185,7 @@ class Form(BaseHTML):
HANDLE_SUBMIT_JS_JINJA2.render( HANDLE_SUBMIT_JS_JINJA2.render(
handle_submit_unique_name=self.handle_submit_unique_name, handle_submit_unique_name=self.handle_submit_unique_name,
form_data=FORM_DATA, form_data=FORM_DATA,
field_ref_mapping=str(Var.create_safe(self._get_form_refs())), field_ref_mapping=str(LiteralVar.create(self._get_form_refs())),
on_submit_event_chain=format_event_chain( on_submit_event_chain=format_event_chain(
self.event_triggers[EventTriggers.ON_SUBMIT] self.event_triggers[EventTriggers.ON_SUBMIT]
), ),
@ -213,21 +213,18 @@ class Form(BaseHTML):
# when ref start with refs_ it's an array of refs, so we need different method # when ref start with refs_ it's an array of refs, so we need different method
# to collect data # to collect data
if ref.startswith("refs_"): if ref.startswith("refs_"):
ref_var = Var.create_safe(ref[:-3], _var_is_string=False).as_ref() ref_var = ImmutableVar.create_safe(ref[:-3]).as_ref()
form_refs[ref[5:-3]] = Var.create_safe( form_refs[ref[len("refs_") : -3]] = ImmutableVar.create_safe(
f"getRefValues({str(ref_var)})", f"getRefValues({str(ref_var)})",
_var_is_local=False,
_var_is_string=False,
_var_data=VarData.merge(ref_var._get_all_var_data()), _var_data=VarData.merge(ref_var._get_all_var_data()),
) )
else: else:
ref_var = Var.create_safe(ref, _var_is_string=False).as_ref() ref_var = ImmutableVar.create_safe(ref).as_ref()
form_refs[ref[4:]] = Var.create_safe( form_refs[ref[4:]] = ImmutableVar.create_safe(
f"getRefValue({str(ref_var)})", f"getRefValue({str(ref_var)})",
_var_is_local=False,
_var_is_string=False,
_var_data=VarData.merge(ref_var._get_all_var_data()), _var_data=VarData.merge(ref_var._get_all_var_data()),
) )
# print(repr(form_refs))
return form_refs return form_refs
def _get_vars(self, include_children: bool = True) -> Iterator[Var]: def _get_vars(self, include_children: bool = True) -> Iterator[Var]:

View File

@ -724,7 +724,7 @@ class ImmutableVar(Var, Generic[VAR_TYPE]):
} }
), ),
).to(ObjectVar) ).to(ObjectVar)
return refs[self] return refs[LiteralVar.create(str(self))]
def _type(self) -> StringVar: def _type(self) -> StringVar:
"""Returns the type of the object. """Returns the type of the object.
@ -804,7 +804,7 @@ class LiteralVar(ImmutableVar):
if isinstance(value, EventSpec): if isinstance(value, EventSpec):
event_name = LiteralVar.create( event_name = LiteralVar.create(
".".join(get_event_handler_parts(value.handler)) ".".join(filter(None, get_event_handler_parts(value.handler)))
) )
event_args = LiteralVar.create( event_args = LiteralVar.create(
{str(name): value for name, value in value.args} {str(name): value for name, value in value.args}

View File

@ -29,7 +29,12 @@ from typing_extensions import get_origin
from reflex import constants from reflex import constants
from reflex.constants.base import REFLEX_VAR_OPENING_TAG from reflex.constants.base import REFLEX_VAR_OPENING_TAG
from reflex.utils.types import GenericType from reflex.utils.types import GenericType
from reflex.vars import ImmutableVarData, Var, VarData, _global_vars from reflex.vars import (
ImmutableVarData,
Var,
VarData,
_global_vars,
)
from .base import ( from .base import (
CachedVarOperation, CachedVarOperation,

View File

@ -666,7 +666,7 @@ def format_queue_events(
call_event_fn, call_event_fn,
call_event_handler, call_event_handler,
) )
from reflex.ivars.base import FunctionVar, ImmutableVar from reflex.ivars import FunctionVar, ImmutableVar
if not events: if not events:
return ImmutableVar("(() => null)").to(FunctionVar, EventChain) return ImmutableVar("(() => null)").to(FunctionVar, EventChain)
@ -804,8 +804,8 @@ def format_array_ref(refs: str, idx: Var | None) -> str:
""" """
clean_ref = re.sub(r"[^\w]+", "_", refs) clean_ref = re.sub(r"[^\w]+", "_", refs)
if idx is not None: if idx is not None:
idx._var_is_local = True # idx._var_is_local = True
return f"refs_{clean_ref}[{idx}]" return f"refs_{clean_ref}[{str(idx)}]"
return f"refs_{clean_ref}" return f"refs_{clean_ref}"