Skip to content

Commit 12391ad

Browse files
rbrannegasora
authored andcommitted
add tests for rust project implementation
1 parent 061edb2 commit 12391ad

File tree

1 file changed

+350
-0
lines changed

1 file changed

+350
-0
lines changed

rust/src/project.rs

Lines changed: 350 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,3 +1116,353 @@ unsafe extern "C" fn cb_progress_func_nop(
11161116
) -> bool {
11171117
true
11181118
}
1119+
1120+
#[cfg(test)]
1121+
mod test {
1122+
use std::time::SystemTime;
1123+
1124+
use crate::metadata::Metadata;
1125+
use crate::rc::Ref;
1126+
1127+
use super::Project;
1128+
1129+
fn unique_project() -> (String, String) {
1130+
let unique_id = std::time::SystemTime::now()
1131+
.duration_since(std::time::UNIX_EPOCH)
1132+
.unwrap()
1133+
.as_millis();
1134+
let tmp_dir = std::env::temp_dir();
1135+
let project_path = format!("{}/tmp_project_{unique_id}", tmp_dir.to_str().unwrap());
1136+
let project_name = format!("create_delete_empty_project_{unique_id}");
1137+
(project_path, project_name)
1138+
}
1139+
1140+
#[test]
1141+
fn create_delete_empty() {
1142+
crate::headless::init();
1143+
1144+
let (project_path, project_name) = unique_project();
1145+
// create the project
1146+
let project = Project::create(&project_path, &project_name);
1147+
project.open().unwrap();
1148+
assert!(project.is_open());
1149+
1150+
// check project data
1151+
let project_path_received = project.path();
1152+
assert_eq!(&project_path, project_path_received.as_str());
1153+
let project_name_received = project.name();
1154+
assert_eq!(&project_name, project_name_received.as_str());
1155+
1156+
// close the project
1157+
project.close().unwrap();
1158+
assert!(!project.is_open());
1159+
drop(project);
1160+
1161+
// delete the project
1162+
std::fs::remove_dir_all(project_path).unwrap();
1163+
1164+
crate::headless::shutdown();
1165+
}
1166+
1167+
#[test]
1168+
fn create_close_open_close() {
1169+
crate::headless::init();
1170+
1171+
let (project_path, project_name) = unique_project();
1172+
// create the project
1173+
let project = Project::create(&project_path, &project_name);
1174+
project.open().unwrap();
1175+
1176+
// get the project id
1177+
let id = project.id();
1178+
1179+
// close the project
1180+
project.close().unwrap();
1181+
drop(project);
1182+
1183+
let project = Project::open_project(&project_path);
1184+
// assert same id
1185+
let new_id = project.id();
1186+
assert_eq!(id, new_id);
1187+
1188+
// close the project
1189+
project.close().unwrap();
1190+
drop(project);
1191+
1192+
// delete the project
1193+
std::fs::remove_dir_all(project_path).unwrap();
1194+
1195+
crate::headless::shutdown();
1196+
}
1197+
1198+
#[test]
1199+
fn modify_project() {
1200+
crate::headless::init();
1201+
1202+
let (project_path, project_name) = unique_project();
1203+
// create the project
1204+
let project = Project::create(&project_path, project_name);
1205+
project.open().unwrap();
1206+
1207+
// get project id
1208+
let id = project.id();
1209+
1210+
// create data and verify that data was created
1211+
let data_1: Ref<Metadata> = "data1".into();
1212+
let data_2: Ref<Metadata> = "data2".into();
1213+
assert!(project.store_metadata("key", data_1.as_ref()));
1214+
assert_eq!(
1215+
data_1.get_string().unwrap(),
1216+
project.query_metadata("key").get_string().unwrap()
1217+
);
1218+
project.remove_metadata("key");
1219+
assert!(project.store_metadata("key", data_2.as_ref()));
1220+
assert_eq!(
1221+
data_2.get_string().unwrap(),
1222+
project.query_metadata("key").get_string().unwrap()
1223+
);
1224+
1225+
// create file that will be imported to the project
1226+
let tmp_folder_1_name = format!(
1227+
"tmp_folder_{}",
1228+
std::time::SystemTime::now()
1229+
.duration_since(std::time::UNIX_EPOCH)
1230+
.unwrap()
1231+
.as_millis()
1232+
);
1233+
let tmp_folder_2_name = format!("{tmp_folder_1_name }_2");
1234+
let tmp_folder_1 = format!(
1235+
"{}/{tmp_folder_1_name}",
1236+
std::env::temp_dir().to_str().unwrap()
1237+
);
1238+
let tmp_folder_2 = format!(
1239+
"{}/{tmp_folder_2_name}",
1240+
std::env::temp_dir().to_str().unwrap()
1241+
);
1242+
std::fs::create_dir(&tmp_folder_1).unwrap();
1243+
std::fs::create_dir(&tmp_folder_2).unwrap();
1244+
let input_file_1 = format!("{tmp_folder_2}/input_1");
1245+
let input_file_2 = format!("{tmp_folder_2}/input_2");
1246+
let input_file_1_data = b"input_1_data";
1247+
let input_file_2_data = b"input_1_data";
1248+
std::fs::write(&input_file_1, input_file_1_data).unwrap();
1249+
std::fs::write(&input_file_2, input_file_2_data).unwrap();
1250+
1251+
// create and delete folders
1252+
let folder_1_desc = "desc_folder_1";
1253+
let folder_1 = project
1254+
.create_folder(None, "folder_1", folder_1_desc)
1255+
.unwrap();
1256+
let folder_2_desc = "AAAAA";
1257+
let folder_2_id = "1717416787371";
1258+
let folder_2 = unsafe {
1259+
project
1260+
.create_folder_unsafe(Some(&folder_1), "folder_2", folder_2_desc, folder_2_id)
1261+
.unwrap()
1262+
};
1263+
let folder_3_desc = ""; // TODO "çàáÁÀ";
1264+
let folder_3 = project
1265+
.create_folder_from_path(&tmp_folder_1, None, folder_3_desc)
1266+
.unwrap();
1267+
let folder_4_desc = "";
1268+
let _folder_4 = project
1269+
.create_folder_from_path_with_progress(
1270+
&tmp_folder_2,
1271+
Some(&folder_3),
1272+
folder_4_desc,
1273+
|_, _| true,
1274+
)
1275+
.unwrap();
1276+
let folder_5 = project
1277+
.create_folder(None, "deleted_folder", folder_4_desc)
1278+
.unwrap();
1279+
1280+
assert_eq!(project.folders().unwrap().len(), 5);
1281+
let last_folder = project.folder_by_id(folder_5.id()).unwrap();
1282+
project.delete_folder(&last_folder).unwrap();
1283+
assert_eq!(project.folders().unwrap().len(), 4);
1284+
drop(folder_5);
1285+
1286+
// create, import and delete file
1287+
let file_1_data = b"data_1";
1288+
let file_1_desc = "desc_file_1";
1289+
let _file_1 = project
1290+
.create_file(file_1_data, None, "file_1", file_1_desc)
1291+
.unwrap();
1292+
let file_2_data = b"data_2";
1293+
let file_2_desc = "my desc";
1294+
let file_2_id = "12334545";
1295+
let _file_2 = unsafe {
1296+
project.create_file_unsafe(
1297+
file_2_data,
1298+
Some(&folder_2),
1299+
"file_2",
1300+
file_2_desc,
1301+
file_2_id,
1302+
SystemTime::UNIX_EPOCH,
1303+
)
1304+
}
1305+
.unwrap();
1306+
let file_3_data = b"data\x023";
1307+
let file_3_desc = "!";
1308+
let _file_3 = project
1309+
.create_file_with_progress(
1310+
file_3_data,
1311+
Some(&folder_1),
1312+
"file_3",
1313+
file_3_desc,
1314+
|_, _| true,
1315+
)
1316+
.unwrap();
1317+
let file_4_time = SystemTime::now();
1318+
let file_4_data = b"data_4\x00_4";
1319+
let file_4_desc = "";
1320+
let file_4_id = "123123123";
1321+
let _file_4 = unsafe {
1322+
project.create_file_with_progress_unsafe(
1323+
file_4_data,
1324+
Some(&folder_3),
1325+
"file_4",
1326+
file_4_desc,
1327+
file_4_id,
1328+
file_4_time,
1329+
|_, _| true,
1330+
)
1331+
}
1332+
.unwrap();
1333+
let file_5_desc = "desc";
1334+
let _file_5 = project
1335+
.create_file_from_path(&input_file_1, None, "file_5", file_5_desc)
1336+
.unwrap();
1337+
let file_6_time = SystemTime::now();
1338+
let file_6_desc = "de";
1339+
let file_6_id = "90218347";
1340+
let _file_6 = unsafe {
1341+
project.create_file_from_path_unsafe(
1342+
&input_file_2,
1343+
Some(&folder_3),
1344+
"file_6",
1345+
file_6_desc,
1346+
file_6_id,
1347+
file_6_time,
1348+
)
1349+
}
1350+
.unwrap();
1351+
let file_7 = project
1352+
.create_file_from_path_with_progress(
1353+
&input_file_2,
1354+
Some(&folder_2),
1355+
"file_7",
1356+
"no",
1357+
|_, _| true,
1358+
)
1359+
.unwrap();
1360+
let file_8 = unsafe {
1361+
project.create_file_from_path_with_progress_unsafe(
1362+
&input_file_1,
1363+
None,
1364+
"file_7",
1365+
"no",
1366+
"92736528",
1367+
SystemTime::now(),
1368+
|_, _| true,
1369+
)
1370+
}
1371+
.unwrap();
1372+
1373+
assert_eq!(project.files().unwrap().len(), 10);
1374+
let file_a = project.file_by_id(file_8.id()).unwrap();
1375+
let file_b = project.file_by_path(file_7.path_on_disk()).unwrap();
1376+
project.delete_file(&file_a);
1377+
project.delete_file(&file_b);
1378+
assert_eq!(project.files().unwrap().len(), 8);
1379+
drop(file_8);
1380+
drop(file_7);
1381+
1382+
project.set_name("project_name");
1383+
project.set_description("project_description");
1384+
1385+
// close the project
1386+
project.close().unwrap();
1387+
drop(project);
1388+
drop(folder_1);
1389+
drop(folder_2);
1390+
drop(folder_3);
1391+
1392+
// reopen the project and verify the information store on it
1393+
let project = Project::open_project(&project_path);
1394+
1395+
// assert same id
1396+
assert_eq!(id, project.id());
1397+
1398+
// verify metadata
1399+
assert_eq!(
1400+
data_2.get_string().unwrap(),
1401+
project.query_metadata("key").get_string().unwrap()
1402+
);
1403+
1404+
// check folders
1405+
let folders = [
1406+
("folder_1", None, folder_1_desc),
1407+
("folder_2", Some(folder_2_id), folder_2_desc),
1408+
(&tmp_folder_1_name, None, folder_3_desc),
1409+
(&tmp_folder_2_name, None, folder_4_desc),
1410+
];
1411+
for folder in project.folders().unwrap().iter() {
1412+
let found = folders
1413+
.iter()
1414+
.find(|f| folder.name().as_str() == f.0)
1415+
.unwrap();
1416+
if let Some(id) = found.1 {
1417+
assert_eq!(folder.id().as_str(), id);
1418+
}
1419+
assert_eq!(folder.description().as_str(), found.2);
1420+
}
1421+
1422+
// check files
1423+
#[rustfmt::skip]
1424+
let files = [
1425+
("file_1", &file_1_data[..], file_1_desc, None, None),
1426+
("file_2", &file_2_data[..], file_2_desc, Some(file_2_id), None),
1427+
("file_3", &file_3_data[..], file_3_desc, None, None),
1428+
("file_4", &file_4_data[..], file_4_desc, Some(file_4_id), Some(file_4_time)),
1429+
("file_5", &input_file_1_data[..], file_5_desc, None, None),
1430+
("file_6", &input_file_2_data[..], file_6_desc, Some(file_6_id), Some(file_6_time)),
1431+
("input_1", &input_file_1_data[..], "", None, None),
1432+
("input_2", &input_file_2_data[..], "", None, None),
1433+
];
1434+
for file in project.files().unwrap().iter() {
1435+
let found = files.iter().find(|f| file.name().as_str() == f.0).unwrap();
1436+
if let Some(id) = found.3 {
1437+
assert_eq!(file.id().as_str(), id);
1438+
}
1439+
if let Some(time) = found.4 {
1440+
assert_eq!(
1441+
file.creation_time()
1442+
.duration_since(SystemTime::UNIX_EPOCH)
1443+
.unwrap()
1444+
.as_secs(),
1445+
time.duration_since(SystemTime::UNIX_EPOCH)
1446+
.unwrap()
1447+
.as_secs()
1448+
);
1449+
}
1450+
assert_eq!(file.description().as_str(), found.2);
1451+
let content = std::fs::read(file.path_on_disk().as_str()).unwrap();
1452+
assert_eq!(content, found.1);
1453+
}
1454+
1455+
assert_eq!(project.name().as_str(), "project_name");
1456+
assert_eq!(project.description().as_str(), "project_description");
1457+
1458+
// close the project
1459+
project.close().unwrap();
1460+
1461+
// delete the project
1462+
std::fs::remove_dir_all(project_path).unwrap();
1463+
std::fs::remove_dir_all(tmp_folder_1).unwrap();
1464+
std::fs::remove_dir_all(tmp_folder_2).unwrap();
1465+
1466+
crate::headless::shutdown();
1467+
}
1468+
}

0 commit comments

Comments
 (0)