Skip to content

Commit 3481216

Browse files
authored
Fix combinator serialization issue (#3726)
* Fix combinator serialization issue * CI
1 parent ddf2e08 commit 3481216

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

ee/vellum_ee/workflows/display/nodes/vellum/conditional_node.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ def serialize_rule(
188188
rule_ids = self._get_rule_ids()
189189
condition_rule = serialize_rule(port._condition, [idx], rule_ids[idx] if len(rule_ids) > idx else None)
190190
rules = condition_rule["rules"] if condition_rule["rules"] else [condition_rule]
191+
combinator = condition_rule.get("combinator") or "AND"
191192
if port._condition_type is None:
192193
raise ValueError("Condition type is None, but a valid ConditionType is expected.")
193194
conditions.append(
@@ -198,7 +199,7 @@ def serialize_rule(
198199
"data": {
199200
"id": rule_group_id,
200201
"rules": rules,
201-
"combinator": "AND",
202+
"combinator": combinator,
202203
"negated": False,
203204
"field_node_input_id": None,
204205
"operator": None,

ee/vellum_ee/workflows/display/tests/workflow_serialization/test_basic_conditional_node_serialization.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import pytest
2+
from typing import Any, cast
23

34
from deepdiff import DeepDiff
45

@@ -23,7 +24,10 @@
2324
from vellum_ee.workflows.display.workflows.get_vellum_workflow_display_class import get_workflow_display
2425

2526
from tests.workflows.basic_conditional_node.workflow import CategoryWorkflow
26-
from tests.workflows.basic_conditional_node.workflow_with_only_one_conditional_node import create_simple_workflow
27+
from tests.workflows.basic_conditional_node.workflow_with_only_one_conditional_node import (
28+
Inputs as SimpleInputs,
29+
create_simple_workflow,
30+
)
2731

2832

2933
def test_serialize_workflow():
@@ -924,3 +928,26 @@ def test_conditional_node_serialize_all_operators_with_value_and_start_and_end(d
924928
conditional_node,
925929
ignore_order=True,
926930
)
931+
932+
933+
def test_conditional_node_serialize_or_combinator_preserves_or():
934+
"""Regression test: OR conditions (A | B) must serialize with combinator 'OR', not 'AND'."""
935+
# GIVEN a conditional node with an OR condition: text == "foo" OR text == "bar"
936+
or_condition = SimpleInputs.text.equals("foo") | SimpleInputs.text.equals("bar")
937+
workflow_cls = create_simple_workflow(or_condition)
938+
939+
workflow_display = get_workflow_display(workflow_class=workflow_cls)
940+
serialized_workflow = cast(dict[str, Any], workflow_display.serialize())
941+
942+
# WHEN we extract the conditional node's IF condition
943+
conditional_node = next(
944+
n
945+
for n in serialized_workflow["workflow_raw_data"]["nodes"]
946+
if (n.get("base") or {}).get("name") == "ConditionalNode"
947+
)
948+
if_condition = next(c for c in conditional_node["data"]["conditions"] if c["type"] == "IF")
949+
950+
# THEN the combinator must be "OR" (not "AND")
951+
assert (
952+
if_condition["data"]["combinator"] == "OR"
953+
), "OR conditions were incorrectly serialized as AND - top-level OrExpression must produce combinator 'OR'"

0 commit comments

Comments
 (0)