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
12 changes: 0 additions & 12 deletions src/models/category.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,18 +131,6 @@ pub struct NewCategory<'a> {
pub description: &'a str,
}

impl<'a> NewCategory<'a> {
/// Inserts the category into the database, or updates an existing one.
pub fn create_or_update(&self, conn: &mut impl Conn) -> QueryResult<Category> {
insert_into(categories::table)
.values(self)
.on_conflict(categories::slug)
.do_update()
.set(self)
.get_result(conn)
}
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down
7 changes: 5 additions & 2 deletions src/tests/krate/publish/categories.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use crate::tests::builders::PublishBuilder;
use crate::tests::new_category;
use crate::tests::util::{RequestHelper, TestApp};
use crates_io_database::schema::categories;
use diesel::{insert_into, RunQueryDsl};
use googletest::prelude::*;
use http::StatusCode;
use insta::{assert_json_snapshot, assert_snapshot};
Expand All @@ -10,8 +12,9 @@ async fn good_categories() {
let (app, _, _, token) = TestApp::full().with_token();
let mut conn = app.db_conn();

new_category("Category 1", "cat1", "Category 1 crates")
.create_or_update(&mut conn)
insert_into(categories::table)
.values(new_category("Category 1", "cat1", "Category 1 crates"))
.execute(&mut conn)
.unwrap();

let crate_to_publish = PublishBuilder::new("foo_good_cat", "1.0.0").category("cat1");
Expand Down
31 changes: 22 additions & 9 deletions src/tests/routes/categories/get.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ use crate::models::Category;
use crate::tests::builders::CrateBuilder;
use crate::tests::new_category;
use crate::tests::util::{MockAnonymousUser, RequestHelper, TestApp};
use crates_io_database::schema::categories;
use diesel::{insert_into, RunQueryDsl};
use insta::assert_json_snapshot;
use serde_json::Value;

Expand All @@ -16,10 +18,14 @@ async fn show() {
anon.get(url).await.assert_not_found();

// Create a category and a subcategory
assert_ok!(new_category("Foo Bar", "foo-bar", "Foo Bar crates").create_or_update(&mut conn));
assert_ok!(
new_category("Foo Bar::Baz", "foo-bar::baz", "Baz crates").create_or_update(&mut conn)
);
let cats = vec![
new_category("Foo Bar", "foo-bar", "Foo Bar crates"),
new_category("Foo Bar::Baz", "foo-bar::baz", "Baz crates"),
];

assert_ok!(insert_into(categories::table)
.values(cats)
.execute(&mut conn));

// The category and its subcategories should be in the json
let json: Value = anon.get(url).await.good();
Expand All @@ -41,10 +47,14 @@ async fn update_crate() {
let mut conn = app.db_conn();
let user = user.as_model();

assert_ok!(new_category("cat1", "cat1", "Category 1 crates").create_or_update(&mut conn));
assert_ok!(
new_category("Category 2", "category-2", "Category 2 crates").create_or_update(&mut conn)
);
let cats = vec![
new_category("cat1", "cat1", "Category 1 crates"),
new_category("Category 2", "category-2", "Category 2 crates"),
];

assert_ok!(insert_into(categories::table)
.values(cats)
.execute(&mut conn));

let krate = CrateBuilder::new("foo_crate", user.id).expect_build(&mut conn);

Expand Down Expand Up @@ -97,7 +107,10 @@ async fn update_crate() {
assert_eq!(count(&anon, "category-2").await, 0);

// Add a category and its subcategory
assert_ok!(new_category("cat1::bar", "cat1::bar", "bar crates").create_or_update(&mut conn));
assert_ok!(insert_into(categories::table)
.values(new_category("cat1::bar", "cat1::bar", "bar crates"))
.execute(&mut conn));

Category::update_crate(&mut conn, &krate, &["cat1", "cat1::bar"]).unwrap();

assert_eq!(count(&anon, "cat1").await, 1);
Expand Down
15 changes: 10 additions & 5 deletions src/tests/routes/categories/list.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use crate::tests::new_category;
use crate::tests::util::{RequestHelper, TestApp};
use crates_io_database::schema::categories;
use diesel::{insert_into, RunQueryDsl};
use insta::assert_json_snapshot;
use serde_json::Value;

Expand All @@ -13,11 +15,14 @@ async fn index() {
assert_json_snapshot!(json);

// Create a category and a subcategory
new_category("foo", "foo", "Foo crates")
.create_or_update(&mut conn)
.unwrap();
new_category("foo::bar", "foo::bar", "Bar crates")
.create_or_update(&mut conn)
let cats = vec![
new_category("foo", "foo", "Foo crates"),
new_category("foo::bar", "foo::bar", "Bar crates"),
];

insert_into(categories::table)
.values(cats)
.execute(&mut conn)
.unwrap();

// Only the top-level categories should be on the page
Expand Down
15 changes: 10 additions & 5 deletions src/tests/routes/category_slugs/list.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use crate::tests::new_category;
use crate::tests::util::{RequestHelper, TestApp};
use crates_io_database::schema::categories;
use diesel::{insert_into, RunQueryDsl};
use insta::assert_json_snapshot;
use serde_json::Value;

Expand All @@ -8,11 +10,14 @@ async fn category_slugs_returns_all_slugs_in_alphabetical_order() {
let (app, anon) = TestApp::init().empty();
let mut conn = app.db_conn();

new_category("Foo", "foo", "For crates that foo")
.create_or_update(&mut conn)
.unwrap();
new_category("Bar", "bar", "For crates that bar")
.create_or_update(&mut conn)
let cats = vec![
new_category("Foo", "foo", "For crates that foo"),
new_category("Bar", "bar", "For crates that bar"),
];

insert_into(categories::table)
.values(cats)
.execute(&mut conn)
.unwrap();

let response: Value = anon.get("/api/v1/category_slugs").await.good();
Expand Down
19 changes: 12 additions & 7 deletions src/tests/routes/crates/list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use crate::schema::crates;
use crate::tests::builders::{CrateBuilder, VersionBuilder};
use crate::tests::util::{RequestHelper, TestApp};
use crate::tests::{new_category, new_user};
use crates_io_database::schema::categories;
use diesel::{dsl::*, prelude::*, update};
use googletest::prelude::*;
use http::StatusCode;
Expand Down Expand Up @@ -152,12 +153,14 @@ async fn index_queries() {
assert_eq!(json.meta.total, 0);
}

new_category("Category 1", "cat1", "Category 1 crates")
.create_or_update(&mut conn)
.unwrap();
let cats = vec![
new_category("Category 1", "cat1", "Category 1 crates"),
new_category("Category 1::Ba'r", "cat1::bar", "Ba'r crates"),
];

new_category("Category 1::Ba'r", "cat1::bar", "Ba'r crates")
.create_or_update(&mut conn)
insert_into(categories::table)
.values(cats)
.execute(&mut conn)
.unwrap();

Category::update_crate(&mut conn, &krate, &["cat1"]).unwrap();
Expand Down Expand Up @@ -862,9 +865,11 @@ async fn test_default_sort_recent() {
assert_eq!(json.crates[1].downloads, 20);
}

new_category("Animal", "animal", "animal crates")
.create_or_update(&mut conn)
insert_into(categories::table)
.values(new_category("Animal", "animal", "animal crates"))
.execute(&mut conn)
.unwrap();

Category::update_crate(&mut conn, &green_crate, &["animal"]).unwrap();
Category::update_crate(&mut conn, &potato_crate, &["animal"]).unwrap();

Expand Down
8 changes: 5 additions & 3 deletions src/tests/routes/summary.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ use crate::tests::new_category;
use crate::tests::util::{RequestHelper, TestApp};
use crate::views::{EncodableCategory, EncodableCrate, EncodableKeyword};
use chrono::Utc;
use diesel::{update, Connection, ExpressionMethods, RunQueryDsl};
use crates_io_database::schema::categories;
use diesel::{insert_into, update, Connection, ExpressionMethods, RunQueryDsl};

#[derive(Deserialize)]
struct SummaryResponse {
Expand Down Expand Up @@ -34,8 +35,9 @@ async fn summary_new_crates() {
let now_ = Utc::now().naive_utc();
let now_plus_two = now_ + chrono::Duration::seconds(2);

new_category("Category 1", "cat1", "Category 1 crates")
.create_or_update(conn)
insert_into(categories::table)
.values(new_category("Category 1", "cat1", "Category 1 crates"))
.execute(conn)
.unwrap();

CrateBuilder::new("some_downloads", user.id)
Expand Down