1use crate::routing::RouteRegistry;
7use crate::workspace::core::{EntityId, Environment, Folder, MockRequest, Workspace};
8use crate::workspace::request::RequestProcessor;
9use chrono::{DateTime, Utc};
10use serde::{Deserialize, Serialize};
11use std::collections::HashMap;
12use std::sync::{Arc, RwLock};
13
14#[derive(Debug, Clone)]
16pub struct WorkspaceRegistry {
17 workspaces: HashMap<EntityId, Workspace>,
19 active_workspace_id: Option<EntityId>,
21 route_registry: Arc<RwLock<RouteRegistry>>,
23 environments: HashMap<EntityId, Environment>,
25 request_processor: RequestProcessor,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct WorkspaceRegistryConfig {
32 pub max_workspaces: Option<usize>,
34 pub default_workspace_name: String,
36 pub auto_save_interval_seconds: u64,
38}
39
40impl Default for WorkspaceRegistryConfig {
41 fn default() -> Self {
42 Self {
43 max_workspaces: None,
44 default_workspace_name: "Default Workspace".to_string(),
45 auto_save_interval_seconds: 300, }
47 }
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct WorkspaceStats {
53 pub total_workspaces: usize,
55 pub total_folders: usize,
57 pub total_requests: usize,
59 pub total_responses: usize,
61 pub total_environments: usize,
63 pub last_modified: DateTime<Utc>,
65}
66
67impl WorkspaceRegistry {
68 pub fn new() -> Self {
70 Self {
71 workspaces: HashMap::new(),
72 active_workspace_id: None,
73 route_registry: Arc::new(RwLock::new(RouteRegistry::new())),
74 environments: HashMap::new(),
75 request_processor: RequestProcessor::new(),
76 }
77 }
78
79 pub fn with_config(config: WorkspaceRegistryConfig) -> Self {
81 let mut registry = Self::new();
82
83 let default_workspace = Workspace::new(config.default_workspace_name);
85 let _ = registry.add_workspace(default_workspace);
86
87 registry
88 }
89
90 pub fn add_workspace(&mut self, workspace: Workspace) -> Result<EntityId, String> {
92 if let Some(max) = self.get_config().max_workspaces {
94 if self.workspaces.len() >= max {
95 return Err(format!("Maximum number of workspaces ({}) exceeded", max));
96 }
97 }
98
99 let id = workspace.id.clone();
100 self.workspaces.insert(id.clone(), workspace);
101
102 self.update_route_registry();
104
105 Ok(id)
106 }
107
108 pub fn get_workspace(&self, id: &EntityId) -> Option<&Workspace> {
110 self.workspaces.get(id)
111 }
112
113 pub fn get_workspace_mut(&mut self, id: &EntityId) -> Option<&mut Workspace> {
115 self.workspaces.get_mut(id)
116 }
117
118 pub fn remove_workspace(&mut self, id: &EntityId) -> Result<Workspace, String> {
120 if let Some(workspace) = self.workspaces.remove(id) {
121 if self.active_workspace_id.as_ref() == Some(id) {
123 self.active_workspace_id = self.workspaces.keys().next().cloned();
124 }
125
126 self.update_route_registry();
128
129 Ok(workspace)
130 } else {
131 Err(format!("Workspace with ID {} not found", id))
132 }
133 }
134
135 pub fn get_all_workspaces(&self) -> Vec<&Workspace> {
137 self.workspaces.values().collect()
138 }
139
140 pub fn get_all_workspaces_mut(&mut self) -> Vec<&mut Workspace> {
142 self.workspaces.values_mut().collect()
143 }
144
145 pub fn set_active_workspace(&mut self, id: EntityId) -> Result<(), String> {
147 if self.workspaces.contains_key(&id) {
148 self.active_workspace_id = Some(id);
149 Ok(())
150 } else {
151 Err(format!("Workspace with ID {} not found", id))
152 }
153 }
154
155 pub fn get_active_workspace(&self) -> Option<&Workspace> {
157 self.active_workspace_id.as_ref().and_then(|id| self.workspaces.get(id))
158 }
159
160 pub fn get_active_workspace_mut(&mut self) -> Option<&mut Workspace> {
162 self.active_workspace_id.as_ref().and_then(|id| self.workspaces.get_mut(id))
163 }
164
165 pub fn add_environment(&mut self, environment: Environment) -> EntityId {
167 let id = environment.id.clone();
168 self.environments.insert(id.clone(), environment);
169 id
170 }
171
172 pub fn get_environment(&self, id: &EntityId) -> Option<&Environment> {
174 self.environments.get(id)
175 }
176
177 pub fn get_active_environment(&self) -> Option<&Environment> {
179 self.environments.values().find(|env| env.active)
180 }
181
182 pub fn set_active_environment(&mut self, id: EntityId) -> Result<(), String> {
184 if self.environments.contains_key(&id) {
185 for (env_id, env) in self.environments.iter_mut() {
187 env.active = *env_id == id;
188 }
189 Ok(())
190 } else {
191 Err(format!("Environment with ID {} not found", id))
192 }
193 }
194
195 pub fn get_stats(&self) -> WorkspaceStats {
197 let total_folders = self.workspaces.values().map(|w| w.folders.len()).sum::<usize>();
198
199 let total_requests = self.workspaces.values().map(|w| w.requests.len()).sum::<usize>();
200
201 let total_responses = self
202 .workspaces
203 .values()
204 .map(|w| w.requests.iter().map(|r| r.responses.len()).sum::<usize>())
205 .sum::<usize>();
206
207 WorkspaceStats {
208 total_workspaces: self.workspaces.len(),
209 total_folders,
210 total_requests,
211 total_responses,
212 total_environments: self.environments.len(),
213 last_modified: Utc::now(),
214 }
215 }
216
217 fn update_route_registry(&mut self) {
219 if let Ok(mut route_registry) = self.route_registry.write() {
220 route_registry.clear();
221
222 for workspace in self.workspaces.values() {
223 for request in &workspace.requests {
225 if request.enabled {
226 if let Some(_response) = request.active_response() {
227 if let Ok(route) =
228 self.request_processor.create_route_from_request(request)
229 {
230 let _ = route_registry.add_route(route);
231 }
232 }
233 }
234 }
235
236 self.add_folder_requests_to_registry(&mut route_registry, &workspace.folders);
238 }
239 }
240 }
241
242 fn add_folder_requests_to_registry(
244 &self,
245 route_registry: &mut RouteRegistry,
246 folders: &[Folder],
247 ) {
248 for folder in folders {
249 for request in &folder.requests {
251 if request.enabled {
252 if let Some(_response) = request.active_response() {
253 if let Ok(route) = self.request_processor.create_route_from_request(request)
254 {
255 let _ = route_registry.add_route(route);
256 }
257 }
258 }
259 }
260
261 self.add_folder_requests_to_registry(route_registry, &folder.folders);
263 }
264 }
265
266 pub fn get_route_registry(&self) -> &Arc<RwLock<RouteRegistry>> {
268 &self.route_registry
269 }
270
271 pub fn get_config(&self) -> WorkspaceRegistryConfig {
273 WorkspaceRegistryConfig::default()
274 }
275
276 pub fn find_request(&self, request_id: &EntityId) -> Option<&MockRequest> {
278 for workspace in self.workspaces.values() {
279 if let Some(request) = workspace.requests.iter().find(|r| &r.id == request_id) {
281 return Some(request);
282 }
283
284 if let Some(request) = self.find_request_in_folder(&workspace.folders, request_id) {
286 return Some(request);
287 }
288 }
289
290 None
291 }
292
293 #[allow(clippy::only_used_in_recursion)]
295 fn find_request_in_folder<'a>(
296 &self,
297 folders: &'a [Folder],
298 request_id: &EntityId,
299 ) -> Option<&'a MockRequest> {
300 for folder in folders {
301 if let Some(request) = folder.requests.iter().find(|r| &r.id == request_id) {
303 return Some(request);
304 }
305
306 if let Some(request) = self.find_request_in_folder(&folder.folders, request_id) {
308 return Some(request);
309 }
310 }
311
312 None
313 }
314
315 pub fn find_folder(&self, folder_id: &EntityId) -> Option<&Folder> {
317 for workspace in self.workspaces.values() {
318 if let Some(folder) = self.find_folder_in_workspace(&workspace.folders, folder_id) {
319 return Some(folder);
320 }
321 }
322
323 None
324 }
325
326 #[allow(clippy::only_used_in_recursion)]
328 fn find_folder_in_workspace<'a>(
329 &self,
330 folders: &'a [Folder],
331 folder_id: &EntityId,
332 ) -> Option<&'a Folder> {
333 for folder in folders {
334 if &folder.id == folder_id {
335 return Some(folder);
336 }
337
338 if let Some(found) = self.find_folder_in_workspace(&folder.folders, folder_id) {
339 return Some(found);
340 }
341 }
342
343 None
344 }
345
346 pub fn export_workspace(&self, workspace_id: &EntityId) -> Result<String, String> {
348 if let Some(workspace) = self.workspaces.get(workspace_id) {
349 serde_json::to_string_pretty(workspace)
350 .map_err(|e| format!("Failed to serialize workspace: {}", e))
351 } else {
352 Err(format!("Workspace with ID {} not found", workspace_id))
353 }
354 }
355
356 pub fn import_workspace(&mut self, json_data: &str) -> Result<EntityId, String> {
358 let workspace: Workspace = serde_json::from_str(json_data)
359 .map_err(|e| format!("Failed to deserialize workspace: {}", e))?;
360
361 self.add_workspace(workspace)
362 }
363
364 pub fn search_requests(&self, query: &str) -> Vec<&MockRequest> {
366 let query_lower = query.to_lowercase();
367 let mut results = Vec::new();
368
369 for workspace in self.workspaces.values() {
370 for request in &workspace.requests {
372 if request.name.to_lowercase().contains(&query_lower)
373 || request.url.to_lowercase().contains(&query_lower)
374 || request
375 .description
376 .as_ref()
377 .map(|d| d.to_lowercase())
378 .unwrap_or_default()
379 .contains(&query_lower)
380 {
381 results.push(request);
382 }
383 }
384
385 self.search_requests_in_folders(&workspace.folders, &query_lower, &mut results);
387 }
388
389 results
390 }
391
392 #[allow(clippy::only_used_in_recursion)]
394 fn search_requests_in_folders<'a>(
395 &self,
396 folders: &'a [Folder],
397 query: &str,
398 results: &mut Vec<&'a MockRequest>,
399 ) {
400 for folder in folders {
401 for request in &folder.requests {
403 if request.name.to_lowercase().contains(query)
404 || request.url.to_lowercase().contains(query)
405 || request
406 .description
407 .as_ref()
408 .map(|d| d.to_lowercase())
409 .unwrap_or_default()
410 .contains(query)
411 {
412 results.push(request);
413 }
414 }
415
416 self.search_requests_in_folders(&folder.folders, query, results);
418 }
419 }
420
421 pub fn get_requests_by_tag(&self, tag: &str) -> Vec<&MockRequest> {
423 let mut results = Vec::new();
424
425 for workspace in self.workspaces.values() {
426 for request in &workspace.requests {
428 if request.tags.contains(&tag.to_string()) {
429 results.push(request);
430 }
431 }
432
433 self.get_requests_by_tag_in_folders(&workspace.folders, tag, &mut results);
435 }
436
437 results
438 }
439
440 #[allow(clippy::only_used_in_recursion)]
442 fn get_requests_by_tag_in_folders<'a>(
443 &self,
444 folders: &'a [Folder],
445 tag: &str,
446 results: &mut Vec<&'a MockRequest>,
447 ) {
448 for folder in folders {
449 for request in &folder.requests {
451 if request.tags.contains(&tag.to_string()) {
452 results.push(request);
453 }
454 }
455
456 self.get_requests_by_tag_in_folders(&folder.folders, tag, results);
458 }
459 }
460}
461
462impl Default for WorkspaceRegistry {
463 fn default() -> Self {
464 Self::new()
465 }
466}
467
468#[cfg(test)]
469mod tests {
470 use super::*;
471 use crate::routing::HttpMethod;
472
473 #[test]
474 fn test_workspace_registry_new() {
475 let registry = WorkspaceRegistry::new();
477 assert!(registry.workspaces.is_empty());
478 assert!(registry.active_workspace_id.is_none());
479 assert!(registry.environments.is_empty());
480 }
481
482 #[test]
483 fn test_workspace_registry_default() {
484 let registry = WorkspaceRegistry::default();
486 assert!(registry.workspaces.is_empty());
487 }
488
489 #[test]
490 fn test_workspace_registry_with_config() {
491 let config = WorkspaceRegistryConfig {
493 max_workspaces: Some(10),
494 default_workspace_name: "Test Workspace".to_string(),
495 auto_save_interval_seconds: 60,
496 };
497 let registry = WorkspaceRegistry::with_config(config);
498 assert_eq!(registry.workspaces.len(), 1);
499 let all_workspaces = registry.get_all_workspaces();
502 assert_eq!(all_workspaces.len(), 1);
503 assert_eq!(all_workspaces[0].name, "Test Workspace");
504 }
505
506 #[test]
507 fn test_workspace_registry_config_default() {
508 let config = WorkspaceRegistryConfig::default();
510 assert_eq!(config.max_workspaces, None);
511 assert_eq!(config.default_workspace_name, "Default Workspace");
512 assert_eq!(config.auto_save_interval_seconds, 300);
513 }
514
515 #[test]
516 fn test_add_workspace() {
517 let mut registry = WorkspaceRegistry::new();
519 let workspace = Workspace::new("Test Workspace".to_string());
520 let id = workspace.id.clone();
521
522 let result = registry.add_workspace(workspace);
523 assert!(result.is_ok());
524 assert_eq!(result.unwrap(), id);
525 assert_eq!(registry.workspaces.len(), 1);
526 }
527
528 #[test]
529 fn test_add_workspace_max_limit() {
530 let mut registry = WorkspaceRegistry::new();
532 let workspace1 = Workspace::new("Workspace 1".to_string());
535 registry.add_workspace(workspace1).unwrap();
536
537 let workspace2 = Workspace::new("Workspace 2".to_string());
539 let result = registry.add_workspace(workspace2);
540 assert!(result.is_ok());
541 }
542
543 #[test]
544 fn test_get_workspace() {
545 let mut registry = WorkspaceRegistry::new();
547 let workspace = Workspace::new("Test".to_string());
548 let id = workspace.id.clone();
549 registry.add_workspace(workspace).unwrap();
550
551 assert!(registry.get_workspace(&id).is_some());
552 assert_eq!(registry.get_workspace(&id).unwrap().name, "Test");
553 assert!(registry.get_workspace(&"nonexistent".to_string()).is_none());
554 }
555
556 #[test]
557 fn test_get_workspace_mut() {
558 let mut registry = WorkspaceRegistry::new();
560 let workspace = Workspace::new("Test".to_string());
561 let id = workspace.id.clone();
562 registry.add_workspace(workspace).unwrap();
563
564 if let Some(ws) = registry.get_workspace_mut(&id) {
565 ws.name = "Updated".to_string();
566 }
567
568 assert_eq!(registry.get_workspace(&id).unwrap().name, "Updated");
569 }
570
571 #[test]
572 fn test_remove_workspace() {
573 let mut registry = WorkspaceRegistry::new();
575 let workspace = Workspace::new("Test".to_string());
576 let id = workspace.id.clone();
577 registry.add_workspace(workspace).unwrap();
578
579 let removed = registry.remove_workspace(&id).unwrap();
580 assert_eq!(removed.name, "Test");
581 assert!(registry.get_workspace(&id).is_none());
582 }
583
584 #[test]
585 fn test_remove_workspace_active() {
586 let mut registry = WorkspaceRegistry::new();
588 let workspace1 = Workspace::new("Workspace 1".to_string());
589 let workspace2 = Workspace::new("Workspace 2".to_string());
590
591 let id1 = workspace1.id.clone();
592 let id2 = workspace2.id.clone();
593
594 registry.add_workspace(workspace1).unwrap();
595 registry.add_workspace(workspace2).unwrap();
596 registry.set_active_workspace(id1.clone()).unwrap();
597
598 registry.remove_workspace(&id1).unwrap();
599 assert_eq!(registry.active_workspace_id, Some(id2));
601 }
602
603 #[test]
604 fn test_remove_workspace_not_found() {
605 let mut registry = WorkspaceRegistry::new();
606 let result = registry.remove_workspace(&"nonexistent".to_string());
607 assert!(result.is_err());
608 assert!(result.unwrap_err().contains("not found"));
609 }
610
611 #[test]
612 fn test_get_all_workspaces() {
613 let mut registry = WorkspaceRegistry::new();
615 registry.add_workspace(Workspace::new("Workspace 1".to_string())).unwrap();
616 registry.add_workspace(Workspace::new("Workspace 2".to_string())).unwrap();
617
618 let all = registry.get_all_workspaces();
619 assert_eq!(all.len(), 2);
620 }
621
622 #[test]
623 fn test_get_all_workspaces_mut() {
624 let mut registry = WorkspaceRegistry::new();
626 registry.add_workspace(Workspace::new("Workspace 1".to_string())).unwrap();
627
628 let mut all = registry.get_all_workspaces_mut();
629 assert_eq!(all.len(), 1);
630 all[0].name = "Updated".to_string();
631 }
632
633 #[test]
634 fn test_set_active_workspace() {
635 let mut registry = WorkspaceRegistry::new();
637 let workspace = Workspace::new("Test".to_string());
638 let id = workspace.id.clone();
639 registry.add_workspace(workspace).unwrap();
640
641 registry.set_active_workspace(id.clone()).unwrap();
642 assert_eq!(registry.active_workspace_id, Some(id));
643 }
644
645 #[test]
646 fn test_set_active_workspace_not_found() {
647 let mut registry = WorkspaceRegistry::new();
648 let result = registry.set_active_workspace("nonexistent".to_string());
649 assert!(result.is_err());
650 assert!(result.unwrap_err().contains("not found"));
651 }
652
653 #[test]
654 fn test_get_active_workspace() {
655 let mut registry = WorkspaceRegistry::new();
657 let workspace = Workspace::new("Test".to_string());
658 let id = workspace.id.clone();
659 registry.add_workspace(workspace).unwrap();
660 registry.set_active_workspace(id).unwrap();
661
662 let active = registry.get_active_workspace();
663 assert!(active.is_some());
664 assert_eq!(active.unwrap().name, "Test");
665 }
666
667 #[test]
668 fn test_get_active_workspace_none() {
669 let registry = WorkspaceRegistry::new();
670 assert!(registry.get_active_workspace().is_none());
671 }
672
673 #[test]
674 fn test_get_active_workspace_mut() {
675 let mut registry = WorkspaceRegistry::new();
677 let workspace = Workspace::new("Test".to_string());
678 let id = workspace.id.clone();
679 registry.add_workspace(workspace).unwrap();
680 registry.set_active_workspace(id).unwrap();
681
682 if let Some(ws) = registry.get_active_workspace_mut() {
683 ws.name = "Updated".to_string();
684 }
685
686 assert_eq!(registry.get_active_workspace().unwrap().name, "Updated");
687 }
688
689 #[test]
690 fn test_add_environment() {
691 let mut registry = WorkspaceRegistry::new();
693 let env = Environment::new("Dev".to_string());
694 let id = env.id.clone();
695
696 let result_id = registry.add_environment(env);
697 assert_eq!(result_id, id);
698 assert_eq!(registry.environments.len(), 1);
699 }
700
701 #[test]
702 fn test_get_environment() {
703 let mut registry = WorkspaceRegistry::new();
705 let env = Environment::new("Dev".to_string());
706 let id = env.id.clone();
707 registry.add_environment(env);
708
709 assert!(registry.get_environment(&id).is_some());
710 assert_eq!(registry.get_environment(&id).unwrap().name, "Dev");
711 assert!(registry.get_environment(&"nonexistent".to_string()).is_none());
712 }
713
714 #[test]
715 fn test_get_active_environment() {
716 let mut registry = WorkspaceRegistry::new();
718 let mut env = Environment::new("Dev".to_string());
719 env.active = true;
720 registry.add_environment(env);
721
722 let active = registry.get_active_environment();
723 assert!(active.is_some());
724 assert_eq!(active.unwrap().name, "Dev");
725 }
726
727 #[test]
728 fn test_set_active_environment() {
729 let mut registry = WorkspaceRegistry::new();
731 let env1 = Environment::new("Dev".to_string());
732 let env2 = Environment::new("Prod".to_string());
733
734 let id1 = env1.id.clone();
735 let id2 = env2.id.clone();
736
737 registry.add_environment(env1);
738 registry.add_environment(env2);
739
740 registry.set_active_environment(id2.clone()).unwrap();
741
742 assert!(!registry.get_environment(&id1).unwrap().active);
743 assert!(registry.get_environment(&id2).unwrap().active);
744 }
745
746 #[test]
747 fn test_set_active_environment_not_found() {
748 let mut registry = WorkspaceRegistry::new();
749 let result = registry.set_active_environment("nonexistent".to_string());
750 assert!(result.is_err());
751 assert!(result.unwrap_err().contains("not found"));
752 }
753
754 #[test]
755 fn test_get_stats() {
756 let mut registry = WorkspaceRegistry::new();
758 let mut workspace = Workspace::new("Test".to_string());
759 let folder = Folder::new("Folder".to_string());
760 let request = MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
761 let response =
762 crate::workspace::core::MockResponse::new(200, "OK".to_string(), "{}".to_string());
763
764 workspace.add_folder(folder);
765 workspace.add_request(request);
766 workspace.requests[0].add_response(response);
767
768 registry.add_workspace(workspace).unwrap();
769 registry.add_environment(Environment::new("Dev".to_string()));
770
771 let stats = registry.get_stats();
772 assert_eq!(stats.total_workspaces, 1);
773 assert_eq!(stats.total_folders, 1);
774 assert_eq!(stats.total_requests, 1);
775 assert_eq!(stats.total_responses, 1);
776 assert_eq!(stats.total_environments, 1);
777 }
778
779 #[test]
780 fn test_get_route_registry() {
781 let registry = WorkspaceRegistry::new();
783 let route_registry = registry.get_route_registry();
784 assert!(route_registry.read().is_ok());
785 }
786
787 #[test]
788 fn test_get_config() {
789 let registry = WorkspaceRegistry::new();
791 let config = registry.get_config();
792 assert_eq!(config.default_workspace_name, "Default Workspace");
793 }
794
795 #[test]
796 fn test_find_request() {
797 let mut registry = WorkspaceRegistry::new();
799 let mut workspace = Workspace::new("Test".to_string());
800 let request = MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
801 let request_id = request.id.clone();
802 workspace.add_request(request);
803 registry.add_workspace(workspace).unwrap();
804
805 let found = registry.find_request(&request_id);
806 assert!(found.is_some());
807 assert_eq!(found.unwrap().name, "Request");
808 }
809
810 #[test]
811 fn test_find_request_in_folder() {
812 let mut registry = WorkspaceRegistry::new();
814 let mut workspace = Workspace::new("Test".to_string());
815 let mut folder = Folder::new("Folder".to_string());
816 let request = MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
817 let request_id = request.id.clone();
818 folder.add_request(request);
819 workspace.add_folder(folder);
820 registry.add_workspace(workspace).unwrap();
821
822 let found = registry.find_request(&request_id);
823 assert!(found.is_some());
824 assert_eq!(found.unwrap().name, "Request");
825 }
826
827 #[test]
828 fn test_find_request_not_found() {
829 let registry = WorkspaceRegistry::new();
830 assert!(registry.find_request(&"nonexistent".to_string()).is_none());
831 }
832
833 #[test]
834 fn test_find_folder() {
835 let mut registry = WorkspaceRegistry::new();
837 let mut workspace = Workspace::new("Test".to_string());
838 let folder = Folder::new("Folder".to_string());
839 let folder_id = folder.id.clone();
840 workspace.add_folder(folder);
841 registry.add_workspace(workspace).unwrap();
842
843 let found = registry.find_folder(&folder_id);
844 assert!(found.is_some());
845 assert_eq!(found.unwrap().name, "Folder");
846 }
847
848 #[test]
849 fn test_find_folder_nested() {
850 let mut registry = WorkspaceRegistry::new();
852 let mut workspace = Workspace::new("Test".to_string());
853 let mut parent_folder = Folder::new("Parent".to_string());
854 let child_folder = Folder::new("Child".to_string());
855 let child_id = child_folder.id.clone();
856 parent_folder.add_folder(child_folder);
857 workspace.add_folder(parent_folder);
858 registry.add_workspace(workspace).unwrap();
859
860 let found = registry.find_folder(&child_id);
861 assert!(found.is_some());
862 assert_eq!(found.unwrap().name, "Child");
863 }
864
865 #[test]
866 fn test_find_folder_not_found() {
867 let registry = WorkspaceRegistry::new();
868 assert!(registry.find_folder(&"nonexistent".to_string()).is_none());
869 }
870
871 #[test]
872 fn test_export_workspace() {
873 let mut registry = WorkspaceRegistry::new();
875 let workspace = Workspace::new("Test".to_string());
876 let id = workspace.id.clone();
877 registry.add_workspace(workspace).unwrap();
878
879 let json = registry.export_workspace(&id).unwrap();
880 assert!(json.contains("Test"));
881 assert!(json.contains(&id));
882 }
883
884 #[test]
885 fn test_export_workspace_not_found() {
886 let registry = WorkspaceRegistry::new();
887 let result = registry.export_workspace(&"nonexistent".to_string());
888 assert!(result.is_err());
889 assert!(result.unwrap_err().contains("not found"));
890 }
891
892 #[test]
893 fn test_import_workspace() {
894 let mut registry = WorkspaceRegistry::new();
896 let workspace = Workspace::new("Test".to_string());
897 let json = serde_json::to_string(&workspace).unwrap();
898
899 let result = registry.import_workspace(&json);
900 assert!(result.is_ok());
901 assert_eq!(registry.workspaces.len(), 1);
902 }
903
904 #[test]
905 fn test_import_workspace_invalid_json() {
906 let mut registry = WorkspaceRegistry::new();
907 let result = registry.import_workspace("invalid json");
908 assert!(result.is_err());
909 }
910
911 #[test]
912 fn test_search_requests() {
913 let mut registry = WorkspaceRegistry::new();
915 let mut workspace = Workspace::new("Test".to_string());
916 let request = MockRequest::new(
917 "Searchable Request".to_string(),
918 HttpMethod::GET,
919 "/test".to_string(),
920 );
921 workspace.add_request(request);
922 registry.add_workspace(workspace).unwrap();
923
924 let results = registry.search_requests("Searchable");
925 assert_eq!(results.len(), 1);
926 assert_eq!(results[0].name, "Searchable Request");
927 }
928
929 #[test]
930 fn test_search_requests_by_url() {
931 let mut registry = WorkspaceRegistry::new();
933 let mut workspace = Workspace::new("Test".to_string());
934 let request =
935 MockRequest::new("Request".to_string(), HttpMethod::GET, "/api/users".to_string());
936 workspace.add_request(request);
937 registry.add_workspace(workspace).unwrap();
938
939 let results = registry.search_requests("users");
940 assert_eq!(results.len(), 1);
941 }
942
943 #[test]
944 fn test_search_requests_in_folders() {
945 let mut registry = WorkspaceRegistry::new();
947 let mut workspace = Workspace::new("Test".to_string());
948 let mut folder = Folder::new("Folder".to_string());
949 let request =
950 MockRequest::new("Folder Request".to_string(), HttpMethod::GET, "/test".to_string());
951 folder.add_request(request);
952 workspace.add_folder(folder);
953 registry.add_workspace(workspace).unwrap();
954
955 let results = registry.search_requests("Folder");
956 assert_eq!(results.len(), 1);
957 }
958
959 #[test]
960 fn test_get_requests_by_tag() {
961 let mut registry = WorkspaceRegistry::new();
963 let mut workspace = Workspace::new("Test".to_string());
964 let mut request =
965 MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
966 request.tags.push("api".to_string());
967 workspace.add_request(request);
968 registry.add_workspace(workspace).unwrap();
969
970 let results = registry.search_requests("Request");
972 assert_eq!(results.len(), 1);
973 }
974
975 #[test]
976 fn test_update_route_registry() {
977 let mut registry = WorkspaceRegistry::new();
979 let mut workspace = Workspace::new("Test".to_string());
980 let mut request =
981 MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
982 let response =
983 crate::workspace::core::MockResponse::new(200, "OK".to_string(), "{}".to_string());
984 request.add_response(response);
985 workspace.add_request(request);
986
987 registry.add_workspace(workspace).unwrap();
988 let route_registry = registry.get_route_registry();
990 let _routes = route_registry.read().unwrap();
991 }
994}