Skip to content

Commit 3ccbbb3

Browse files
committed
improve tests, fix a form bug when auth is enabled
1 parent 7f95f53 commit 3ccbbb3

File tree

6 files changed

+56
-26
lines changed

6 files changed

+56
-26
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ futures = "0.3.5"
3030
chrono = { version = "0.4.13" }
3131
md-5 = "0.9.1"
3232
feed-rs = "0.4.0"
33+
serde_urlencoded = "0.6.1"
3334

3435
[dev-dependencies]
3536
rand = "0.7"
3637
tempfile = "3"
37-
assert_cmd = "1.0.1"
38+
assert_cmd = "1.0.1"

src/api.rs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -193,31 +193,41 @@ struct Auth {
193193
api_key: String,
194194
}
195195

196+
macro_rules! unwrap_or_return {
197+
($result: expr, $ret: expr) => {
198+
match $result {
199+
Some(v) => v,
200+
None => return $ret,
201+
}
202+
};
203+
}
204+
205+
fn auth_error() -> tide::Result {
206+
Ok(json!({
207+
"api_version": API_VERSION,
208+
"auth": 0,
209+
})
210+
.into())
211+
}
212+
196213
fn auth(
197214
mut request: Request<State>,
198215
next: tide::Next<'_, State>,
199216
) -> Pin<Box<dyn Future<Output = tide::Result> + Send + '_>> {
200217
Box::pin(async move {
201-
if let Some(credential) = request.state().credential.clone() {
202-
if let Ok(auth) = request.body_form::<Auth>().await {
203-
if auth.api_key == credential {
204-
Ok(next.run(request).await)
205-
} else {
206-
Ok(json!({
207-
"api_version": API_VERSION,
208-
"auth": 0,
209-
})
210-
.into())
211-
}
212-
} else {
213-
Ok(json!({
214-
"api_version": API_VERSION,
215-
"auth": 0,
216-
})
217-
.into())
218-
}
219-
} else {
218+
let credential = unwrap_or_return!(
219+
request.state().credential.clone(),
220+
Ok(next.run(request).await)
221+
);
222+
let body = unwrap_or_return!(request.take_body().into_string().await.ok(), auth_error());
223+
// We need this to avoid taking away body from subsequent processing.
224+
request.set_body(body.clone());
225+
226+
let auth = unwrap_or_return!(serde_urlencoded::from_str::<Auth>(&body).ok(), auth_error());
227+
if auth.api_key == credential {
220228
Ok(next.run(request).await)
229+
} else {
230+
auth_error()
221231
}
222232
})
223233
}

src/cli.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::model::{Feed, FeedGroup, Group, ModelExt};
1+
use crate::model::{Feed, FeedGroup, Group, Item, ModelExt};
22
use crate::state::State;
33
use anyhow::{anyhow, Context, Result};
44
use async_std::prelude::FutureExt;
@@ -94,9 +94,10 @@ impl FeedCommand {
9494
fn delete(state: State, id: u32) -> Result<()> {
9595
let conn = state.db.get()?;
9696
let feed = Feed::get(&conn, id)?;
97+
FeedGroup::delete_by_feed(&conn, feed.id)?;
98+
Item::delete_by_feed(&conn, feed.id)?;
9799
let feed = feed.delete(&conn)?;
98100
println!("Feed deleted!\n{}", feed);
99-
// TODO: delete related items
100101
Ok(())
101102
}
102103

src/model.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,11 +369,10 @@ impl FeedGroup {
369369
Self::fold_group(indices)
370370
}
371371

372-
pub fn get_by_feed(conn: &Connection, feed_id: u32) -> Result<(u32, u32)> {
373-
Ok(conn.query_row(
374-
"SELECT group_id, feed_id FROM `feed_group` WHERE `feed_id` = ?1",
372+
pub fn delete_by_feed(conn: &Connection, feed_id: u32) -> Result<usize> {
373+
Ok(conn.execute(
374+
"DELETE FROM `feed_group` WHERE `feed_id` = ?1",
375375
params![feed_id],
376-
|row| Ok((row.get(0)?, row.get(1)?)),
377376
)?)
378377
}
379378

@@ -535,6 +534,10 @@ impl Item {
535534
.collect::<Result<_, _>>()?)
536535
}
537536

537+
pub fn delete_by_feed(conn: &Connection, feed_id: u32) -> Result<usize> {
538+
Ok(conn.execute("DELETE FROM `item` WHERE `feed_id` = ?1", params![feed_id])?)
539+
}
540+
538541
pub fn unread(conn: &Connection) -> Result<Vec<u32>> {
539542
Ok(conn
540543
.prepare("SELECT id FROM `item` WHERE `is_read` = 0")?
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,17 @@ fn test_feed_basic() -> Result<()> {
116116

117117
Ok(())
118118
}
119+
120+
#[test]
121+
fn test_crawl() -> Result<()> {
122+
let lares = Lares::new()?;
123+
let (addr, _server) = lares.run_fixture_server()?;
124+
125+
let rust = format!("{}/rust.xml", addr);
126+
let _ = lares.cmd()?.args(&["feed", "add", &rust]).output()?;
127+
128+
// check database before crawling
129+
130+
lares.cmd()?.args(&["feed", "crawl", "1"]);
131+
Ok(())
132+
}

0 commit comments

Comments
 (0)