Files
wehub-resource-sync dc6079821b
Docs Tests / Check for file changes (push) Has been cancelled
Docs Tests / Test Documentation (push) Has been cancelled
Docs Tests / Documentation Linting Checks (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.10, test-performance) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.10, test-policies) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.8, test-cli) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.8, test-core-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.8, test-full-model-training) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.8, test-nlu-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.8, test-nlu-predictors) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.8, test-other-unit-tests) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.8, test-performance) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.8, test-policies) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.9, test-cli) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.9, test-core-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.9, test-full-model-training) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.9, test-nlu-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.9, test-nlu-predictors) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.9, test-other-unit-tests) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.9, test-performance) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.9, test-policies) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.10, test-cli) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.10, test-core-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.10, test-full-model-training) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.10, test-nlu-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.10, test-nlu-predictors) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.10, test-other-unit-tests) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.10, test-performance) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.10, test-policies) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.8, test-cli) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.8, test-core-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.8, test-full-model-training) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.8, test-nlu-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.8, test-nlu-predictors) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.8, test-other-unit-tests) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.8, test-performance) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.8, test-policies) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.9, test-cli) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.9, test-core-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.9, test-full-model-training) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.9, test-nlu-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.9, test-nlu-predictors) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.9, test-other-unit-tests) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.9, test-performance) (push) Has been cancelled
Continuous Integration / Run Tests (windows-2022, 3.9, test-policies) (push) Has been cancelled
Continuous Integration / Run Flaky Tests (ubuntu-24.04, 3.10) (push) Has been cancelled
Continuous Integration / Run Flaky Tests (ubuntu-24.04, 3.8) (push) Has been cancelled
Continuous Integration / Run Flaky Tests (ubuntu-24.04, 3.9) (push) Has been cancelled
Continuous Integration / Run Flaky Tests (windows-2022, 3.10) (push) Has been cancelled
Continuous Integration / Run Flaky Tests (windows-2022, 3.8) (push) Has been cancelled
Continuous Integration / Run Flaky Tests (windows-2022, 3.9) (push) Has been cancelled
Continuous Integration / Check for file changes (push) Has been cancelled
Continuous Integration / Wait for docs tests (push) Has been cancelled
Continuous Integration / Code Quality (push) Has been cancelled
Continuous Integration / Check for changelog (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.10, test-cli) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.10, test-core-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.10, test-full-model-training) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.10, test-nlu-featurizers) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.10, test-nlu-predictors) (push) Has been cancelled
Continuous Integration / Run Tests (ubuntu-24.04, 3.10, test-other-unit-tests) (push) Has been cancelled
Continuous Integration / Upload coverage reports to codeclimate (push) Has been cancelled
Continuous Integration / Run Non-Sequential Integration Tests (push) Has been cancelled
Continuous Integration / Run Broker Integration Tests (push) Has been cancelled
Continuous Integration / Run Sequential Integration Tests (push) Has been cancelled
Continuous Integration / Build Docker base images and setup environment (push) Has been cancelled
Continuous Integration / Build Docker (default) (push) Has been cancelled
Continuous Integration / Build Docker (full) (push) Has been cancelled
Continuous Integration / Build Docker (mitie-en) (push) Has been cancelled
Continuous Integration / Build Docker (spacy-de) (push) Has been cancelled
Continuous Integration / Build Docker (spacy-en) (push) Has been cancelled
Continuous Integration / Build Docker (spacy-it) (push) Has been cancelled
Continuous Integration / Deploy to PyPI (push) Has been cancelled
Continuous Integration / Notify Slack & Publish Release Notes (push) Has been cancelled
Publish Documentation / Evaluate release tag (push) Has been cancelled
Publish Documentation / Prebuild Docs (push) Has been cancelled
Publish Documentation / Preview Docs (push) Has been cancelled
Publish Documentation / Check for file changes (push) Has been cancelled
Publish Documentation / Publish Docs (push) Has been cancelled
Automatic PR Merger / mergepal (push) Has been cancelled
CI Github Actions / Run Tests (push) Has been cancelled
Semgrep / Semgrep Workflow Security Scan (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:24:47 +08:00

444 lines
11 KiB
Python

import textwrap
from typing import Text
import pytest
from rasa.core.nlg.generator import ResponseVariationFilter
from rasa.shared.core.domain import Domain
from rasa.shared.core.events import UserUttered
from rasa.shared.core.slots import TextSlot
from rasa.shared.core.trackers import DialogueStateTracker
def test_response_variation_filter_get_response_variation_id_interpolated_crv() -> None:
"""Test that the correct response variation id is retrieved.
The test uses a conditional response variation with an interpolated slot value.
"""
# Arrange
utter_action = "utter_greet"
name_slot = TextSlot(
name="name", mappings=[{}], initial_value="Bob", influence_conversation=False
)
logged_in_slot = TextSlot(
name="logged_in",
mappings=[{}],
initial_value=True,
influence_conversation=False,
)
tracker = DialogueStateTracker.from_events(
sender_id="interpolated_crv",
evts=[UserUttered("Hello")],
slots=[name_slot, logged_in_slot],
)
output_channel = "default"
domain = Domain.load("data/test_nlg/domain_with_response_ids.yml")
response_variation_filter = ResponseVariationFilter(domain.responses)
# Act
response_variation_id = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel
)
# Assert
assert response_variation_id == "ID_2"
def test_response_variation_filter_get_response_id_default_variation() -> None:
# Arrange
utter_action = "utter_greet"
tracker = DialogueStateTracker.from_events(
sender_id="default_variation", evts=[UserUttered("Hello")], slots=[]
)
output_channel = "default"
domain = Domain.load("data/test_nlg/domain_with_response_ids.yml")
response_variation_filter = ResponseVariationFilter(domain.responses)
# Act
response_variation_id = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel
)
# Assert
assert response_variation_id == "ID_1"
def test_response_variation_filter_get_response_id_multiple_conditions() -> None:
"""Test that the first response variation id is retrieved if multiple conditions are met.""" # noqa: E501
# Arrange
utter_action = "utter_greet"
membership_slot = TextSlot(
name="membership",
mappings=[{}],
initial_value="gold",
influence_conversation=False,
)
logged_in_slot = TextSlot(
name="logged_in",
mappings=[{}],
initial_value=True,
influence_conversation=False,
)
tracker = DialogueStateTracker.from_events(
sender_id="multiple_conditions",
evts=[UserUttered("Hello")],
slots=[membership_slot, logged_in_slot],
)
output_channel = "default"
domain_yaml = textwrap.dedent(
"""
version: "3.1"
intents:
- greet
slots:
membership:
type: text
mappings:
- type: custom
logged_in:
type: bool
influence_conversation: false
mappings:
- type: custom
responses:
utter_greet:
- text: "Hello"
id: "ID_0"
- text: "Hello valued customer!"
id: "ID_1"
condition:
- type: slot
name: membership
value: gold
- text: "Welcome back!"
id: "ID_2"
condition:
- type: slot
name: logged_in
value: true
"""
)
domain = Domain.from_yaml(domain_yaml)
response_variation_filter = ResponseVariationFilter(domain.responses)
# Act
response_variation_id = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel
)
# Assert
assert response_variation_id == "ID_1"
def test_response_variation_filter_get_response_id_chained_conditions() -> None:
# Arrange
utter_action = "utter_greet"
membership_slot = TextSlot(
name="membership",
mappings=[{}],
initial_value="gold",
influence_conversation=False,
)
logged_in_slot = TextSlot(
name="logged_in",
mappings=[{}],
initial_value=True,
influence_conversation=False,
)
tracker = DialogueStateTracker.from_events(
sender_id="chained_conditions",
evts=[UserUttered("Hello")],
slots=[membership_slot, logged_in_slot],
)
output_channel = "default"
domain_yaml = textwrap.dedent(
"""
version: "3.1"
intents:
- greet
slots:
membership:
type: text
mappings:
- type: custom
logged_in:
type: bool
influence_conversation: false
mappings:
- type: custom
responses:
utter_greet:
- text: "Hello"
id: "ID_0"
- text: "Welcome back!"
id: "ID_1"
condition:
- type: slot
name: logged_in
value: true
- type: slot
name: membership
value: gold
"""
)
domain = Domain.from_yaml(domain_yaml)
response_variation_filter = ResponseVariationFilter(domain.responses)
# Act
response_variation_id = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel
)
# Assert
assert response_variation_id == "ID_1"
def test_response_variation_filter_get_response_id_with_channels() -> None:
# Arrange
utter_action = "utter_greet"
membership_slot = TextSlot(
name="membership",
mappings=[{}],
initial_value="gold",
influence_conversation=False,
)
tracker = DialogueStateTracker.from_events(
sender_id="crv_channel", evts=[UserUttered("Hello")], slots=[membership_slot]
)
domain_yaml = textwrap.dedent(
"""
version: "3.1"
intents:
- greet
slots:
membership:
type: text
mappings:
- type: custom
logged_in:
type: bool
influence_conversation: false
mappings:
- type: custom
responses:
utter_greet:
- text: "How can I help you today?"
id: "ID_0"
- text: ""
id: "ID_1"
condition:
- type: slot
name: membership
value: gold
channel: app
- text: ""
id: "ID_2"
condition:
- type: slot
name: membership
value: gold
channel: web
"""
)
domain = Domain.from_yaml(domain_yaml)
response_variation_filter = ResponseVariationFilter(domain.responses)
# Act
response_variation_id = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel="app"
)
# Assert
assert response_variation_id == "ID_1"
# Act
response_variation_id = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel="web"
)
# Assert
assert response_variation_id == "ID_2"
# Act
response_variation_id = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel="default"
)
# Assert
assert response_variation_id == "ID_0"
@pytest.mark.parametrize(
"initial_value, output_channel, expected_id",
[
("gold", "app", "ID_1"),
("silver", "app", "ID_2"),
("bronze", "default", "ID_3"),
("gold", "default", "ID_4"),
],
)
def test_response_variation_filter_get_response_id_edge_cases(
initial_value: Text, output_channel: Text, expected_id: Text
) -> None:
# Arrange
utter_action = "utter_greet"
membership_slot = TextSlot(
name="membership",
mappings=[{}],
initial_value=initial_value,
influence_conversation=False,
)
tracker = DialogueStateTracker.from_events(
sender_id="edge_cases", evts=[UserUttered("Hello")], slots=[membership_slot]
)
domain_yaml = textwrap.dedent(
"""
version: "3.1"
intents:
- greet
slots:
membership:
type: text
mappings:
- type: custom
logged_in:
type: bool
influence_conversation: false
mappings:
- type: custom
responses:
utter_greet:
- text: "How can I help you today?"
id: "ID_0"
- text: ""
id: "ID_1"
condition:
- type: slot
name: membership
value: gold
channel: app
- text: ""
id: "ID_2"
condition:
- type: slot
name: membership
value: silver
channel: app
- text: ""
id: "ID_3"
condition:
- type: slot
name: membership
value: bronze
- text: ""
id: "ID_4"
condition:
- type: slot
name: membership
value: gold
"""
)
domain = Domain.from_yaml(domain_yaml)
response_variation_filter = ResponseVariationFilter(domain.responses)
# Act
response_variation_id = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel=output_channel
)
# Assert
assert response_variation_id == expected_id
def test_response_variation_filter_raises_exception_duplicate_ids() -> None:
# Arrange
utter_action = "utter_greet"
membership_slot = TextSlot(
name="membership",
mappings=[{}],
initial_value="gold",
influence_conversation=False,
)
tracker = DialogueStateTracker.from_events(
sender_id="duplicate_ids", evts=[UserUttered("Hello")], slots=[membership_slot]
)
domain_yaml = textwrap.dedent(
"""
version: "3.1"
intents:
- greet
slots:
membership:
type: text
mappings:
- type: custom
logged_in:
type: bool
influence_conversation: false
mappings:
- type: custom
responses:
utter_greet:
- text: "How can I help you today?"
id: "ID_0"
- text: ""
id: "ID_1"
- text: ""
id: "ID_1"
"""
)
domain = Domain.from_yaml(domain_yaml)
response_variation_filter = ResponseVariationFilter(domain.responses)
expected_message = "Duplicate response id 'ID_1' defined in the domain."
with pytest.warns(UserWarning, match=expected_message):
result = response_variation_filter.get_response_variation_id(
utter_action, tracker, output_channel="app"
)
assert result is None