export_test.rs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. use crate::database::database_editor::DatabaseEditorTest;
  2. use flowy_database2::entities::FieldType;
  3. use flowy_database2::services::cell::stringify_cell_data;
  4. use flowy_database2::services::field::CHECK;
  5. use flowy_database2::services::share::csv::CSVFormat;
  6. #[tokio::test]
  7. async fn export_meta_csv_test() {
  8. let test = DatabaseEditorTest::new_grid().await;
  9. let database = test.editor.clone();
  10. let s = database.export_csv(CSVFormat::META).await.unwrap();
  11. let mut reader = csv::Reader::from_reader(s.as_bytes());
  12. for header in reader.headers() {
  13. dbg!(header);
  14. }
  15. let export_csv_records = reader.records();
  16. for record in export_csv_records {
  17. let record = record.unwrap();
  18. dbg!(record);
  19. }
  20. }
  21. #[tokio::test]
  22. async fn export_csv_test() {
  23. let test = DatabaseEditorTest::new_grid().await;
  24. let database = test.editor.clone();
  25. let s = database.export_csv(CSVFormat::Original).await.unwrap();
  26. let expected = r#"Name,Price,Time,Status,Platform,is urgent,link,TODO,Updated At,Created At
  27. A,$1,2022/03/14,,"Google,Facebook",Yes,AppFlowy website - https://www.appflowy.io,"Wake up at 6:00 am,Get some coffee,Start working",2022/03/14,2022/03/14
  28. ,$2,2022/03/14,,"Google,Twitter",Yes,,,2022/03/14,2022/03/14
  29. C,$3,2022/03/14,Completed,Facebook,No,,,2022/03/14,2022/03/14
  30. DA,$14,2022/11/17,Completed,,No,,,2022/11/17,2022/11/17
  31. AE,,2022/11/13,Planned,,No,,,2022/11/13,2022/11/13
  32. AE,$5,2022/12/24,Planned,,Yes,,,2022/12/24,2022/12/24
  33. "#;
  34. assert_eq!(s, expected);
  35. }
  36. #[tokio::test]
  37. async fn export_and_then_import_meta_csv_test() {
  38. let test = DatabaseEditorTest::new_grid().await;
  39. let database = test.editor.clone();
  40. let format = CSVFormat::META;
  41. let csv_1 = database.export_csv(format).await.unwrap();
  42. let result = test.import(csv_1.clone(), format).await;
  43. let database = test.get_database(&result.database_id).await.unwrap();
  44. let fields = database.get_fields(&result.view_id, None);
  45. let rows = database.get_rows(&result.view_id).await.unwrap();
  46. assert_eq!(fields[0].field_type, 0);
  47. assert_eq!(fields[1].field_type, 1);
  48. assert_eq!(fields[2].field_type, 2);
  49. assert_eq!(fields[3].field_type, 3);
  50. assert_eq!(fields[4].field_type, 4);
  51. assert_eq!(fields[5].field_type, 5);
  52. assert_eq!(fields[6].field_type, 6);
  53. assert_eq!(fields[7].field_type, 7);
  54. assert_eq!(fields[8].field_type, 8);
  55. assert_eq!(fields[9].field_type, 9);
  56. for field in fields {
  57. for (index, row) in rows.iter().enumerate() {
  58. if let Some(cell) = row.cells.get(&field.id) {
  59. let field_type = FieldType::from(field.field_type);
  60. let s = stringify_cell_data(cell, &field_type, &field_type, &field);
  61. match &field_type {
  62. FieldType::RichText => {
  63. if index == 0 {
  64. assert_eq!(s, "A");
  65. }
  66. },
  67. FieldType::Number => {
  68. if index == 0 {
  69. assert_eq!(s, "$1");
  70. }
  71. },
  72. FieldType::DateTime => {
  73. if index == 0 {
  74. assert_eq!(s, "2022/03/14");
  75. }
  76. },
  77. FieldType::SingleSelect => {
  78. if index == 0 {
  79. assert_eq!(s, "");
  80. }
  81. },
  82. FieldType::MultiSelect => {
  83. if index == 0 {
  84. assert_eq!(s, "Google,Facebook");
  85. }
  86. },
  87. FieldType::Checkbox => {},
  88. FieldType::URL => {},
  89. FieldType::Checklist => {},
  90. FieldType::UpdatedAt => {},
  91. FieldType::CreatedAt => {},
  92. }
  93. } else {
  94. panic!(
  95. "Can not found the cell with id: {} in {:?}",
  96. field.id, row.cells
  97. );
  98. }
  99. }
  100. }
  101. }
  102. #[tokio::test]
  103. async fn history_database_import_test() {
  104. let format = CSVFormat::META;
  105. let test = DatabaseEditorTest::new_grid().await;
  106. let csv = r#""{""id"":""TJCxFc"",""name"":""Name"",""field_type"":0,""visibility"":true,""width"":100,""type_options"":{""0"":{""data"":""""}},""is_primary"":true}","{""id"":""XbMTxa"",""name"":""Price"",""field_type"":1,""visibility"":true,""width"":100,""type_options"":{""1"":{""format"":1,""name"":""Number"",""scale"":0,""symbol"":""$""}},""is_primary"":false}","{""id"":""cPgMsM"",""name"":""Time"",""field_type"":2,""visibility"":true,""width"":100,""type_options"":{""2"":{""date_format"":1,""field_type"":2,""time_format"":1}},""is_primary"":false}","{""id"":""vCelOS"",""name"":""Status"",""field_type"":3,""visibility"":true,""width"":100,""type_options"":{""3"":{""content"":""{\""options\"":[{\""id\"":\""c_-f\"",\""name\"":\""Completed\"",\""color\"":\""Purple\""},{\""id\"":\""wQpG\"",\""name\"":\""Planned\"",\""color\"":\""Purple\""},{\""id\"":\""VLHf\"",\""name\"":\""Paused\"",\""color\"":\""Purple\""}],\""disable_color\"":false}""}},""is_primary"":false}","{""id"":""eQEcry"",""name"":""Platform"",""field_type"":4,""visibility"":true,""width"":100,""type_options"":{""4"":{""content"":""{\""options\"":[{\""id\"":\""edpw\"",\""name\"":\""Google\"",\""color\"":\""Purple\""},{\""id\"":\""cx0O\"",\""name\"":\""Facebook\"",\""color\"":\""Purple\""},{\""id\"":\""EsFR\"",\""name\"":\""Twitter\"",\""color\"":\""Purple\""}],\""disable_color\"":false}""}},""is_primary"":false}","{""id"":""KGlcPi"",""name"":""is urgent"",""field_type"":5,""visibility"":true,""width"":100,""type_options"":{""5"":{""is_selected"":false}},""is_primary"":false}","{""id"":""SBpJNI"",""name"":""link"",""field_type"":6,""visibility"":true,""width"":100,""type_options"":{""6"":{""data"":""""}},""is_primary"":false}","{""id"":""orSsPm"",""name"":""TODO"",""field_type"":7,""visibility"":true,""width"":100,""type_options"":{""7"":{""content"":""{\""options\"":[{\""id\"":\""HLXi\"",\""name\"":\""Wake up at 6:00 am\"",\""color\"":\""Purple\""},{\""id\"":\""CsGr\"",\""name\"":\""Get some coffee\"",\""color\"":\""Purple\""},{\""id\"":\""4WqN\"",\""name\"":\""Start working\"",\""color\"":\""Purple\""}],\""disable_color\"":false}""}},""is_primary"":false}"
  107. "{""data"":""A"",""field_type"":0}","{""data"":""1"",""field_type"":1}","{""data"":""1647251762"",""field_type"":2}","{""data"":"""",""field_type"":3}","{""data"":""edpw,cx0O"",""field_type"":4}","{""data"":""Yes"",""field_type"":5}","{""data"":""AppFlowy website - https://www.appflowy.io"",""field_type"":6}","{""data"":""HLXi,CsGr,4WqN"",""field_type"":7}"
  108. "{""data"":"""",""field_type"":0}","{""data"":""2"",""field_type"":1}","{""data"":""1647251762"",""field_type"":2}","{""data"":"""",""field_type"":3}","{""data"":""edpw,EsFR"",""field_type"":4}","{""data"":""Yes"",""field_type"":5}","{""data"":"""",""field_type"":6}","{""data"":"""",""field_type"":7}"
  109. "{""data"":""C"",""field_type"":0}","{""data"":""3"",""field_type"":1}","{""data"":""1647251762"",""field_type"":2}","{""data"":""c_-f"",""field_type"":3}","{""data"":""cx0O"",""field_type"":4}","{""data"":""No"",""field_type"":5}","{""data"":"""",""field_type"":6}","{""data"":"""",""field_type"":7}"
  110. "{""data"":""DA"",""field_type"":0}","{""data"":""14"",""field_type"":1}","{""data"":""1668704685"",""field_type"":2}","{""data"":""c_-f"",""field_type"":3}","{""data"":"""",""field_type"":4}","{""data"":""No"",""field_type"":5}","{""data"":"""",""field_type"":6}","{""data"":"""",""field_type"":7}"
  111. "{""data"":""AE"",""field_type"":0}","{""data"":"""",""field_type"":1}","{""data"":""1668359085"",""field_type"":2}","{""data"":""wQpG"",""field_type"":3}","{""data"":"""",""field_type"":4}","{""data"":""No"",""field_type"":5}","{""data"":"""",""field_type"":6}","{""data"":"""",""field_type"":7}"
  112. "{""data"":""AE"",""field_type"":0}","{""data"":""5"",""field_type"":1}","{""data"":""1671938394"",""field_type"":2}","{""data"":""wQpG"",""field_type"":3}","{""data"":"""",""field_type"":4}","{""data"":""Yes"",""field_type"":5}","{""data"":"""",""field_type"":6}","{""data"":"""",""field_type"":7}"
  113. "#;
  114. let result = test.import(csv.to_string(), format).await;
  115. let database = test.get_database(&result.database_id).await.unwrap();
  116. let fields = database.get_fields(&result.view_id, None);
  117. let rows = database.get_rows(&result.view_id).await.unwrap();
  118. assert_eq!(fields[0].field_type, 0);
  119. assert_eq!(fields[1].field_type, 1);
  120. assert_eq!(fields[2].field_type, 2);
  121. assert_eq!(fields[3].field_type, 3);
  122. assert_eq!(fields[4].field_type, 4);
  123. assert_eq!(fields[5].field_type, 5);
  124. assert_eq!(fields[6].field_type, 6);
  125. assert_eq!(fields[7].field_type, 7);
  126. for field in fields {
  127. for (index, row) in rows.iter().enumerate() {
  128. if let Some(cell) = row.cells.get(&field.id) {
  129. let field_type = FieldType::from(field.field_type);
  130. let s = stringify_cell_data(cell, &field_type, &field_type, &field);
  131. match &field_type {
  132. FieldType::RichText => {
  133. if index == 0 {
  134. assert_eq!(s, "A");
  135. }
  136. },
  137. FieldType::Number => {
  138. if index == 0 {
  139. assert_eq!(s, "$1");
  140. }
  141. },
  142. FieldType::DateTime => {
  143. if index == 0 {
  144. assert_eq!(s, "2022/03/14");
  145. }
  146. },
  147. FieldType::SingleSelect => {
  148. if index == 0 {
  149. assert_eq!(s, "");
  150. }
  151. },
  152. FieldType::MultiSelect => {
  153. if index == 0 {
  154. assert_eq!(s, "Google,Facebook");
  155. }
  156. },
  157. FieldType::Checkbox => {
  158. if index == 0 {
  159. assert_eq!(s, CHECK);
  160. }
  161. },
  162. FieldType::URL => {
  163. if index == 0 {
  164. assert_eq!(s, "AppFlowy website - https://www.appflowy.io");
  165. }
  166. },
  167. FieldType::Checklist => {},
  168. FieldType::UpdatedAt => {},
  169. FieldType::CreatedAt => {},
  170. }
  171. } else {
  172. panic!(
  173. "Can not found the cell with id: {} in {:?}",
  174. field.id, row.cells
  175. );
  176. }
  177. }
  178. }
  179. }