示例#1
0
def test_custom_action_merge():
    "Test `merge=True` for custom actions"
    action_config = {"url": "http://localhost:8080/v2/action"}
    action = CustomAction(name="action_call_people", config=action_config)

    with patch("requests.post") as mock_object:
        mock_object.return_value = Mock()
        mock_object.return_value.status_code = 200
        mock_object.return_value.json.return_value = {
            "directives": ["directive3", "directive4"],
            "frame": {"k2": "v2"},
            "slots": {"s2": "v2"},
            "params": {
                "allowed_intents": ["intent3", "intent4"],
                "dynamic_resource": {"r2": "v2"},
                "language": "some-language",
                "locale": "some-locale",
                "time_zone": "some-time-zone",
                "target_dialogue_state": "some-state",
                "timestamp": "some-timestamp",
            },
        }

        request = Request(
            text="sing a song", domain="some domain", intent="some intent"
        )
        responder = DialogueResponder()
        responder.directives = ["directive1", "directive2"]
        responder.frame = {"k1": "v1"}
        responder.slots = {"s1": "v1"}
        responder.params.allowed_intents = ("intent1", "intent2")
        responder.params.dynamic_resource = {"r1": "v1"}
        assert action.invoke(request, responder)
        assert responder.directives == [
            "directive1",
            "directive2",
            "directive3",
            "directive4",
        ]
        assert responder.frame == {"k1": "v1", "k2": "v2"}
        assert responder.slots == {"s1": "v1", "s2": "v2"}
        assert responder.params.allowed_intents == (
            "intent1",
            "intent2",
            "intent3",
            "intent4",
        )
        assert responder.params.dynamic_resource == {"r1": "v1", "r2": "v2"}
        assert responder.params.target_dialogue_state == "some-state"
        assert responder.params.language == "some-language"
        assert responder.params.locale == "some-locale"
        assert responder.params.time_zone == "some-time-zone"
        assert responder.params.timestamp == "some-timestamp"
示例#2
0
def sample_request():
    dict_list = [{"key": "value"}, {"key": "value"}, {"key": "value"}]
    return Request(
        domain="some_domain",
        intent="some_intent",
        entities=(dict_list),
        text="some_text",
        history=(dict_list),
        nbest_transcripts_text=(dict_list),
        nbest_transcripts_entities=(dict_list),
        nbest_aligned_entities=(dict_list),
    )
示例#3
0
def test_auto_fill_invoke(kwik_e_mart_app):
    """Tests slot-filling invoke functionality"""
    app = kwik_e_mart_app
    request = Request(
        text="elm street",
        domain="store_info",
        intent="get_store_number",
        entities=[{
            "type": "store_name",
            "value": [{
                "cname": "23 Elm Street"
            }],
            "role": None
        }],
    )
    responder = DialogueResponder()

    # custom eval func
    def test_custom_eval(r):
        # entity already passed in, this is to check custom eval flow.
        del r
        return True

    # mock handler for invoke
    handler_sub = MagicMock()
    handler_sub.__name__ = "handler_sub"

    form = {
        "entities": [
            FormEntity(
                entity="store_name",
                value="23 Elm Street",
                default_eval=False,
                custom_eval=test_custom_eval,
            )
        ],
    }

    @app.handle(domain="store_info", intent="get_store_number")
    def handler_main(request, responder):
        AutoEntityFilling(handler_sub, form, app).invoke(request, responder)

    handler_main(request, responder)

    # check whether the sub handler was invoked.
    handler_sub.assert_called_once_with(request, responder)

    # check whether new rule has been added for sub handler.
    assert any([
        rule.dialogue_state == handler_sub.__name__
        for rule in list(app.app_manager.dialogue_manager.rules)
    ])
