Skip to content

Commit df1e8f9

Browse files
committed
Refactoring a test
1 parent 77801af commit df1e8f9

File tree

3 files changed

+100
-109
lines changed

3 files changed

+100
-109
lines changed

atcoder-problems-backend/src/server/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ pub(crate) mod virtual_contest;
1313

1414
use actix_web::{http::header, web, App, HttpResponseBuilder, HttpServer};
1515
pub use auth::{Authentication, GitHubAuthentication, GitHubUserResponse};
16+
pub use services::config_services;
1617

1718
const LOG_TEMPLATE: &str = r#"{"method":"%{method}xi", "url":"%U", "status":%s, "duration":%T}"#;
1819

@@ -50,7 +51,7 @@ impl MakeCors for HttpResponseBuilder {
5051
}
5152
}
5253

53-
pub(crate) struct AppData<A> {
54+
pub struct AppData<A> {
5455
pub(crate) authentication: A,
5556
pub(crate) pg_pool: sql_client::PgPool,
5657
}
@@ -65,7 +66,7 @@ impl<A: Clone> Clone for AppData<A> {
6566
}
6667

6768
impl<A> AppData<A> {
68-
fn new(pg_pool: sql_client::PgPool, authentication: A) -> Self {
69+
pub fn new(pg_pool: sql_client::PgPool, authentication: A) -> Self {
6970
Self {
7071
authentication,
7172
pg_pool,

atcoder-problems-backend/src/server/services.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use crate::server::{
2828
},
2929
};
3030

31-
pub(crate) fn config_services<A: Authentication + Clone + Send + Sync + 'static>(
31+
pub fn config_services<A: Authentication + Clone + Send + Sync + 'static>(
3232
cfg: &mut web::ServiceConfig,
3333
) {
3434
log::info!("Configuring routes...");
Lines changed: 96 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
use actix_web::Result;
1+
use actix_web::{test, web, App};
2+
use anyhow::Result;
23
use async_trait::async_trait;
3-
use atcoder_problems_backend::server::{run_server, Authentication, GitHubUserResponse};
4-
use rand::Rng;
4+
use atcoder_problems_backend::server::{
5+
config_services, AppData, Authentication, GitHubUserResponse,
6+
};
7+
use reqwest::StatusCode;
58
use serde_json::{json, Value};
6-
use sql_client::PgPool;
79

810
pub mod utils;
911

@@ -12,50 +14,39 @@ struct MockAuth;
1214

1315
#[async_trait(?Send)]
1416
impl Authentication for MockAuth {
15-
async fn get_token(&self, _: &str) -> Result<String> {
17+
async fn get_token(&self, _: &str) -> actix_web::Result<String> {
1618
unimplemented!()
1719
}
18-
async fn get_user_id(&self, _: &str) -> Result<GitHubUserResponse> {
20+
async fn get_user_id(&self, _: &str) -> actix_web::Result<GitHubUserResponse> {
1921
unimplemented!()
2022
}
2123
}
2224

23-
async fn prepare_data_set(conn: &PgPool) {
25+
#[actix_web::test]
26+
async fn test_ac_ranking() -> Result<()> {
27+
let pg_pool = sql_client::initialize_pool(utils::get_sql_url_from_env()).await?;
28+
sql_client::query("TRUNCATE accepted_count")
29+
.execute(&pg_pool)
30+
.await?;
2431
sql_client::query(
2532
r"INSERT INTO accepted_count (user_id, problem_count) VALUES ('u1', 1), ('u2', 2), ('u3', 1)",
2633
)
27-
.execute(conn)
28-
.await
29-
.unwrap();
30-
}
31-
32-
fn url(path: &str, port: u16) -> String {
33-
format!("http://localhost:{}{}", port, path)
34-
}
35-
36-
async fn setup() -> u16 {
37-
prepare_data_set(&utils::initialize_and_connect_to_test_sql().await).await;
38-
let mut rng = rand::thread_rng();
39-
rng.gen::<u16>() % 30000 + 30000
40-
}
41-
42-
#[actix_web::test]
43-
async fn test_ac_ranking() {
44-
let port = setup().await;
45-
let server = actix_web::rt::spawn(async move {
46-
let pg_pool = sql_client::initialize_pool(utils::get_sql_url_from_env())
47-
.await
48-
.unwrap();
49-
run_server(pg_pool, MockAuth, port).await.unwrap();
50-
});
51-
actix_web::rt::time::sleep(std::time::Duration::from_millis(1000)).await;
52-
53-
let response = reqwest::get(url("/atcoder-api/v3/ac_ranking?from=0&to=10", port))
54-
.await
55-
.unwrap()
56-
.json::<Value>()
57-
.await
58-
.unwrap();
34+
.execute(&pg_pool)
35+
.await?;
36+
let app_data = AppData::new(pg_pool, MockAuth);
37+
let mut app = test::init_service(
38+
App::new()
39+
.app_data(web::Data::new(app_data))
40+
.configure(config_services::<MockAuth>),
41+
)
42+
.await;
43+
44+
let request = test::TestRequest::get()
45+
.uri("/atcoder-api/v3/ac_ranking?from=0&to=10")
46+
.to_request();
47+
let response = test::call_service(&mut app, request).await;
48+
assert_eq!(response.status(), StatusCode::OK);
49+
let response: Value = test::read_body_json(response).await;
5950
assert_eq!(
6051
response,
6152
json!([
@@ -65,12 +56,12 @@ async fn test_ac_ranking() {
6556
])
6657
);
6758

68-
let response = reqwest::get(url("/atcoder-api/v3/ac_ranking?from=1&to=3", port))
69-
.await
70-
.unwrap()
71-
.json::<Value>()
72-
.await
73-
.unwrap();
59+
let request = test::TestRequest::get()
60+
.uri("/atcoder-api/v3/ac_ranking?from=1&to=3")
61+
.to_request();
62+
let response = test::call_service(&mut app, request).await;
63+
assert_eq!(response.status(), StatusCode::OK);
64+
let response: Value = test::read_body_json(response).await;
7465
assert_eq!(
7566
response,
7667
json!([
@@ -79,80 +70,79 @@ async fn test_ac_ranking() {
7970
])
8071
);
8172

82-
let response = reqwest::get(url("/atcoder-api/v3/ac_ranking?from=10&to=0", port))
83-
.await
84-
.unwrap()
85-
.json::<Value>()
86-
.await
87-
.unwrap();
73+
let request = test::TestRequest::get()
74+
.uri("/atcoder-api/v3/ac_ranking?from=10&to=0")
75+
.to_request();
76+
let response = test::call_service(&mut app, request).await;
77+
assert_eq!(response.status(), StatusCode::OK);
78+
let response: Value = test::read_body_json(response).await;
8879
assert_eq!(response.as_array().unwrap().len(), 0);
8980

90-
let response = reqwest::get(url("/atcoder-api/v3/ac_ranking?from=0&to=2000", port))
91-
.await
92-
.unwrap();
93-
assert_eq!(response.status(), 400);
94-
95-
let response = reqwest::get(url("/atcoder-api/v3/ac_ranking?from=-1&to=10", port))
96-
.await
97-
.unwrap();
98-
assert_eq!(response.status(), 400);
99-
100-
let response = reqwest::get(url("/atcoder-api/v3/user/ac_rank?user=u1", port))
101-
.await
102-
.unwrap()
103-
.json::<Value>()
104-
.await
105-
.unwrap();
81+
let request = test::TestRequest::get()
82+
.uri("/atcoder-api/v3/ac_ranking?from=0&to=2000")
83+
.to_request();
84+
let response = test::call_service(&mut app, request).await;
85+
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
86+
87+
let request = test::TestRequest::get()
88+
.uri("/atcoder-api/v3/ac_ranking?from=-1&to=10")
89+
.to_request();
90+
let response = test::call_service(&mut app, request).await;
91+
assert_eq!(response.status(), StatusCode::BAD_REQUEST);
92+
93+
let request = test::TestRequest::get()
94+
.uri("/atcoder-api/v3/user/ac_rank?user=u1")
95+
.to_request();
96+
let response = test::call_service(&mut app, request).await;
97+
assert_eq!(response.status(), StatusCode::OK);
98+
let response: Value = test::read_body_json(response).await;
10699
assert_eq!(response, json!({"count": 1, "rank": 1}));
107100

108-
let response = reqwest::get(url("/atcoder-api/v3/user/ac_rank?user=u2", port))
109-
.await
110-
.unwrap()
111-
.json::<Value>()
112-
.await
113-
.unwrap();
101+
let request = test::TestRequest::get()
102+
.uri("/atcoder-api/v3/user/ac_rank?user=u2")
103+
.to_request();
104+
let response = test::call_service(&mut app, request).await;
105+
assert_eq!(response.status(), StatusCode::OK);
106+
let response: Value = test::read_body_json(response).await;
114107
assert_eq!(response, json!({"count": 2, "rank": 0}));
115108

116-
let response = reqwest::get(url("/atcoder-api/v3/user/ac_rank?user=u3", port))
117-
.await
118-
.unwrap()
119-
.json::<Value>()
120-
.await
121-
.unwrap();
109+
let request = test::TestRequest::get()
110+
.uri("/atcoder-api/v3/user/ac_rank?user=u3")
111+
.to_request();
112+
let response = test::call_service(&mut app, request).await;
113+
assert_eq!(response.status(), StatusCode::OK);
114+
let response: Value = test::read_body_json(response).await;
122115
assert_eq!(response, json!({"count": 1, "rank": 1}));
123116

124-
let response = reqwest::get(url("/atcoder-api/v3/user/ac_rank?user=U1", port))
125-
.await
126-
.unwrap()
127-
.json::<Value>()
128-
.await
129-
.unwrap();
117+
let request = test::TestRequest::get()
118+
.uri("/atcoder-api/v3/user/ac_rank?user=U1")
119+
.to_request();
120+
let response = test::call_service(&mut app, request).await;
121+
assert_eq!(response.status(), StatusCode::OK);
122+
let response: Value = test::read_body_json(response).await;
130123
assert_eq!(response, json!({"count": 1, "rank": 1}));
131124

132-
let response = reqwest::get(url("/atcoder-api/v3/user/ac_rank?user=U2", port))
133-
.await
134-
.unwrap()
135-
.json::<Value>()
136-
.await
137-
.unwrap();
125+
let request = test::TestRequest::get()
126+
.uri("/atcoder-api/v3/user/ac_rank?user=U2")
127+
.to_request();
128+
let response = test::call_service(&mut app, request).await;
129+
assert_eq!(response.status(), StatusCode::OK);
130+
let response: Value = test::read_body_json(response).await;
138131
assert_eq!(response, json!({"count": 2, "rank": 0}));
139132

140-
let response = reqwest::get(url("/atcoder-api/v3/user/ac_rank?user=U3", port))
141-
.await
142-
.unwrap()
143-
.json::<Value>()
144-
.await
145-
.unwrap();
133+
let request = test::TestRequest::get()
134+
.uri("/atcoder-api/v3/user/ac_rank?user=U3")
135+
.to_request();
136+
let response = test::call_service(&mut app, request).await;
137+
assert_eq!(response.status(), StatusCode::OK);
138+
let response: Value = test::read_body_json(response).await;
146139
assert_eq!(response, json!({"count": 1, "rank": 1}));
147140

148-
let response = reqwest::get(url(
149-
"/atcoder-api/v3/user/ac_rank?user=does_not_exist",
150-
port,
151-
))
152-
.await
153-
.unwrap();
154-
assert_eq!(response.status(), 404);
141+
let request = test::TestRequest::get()
142+
.uri("/atcoder-api/v3/user/ac_rank?user=does_not_exist")
143+
.to_request();
144+
let response = test::call_service(&mut app, request).await;
145+
assert_eq!(response.status(), StatusCode::NOT_FOUND);
155146

156-
server.abort();
157-
server.await.unwrap_err();
147+
Ok(())
158148
}

0 commit comments

Comments
 (0)