@@ -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\x02 3" ;
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