示例#4
0
def sample_request():
    dict_list = [{"key": "value"}, {"key": "value"}, {"key": "value"}]
    dict_list_of_lists = [[{"key": "value"}, {"key": "value"}, {"key": "value"}],
                          [{"key": "value"}, {"key": "value"}, {"key": "value"}]]
    lists = ['key_1', 'key_2', 'key_3']
    return Request(
        domain="some_domain",
        intent="some_intent",
        entities=dict_list,
        text="some_text",
        history=dict_list,
        nbest_transcripts_text=lists,
        nbest_transcripts_entities=dict_list_of_lists,
        nbest_aligned_entities=dict_list_of_lists,
    )
示例#5
0
def test_custom_action():
    """Test CustomAction.invoke to ensure that the parameters of the JSON body are correct"""
    action_config = {"url": "http://localhost:8080/v2/action"}
    action = CustomAction(name="action_call_people", config=action_config)

    with patch("requests.post") as mock_object:
        mock_object.return_value = Mock()
        mock_object.return_value.status_code = 200
        mock_object.return_value.json.return_value = {}

        request = Request(
            text="sing a song", domain="some domain", intent="some intent"
        )
        responder = DialogueResponder()
        assert action.invoke(request, responder)
        assert mock_object.call_args[1]["url"] == action_config["url"]
        assert "request" in mock_object.call_args[1]["json"]
        assert "responder" in mock_object.call_args[1]["json"]
        assert mock_object.call_args[1]["json"]["action"] == "action_call_people"
示例#6
0
async def test_custom_action_async():
    """Test CustomAction.invoke_async to ensure that the parameters of the JSON body are correct"""
    action_config = {"url": "http://localhost:8080/v2/action"}
    action = CustomAction(name="action_call_people", config=action_config)

    with patch("mindmeld.components.CustomAction.post_async") as mock_object:

        async def mock_coroutine():
            return 200, {}

        mock_object.return_value = mock_coroutine()
        request = Request(text="sing a song",
                          domain="some domain",
                          intent="some intent")
        responder = DialogueResponder()
        assert await action.invoke_async(request, responder)
        call_args = mock_object.call_args_list[0][0][0]
        assert "request" in call_args
        assert "responder" in call_args
        assert call_args["action"] == "action_call_people"
示例#7
0
def test_immutability_of_sample_request_and_params():
    """Test the immutability of the sample_request and params objects"""
    with pytest.raises(FrozenInstanceError):
        params = FrozenParams()
        params.allowed_intents = []

    with pytest.raises(TypeError):
        params = FrozenParams()
        params.dynamic_resource["a"] = "b"

    with pytest.raises(FrozenInstanceError):
        request = Request()
        request.params = Params()

    with pytest.raises(TypeError):
        request = Request()
        request.frame["a"] = "b"
示例#8
0
def test_auto_fill_custom_validation_resolution(kwik_e_mart_app):
    """Tests slot-filling's custom validation with custom resolution"""
    app = kwik_e_mart_app
    request = Request(
        text="what is the sum of 5 and 15?",
        domain="some domain",
        intent="some intent",
    )
    responder = DialogueResponder()

    # custom eval func
    @app.register_func()
    def test_custom_eval(r):
        return 5 + 15

    form = {
        "entities": [
            FormEntity(
                entity="sys_number",
                default_eval=False,
                custom_eval="test_custom_eval",
            )
        ],
    }

    def handler_sub(request, responder):
        entity = next((e for e in request.entities if e["type"] == "sys_number"), None)

        # Check custom resolution validity
        assert entity
        assert entity["value"][0]["value"] == 20

    @app.handle(domain="some domain", intent="some intent")
    def handler(request, responder):
        AutoEntityFilling(handler_sub, form, app).invoke(request, responder)

    handler(request, responder)
示例#9
0
def create_request(domain, intent, entities=None):
    """Creates a request object for use by the dialogue manager"""
    entities = entities or ()
    return Request(domain=domain, intent=intent, entities=entities, text="")
示例#10
0
def request():
    return Request(domain="some_domain",
                   intent="some_intent",
                   entities=(),
                   text="some_text")
示例#11
0
def request():
    return Request(domain='some_domain',
                   intent='some_intent',
                   entities=(),
                   text='some_text')