|
1 | | -use std::{ops::Not, sync::Arc}; |
| 1 | +use std::{collections::BTreeMap, ops::Not, sync::Arc}; |
2 | 2 |
|
3 | 3 | use assert_matches::assert_matches; |
4 | 4 | use eyeball_im::VectorDiff; |
@@ -2893,3 +2893,196 @@ async fn test_multiple_timeline_init() { |
2893 | 2893 | // A new timeline for the same room can still be constructed. |
2894 | 2894 | room.timeline_builder().build().await.unwrap(); |
2895 | 2895 | } |
| 2896 | + |
| 2897 | +#[async_test] |
| 2898 | +async fn test_thread_subscriptions_extension_enabled_only_if_server_advertises_it() { |
| 2899 | + let server = MatrixMockServer::new().await; |
| 2900 | + |
| 2901 | + { |
| 2902 | + // The first time, don't advertise support for MSC4306; the extension will NOT |
| 2903 | + // enabled in this case, despite the client requesting it. |
| 2904 | + let features_map = BTreeMap::new(); |
| 2905 | + |
| 2906 | + server |
| 2907 | + .mock_versions() |
| 2908 | + .ok_custom(&["v1.11"], &features_map) |
| 2909 | + .named("/versions, first time") |
| 2910 | + .mock_once() |
| 2911 | + .mount() |
| 2912 | + .await; |
| 2913 | + |
| 2914 | + let client = server |
| 2915 | + .client_builder() |
| 2916 | + .no_server_versions() |
| 2917 | + .on_builder(|b| { |
| 2918 | + b.with_threading_support(matrix_sdk::ThreadingSupport::Enabled { |
| 2919 | + with_subscriptions: true, |
| 2920 | + }) |
| 2921 | + }) |
| 2922 | + .build() |
| 2923 | + .await; |
| 2924 | + let room_list = RoomListService::new(client.clone()).await.unwrap(); |
| 2925 | + |
| 2926 | + let sync = room_list.sync(); |
| 2927 | + pin_mut!(sync); |
| 2928 | + |
| 2929 | + let room_id = room_id!("!r0:bar.org"); |
| 2930 | + |
| 2931 | + let mock_server = server.server(); |
| 2932 | + sync_then_assert_request_and_fake_response! { |
| 2933 | + [mock_server, room_list, sync] |
| 2934 | + assert request = { |
| 2935 | + "conn_id": "room-list", |
| 2936 | + "extensions": { |
| 2937 | + "account_data": { |
| 2938 | + "enabled": true, |
| 2939 | + }, |
| 2940 | + "receipts": { |
| 2941 | + "enabled": true, |
| 2942 | + "rooms": ["*"], |
| 2943 | + }, |
| 2944 | + "typing": { |
| 2945 | + "enabled": true, |
| 2946 | + }, |
| 2947 | + }, |
| 2948 | + "lists": { |
| 2949 | + "all_rooms": { |
| 2950 | + "filters": {}, |
| 2951 | + "ranges": [ [ 0, 19, ], ], |
| 2952 | + "required_state": [ |
| 2953 | + [ "m.room.name", "" ], |
| 2954 | + [ "m.room.encryption", "" ], |
| 2955 | + [ "m.room.member", "$LAZY" ], |
| 2956 | + [ "m.room.member", "$ME" ], |
| 2957 | + [ "m.room.topic", "", ], |
| 2958 | + [ "m.room.avatar", "", ], |
| 2959 | + [ "m.room.canonical_alias", "", ], |
| 2960 | + [ "m.room.power_levels", "", ], |
| 2961 | + [ "org.matrix.msc3401.call.member", "*", ], |
| 2962 | + [ "m.room.join_rules", "", ], |
| 2963 | + [ "m.room.tombstone", "", ], |
| 2964 | + [ "m.room.create", "", ], |
| 2965 | + [ "m.room.history_visibility", "", ], |
| 2966 | + [ "io.element.functional_members", "", ], |
| 2967 | + [ "m.space.parent", "*", ], |
| 2968 | + [ "m.space.child", "*", ], |
| 2969 | + ], |
| 2970 | + "timeline_limit": 1, |
| 2971 | + }, |
| 2972 | + }, |
| 2973 | + }, |
| 2974 | + respond with = { |
| 2975 | + "pos": "0", |
| 2976 | + "lists": { |
| 2977 | + ALL_ROOMS: { |
| 2978 | + "count": 2, |
| 2979 | + }, |
| 2980 | + }, |
| 2981 | + "rooms": { |
| 2982 | + room_id: { |
| 2983 | + "initial": true, |
| 2984 | + "timeline": [ |
| 2985 | + timeline_event!("$x0:bar.org" at 0 sec), |
| 2986 | + ], |
| 2987 | + "prev_batch": "prev-batch-token" |
| 2988 | + }, |
| 2989 | + }, |
| 2990 | + }, |
| 2991 | + }; |
| 2992 | + } |
| 2993 | + |
| 2994 | + // Then, advertise support with support for MSC4306; the extension will be |
| 2995 | + // enabled in this case. |
| 2996 | + let features_map = BTreeMap::from([("org.matrix.msc4306", true)]); |
| 2997 | + |
| 2998 | + server |
| 2999 | + .mock_versions() |
| 3000 | + .ok_custom(&["v1.11"], &features_map) |
| 3001 | + .named("/versions, second time") |
| 3002 | + .mock_once() |
| 3003 | + .mount() |
| 3004 | + .await; |
| 3005 | + |
| 3006 | + let client = server |
| 3007 | + .client_builder() |
| 3008 | + .no_server_versions() |
| 3009 | + .on_builder(|b| { |
| 3010 | + b.with_threading_support(matrix_sdk::ThreadingSupport::Enabled { |
| 3011 | + with_subscriptions: true, |
| 3012 | + }) |
| 3013 | + }) |
| 3014 | + .build() |
| 3015 | + .await; |
| 3016 | + let room_list = RoomListService::new(client.clone()).await.unwrap(); |
| 3017 | + |
| 3018 | + let sync = room_list.sync(); |
| 3019 | + pin_mut!(sync); |
| 3020 | + |
| 3021 | + let room_id = room_id!("!r0:bar.org"); |
| 3022 | + |
| 3023 | + let mock_server = server.server(); |
| 3024 | + sync_then_assert_request_and_fake_response! { |
| 3025 | + [mock_server, room_list, sync] |
| 3026 | + assert request = { |
| 3027 | + "conn_id": "room-list", |
| 3028 | + "extensions": { |
| 3029 | + "account_data": { |
| 3030 | + "enabled": true, |
| 3031 | + }, |
| 3032 | + "receipts": { |
| 3033 | + "enabled": true, |
| 3034 | + "rooms": ["*"], |
| 3035 | + }, |
| 3036 | + "typing": { |
| 3037 | + "enabled": true, |
| 3038 | + }, |
| 3039 | + "io.element.msc4308.thread_subscriptions": { |
| 3040 | + "enabled": true, |
| 3041 | + "limit": 10, |
| 3042 | + }, |
| 3043 | + }, |
| 3044 | + "lists": { |
| 3045 | + "all_rooms": { |
| 3046 | + "filters": {}, |
| 3047 | + "ranges": [ [ 0, 19, ], ], |
| 3048 | + "required_state": [ |
| 3049 | + [ "m.room.name", "" ], |
| 3050 | + [ "m.room.encryption", "" ], |
| 3051 | + [ "m.room.member", "$LAZY" ], |
| 3052 | + [ "m.room.member", "$ME" ], |
| 3053 | + [ "m.room.topic", "", ], |
| 3054 | + [ "m.room.avatar", "", ], |
| 3055 | + [ "m.room.canonical_alias", "", ], |
| 3056 | + [ "m.room.power_levels", "", ], |
| 3057 | + [ "org.matrix.msc3401.call.member", "*", ], |
| 3058 | + [ "m.room.join_rules", "", ], |
| 3059 | + [ "m.room.tombstone", "", ], |
| 3060 | + [ "m.room.create", "", ], |
| 3061 | + [ "m.room.history_visibility", "", ], |
| 3062 | + [ "io.element.functional_members", "", ], |
| 3063 | + [ "m.space.parent", "*", ], |
| 3064 | + [ "m.space.child", "*", ], |
| 3065 | + ], |
| 3066 | + "timeline_limit": 1, |
| 3067 | + }, |
| 3068 | + }, |
| 3069 | + }, |
| 3070 | + respond with = { |
| 3071 | + "pos": "0", |
| 3072 | + "lists": { |
| 3073 | + ALL_ROOMS: { |
| 3074 | + "count": 2, |
| 3075 | + }, |
| 3076 | + }, |
| 3077 | + "rooms": { |
| 3078 | + room_id: { |
| 3079 | + "initial": true, |
| 3080 | + "timeline": [ |
| 3081 | + timeline_event!("$x0:bar.org" at 0 sec), |
| 3082 | + ], |
| 3083 | + "prev_batch": "prev-batch-token" |
| 3084 | + }, |
| 3085 | + }, |
| 3086 | + }, |
| 3087 | + }; |
| 3088 | +} |
0 commit comments