test(rule_engine): test some unicode chars as rule id
This commit is contained in:
parent
892becb5bf
commit
c21a2cf4c6
|
@ -28,6 +28,14 @@
|
||||||
-include("emqx_rule_test.hrl").
|
-include("emqx_rule_test.hrl").
|
||||||
-import(emqx_rule_test_lib, [make_simple_resource_type/1]).
|
-import(emqx_rule_test_lib, [make_simple_resource_type/1]).
|
||||||
|
|
||||||
|
%% API request funcs
|
||||||
|
-import(emqx_rule_test_lib,
|
||||||
|
[ request_api/4
|
||||||
|
, request_api/5
|
||||||
|
, auth_header_/0
|
||||||
|
, api_path/1
|
||||||
|
]).
|
||||||
|
|
||||||
%%-define(PROPTEST(M,F), true = proper:quickcheck(M:F())).
|
%%-define(PROPTEST(M,F), true = proper:quickcheck(M:F())).
|
||||||
|
|
||||||
all() ->
|
all() ->
|
||||||
|
@ -62,6 +70,7 @@ groups() ->
|
||||||
]},
|
]},
|
||||||
{api, [],
|
{api, [],
|
||||||
[t_crud_rule_api,
|
[t_crud_rule_api,
|
||||||
|
t_rule_api_unicode_ids,
|
||||||
t_list_actions_api,
|
t_list_actions_api,
|
||||||
t_show_action_api,
|
t_show_action_api,
|
||||||
t_crud_resources_api,
|
t_crud_resources_api,
|
||||||
|
@ -227,6 +236,10 @@ init_per_testcase(Test, Config)
|
||||||
{conn_event, TriggerConnEvent},
|
{conn_event, TriggerConnEvent},
|
||||||
{connsql, SQL}
|
{connsql, SQL}
|
||||||
| Config];
|
| Config];
|
||||||
|
init_per_testcase(t_rule_api_unicode_ids, Config) ->
|
||||||
|
ok = emqx_dashboard_admin:mnesia(boot),
|
||||||
|
emqx_ct_helpers:start_apps([emqx_management, emqx_dashboard]),
|
||||||
|
Config;
|
||||||
init_per_testcase(_TestCase, Config) ->
|
init_per_testcase(_TestCase, Config) ->
|
||||||
ok = emqx_rule_registry:register_resource_types(
|
ok = emqx_rule_registry:register_resource_types(
|
||||||
[make_simple_debug_resource_type()]),
|
[make_simple_debug_resource_type()]),
|
||||||
|
@ -249,6 +262,10 @@ end_per_testcase(Test, Config)
|
||||||
emqtt:stop(?config(subclient, Config)),
|
emqtt:stop(?config(subclient, Config)),
|
||||||
emqtt:stop(?config(connclient, Config)),
|
emqtt:stop(?config(connclient, Config)),
|
||||||
Config;
|
Config;
|
||||||
|
end_per_testcase(t_rule_api_unicode_ids, _Config) ->
|
||||||
|
application:stop(emqx_dashboard),
|
||||||
|
application:stop(emqx_management),
|
||||||
|
ok;
|
||||||
end_per_testcase(_TestCase, _Config) ->
|
end_per_testcase(_TestCase, _Config) ->
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
@ -523,6 +540,46 @@ t_crud_rule_api(_Config) ->
|
||||||
?assertMatch({ok, #{code := 404, message := _Message}}, NotFound),
|
?assertMatch({ok, #{code := 404, message := _Message}}, NotFound),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
-define(PRED(Elem), fun(Elem) -> true; (_) -> false end).
|
||||||
|
|
||||||
|
t_rule_api_unicode_ids(_Config) ->
|
||||||
|
UData =
|
||||||
|
fun(Description) ->
|
||||||
|
#{<<"name">> => <<"debug-rule">>,
|
||||||
|
<<"rawsql">> => <<"select * from \"t/a\"">>,
|
||||||
|
<<"actions">> => [#{<<"name">> => <<"do_nothing">>,
|
||||||
|
<<"params">> => []}
|
||||||
|
],
|
||||||
|
<<"description">> => Description}
|
||||||
|
end,
|
||||||
|
CData = fun(Id, Description) -> maps:put(<<"id">>, Id, UData(Description)) end,
|
||||||
|
|
||||||
|
CDes = <<"Creating rules description">>,
|
||||||
|
UDes = <<"Updating rules description">>,
|
||||||
|
|
||||||
|
%% create rule
|
||||||
|
CFun = fun(Id) -> {ok, Return} = request_api(post, api_path(["rules"]), [], auth_header_(), CData(Id, CDes)), Return end,
|
||||||
|
%% update rule
|
||||||
|
UFun = fun(Id) -> {ok, Return} = request_api(put, api_path(["rules", cow_uri:urlencode(Id)]), [], auth_header_(), UData(UDes)), Return end,
|
||||||
|
%% show rule
|
||||||
|
SFun = fun(Id) -> {ok, Return} = request_api(get, api_path(["rules", cow_uri:urlencode(Id)]), [], auth_header_()), Return end,
|
||||||
|
%% delete rule
|
||||||
|
DFun = fun(Id) -> {ok, Return} = request_api(delete, api_path(["rules", cow_uri:urlencode(Id)]), [], auth_header_()), Return end,
|
||||||
|
|
||||||
|
Ids = [unicode:characters_to_binary([Char]) || Char <- lists:seq(0, 1000) -- [46]] ++ [<<"%2e">>],
|
||||||
|
|
||||||
|
Ress = [begin
|
||||||
|
{?assertMatch(#{<<"code">> := 0, <<"data">> := #{<<"description">> := CDes}}, decode_to_map(CFun(Id))),
|
||||||
|
?assertMatch(#{<<"code">> := 0}, decode_to_map(UFun(Id))),
|
||||||
|
?assertMatch(#{<<"code">> := 0, <<"data">> := #{<<"description">> := UDes}}, decode_to_map(SFun(Id))),
|
||||||
|
?assertMatch(#{<<"code">> := 0}, decode_to_map(DFun(Id)))}
|
||||||
|
end || Id <- Ids],
|
||||||
|
|
||||||
|
?assertEqual(true, lists:all(?PRED(true), [?PRED({ok, ok, ok, ok})(Res) || Res <- Ress ])).
|
||||||
|
|
||||||
|
decode_to_map(ResponseBody) ->
|
||||||
|
jiffy:decode(list_to_binary(ResponseBody), [return_maps]).
|
||||||
|
|
||||||
t_list_rule_api(_Config) ->
|
t_list_rule_api(_Config) ->
|
||||||
AddIds =
|
AddIds =
|
||||||
lists:map(fun(Seq) ->
|
lists:map(fun(Seq) ->
|
||||||
|
|
|
@ -128,6 +128,67 @@ make_simple_resource_type(ResTypeName) ->
|
||||||
init_events_counters() ->
|
init_events_counters() ->
|
||||||
ets:new(events_record_tab, [named_table, bag, public]).
|
ets:new(events_record_tab, [named_table, bag, public]).
|
||||||
|
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
%% rule test helper funcs
|
||||||
|
%%------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-define(HOST, "http://127.0.0.1:18083/").
|
||||||
|
|
||||||
|
-define(API_VERSION, "v4").
|
||||||
|
|
||||||
|
-define(BASE_PATH, "api").
|
||||||
|
|
||||||
|
request_api(Method, Url, Auth) ->
|
||||||
|
request_api(Method, Url, [], Auth, []).
|
||||||
|
|
||||||
|
request_api(Method, Url, QueryParams, Auth) ->
|
||||||
|
request_api(Method, Url, QueryParams, Auth, []).
|
||||||
|
|
||||||
|
request_api(Method, Url, QueryParams, Auth, []) ->
|
||||||
|
NewUrl = case QueryParams of
|
||||||
|
"" -> Url;
|
||||||
|
_ -> Url ++ "?" ++ QueryParams
|
||||||
|
end,
|
||||||
|
Headers = case Auth of
|
||||||
|
no_auth -> [];
|
||||||
|
Header -> [Header]
|
||||||
|
end,
|
||||||
|
do_request_api(Method, {NewUrl, Headers});
|
||||||
|
request_api(Method, Url, QueryParams, Auth, Body) ->
|
||||||
|
NewUrl = case QueryParams of
|
||||||
|
"" -> Url;
|
||||||
|
_ -> Url ++ "?" ++ QueryParams
|
||||||
|
end,
|
||||||
|
Headers = case Auth of
|
||||||
|
no_auth -> [];
|
||||||
|
Header -> [Header]
|
||||||
|
end,
|
||||||
|
do_request_api(Method, {NewUrl, Headers, "application/json", emqx_json:encode(Body)}).
|
||||||
|
|
||||||
|
do_request_api(Method, Request)->
|
||||||
|
%% ct:pal("Method: ~p, Request: ~p", [Method, Request]),
|
||||||
|
case httpc:request(Method, Request, [], []) of
|
||||||
|
{error, socket_closed_remotely} ->
|
||||||
|
{error, socket_closed_remotely};
|
||||||
|
{ok, {{"HTTP/1.1", Code, _}, _, Return} }
|
||||||
|
when Code =:= 200 orelse Code =:= 201 ->
|
||||||
|
{ok, Return};
|
||||||
|
{ok, {Reason, _, _}} ->
|
||||||
|
{error, Reason}
|
||||||
|
end.
|
||||||
|
|
||||||
|
auth_header_() ->
|
||||||
|
AppId = <<"admin">>,
|
||||||
|
AppSecret = <<"public">>,
|
||||||
|
auth_header_(binary_to_list(AppId), binary_to_list(AppSecret)).
|
||||||
|
|
||||||
|
auth_header_(User, Pass) ->
|
||||||
|
Encoded = base64:encode_to_string(lists:append([User,":",Pass])),
|
||||||
|
{"Authorization","Basic " ++ Encoded}.
|
||||||
|
|
||||||
|
api_path(Parts)->
|
||||||
|
?HOST ++ filename:join([?BASE_PATH, ?API_VERSION] ++ Parts).
|
||||||
|
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
%% Internal helper funcs
|
%% Internal helper funcs
|
||||||
%%------------------------------------------------------------------------------
|
%%------------------------------------------------------------------------------
|
||||||
|
|
Loading…
Reference in New Issue