Skip to content

Commit ceae004

Browse files
authored
Merge pull request #759 from sgrif/sg-port-category-slugs
Port categories/slugs over to Diesel
2 parents 65780b2 + 484a960 commit ceae004

File tree

2 files changed

+48
-17
lines changed

2 files changed

+48
-17
lines changed

src/category.rs

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -309,29 +309,18 @@ pub fn show(req: &mut Request) -> CargoResult<Response> {
309309

310310
/// Handles the `GET /category_slugs` route.
311311
pub fn slugs(req: &mut Request) -> CargoResult<Response> {
312-
let conn = req.tx()?;
313-
let stmt = conn.prepare(
314-
"SELECT slug FROM categories \
315-
ORDER BY slug",
316-
)?;
317-
let rows = stmt.query(&[])?;
312+
let conn = req.db_conn()?;
313+
let slugs = categories::table
314+
.select((categories::slug, categories::slug))
315+
.order(categories::slug)
316+
.load(&*conn)?;
318317

319-
#[derive(Serialize)]
318+
#[derive(Serialize, Queryable)]
320319
struct Slug {
321320
id: String,
322321
slug: String,
323322
}
324323

325-
let slugs: Vec<Slug> = rows.iter()
326-
.map(|r| {
327-
let slug: String = r.get("slug");
328-
Slug {
329-
id: slug.clone(),
330-
slug: slug,
331-
}
332-
})
333-
.collect();
334-
335324
#[derive(Serialize)]
336325
struct R {
337326
category_slugs: Vec<Slug>,

src/tests/category.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,3 +166,45 @@ fn update_crate() {
166166
assert_eq!(cnt!(&mut req, "cat1::bar"), 1);
167167
assert_eq!(cnt!(&mut req, "category-2"), 0);
168168
}
169+
170+
#[test]
171+
fn category_slugs_returns_all_slugs_in_alphabetical_order() {
172+
let (_b, app, middle) = ::app();
173+
{
174+
let conn = app.diesel_database.get().unwrap();
175+
::new_category("Foo", "foo")
176+
.create_or_update(&conn)
177+
.unwrap();
178+
::new_category("Bar", "bar")
179+
.create_or_update(&conn)
180+
.unwrap();
181+
}
182+
183+
let mut req = ::req(app, Method::Get, "/api/v1/category_slugs");
184+
185+
#[derive(Deserialize, Debug, PartialEq)]
186+
struct Slug {
187+
id: String,
188+
slug: String,
189+
}
190+
191+
#[derive(Deserialize, Debug, PartialEq)]
192+
struct Slugs {
193+
category_slugs: Vec<Slug>,
194+
}
195+
196+
let response = ::json(&mut ok_resp!(middle.call(&mut req)));
197+
let expected_response = Slugs {
198+
category_slugs: vec![
199+
Slug {
200+
id: "bar".into(),
201+
slug: "bar".into(),
202+
},
203+
Slug {
204+
id: "foo".into(),
205+
slug: "foo".into(),
206+
},
207+
],
208+
};
209+
assert_eq!(expected_response, response);
210+
}

0 commit comments

Comments
 (0)