Skip to content

Commit 4a36739

Browse files
1nteger-cutilForever
authored andcommitted
test: add test code
1 parent f7f78ea commit 4a36739

File tree

4 files changed

+448
-0
lines changed

4 files changed

+448
-0
lines changed

Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ dotenv = "0.15.0"
2020
serde = { version = "1.0.152", features = ["derive"] }
2121
sqlx = { version = "0.6.2", features = ["runtime-async-std-native-tls", "postgres", "chrono"] }
2222
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
23+
24+
[dev-dependencies]
25+
reqwest = { version = "0.11.14", features = ["json", "cookies"] }
26+
serde_json = "1.0.91"
27+
uuid = { version = "1", features = ["v4"] }

tests/event_check.rs

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
use reqwest::{Client, Response};
2+
use serde::Deserialize;
3+
use serde_json::{Map, Number, Value};
4+
5+
mod helper;
6+
use helper::{login, test_run, TestApp};
7+
8+
#[derive(Deserialize)]
9+
struct IdRow {
10+
pub id: i32,
11+
}
12+
13+
async fn create_event(
14+
app: &TestApp,
15+
client: &Client,
16+
note: &str,
17+
event_date: &str,
18+
) -> Result<Response, std::io::Error> {
19+
let mut map = Map::new();
20+
map.insert("note".to_string(), Value::String(note.to_string()));
21+
map.insert(
22+
"event_date".to_string(),
23+
Value::String(event_date.to_string()),
24+
);
25+
let response = client
26+
.post(&format!("{}/event", &app.address))
27+
.json(&map)
28+
.send()
29+
.await
30+
.expect("Failed to execute request.");
31+
Ok(response)
32+
}
33+
34+
async fn patch_event(
35+
app: &TestApp,
36+
client: &Client,
37+
id: i32,
38+
new_note: &str,
39+
new_event_date: &str,
40+
) -> Result<Response, std::io::Error> {
41+
let mut map = Map::new();
42+
map.insert("id".to_string(), Value::Number(Number::from(id)));
43+
map.insert("new_note".to_string(), Value::String(new_note.to_string()));
44+
map.insert(
45+
"new_event_date".to_string(),
46+
Value::String(new_event_date.to_string()),
47+
);
48+
let response = client
49+
.patch(&format!("{}/event", &app.address))
50+
.json(&map)
51+
.send()
52+
.await
53+
.expect("Failed to execute request.");
54+
Ok(response)
55+
}
56+
57+
async fn delete_event(app: &TestApp, client: &Client, id: i32) -> Result<Response, std::io::Error> {
58+
let mut map = Map::new();
59+
map.insert("id".to_string(), Value::Number(Number::from(id)));
60+
let response = client
61+
.delete(&format!("{}/event", &app.address))
62+
.json(&map)
63+
.send()
64+
.await
65+
.expect("Failed to execute request.");
66+
Ok(response)
67+
}
68+
69+
#[tokio::test]
70+
async fn create_event_works() {
71+
let app = test_run().await;
72+
let client = reqwest::Client::builder()
73+
.cookie_store(true)
74+
.build()
75+
.expect("Failed to create Client");
76+
77+
login(&app, &client, "admin", "secret")
78+
.await
79+
.expect("Failed to login as admin");
80+
81+
let response: Response = create_event(&app, &client, "test_note", "2022-01-01")
82+
.await
83+
.expect("Failed to create event.");
84+
assert!(response.status().is_success());
85+
86+
let ret: IdRow = response.json().await.expect("Failed to get the json");
87+
assert_eq!(ret.id, 1)
88+
}
89+
90+
#[tokio::test]
91+
async fn patch_event_works() {
92+
let app = test_run().await;
93+
let client = reqwest::Client::builder()
94+
.cookie_store(true)
95+
.build()
96+
.expect("Failed to create Client");
97+
98+
login(&app, &client, "admin", "secret")
99+
.await
100+
.expect("Failed to login as admin");
101+
102+
let event_id = {
103+
let response: Response = create_event(&app, &client, "test_note", "2022-01-01")
104+
.await
105+
.expect("Failed to create event.");
106+
let ret: IdRow = response.json().await.expect("Failed to get the json");
107+
ret.id
108+
};
109+
assert_eq!(event_id, 1);
110+
111+
let response: Response = patch_event(&app, &client, event_id, "new_note", "2023-01-01")
112+
.await
113+
.expect("Failed to patch event");
114+
assert!(response.status().is_success());
115+
}
116+
117+
#[tokio::test]
118+
async fn patch_event_returns_a_400_for_invalid_id() {
119+
let app = test_run().await;
120+
let client = reqwest::Client::builder()
121+
.cookie_store(true)
122+
.build()
123+
.expect("Failed to create Client");
124+
125+
login(&app, &client, "admin", "secret")
126+
.await
127+
.expect("Failed to login as admin");
128+
let event_id = {
129+
let response: Response = create_event(&app, &client, "test_note", "2022-01-01")
130+
.await
131+
.expect("Failed to create event.");
132+
let ret: IdRow = response.json().await.expect("Failed to get the json");
133+
ret.id
134+
};
135+
assert_eq!(event_id, 1);
136+
137+
let response: Response = patch_event(&app, &client, event_id + 1, "new_note", "2023-01-01")
138+
.await
139+
.expect("Failed to patch event");
140+
assert_eq!(400, response.status().as_u16());
141+
}
142+
143+
#[tokio::test]
144+
async fn delete_event_works() {
145+
let app = test_run().await;
146+
let client = reqwest::Client::builder()
147+
.cookie_store(true)
148+
.build()
149+
.expect("Failed to create Client");
150+
151+
login(&app, &client, "admin", "secret")
152+
.await
153+
.expect("Failed to login as admin");
154+
let event_id = {
155+
let response: Response = create_event(&app, &client, "test_note", "2022-01-01")
156+
.await
157+
.expect("Failed to create event.");
158+
let ret: IdRow = response.json().await.expect("Failed to get the json");
159+
ret.id
160+
};
161+
let response: Response = delete_event(&app, &client, event_id)
162+
.await
163+
.expect("Failed to patch event");
164+
165+
assert!(response.status().is_success());
166+
}

