tester.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. use crate::{
  2. helper::{random_valid_email, valid_password},
  3. init_test_sdk,
  4. };
  5. use flowy_dispatch::prelude::*;
  6. pub use flowy_sdk::*;
  7. use flowy_user::{
  8. errors::UserError,
  9. event::UserEvent::{GetStatus, SignIn, SignOut},
  10. prelude::*,
  11. };
  12. use std::{
  13. convert::TryFrom,
  14. fmt::{Debug, Display},
  15. hash::Hash,
  16. sync::Arc,
  17. };
  18. pub struct TesterContext {
  19. request: Option<ModuleRequest>,
  20. response: Option<EventResponse>,
  21. status_code: StatusCode,
  22. server: ArcFlowyServer,
  23. user_email: String,
  24. }
  25. impl TesterContext {
  26. pub fn new(email: String) -> Self {
  27. let mut ctx = TesterContext::default();
  28. ctx.user_email = email;
  29. ctx
  30. }
  31. }
  32. impl std::default::Default for TesterContext {
  33. fn default() -> Self {
  34. Self {
  35. request: None,
  36. status_code: StatusCode::Ok,
  37. response: None,
  38. server: Arc::new(FlowyServerMocker {}),
  39. user_email: random_valid_email(),
  40. }
  41. }
  42. }
  43. pub trait TesterTrait {
  44. type Error: FromBytes + Debug;
  45. fn mut_context(&mut self) -> &mut TesterContext;
  46. fn context(&self) -> &TesterContext;
  47. fn assert_error(&mut self) { self.mut_context().status_code = StatusCode::Err; }
  48. fn assert_success(&mut self) { self.mut_context().status_code = StatusCode::Ok; }
  49. fn set_event<E>(&mut self, event: E)
  50. where
  51. E: Eq + Hash + Debug + Clone + Display,
  52. {
  53. init_test_sdk(self.context().server.clone());
  54. self.mut_context().request = Some(ModuleRequest::new(event));
  55. }
  56. fn set_payload<P>(&mut self, payload: P)
  57. where
  58. P: ToBytes,
  59. {
  60. let bytes = payload.into_bytes().unwrap();
  61. let module_request = self.mut_context().request.take().unwrap();
  62. self.mut_context().request = Some(module_request.payload(bytes));
  63. }
  64. fn sync_send(&mut self) {
  65. let resp = EventDispatch::sync_send(self.mut_context().request.take().unwrap());
  66. self.mut_context().response = Some(resp);
  67. }
  68. fn parse<R>(&mut self) -> R
  69. where
  70. R: FromBytes,
  71. {
  72. let response = self.mut_context().response.clone().unwrap();
  73. match response.parse::<R, Self::Error>() {
  74. Ok(Ok(data)) => data,
  75. Ok(Err(e)) => panic!("parse failed: {:?}", e),
  76. Err(e) => panic!("Internal error: {:?}", e),
  77. }
  78. }
  79. fn error(&mut self) -> Self::Error {
  80. let response = self.mut_context().response.clone().unwrap();
  81. assert_eq!(response.status_code, StatusCode::Err);
  82. <Data<Self::Error>>::try_from(response.payload)
  83. .unwrap()
  84. .into_inner()
  85. }
  86. fn login(&self) -> UserDetail {
  87. init_test_sdk(self.context().server.clone());
  88. let payload = SignInRequest {
  89. email: self.context().user_email.clone(),
  90. password: valid_password(),
  91. }
  92. .into_bytes()
  93. .unwrap();
  94. let request = ModuleRequest::new(SignIn).payload(payload);
  95. let user_detail = EventDispatch::sync_send(request)
  96. .parse::<UserDetail, UserError>()
  97. .unwrap()
  98. .unwrap();
  99. user_detail
  100. }
  101. fn login_if_need(&self) -> UserDetail {
  102. init_test_sdk(self.context().server.clone());
  103. match EventDispatch::sync_send(ModuleRequest::new(GetStatus))
  104. .parse::<UserDetail, UserError>()
  105. .unwrap()
  106. {
  107. Ok(user_detail) => user_detail,
  108. Err(_e) => self.login(),
  109. }
  110. }
  111. fn logout(&self) {
  112. init_test_sdk(self.context().server.clone());
  113. let _ = EventDispatch::sync_send(ModuleRequest::new(SignOut));
  114. }
  115. }