users.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. //! Tests for synchronization of user presence.
  2. use anyhow::Result;
  3. use common::*;
  4. use rustpad_server::{server, ServerConfig};
  5. use serde_json::json;
  6. pub mod common;
  7. #[tokio::test]
  8. async fn test_two_users() -> Result<()> {
  9. pretty_env_logger::try_init().ok();
  10. let filter = server(ServerConfig::default());
  11. let mut client = connect(&filter, "foobar").await?;
  12. assert_eq!(client.recv().await?, json!({ "Identity": 0 }));
  13. let alice = json!({
  14. "name": "Alice",
  15. "hue": 42
  16. });
  17. client.send(&json!({ "ClientInfo": alice })).await;
  18. let alice_info = json!({
  19. "UserInfo": {
  20. "id": 0,
  21. "info": alice
  22. }
  23. });
  24. assert_eq!(client.recv().await?, alice_info);
  25. let mut client2 = connect(&filter, "foobar").await?;
  26. assert_eq!(client2.recv().await?, json!({ "Identity": 1 }));
  27. assert_eq!(client2.recv().await?, alice_info);
  28. let bob = json!({
  29. "name": "Bob",
  30. "hue": 96
  31. });
  32. client2.send(&json!({ "ClientInfo": bob })).await;
  33. let bob_info = json!({
  34. "UserInfo": {
  35. "id": 1,
  36. "info": bob
  37. }
  38. });
  39. assert_eq!(client2.recv().await?, bob_info);
  40. assert_eq!(client.recv().await?, bob_info);
  41. Ok(())
  42. }
  43. #[tokio::test]
  44. async fn test_invalid_user() -> Result<()> {
  45. pretty_env_logger::try_init().ok();
  46. let filter = server(ServerConfig::default());
  47. let mut client = connect(&filter, "foobar").await?;
  48. assert_eq!(client.recv().await?, json!({ "Identity": 0 }));
  49. let alice = json!({ "name": "Alice" }); // no hue
  50. client.send(&json!({ "ClientInfo": alice })).await;
  51. client.recv_closed().await?;
  52. Ok(())
  53. }
  54. #[tokio::test]
  55. async fn test_leave_rejoin() -> Result<()> {
  56. pretty_env_logger::try_init().ok();
  57. let filter = server(ServerConfig::default());
  58. let mut client = connect(&filter, "foobar").await?;
  59. assert_eq!(client.recv().await?, json!({ "Identity": 0 }));
  60. let alice = json!({
  61. "name": "Alice",
  62. "hue": 42
  63. });
  64. client.send(&json!({ "ClientInfo": alice })).await;
  65. let alice_info = json!({
  66. "UserInfo": {
  67. "id": 0,
  68. "info": alice
  69. }
  70. });
  71. assert_eq!(client.recv().await?, alice_info);
  72. client.send(&json!({ "Invalid": "please close" })).await;
  73. client.recv_closed().await?;
  74. let mut client2 = connect(&filter, "foobar").await?;
  75. assert_eq!(client2.recv().await?, json!({ "Identity": 1 }));
  76. let bob = json!({
  77. "name": "Bob",
  78. "hue": 96
  79. });
  80. client2.send(&json!({ "ClientInfo": bob })).await;
  81. let bob_info = json!({
  82. "UserInfo": {
  83. "id": 1,
  84. "info": bob
  85. }
  86. });
  87. assert_eq!(client2.recv().await?, bob_info);
  88. Ok(())
  89. }
  90. #[tokio::test]
  91. async fn test_cursors() -> Result<()> {
  92. pretty_env_logger::try_init().ok();
  93. let filter = server(ServerConfig::default());
  94. let mut client = connect(&filter, "foobar").await?;
  95. assert_eq!(client.recv().await?, json!({ "Identity": 0 }));
  96. let cursors = json!({
  97. "cursors": [4, 6, 7],
  98. "selections": [[5, 10], [3, 4]]
  99. });
  100. client.send(&json!({ "CursorData": cursors })).await;
  101. let cursors_resp = json!({
  102. "UserCursor": {
  103. "id": 0,
  104. "data": cursors
  105. }
  106. });
  107. assert_eq!(client.recv().await?, cursors_resp);
  108. let mut client2 = connect(&filter, "foobar").await?;
  109. assert_eq!(client2.recv().await?, json!({ "Identity": 1 }));
  110. assert_eq!(client2.recv().await?, cursors_resp);
  111. let cursors2 = json!({
  112. "cursors": [10],
  113. "selections": []
  114. });
  115. client2.send(&json!({ "CursorData": cursors2 })).await;
  116. let cursors2_resp = json!({
  117. "UserCursor": {
  118. "id": 1,
  119. "data": cursors2
  120. }
  121. });
  122. assert_eq!(client2.recv().await?, cursors2_resp);
  123. assert_eq!(client.recv().await?, cursors2_resp);
  124. client.send(&json!({ "Invalid": "please close" })).await;
  125. client.recv_closed().await?;
  126. let msg = json!({
  127. "Edit": {
  128. "revision": 0,
  129. "operation": ["a"]
  130. }
  131. });
  132. client2.send(&msg).await;
  133. let mut client3 = connect(&filter, "foobar").await?;
  134. assert_eq!(client3.recv().await?, json!({ "Identity": 2 }));
  135. client3.recv().await?;
  136. let transformed_cursors2_resp = json!({
  137. "UserCursor": {
  138. "id": 1,
  139. "data": {
  140. "cursors": [11],
  141. "selections": []
  142. }
  143. }
  144. });
  145. assert_eq!(client3.recv().await?, transformed_cursors2_resp);
  146. Ok(())
  147. }