Line data Source code
1 : use super::*;
2 : use crate::db::setup_db;
3 : use googletest::prelude::*;
4 :
5 : #[test]
6 1 : fn test_create_article() -> Result<()> {
7 1 : let db = setup_db(Some("testdata/test_sign_in.sql".into()));
8 1 : let params =
9 1 : ArticleCreateParams { title: "2 cool".to_string(), content: "4school".to_string() };
10 1 : let page_id = create_article(&db, params, 1)?;
11 1 : let mut stmt = db.prepare(
12 1 : "SELECT p.title, p.slug, r.content FROM pages p NATURAL JOIN revisions r
13 1 : WHERE page_id = ? ORDER BY rev_id DESC LIMIT 1",
14 0 : )?;
15 1 : let (title, slug, content): (String, String, String) = stmt.query_row([&page_id], |row| {
16 1 : Ok((row.get("title")?, row.get("slug")?, row.get("content")?))
17 1 : })?;
18 1 : assert_eq!(title, "2 cool".to_string());
19 1 : assert_eq!(slug, "2%20cool".to_string());
20 1 : assert_eq!(content, "4school".to_string());
21 1 : Ok(())
22 1 : }
23 :
24 : #[test]
25 1 : fn test_create_article_duplicate_slug() -> Result<()> {
26 1 : let db = setup_db(Some("testdata/test_sign_in.sql".into()));
27 1 : let params =
28 1 : ArticleCreateParams { title: "2 cool".to_string(), content: "4school".to_string() };
29 : // Use non-breaking space that has the same percent encoding so that the
30 : // conflict happens in the slug instead.
31 1 : let params_2 =
32 1 : ArticleCreateParams { title: "2 cool".to_string(), content: "4school".to_string() };
33 1 : assert_eq!(1, create_article(&db, params, 1)?);
34 1 : let ret = create_article(&db, params_2, 1);
35 1 : dbg!("Result: ", &ret);
36 1 : assert!(ret.is_err());
37 1 : Ok(())
38 1 : }
39 :
40 : #[test]
41 1 : fn test_update_article() -> Result<()> {
42 1 : let db = setup_db(Some("testdata/find_by_slug.sql".into()));
43 1 : let params = ArticleUpdateParams {
44 1 : page_id: 1,
45 1 : title: "2 cool".to_string(),
46 1 : content: "4school".to_string(),
47 1 : };
48 1 : update_article(&db, ¶ms, 1)?;
49 1 : let mut stmt = db.prepare(
50 1 : "SELECT r.rev_id, p.title, p.slug, r.content FROM pages p NATURAL JOIN revisions r
51 1 : WHERE page_id = ? ORDER BY rev_id DESC LIMIT 1",
52 0 : )?;
53 1 : let (rev_id, title, slug, content): (i64, String, String, String) = stmt
54 1 : .query_row([1], |row| {
55 1 : Ok((row.get("rev_id")?, row.get("title")?, row.get("slug")?, row.get("content")?))
56 1 : })?;
57 1 : assert_eq!(rev_id, 2);
58 1 : assert_eq!(title, "2 cool".to_string());
59 1 : assert_eq!(slug, "2%20cool".to_string());
60 1 : assert_eq!(content, "4school".to_string());
61 1 : Ok(())
62 1 : }
63 :
64 : #[gtest]
65 : fn test_latest_articles() -> Result<()> {
66 : let db = setup_db(Some("testdata/latest_articles.sql".into()));
67 : let articles = latest_articles(&db)?;
68 : expect_that!(
69 : articles,
70 : elements_are![
71 : pat!(Article { id: anything(), title: "Sixth", content: anything() }),
72 : pat!(Article { id: anything(), title: "Fifth", content: anything() }),
73 : pat!(Article { id: anything(), title: "Fourth", content: anything() }),
74 : pat!(Article { id: anything(), title: "Third", content: anything() }),
75 : pat!(Article { id: anything(), title: "Second", content: anything() }),
76 : ]
77 : );
78 : Ok(())
79 : }
80 :
81 : #[gtest]
82 : fn test_find_by_id() -> Result<()> {
83 : let db = setup_db(Some("testdata/find_by_slug.sql".into()));
84 : let got = find_by_id(&db, 1)?;
85 : expect_that!(
86 : got,
87 : pat!(Article {
88 : id: anything(), // Why can't use some(eq(1)) here?
89 : title: "Some title",
90 : content: "some content",
91 : })
92 : );
93 : expect_that!(got.id, some(eq(1)));
94 : Ok(())
95 : }
96 :
97 : #[test]
98 1 : fn test_find_by_id_empty() {
99 1 : let db = setup_db(None);
100 1 : let got = find_by_id(&db, 1);
101 1 : assert_eq!(got, Err(rusqlite::Error::QueryReturnedNoRows));
102 1 : }
|