buffer_tests.rs

  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}