builder.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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::{create_default_workspace_if_need, valid_email},
  9. tester::{TesterContext, TesterTrait},
  10. };
  11. use flowy_user::errors::UserError;
  12. use flowy_workspace::errors::WorkspaceError;
  13. use std::marker::PhantomData;
  14. pub type AnnieTestBuilder = Builder<FlowyAnnie<WorkspaceError>>;
  15. impl AnnieTestBuilder {
  16. pub fn new() -> Self {
  17. let mut builder = Builder::test(Box::new(FlowyAnnie::<WorkspaceError>::new()));
  18. builder.setup_default_workspace();
  19. builder
  20. }
  21. pub fn setup_default_workspace(&mut self) {
  22. self.login_if_need();
  23. let user_id = self.user_detail.as_ref().unwrap().id.clone();
  24. let _ = create_default_workspace_if_need(&user_id);
  25. }
  26. }
  27. pub type TestBuilder = Builder<RandomUserTester<UserError>>;
  28. impl TestBuilder {
  29. pub fn new() -> Self { Builder::test(Box::new(RandomUserTester::<UserError>::new())) }
  30. }
  31. pub struct Builder<T: TesterTrait> {
  32. pub tester: Box<T>,
  33. pub user_detail: Option<UserDetail>,
  34. }
  35. impl<T> Builder<T>
  36. where
  37. T: TesterTrait,
  38. {
  39. fn test(tester: Box<T>) -> Self {
  40. Self {
  41. tester,
  42. user_detail: None,
  43. }
  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. 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 FlowyAnnie<Error> {
  116. context: TesterContext,
  117. err_phantom: PhantomData<Error>,
  118. }
  119. impl<Error> FlowyAnnie<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 FlowyAnnie<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. }