diff --git a/migrations/20240519141105_crate-version-name-field-length.down.sql b/migrations/20240519141105_crate-version-name-field-length.down.sql index bcf3a5aea..e1ed843f3 100644 --- a/migrations/20240519141105_crate-version-name-field-length.down.sql +++ b/migrations/20240519141105_crate-version-name-field-length.down.sql @@ -1,2 +1,10 @@ +-- this reverse migration might fail when we have other records +-- referencing releases with longer names or versions. +-- If this has to be reverted we probably would have to manually run +-- db::delete::delete_crate and db::delete::delete_version for the releases +-- and crates. +DELETE FROM crates WHERE LENGTH(name) > 255; +DELETE FROM releases WHERE LENGTH(version) > 100; + ALTER TABLE crates ALTER COLUMN name TYPE VARCHAR(255); ALTER TABLE releases ALTER COLUMN version TYPE VARCHAR(100); diff --git a/src/db/add_package.rs b/src/db/add_package.rs index 6807df2b9..c5f92b493 100644 --- a/src/db/add_package.rs +++ b/src/db/add_package.rs @@ -606,6 +606,7 @@ mod test { use crate::registry_api::OwnerKind; use crate::test::*; use crate::utils::CargoMetadata; + use std::iter; use test_case::test_case; #[test] @@ -1110,4 +1111,42 @@ mod test { Ok(()) }) } + + #[test] + fn test_long_crate_name() { + async_wrapper(|env| async move { + let mut conn = env.async_db().await.async_conn().await; + + let name: String = iter::repeat("krate").take(100).collect(); + let crate_id = initialize_crate(&mut conn, &name).await?; + + let db_name = sqlx::query_scalar!("SELECT name FROM crates WHERE id = $1", crate_id) + .fetch_one(&mut *conn) + .await?; + + assert_eq!(db_name, name); + + Ok(()) + }) + } + + #[test] + fn test_long_relaase_version() { + async_wrapper(|env| async move { + let mut conn = env.async_db().await.async_conn().await; + + let crate_id = initialize_crate(&mut conn, "krate").await?; + let version: String = iter::repeat("version").take(100).collect(); + let release_id = initialize_release(&mut conn, crate_id, &version).await?; + + let db_version = + sqlx::query_scalar!("SELECT version FROM releases WHERE id = $1", release_id) + .fetch_one(&mut *conn) + .await?; + + assert_eq!(db_version, version); + + Ok(()) + }) + } }