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