emqx_rule_engine_api_SUITE.erl 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. -module(emqx_rule_engine_api_SUITE).
  2. -compile(nowarn_export_all).
  3. -compile(export_all).
  4. -include_lib("eunit/include/eunit.hrl").
  5. -include_lib("common_test/include/ct.hrl").
  6. -define(CONF_DEFAULT, <<"rule_engine {rules {}}">>).
  7. all() ->
  8. emqx_common_test_helpers:all(?MODULE).
  9. init_per_suite(Config) ->
  10. application:load(emqx_conf),
  11. ok = emqx_common_test_helpers:load_config(emqx_rule_engine_schema, ?CONF_DEFAULT),
  12. ok = emqx_common_test_helpers:start_apps([emqx_conf, emqx_rule_engine]),
  13. Config.
  14. end_per_suite(_Config) ->
  15. emqx_common_test_helpers:stop_apps([emqx_conf, emqx_rule_engine]),
  16. ok.
  17. init_per_testcase(_, Config) ->
  18. Config.
  19. end_per_testcase(_, _Config) ->
  20. ok.
  21. t_crud_rule_api(_Config) ->
  22. RuleID = <<"my_rule">>,
  23. Params0 = #{
  24. <<"description">> => <<"A simple rule">>,
  25. <<"enable">> => true,
  26. <<"id">> => RuleID,
  27. <<"actions">> => [#{<<"function">> => <<"console">>}],
  28. <<"sql">> => <<"SELECT * from \"t/1\"">>,
  29. <<"name">> => <<"test_rule">>
  30. },
  31. {201, Rule} = emqx_rule_engine_api:'/rules'(post, #{body => Params0}),
  32. %% if we post again with the same params, it return with 400 "rule id already exists"
  33. ?assertMatch(
  34. {400, #{code := _, message := _Message}},
  35. emqx_rule_engine_api:'/rules'(post, #{body => Params0})
  36. ),
  37. ?assertEqual(RuleID, maps:get(id, Rule)),
  38. {200, #{data := Rules}} = emqx_rule_engine_api:'/rules'(get, #{query_string => #{}}),
  39. ct:pal("RList : ~p", [Rules]),
  40. ?assert(length(Rules) > 0),
  41. {200, Rule0} = emqx_rule_engine_api:'/rules/:id/reset_metrics'(put, #{
  42. bindings => #{id => RuleID}
  43. }),
  44. ?assertEqual(<<"Reset Success">>, Rule0),
  45. {200, Rule1} = emqx_rule_engine_api:'/rules/:id'(get, #{bindings => #{id => RuleID}}),
  46. ct:pal("RShow : ~p", [Rule1]),
  47. ?assertEqual(Rule, Rule1),
  48. {200, Rule2} = emqx_rule_engine_api:'/rules/:id'(put, #{
  49. bindings => #{id => RuleID},
  50. body => Params0#{<<"sql">> => <<"select * from \"t/b\"">>}
  51. }),
  52. {200, Rule3} = emqx_rule_engine_api:'/rules/:id'(get, #{bindings => #{id => RuleID}}),
  53. %ct:pal("RShow : ~p", [Rule3]),
  54. ?assertEqual(Rule3, Rule2),
  55. ?assertEqual(<<"select * from \"t/b\"">>, maps:get(sql, Rule3)),
  56. ?assertMatch(
  57. {204},
  58. emqx_rule_engine_api:'/rules/:id'(
  59. delete,
  60. #{bindings => #{id => RuleID}}
  61. )
  62. ),
  63. %ct:pal("Show After Deleted: ~p", [NotFound]),
  64. ?assertMatch(
  65. {404, #{code := _, message := _Message}},
  66. emqx_rule_engine_api:'/rules/:id'(get, #{bindings => #{id => RuleID}})
  67. ),
  68. ?assertMatch(
  69. {400, #{
  70. code := 'BAD_REQUEST',
  71. message := <<"{select_and_transform_error,{error,{decode_json_failed,", _/binary>>
  72. }},
  73. emqx_rule_engine_api:'/rule_test'(post, test_rule_params())
  74. ),
  75. ok.
  76. t_list_rule_api(_Config) ->
  77. AddIds =
  78. lists:map(
  79. fun(Seq0) ->
  80. Seq = integer_to_binary(Seq0),
  81. Params = #{
  82. <<"description">> => <<"A simple rule">>,
  83. <<"enable">> => true,
  84. <<"actions">> => [#{<<"function">> => <<"console">>}],
  85. <<"sql">> => <<"SELECT * from \"t/1\"">>,
  86. <<"name">> => <<"test_rule", Seq/binary>>
  87. },
  88. {201, #{id := Id}} = emqx_rule_engine_api:'/rules'(post, #{body => Params}),
  89. Id
  90. end,
  91. lists:seq(1, 20)
  92. ),
  93. {200, #{data := Rules, meta := #{count := Count}}} =
  94. emqx_rule_engine_api:'/rules'(get, #{query_string => #{}}),
  95. ?assertEqual(20, length(AddIds)),
  96. ?assertEqual(20, length(Rules)),
  97. ?assertEqual(20, Count),
  98. [RuleID | _] = AddIds,
  99. UpdateParams = #{
  100. <<"description">> => <<"中文的描述也能搜索"/utf8>>,
  101. <<"enable">> => false,
  102. <<"actions">> => [#{<<"function">> => <<"console">>}],
  103. <<"sql">> => <<"SELECT * from \"t/1/+\"">>,
  104. <<"name">> => <<"test_rule_update1">>
  105. },
  106. {200, _Rule2} = emqx_rule_engine_api:'/rules/:id'(put, #{
  107. bindings => #{id => RuleID},
  108. body => UpdateParams
  109. }),
  110. QueryStr1 = #{query_string => #{<<"enable">> => false}},
  111. {200, Result1 = #{meta := #{count := Count1}}} = emqx_rule_engine_api:'/rules'(get, QueryStr1),
  112. ?assertEqual(1, Count1),
  113. QueryStr2 = #{query_string => #{<<"like_description">> => <<"也能"/utf8>>}},
  114. {200, Result2} = emqx_rule_engine_api:'/rules'(get, QueryStr2),
  115. ?assertEqual(Result1, Result2),
  116. QueryStr3 = #{query_string => #{<<"from">> => <<"t/1">>}},
  117. {200, #{meta := #{count := Count3}}} = emqx_rule_engine_api:'/rules'(get, QueryStr3),
  118. ?assertEqual(19, Count3),
  119. QueryStr4 = #{query_string => #{<<"like_from">> => <<"t/1/+">>}},
  120. {200, Result4} = emqx_rule_engine_api:'/rules'(get, QueryStr4),
  121. ?assertEqual(Result1, Result4),
  122. QueryStr5 = #{query_string => #{<<"match_from">> => <<"t/+/+">>}},
  123. {200, Result5} = emqx_rule_engine_api:'/rules'(get, QueryStr5),
  124. ?assertEqual(Result1, Result5),
  125. QueryStr6 = #{query_string => #{<<"like_id">> => RuleID}},
  126. {200, Result6} = emqx_rule_engine_api:'/rules'(get, QueryStr6),
  127. ?assertEqual(Result1, Result6),
  128. %% clean up
  129. lists:foreach(
  130. fun(Id) ->
  131. ?assertMatch(
  132. {204},
  133. emqx_rule_engine_api:'/rules/:id'(
  134. delete,
  135. #{bindings => #{id => Id}}
  136. )
  137. )
  138. end,
  139. AddIds
  140. ),
  141. ok.
  142. test_rule_params() ->
  143. #{
  144. body => #{
  145. <<"context">> =>
  146. #{
  147. <<"clientid">> => <<"c_emqx">>,
  148. <<"event_type">> => <<"message_publish">>,
  149. <<"payload">> => <<"{\"msg\": \"hel">>,
  150. <<"qos">> => 1,
  151. <<"topic">> => <<"t/a">>,
  152. <<"username">> => <<"u_emqx">>
  153. },
  154. <<"sql">> =>
  155. <<"SELECT\n payload.msg\nFROM\n \"t/#\"">>
  156. }
  157. }.