Skip to content

Commit ca1dd42

Browse files
author
Mohammod Al Amin Ashik
committed
updates tests
1 parent 31e3266 commit ca1dd42

135 files changed

Lines changed: 6830 additions & 4290 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/desktop/src-tauri/build.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ fn main() {
1212
}
1313
}
1414
}
15-
15+
1616
// Tell Cargo to re-run this script if tauri.conf.json changes
1717
println!("cargo:rerun-if-changed=tauri.conf.json");
18-
18+
1919
tauri_build::build()
2020
}

apps/desktop/src-tauri/src/commands/client.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use tauri::State;
1010
use tokio::sync::RwLock;
1111
use uuid::Uuid;
1212

13-
use crate::state::AppState;
1413
use crate::commands::gateway::GatewayAppState;
14+
use crate::state::AppState;
1515

1616
/// Response for client listing
1717
#[derive(Debug, Serialize)]
@@ -28,7 +28,9 @@ pub struct ClientResponse {
2828
impl From<Client> for ClientResponse {
2929
fn from(c: Client) -> Self {
3030
let (mode, locked_id) = match &c.connection_mode {
31-
ConnectionMode::Locked { space_id } => ("locked".to_string(), Some(space_id.to_string())),
31+
ConnectionMode::Locked { space_id } => {
32+
("locked".to_string(), Some(space_id.to_string()))
33+
}
3234
ConnectionMode::FollowActive => ("follow_active".to_string(), None),
3335
ConnectionMode::AskOnChange { .. } => ("ask_on_change".to_string(), None),
3436
};
Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
//! Commands for managing client-specific custom feature sets
22
3-
use tauri::State;
43
use crate::state::AppState;
54
use mcpmux_core::{FeatureSet, FeatureSetType};
5+
use tauri::State;
66

77
/// Find or create a custom feature set for a specific client in a space
88
/// This ensures only one custom feature set exists per client per space
@@ -13,20 +13,20 @@ pub async fn find_or_create_client_custom_feature_set(
1313
space_id: String,
1414
) -> Result<FeatureSet, String> {
1515
let custom_set_name = format!("{} - Custom", client_name);
16-
16+
1717
// First, try to find existing custom feature set
1818
let existing_sets = state
1919
.feature_set_repository
2020
.list_by_space(&space_id)
2121
.await
2222
.map_err(|e| format!("Failed to list feature sets: {}", e))?;
23-
23+
2424
// Look for existing custom feature set with this name
25-
if let Some(existing) = existing_sets.iter().find(|fs|
26-
fs.name == custom_set_name &&
27-
fs.feature_set_type == FeatureSetType::Custom &&
28-
!fs.is_deleted
29-
) {
25+
if let Some(existing) = existing_sets.iter().find(|fs| {
26+
fs.name == custom_set_name
27+
&& fs.feature_set_type == FeatureSetType::Custom
28+
&& !fs.is_deleted
29+
}) {
3030
// Load members
3131
return state
3232
.feature_set_repository
@@ -35,18 +35,17 @@ pub async fn find_or_create_client_custom_feature_set(
3535
.map_err(|e| format!("Failed to load feature set: {}", e))?
3636
.ok_or_else(|| "Feature set not found".to_string());
3737
}
38-
38+
3939
// No existing set found, create a new one
4040
let new_set = FeatureSet::new_custom(&custom_set_name, &space_id)
4141
.with_description(format!("Custom features for {}", client_name))
4242
.with_icon("⚙️");
43-
43+
4444
state
4545
.feature_set_repository
4646
.create(&new_set)
4747
.await
4848
.map_err(|e| format!("Failed to create custom feature set: {}", e))?;
49-
49+
5050
Ok(new_set)
5151
}
52-

apps/desktop/src-tauri/src/commands/config_export.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
//!
33
//! IPC commands for generating MCP configuration files for clients.
44
5-
use mcpmux_core::{ConfigExporter, ConfigFormat, ResolvedTransport, ResolvedServer, TransportConfig};
5+
use mcpmux_core::{
6+
ConfigExporter, ConfigFormat, ResolvedServer, ResolvedTransport, TransportConfig,
7+
};
68
use serde::{Deserialize, Serialize};
79
use std::collections::HashMap;
810
use std::path::PathBuf;
@@ -78,27 +80,29 @@ async fn build_resolved_servers(
7880
if let Some(entry) = inst.get_definition() {
7981
// Build resolved transport from registry transport + input values
8082
let transport = match &entry.transport {
81-
TransportConfig::Stdio { command, args, env, .. } => {
83+
TransportConfig::Stdio {
84+
command, args, env, ..
85+
} => {
8286
// Resolve placeholders in command
8387
let resolved_command = resolve_placeholders(command, &inst.input_values);
84-
88+
8589
// Resolve placeholders in args
8690
let mut resolved_args: Vec<String> = args
8791
.iter()
8892
.map(|arg| resolve_placeholders(arg, &inst.input_values))
8993
.collect();
90-
94+
9195
// Append user's extra args
9296
resolved_args.extend(inst.args_append.clone());
9397

9498
// Build env from registry + input values + env_overrides
9599
let mut resolved_env = HashMap::new();
96-
100+
97101
// 1. Start with registry env
98102
for (k, v) in env {
99103
resolved_env.insert(k.clone(), resolve_placeholders(v, &inst.input_values));
100104
}
101-
105+
102106
// 2. Add input values (for api_key type servers)
103107
if !mask_credentials {
104108
resolved_env.extend(inst.input_values.clone());
@@ -107,7 +111,7 @@ async fn build_resolved_servers(
107111
resolved_env.insert(k.clone(), "***MASKED***".to_string());
108112
}
109113
}
110-
114+
111115
// 3. Apply user's env overrides
112116
resolved_env.extend(inst.env_overrides.clone());
113117

@@ -119,16 +123,16 @@ async fn build_resolved_servers(
119123
}
120124
TransportConfig::Http { url, headers, .. } => {
121125
let resolved_url = resolve_placeholders(url, &inst.input_values);
122-
126+
123127
// Resolve headers from registry
124128
let mut resolved_headers: HashMap<String, String> = headers
125129
.iter()
126130
.map(|(k, v)| (k.clone(), resolve_placeholders(v, &inst.input_values)))
127131
.collect();
128-
132+
129133
// Add user's extra headers
130134
resolved_headers.extend(inst.extra_headers.clone());
131-
135+
132136
ResolvedTransport::Http {
133137
url: resolved_url,
134138
headers: resolved_headers,

apps/desktop/src-tauri/src/commands/feature_members.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use tauri::State;
88
use tokio::sync::RwLock;
99
use uuid::Uuid as StdUuid;
1010

11-
use crate::state::AppState;
1211
use crate::commands::gateway::GatewayAppState;
12+
use crate::state::AppState;
1313

1414
/// Add an individual feature (tool/prompt/resource) to a feature set
1515
#[tauri::command]
@@ -21,7 +21,7 @@ pub async fn add_feature_to_set(
2121
mode: String,
2222
) -> Result<(), String> {
2323
let app_state = &*state;
24-
24+
2525
let mode = match mode.as_str() {
2626
"include" => MemberMode::Include,
2727
"exclude" => MemberMode::Exclude,
@@ -33,12 +33,12 @@ pub async fn add_feature_to_set(
3333
.add_feature_member(&feature_set_id, &feature_id, mode)
3434
.await
3535
.map_err(|e| format!("Failed to add feature to set: {}", e))?;
36-
36+
3737
// Emit domain event if gateway is running
3838
let gw_state = gateway_state.read().await;
3939
if let Some(ref gw) = gw_state.gateway_state {
4040
let gw = gw.read().await;
41-
41+
4242
// Get feature set to access space_id
4343
if let Ok(Some(fs)) = app_state.feature_set_repository.get(&feature_set_id).await {
4444
if let Some(space_id_str) = fs.space_id {
@@ -72,12 +72,12 @@ pub async fn remove_feature_from_set(
7272
.remove_feature_member(&feature_set_id, &feature_id)
7373
.await
7474
.map_err(|e| format!("Failed to remove feature from set: {}", e))?;
75-
75+
7676
// Emit domain event if gateway is running
7777
let gw_state = gateway_state.read().await;
7878
if let Some(ref gw) = gw_state.gateway_state {
7979
let gw = gw.read().await;
80-
80+
8181
// Get feature set to access space_id
8282
if let Ok(Some(fs)) = app_state.feature_set_repository.get(&feature_set_id).await {
8383
if let Some(space_id_str) = fs.space_id {
@@ -112,4 +112,3 @@ pub async fn get_feature_set_members(
112112

113113
Ok(members)
114114
}
115-

apps/desktop/src-tauri/src/commands/feature_set.rs

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@
22
//!
33
//! IPC commands for managing feature sets (permission bundles).
44
5+
use chrono::Utc;
56
use mcpmux_core::{FeatureSet, FeatureSetMember, MemberMode, MemberType};
67
use serde::{Deserialize, Serialize};
7-
use tauri::State;
8-
use chrono::Utc;
98
use std::sync::Arc;
9+
use tauri::State;
1010
use tokio::sync::RwLock;
1111
use tracing::warn;
1212
use uuid::Uuid as StdUuid;
1313

14-
use crate::state::AppState;
1514
use crate::commands::gateway::GatewayAppState;
15+
use crate::state::AppState;
1616

1717
/// Response for feature set member
1818
#[derive(Debug, Serialize)]
@@ -89,9 +89,9 @@ pub struct UpdateFeatureSetInput {
8989
/// Input for adding a member to a feature set
9090
#[derive(Debug, Deserialize)]
9191
pub struct AddMemberInput {
92-
pub member_type: String, // "feature" or "feature_set"
92+
pub member_type: String, // "feature" or "feature_set"
9393
pub member_id: String,
94-
pub mode: Option<String>, // "include" or "exclude", defaults to "include"
94+
pub mode: Option<String>, // "include" or "exclude", defaults to "include"
9595
}
9696

9797
/// List all feature sets.
@@ -127,7 +127,7 @@ pub async fn list_feature_sets_by_space(
127127
.list_for_space(&space_id)
128128
.await
129129
.map_err(|e: anyhow::Error| e.to_string())?;
130-
130+
131131
let enabled_server_ids: std::collections::HashSet<String> = installed_servers
132132
.into_iter()
133133
.filter(|s| s.enabled)
@@ -140,7 +140,9 @@ pub async fn list_feature_sets_by_space(
140140
.filter(|fs| {
141141
if fs.feature_set_type == mcpmux_core::FeatureSetType::ServerAll {
142142
// Only include if server is enabled
143-
fs.server_id.as_ref().is_some_and(|sid| enabled_server_ids.contains(sid))
143+
fs.server_id
144+
.as_ref()
145+
.is_some_and(|sid| enabled_server_ids.contains(sid))
144146
} else {
145147
true
146148
}
@@ -189,11 +191,11 @@ pub async fn create_feature_set(
189191
gateway_state: State<'_, Arc<RwLock<GatewayAppState>>>,
190192
) -> Result<FeatureSetResponse, String> {
191193
let mut feature_set = FeatureSet::new_custom(&input.name, &input.space_id);
192-
194+
193195
if let Some(desc) = input.description {
194196
feature_set = feature_set.with_description(desc);
195197
}
196-
198+
197199
if let Some(icon) = input.icon {
198200
feature_set = feature_set.with_icon(icon);
199201
}
@@ -203,12 +205,12 @@ pub async fn create_feature_set(
203205
.create(&feature_set)
204206
.await
205207
.map_err(|e| e.to_string())?;
206-
208+
207209
// Emit domain event if gateway is running
208210
let gw_state = gateway_state.read().await;
209211
if let Some(ref gw) = gw_state.gateway_state {
210212
let gw = gw.read().await;
211-
213+
212214
// Parse space_id as Uuid
213215
if let Ok(space_uuid) = StdUuid::parse_str(&input.space_id) {
214216
gw.emit_domain_event(mcpmux_core::DomainEvent::FeatureSetCreated {
@@ -236,18 +238,18 @@ pub async fn delete_feature_set(
236238
.get(&id)
237239
.await
238240
.map_err(|e| e.to_string())?;
239-
241+
240242
state
241243
.feature_set_repository
242244
.delete(&id)
243245
.await
244246
.map_err(|e| e.to_string())?;
245-
247+
246248
// Emit domain event if gateway is running
247249
let gw_state = gateway_state.read().await;
248250
if let Some(ref gw) = gw_state.gateway_state {
249251
let gw = gw.read().await;
250-
252+
251253
// Only emit if we found the feature set and it has a space_id
252254
if let Some(fs) = feature_set {
253255
if let Some(space_id_str) = fs.space_id {
@@ -260,7 +262,7 @@ pub async fn delete_feature_set(
260262
}
261263
}
262264
}
263-
265+
264266
Ok(())
265267
}
266268

@@ -336,7 +338,10 @@ pub async fn update_feature_set(
336338
let space_id = feature_set.space_id.as_deref().unwrap_or("default");
337339
let gw_state = gateway_state.read().await;
338340
if let Some(ref grant_service) = gw_state.grant_service {
339-
if let Err(e) = grant_service.notify_feature_set_modified(space_id, &id).await {
341+
if let Err(e) = grant_service
342+
.notify_feature_set_modified(space_id, &id)
343+
.await
344+
{
340345
warn!("[FeatureSet] Failed to emit notifications: {}", e);
341346
}
342347
}
@@ -380,9 +385,11 @@ pub async fn add_feature_set_member(
380385
.unwrap_or(MemberMode::Include);
381386

382387
// Check for duplicates
383-
if feature_set.members.iter().any(|m| {
384-
m.member_type == member_type && m.member_id == input.member_id
385-
}) {
388+
if feature_set
389+
.members
390+
.iter()
391+
.any(|m| m.member_type == member_type && m.member_id == input.member_id)
392+
{
386393
return Err("Member already exists in this feature set".to_string());
387394
}
388395

@@ -425,7 +432,10 @@ pub async fn add_feature_set_member(
425432
let space_id = feature_set.space_id.as_deref().unwrap_or("default");
426433
let gw_state = gateway_state.read().await;
427434
if let Some(ref grant_service) = gw_state.grant_service {
428-
if let Err(e) = grant_service.notify_feature_set_modified(space_id, &feature_set_id).await {
435+
if let Err(e) = grant_service
436+
.notify_feature_set_modified(space_id, &feature_set_id)
437+
.await
438+
{
429439
warn!("[FeatureSet] Failed to emit notifications: {}", e);
430440
}
431441
}
@@ -465,7 +475,10 @@ pub async fn remove_feature_set_member(
465475
let space_id = feature_set.space_id.as_deref().unwrap_or("default");
466476
let gw_state = gateway_state.read().await;
467477
if let Some(ref grant_service) = gw_state.grant_service {
468-
if let Err(e) = grant_service.notify_feature_set_modified(space_id, &feature_set_id).await {
478+
if let Err(e) = grant_service
479+
.notify_feature_set_modified(space_id, &feature_set_id)
480+
.await
481+
{
469482
warn!("[FeatureSet] Failed to emit notifications: {}", e);
470483
}
471484
}
@@ -544,7 +557,10 @@ pub async fn set_feature_set_members(
544557
let space_id = feature_set.space_id.as_deref().unwrap_or("default");
545558
let gw_state = gateway_state.read().await;
546559
if let Some(ref grant_service) = gw_state.grant_service {
547-
if let Err(e) = grant_service.notify_feature_set_modified(space_id, &feature_set_id).await {
560+
if let Err(e) = grant_service
561+
.notify_feature_set_modified(space_id, &feature_set_id)
562+
.await
563+
{
548564
warn!("[FeatureSet] Failed to emit notifications: {}", e);
549565
}
550566
}

0 commit comments

Comments
 (0)