| 108 | |
| 109 | #[actix_web::test] |
| 110 | async fn test_workflow() { |
| 111 | let private_key = actix_web::cookie::Key::generate(); |
| 112 | let store = RedisSessionStore::new("redis://127.0.0.1:6379") |
| 113 | .await |
| 114 | .unwrap(); |
| 115 | |
| 116 | let srv = actix_test::start(move || { |
| 117 | App::new() |
| 118 | .wrap( |
| 119 | SessionMiddleware::builder(store.clone(), private_key.clone()) |
| 120 | .cookie_name("test-session".to_owned()) |
| 121 | .build(), |
| 122 | ) |
| 123 | .wrap(middleware::Logger::default()) |
| 124 | .service(resource("/").route(get().to(index))) |
| 125 | .service(resource("/do_something").route(post().to(do_something))) |
| 126 | .service(resource("/login").route(post().to(login))) |
| 127 | .service(resource("/logout").route(post().to(logout))) |
| 128 | }); |
| 129 | |
| 130 | // Step 1: GET index |
| 131 | // - set-cookie actix-session should NOT be in response (session data is empty) |
| 132 | // - response should be: {"counter": 0, "user_id": None} |
| 133 | let request = srv.get("/").send(); |
| 134 | let mut resp_1 = request.await.unwrap(); |
| 135 | assert!(resp_1.cookies().unwrap().is_empty()); |
| 136 | let result_1 = resp_1.json::<IndexResponse>().await.unwrap(); |
| 137 | assert_eq!( |
| 138 | result_1, |
| 139 | IndexResponse { |
| 140 | user_id: None, |
| 141 | counter: 0 |
| 142 | } |
| 143 | ); |
| 144 | |
| 145 | // Step 2: POST to do_something, including session cookie #1 in request |
| 146 | // - adds new session state in redis: {"counter": 1} |
| 147 | // - response should be: {"counter": 1, "user_id": None} |
| 148 | let req_3 = srv.post("/do_something").send(); |
| 149 | let mut resp_3 = req_3.await.unwrap(); |
| 150 | let cookie_1 = resp_3 |
| 151 | .cookies() |
| 152 | .unwrap() |
| 153 | .clone() |
| 154 | .into_iter() |
| 155 | .find(|c| c.name() == "test-session") |
| 156 | .unwrap(); |
| 157 | let result_3 = resp_3.json::<IndexResponse>().await.unwrap(); |
| 158 | assert_eq!( |
| 159 | result_3, |
| 160 | IndexResponse { |
| 161 | user_id: None, |
| 162 | counter: 1 |
| 163 | } |
| 164 | ); |
| 165 | |
| 166 | // Step 3: POST again to do_something, including session cookie #1 in request |
| 167 | // - updates session state in redis: {"counter": 2} |