tests/helper.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
use actix_session::storage::RedisSessionStore;
2+
use dotenv::dotenv;
3+
use godsaeng_backend::runner::run;
4+
use reqwest::{Client, Response};
5+
use serde_json::{Map, Value};
6+
use sqlx::{Connection, Executor, PgConnection, PgPool};
7+
use std::net::TcpListener;
8+
9+
use uuid::Uuid;
10+
11+
pub struct TestApp {
12+
pub address: String,
13+
pub db_pool: PgPool,
14+
}
15+
16+
pub async fn test_run() -> TestApp {
17+
let listener = TcpListener::bind("127.0.0.1:0").expect("Failed to bind random port");
18+
let port = listener.local_addr().unwrap().port();
19+
let address = format!("http://127.0.0.1:{}", port);
20+
21+
dotenv().ok();
22+
let db_url = std::env::var("TEST_DATABASE_URL").expect("DATABASE_URL must be set");
23+
let test_database = format!("{}/postgres", db_url);
24+
25+
let mut connection = PgConnection::connect(&test_database)
26+
.await
27+
.expect("Failed to connect to Postgres");
28+
29+
let database_name = Uuid::new_v4().to_string();
30+
31+
connection
32+
.execute(&*format!(r#"CREATE DATABASE "{}";"#, database_name))
33+
.await
34+
.expect("Failed to create database.");
35+
36+
let test_database_url = format!("{}/{}", db_url, database_name);
37+
println!("{}", test_database_url);
38+
let connection_pool = PgPool::connect(&test_database_url)
39+
.await
40+
.expect("Failed to connect to Postgres");
41+
42+
sqlx::migrate!("./migrations")
43+
.run(&connection_pool)
44+
.await
45+
.expect("Failed to migrate the database");
46+
let store = {
47+
let redis_url = std::env::var("REDIS_URL").expect("REDI must be set");
48+
RedisSessionStore::new(redis_url).await.unwrap()
49+
};
50+
let secret_key = std::env::var("SECRET_KEY").expect("SECRET_KEY must be set");
51+
let server =
52+
run(listener, connection_pool.clone(), store, secret_key).expect("Failed to bind address");
53+
let _ = tokio::spawn(server);
54+
55+
TestApp {
56+
address,
57+
db_pool: connection_pool,
58+
}
59+
}
60+
61+
pub async fn login(
62+
app: &TestApp,
63+
client: &Client,
64+
name: &str,
65+
password: &str,
66+
) -> Result<Response, std::io::Error> {
67+
let mut map = Map::new();
68+
map.insert("name".to_string(), Value::String(name.to_string()));
69+
map.insert("password".to_string(), Value::String(password.to_string()));
70+
let response = client
71+
.post(&format!("{}/login", &app.address))
72+
.json(&map)
73+
.send()
74+
.await
75+
.expect("Failed to execute request.");
76+
Ok(response)
77+
}

0 commit comments

Comments
 (0)