Skip to content

Commit f70c656

Browse files
authored
Refactor client tests to use TCP requests
1 parent 49a4b2d commit f70c656

File tree

2 files changed

+83
-67
lines changed

2 files changed

+83
-67
lines changed

tests/handle_client.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
use std::net::{TcpListener, TcpStream};
2+
use std::thread;
3+
use std::io::{Read, Write};
4+
use std::sync::Once;
5+
6+
use rust_crud_rest_api::handle_client::handle_client;
7+
8+
static INIT: Once = Once::new();
9+
10+
fn setup() {
11+
INIT.call_once(|| {
12+
});
13+
}
14+
15+
fn mock_database_url() -> String {
16+
"postgres://localhost/test".to_string()
17+
}
18+
19+
fn send_request(request: &str) -> String {
20+
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
21+
let addr = listener.local_addr().unwrap();
22+
23+
24+
let db_url = mock_database_url();
25+
thread::spawn(move || {
26+
if let Ok((stream, _)) = listener.accept() {
27+
handle_client(stream, &db_url);
28+
}
29+
});
30+
31+
let mut stream = TcpStream::connect(addr).unwrap();
32+
stream.write_all(request.as_bytes()).unwrap();
33+
let mut response = String::new();
34+
stream.read_to_string(&mut response).unwrap();
35+
response
36+
}
37+
38+
#[test]
39+
fn test_post_user() {
40+
setup();
41+
let request = "POST /users HTTP/1.1\r\nContent-Type: application/json\r\n\r\n{\"name\":\"Test\",\"email\":\"[email protected]\"}";
42+
let response = send_request(request);
43+
assert!(response.contains("User created"));
44+
}
45+
46+
#[test]
47+
fn test_get_user_not_found() {
48+
setup();
49+
let request = "GET /users/999 HTTP/1.1\r\n\r\n";
50+
let response = send_request(request);
51+
assert!(response.contains("User not found") || response.contains("404"));
52+
}
53+
54+
let req = "POST /users HTTP/1.1\r\n\r\n{\"name\":\"Bob\",\"email\":\"[email protected]\"}";
55+
let (status, body) = handle_post_request(req, &db_url);
56+
assert!(status.contains("200 OK"));
57+
assert_eq!(body, "User created");
58+
59+
let (status, body) = handle_get_all_request("GET /users HTTP/1.1\r\n\r\n", &db_url);
60+
assert!(status.contains("200 OK"));
61+
assert!(body.contains("[email protected]"));
62+
}
63+
64+
#[test]
65+
#[ignore]
66+
fn test_handle_put_and_delete_request() {
67+
let db_url = get_test_db_url();
68+
69+
let req = "POST /users HTTP/1.1\r\n\r\n{\"name\":\"Charlie\",\"email\":\"[email protected]\"}";
70+
let _ = handle_post_request(req, &db_url);
71+
72+
73+
let req = "PUT /users/1 HTTP/1.1\r\n\r\n{\"name\":\"Charles\",\"email\":\"[email protected]\"}";
74+
let (status, body) = handle_put_request(req, &db_url);
75+
assert!(status.contains("200 OK"));
76+
assert_eq!(body, "User updated");
77+
78+
79+
let req = "DELETE /users/1 HTTP/1.1\r\n\r\n";
80+
let (status, body) = handle_delete_request(req, &db_url);
81+
assert!(status.contains("200 OK"));
82+
assert_eq!(body, "User deleted");
83+
}

tests/handle_client_tests.rs

Lines changed: 0 additions & 67 deletions
This file was deleted.

0 commit comments

Comments
 (0)