From 33c5cf0adc42a87aeae5959660f4c4cc0803e173 Mon Sep 17 00:00:00 2001 From: Nick Bland Date: Fri, 5 Nov 2021 14:17:36 +1000 Subject: [PATCH] Update gitignore --- .drone.yml | 30 ++++---- .gitignore | 1 + src/lib.rs | 54 +++++++------- tests/health_check.rs | 164 +++++++++++++++++++++--------------------- 4 files changed, 125 insertions(+), 124 deletions(-) diff --git a/.drone.yml b/.drone.yml index d6a907a..6283309 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,16 +1,16 @@ -kind: pipeline -type: docker -name: mailApp - -trigger: - branch: - - master - event: - - push - -steps: - - name: testBuild - image: rust:1.56 - commands: - - cargo build --verbose --all +kind: pipeline +type: docker +name: mailApp + +trigger: + branch: + - master + event: + - push + +steps: + - name: testBuild + image: rust:1.56 + commands: + - cargo build --verbose --all - cargo test --verbose --all \ No newline at end of file diff --git a/.gitignore b/.gitignore index ea8c4bf..ccb5166 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +.vscode \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 2ac5a1e..b2cc123 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,28 +1,28 @@ -use actix_web::{web, App, HttpResponse, HttpServer}; -use actix_web::dev::Server; -use std::net::TcpListener; - -async fn health_check() -> HttpResponse { - HttpResponse::Ok().finish() -} - -#[derive(serde::Deserialize)] -struct FormData { - email: String, - name: String -} - -async fn subscribe(_form: web::Form) -> HttpResponse { - HttpResponse::Ok().finish() -} - -pub fn run(listener: TcpListener) -> Result { - let server = HttpServer::new(|| { - App::new() - .route("/health_check", web::get().to(health_check)) - .route("/subscriptions", web::post().to(subscribe)) - }) - .listen(listener)? - .run(); - Ok(server) +use actix_web::{web, App, HttpResponse, HttpServer}; +use actix_web::dev::Server; +use std::net::TcpListener; + +async fn health_check() -> HttpResponse { + HttpResponse::Ok().finish() +} + +#[derive(serde::Deserialize)] +struct FormData { + email: String, + name: String +} + +async fn subscribe(_form: web::Form) -> HttpResponse { + HttpResponse::Ok().finish() +} + +pub fn run(listener: TcpListener) -> Result { + let server = HttpServer::new(|| { + App::new() + .route("/health_check", web::get().to(health_check)) + .route("/subscriptions", web::post().to(subscribe)) + }) + .listen(listener)? + .run(); + Ok(server) } \ No newline at end of file diff --git a/tests/health_check.rs b/tests/health_check.rs index 704e879..c4e7579 100644 --- a/tests/health_check.rs +++ b/tests/health_check.rs @@ -1,83 +1,83 @@ -use std::net::TcpListener; - -// Create new instance of the application on a random port and return address [`http://localhost:XXXX`] -fn spawn_app() -> String { - let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind to random port"); - let port = listener.local_addr().unwrap().port(); - - let server = mail_app::run(listener).expect("Failed to bind address"); - - let _ = tokio::spawn(server); - - format!("http://127.0.0.1:{}", port) -} - -#[actix_rt::test] -async fn health_check_works() { - // Arrange - let address = spawn_app(); - let client = reqwest::Client::new(); - - // Perform a 'reqwest' against endpoint - - let response = client - .get(&format!("{}/health_check", &address)) - .send() - .await - .expect("Failed to execute request."); - - // Assert our test - assert!(response.status().is_success()); - assert_eq!(Some(0), response.content_length()); -} - -#[actix_rt::test] -async fn subscribe_returns_200_for_valid_form_data() { - // Arrange - let app_address = spawn_app(); - let client = reqwest::Client::new(); - let body = "name=le%20guin&email=usrula_le_guin%40gmail.com"; - - // Act - let response = client - .post(&format!("{}/subscriptions", &app_address)) - .header("Content-Type", "application/x-www-form-urlencoded") - .body(body) - .send() - .await - .expect("Failed to execute request."); - - // Assert test - assert_eq!(200, response.status().as_u16()); -} - -#[actix_rt::test] -async fn subscrib_returns_400_for_missing_form_data() { - //Arrange - let app_address = spawn_app(); - let client = reqwest::Client::new(); - let test_cases = vec![ - ("name=le%20guin", "missing the email"), - ("email=ursula_le_guin%40gmail.com", "missing the name"), - ("", "missing both name and email") - ]; - - for (invalid_body, error_message) in test_cases { - // Act - let response = client - .post(&format!("{}/subscriptions", &app_address)) - .header("Content-Type", "application/x-www-form-urlencoded") - .body(invalid_body) - .send() - .await - .expect("Failed to execute request."); - - // Assert - assert_eq!( - 400, - response.status().as_u16(), - // Customised error message on test failure - "The API did not fail with 400 Bad Request when the payload was {}.", error_message - ); - } +use std::net::TcpListener; + +// Create new instance of the application on a random port and return address [`http://localhost:XXXX`] +fn spawn_app() -> String { + let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind to random port"); + let port = listener.local_addr().unwrap().port(); + + let server = mail_app::run(listener).expect("Failed to bind address"); + + let _ = tokio::spawn(server); + + format!("http://127.0.0.1:{}", port) +} + +#[actix_rt::test] +async fn health_check_works() { + // Arrange + let address = spawn_app(); + let client = reqwest::Client::new(); + + // Perform a 'reqwest' against endpoint + + let response = client + .get(&format!("{}/health_check", &address)) + .send() + .await + .expect("Failed to execute request."); + + // Assert our test + assert!(response.status().is_success()); + assert_eq!(Some(0), response.content_length()); +} + +#[actix_rt::test] +async fn subscribe_returns_200_for_valid_form_data() { + // Arrange + let app_address = spawn_app(); + let client = reqwest::Client::new(); + let body = "name=le%20guin&email=usrula_le_guin%40gmail.com"; + + // Act + let response = client + .post(&format!("{}/subscriptions", &app_address)) + .header("Content-Type", "application/x-www-form-urlencoded") + .body(body) + .send() + .await + .expect("Failed to execute request."); + + // Assert test + assert_eq!(200, response.status().as_u16()); +} + +#[actix_rt::test] +async fn subscrib_returns_400_for_missing_form_data() { + //Arrange + let app_address = spawn_app(); + let client = reqwest::Client::new(); + let test_cases = vec![ + ("name=le%20guin", "missing the email"), + ("email=ursula_le_guin%40gmail.com", "missing the name"), + ("", "missing both name and email") + ]; + + for (invalid_body, error_message) in test_cases { + // Act + let response = client + .post(&format!("{}/subscriptions", &app_address)) + .header("Content-Type", "application/x-www-form-urlencoded") + .body(invalid_body) + .send() + .await + .expect("Failed to execute request."); + + // Assert + assert_eq!( + 400, + response.status().as_u16(), + // Customised error message on test failure + "The API did not fail with 400 Bad Request when the payload was {}.", error_message + ); + } } \ No newline at end of file