|
4 | 4 | //! cargo test upgrade_data_from_version_v1_0_0_to_v2_0_0 -- --nocapture |
5 | 5 | //! ``` |
6 | 6 | use crate::upgrades::from_v1_0_0_to_v2_0_0::sqlite_v1_0_0::SqliteDatabaseV1_0_0; |
| 7 | +use crate::upgrades::from_v1_0_0_to_v2_0_0::sqlite_v2_0_0::SqliteDatabaseV2_0_0; |
| 8 | +use argon2::password_hash::SaltString; |
| 9 | +use argon2::{Argon2, PasswordHasher}; |
| 10 | +use rand_core::OsRng; |
7 | 11 | use std::fs; |
8 | 12 | use std::sync::Arc; |
9 | | -use torrust_index_backend::upgrades::from_v1_0_0_to_v2_0_0::upgrader::{upgrade, Arguments}; |
| 13 | +use torrust_index_backend::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v1_0_0::UserRecordV1; |
| 14 | +use torrust_index_backend::upgrades::from_v1_0_0_to_v2_0_0::upgrader::{ |
| 15 | + datetime_iso_8601, upgrade, Arguments, |
| 16 | +}; |
10 | 17 |
|
11 | 18 | #[tokio::test] |
12 | 19 | async fn upgrade_data_from_version_v1_0_0_to_v2_0_0() { |
13 | | - /* TODO: |
14 | | - * - Insert data: user, tracker key and torrent |
15 | | - * - Assertions |
16 | | - */ |
| 20 | + // Directories |
17 | 21 | let fixtures_dir = "./tests/upgrades/from_v1_0_0_to_v2_0_0/fixtures/".to_string(); |
18 | | - let debug_output_dir = "./tests/upgrades/from_v1_0_0_to_v2_0_0/output/".to_string(); |
| 22 | + let output_dir = "./tests/upgrades/from_v1_0_0_to_v2_0_0/output/".to_string(); |
19 | 23 |
|
20 | | - let source_database_file = format!("{}source.db", debug_output_dir); |
21 | | - let destiny_database_file = format!("{}destiny.db", debug_output_dir); |
22 | | - |
23 | | - // TODO: use a unique temporary dir |
24 | | - fs::remove_file(&source_database_file).expect("Can't remove source DB file."); |
25 | | - fs::remove_file(&destiny_database_file).expect("Can't remove destiny DB file."); |
| 24 | + // Files |
| 25 | + let source_database_file = format!("{}source.db", output_dir); |
| 26 | + let destiny_database_file = format!("{}destiny.db", output_dir); |
26 | 27 |
|
| 28 | + // Set up clean database |
| 29 | + reset_databases(&source_database_file, &destiny_database_file); |
27 | 30 | let source_database = source_db_connection(&source_database_file).await; |
28 | | - |
29 | 31 | source_database.migrate(&fixtures_dir).await; |
30 | 32 |
|
| 33 | + // Load data into database v1 |
| 34 | + |
| 35 | + // `torrust_users` table |
| 36 | + |
| 37 | + let user = UserRecordV1 { |
| 38 | + user_id: 1, |
| 39 | + username: "user01".to_string(), |
| 40 | + email: "[email protected]".to_string(), |
| 41 | + email_verified: true, |
| 42 | + password: hashed_valid_password(), |
| 43 | + administrator: true, |
| 44 | + }; |
| 45 | + let user_id = source_database.insert_user(&user).await.unwrap(); |
| 46 | + |
| 47 | + // `torrust_tracker_keys` table |
| 48 | + |
| 49 | + // TODO |
| 50 | + |
| 51 | + // `torrust_torrents` table |
| 52 | + |
| 53 | + // TODO |
| 54 | + |
| 55 | + // Run the upgrader |
31 | 56 | let args = Arguments { |
32 | | - source_database_file, |
33 | | - destiny_database_file, |
| 57 | + source_database_file: source_database_file.clone(), |
| 58 | + destiny_database_file: destiny_database_file.clone(), |
34 | 59 | upload_path: format!("{}uploads/", fixtures_dir), |
35 | 60 | }; |
| 61 | + let now = datetime_iso_8601(); |
| 62 | + upgrade(&args, &now).await; |
| 63 | + |
| 64 | + // Assertions in database v2 |
| 65 | + |
| 66 | + let destiny_database = destiny_db_connection(&destiny_database_file).await; |
| 67 | + |
| 68 | + // `torrust_users` table |
| 69 | + |
| 70 | + let imported_user = destiny_database.get_user(user_id).await.unwrap(); |
| 71 | + |
| 72 | + assert_eq!(imported_user.user_id, user.user_id); |
| 73 | + assert!(imported_user.date_registered.is_none()); |
| 74 | + assert_eq!(imported_user.date_imported.unwrap(), now); |
| 75 | + assert_eq!(imported_user.administrator, user.administrator); |
| 76 | + |
| 77 | + // `torrust_user_authentication` table |
| 78 | + |
| 79 | + // TODO |
| 80 | + |
| 81 | + // `torrust_user_profiles` table |
| 82 | + |
| 83 | + // TODO |
| 84 | + |
| 85 | + // `torrust_tracker_keys` table |
36 | 86 |
|
37 | | - upgrade(&args).await; |
| 87 | + // TODO |
| 88 | + |
| 89 | + // `torrust_torrents` table |
| 90 | + |
| 91 | + // TODO |
| 92 | + |
| 93 | + // `torrust_torrent_files` table |
| 94 | + |
| 95 | + // TODO |
| 96 | + |
| 97 | + // `torrust_torrent_info` table |
| 98 | + |
| 99 | + // TODO |
| 100 | + |
| 101 | + // `torrust_torrent_announce_urls` table |
| 102 | + |
| 103 | + // TODO |
38 | 104 | } |
39 | 105 |
|
40 | 106 | async fn source_db_connection(source_database_file: &str) -> Arc<SqliteDatabaseV1_0_0> { |
41 | 107 | Arc::new(SqliteDatabaseV1_0_0::db_connection(&source_database_file).await) |
42 | 108 | } |
| 109 | + |
| 110 | +async fn destiny_db_connection(destiny_database_file: &str) -> Arc<SqliteDatabaseV2_0_0> { |
| 111 | + Arc::new(SqliteDatabaseV2_0_0::db_connection(&destiny_database_file).await) |
| 112 | +} |
| 113 | + |
| 114 | +/// Reset databases from previous executions |
| 115 | +fn reset_databases(source_database_file: &str, destiny_database_file: &str) { |
| 116 | + // TODO: use a unique temporary dir |
| 117 | + fs::remove_file(&source_database_file).expect("Can't remove source DB file."); |
| 118 | + fs::remove_file(&destiny_database_file).expect("Can't remove destiny DB file."); |
| 119 | +} |
| 120 | + |
| 121 | +fn hashed_valid_password() -> String { |
| 122 | + hash_password(&valid_password()) |
| 123 | +} |
| 124 | + |
| 125 | +fn valid_password() -> String { |
| 126 | + "123456".to_string() |
| 127 | +} |
| 128 | + |
| 129 | +fn hash_password(plain_password: &str) -> String { |
| 130 | + let salt = SaltString::generate(&mut OsRng); |
| 131 | + |
| 132 | + // Argon2 with default params (Argon2id v19) |
| 133 | + let argon2 = Argon2::default(); |
| 134 | + |
| 135 | + // Hash password to PHC string ($argon2id$v=19$...) |
| 136 | + argon2 |
| 137 | + .hash_password(plain_password.as_bytes(), &salt) |
| 138 | + .unwrap() |
| 139 | + .to_string() |
| 140 | +} |
0 commit comments