Skip to content

Commit 0bc294c

Browse files
committed
refactor: update SaveConfig methods for improved file handling and serialization
1 parent 7ea1218 commit 0bc294c

File tree

5 files changed

+115
-100
lines changed

5 files changed

+115
-100
lines changed

src-tauri/src/fileflow/action/actions.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use crate::fileflow::stuct::config::insert_config::InsertConfig;
44
use crate::fileflow::stuct::config::save_config::SaveConfig;
55
use crate::fileflow::stuct::string_formater::StringFormatter;
66
use crate::fileflow::utils::constants::DATABASE_CONFIG_FILE;
7-
use crate::fileflow::utils::fileflowlib::{get_all_saved_configs, save_config};
87
use csv::{Reader, ReaderBuilder};
98
use std::fs::{File, Metadata};
109
use std::sync::Arc;
@@ -101,7 +100,7 @@ pub async fn insert_csv_data(
101100

102101
#[command]
103102
pub async fn save_database_config(save: SaveConfig) -> Result<bool, bool> {
104-
let mut existing_configs: Vec<SaveConfig> = get_all_saved_configs(DATABASE_CONFIG_FILE);
103+
let mut existing_configs: Vec<SaveConfig> = SaveConfig::get_all_configs(DATABASE_CONFIG_FILE);
105104

106105
for config in existing_configs.iter() {
107106
if config.config_name == save.config_name {
@@ -110,14 +109,14 @@ pub async fn save_database_config(save: SaveConfig) -> Result<bool, bool> {
110109
}
111110
existing_configs.push(save);
112111

113-
save_config(&existing_configs, DATABASE_CONFIG_FILE)
112+
SaveConfig::save_config(&existing_configs, DATABASE_CONFIG_FILE)
114113
.map(|_| true)
115114
.map_err(|_| false)
116115
}
117116

118117
#[command]
119118
pub async fn get_all_database_configs_name() -> Result<String, bool> {
120-
let configs: Vec<SaveConfig> = get_all_saved_configs(DATABASE_CONFIG_FILE); // Get all saved configs
119+
let configs: Vec<SaveConfig> = SaveConfig::get_all_configs(DATABASE_CONFIG_FILE); // Get all saved configs
121120
let configs_names: Vec<String> = configs.iter().map(|c| c.config_name.clone()).collect(); // Get only the names
122121
let configs_json: String = match serde_json::to_string(&configs_names) {
123122
Ok(json) => json, // Convert to json string
@@ -128,7 +127,7 @@ pub async fn get_all_database_configs_name() -> Result<String, bool> {
128127

129128
#[command]
130129
pub async fn load_database_config_by_name(name: String) -> Result<String, bool> {
131-
let configs: Vec<SaveConfig> = get_all_saved_configs(DATABASE_CONFIG_FILE); // Get all saved configs
130+
let configs: Vec<SaveConfig> = SaveConfig::get_all_configs(DATABASE_CONFIG_FILE); // Get all saved configs
132131
for config in configs.iter() {
133132
// Find the config with the given name
134133
if config.config_name == name {
@@ -143,7 +142,7 @@ pub async fn load_database_config_by_name(name: String) -> Result<String, bool>
143142

144143
#[command]
145144
pub async fn delete_database_config(name: String) -> Result<bool, bool> {
146-
let configs: Vec<SaveConfig> = get_all_saved_configs(DATABASE_CONFIG_FILE);
145+
let configs: Vec<SaveConfig> = SaveConfig::get_all_configs(DATABASE_CONFIG_FILE);
147146

148147
let mut new_configs: Vec<SaveConfig> = Vec::new();
149148
let mut found: bool = false;
@@ -160,7 +159,7 @@ pub async fn delete_database_config(name: String) -> Result<bool, bool> {
160159
return Err(false);
161160
}
162161

163-
save_config(&new_configs, DATABASE_CONFIG_FILE)
162+
SaveConfig::save_config(&new_configs, DATABASE_CONFIG_FILE)
164163
.map(|_| true)
165164
.map_err(|_| false)
166165
}
Lines changed: 103 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use crate::fileflow::enums::database_engine::DatabaseEngine;
22
use serde::{Deserialize, Serialize};
3+
use std::fs::{File, OpenOptions};
4+
use std::io;
5+
use std::path::PathBuf;
36

47
/// Struct for saving database configuration details
58
#[derive(Deserialize, Serialize, Clone)]
@@ -14,22 +17,59 @@ pub struct SaveConfig {
1417
pub sqlite_file_path: String,
1518
}
1619

20+
impl SaveConfig {
21+
/// This function is used to get the size of a file.
22+
pub fn get_all_configs(config_file: &str) -> Vec<SaveConfig> {
23+
let path: PathBuf = PathBuf::from(config_file);
24+
let file: File = match File::open(path) {
25+
Ok(file) => file,
26+
Err(_) => return Vec::new(),
27+
};
28+
29+
if file.metadata().unwrap().len() == 0 {
30+
return Vec::new();
31+
}
32+
33+
let configs: Vec<SaveConfig> = serde_json::from_reader(file).unwrap_or(Vec::new());
34+
configs
35+
}
36+
37+
/// This function is used to save a vector of SaveConfig to a json file.
38+
pub fn save_config(configs: &[SaveConfig], config_file: &str) -> io::Result<()> {
39+
let file: File = OpenOptions::new()
40+
.write(true)
41+
.create(true)
42+
.truncate(true)
43+
.open(config_file)
44+
.map_err(|e| format!("Failed to open file for writing: {e}"))
45+
.expect("Failed to open file for writing");
46+
serde_json::to_writer_pretty(file, &configs)
47+
.map_err(|e| format!("Failed to write to file: {e}"))
48+
.expect("Failed to write to file");
49+
Ok(())
50+
}
51+
}
52+
1753
#[cfg(test)]
1854
mod tests {
1955
use super::*;
2056

21-
#[tokio::test]
22-
async fn test_save_config() {
23-
let config = SaveConfig {
57+
fn get_test_config() -> SaveConfig {
58+
SaveConfig {
2459
config_name: "config_name".into(),
25-
db_driver: DatabaseEngine::Postgres,
60+
db_driver: DatabaseEngine::SQLite,
2661
db_host: String::from("db_host"),
2762
port: String::from("port"),
2863
username: String::from("username"),
2964
password: String::from("password"),
3065
db_name: String::from("db_name"),
3166
sqlite_file_path: "sqlite_file_path".into(),
32-
};
67+
}
68+
}
69+
70+
#[tokio::test]
71+
async fn test_save_config_struct() {
72+
let config = get_test_config();
3373

3474
assert_eq!(config.db_driver, DatabaseEngine::Postgres);
3575
assert_eq!(config.db_host, "db_host");
@@ -42,20 +82,11 @@ mod tests {
4282

4383
#[tokio::test]
4484
async fn test_save_config_serialization() {
45-
let config = SaveConfig {
46-
config_name: "config_name".into(),
47-
db_driver: DatabaseEngine::MySQL,
48-
db_host: String::from("db_host"),
49-
port: String::from("port"),
50-
username: String::from("username"),
51-
password: String::from("password"),
52-
db_name: String::from("db_name"),
53-
sqlite_file_path: "sqlite_file_path".into(),
54-
};
85+
let config = get_test_config();
5586

5687
let serialized = serde_json::to_string(&config).unwrap();
5788
let deserialized: SaveConfig = serde_json::from_str(&serialized).unwrap();
58-
89+
5990
assert_eq!(deserialized.db_driver, DatabaseEngine::MySQL);
6091
assert_eq!(deserialized.config_name, "config_name");
6192
assert_eq!(deserialized.db_host, "db_host");
@@ -65,4 +96,60 @@ mod tests {
6596
assert_eq!(deserialized.db_name, "db_name");
6697
assert_eq!(deserialized.sqlite_file_path, "sqlite_file_path");
6798
}
99+
100+
#[tokio::test]
101+
async fn test_get_all_saved_configs_empty() {
102+
let configs = SaveConfig::get_all_configs("non_existent_file.json");
103+
assert!(configs.is_empty());
104+
}
105+
106+
#[tokio::test]
107+
async fn test_get_all_saved_configs() {
108+
let config = get_test_config();
109+
let configs = vec![config.clone()];
110+
let config_file = "test_configs.json";
111+
112+
// Save the config
113+
SaveConfig::save_config(&configs, config_file).unwrap();
114+
115+
// Retrieve the config
116+
let loaded_configs = SaveConfig::get_all_configs(config_file);
117+
assert_eq!(loaded_configs.len(), 1);
118+
assert_eq!(loaded_configs[0].config_name, "config_name");
119+
assert_eq!(loaded_configs[0].db_driver, DatabaseEngine::SQLite);
120+
assert_eq!(loaded_configs[0].db_host, "db_host");
121+
assert_eq!(loaded_configs[0].port, "port");
122+
assert_eq!(loaded_configs[0].username, "username");
123+
assert_eq!(loaded_configs[0].password, "password");
124+
assert_eq!(loaded_configs[0].db_name, "db_name");
125+
assert_eq!(loaded_configs[0].sqlite_file_path, "sqlite_file_path");
126+
127+
// Clean up
128+
std::fs::remove_file(config_file).unwrap();
129+
}
130+
131+
#[tokio::test]
132+
async fn test_save_config() {
133+
let config = get_test_config();
134+
let configs = vec![config.clone()];
135+
let config_file = "test_save_configs.json";
136+
137+
// Save the config
138+
SaveConfig::save_config(&configs, config_file).unwrap();
139+
140+
// Retrieve the config
141+
let loaded_configs = SaveConfig::get_all_configs(config_file);
142+
assert_eq!(loaded_configs.len(), 1);
143+
assert_eq!(loaded_configs[0].config_name, "config_name");
144+
assert_eq!(loaded_configs[0].db_driver, DatabaseEngine::SQLite);
145+
assert_eq!(loaded_configs[0].db_host, "db_host");
146+
assert_eq!(loaded_configs[0].port, "port");
147+
assert_eq!(loaded_configs[0].username, "username");
148+
assert_eq!(loaded_configs[0].password, "password");
149+
assert_eq!(loaded_configs[0].db_name, "db_name");
150+
assert_eq!(loaded_configs[0].sqlite_file_path, "sqlite_file_path");
151+
152+
// Clean up
153+
std::fs::remove_file(config_file).unwrap();
154+
}
68155
}

src-tauri/src/fileflow/utils/fileflowlib.rs

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
pub mod constants;
2-
pub mod fileflowlib;
1+
pub mod constants;

src-tauri/src/tests/action_test.rs

Lines changed: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
1-
use fileflow::fileflow::enums::database_engine::DatabaseEngine;
2-
use fileflow::fileflow::stuct::config::db_config::DatabaseConfig;
3-
use fileflow::fileflow::stuct::config::save_config::SaveConfig;
4-
use fileflow::fileflow::utils::fileflowlib::{get_all_saved_configs, save_config};
51
use crate::tests::utils_tests::{
6-
create_test_db, delete_config_file, generate_csv_file, get_test_save_config,
2+
create_test_db, generate_csv_file,
73
get_test_sqlite_config, remove_csv_file, remove_test_db,
84
};
95
use csv::{Reader, ReaderBuilder};
6+
use fileflow::fileflow::action::database_command::fast_insert;
7+
use fileflow::fileflow::enums::database_engine::DatabaseEngine;
8+
use fileflow::fileflow::stuct::config::db_config::DatabaseConfig;
9+
use fileflow::fileflow::stuct::database::database_connection::DatabaseConnection;
1010
use sqlx::sqlite::SqliteRow;
1111
use sqlx::{Error, Pool, Row, Sqlite};
1212
use std::fs::File;
13-
use fileflow::fileflow::action::database_command::fast_insert;
14-
use fileflow::fileflow::stuct::database::database_connection::DatabaseConnection;
1513

1614
#[tokio::test]
1715
async fn test_fast_insert() {
@@ -82,34 +80,3 @@ async fn test_fast_insert() {
8280
remove_test_db("fast_insert").expect("Failed to remove test table");
8381
remove_csv_file("test_fast_insert").expect("Failed to remove CSV file");
8482
}
85-
86-
#[tokio::test]
87-
async fn test_configs_serealization_deserialization() {
88-
const CONFIG_NAME: &str = "test_get_all_configs.json";
89-
90-
let config1: SaveConfig = get_test_save_config("config1");
91-
let config2: SaveConfig = get_test_save_config("config2");
92-
let config3: SaveConfig = get_test_save_config("config3");
93-
let configs_list: Vec<SaveConfig> = vec![config1, config2, config3];
94-
95-
save_config(&configs_list, CONFIG_NAME).expect("Failed to save configs");
96-
97-
let deserialized_configs: Vec<SaveConfig> = get_all_saved_configs("test_get_all_configs.json");
98-
99-
assert_eq!(3, deserialized_configs.len());
100-
101-
assert_eq!(
102-
configs_list[0].config_name,
103-
deserialized_configs[0].config_name
104-
);
105-
assert_eq!(
106-
configs_list[1].config_name,
107-
deserialized_configs[1].config_name
108-
);
109-
assert_eq!(
110-
configs_list[2].config_name,
111-
deserialized_configs[2].config_name
112-
);
113-
114-
delete_config_file(CONFIG_NAME).expect("Failed to delete config file");
115-
}

0 commit comments

Comments
 (0)