~gbmor/clinte

d098a93d910f4bb23e4f0f81a69db83693dd2b78 — Ben Morrison 2 years ago cf2b975
moved some functionality to module, added tests
4 files changed, 97 insertions(+), 19 deletions(-)

M Cargo.lock
M Cargo.toml
M src/main.rs
A src/posts.rs
M Cargo.lock => Cargo.lock +1 -1
@@ 119,7 119,7 @@ dependencies = [

[[package]]
name = "clinte"
version = "0.3.2"
version = "0.3.3"
dependencies = [
 "chrono 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",

M Cargo.toml => Cargo.toml +1 -1
@@ 1,6 1,6 @@
[package]
name = "clinte"
version = "0.3.2"
version = "0.3.3"
authors = ["Ben Morrison <ben@gbmor.dev>"]
edition = "2018"


M src/main.rs => src/main.rs +16 -17
@@ 6,6 6,7 @@ use users;

mod db;
mod logging;
mod posts;

fn main() {
    let arg_matches = clap::App::new("clinte")


@@ 124,13 125,7 @@ fn post(db: &db::Conn) {
        &body
    };

    let user = users::get_current_username()
        .unwrap()
        .into_string()
        .unwrap();

    stmt.execute_named(&[(":title", &title), (":author", &user), (":body", &body)])
        .unwrap();
    posts::new(&mut stmt, title, body).unwrap();

    println!();
}


@@ 181,15 176,7 @@ fn update(db: &db::Conn) {
    io::stdin().read_line(&mut new_body).unwrap();
    println!();

    let new_title = new_title.trim();
    let new_body = new_body.trim();

    let title_stmt = format!("UPDATE posts SET title = :title WHERE id = {}", id_num_in);
    let mut stmt = db.conn.prepare(&title_stmt).unwrap();
    stmt.execute_named(&[(":title", &new_title)]).unwrap();
    let body_stmt = format!("UPDATE posts SET body = :body WHERE id = {}", id_num_in);
    let mut stmt = db.conn.prepare(&body_stmt).unwrap();
    stmt.execute_named(&[(":body", &new_body)]).unwrap();
    posts::update(&new_title, &new_body, id_num_in, &db).unwrap();
}

fn delete(db: &db::Conn) {


@@ 221,5 208,17 @@ fn delete(db: &db::Conn) {
        return;
    }

    del_stmt.execute(rusqlite::NO_PARAMS).unwrap();
    posts::exec_stmt_no_params(&mut del_stmt).unwrap();
}

#[cfg(test)]
mod tests {
    use super::*;

    // Just a "Don't Panic" test
    #[test]
    fn display() {
        let db = db::Conn::new();
        list_matches(&db);
    }
}

A src/posts.rs => src/posts.rs +79 -0
@@ 0,0 1,79 @@
use crate::db;
use rusqlite;
use std::error::Error;
use users;

type Result<T> = std::result::Result<T, Box<dyn Error>>;

pub fn new(stmt: &mut rusqlite::Statement, title: &str, body: &str) -> Result<()> {
    let user = users::get_current_username()
        .unwrap()
        .into_string()
        .unwrap();

    stmt.execute_named(&[(":title", &title), (":author", &user), (":body", &body)])?;
    Ok(())
}

pub fn update(new_title: &str, new_body: &str, id_num_in: u32, db: &db::Conn) -> Result<()> {
    let new_title = new_title.trim();
    let new_body = new_body.trim();

    let title_stmt = format!("UPDATE posts SET title = :title WHERE id = {}", id_num_in);
    let mut stmt = db.conn.prepare(&title_stmt)?;
    stmt.execute_named(&[(":title", &new_title)])?;
    let body_stmt = format!("UPDATE posts SET body = :body WHERE id = {}", id_num_in);
    let mut stmt = db.conn.prepare(&body_stmt)?;

    stmt.execute_named(&[(":body", &new_body)])?;

    Ok(())
}

pub fn exec_stmt_no_params(stmt: &mut rusqlite::Statement) -> Result<()> {
    stmt.execute(rusqlite::NO_PARAMS)?;

    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;

    fn post_new() {
        let db = db::Conn::new();
        let mut stmt = db
            .conn
            .prepare("INSERT INTO posts (title, author, body) VALUES (:title, :author, :body)")
            .unwrap();

        let title = String::from("TEST TITLE");

        new(&mut stmt, &title, "TEST BODY").unwrap();

        let mut stmt = db
            .conn
            .prepare("SELECT * FROM posts WHERE title = :title")
            .unwrap();

        let out: String = stmt
            .query_row_named(&[(":title", &title)], |row| row.get::<usize, String>(1))
            .unwrap();

        assert_eq!("TEST TITLE", &out);
    }

    #[test]
    fn post_upd8() {
        post_new();
        let db = db::Conn::new();
        update("NEW TITLE", "TEST BODY", 1, &db).unwrap();

        let mut stmt = db.conn.prepare("SELECT * FROM posts WHERE id = 1").unwrap();

        let out: String = stmt
            .query_row(rusqlite::NO_PARAMS, |row| row.get::<usize, String>(1))
            .unwrap();
        assert_eq!("NEW TITLE", &out);
    }
}