diff options
Diffstat (limited to 'src/routes.rs')
-rw-r--r-- | src/routes.rs | 80 |
1 files changed, 70 insertions, 10 deletions
diff --git a/src/routes.rs b/src/routes.rs index 9f0adc5..03a2569 100644 --- a/src/routes.rs +++ b/src/routes.rs | |||
@@ -2,7 +2,7 @@ use warp::{Filter, Rejection, Reply}; | |||
2 | 2 | ||
3 | use crate::custom_filters; | 3 | use crate::custom_filters; |
4 | use crate::handlers; | 4 | use crate::handlers; |
5 | use crate::schema::Db; | 5 | use gradecoin::schema::Db; |
6 | 6 | ||
7 | /// Root, all routes combined | 7 | /// Root, all routes combined |
8 | pub fn consensus_routes(db: Db) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { | 8 | pub fn consensus_routes(db: Db) -> impl Filter<Extract = impl Reply, Error = Rejection> + Clone { |
@@ -65,12 +65,11 @@ mod tests { | |||
65 | // use std::sync::Arc; | 65 | // use std::sync::Arc; |
66 | use warp::http::StatusCode; | 66 | use warp::http::StatusCode; |
67 | 67 | ||
68 | use crate::schema; | 68 | use gradecoin::schema::{create_database, AuthRequest, Block, Transaction}; |
69 | use crate::schema::{AuthRequest, Block, Transaction}; | ||
70 | 69 | ||
71 | /// Create a mock database to be used in tests | 70 | /// Create a mock database to be used in tests |
72 | fn mocked_db() -> Db { | 71 | fn mocked_db() -> Db { |
73 | let db = schema::create_database(); | 72 | let db = create_database(); |
74 | 73 | ||
75 | db.pending_transactions.write().insert( | 74 | db.pending_transactions.write().insert( |
76 | "hash_value".to_owned(), | 75 | "hash_value".to_owned(), |
@@ -88,7 +87,7 @@ mod tests { | |||
88 | "old_transaction_hash_2".to_owned(), | 87 | "old_transaction_hash_2".to_owned(), |
89 | "old_transaction_hash_3".to_owned(), | 88 | "old_transaction_hash_3".to_owned(), |
90 | ], | 89 | ], |
91 | nonce: "not_a_thing_yet".to_owned(), | 90 | nonce: 0, |
92 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 08).and_hms(12, 30, 30), | 91 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 08).and_hms(12, 30, 30), |
93 | hash: "not_a_thing_yet".to_owned(), | 92 | hash: "not_a_thing_yet".to_owned(), |
94 | }; | 93 | }; |
@@ -122,6 +121,26 @@ mod tests { | |||
122 | } | 121 | } |
123 | } | 122 | } |
124 | 123 | ||
124 | /// Create a mock block with a correct mined hash to be used in tests | ||
125 | fn mocked_block() -> Block { | ||
126 | Block { | ||
127 | transaction_list: vec!["hash_value".to_owned()], | ||
128 | nonce: 560108, | ||
129 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 08).and_hms(12, 30, 30), | ||
130 | hash: "c7d053f3e5b056ba948db3f5c0d30408fb0c29a328a0c3c1cf435fb68d700000".to_owned(), | ||
131 | } | ||
132 | } | ||
133 | |||
134 | /// Create a mock block with a wrong hash and nonce | ||
135 | fn mocked_wrong_block() -> Block { | ||
136 | Block { | ||
137 | transaction_list: vec!["foobarbaz".to_owned(), "dazsaz".to_owned()], | ||
138 | nonce: 1000, // can you imagine | ||
139 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 12).and_hms(05, 29, 30), | ||
140 | hash: "tnarstnarsuthnarsthlarjstk".to_owned(), | ||
141 | } | ||
142 | } | ||
143 | |||
125 | /// Test simple GET request to /transaction, resource that exists | 144 | /// Test simple GET request to /transaction, resource that exists |
126 | /// https://tools.ietf.org/html/rfc7231#section-6.3.1 | 145 | /// https://tools.ietf.org/html/rfc7231#section-6.3.1 |
127 | /// We should get the only pending transaction available in the database as json | 146 | /// We should get the only pending transaction available in the database as json |
@@ -160,7 +179,7 @@ mod tests { | |||
160 | 179 | ||
161 | assert_eq!(res.status(), StatusCode::OK); | 180 | assert_eq!(res.status(), StatusCode::OK); |
162 | 181 | ||
163 | let expected_json_body = r#"{"transaction_list":["old_transaction_hash_1","old_transaction_hash_2","old_transaction_hash_3"],"nonce":"not_a_thing_yet","timestamp":"2021-04-08T12:30:30","hash":"not_a_thing_yet"}"#; | 182 | let expected_json_body = r#"{"transaction_list":["old_transaction_hash_1","old_transaction_hash_2","old_transaction_hash_3"],"nonce":0,"timestamp":"2021-04-08T12:30:30","hash":"not_a_thing_yet"}"#; |
164 | assert_eq!(res.body(), expected_json_body); | 183 | assert_eq!(res.body(), expected_json_body); |
165 | } | 184 | } |
166 | 185 | ||
@@ -201,7 +220,48 @@ mod tests { | |||
201 | assert_eq!(db.pending_transactions.read().len(), 2); | 220 | assert_eq!(db.pending_transactions.read().len(), 2); |
202 | } | 221 | } |
203 | 222 | ||
204 | /// TEST a POST request to /transaction, an endpoint that exists | 223 | /// Test a POST request to /block, a resource that exists |
224 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 | ||
225 | /// Should accept the json request, create | ||
226 | /// the block | ||
227 | #[tokio::test] | ||
228 | async fn post_block_201() { | ||
229 | let db = mocked_db(); | ||
230 | let filter = consensus_routes(db.clone()); | ||
231 | |||
232 | let res = warp::test::request() | ||
233 | .method("POST") | ||
234 | .json(&mocked_block()) | ||
235 | .path("/block") | ||
236 | .reply(&filter) | ||
237 | .await; | ||
238 | |||
239 | assert_eq!(res.status(), StatusCode::CREATED); | ||
240 | assert_eq!( | ||
241 | *db.blockchain.read().hash, | ||
242 | "c7d053f3e5b056ba948db3f5c0d30408fb0c29a328a0c3c1cf435fb68d700000".to_owned() | ||
243 | ); | ||
244 | } | ||
245 | |||
246 | /// Test a POST request to /block, a resource that exists | ||
247 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 | ||
248 | /// Should reject the block because of the wrong hash | ||
249 | #[tokio::test] | ||
250 | async fn post_block_wrong_hash() { | ||
251 | let db = mocked_db(); | ||
252 | let filter = consensus_routes(db.clone()); | ||
253 | |||
254 | let res = warp::test::request() | ||
255 | .method("POST") | ||
256 | .json(&mocked_wrong_block()) | ||
257 | .path("/block") | ||
258 | .reply(&filter) | ||
259 | .await; | ||
260 | |||
261 | assert_eq!(res.status(), StatusCode::BAD_REQUEST); | ||
262 | } | ||
263 | |||
264 | /// Test a POST request to /register, an endpoint that exists | ||
205 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 | 265 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 |
206 | /// Should accept the json request, create a new user and | 266 | /// Should accept the json request, create a new user and |
207 | /// add it to the user hashmap in the db | 267 | /// add it to the user hashmap in the db |
@@ -221,9 +281,10 @@ mod tests { | |||
221 | assert_eq!(res.status(), StatusCode::CREATED); | 281 | assert_eq!(res.status(), StatusCode::CREATED); |
222 | assert_eq!(db.users.read().len(), 1); | 282 | assert_eq!(db.users.read().len(), 1); |
223 | } | 283 | } |
224 | /// TEST a POST request to /transaction, an endpoint that exists | 284 | |
285 | /// Test a POST request to /transaction, an endpoint that exists | ||
225 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 | 286 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 |
226 | /// Should NOT accept the json request | 287 | /// Should NOT accept the json request as the user is unpriviliged |
227 | #[tokio::test] | 288 | #[tokio::test] |
228 | async fn post_register_unpriviliged_user() { | 289 | async fn post_register_unpriviliged_user() { |
229 | let db = mocked_db(); | 290 | let db = mocked_db(); |
@@ -261,6 +322,5 @@ mod tests { | |||
261 | } | 322 | } |
262 | } | 323 | } |
263 | 324 | ||
264 | // TODO: POST block test <09-04-21, yigit> // | ||
265 | // TODO: POST block without correct transactions test <09-04-21, yigit> // | 325 | // TODO: POST block without correct transactions test <09-04-21, yigit> // |
266 | // TODO: POST transaction while that source has pending transaction test <09-04-21, yigit> // | 326 | // TODO: POST transaction while that source has pending transaction test <09-04-21, yigit> // |