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