Skip to content

Commit

Permalink
feat: [torrust#56] keep category id in DB migration script
Browse files Browse the repository at this point in the history
Instead of regenerating ID sequence we keep the category id.
Becuase we were keeping IDs for all tables except for this one.

@ldpr helped testing the migration script and found the issue with the
categories IDs.

Co-authored-by: ldpr <[email protected]>
  • Loading branch information
josecelano and ldpr committed Nov 30, 2022
1 parent b29d4d7 commit 8b761c8
Show file tree
Hide file tree
Showing 9 changed files with 140 additions and 19 deletions.
6 changes: 3 additions & 3 deletions src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v1_0_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
Expand Down Expand Up @@ -64,8 +64,8 @@ impl SqliteDatabaseV1_0_0 {
Self { pool: db }
}

pub async fn get_categories_order_by_id(&self) -> Result<Vec<CategoryRecord>, DatabaseError> {
query_as::<_, CategoryRecord>(
pub async fn get_categories_order_by_id(&self) -> Result<Vec<CategoryRecordV1>, DatabaseError> {
query_as::<_, CategoryRecordV1>(
"SELECT category_id, name FROM torrust_categories ORDER BY category_id ASC",
)
.fetch_all(&self.pool)
Expand Down
9 changes: 9 additions & 0 deletions src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v2_0_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,15 @@ impl SqliteDatabaseV2_0_0 {
})
}

pub async fn insert_category(&self, category: &CategoryRecordV2) -> Result<i64, sqlx::Error> {
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,
Expand Down
Original file line number Diff line number Diff line change
@@ -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(
Expand All @@ -12,15 +14,18 @@ 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!(
"[v2] adding category {:?} with id {:?} ...",
&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();

Expand Down
19 changes: 18 additions & 1 deletion tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v1_0_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -54,6 +54,23 @@ impl SqliteDatabaseV1_0_0 {
println!("Migration result {:?}", res);
}

pub async fn insert_category(&self, category: &CategoryRecordV1) -> Result<i64, sqlx::Error> {
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<i64, sqlx::Error> {
query("INSERT INTO torrust_users (user_id, username, email, email_verified, password, administrator) VALUES (?, ?, ?, ?, ?, ?)")
.bind(user.user_id)
Expand Down
13 changes: 13 additions & 0 deletions tests/upgrades/from_v1_0_0_to_v2_0_0/sqlite_v2_0_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -76,6 +82,13 @@ impl SqliteDatabaseV2_0_0 {
Self { pool: db }
}

pub async fn get_category(&self, category_id: i64) -> Result<CategoryRecordV2, sqlx::Error> {
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<UserRecordV2, sqlx::Error> {
query_as::<_, UserRecordV2>("SELECT * FROM torrust_users WHERE user_id = ?")
.bind(user_id)
Expand Down
70 changes: 70 additions & 0 deletions tests/upgrades/from_v1_0_0_to_v2_0_0/testers/category_tester.rs
Original file line number Diff line number Diff line change
@@ -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<SqliteDatabaseV1_0_0>,
destiny_database: Arc<SqliteDatabaseV2_0_0>,
test_data: TestData,
}

pub struct TestData {
pub categories: Vec<CategoryRecordV1>,
}

impl CategoryTester {
pub fn new(
source_database: Arc<SqliteDatabaseV1_0_0>,
destiny_database: Arc<SqliteDatabaseV2_0_0>,
) -> 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);
}
}
}
1 change: 1 addition & 0 deletions tests/upgrades/from_v1_0_0_to_v2_0_0/testers/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub mod category_tester;
pub mod torrent_tester;
pub mod tracker_key_tester;
pub mod user_tester;
25 changes: 13 additions & 12 deletions tests/upgrades/from_v1_0_0_to_v2_0_0/testers/torrent_tester.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,20 @@ impl TorrentTester {
source_database: Arc<SqliteDatabaseV1_0_0>,
destiny_database: Arc<SqliteDatabaseV2_0_0>,
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(),
),
Expand All @@ -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(),
),
Expand Down
5 changes: 5 additions & 0 deletions tests/upgrades/from_v1_0_0_to_v2_0_0/upgrader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(),
Expand All @@ -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;
Expand All @@ -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
Expand Down

0 comments on commit 8b761c8

Please sign in to comment.