Skip to content

Commit

Permalink
Add tests for SSE
Browse files Browse the repository at this point in the history
  • Loading branch information
chrzaszcz committed Nov 2, 2022
1 parent 199e75e commit 453435f
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 9 deletions.
1 change: 1 addition & 0 deletions big_tests/default.spec
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
{suites, "tests", extdisco_SUITE}.
{suites, "tests", gdpr_SUITE}.
{suites, "tests", graphql_SUITE}.
{suites, "tests", graphql_sse_SUITE}.
{suites, "tests", graphql_account_SUITE}.
{suites, "tests", graphql_domain_SUITE}.
{suites, "tests", graphql_inbox_SUITE}.
Expand Down
27 changes: 19 additions & 8 deletions big_tests/tests/graphql_helper.erl
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,18 @@ execute(EpName, Body, Creds) ->
-spec execute(node(), atom(), binary(), {binary(), binary()} | undefined) ->
{Status :: tuple(), Data :: map()}.
execute(Node, EpName, Body, Creds) ->
Request =
#{port => get_listener_port(Node, EpName),
role => {graphql, EpName},
method => <<"POST">>,
return_maps => true,
creds => Creds,
path => "/graphql",
body => Body},
Request = build_request(Node, EpName, Body, Creds),
rest_helper:make_request(Request).

build_request(Node, EpName, Body, Creds) ->
#{port => get_listener_port(Node, EpName),
role => {graphql, EpName},
method => <<"POST">>,
return_maps => true,
creds => Creds,
path => "/graphql",
body => Body}.

