1use super::*;
2use crate::test_both_dbs;
3use language::proto;
4use text::Buffer;
5
6test_both_dbs!(
7 test_channel_buffers,
8 test_channel_buffers_postgres,
9 test_channel_buffers_sqlite
10);
11
12async fn test_channel_buffers(db: &Arc<Database>) {
13 // Prep database test info
14 let a_id = db
15 .create_user(
16 "user_a@example.com",
17 false,
18 NewUserParams {
19 github_login: "user_a".into(),
20 github_user_id: 101,
21 invite_count: 0,
22 },
23 )
24 .await
25 .unwrap()
26 .user_id;
27 let b_id = db
28 .create_user(
29 "user_b@example.com",
30 false,
31 NewUserParams {
32 github_login: "user_b".into(),
33 github_user_id: 102,
34 invite_count: 0,
35 },
36 )
37 .await
38 .unwrap()
39 .user_id;
40
41 // This user will not be a part of the channel
42 let c_id = db
43 .create_user(
44 "user_c@example.com",
45 false,
46 NewUserParams {
47 github_login: "user_c".into(),
48 github_user_id: 102,
49 invite_count: 0,
50 },
51 )
52 .await
53 .unwrap()
54 .user_id;
55
56 let owner_id = db.create_server("production").await.unwrap().0 as u32;
57
58 let zed_id = db.create_root_channel("zed", "1", a_id).await.unwrap();
59
60 db.invite_channel_member(zed_id, b_id, a_id, false)
61 .await
62 .unwrap();
63
64 db.respond_to_channel_invite(zed_id, b_id, true)
65 .await
66 .unwrap();
67
68 let connection_id_a = ConnectionId { owner_id, id: 1 };
69 let _ = db
70 .join_channel_buffer(zed_id, a_id, connection_id_a)
71 .await
72 .unwrap();
73
74 let mut buffer_a = Buffer::new(0, 0, "".to_string());
75 let mut operations = Vec::new();
76 operations.push(buffer_a.edit([(0..0, "hello world")]));
77 operations.push(buffer_a.edit([(5..5, ", cruel")]));
78 operations.push(buffer_a.edit([(0..5, "goodbye")]));
79 operations.push(buffer_a.undo().unwrap().1);
80 assert_eq!(buffer_a.text(), "hello, cruel world");
81
82 let operations = operations
83 .into_iter()
84 .map(|op| proto::serialize_operation(&language::Operation::Buffer(op)))
85 .collect::<Vec<_>>();
86
87 db.update_channel_buffer(zed_id, a_id, &operations)
88 .await
89 .unwrap();
90
91 let connection_id_b = ConnectionId { owner_id, id: 2 };
92 let buffer_response_b = db
93 .join_channel_buffer(zed_id, b_id, connection_id_b)
94 .await
95 .unwrap();
96
97 let mut buffer_b = Buffer::new(0, 0, buffer_response_b.base_text);
98 buffer_b
99 .apply_ops(buffer_response_b.operations.into_iter().map(|operation| {
100 let operation = proto::deserialize_operation(operation).unwrap();
101 if let language::Operation::Buffer(operation) = operation {
102 operation
103 } else {
104 unreachable!()
105 }
106 }))
107 .unwrap();
108
109 assert_eq!(buffer_b.text(), "hello, cruel world");
110
111 // Ensure that C fails to open the buffer
112 assert!(db
113 .join_channel_buffer(zed_id, c_id, ConnectionId { owner_id, id: 3 })
114 .await
115 .is_err());
116
117 // Ensure that both collaborators have shown up
118 assert_eq!(
119 buffer_response_b.collaborators,
120 &[
121 rpc::proto::Collaborator {
122 user_id: a_id.to_proto(),
123 peer_id: Some(rpc::proto::PeerId { id: 1, owner_id }),
124 replica_id: 0,
125 },
126 rpc::proto::Collaborator {
127 user_id: b_id.to_proto(),
128 peer_id: Some(rpc::proto::PeerId { id: 2, owner_id }),
129 replica_id: 1,
130 }
131 ]
132 );
133
134 // Ensure that get_channel_buffer_collaborators works
135 let zed_collaborats = db.get_channel_buffer_collaborators(zed_id).await.unwrap();
136 assert_eq!(zed_collaborats, &[a_id, b_id]);
137
138 let collaborators = db
139 .leave_channel_buffer(zed_id, connection_id_b)
140 .await
141 .unwrap();
142
143 assert_eq!(collaborators, &[connection_id_a],);
144
145 let cargo_id = db.create_root_channel("cargo", "2", a_id).await.unwrap();
146 let _ = db
147 .join_channel_buffer(cargo_id, a_id, connection_id_a)
148 .await
149 .unwrap();
150
151 db.leave_channel_buffers(connection_id_a).await.unwrap();
152
153 let zed_collaborators = db.get_channel_buffer_collaborators(zed_id).await.unwrap();
154 let cargo_collaborators = db.get_channel_buffer_collaborators(cargo_id).await.unwrap();
155 assert_eq!(zed_collaborators, &[]);
156 assert_eq!(cargo_collaborators, &[]);
157
158 // TODO: test buffer epoch incrementing
159}