Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
DROP FUNCTION IF EXISTS update_num_versions_from_versions CASCADE;
16 changes: 16 additions & 0 deletions migrations/2025-02-11-163554_fix-num-versions-trigger/up.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
CREATE OR REPLACE FUNCTION update_num_versions_from_versions() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO default_versions (crate_id, version_id, num_versions)
VALUES (NEW.crate_id, NEW.id, 1)
ON CONFLICT (crate_id) DO UPDATE
SET num_versions = default_versions.num_versions + 1;
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
UPDATE default_versions
SET num_versions = num_versions - 1
WHERE crate_id = OLD.crate_id;
RETURN OLD;
END IF;
END
$$ LANGUAGE plpgsql;
51 changes: 31 additions & 20 deletions src/tests/krate/publish/basics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::schema::versions_published_by;
use crate::tests::builders::{CrateBuilder, PublishBuilder};
use crate::tests::util::{RequestHelper, TestApp};
use diesel::QueryDsl;
use diesel_async::RunQueryDsl;
use diesel_async::{AsyncPgConnection, RunQueryDsl};
use googletest::prelude::*;
use http::StatusCode;
use insta::{assert_json_snapshot, assert_snapshot};
Expand Down Expand Up @@ -116,23 +116,12 @@ async fn new_krate_twice() {
// The primary purpose is to verify that the `default_version` we provide is as expected.
#[tokio::test(flavor = "multi_thread")]
async fn new_krate_twice_alt() {
use crate::schema::default_versions;

let (app, _, _, token) = TestApp::full().with_token().await;
let mut conn = app.db_conn().await;

let crate_to_publish =
PublishBuilder::new("foo_twice", "2.0.0").description("2.0.0 description");
token.publish_crate(crate_to_publish).await.good();

let num_versions = default_versions::table
.select(default_versions::num_versions)
.load::<Option<i32>>(&mut conn)
.await
.unwrap();
assert_eq!(num_versions.len(), 1);
assert_eq!(num_versions[0], Some(1));

let crate_to_publish = PublishBuilder::new("foo_twice", "0.99.0");
let response = token.publish_crate(crate_to_publish).await;
assert_eq!(response.status(), StatusCode::OK);
Expand All @@ -141,14 +130,6 @@ async fn new_krate_twice_alt() {
".crate.updated_at" => "[datetime]",
});

let num_versions = default_versions::table
.select(default_versions::num_versions)
.load::<Option<i32>>(&mut conn)
.await
.unwrap();
assert_eq!(num_versions.len(), 1);
assert_eq!(num_versions[0], Some(2));

let crates = app.crates_from_index_head("foo_twice");
assert_json_snapshot!(crates);

Expand Down Expand Up @@ -180,3 +161,33 @@ async fn new_krate_duplicate_version() {

assert_that!(app.stored_files().await, empty());
}

#[tokio::test(flavor = "multi_thread")]
async fn new_krate_advance_num_versions() {
use crate::schema::default_versions;

let (app, _, _, token) = TestApp::full().with_token().await;
let mut conn = app.db_conn().await;

async fn assert_num_versions(conn: &mut AsyncPgConnection, expected: i32) {
let num_versions = default_versions::table
.select(default_versions::num_versions)
.load::<Option<i32>>(conn)
.await
.unwrap();
assert_eq!(num_versions.len(), 1);
assert_eq!(num_versions[0], Some(expected));
}

let crate_to_publish = PublishBuilder::new("foo", "2.0.0").description("2.0.0 description");
token.publish_crate(crate_to_publish).await.good();
assert_num_versions(&mut conn, 1).await;

let crate_to_publish = PublishBuilder::new("foo", "2.0.1").description("2.0.1 description");
token.publish_crate(crate_to_publish).await.good();
assert_num_versions(&mut conn, 2).await;

let crate_to_publish = PublishBuilder::new("foo", "2.0.2").description("2.0.2 description");
token.publish_crate(crate_to_publish).await.good();
assert_num_versions(&mut conn, 3).await;
}