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).