diff --git a/src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v1_0_0.rs b/src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v1_0_0.rs index a5743000..bec424ae 100644 --- a/src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v1_0_0.rs +++ b/src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v1_0_0.rs @@ -5,7 +5,7 @@ use sqlx::{query_as, SqlitePool}; use crate::databases::database::DatabaseError; #[derive(Debug, Serialize, Deserialize, sqlx::FromRow)] -pub struct CategoryRecord { +pub struct CategoryRecordV1 { pub category_id: i64, pub name: String, } @@ -64,8 +64,8 @@ impl SqliteDatabaseV1_0_0 { Self { pool: db } } - pub async fn get_categories_order_by_id(&self) -> Result, DatabaseError> { - query_as::<_, CategoryRecord>( + pub async fn get_categories_order_by_id(&self) -> Result, DatabaseError> { + query_as::<_, CategoryRecordV1>( "SELECT category_id, name FROM torrust_categories ORDER BY category_id ASC", ) .fetch_all(&self.pool) diff --git a/src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v2_0_0.rs b/src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v2_0_0.rs index bee97bc2..828a63b9 100644 --- a/src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v2_0_0.rs +++ b/src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v2_0_0.rs @@ -117,6 +117,15 @@ impl SqliteDatabaseV2_0_0 { }) } + pub async fn insert_category(&self, category: &CategoryRecordV2) -> Result { + query("INSERT INTO torrust_categories (category_id, name) VALUES (?, ?)") + .bind(category.category_id) + .bind(category.name.clone()) + .execute(&self.pool) + .await + .map(|v| v.last_insert_rowid()) + } + pub async fn insert_imported_user( &self, user_id: i64, diff --git a/src/upgrades/from_v1_0_0_to_v2_0_0/transferrers/category_transferrer.rs b/src/upgrades/from_v1_0_0_to_v2_0_0/transferrers/category_transferrer.rs index b8e20515..c48c27bf 100644 --- a/src/upgrades/from_v1_0_0_to_v2_0_0/transferrers/category_transferrer.rs +++ b/src/upgrades/from_v1_0_0_to_v2_0_0/transferrers/category_transferrer.rs @@ -1,5 +1,7 @@ use crate::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v1_0_0::SqliteDatabaseV1_0_0; -use crate::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v2_0_0::SqliteDatabaseV2_0_0; +use crate::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v2_0_0::{ + CategoryRecordV2, SqliteDatabaseV2_0_0, +}; use std::sync::Arc; pub async fn transfer_categories( @@ -12,7 +14,7 @@ pub async fn transfer_categories( println!("[v1] categories: {:?}", &source_categories); let result = dest_database.reset_categories_sequence().await.unwrap(); - println!("[v2] reset categories sequence result {:?}", result); + println!("[v2] reset categories sequence result: {:?}", result); for cat in &source_categories { println!( @@ -20,7 +22,10 @@ pub async fn transfer_categories( &cat.name, &cat.category_id ); let id = dest_database - .insert_category_and_get_id(&cat.name) + .insert_category(&CategoryRecordV2 { + category_id: cat.category_id, + name: cat.name.clone(), + }) .await .unwrap(); diff --git a/tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v1_0_0.rs b/tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v1_0_0.rs index 078f3a58..73f7d556 100644 --- a/tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v1_0_0.rs +++ b/tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v1_0_0.rs @@ -2,7 +2,7 @@ use sqlx::sqlite::SqlitePoolOptions; use sqlx::{query, SqlitePool}; use std::fs; use torrust_index_backend::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v1_0_0::{ - TorrentRecordV1, TrackerKeyRecordV1, UserRecordV1, + CategoryRecordV1, TorrentRecordV1, TrackerKeyRecordV1, UserRecordV1, }; pub struct SqliteDatabaseV1_0_0 { @@ -54,6 +54,23 @@ impl SqliteDatabaseV1_0_0 { println!("Migration result {:?}", res); } + pub async fn insert_category(&self, category: &CategoryRecordV1) -> Result { + query("INSERT INTO torrust_categories (category_id, name) VALUES (?, ?)") + .bind(category.category_id) + .bind(category.name.clone()) + .execute(&self.pool) + .await + .map(|v| v.last_insert_rowid()) + } + + pub async fn delete_all_categories(&self) -> Result<(), sqlx::Error> { + query("DELETE FROM torrust_categories") + .execute(&self.pool) + .await + .unwrap(); + Ok(()) + } + pub async fn insert_user(&self, user: &UserRecordV1) -> Result { query("INSERT INTO torrust_users (user_id, username, email, email_verified, password, administrator) VALUES (?, ?, ?, ?, ?, ?)") .bind(user.user_id) diff --git a/tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v2_0_0.rs b/tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v2_0_0.rs index 20a55daa..eea5f354 100644 --- a/tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v2_0_0.rs +++ b/tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v2_0_0.rs @@ -3,6 +3,12 @@ use sqlx::sqlite::SqlitePoolOptions; use sqlx::{query_as, SqlitePool}; use torrust_index_backend::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v2_0_0::TorrentRecordV2; +#[derive(Debug, Serialize, Deserialize, sqlx::FromRow)] +pub struct CategoryRecordV2 { + pub category_id: i64, + pub name: String, +} + #[derive(Debug, Serialize, Deserialize, sqlx::FromRow)] pub struct UserRecordV2 { pub user_id: i64, @@ -76,6 +82,13 @@ impl SqliteDatabaseV2_0_0 { Self { pool: db } } + pub async fn get_category(&self, category_id: i64) -> Result { + query_as::<_, CategoryRecordV2>("SELECT * FROM torrust_categories WHERE category_id = ?") + .bind(category_id) + .fetch_one(&self.pool) + .await + } + pub async fn get_user(&self, user_id: i64) -> Result { query_as::<_, UserRecordV2>("SELECT * FROM torrust_users WHERE user_id = ?") .bind(user_id) diff --git a/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/category_tester.rs b/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/category_tester.rs new file mode 100644 index 00000000..e8e79d54 --- /dev/null +++ b/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/category_tester.rs @@ -0,0 +1,70 @@ +use crate::upgrades::from_v1_0_0_to_v2_0_0::sqlite_v1_0_0::SqliteDatabaseV1_0_0; +use crate::upgrades::from_v1_0_0_to_v2_0_0::sqlite_v2_0_0::SqliteDatabaseV2_0_0; +use std::sync::Arc; +use torrust_index_backend::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v1_0_0::CategoryRecordV1; + +pub struct CategoryTester { + source_database: Arc, + destiny_database: Arc, + test_data: TestData, +} + +pub struct TestData { + pub categories: Vec, +} + +impl CategoryTester { + pub fn new( + source_database: Arc, + destiny_database: Arc, + ) -> Self { + let category_01 = CategoryRecordV1 { + category_id: 10, + name: "category name 10".to_string(), + }; + let category_02 = CategoryRecordV1 { + category_id: 11, + name: "category name 11".to_string(), + }; + + Self { + source_database, + destiny_database, + test_data: TestData { + categories: vec![category_01, category_02], + }, + } + } + + pub fn get_valid_category_id(&self) -> i64 { + self.test_data.categories[0].category_id + } + + /// Table `torrust_categories` + pub async fn load_data_into_source_db(&self) { + // Delete categories added by migrations + self.source_database.delete_all_categories().await.unwrap(); + + // Add test categories + for categories in &self.test_data.categories { + self.source_database + .insert_category(&categories) + .await + .unwrap(); + } + } + + /// Table `torrust_categories` + pub async fn assert_data_in_destiny_db(&self) { + for categories in &self.test_data.categories { + let imported_category = self + .destiny_database + .get_category(categories.category_id) + .await + .unwrap(); + + assert_eq!(imported_category.category_id, categories.category_id); + assert_eq!(imported_category.name, categories.name); + } + } +} diff --git a/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/mod.rs b/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/mod.rs index 730b5149..36629cc3 100644 --- a/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/mod.rs +++ b/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/mod.rs @@ -1,3 +1,4 @@ +pub mod category_tester; pub mod torrent_tester; pub mod tracker_key_tester; pub mod user_tester; diff --git a/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/torrent_tester.rs b/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/torrent_tester.rs index 79256e86..9b4c8c2a 100644 --- a/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/torrent_tester.rs +++ b/tests/upgrades/from_v1_0_0_to_v2_0_0/testers/torrent_tester.rs @@ -24,19 +24,20 @@ impl TorrentTester { source_database: Arc, destiny_database: Arc, user: &UserRecordV1, + category_id: i64, ) -> Self { let torrent_01 = TorrentRecordV1 { torrent_id: 1, uploader: user.username.clone(), info_hash: "9e0217d0fa71c87332cd8bf9dbeabcb2c2cf3c4d".to_string(), title: "A Mandelbrot Set 2048x2048px picture".to_string(), - category_id: 1, + category_id, description: Some( - "A beautiful Mandelbrot Set picture in black and white. \ - - Hybrid torrent V1 and V2. \ - - Single-file torrent. \ - - Public. \ - - More than one tracker URL. \ + "A beautiful Mandelbrot Set picture in black and white. \n \ + - Hybrid torrent V1 and V2. \n \ + - Single-file torrent. \n \ + - Public. \n \ + - More than one tracker URL. \n \ " .to_string(), ), @@ -50,13 +51,13 @@ impl TorrentTester { uploader: user.username.clone(), info_hash: "0902d375f18ec020f0cc68ed4810023032ba81cb".to_string(), title: "Two Mandelbrot Set 2048x2048px pictures".to_string(), - category_id: 1, + category_id, description: Some( - "Two beautiful Mandelbrot Set pictures in black and white. \ - - Hybrid torrent V1 and V2. \ - - Multiple-files torrent. \ - - Private. - - Only one tracker URL. + "Two beautiful Mandelbrot Set pictures in black and white. \n \ + - Hybrid torrent V1 and V2. \n \ + - Multiple-files torrent. \n \ + - Private. \n \ + - Only one tracker URL. \n \ " .to_string(), ), diff --git a/tests/upgrades/from_v1_0_0_to_v2_0_0/upgrader.rs b/tests/upgrades/from_v1_0_0_to_v2_0_0/upgrader.rs index a40f0a37..ee7ddc8f 100644 --- a/tests/upgrades/from_v1_0_0_to_v2_0_0/upgrader.rs +++ b/tests/upgrades/from_v1_0_0_to_v2_0_0/upgrader.rs @@ -13,6 +13,7 @@ //! to see the "upgrader" command output. use crate::upgrades::from_v1_0_0_to_v2_0_0::sqlite_v1_0_0::SqliteDatabaseV1_0_0; use crate::upgrades::from_v1_0_0_to_v2_0_0::sqlite_v2_0_0::SqliteDatabaseV2_0_0; +use crate::upgrades::from_v1_0_0_to_v2_0_0::testers::category_tester::CategoryTester; use crate::upgrades::from_v1_0_0_to_v2_0_0::testers::torrent_tester::TorrentTester; use crate::upgrades::from_v1_0_0_to_v2_0_0::testers::tracker_key_tester::TrackerKeyTester; use crate::upgrades::from_v1_0_0_to_v2_0_0::testers::user_tester::UserTester; @@ -56,6 +57,7 @@ async fn upgrades_data_from_version_v1_0_0_to_v2_0_0() { // The datetime when the upgrader is executed let execution_time = datetime_iso_8601(); + let category_tester = CategoryTester::new(source_db.clone(), dest_db.clone()); let user_tester = UserTester::new(source_db.clone(), dest_db.clone(), &execution_time); let tracker_key_tester = TrackerKeyTester::new( source_db.clone(), @@ -66,9 +68,11 @@ async fn upgrades_data_from_version_v1_0_0_to_v2_0_0() { source_db.clone(), dest_db.clone(), &user_tester.test_data.user, + category_tester.get_valid_category_id(), ); // Load data into source database in version v1.0.0 + category_tester.load_data_into_source_db().await; user_tester.load_data_into_source_db().await; tracker_key_tester.load_data_into_source_db().await; torrent_tester.load_data_into_source_db().await; @@ -85,6 +89,7 @@ async fn upgrades_data_from_version_v1_0_0_to_v2_0_0() { .await; // Assertions for data transferred to the new database in version v2.0.0 + category_tester.assert_data_in_destiny_db().await; user_tester.assert_data_in_destiny_db().await; tracker_key_tester.assert_data_in_destiny_db().await; torrent_tester