refactor(schema_registry): use one func for both encode and decode check

This commit is contained in:
Zaiming (Stone) Shi 2024-03-01 07:20:49 +01:00
parent 5df1784b49
commit fa275bf0a2
2 changed files with 19 additions and 21 deletions

View File

@ -74,24 +74,20 @@ handle_rule_function(schema_encode, [SchemaId, Term | MoreArgs]) ->
iolist_to_binary(IOList);
handle_rule_function(schema_encode, Args) ->
error({args_count_error, {schema_encode, Args}});
handle_rule_function(schema_check_decode, [SchemaId, Data | MoreArgs]) ->
check_decode(SchemaId, Data, MoreArgs);
handle_rule_function(schema_check_encode, [SchemaId, Term | MoreArgs]) ->
check_encode(SchemaId, Term, MoreArgs);
handle_rule_function(schema_check, [SchemaId, Data | MoreArgs]) ->
schema_check(SchemaId, Data, MoreArgs);
handle_rule_function(_, _) ->
{error, no_match_for_function}.
-spec check_decode(schema_name(), encoded_data(), [term()]) -> decoded_data().
check_decode(SerdeName, Data, VarArgs) ->
-spec schema_check(schema_name(), decoded_data() | encoded_data(), [term()]) -> decoded_data().
schema_check(SerdeName, Data, VarArgs) when is_list(VarArgs), is_binary(Data) ->
with_serde(
SerdeName,
fun(Serde) ->
?BOOL(SerdeName, eval_decode(Serde, [Data | VarArgs]))
end
).
-spec check_encode(schema_name(), decoded_data(), [term()]) -> encoded_data().
check_encode(SerdeName, Data, VarArgs) when is_list(VarArgs) ->
);
schema_check(SerdeName, Data, VarArgs) when is_list(VarArgs), is_map(Data) ->
with_serde(
SerdeName,
fun(Serde) ->

View File

@ -143,24 +143,26 @@ t_avro_invalid_schema(_Config) ->
t_serde_not_found(_Config) ->
%% for coverage
NonexistentSerde = <<"nonexistent">>,
EncodeData = #{},
DecodeData = <<"data">>,
?assertError(
{serde_not_found, NonexistentSerde},
emqx_schema_registry_serde:encode(NonexistentSerde, data)
emqx_schema_registry_serde:encode(NonexistentSerde, EncodeData)
),
?assertError(
{serde_not_found, NonexistentSerde},
emqx_schema_registry_serde:decode(NonexistentSerde, data)
emqx_schema_registry_serde:decode(NonexistentSerde, DecodeData)
),
?assertError(
{serde_not_found, NonexistentSerde},
emqx_schema_registry_serde:handle_rule_function(schema_check_decode, [
NonexistentSerde, data
emqx_schema_registry_serde:handle_rule_function(schema_check, [
NonexistentSerde, EncodeData
])
),
?assertError(
{serde_not_found, NonexistentSerde},
emqx_schema_registry_serde:handle_rule_function(schema_check_encode, [
NonexistentSerde, data
emqx_schema_registry_serde:handle_rule_function(schema_check, [
NonexistentSerde, DecodeData
])
),
ok.
@ -232,9 +234,9 @@ t_json_validation(_Config) ->
end,
OK = #{<<"foo">> => 1, <<"bar">> => 2},
NotOk = #{<<"bar">> => 2},
?assert(F(schema_check_encode, OK)),
?assert(F(schema_check_decode, <<"{\"foo\": 1, \"bar\": 2}">>)),
?assertNot(F(schema_check_encode, NotOk)),
?assertNot(F(schema_check_decode, <<"{\"bar\": 2}">>)),
?assertNot(F(schema_check_decode, <<"{\"foo\": \"notinteger\", \"bar\": 2}">>)),
?assert(F(schema_check, OK)),
?assert(F(schema_check, <<"{\"foo\": 1, \"bar\": 2}">>)),
?assertNot(F(schema_check, NotOk)),
?assertNot(F(schema_check, <<"{\"bar\": 2}">>)),
?assertNot(F(schema_check, <<"{\"foo\": \"notinteger\", \"bar\": 2}">>)),
ok.