test(connector): add test to ensure connector schema has `resource_opts`

https://emqx.atlassian.net/browse/EMQX-11509
This commit is contained in:
Thales Macedo Garitezi 2023-12-01 14:42:06 -03:00
parent bb04a2d89e
commit ac2c99f996
2 changed files with 75 additions and 5 deletions

View File

@ -260,11 +260,10 @@ create(BridgeType, BridgeName, RawConf) ->
#{override_to => cluster} #{override_to => cluster}
). ).
%% NOTE: This function can cause broken references from rules but it is only
%% called directly from test cases.
-spec remove(bridge_v2_type(), bridge_v2_name()) -> ok | {error, any()}. -spec remove(bridge_v2_type(), bridge_v2_name()) -> ok | {error, any()}.
remove(BridgeType, BridgeName) -> remove(BridgeType, BridgeName) ->
%% NOTE: This function can cause broken references from rules but it is only
%% called directly from test cases.
?SLOG(debug, #{ ?SLOG(debug, #{
brige_action => remove, brige_action => remove,
bridge_version => 2, bridge_version => 2,

View File

@ -16,6 +16,35 @@
-module(emqx_bridge_v2_tests). -module(emqx_bridge_v2_tests).
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
-include_lib("hocon/include/hoconsc.hrl").
%%------------------------------------------------------------------------------
%% Helper fns
%%------------------------------------------------------------------------------
non_deprecated_fields(Fields) ->
[K || {K, Schema} <- Fields, not hocon_schema:is_deprecated(Schema)].
find_resource_opts_fields(SchemaMod, FieldName) ->
Fields = hocon_schema:fields(SchemaMod, FieldName),
case lists:keyfind(resource_opts, 1, Fields) of
false ->
undefined;
{resource_opts, ROSc} ->
get_resource_opts_subfields(ROSc)
end.
get_resource_opts_subfields(ScFn) when is_function(ScFn, 1) ->
get_resource_opts_subfields(ScFn(type));
get_resource_opts_subfields(#{type := T = ?R_REF(_SchemaModRO, _FieldNameRO)}) ->
get_resource_opts_subfields(T);
get_resource_opts_subfields(?R_REF(SchemaModRO, FieldNameRO)) ->
ROFields = non_deprecated_fields(hocon_schema:fields(SchemaModRO, FieldNameRO)),
proplists:get_keys(ROFields).
%%------------------------------------------------------------------------------
%% Testcases
%%------------------------------------------------------------------------------
resource_opts_union_connector_actions_test() -> resource_opts_union_connector_actions_test() ->
%% The purpose of this test is to ensure we have split `resource_opts' fields %% The purpose of this test is to ensure we have split `resource_opts' fields
@ -37,5 +66,47 @@ resource_opts_union_connector_actions_test() ->
), ),
ok. ok.
non_deprecated_fields(Fields) -> connector_resource_opts_test() ->
[K || {K, Schema} <- Fields, not hocon_schema:is_deprecated(Schema)]. %% The purpose of this test is to ensure that all connectors have the `resource_opts'
%% field with at least some sub-fields that should always be present.
%% These are used by `emqx_resource_manager' itself to manage the resource lifecycle.
MinimumROFields = [
health_check_interval,
query_mode,
start_after_created,
start_timeout
],
ConnectorSchemasRefs =
lists:map(
fun({Type, #{type := ?MAP(_, ?R_REF(SchemaMod, FieldName))}}) ->
{Type, find_resource_opts_fields(SchemaMod, FieldName)}
end,
emqx_connector_schema:fields(connectors)
),
ConnectorsMissingRO = [Type || {Type, undefined} <- ConnectorSchemasRefs],
ConnectorsMissingROSubfields =
lists:filtermap(
fun
({_Type, undefined}) ->
false;
({Type, Fs}) ->
case MinimumROFields -- Fs of
[] ->
false;
MissingFields ->
{true, {Type, MissingFields}}
end
end,
ConnectorSchemasRefs
),
?assertEqual(
#{
missing_resource_opts_field => #{},
missing_subfields => #{}
},
#{
missing_resource_opts_field => maps:from_keys(ConnectorsMissingRO, true),
missing_subfields => maps:from_list(ConnectorsMissingROSubfields)
}
),
ok.