From e811f4a3922a70fcf97ac6c9b59302a0b49089c6 Mon Sep 17 00:00:00 2001 From: Kjell Winblad Date: Mon, 13 May 2024 16:33:14 +0200 Subject: [PATCH] fix: add handling of message_validation_failed ctx for rule testing Before this commit, the backend could not handle the test context for message_validation_failed events that could be sent from the dashboard since no handling code for this contexts existed in the backend. This has now been fixed by adding such handling code. Fixes: https://emqx.atlassian.net/browse/EMQX-12354 --- .../emqx_rule_engine/src/emqx_rule_api_schema.erl | 10 +++++++++- apps/emqx_rule_engine/src/emqx_rule_sqltester.erl | 2 ++ .../test/emqx_rule_engine_api_rule_test_SUITE.erl | 15 +++++++++++++++ rel/i18n/emqx_rule_api_schema.hocon | 6 ++++++ 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/apps/emqx_rule_engine/src/emqx_rule_api_schema.erl b/apps/emqx_rule_engine/src/emqx_rule_api_schema.erl index f4685222c..a9f65b0fa 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_api_schema.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_api_schema.erl @@ -307,6 +307,13 @@ fields("ctx_delivery_dropped") -> {"from_clientid", sc(binary(), #{desc => ?DESC("event_from_clientid")})}, {"from_username", sc(binary(), #{desc => ?DESC("event_from_username")})} | msg_event_common_fields() + ]; +fields("ctx_schema_validation_failed") -> + Event = 'schema.validation_failed', + [ + {"event_type", event_type_sc(Event)}, + {"validation", sc(binary(), #{desc => ?DESC("event_validation")})} + | msg_event_common_fields() ]. rule_input_message_context() -> @@ -324,7 +331,8 @@ rule_input_message_context() -> ref("ctx_connack"), ref("ctx_check_authz_complete"), ref("ctx_bridge_mqtt"), - ref("ctx_delivery_dropped") + ref("ctx_delivery_dropped"), + ref("ctx_schema_validation_failed") ]), #{ desc => ?DESC("test_context"), diff --git a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl index 6d393c24a..1c78b5525 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_sqltester.erl @@ -197,6 +197,8 @@ is_test_runtime_env() -> %% Most events have the original `topic' input, but their own topic (i.e.: `$events/...') %% is different from `topic'. +get_in_topic(#{event_type := schema_validation_failed}) -> + <<"$events/schema_validation_failed">>; get_in_topic(Context) -> case maps:find(event_topic, Context) of {ok, EventTopic} -> diff --git a/apps/emqx_rule_engine/test/emqx_rule_engine_api_rule_test_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_engine_api_rule_test_SUITE.erl index 8b47669da..6bdd7b3bc 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_engine_api_rule_test_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_engine_api_rule_test_SUITE.erl @@ -214,6 +214,21 @@ t_ctx_delivery_dropped(_) -> Expected = check_result([from_clientid, from_username, reason, qos, topic], [], Context), do_test(SQL, Context, Expected). +t_ctx_schema_validation_failed(_) -> + SQL = + <<"SELECT validation FROM \"$events/schema_validation_failed\"">>, + Context = #{ + <<"clientid">> => <<"c_emqx">>, + <<"event_type">> => <<"schema_validation_failed">>, + <<"payload">> => <<"{\"msg\": \"hello\"}">>, + <<"qos">> => 1, + <<"topic">> => <<"t/a">>, + <<"username">> => <<"u_emqx">>, + <<"validation">> => <<"m">> + }, + Expected = check_result([validation], [], Context), + do_test(SQL, Context, Expected). + t_mongo_date_function_should_return_string_in_test_env(_) -> SQL = <<"SELECT mongo_date() as mongo_date FROM \"$events/client_check_authz_complete\"">>, diff --git a/rel/i18n/emqx_rule_api_schema.hocon b/rel/i18n/emqx_rule_api_schema.hocon index 68c6a560d..668e2581a 100644 --- a/rel/i18n/emqx_rule_api_schema.hocon +++ b/rel/i18n/emqx_rule_api_schema.hocon @@ -360,6 +360,12 @@ event_username.desc: event_username.label: """Username""" +event_validation.desc: +"""Validation""" + +event_validation.label: +"""Validation""" + root_rule_info.desc: """Schema for rule info"""