diff --git a/src/category.rs b/src/category.rs index 99674efbd57..c9b6a4d7139 100644 --- a/src/category.rs +++ b/src/category.rs @@ -309,29 +309,18 @@ pub fn show(req: &mut Request) -> CargoResult { /// Handles the `GET /category_slugs` route. pub fn slugs(req: &mut Request) -> CargoResult { - let conn = req.tx()?; - let stmt = conn.prepare( - "SELECT slug FROM categories \ - ORDER BY slug", - )?; - let rows = stmt.query(&[])?; + let conn = req.db_conn()?; + let slugs = categories::table + .select((categories::slug, categories::slug)) + .order(categories::slug) + .load(&*conn)?; - #[derive(Serialize)] + #[derive(Serialize, Queryable)] struct Slug { id: String, slug: String, } - let slugs: Vec = rows.iter() - .map(|r| { - let slug: String = r.get("slug"); - Slug { - id: slug.clone(), - slug: slug, - } - }) - .collect(); - #[derive(Serialize)] struct R { category_slugs: Vec, diff --git a/src/tests/category.rs b/src/tests/category.rs index 17d8cd92290..377642fa5b2 100644 --- a/src/tests/category.rs +++ b/src/tests/category.rs @@ -166,3 +166,45 @@ fn update_crate() { assert_eq!(cnt!(&mut req, "cat1::bar"), 1); assert_eq!(cnt!(&mut req, "category-2"), 0); } + +#[test] +fn category_slugs_returns_all_slugs_in_alphabetical_order() { + let (_b, app, middle) = ::app(); + { + let conn = app.diesel_database.get().unwrap(); + ::new_category("Foo", "foo") + .create_or_update(&conn) + .unwrap(); + ::new_category("Bar", "bar") + .create_or_update(&conn) + .unwrap(); + } + + let mut req = ::req(app, Method::Get, "/api/v1/category_slugs"); + + #[derive(Deserialize, Debug, PartialEq)] + struct Slug { + id: String, + slug: String, + } + + #[derive(Deserialize, Debug, PartialEq)] + struct Slugs { + category_slugs: Vec, + } + + let response = ::json(&mut ok_resp!(middle.call(&mut req))); + let expected_response = Slugs { + category_slugs: vec![ + Slug { + id: "bar".into(), + slug: "bar".into(), + }, + Slug { + id: "foo".into(), + slug: "foo".into(), + }, + ], + }; + assert_eq!(expected_response, response); +}