diff options
author | Yigit Sever | 2021-04-14 00:09:45 +0300 |
---|---|---|
committer | Yigit Sever | 2021-04-14 00:09:45 +0300 |
commit | 891d0cb87ad98052cbd26692b61f31da9902dee1 (patch) | |
tree | 50120a3f9d894ec1fd4e9f1bd03e76850f92533a | |
parent | 51d82346d53a9b435fbbdb65ab0fceb8ce130b32 (diff) | |
download | gradecoin-891d0cb87ad98052cbd26692b61f31da9902dee1.tar.gz gradecoin-891d0cb87ad98052cbd26692b61f31da9902dee1.tar.bz2 gradecoin-891d0cb87ad98052cbd26692b61f31da9902dee1.zip |
Revise tests
-rwxr-xr-x | tester.sh | 23 | ||||
-rw-r--r-- | tests/route_tests.rs | 149 |
2 files changed, 85 insertions, 87 deletions
@@ -96,3 +96,26 @@ curl localhost:8080/transaction | |||
96 | 96 | ||
97 | printf "\n\nShould have only one block\n\n" | 97 | printf "\n\nShould have only one block\n\n" |
98 | curl localhost:8080/block | 98 | curl localhost:8080/block |
99 | |||
100 | ## new registration request | ||
101 | ## this student can hold a gradecoin account | ||
102 | curl --request POST \ | ||
103 | --header 'Content-Type: application/json' \ | ||
104 | --data '{ | ||
105 | "student_id": "e254275", | ||
106 | "public_key": "not_implemented_yet" | ||
107 | }' \ | ||
108 | http://localhost:8080/register | ||
109 | |||
110 | curl --request POST \ | ||
111 | --header 'Content-Type: application/json' \ | ||
112 | --header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0aGEiOiIyYjY0OGZmYWI1ZDlhZjFkNWQ1ZmMwNTJmYzllNTFiODgyZmM0ZmIwYzk5ODYwOGM5OTIzMmY5MjgyMDAwMDAwIiwiaWF0IjoxNjE4MzYwNjQxLCJleHAiOjE3MTgyNjA2NDF9.P5L_uZ9lOhRZCbsG9GDXn_rmZat3dP9Y2lbk8GY4Kg4pOxJIklBUxot-TtJzB0vEJFcjnxVnT2lFLCgfdQLHTJvURiW0KRHi94e1Kj8aDXxJ0qjlq4-c1JCZnAIbDpvkFtHNKz04yfyeSR2htJ6kOjlqVpeUhLVokHhi1x-ZUZZSpeGnlIXgi-AcmkEoyOypZGSZgQ1hjID2f18zgfbshgPK4Dr0hiN36wYMB0y0YiikRbvDuGgDzRLN2nitih46-CXTGZMqIRz3eAfM2wuUSH1yhdKi5_vavz8L3EPVCGMO-CKlPUDkYA-duQZf_q3tG2fkdaFlTAcCik_kVMprdw' \ | ||
113 | --data '{ | ||
114 | "transaction_list": [ | ||
115 | "e254275" | ||
116 | ], | ||
117 | "nonce": 2151653522, | ||
118 | "timestamp": "2021-04-13T23:38:00", | ||
119 | "hash": "000000a996ab57b3aff1ad1d009767278f819895b28ef860a8ec3b6560d6ed0e" | ||
120 | }' \ | ||
121 | http://localhost:8080/block | ||
diff --git a/tests/route_tests.rs b/tests/route_tests.rs index 57c4870..d24bbfb 100644 --- a/tests/route_tests.rs +++ b/tests/route_tests.rs | |||
@@ -1,41 +1,10 @@ | |||
1 | #[cfg(test)] | 1 | #[cfg(test)] |
2 | mod tests { | 2 | mod tests { |
3 | use gradecoin::schema::{ | 3 | use gradecoin::schema::{create_database, AuthRequest, Block, Db, MetuId, Transaction, User}; |
4 | create_database, AuthRequest, Block, Claims, Db, MetuId, Transaction, User, | ||
5 | }; | ||
6 | 4 | ||
7 | use gradecoin::routes::consensus_routes; | 5 | use gradecoin::routes::consensus_routes; |
8 | use warp::http::StatusCode; | 6 | use warp::http::StatusCode; |
9 | 7 | ||
10 | use jsonwebtoken::{encode, Algorithm, EncodingKey, Header}; | ||
11 | const PRIVATE_KEY_PEM: &str = "-----BEGIN RSA PRIVATE KEY----- | ||
12 | MIIEpAIBAAKCAQEA4nU0G4WjkmcQUx0hq6LQuV5Q+ACmUFL/OjoYMDwC/O/6pCd1 | ||
13 | UZgCfgHN2xEffDPznzcTn8OiFRxr4oWyBinyrUpnY4mhy0SQUwoeCw7YkcHAyhCj | ||
14 | NT74aR/ohX0MCj0qRRdbt5ZQXM/GC3HJuXE1ptSuhFgQxziItamn8maoJ6JUSVEX | ||
15 | VO1NOrrjoM3r7Q+BK2B+sX4/bLZ+VG5g1q2nEbFdTHS6pHqtZNHQndTmEKwRfh0R | ||
16 | YtzEzOXuO6e1gQY42Tujkof40dhGCIU7TeIGGHwdFxy1niLkXwtHNjV7lnIOkTbx | ||
17 | 6+sSPamRfQAlZqUWM2Lf5o+7h3qWP3ENB138sQIDAQABAoIBAD23nYTmrganag6M | ||
18 | wPFrBSGP79c3Lhx0EjUHQjJbGKFgsdltG48qM3ut+DF9ACy0Z+/7bbC7+39vaIOq | ||
19 | 1jLR2d6aiYTaLKseO4s2FawD1sgamvU3BZPsXn0gAhnnU5Gyy8Nas1dccvhoc9wI | ||
20 | neaZUPrvucQ90AzLfo6r9yacDbYHB1lOyomApUvpJxOgHISGEtc9qGPDrdH19aF0 | ||
21 | 8fCv2bbQRh+TChgN3IB0o5w0wXaI7YAyAouAv/AzHCoEMpt7OGjFTkjh/ujlPL9O | ||
22 | +FLuJNsQRHDN0gJo2pcvwGwDCsioMixQ9bZ7ZrUu2BNpEQygyeSbj9ZI1iRvhosO | ||
23 | JU3rwEECgYEA9MppTYA6A9WQbCCwPH1QMpUAmPNVSWVhUVag4lGOEhdCDRcz9ook | ||
24 | DohQMKctiEB1luKuvDokxo0uMOfMO9/YwjsRB7qjQip7Th1zMJIjD+A+juLzHK4r | ||
25 | /RiRtWYGAnF8mptDvE+93JsPb3C/lQLvIhio5GQYWBqPJu6SpeosIskCgYEA7NPi | ||
26 | Gbffzr2UQhW8BNKmctEEh8yFRVojFo3wwwWxSNUVXGSmSm31CL+Q8h817R+2OkPV | ||
27 | 1ZMUOBU4UJiqFt28kIvTDFqbAJlJQGCpY2mY7OLQiD2A+TVLcFrHmoCaPfCAK1Qd | ||
28 | hQ0PmFK7Mf8qClpA3E5chop/WfKQfiu46sZv1qkCgYAhGdXPcw1lQ1W6KVlrdI6J | ||
29 | qHhiNlVMDXdxZkNvFxQdAiQeXQrbxaZGiMw/J/wSNpUwCAsUzM/4QVMDrfSCDCzl | ||
30 | ZtNQtj4pTlFKKNVQthIjrXEIJUw2jp7IJLBfVSJu5iWxSlmId0f3MsiNizN81N69 | ||
31 | P5Rm/doE3+KHoy8VXGsHcQKBgQCkNh62enqjHWypjex6450qS6f6iWN3PRLLVsw0 | ||
32 | TcQpniZblCaBwVCAKmRUnjOEIdL2/4ZLutnwMTaFG/YEOOfAylMiY8jKV38lNmD9 | ||
33 | X4D78CFr9klxgvS2CRwSE03f2NzmLkLxuKaxldvaxPTfjMkgeO1LFMlNExYBhkuH | ||
34 | 7uQpUQKBgQCKX6qMNh2gSdgG7qyxfTFZ4y5EGOBoKe/dE+IcVF3Vnh6DZVbCAbBL | ||
35 | 5EdFWZSrCnDjA4xiKW55mwp95Ud9EZsZAb13L8V9t82eK+UDBoWlb7VRNYpda/x1 | ||
36 | 5/i4qQJ28x2UNJDStpYFpnp4Ba1lvXjKngIbDPkjU+hbBJ+BNGAIeg== | ||
37 | -----END RSA PRIVATE KEY-----"; | ||
38 | |||
39 | /// Create a mock database to be used in tests | 8 | /// Create a mock database to be used in tests |
40 | fn mocked_db() -> Db { | 9 | fn mocked_db() -> Db { |
41 | let db = create_database(); | 10 | let db = create_database(); |
@@ -59,45 +28,30 @@ sQIDAQAB | |||
59 | ); | 28 | ); |
60 | 29 | ||
61 | db.pending_transactions.write().insert( | 30 | db.pending_transactions.write().insert( |
62 | "hash_value".to_owned(), | 31 | "source_public_key_signature".to_owned(), |
63 | Transaction { | 32 | Transaction { |
64 | by: "source_account".to_owned(), | 33 | by: "source_public_key_signature".to_owned(), |
65 | source: "source_account".to_owned(), | 34 | source: "source_public_key_signature".to_owned(), |
66 | target: "target_account".to_owned(), | 35 | target: "target_public_key_signature".to_owned(), |
67 | amount: 20, | 36 | amount: 3, |
68 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 09).and_hms(1, 30, 30), | 37 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 13).and_hms(20, 55, 30), |
69 | }, | 38 | }, |
70 | ); | 39 | ); |
71 | 40 | ||
72 | *db.blockchain.write() = Block { | 41 | *db.blockchain.write() = Block { |
73 | transaction_list: vec![ | 42 | transaction_list: vec![ |
74 | "old_transaction_hash_1".to_owned(), | 43 | "foo_public_key_signature".to_owned(), |
75 | "old_transaction_hash_2".to_owned(), | 44 | "bar_public_key_signature".to_owned(), |
76 | "old_transaction_hash_3".to_owned(), | 45 | "baz_public_key_signature".to_owned(), |
77 | ], | 46 | ], |
78 | nonce: 0, | 47 | nonce: 6920405, |
79 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 08).and_hms(12, 30, 30), | 48 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 13).and_hms(20, 55, 00), |
80 | hash: "not_a_thing_yet".to_owned(), | 49 | hash: "0000009745f2f09c968c095af75e8ab87eba9be90a93e5df464f83ea7ec08537".to_owned(), |
81 | }; | 50 | }; |
82 | 51 | ||
83 | db | 52 | db |
84 | } | 53 | } |
85 | 54 | ||
86 | fn mocked_jwt() -> String { | ||
87 | let claims = Claims { | ||
88 | tha: "6692e774eba7fb92dc0fe6cf7347591e".to_owned(), | ||
89 | iat: 1618275851, | ||
90 | exp: 1648275851, | ||
91 | }; | ||
92 | let header = Header::new(Algorithm::RS256); | ||
93 | encode( | ||
94 | &header, | ||
95 | &claims, | ||
96 | &EncodingKey::from_rsa_pem(PRIVATE_KEY_PEM.as_bytes()).unwrap(), | ||
97 | ) | ||
98 | .unwrap() | ||
99 | } | ||
100 | |||
101 | /// Create a mock user that is allowed to be in gradecoin to be used in tests | 55 | /// Create a mock user that is allowed to be in gradecoin to be used in tests |
102 | fn priviliged_mocked_user() -> AuthRequest { | 56 | fn priviliged_mocked_user() -> AuthRequest { |
103 | AuthRequest { | 57 | AuthRequest { |
@@ -125,26 +79,6 @@ sQIDAQAB | |||
125 | } | 79 | } |
126 | } | 80 | } |
127 | 81 | ||
128 | /// Create a mock block with a correct mined hash to be used in tests | ||
129 | fn mocked_block() -> Block { | ||
130 | Block { | ||
131 | transaction_list: vec!["hash_value".to_owned()], | ||
132 | nonce: 3831993, | ||
133 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 08).and_hms(12, 30, 30), | ||
134 | hash: "2b648ffab5d9af1d5d5fc052fc9e51b882fc4fb0c998608c99232f9282000000".to_owned(), | ||
135 | } | ||
136 | } | ||
137 | |||
138 | /// Create a mock block with a wrong hash and nonce | ||
139 | fn mocked_wrong_block() -> Block { | ||
140 | Block { | ||
141 | transaction_list: vec!["foobarbaz".to_owned(), "dazsaz".to_owned()], | ||
142 | nonce: 1000, // can you imagine | ||
143 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 12).and_hms(05, 29, 30), | ||
144 | hash: "tnarstnarsuthnarsthlarjstk".to_owned(), | ||
145 | } | ||
146 | } | ||
147 | |||
148 | /// Test simple GET request to /transaction, an endpoint that exists | 82 | /// Test simple GET request to /transaction, an endpoint that exists |
149 | /// https://tools.ietf.org/html/rfc7231#section-6.3.1 | 83 | /// https://tools.ietf.org/html/rfc7231#section-6.3.1 |
150 | /// We should get the only pending transaction available in the database as json | 84 | /// We should get the only pending transaction available in the database as json |
@@ -162,7 +96,7 @@ sQIDAQAB | |||
162 | 96 | ||
163 | assert_eq!(res.status(), StatusCode::OK); | 97 | assert_eq!(res.status(), StatusCode::OK); |
164 | 98 | ||
165 | let expected_json_body = r#"[{"by":"source_account","source":"source_account","target":"target_account","amount":20,"timestamp":"2021-04-09T01:30:30"}]"#; | 99 | let expected_json_body = r#"[{"by":"source_public_key_signature","source":"source_public_key_signature","target":"target_public_key_signature","amount":3,"timestamp":"2021-04-13T20:55:30"}]"#; |
166 | 100 | ||
167 | assert_eq!(res.body(), expected_json_body); | 101 | assert_eq!(res.body(), expected_json_body); |
168 | } | 102 | } |
@@ -185,7 +119,7 @@ sQIDAQAB | |||
185 | 119 | ||
186 | assert_eq!(res.status(), StatusCode::OK); | 120 | assert_eq!(res.status(), StatusCode::OK); |
187 | 121 | ||
188 | 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"}"#; | 122 | let expected_json_body = r#"{"transaction_list":["foo_public_key_signature","bar_public_key_signature","baz_public_key_signature"],"nonce":6920405,"timestamp":"2021-04-13T20:55:00","hash":"0000009745f2f09c968c095af75e8ab87eba9be90a93e5df464f83ea7ec08537"}"#; |
189 | assert_eq!(res.body(), expected_json_body); | 123 | assert_eq!(res.body(), expected_json_body); |
190 | } | 124 | } |
191 | 125 | ||
@@ -269,25 +203,30 @@ sQIDAQAB | |||
269 | 203 | ||
270 | let res = warp::test::request() | 204 | let res = warp::test::request() |
271 | .method("POST") | 205 | .method("POST") |
272 | .json(&mocked_block()) | 206 | .json(&Block { |
207 | transaction_list: vec!["mock_transaction_source".to_owned()], | ||
208 | nonce: 2686215, | ||
209 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 13).and_hms(23, 38, 00), | ||
210 | hash: "0000007c52e4486359f62b2d19781fafaf059bd691bc6d835b666f6eac1d01d9".to_owned(), | ||
211 | } ) | ||
273 | .header("Authorization", "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0aGEiOiIyYjY0OGZmYWI1ZDlhZjFkNWQ1ZmMwNTJmYzllNTFiODgyZmM0ZmIwYzk5ODYwOGM5OTIzMmY5MjgyMDAwMDAwIiwiaWF0IjoxNjE4MzYwNjQxLCJleHAiOjE3MTgyNjA2NDF9.P5L_uZ9lOhRZCbsG9GDXn_rmZat3dP9Y2lbk8GY4Kg4pOxJIklBUxot-TtJzB0vEJFcjnxVnT2lFLCgfdQLHTJvURiW0KRHi94e1Kj8aDXxJ0qjlq4-c1JCZnAIbDpvkFtHNKz04yfyeSR2htJ6kOjlqVpeUhLVokHhi1x-ZUZZSpeGnlIXgi-AcmkEoyOypZGSZgQ1hjID2f18zgfbshgPK4Dr0hiN36wYMB0y0YiikRbvDuGgDzRLN2nitih46-CXTGZMqIRz3eAfM2wuUSH1yhdKi5_vavz8L3EPVCGMO-CKlPUDkYA-duQZf_q3tG2fkdaFlTAcCik_kVMprdw") | 212 | .header("Authorization", "Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0aGEiOiIyYjY0OGZmYWI1ZDlhZjFkNWQ1ZmMwNTJmYzllNTFiODgyZmM0ZmIwYzk5ODYwOGM5OTIzMmY5MjgyMDAwMDAwIiwiaWF0IjoxNjE4MzYwNjQxLCJleHAiOjE3MTgyNjA2NDF9.P5L_uZ9lOhRZCbsG9GDXn_rmZat3dP9Y2lbk8GY4Kg4pOxJIklBUxot-TtJzB0vEJFcjnxVnT2lFLCgfdQLHTJvURiW0KRHi94e1Kj8aDXxJ0qjlq4-c1JCZnAIbDpvkFtHNKz04yfyeSR2htJ6kOjlqVpeUhLVokHhi1x-ZUZZSpeGnlIXgi-AcmkEoyOypZGSZgQ1hjID2f18zgfbshgPK4Dr0hiN36wYMB0y0YiikRbvDuGgDzRLN2nitih46-CXTGZMqIRz3eAfM2wuUSH1yhdKi5_vavz8L3EPVCGMO-CKlPUDkYA-duQZf_q3tG2fkdaFlTAcCik_kVMprdw") |
274 | .path("/block") | 213 | .path("/block") |
275 | .reply(&filter) | 214 | .reply(&filter) |
276 | .await; | 215 | .await; |
277 | 216 | ||
278 | assert_eq!(res.status(), StatusCode::CREATED); | 217 | // should be reflectled on the db as well |
279 | assert_eq!( | 218 | assert_eq!( |
280 | *db.blockchain.read().hash, | 219 | *db.blockchain.read().hash, |
281 | "2b648ffab5d9af1d5d5fc052fc9e51b882fc4fb0c998608c99232f9282000000".to_owned() | 220 | "0000007c52e4486359f62b2d19781fafaf059bd691bc6d835b666f6eac1d01d9".to_owned() |
282 | ); | 221 | ); |
222 | assert_eq!(res.status(), StatusCode::CREATED); | ||
283 | } | 223 | } |
284 | 224 | ||
285 | /// Test a POST request to /block, an endpoint that exists | 225 | /// Test a POST request to /block, an endpoint that exists |
286 | /// | 226 | /// |
287 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 | 227 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 |
288 | /// | 228 | /// |
289 | /// Should reject the block because of the wrong hash/nonce | 229 | /// Should reject the block because there aren't enough zeroes in the hash |
290 | /// // TODO: split this into two tests | ||
291 | #[tokio::test] | 230 | #[tokio::test] |
292 | async fn post_block_wrong_hash() { | 231 | async fn post_block_wrong_hash() { |
293 | let db = mocked_db(); | 232 | let db = mocked_db(); |
@@ -295,12 +234,48 @@ sQIDAQAB | |||
295 | 234 | ||
296 | let res = warp::test::request() | 235 | let res = warp::test::request() |
297 | .method("POST") | 236 | .method("POST") |
298 | .json(&mocked_wrong_block()) | 237 | .json(&Block { |
238 | transaction_list: vec!["foobarbaz".to_owned(), "dazsaz".to_owned()], | ||
239 | nonce: 1000, // not valid | ||
240 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 12).and_hms(05, 29, 30), | ||
241 | hash: "tnarstnarsuthnarsthlarjstk".to_owned(), | ||
242 | }) | ||
243 | .path("/block") | ||
244 | .reply(&filter) | ||
245 | .await; | ||
246 | |||
247 | assert_eq!(res.status(), StatusCode::BAD_REQUEST); | ||
248 | } | ||
249 | |||
250 | /// Test a POST request to /block, an endpoint that exists | ||
251 | /// | ||
252 | /// https://tools.ietf.org/html/rfc7231#section-6.3.2 | ||
253 | /// | ||
254 | /// Should reject the block because hash has enough zeroes but is not the actual hash of the | ||
255 | /// block | ||
256 | #[tokio::test] | ||
257 | async fn post_block_incorrect_hash() { | ||
258 | let db = mocked_db(); | ||
259 | let filter = consensus_routes(db.clone()); | ||
260 | |||
261 | let res = warp::test::request() | ||
262 | .method("POST") | ||
263 | .json(&Block { | ||
264 | transaction_list: vec![], | ||
265 | nonce: 12314, | ||
266 | timestamp: chrono::NaiveDate::from_ymd(2021, 04, 13).and_hms(20, 55, 00), | ||
267 | hash: "0000001111111111111111111111111111111111111111111111111111111111".to_owned(), | ||
268 | }) | ||
299 | .path("/block") | 269 | .path("/block") |
300 | .reply(&filter) | 270 | .reply(&filter) |
301 | .await; | 271 | .await; |
302 | 272 | ||
273 | println!("{:?}", res.body()); | ||
303 | assert_eq!(res.status(), StatusCode::BAD_REQUEST); | 274 | assert_eq!(res.status(), StatusCode::BAD_REQUEST); |
275 | assert_eq!( | ||
276 | db.blockchain.read().hash, | ||
277 | "0000009745f2f09c968c095af75e8ab87eba9be90a93e5df464f83ea7ec08537" | ||
278 | ); | ||
304 | } | 279 | } |
305 | 280 | ||
306 | /// Test a POST request to /register, an endpoint that exists | 281 | /// Test a POST request to /register, an endpoint that exists |