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:        }">>.