test(connector): add test to ensure connector schema has `resource_opts`
https://emqx.atlassian.net/browse/EMQX-11509
This commit is contained in:
parent
bb04a2d89e
commit
ac2c99f996
|
@ -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,
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue