1: -module(graphql_private_SUITE).
    2: 
    3: -compile([export_all, nowarn_export_all]).
    4: 
    5: -import(distributed_helper, [mim/0, require_rpc_nodes/1]).
    6: -import(graphql_helper, [execute_user_command/5, execute_command/4, get_ok_value/2, get_err_code/1,
    7:                          user_to_bin/1, get_unauthorized/1, get_not_loaded/1, get_coercion_err_msg/1]).
    8: 
    9: -include_lib("eunit/include/eunit.hrl").
   10: -include_lib("exml/include/exml.hrl").
   11: 
   12: suite() ->
   13:     require_rpc_nodes([mim]) ++ escalus:suite().
   14: 
   15: all() ->
   16:     [{group, user},
   17:      {group, domain_admin_private},
   18:      {group, admin_http},
   19:      {group, admin_cli}].
   20: 
   21: groups() ->
   22:     [{user, [], user_groups()},
   23:      {domain_admin_private, [], domain_admin_private_tests()},
   24:      {admin_http, [], admin_groups()},
   25:      {admin_cli, [], admin_groups()},
   26:      {admin_private_configured, [], admin_private_tests()},
   27:      {user_private_configured, [], user_private_tests()},
   28:      {admin_private_not_configured, [], admin_private_not_configured_tests()},
   29:      {user_private_not_configured, [], user_private_not_configured_tests()}].
   30: 
   31: admin_groups() ->
   32:     [{group, admin_private_configured},
   33:      {group, admin_private_not_configured}].
   34: 
   35: user_groups() ->
   36:     [{group, user_private_configured},
   37:      {group, user_private_not_configured}].
   38: 
   39: user_private_tests() ->
   40:     [user_set_private,
   41:      user_get_private,
   42:      user_get_private_empty_namespace,
   43:      parse_xml_error].
   44: 
   45: user_private_not_configured_tests() ->
   46:     [user_set_private_not_configured,
   47:      user_get_private_not_configured].
   48: 
   49: domain_admin_private_tests() ->
   50:     [admin_set_private,
   51:      admin_get_private,
   52:      domain_admin_user_set_private_no_permission,
   53:      domain_admin_user_get_private_no_permission].
   54: 
   55: admin_private_tests() ->
   56:     [admin_set_private,
   57:      admin_get_private,
   58:      admin_get_private_empty_namespace,
   59:      no_user_error_set,
   60:      no_user_error_get].
   61: 
   62: admin_private_not_configured_tests() ->
   63:     [admin_set_private_not_configured,
   64:      admin_get_private_not_configured].
   65: 
   66: init_per_suite(Config0) ->
   67:     HostType = domain_helper:host_type(),
   68:     Config1 = dynamic_modules:save_modules(HostType, Config0),
   69:     Config2 = ejabberd_node_utils:init(mim(), Config1),
   70:     Backend = mongoose_helper:get_backend_mnesia_rdbms(HostType),
   71:     escalus:init_per_suite([{backend, Backend} | Config2]).
   72: 
   73: create_config(Backend) ->
   74:     [{mod_private, #{backend => Backend, iqdisc => one_queue}}].
   75: 
   76: end_per_suite(Config) ->
   77:     dynamic_modules:restore_modules(Config),
   78:     escalus:end_per_suite(Config).
   79: 
   80: init_per_group(admin_http, Config) ->
   81:     graphql_helper:init_admin_handler(Config);
   82: init_per_group(admin_cli, Config) ->
   83:     graphql_helper:init_admin_cli(Config);
   84: init_per_group(user, Config) ->
   85:     graphql_helper:init_user(Config);
   86: init_per_group(domain_admin_private, Config) ->
   87:     Config1 = ensure_private_started(Config),
   88:     graphql_helper:init_domain_admin_handler(Config1);
   89: init_per_group(Group, Config) when Group =:= admin_private_configured;
   90:                                    Group =:= user_private_configured ->
   91:     ensure_private_started(Config);
   92: init_per_group(Group, Config) when Group =:= admin_private_not_configured;
   93:                                    Group =:= user_private_not_configured ->
   94:     ensure_private_stopped(Config).
   95: 
   96: ensure_private_started(Config) ->
   97:     HostType = domain_helper:host_type(),
   98:     Backend = mongoose_helper:get_backend_mnesia_rdbms(HostType),
   99:     ModConfig = create_config(Backend),
  100:     dynamic_modules:ensure_modules(HostType, ModConfig),
  101:     Config.
  102: 
  103: ensure_private_stopped(Config) ->
  104:     HostType = domain_helper:host_type(),
  105:     dynamic_modules:ensure_modules(HostType, [{mod_private, stopped}]),
  106:     Config.
  107: 
  108: end_per_group(GroupName, _Config) when GroupName =:= admin_http;
  109:                                        GroupName =:= admin_cli;
  110:                                        GroupName =:= user;
  111:                                        GroupName =:= domain_admin_private ->
  112:     graphql_helper:clean();
  113: end_per_group(_GroupName, _Config) ->
  114:     escalus_fresh:clean().
  115: 
  116: init_per_testcase(CaseName, Config) ->
  117:     escalus:init_per_testcase(CaseName, Config).
  118: 
  119: end_per_testcase(CaseName, Config) ->
  120:     escalus:end_per_testcase(CaseName, Config).
  121: 
  122: % User tests
  123: 
  124: user_set_private(Config) ->
  125:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun user_set_private/2).
  126: 
  127: user_set_private(Config, Alice) ->
  128:     ElemStr = exml:to_binary(private_input()),
  129:     ResultSet = user_set_private(Alice, ElemStr, Config),
  130:     ParsedResultSet = get_ok_value([data, private, setPrivate], ResultSet),
  131:     ?assertEqual(<<"<my_element xmlns='alice:private:ns'>DATA</my_element>">>, ParsedResultSet),
  132:     ResultGet = user_get_private(Alice, <<"my_element">>, <<"alice:private:ns">>, Config),
  133:     ParsedResultGet = get_ok_value([data, private, getPrivate], ResultGet),
  134:     ?assertEqual(ElemStr, ParsedResultGet).
  135: 
  136: user_get_private(Config) ->
  137:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun user_get_private/2).
  138: 
  139: user_get_private(Config, Alice) ->
  140:     ElemStr = exml:to_binary(private_input()),
  141:     IQ = escalus_stanza:to(escalus_stanza:private_set(private_input()),
  142:                            escalus_users:get_jid(Config, alice)),
  143:     escalus_client:send_and_wait(Alice, IQ),
  144:     ResultGet = user_get_private(Alice, <<"my_element">>, <<"alice:private:ns">>, Config),
  145:     ParsedResultGet = get_ok_value([data, private, getPrivate], ResultGet),
  146:     ?assertEqual(ElemStr, ParsedResultGet).
  147: 
  148: user_get_private_empty_namespace(Config) ->
  149:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun user_get_private_empty_namespace/2).
  150: 
  151: user_get_private_empty_namespace(Config, Alice) ->
  152:     ResultGet = user_get_private(Alice, <<"">>, <<"">>, Config),
  153:     ?assertEqual(<<"Input coercion failed for type NonEmptyString with value <<>>."
  154:                    " The reason it failed is: \"Given string is empty\"">>,
  155:                  get_coercion_err_msg(ResultGet)).
  156: 
  157: parse_xml_error(Config) ->
  158:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun parse_xml_error/2).
  159: 
  160: parse_xml_error(Config, Alice) ->
  161:     ResultSet = user_set_private(Alice, <<"AAAABBBB">>, Config),
  162:     ?assertEqual(<<"Input coercion failed for type XmlElement with value <<\"AAAABBBB\">>."
  163:                    " The reason it failed is: \"expected <\"">>,
  164:                  get_coercion_err_msg(ResultSet)).
  165: 
  166: % User private not configured test cases
  167: 
  168: user_set_private_not_configured(Config) ->
  169:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun user_set_private_not_configured/2).
  170: 
  171: user_set_private_not_configured(Config, Alice) ->
  172:     ElemStr = exml:to_binary(private_input()),
  173:     Res = user_set_private(Alice, ElemStr, Config),
  174:     get_not_loaded(Res).
  175: 
  176: user_get_private_not_configured(Config) ->
  177:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun user_get_private_not_configured/2).
  178: 
  179: user_get_private_not_configured(Config, Alice) ->
  180:     Res = user_get_private(Alice, <<"my_element">>, <<"alice:private:ns">>, Config),
  181:     get_not_loaded(Res).
  182: 
  183: % Admin tests
  184: 
  185: admin_set_private(Config) ->
  186:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun admin_set_private/2).
  187: 
  188: admin_set_private(Config, Alice) ->
  189:     AliceBin = user_to_bin(Alice),
  190:     ElemStr = exml:to_binary(private_input()),
  191:     ResultSet = admin_set_private(AliceBin, ElemStr, Config),
  192:     ParsedResultSet = get_ok_value([data, private, setPrivate], ResultSet),
  193:     ?assertEqual(<<"<my_element xmlns='alice:private:ns'>DATA</my_element>">>, ParsedResultSet),
  194:     ResultGet = admin_get_private(AliceBin, <<"my_element">>, <<"alice:private:ns">>, Config),
  195:     ParsedResultGet = get_ok_value([data, private, getPrivate], ResultGet),
  196:     ?assertEqual(ElemStr, ParsedResultGet).
  197: 
  198: admin_get_private(Config) ->
  199:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun admin_get_private/2).
  200: 
  201: admin_get_private(Config, Alice) ->
  202:     AliceBin = user_to_bin(Alice),
  203:     ElemStr = exml:to_binary(private_input()),
  204:     IQ = escalus_stanza:to(escalus_stanza:private_set(private_input()),
  205:                            escalus_users:get_jid(Config, alice)),
  206:     escalus_client:send_and_wait(Alice, IQ),
  207:     ResultGet = admin_get_private(AliceBin, <<"my_element">>, <<"alice:private:ns">>, Config),
  208:     ParsedResultGet = get_ok_value([data, private, getPrivate], ResultGet),
  209:     ?assertEqual(ElemStr, ParsedResultGet).
  210: 
  211: admin_get_private_empty_namespace(Config) ->
  212:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun admin_get_private_empty_namespace/2).
  213: 
  214: admin_get_private_empty_namespace(Config, Alice) ->
  215:     AliceBin = user_to_bin(Alice),
  216:     ResultGet = admin_get_private(AliceBin, <<"">>, <<"">>, Config),
  217:     ?assertEqual(<<"Input coercion failed for type NonEmptyString with value <<>>."
  218:                    " The reason it failed is: \"Given string is empty\"">>,
  219:                  get_coercion_err_msg(ResultGet)).
  220: 
  221: no_user_error_set(Config) ->
  222:     ElemStr = exml:to_binary(private_input()),
  223:     Result = admin_set_private(<<"eddie@otherhost">>, ElemStr, Config),
  224:     ?assertEqual(<<"not_found">>, get_err_code(Result)).
  225: 
  226: no_user_error_get(Config) ->
  227:     Result = admin_get_private(<<"eddie@otherhost">>, <<"my_element">>, <<"alice:private:ns">>, Config),
  228:     ?assertEqual(<<"not_found">>, get_err_code(Result)).
  229: 
  230: private_input() ->
  231:     #xmlel{name = <<"my_element">>,
  232:            attrs = [{<<"xmlns">>, "alice:private:ns"}],
  233:            children = [{xmlcdata, <<"DATA">>}]}.
  234: 
  235: % Admin private not configured test cases
  236: 
  237: admin_set_private_not_configured(Config) ->
  238:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun admin_set_private_not_configured/2).
  239: 
  240: admin_set_private_not_configured(Config, Alice) ->
  241:     AliceBin = user_to_bin(Alice),
  242:     ElemStr = exml:to_binary(private_input()),
  243:     Res = admin_set_private(AliceBin, ElemStr, Config),
  244:     get_not_loaded(Res).
  245: 
  246: admin_get_private_not_configured(Config) ->
  247:     escalus:fresh_story_with_config(Config, [{alice, 1}], fun admin_get_private_not_configured/2).
  248: 
  249: admin_get_private_not_configured(Config, Alice) ->
  250:     AliceBin = user_to_bin(Alice),
  251:     Res = admin_get_private(AliceBin, <<"my_element">>, <<"alice:private:ns">>, Config),
  252:     get_not_loaded(Res).
  253: 
  254: % Domain admin tests
  255: 
  256: domain_admin_user_set_private_no_permission(Config) ->
  257:     escalus:fresh_story_with_config(Config, [{alice_bis, 1}],
  258:                                     fun domain_admin_user_set_private_no_permission/2).
  259: domain_admin_user_set_private_no_permission(Config, AliceBis) ->
  260:     ElemStr = exml:to_binary(private_input()),
  261:     Result = admin_set_private(user_to_bin(AliceBis), ElemStr, Config),
  262:     get_unauthorized(Result),
  263:     Result2 = admin_set_private(<<"eddie@otherhost">>, ElemStr, Config),
  264:     get_unauthorized(Result2).
  265: 
  266: domain_admin_user_get_private_no_permission(Config) ->
  267:     escalus:fresh_story_with_config(Config, [{alice_bis, 1}],
  268:                                     fun domain_admin_user_get_private_no_permission/2).
  269: 
  270: domain_admin_user_get_private_no_permission(Config, AliceBis) ->
  271:     AliceBisBin = user_to_bin(AliceBis),
  272:     Result = admin_get_private(AliceBisBin, <<"my_element">>, <<"alice:private:ns">>, Config),
  273:     get_unauthorized(Result),
  274:     Result2 = admin_get_private(<<"eddie@otherhost">>, <<"my_element">>, <<"alice:private:ns">>, Config),
  275:     get_unauthorized(Result2).
  276: 
  277: %% Commands
  278: 
  279: user_set_private(User, ElementString, Config) ->
  280:     Vars = #{elementString => ElementString},
  281:     execute_user_command(<<"private">>, <<"setPrivate">>, User, Vars, Config).
  282: 
  283: user_get_private(User, Element, NameSpace, Config) ->
  284:     Vars = #{element => Element, nameSpace => NameSpace},
  285:     execute_user_command(<<"private">>, <<"getPrivate">>, User, Vars, Config).
  286: 
  287: admin_set_private(User, ElementString, Config) ->
  288:     Vars = #{user => User, elementString => ElementString},
  289:     execute_command(<<"private">>, <<"setPrivate">>, Vars, Config).
  290: 
  291: admin_get_private(User, Element, NameSpace, Config) ->
  292:     Vars = #{user => User, element => Element, nameSpace => NameSpace},
  293:     execute_command(<<"private">>, <<"getPrivate">>, Vars, Config).