Просмотр исходного кода

fix: avoid 'rule_test' api crash

EMQ-YangM 3 лет назад
Родитель
Сommit
685b06eeed

+ 3 - 1
apps/emqx_rule_engine/src/emqx_rule_engine_api.erl

@@ -278,7 +278,9 @@ replace_sql_clrf(#{<<"sql">> := SQL} = Params) ->
             {error, {parse_error, Reason}} ->
                 {400, #{code => 'BAD_REQUEST', message => err_msg(Reason)}};
             {error, nomatch} ->
-                {412, #{code => 'NOT_MATCH', message => <<"SQL Not Match">>}}
+                {412, #{code => 'NOT_MATCH', message => <<"SQL Not Match">>}};
+            {error, Reason} ->
+                {400, #{code => 'BAD_REQUEST', message => err_msg(Reason)}}
         end
     ).
 

+ 25 - 0
apps/emqx_rule_engine/test/emqx_rule_engine_api_SUITE.erl

@@ -80,4 +80,29 @@ t_crud_rule_api(_Config) ->
         {404, #{code := _, message := _Message}},
         emqx_rule_engine_api:'/rules/:id'(get, #{bindings => #{id => RuleID}})
     ),
+
+    ?assertMatch(
+        {400, #{
+            code := 'BAD_REQUEST',
+            message := <<"{select_and_transform_error,{error,{decode_json_failed,", _/binary>>
+        }},
+        emqx_rule_engine_api:'/rule_test'(post, test_rule_params())
+    ),
     ok.
+
+test_rule_params() ->
+    #{
+        body => #{
+            <<"context">> =>
+                #{
+                    <<"clientid">> => <<"c_emqx">>,
+                    <<"event_type">> => <<"message_publish">>,
+                    <<"payload">> => <<"{\"msg\": \"hel">>,
+                    <<"qos">> => 1,
+                    <<"topic">> => <<"t/a">>,
+                    <<"username">> => <<"u_emqx">>
+                },
+            <<"sql">> =>
+                <<"SELECT\n  payload.msg\nFROM\n  \"t/#\"">>
+        }
+    }.