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}
|
||||
).
|
||||
|
||||
%% 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()}.
|
||||
remove(BridgeType, BridgeName) ->
|
||||
%% NOTE: This function can cause broken references from rules but it is only
|
||||
%% called directly from test cases.
|
||||
?SLOG(debug, #{
|
||||
brige_action => remove,
|
||||
bridge_version => 2,
|
||||
|
|
|
@ -16,6 +16,35 @@
|
|||
-module(emqx_bridge_v2_tests).
|
||||
|
||||
-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() ->
|
||||
%% 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.
|
||||
|
||||
non_deprecated_fields(Fields) ->
|
||||
[K || {K, Schema} <- Fields, not hocon_schema:is_deprecated(Schema)].
|
||||
connector_resource_opts_test() ->
|
||||
%% 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