tester.rs 3.7 KB

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