use crate::routing::RouteRegistry;
use crate::workspace::core::{EntityId, Environment, Folder, MockRequest, Workspace};
use crate::workspace::request::RequestProcessor;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
#[derive(Debug, Clone)]
pub struct WorkspaceRegistry {
workspaces: HashMap<EntityId, Workspace>,
active_workspace_id: Option<EntityId>,
route_registry: Arc<RwLock<RouteRegistry>>,
environments: HashMap<EntityId, Environment>,
request_processor: RequestProcessor,
config: WorkspaceRegistryConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkspaceRegistryConfig {
pub max_workspaces: Option<usize>,
pub default_workspace_name: String,
pub auto_save_interval_seconds: u64,
}
impl Default for WorkspaceRegistryConfig {
fn default() -> Self {
Self {
max_workspaces: None,
default_workspace_name: "Default Workspace".to_string(),
auto_save_interval_seconds: 300, }
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkspaceStats {
pub total_workspaces: usize,
pub total_folders: usize,
pub total_requests: usize,
pub total_responses: usize,
pub total_environments: usize,
pub last_modified: DateTime<Utc>,
}
impl WorkspaceRegistry {
pub fn new() -> Self {
Self {
workspaces: HashMap::new(),
active_workspace_id: None,
route_registry: Arc::new(RwLock::new(RouteRegistry::new())),
environments: HashMap::new(),
request_processor: RequestProcessor::new(),
config: WorkspaceRegistryConfig::default(),
}
}
pub fn with_config(config: WorkspaceRegistryConfig) -> Self {
let mut registry = Self {
config: config.clone(),
..Self::new()
};
let default_workspace = Workspace::new(config.default_workspace_name.clone());
let _ = registry.add_workspace(default_workspace);
registry
}
pub fn add_workspace(&mut self, workspace: Workspace) -> Result<EntityId, String> {
if let Some(max) = self.get_config().max_workspaces {
if self.workspaces.len() >= max {
return Err(format!("Maximum number of workspaces ({}) exceeded", max));
}
}
let id = workspace.id.clone();
self.workspaces.insert(id.clone(), workspace);
self.update_route_registry();
Ok(id)
}
pub fn get_workspace(&self, id: &EntityId) -> Option<&Workspace> {
self.workspaces.get(id)
}
pub fn get_workspace_mut(&mut self, id: &EntityId) -> Option<&mut Workspace> {
self.workspaces.get_mut(id)
}
pub fn remove_workspace(&mut self, id: &EntityId) -> Result<Workspace, String> {
if let Some(workspace) = self.workspaces.remove(id) {
if self.active_workspace_id.as_ref() == Some(id) {
self.active_workspace_id = self.workspaces.keys().next().cloned();
}
self.update_route_registry();
Ok(workspace)
} else {
Err(format!("Workspace with ID {} not found", id))
}
}
pub fn get_all_workspaces(&self) -> Vec<&Workspace> {
self.workspaces.values().collect()
}
pub fn get_all_workspaces_mut(&mut self) -> Vec<&mut Workspace> {
self.workspaces.values_mut().collect()
}
pub fn set_active_workspace(&mut self, id: EntityId) -> Result<(), String> {
if self.workspaces.contains_key(&id) {
self.active_workspace_id = Some(id);
Ok(())
} else {
Err(format!("Workspace with ID {} not found", id))
}
}
pub fn get_active_workspace(&self) -> Option<&Workspace> {
self.active_workspace_id.as_ref().and_then(|id| self.workspaces.get(id))
}
pub fn get_active_workspace_mut(&mut self) -> Option<&mut Workspace> {
self.active_workspace_id.as_ref().and_then(|id| self.workspaces.get_mut(id))
}
pub fn add_environment(&mut self, environment: Environment) -> EntityId {
let id = environment.id.clone();
self.environments.insert(id.clone(), environment);
id
}
pub fn get_environment(&self, id: &EntityId) -> Option<&Environment> {
self.environments.get(id)
}
pub fn get_active_environment(&self) -> Option<&Environment> {
self.environments.values().find(|env| env.active)
}
pub fn set_active_environment(&mut self, id: EntityId) -> Result<(), String> {
if self.environments.contains_key(&id) {
for (env_id, env) in self.environments.iter_mut() {
env.active = *env_id == id;
}
Ok(())
} else {
Err(format!("Environment with ID {} not found", id))
}
}
pub fn get_stats(&self) -> WorkspaceStats {
let total_folders = self.workspaces.values().map(|w| w.folders.len()).sum::<usize>();
let total_requests = self.workspaces.values().map(|w| w.requests.len()).sum::<usize>();
let total_responses = self
.workspaces
.values()
.map(|w| w.requests.iter().map(|r| r.responses.len()).sum::<usize>())
.sum::<usize>();
WorkspaceStats {
total_workspaces: self.workspaces.len(),
total_folders,
total_requests,
total_responses,
total_environments: self.environments.len(),
last_modified: Utc::now(),
}
}
fn update_route_registry(&mut self) {
if let Ok(mut route_registry) = self.route_registry.write() {
route_registry.clear();
for workspace in self.workspaces.values() {
for request in &workspace.requests {
if request.enabled {
if let Some(_response) = request.active_response() {
if let Ok(route) =
self.request_processor.create_route_from_request(request)
{
let _ = route_registry.add_route(route);
}
}
}
}
self.add_folder_requests_to_registry(&mut route_registry, &workspace.folders);
}
}
}
fn add_folder_requests_to_registry(
&self,
route_registry: &mut RouteRegistry,
folders: &[Folder],
) {
for folder in folders {
for request in &folder.requests {
if request.enabled {
if let Some(_response) = request.active_response() {
if let Ok(route) = self.request_processor.create_route_from_request(request)
{
let _ = route_registry.add_route(route);
}
}
}
}
self.add_folder_requests_to_registry(route_registry, &folder.folders);
}
}
pub fn get_route_registry(&self) -> &Arc<RwLock<RouteRegistry>> {
&self.route_registry
}
pub fn get_config(&self) -> WorkspaceRegistryConfig {
self.config.clone()
}
pub fn find_request(&self, request_id: &EntityId) -> Option<&MockRequest> {
for workspace in self.workspaces.values() {
if let Some(request) = workspace.requests.iter().find(|r| &r.id == request_id) {
return Some(request);
}
if let Some(request) = self.find_request_in_folder(&workspace.folders, request_id) {
return Some(request);
}
}
None
}
#[allow(clippy::only_used_in_recursion)]
fn find_request_in_folder<'a>(
&self,
folders: &'a [Folder],
request_id: &EntityId,
) -> Option<&'a MockRequest> {
for folder in folders {
if let Some(request) = folder.requests.iter().find(|r| &r.id == request_id) {
return Some(request);
}
if let Some(request) = self.find_request_in_folder(&folder.folders, request_id) {
return Some(request);
}
}
None
}
pub fn find_folder(&self, folder_id: &EntityId) -> Option<&Folder> {
for workspace in self.workspaces.values() {
if let Some(folder) = self.find_folder_in_workspace(&workspace.folders, folder_id) {
return Some(folder);
}
}
None
}
#[allow(clippy::only_used_in_recursion)]
fn find_folder_in_workspace<'a>(
&self,
folders: &'a [Folder],
folder_id: &EntityId,
) -> Option<&'a Folder> {
for folder in folders {
if &folder.id == folder_id {
return Some(folder);
}
if let Some(found) = self.find_folder_in_workspace(&folder.folders, folder_id) {
return Some(found);
}
}
None
}
pub fn export_workspace(&self, workspace_id: &EntityId) -> Result<String, String> {
if let Some(workspace) = self.workspaces.get(workspace_id) {
serde_json::to_string_pretty(workspace)
.map_err(|e| format!("Failed to serialize workspace: {}", e))
} else {
Err(format!("Workspace with ID {} not found", workspace_id))
}
}
pub fn import_workspace(&mut self, json_data: &str) -> Result<EntityId, String> {
let workspace: Workspace = serde_json::from_str(json_data)
.map_err(|e| format!("Failed to deserialize workspace: {}", e))?;
self.add_workspace(workspace)
}
pub fn search_requests(&self, query: &str) -> Vec<&MockRequest> {
let query_lower = query.to_lowercase();
let mut results = Vec::new();
for workspace in self.workspaces.values() {
for request in &workspace.requests {
if request.name.to_lowercase().contains(&query_lower)
|| request.url.to_lowercase().contains(&query_lower)
|| request
.description
.as_ref()
.map(|d| d.to_lowercase())
.unwrap_or_default()
.contains(&query_lower)
{
results.push(request);
}
}
self.search_requests_in_folders(&workspace.folders, &query_lower, &mut results);
}
results
}
#[allow(clippy::only_used_in_recursion)]
fn search_requests_in_folders<'a>(
&self,
folders: &'a [Folder],
query: &str,
results: &mut Vec<&'a MockRequest>,
) {
for folder in folders {
for request in &folder.requests {
if request.name.to_lowercase().contains(query)
|| request.url.to_lowercase().contains(query)
|| request
.description
.as_ref()
.map(|d| d.to_lowercase())
.unwrap_or_default()
.contains(query)
{
results.push(request);
}
}
self.search_requests_in_folders(&folder.folders, query, results);
}
}
pub fn get_requests_by_tag(&self, tag: &str) -> Vec<&MockRequest> {
let mut results = Vec::new();
for workspace in self.workspaces.values() {
for request in &workspace.requests {
if request.tags.contains(&tag.to_string()) {
results.push(request);
}
}
self.get_requests_by_tag_in_folders(&workspace.folders, tag, &mut results);
}
results
}
#[allow(clippy::only_used_in_recursion)]
fn get_requests_by_tag_in_folders<'a>(
&self,
folders: &'a [Folder],
tag: &str,
results: &mut Vec<&'a MockRequest>,
) {
for folder in folders {
for request in &folder.requests {
if request.tags.contains(&tag.to_string()) {
results.push(request);
}
}
self.get_requests_by_tag_in_folders(&folder.folders, tag, results);
}
}
}
impl Default for WorkspaceRegistry {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::routing::HttpMethod;
#[test]
fn test_workspace_registry_new() {
let registry = WorkspaceRegistry::new();
assert!(registry.workspaces.is_empty());
assert!(registry.active_workspace_id.is_none());
assert!(registry.environments.is_empty());
assert_eq!(registry.get_config().default_workspace_name, "Default Workspace");
}
#[test]
fn test_workspace_registry_default() {
let registry = WorkspaceRegistry::default();
assert!(registry.workspaces.is_empty());
}
#[test]
fn test_workspace_registry_with_config() {
let config = WorkspaceRegistryConfig {
max_workspaces: Some(10),
default_workspace_name: "Test Workspace".to_string(),
auto_save_interval_seconds: 60,
};
let registry = WorkspaceRegistry::with_config(config);
let registry_config = registry.get_config();
assert_eq!(registry_config.max_workspaces, Some(10));
assert_eq!(registry_config.auto_save_interval_seconds, 60);
assert_eq!(registry.workspaces.len(), 1);
let all_workspaces = registry.get_all_workspaces();
assert_eq!(all_workspaces.len(), 1);
assert_eq!(all_workspaces[0].name, "Test Workspace");
}
#[test]
fn test_workspace_registry_config_default() {
let config = WorkspaceRegistryConfig::default();
assert_eq!(config.max_workspaces, None);
assert_eq!(config.default_workspace_name, "Default Workspace");
assert_eq!(config.auto_save_interval_seconds, 300);
}
#[test]
fn test_add_workspace() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test Workspace".to_string());
let id = workspace.id.clone();
let result = registry.add_workspace(workspace);
assert!(result.is_ok());
assert_eq!(result.unwrap(), id);
assert_eq!(registry.workspaces.len(), 1);
}
#[test]
fn test_add_workspace_max_limit() {
let mut registry = WorkspaceRegistry::with_config(WorkspaceRegistryConfig {
max_workspaces: Some(1),
default_workspace_name: "Workspace 1".to_string(),
auto_save_interval_seconds: 300,
});
let workspace1 = Workspace::new("Workspace 1".to_string());
let result = registry.add_workspace(workspace1);
assert!(result.is_err());
let workspace2 = Workspace::new("Workspace 2".to_string());
let result = registry.add_workspace(workspace2);
assert!(result.is_err());
}
#[test]
fn test_get_workspace() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test".to_string());
let id = workspace.id.clone();
registry.add_workspace(workspace).unwrap();
assert!(registry.get_workspace(&id).is_some());
assert_eq!(registry.get_workspace(&id).unwrap().name, "Test");
assert!(registry.get_workspace(&"nonexistent".to_string()).is_none());
}
#[test]
fn test_get_workspace_mut() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test".to_string());
let id = workspace.id.clone();
registry.add_workspace(workspace).unwrap();
if let Some(ws) = registry.get_workspace_mut(&id) {
ws.name = "Updated".to_string();
}
assert_eq!(registry.get_workspace(&id).unwrap().name, "Updated");
}
#[test]
fn test_remove_workspace() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test".to_string());
let id = workspace.id.clone();
registry.add_workspace(workspace).unwrap();
let removed = registry.remove_workspace(&id).unwrap();
assert_eq!(removed.name, "Test");
assert!(registry.get_workspace(&id).is_none());
}
#[test]
fn test_remove_workspace_active() {
let mut registry = WorkspaceRegistry::new();
let workspace1 = Workspace::new("Workspace 1".to_string());
let workspace2 = Workspace::new("Workspace 2".to_string());
let id1 = workspace1.id.clone();
let id2 = workspace2.id.clone();
registry.add_workspace(workspace1).unwrap();
registry.add_workspace(workspace2).unwrap();
registry.set_active_workspace(id1.clone()).unwrap();
registry.remove_workspace(&id1).unwrap();
assert_eq!(registry.active_workspace_id, Some(id2));
}
#[test]
fn test_remove_workspace_not_found() {
let mut registry = WorkspaceRegistry::new();
let result = registry.remove_workspace(&"nonexistent".to_string());
assert!(result.is_err());
assert!(result.unwrap_err().contains("not found"));
}
#[test]
fn test_get_all_workspaces() {
let mut registry = WorkspaceRegistry::new();
registry.add_workspace(Workspace::new("Workspace 1".to_string())).unwrap();
registry.add_workspace(Workspace::new("Workspace 2".to_string())).unwrap();
let all = registry.get_all_workspaces();
assert_eq!(all.len(), 2);
}
#[test]
fn test_get_all_workspaces_mut() {
let mut registry = WorkspaceRegistry::new();
registry.add_workspace(Workspace::new("Workspace 1".to_string())).unwrap();
let mut all = registry.get_all_workspaces_mut();
assert_eq!(all.len(), 1);
all[0].name = "Updated".to_string();
}
#[test]
fn test_set_active_workspace() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test".to_string());
let id = workspace.id.clone();
registry.add_workspace(workspace).unwrap();
registry.set_active_workspace(id.clone()).unwrap();
assert_eq!(registry.active_workspace_id, Some(id));
}
#[test]
fn test_set_active_workspace_not_found() {
let mut registry = WorkspaceRegistry::new();
let result = registry.set_active_workspace("nonexistent".to_string());
assert!(result.is_err());
assert!(result.unwrap_err().contains("not found"));
}
#[test]
fn test_get_active_workspace() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test".to_string());
let id = workspace.id.clone();
registry.add_workspace(workspace).unwrap();
registry.set_active_workspace(id).unwrap();
let active = registry.get_active_workspace();
assert!(active.is_some());
assert_eq!(active.unwrap().name, "Test");
}
#[test]
fn test_get_active_workspace_none() {
let registry = WorkspaceRegistry::new();
assert!(registry.get_active_workspace().is_none());
}
#[test]
fn test_get_active_workspace_mut() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test".to_string());
let id = workspace.id.clone();
registry.add_workspace(workspace).unwrap();
registry.set_active_workspace(id).unwrap();
if let Some(ws) = registry.get_active_workspace_mut() {
ws.name = "Updated".to_string();
}
assert_eq!(registry.get_active_workspace().unwrap().name, "Updated");
}
#[test]
fn test_add_environment() {
let mut registry = WorkspaceRegistry::new();
let env = Environment::new("Dev".to_string());
let id = env.id.clone();
let result_id = registry.add_environment(env);
assert_eq!(result_id, id);
assert_eq!(registry.environments.len(), 1);
}
#[test]
fn test_get_environment() {
let mut registry = WorkspaceRegistry::new();
let env = Environment::new("Dev".to_string());
let id = env.id.clone();
registry.add_environment(env);
assert!(registry.get_environment(&id).is_some());
assert_eq!(registry.get_environment(&id).unwrap().name, "Dev");
assert!(registry.get_environment(&"nonexistent".to_string()).is_none());
}
#[test]
fn test_get_active_environment() {
let mut registry = WorkspaceRegistry::new();
let mut env = Environment::new("Dev".to_string());
env.active = true;
registry.add_environment(env);
let active = registry.get_active_environment();
assert!(active.is_some());
assert_eq!(active.unwrap().name, "Dev");
}
#[test]
fn test_set_active_environment() {
let mut registry = WorkspaceRegistry::new();
let env1 = Environment::new("Dev".to_string());
let env2 = Environment::new("Prod".to_string());
let id1 = env1.id.clone();
let id2 = env2.id.clone();
registry.add_environment(env1);
registry.add_environment(env2);
registry.set_active_environment(id2.clone()).unwrap();
assert!(!registry.get_environment(&id1).unwrap().active);
assert!(registry.get_environment(&id2).unwrap().active);
}
#[test]
fn test_set_active_environment_not_found() {
let mut registry = WorkspaceRegistry::new();
let result = registry.set_active_environment("nonexistent".to_string());
assert!(result.is_err());
assert!(result.unwrap_err().contains("not found"));
}
#[test]
fn test_get_stats() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let folder = Folder::new("Folder".to_string());
let request = MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
let response =
crate::workspace::core::MockResponse::new(200, "OK".to_string(), "{}".to_string());
workspace.add_folder(folder);
workspace.add_request(request);
workspace.requests[0].add_response(response);
registry.add_workspace(workspace).unwrap();
registry.add_environment(Environment::new("Dev".to_string()));
let stats = registry.get_stats();
assert_eq!(stats.total_workspaces, 1);
assert_eq!(stats.total_folders, 1);
assert_eq!(stats.total_requests, 1);
assert_eq!(stats.total_responses, 1);
assert_eq!(stats.total_environments, 1);
}
#[test]
fn test_get_route_registry() {
let registry = WorkspaceRegistry::new();
let route_registry = registry.get_route_registry();
assert!(route_registry.read().is_ok());
}
#[test]
fn test_get_config() {
let registry = WorkspaceRegistry::new();
let config = registry.get_config();
assert_eq!(config.default_workspace_name, "Default Workspace");
assert_eq!(config.max_workspaces, None);
assert_eq!(config.auto_save_interval_seconds, 300);
}
#[test]
fn test_find_request() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let request = MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
let request_id = request.id.clone();
workspace.add_request(request);
registry.add_workspace(workspace).unwrap();
let found = registry.find_request(&request_id);
assert!(found.is_some());
assert_eq!(found.unwrap().name, "Request");
}
#[test]
fn test_find_request_in_folder() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let mut folder = Folder::new("Folder".to_string());
let request = MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
let request_id = request.id.clone();
folder.add_request(request);
workspace.add_folder(folder);
registry.add_workspace(workspace).unwrap();
let found = registry.find_request(&request_id);
assert!(found.is_some());
assert_eq!(found.unwrap().name, "Request");
}
#[test]
fn test_find_request_not_found() {
let registry = WorkspaceRegistry::new();
assert!(registry.find_request(&"nonexistent".to_string()).is_none());
}
#[test]
fn test_find_folder() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let folder = Folder::new("Folder".to_string());
let folder_id = folder.id.clone();
workspace.add_folder(folder);
registry.add_workspace(workspace).unwrap();
let found = registry.find_folder(&folder_id);
assert!(found.is_some());
assert_eq!(found.unwrap().name, "Folder");
}
#[test]
fn test_find_folder_nested() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let mut parent_folder = Folder::new("Parent".to_string());
let child_folder = Folder::new("Child".to_string());
let child_id = child_folder.id.clone();
parent_folder.add_folder(child_folder);
workspace.add_folder(parent_folder);
registry.add_workspace(workspace).unwrap();
let found = registry.find_folder(&child_id);
assert!(found.is_some());
assert_eq!(found.unwrap().name, "Child");
}
#[test]
fn test_find_folder_not_found() {
let registry = WorkspaceRegistry::new();
assert!(registry.find_folder(&"nonexistent".to_string()).is_none());
}
#[test]
fn test_export_workspace() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test".to_string());
let id = workspace.id.clone();
registry.add_workspace(workspace).unwrap();
let json = registry.export_workspace(&id).unwrap();
assert!(json.contains("Test"));
assert!(json.contains(&id));
}
#[test]
fn test_export_workspace_not_found() {
let registry = WorkspaceRegistry::new();
let result = registry.export_workspace(&"nonexistent".to_string());
assert!(result.is_err());
assert!(result.unwrap_err().contains("not found"));
}
#[test]
fn test_import_workspace() {
let mut registry = WorkspaceRegistry::new();
let workspace = Workspace::new("Test".to_string());
let json = serde_json::to_string(&workspace).unwrap();
let result = registry.import_workspace(&json);
assert!(result.is_ok());
assert_eq!(registry.workspaces.len(), 1);
}
#[test]
fn test_import_workspace_invalid_json() {
let mut registry = WorkspaceRegistry::new();
let result = registry.import_workspace("invalid json");
assert!(result.is_err());
}
#[test]
fn test_search_requests() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let request = MockRequest::new(
"Searchable Request".to_string(),
HttpMethod::GET,
"/test".to_string(),
);
workspace.add_request(request);
registry.add_workspace(workspace).unwrap();
let results = registry.search_requests("Searchable");
assert_eq!(results.len(), 1);
assert_eq!(results[0].name, "Searchable Request");
}
#[test]
fn test_search_requests_by_url() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let request =
MockRequest::new("Request".to_string(), HttpMethod::GET, "/api/users".to_string());
workspace.add_request(request);
registry.add_workspace(workspace).unwrap();
let results = registry.search_requests("users");
assert_eq!(results.len(), 1);
}
#[test]
fn test_search_requests_in_folders() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let mut folder = Folder::new("Folder".to_string());
let request =
MockRequest::new("Folder Request".to_string(), HttpMethod::GET, "/test".to_string());
folder.add_request(request);
workspace.add_folder(folder);
registry.add_workspace(workspace).unwrap();
let results = registry.search_requests("Folder");
assert_eq!(results.len(), 1);
}
#[test]
fn test_get_requests_by_tag() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let mut request =
MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
request.tags.push("api".to_string());
workspace.add_request(request);
registry.add_workspace(workspace).unwrap();
let results = registry.search_requests("Request");
assert_eq!(results.len(), 1);
}
#[test]
fn test_update_route_registry() {
let mut registry = WorkspaceRegistry::new();
let mut workspace = Workspace::new("Test".to_string());
let mut request =
MockRequest::new("Request".to_string(), HttpMethod::GET, "/test".to_string());
let response =
crate::workspace::core::MockResponse::new(200, "OK".to_string(), "{}".to_string());
request.add_response(response);
workspace.add_request(request);
registry.add_workspace(workspace).unwrap();
let route_registry = registry.get_route_registry();
let _routes = route_registry.read().unwrap();
}
}