diff options
Diffstat (limited to 'backend/tests')
-rw-r--r-- | backend/tests/bots.rs | 98 | ||||
-rw-r--r-- | backend/tests/login.rs | 61 | ||||
-rw-r--r-- | backend/tests/util/mod.rs | 59 |
3 files changed, 0 insertions, 218 deletions
diff --git a/backend/tests/bots.rs b/backend/tests/bots.rs deleted file mode 100644 index fe81712..0000000 --- a/backend/tests/bots.rs +++ /dev/null @@ -1,98 +0,0 @@ -#![feature(async_closure)] -extern crate mozaic4_backend; -extern crate zip; - -use rocket::http::{ContentType, Status}; - -mod util; -use mozaic4_backend::db::{bots, sessions, users}; -use mozaic4_backend::DbConn; -use sessions::Session; -use users::{Credentials, User}; -use util::{run_test, BearerAuth}; - -async fn user_with_session(conn: &DbConn) -> (User, Session) { - conn.run(|conn| { - let credentials = Credentials { - username: "piepkonijn", - password: "geheim123", - }; - let user = users::create_user(&credentials, conn).unwrap(); - let session = sessions::create_session(&user, conn); - (user, session) - }) - .await -} - -#[rocket::async_test] -async fn test_bot_create() { - run_test(async move |client, conn| { - let (user, session) = user_with_session(&conn).await; - - let response = client - .post("/bots") - .header(BearerAuth::new(session.token.clone())) - .header(ContentType::JSON) - .body( - r#"{ - "name": "testbot" - }"#, - ) - .dispatch() - .await; - - assert_eq!(response.status(), Status::Created); - assert_eq!(response.content_type(), Some(ContentType::JSON)); - - let resp_text = response.into_string().await.unwrap(); - let json: serde_json::Value = serde_json::from_str(&resp_text).unwrap(); - assert_eq!(json["name"], "testbot"); - assert_eq!(json["owner_id"], user.id); - }) - .await -} - -// create an example zipfile for bot upload -fn create_zip() -> std::io::Result<Vec<u8>> { - use std::io::Write; - use zip::write::FileOptions; - - let cursor = std::io::Cursor::new(Vec::new()); - let mut zip = zip::ZipWriter::new(cursor); - - zip.start_file("test.txt", FileOptions::default())?; - zip.write_all(b"sup brudi")?; - let buf = zip.finish()?; - Ok(buf.into_inner()) -} - -#[rocket::async_test] -async fn test_bot_upload() { - run_test(async move |client, conn| { - let (user, session) = user_with_session(&conn).await; - - let owner_id = user.id; - let bot = conn - .run(move |conn| { - let new_bot = bots::NewBot { - name: "testbot", - owner_id: owner_id, - }; - bots::create_bot(&new_bot, conn).unwrap() - }) - .await; - - let zip_file = create_zip().unwrap(); - - let response = client - .post(format!("/bots/{}/upload", bot.id)) - .header(BearerAuth::new(session.token.clone())) - .header(ContentType::JSON) - .body(zip_file) - .dispatch() - .await; - - assert_eq!(response.status(), Status::Created); - }) - .await -} diff --git a/backend/tests/login.rs b/backend/tests/login.rs deleted file mode 100644 index 60c5d6f..0000000 --- a/backend/tests/login.rs +++ /dev/null @@ -1,61 +0,0 @@ -#![feature(async_closure)] -extern crate mozaic4_backend; - -use rocket::http::{ContentType, Status}; - -mod util; -use util::run_test; - -#[rocket::async_test] -async fn test_registration() { - run_test(async move |client, _conn| { - let response = client - .post("/register") - .header(ContentType::JSON) - .body(r#"{"username": "piepkonijn", "password": "geheim123"}"#) - .dispatch() - .await; - - assert_eq!(response.status(), Status::Ok); - assert_eq!(response.content_type(), Some(ContentType::JSON)); - - let response = client - .post("/login") - .header(ContentType::JSON) - .body(r#"{"username": "piepkonijn", "password": "geheim123"}"#) - .dispatch() - .await; - - assert_eq!(response.status(), Status::Ok); - let token = response.into_string().await.unwrap(); - - let response = client - .get("/users/me") - .header(util::BearerAuth::new(token)) - .dispatch() - .await; - - assert_eq!(response.status(), Status::Ok); - assert_eq!(response.content_type(), Some(ContentType::JSON)); - let resp = response.into_string().await.unwrap(); - let json: serde_json::Value = serde_json::from_str(&resp).unwrap(); - assert_eq!(json["username"], "piepkonijn"); - }) - .await -} - -#[rocket::async_test] -async fn test_reject_invalid_credentials() { - run_test(async move |client, _conn| { - let response = client - .post("/login") - .header(ContentType::JSON) - .body(r#"{"username": "piepkonijn", "password": "letmeinplease"}"#) - .dispatch() - .await; - - assert_eq!(response.status(), Status::Forbidden); - // assert_eq!(response.content_type(), Some(ContentType::JSON)); - }) - .await -} diff --git a/backend/tests/util/mod.rs b/backend/tests/util/mod.rs deleted file mode 100644 index f34e9f3..0000000 --- a/backend/tests/util/mod.rs +++ /dev/null @@ -1,59 +0,0 @@ -use std::future::Future; - -use diesel::RunQueryDsl; -use mozaic4_backend::DbConn; -use rocket::{http::Header, local::asynchronous::Client}; - -// We use a lock to synchronize between tests so DB operations don't collide. -// For now. In the future, we'll have a nice way to run each test in a DB -// transaction so we can regain concurrency. -static DB_LOCK: parking_lot::Mutex<()> = parking_lot::const_mutex(()); - -async fn reset_db(db: &DbConn) { - db.run(|conn| { - diesel::sql_query( - r#" - TRUNCATE TABLE users, sessions, - bots, code_bundles"#, - ) - .execute(conn) - .expect("drop all tables"); - }) - .await -} - -pub async fn run_test<F, R>(test_closure: F) -where - F: FnOnce(Client, DbConn) -> R, - R: Future<Output = ()>, -{ - let _lock = DB_LOCK.lock(); - - let client = Client::untracked(mozaic4_backend::rocket()) - .await - .expect("failed to create test client"); - let db = mozaic4_backend::DbConn::get_one(client.rocket()) - .await - .expect("failed to get db connection"); - - // make sure we start with a clean DB - reset_db(&db).await; - - test_closure(client, db).await; -} - -pub struct BearerAuth { - token: String, -} - -impl BearerAuth { - pub fn new(token: String) -> Self { - Self { token } - } -} - -impl<'a> Into<Header<'a>> for BearerAuth { - fn into(self) -> Header<'a> { - Header::new("Authorization", format!("Bearer {}", self.token)) - } -} |