execute_sse(EpName, Params, Creds) ->
#{node := Node} = mim(),
execute_sse(Node, EpName, Params, Creds).
Expand Down Expand Up @@ -213,6 +215,9 @@ get_unauthorized({Code, #{<<"errors">> := Errors}}) ->
get_bad_request({Code, _Msg}) ->
assert_response_code(bad_request, Code).

get_method_not_allowed({Code, _Msg}) ->
assert_response_code(method_not_allowed, Code).

get_coercion_err_msg({Code, #{<<"errors">> := [Error]}}) ->
assert_response_code(bad_request, Code),
?assertEqual(<<"input_coercion">>, get_value([extensions, code], Error)),
Expand All @@ -236,8 +241,14 @@ get_ok_value(Path, {Code, Data}) ->

assert_response_code(bad_request, {<<"400">>, <<"Bad Request">>}) -> ok;
assert_response_code(unauthorized, {<<"401">>, <<"Unauthorized">>}) -> ok;
assert_response_code(method_not_allowed, {<<"405">>, <<"Method Not Allowed">>}) -> ok;
assert_response_code(error, {<<"200">>, <<"OK">>}) -> ok;
assert_response_code(ok, {<<"200">>, <<"OK">>}) -> ok;
assert_response_code(bad_request, 400) -> ok;
assert_response_code(unauthorized, 401) -> ok;
assert_response_code(method_not_allowed, 405) -> ok;
assert_response_code(error, 200) -> ok;
assert_response_code(ok, 200) -> ok;
assert_response_code(bad_request, {exit_status, 1}) -> ok;
assert_response_code(error, {exit_status, 1}) -> ok;
assert_response_code(ok, {exit_status, 0}) -> ok;
Expand Down
78 changes: 78 additions & 0 deletions big_tests/tests/graphql_sse_SUITE.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
-module(graphql_sse_SUITE).

-compile([export_all, nowarn_export_all]).

-import(distributed_helper, [mim/0, require_rpc_nodes/1, rpc/4]).
-import(graphql_helper, [get_bad_request/1, get_unauthorized/1, get_method_not_allowed/1,
build_request/4,
execute_auth/2, execute_sse/3, execute_auth_sse/2]).

suite() ->
require_rpc_nodes([mim]) ++ escalus:suite().

all() ->
[{group, admin}%% ,
%% {group, domain_admin},
%% {group, user}
].

groups() ->
[{admin, [parallel], admin_tests()}%,
%{domain_admin, [parallel], domain_admin_tests()},
%{user, [parallel], user_tests()}
].

init_per_suite(Config) ->
Config1 = escalus:init_per_suite(Config),
application:ensure_all_started(gun),
Config1.

end_per_suite(Config) ->
escalus:end_per_suite(Config).

init_per_group(admin, Config) ->
graphql_helper:init_admin_handler(Config).

end_per_group(_, _Config) ->
graphql_helper:clean().

admin_tests() ->
[admin_missing_query,
admin_invalid_query_string,
admin_missing_creds,
admin_invalid_creds,
admin_invalid_method].

domain_admin_test() ->
[].

user_tests() ->
[].

admin_missing_query(Config) ->
get_bad_request(execute_auth_sse(#{}, Config)).

admin_invalid_query_string(_Config) ->
Port = graphql_helper:get_listener_port(admin),
get_bad_request(sse_helper:connect_to_sse(Port, "/api/graphql/sse?=invalid", undefined, #{})).

admin_missing_creds(_Config) ->
get_unauthorized(execute_sse(admin, admin_params(), undefined)).

admin_invalid_creds(_Config) ->
get_unauthorized(execute_sse(admin, admin_params(), {<<"invalid">>, <<"creds">>})).

admin_invalid_method(_Config) ->
#{node := Node} = mim(),
Request = graphql_helper:build_request(Node, admin, admin_params(), undefined),
%% POST was used, while SSE accepts only GET
get_method_not_allowed(rest_helper:make_request(Request#{path => "/graphql/sse"})).

admin_params() ->
#{query => admin_doc(), variables => admin_args()}.

admin_doc() ->
graphql_helper:get_doc(<<"stanza">>, <<"getMessages">>).

admin_args() ->
#{caller => <<"alice@localhost">>}.
6 changes: 5 additions & 1 deletion big_tests/tests/sse_helper.erl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
-compile([export_all, nowarn_export_all]).

connect_to_sse(Port, Path, Creds, ExtraOpts) ->
ct:log("Connect to SSE, port: ~p, path: ~s, creds: ~p, extra opts: ~p",
[Port, Path, Creds, ExtraOpts]),
Headers = auth_headers(Creds) ++ [{<<"host">>, <<"localhost">>},
{<<"accept">>, <<"text/event-stream">>}],
Opts = maps:merge(basic_opts(), ExtraOpts),
Expand All @@ -17,10 +19,12 @@ connect_to_sse(Port, Path, Creds, ExtraOpts) ->
{ok, Body} = gun:await_body(ConnPid, StreamRef),
jiffy:decode(Body, [return_maps])
end,
ct:log("SSE response code: ~p, result: ~p", [Status, Result]),
{Status, Result}.

wait_for_event(#{pid := Pid, stream_ref := StreamRef}) ->
{sse, #{data := [Response]}} = gun:await(Pid, StreamRef),
{sse, #{data := [Response]} = Event} = gun:await(Pid, StreamRef),
ct:log("Received SSE event: ~p", [Event]),
jiffy:decode(Response, [return_maps]).

stop_sse(#{pid := Pid}) ->
Expand Down
2 changes: 2 additions & 0 deletions priv/graphql/schemas/admin/stanza.gql
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,7 @@ type StanzaAdminMutation @protected{
}

type StanzaAdminSubscription {
"Subscribe for the given user's incoming messages"
getMessages(caller: JID!): StanzaMap
@protected(type: DOMAIN, args: ["caller"])
}
2 changes: 2 additions & 0 deletions src/graphql/mongoose_graphql_errors.erl
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ decode_err_msg(no_query_supplied) ->
"The query was not supplied in the request body";
decode_err_msg(invalid_json_body) ->
"The request JSON body is invalid";
decode_err_msg(invalid_query_parameters) ->
"The query string is invalid";
decode_err_msg(variables_invalid_json) ->
"The variables' JSON is invalid".

Expand Down

0 comments on commit 453435f

Please sign in to comment.