1use super::*;
2use crate::test_both_dbs;
3use language::proto;
4use text::Buffer;
5
6test_both_dbs!(test_buffers, test_buffers_postgres, test_buffers_sqlite);
7
8async fn test_buffers(db: &Arc<Database>) {
9 // Prep database test info
10 let a_id = db
11 .create_user(
12 "user_a@example.com",
13 false,
14 NewUserParams {
15 github_login: "user_a".into(),
16 github_user_id: 101,
17 invite_count: 0,
18 },
19 )
20 .await
21 .unwrap()
22 .user_id;
23 let b_id = db
24 .create_user(
25 "user_b@example.com",
26 false,
27 NewUserParams {
28 github_login: "user_b".into(),
29 github_user_id: 102,
30 invite_count: 0,
31 },
32 )
33 .await
34 .unwrap()
35 .user_id;
36 // This user will not be a part of the channel
37 let c_id = db
38 .create_user(
39 "user_b@example.com",
40 false,
41 NewUserParams {
42 github_login: "user_b".into(),
43 github_user_id: 102,
44 invite_count: 0,
45 },
46 )
47 .await
48 .unwrap()
49 .user_id;
50
51 let zed_id = db.create_root_channel("zed", "1", a_id).await.unwrap();
52
53 db.invite_channel_member(zed_id, b_id, a_id, false)
54 .await
55 .unwrap();
56
57 db.respond_to_channel_invite(zed_id, b_id, true)
58 .await
59 .unwrap();
60
61 // TODO: Join buffer
62 let buffer_id = db.get_or_create_buffer_for_channel(zed_id);
63
64 let mut buffer = Buffer::new(0, 0, "".to_string());
65 let mut operations = Vec::new();
66 operations.push(buffer.edit([(0..0, "hello world")]));
67 operations.push(buffer.edit([(5..5, ", cruel")]));
68 operations.push(buffer.edit([(0..5, "goodbye")]));
69 operations.push(buffer.undo().unwrap().1);
70 assert_eq!(buffer.text(), "hello, cruel world");
71
72 let operations = operations
73 .into_iter()
74 .map(|op| proto::serialize_operation(&language::Operation::Buffer(op)))
75 .collect::<Vec<_>>();
76
77 db.update_buffer(buffer_id, &operations).await.unwrap();
78
79 let buffer_data = db.open_buffer(buffer_id).await.unwrap();
80
81 let mut buffer_2 = Buffer::new(0, 0, buffer_data.base_text);
82 buffer_2
83 .apply_ops(buffer_data.operations.into_iter().map(|operation| {
84 let operation = proto::deserialize_operation(operation).unwrap();
85 if let language::Operation::Buffer(operation) = operation {
86 operation
87 } else {
88 unreachable!()
89 }
90 }))
91 .unwrap();
92
93 assert_eq!(buffer_2.text(), "hello, cruel world");
94}