1: -module(graphql_private_SUITE). 2: 3: -compile([export_all, nowarn_export_all]). 4: 5: -import(distributed_helper, [require_rpc_nodes/1]). 6: -import(graphql_helper, [execute_user/3, execute_auth/2, user_to_bin/1]). 7: 8: -include_lib("common_test/include/ct.hrl"). 9: -include_lib("eunit/include/eunit.hrl"). 10: -include_lib("exml/include/exml.hrl"). 11: -include_lib("escalus/include/escalus.hrl"). 12: -include("../../include/mod_roster.hrl"). 13: 14: suite() -> 15: require_rpc_nodes([mim]) ++ escalus:suite(). 16: 17: all() -> 18: [{group, user_private}, {group, admin_private}]. 19: 20: groups() -> 21: [{user_private, [], user_private_handler()}, 22: {admin_private, [], admin_private_handler()}]. 23: 24: user_private_handler() -> 25: [user_set_private, 26: user_get_private, 27: parse_xml_error]. 28: 29: admin_private_handler() -> 30: [admin_set_private, 31: admin_get_private, 32: no_user_error_set, 33: no_user_error_get]. 34: 35: init_per_suite(Config0) -> 36: HostType = domain_helper:host_type(), 37: Config1 = dynamic_modules:save_modules(HostType, Config0), 38: Backend = mongoose_helper:get_backend_mnesia_rdbms_riak(HostType), 39: ModConfig = create_config(Backend), 40: dynamic_modules:ensure_modules(HostType, ModConfig), 41: escalus:init_per_suite([{backend, Backend} | Config1]). 42: 43: create_config(riak) -> 44: [{mod_private, #{backend => riak, 45: iqdisc => one_queue, 46: riak => #{bucket_type => <<"private">>}}}]; 47: create_config(Backend) -> 48: [{mod_private, #{backend => Backend, iqdisc => one_queue}}]. 49: 50: end_per_suite(Config) -> 51: dynamic_modules:restore_modules(Config), 52: escalus:end_per_suite(Config). 53: 54: init_per_group(admin_private, Config) -> 55: graphql_helper:init_admin_handler(Config); 56: init_per_group(user_private, Config) -> 57: [{schema_endpoint, user} | Config]. 58: 59: end_per_group(admin_private, _Config) -> 60: escalus_fresh:clean(); 61: end_per_group(user_private, _Config) -> 62: escalus_fresh:clean(). 63: 64: init_per_testcase(CaseName, Config) -> 65: escalus:init_per_testcase(CaseName, Config). 66: 67: end_per_testcase(CaseName, Config) -> 68: escalus:end_per_testcase(CaseName, Config). 69: 70: % User tests 71: 72: user_set_private(Config) -> 73: escalus:fresh_story_with_config(Config, [{alice, 1}], fun user_set_private/2). 74: 75: user_set_private(Config, Alice) -> 76: QuerySet = user_private_mutation(), 77: Expected = exml:to_binary(private_input()), 78: BodySet = #{query => QuerySet, operationName => <<"M1">>, 79: variables => #{elementString => Expected}}, 80: GraphQlRequestSet = execute_user(BodySet, Alice, Config), 81: ParsedResultSet = ok_result(<<"private">>, <<"setPrivate">>, GraphQlRequestSet), 82: ?assertEqual(<<"[]">>, ParsedResultSet), 83: Vars = #{element => <<"my_element">>, nameSpace => <<"alice:private:ns">>}, 84: QueryGet = user_private_query(), 85: BodyGet = #{query => QueryGet, operationName => <<"Q1">>, variables => Vars}, 86: GraphQlRequestGet = execute_user(BodyGet, Alice, Config), 87: ParsedResultGet = ok_result(<<"private">>, <<"getPrivate">>, GraphQlRequestGet), 88: ?assertEqual(Expected, ParsedResultGet). 89: 90: user_get_private(Config) -> 91: escalus:fresh_story_with_config(Config, [{alice, 1}], fun user_get_private/2). 92: 93: user_get_private(Config, Alice) -> 94: Expected = exml:to_binary(private_input()), 95: IQ = escalus_stanza:to(escalus_stanza:private_set(private_input()), 96: escalus_users:get_jid(Config, alice)), 97: escalus_client:send_and_wait(Alice, IQ), 98: Vars = #{element => <<"my_element">>, nameSpace => <<"alice:private:ns">>}, 99: QueryGet = user_private_query(), 100: BodyGet = #{query => QueryGet, operationName => <<"Q1">>, variables => Vars}, 101: GraphQlRequestGet = execute_user(BodyGet, Alice, Config), 102: ParsedResultGet = ok_result(<<"private">>, <<"getPrivate">>, GraphQlRequestGet), 103: ?assertEqual(Expected, ParsedResultGet). 104: 105: parse_xml_error(Config) -> 106: escalus:fresh_story_with_config(Config, [{alice, 1}], fun parse_xml_error/2). 107: 108: parse_xml_error(Config, Alice) -> 109: QuerySet = user_private_mutation(), 110: Input = <<"AAAABBBB">>, 111: BodySet = #{query => QuerySet, operationName => <<"M1">>, 112: variables => #{elementString => Input}}, 113: GraphQlRequestSet = execute_user(BodySet, Alice, Config), 114: ParsedResultSet = error_result2(<<"extensions">>, <<"code">>, GraphQlRequestSet), 115: ?assertEqual(<<"parse_error">>, ParsedResultSet). 116: 117: % Admin tests 118: 119: admin_set_private(Config) -> 120: escalus:fresh_story_with_config(Config, [{alice, 1}], fun admin_set_private/2). 121: 122: admin_set_private(Config, Alice) -> 123: QuerySet = admin_private_mutation(), 124: Expected = exml:to_binary(private_input()), 125: BodySet = #{query => QuerySet, operationName => <<"M1">>, 126: variables => #{elementString => Expected, user => user_to_bin(Alice)}}, 127: GraphQlRequestSet = execute_auth(BodySet, Config), 128: ParsedResultSet = ok_result(<<"private">>, <<"setPrivate">>, GraphQlRequestSet), 129: ?assertEqual(<<"[]">>, ParsedResultSet), 130: Vars = #{element => <<"my_element">>, nameSpace => <<"alice:private:ns">>, 131: user => user_to_bin(Alice)}, 132: QueryGet = admin_private_query(), 133: BodyGet = #{query => QueryGet, operationName => <<"Q1">>, variables => Vars}, 134: GraphQlRequestGet = execute_auth(BodyGet, Config), 135: ParsedResultGet = ok_result(<<"private">>, <<"getPrivate">>, GraphQlRequestGet), 136: ?assertEqual(Expected, ParsedResultGet). 137: 138: admin_get_private(Config) -> 139: escalus:fresh_story_with_config(Config, [{alice, 1}], fun admin_get_private/2). 140: 141: admin_get_private(Config, Alice) -> 142: Expected = exml:to_binary(private_input()), 143: IQ = escalus_stanza:to(escalus_stanza:private_set(private_input()), 144: escalus_users:get_jid(Config, alice)), 145: escalus_client:send_and_wait(Alice, IQ), 146: Vars = #{element => <<"my_element">>, nameSpace => <<"alice:private:ns">>, 147: user => user_to_bin(Alice)}, 148: QueryGet = admin_private_query(), 149: BodyGet = #{query => QueryGet, operationName => <<"Q1">>, variables => Vars}, 150: GraphQlRequestGet = execute_auth(BodyGet, Config), 151: ParsedResultGet = ok_result(<<"private">>, <<"getPrivate">>, GraphQlRequestGet), 152: ?assertEqual(Expected, ParsedResultGet). 153: 154: no_user_error_get(Config) -> 155: Vars = #{element => <<"my_element">>, nameSpace => <<"alice:private:ns">>, 156: user => <<"AAAAA">>}, 157: QueryGet = admin_private_query(), 158: BodyGet = #{query => QueryGet, operationName => <<"Q1">>, variables => Vars}, 159: GraphQlRequestGet = execute_auth(BodyGet, Config), 160: ParsedResultGet = error_result2(<<"extensions">>, <<"code">>, GraphQlRequestGet), 161: ?assertEqual(<<"not_found">>, ParsedResultGet). 162: 163: no_user_error_set(Config) -> 164: QuerySet = admin_private_mutation(), 165: Expected = exml:to_binary(private_input()), 166: BodySet = #{query => QuerySet, operationName => <<"M1">>, 167: variables => #{elementString => Expected, user => <<"AAAAA">>}}, 168: GraphQlRequestSet = execute_auth(BodySet, Config), 169: ParsedResultSet = error_result2(<<"extensions">>, <<"code">>, GraphQlRequestSet), 170: ?assertEqual(<<"not_found">>, ParsedResultSet). 171: 172: private_input() -> 173: #xmlel{name = <<"my_element">>, 174: attrs = [{<<"xmlns">>, "alice:private:ns"}], 175: children = [{xmlcdata, <<"DATA">>}]}. 176: 177: ok_result(What1, What2, {{<<"200">>, <<"OK">>}, #{<<"data">> := Data}}) -> 178: maps:get(What2, maps:get(What1, Data)). 179: 180: error_result(What, {{<<"200">>, <<"OK">>}, #{<<"errors">> := [Data]}}) -> 181: maps:get(What, Data). 182: 183: error_result2(What1, What2, {{<<"200">>, <<"OK">>}, #{<<"errors">> := [Data]}}) -> 184: maps:get(What2, maps:get(What1, Data)). 185: 186: user_private_mutation() -> 187: <<"mutation M1($elementString: String!) 188: { 189: private 190: { 191: setPrivate(elementString: $elementString) 192: } 193: }">>. 194: 195: user_private_query() -> 196: <<"query Q1($element: String! $nameSpace: String!) 197: { 198: private 199: { 200: getPrivate(element: $element, nameSpace: $nameSpace) 201: } 202: }">>. 203: 204: admin_private_mutation() -> 205: <<"mutation M1($elementString: String!, $user: JID!) 206: { 207: private 208: { 209: setPrivate(user: $user, elementString: $elementString) 210: } 211: }">>. 212: 213: admin_private_query() -> 214: <<"query Q1($user: JID!, $element: String! $nameSpace: String!) 215: { 216: private 217: { 218: getPrivate(user: $user, element: $element, nameSpace: $nameSpace) 219: } 220: }">>.