diff --git a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl index 63bd701fe..62e1553d2 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_engine_api.erl @@ -425,6 +425,8 @@ param_path_id() -> err_msg({RuleError, {_E, Reason, _S}}) -> emqx_misc:readable_error_msg(encode_nested_error(RuleError, Reason)); +err_msg({Reason, _Details}) -> + emqx_misc:readable_error_msg(Reason); err_msg(Msg) -> emqx_misc:readable_error_msg(Msg). diff --git a/apps/emqx_rule_engine/test/emqx_rule_engine_api_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_engine_api_SUITE.erl index 3da8ae9db..d89bc2651 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_engine_api_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_engine_api_SUITE.erl @@ -40,6 +40,9 @@ end_per_suite(_Config) -> init_per_testcase(_, Config) -> Config. +end_per_testcase(t_crud_rule_api, Config) -> + meck:unload(emqx_json), + end_per_testcase(common, Config); end_per_testcase(_, _Config) -> {200, #{data := Rules}} = emqx_rule_engine_api:'/rules'(get, #{query_string => #{}}), @@ -145,6 +148,29 @@ t_crud_rule_api(_Config) -> #{<<"select_and_transform_error">> := <<"badarg">>}, emqx_json:decode(SelectAndTransformBadArgError, [return_maps]) ), + {400, #{ + code := 'BAD_REQUEST', + message := BadSqlMessage + }} = emqx_rule_engine_api:'/rule_test'( + post, + test_rule_params( + <<"BAD_SQL">>, <<"{\"msg\": \"hello\"}">> + ) + ), + ?assertMatch({match, _}, re:run(BadSqlMessage, "syntax error")), + meck:expect(emqx_json, safe_encode, 1, {error, foo}), + ?assertMatch( + {400, #{ + code := 'BAD_REQUEST', + message := <<"{select_and_transform_error,badarg}">> + }}, + emqx_rule_engine_api:'/rule_test'( + post, + test_rule_params( + <<"SELECT\n payload.msg > 1\nFROM\n \"t/#\"">>, <<"{\"msg\": \"hello\"}">> + ) + ) + ), ok. t_list_rule_api(_Config) ->