builder.rs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. use flowy_dispatch::prelude::{FromBytes, ToBytes};
  2. use flowy_user::entities::UserDetail;
  3. use std::{
  4. fmt::{Debug, Display},
  5. hash::Hash,
  6. };
  7. use crate::{
  8. helper::valid_email,
  9. tester::{TesterContext, TesterTrait},
  10. };
  11. use flowy_user::errors::UserError;
  12. use flowy_workspace::errors::WorkspaceError;
  13. use std::{marker::PhantomData, sync::Once};
  14. static INIT: Once = Once::new();
  15. pub type SingleUserTestBuilder = TestBuilder<FixedUserTester<WorkspaceError>>;
  16. impl SingleUserTestBuilder {
  17. pub fn new() -> Self {
  18. let mut builder = Self {
  19. tester: Box::new(FixedUserTester::<WorkspaceError>::new()),
  20. user_detail: None,
  21. };
  22. INIT.call_once(|| builder.login_if_need());
  23. builder
  24. }
  25. }
  26. pub type UserTestBuilder = TestBuilder<RandomUserTester<UserError>>;
  27. impl UserTestBuilder {
  28. pub fn new() -> Self {
  29. let builder = Self {
  30. tester: Box::new(RandomUserTester::<UserError>::new()),
  31. user_detail: None,
  32. };
  33. builder
  34. }
  35. pub fn reset(self) -> Self { self.login() }
  36. }
  37. pub struct TestBuilder<T: TesterTrait> {
  38. pub tester: Box<T>,
  39. pub user_detail: Option<UserDetail>,
  40. }
  41. impl<T> TestBuilder<T>
  42. where
  43. T: TesterTrait,
  44. {
  45. pub fn login(mut self) -> Self {
  46. let user_detail = self.tester.login();
  47. self.user_detail = Some(user_detail);
  48. self
  49. }
  50. pub fn login_if_need(&mut self) {
  51. let user_detail = self.tester.login_if_need();
  52. self.user_detail = Some(user_detail);
  53. }
  54. pub fn logout(self) -> Self {
  55. // self.tester.logout();
  56. self
  57. }
  58. pub fn request<P>(mut self, request: P) -> Self
  59. where
  60. P: ToBytes,
  61. {
  62. self.tester.set_payload(request);
  63. self
  64. }
  65. pub fn event<E>(mut self, event: E) -> Self
  66. where
  67. E: Eq + Hash + Debug + Clone + Display,
  68. {
  69. self.tester.set_event(event);
  70. self
  71. }
  72. pub fn sync_send(mut self) -> Self {
  73. self.tester.sync_send();
  74. self
  75. }
  76. pub fn parse<R>(mut self) -> R
  77. where
  78. R: FromBytes,
  79. {
  80. self.tester.parse::<R>()
  81. }
  82. pub fn error(mut self) -> <T as TesterTrait>::Error { self.tester.error() }
  83. pub fn assert_error(mut self) -> Self {
  84. self.tester.assert_error();
  85. self
  86. }
  87. pub fn assert_success(mut self) -> Self {
  88. self.tester.assert_success();
  89. self
  90. }
  91. }
  92. pub struct RandomUserTester<Error> {
  93. context: TesterContext,
  94. err_phantom: PhantomData<Error>,
  95. }
  96. impl<Error> RandomUserTester<Error>
  97. where
  98. Error: FromBytes + Debug,
  99. {
  100. pub fn new() -> Self {
  101. Self {
  102. context: TesterContext::default(),
  103. err_phantom: PhantomData,
  104. }
  105. }
  106. }
  107. impl<Error> TesterTrait for RandomUserTester<Error>
  108. where
  109. Error: FromBytes + Debug,
  110. {
  111. type Error = Error;
  112. fn mut_context(&mut self) -> &mut TesterContext { &mut self.context }
  113. fn context(&self) -> &TesterContext { &self.context }
  114. }
  115. pub struct FixedUserTester<Error> {
  116. context: TesterContext,
  117. err_phantom: PhantomData<Error>,
  118. }
  119. impl<Error> FixedUserTester<Error>
  120. where
  121. Error: FromBytes + Debug,
  122. {
  123. pub fn new() -> Self {
  124. Self {
  125. context: TesterContext::new(valid_email()),
  126. err_phantom: PhantomData,
  127. }
  128. }
  129. }
  130. impl<Error> TesterTrait for FixedUserTester<Error>
  131. where
  132. Error: FromBytes + Debug,
  133. {
  134. type Error = Error;
  135. fn mut_context(&mut self) -> &mut TesterContext { &mut self.context }
  136. fn context(&self) -> &TesterContext { &self.context }
  137. }