diff --git a/apps/emqx_management/test/emqx_mgmt_api_clients_SUITE.erl b/apps/emqx_management/test/emqx_mgmt_api_clients_SUITE.erl index 6daf918f1..0d9e8eef6 100644 --- a/apps/emqx_management/test/emqx_mgmt_api_clients_SUITE.erl +++ b/apps/emqx_management/test/emqx_mgmt_api_clients_SUITE.erl @@ -430,6 +430,62 @@ t_client_id_not_found(_Config) -> {error, {Http, _, Body}}, PostFun(post, PathFun(["unsubscribe", "bulk"]), [UnsubBody]) ). +t_subscribe_shared_topic(_Config) -> + ClientId = <<"client_subscribe_shared">>, + + {ok, C} = emqtt:start_link(#{clientid => ClientId}), + {ok, _} = emqtt:connect(C), + {ok, _, _} = emqtt:subscribe(C, <<"topic/1">>, 1), + + AuthHeader = emqx_mgmt_api_test_util:auth_header_(), + + Http200 = {"HTTP/1.1", 200, "OK"}, + Http204 = {"HTTP/1.1", 204, "No Content"}, + + PathFun = fun(Suffix) -> + emqx_mgmt_api_test_util:api_path(["clients", "client_subscribe_shared"] ++ Suffix) + end, + + PostFun = fun(Method, Path, Data) -> + emqx_mgmt_api_test_util:request_api( + Method, Path, "", AuthHeader, Data, #{return_all => true} + ) + end, + + SharedT = <<"$share/group/testtopic">>, + NonSharedT = <<"t/1">>, + + SubBodyFun = fun(T) -> #{topic => T, qos => 1, nl => 1, rh => 1} end, + UnSubBodyFun = fun(T) -> #{topic => T} end, + + %% Client Subscribe + ?assertMatch( + {ok, {Http200, _, _}}, + PostFun(post, PathFun(["subscribe"]), SubBodyFun(SharedT)) + ), + ?assertMatch( + {ok, {Http200, _, _}}, + PostFun( + post, + PathFun(["subscribe", "bulk"]), + [SubBodyFun(T) || T <- [SharedT, NonSharedT]] + ) + ), + + %% Client Unsubscribe + ?assertMatch( + {ok, {Http204, _, _}}, + PostFun(post, PathFun(["unsubscribe"]), UnSubBodyFun(SharedT)) + ), + ?assertMatch( + {ok, {Http204, _, _}}, + PostFun( + post, + PathFun(["unsubscribe", "bulk"]), + [UnSubBodyFun(T) || T <- [SharedT, NonSharedT]] + ) + ). + time_string_to_epoch_millisecond(DateTime) -> time_string_to_epoch(DateTime, millisecond).