Skip to content

Commit 66def26

Browse files
committed
tests: Use cookie header to authenticate
... instead of adding the `TrustedUserId` extension directly
1 parent 5f0e848 commit 66def26

File tree

2 files changed

+46
-8
lines changed

2 files changed

+46
-8
lines changed

src/tests/authentication.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
use crate::{util::RequestHelper, TestApp};
22

3-
use cargo_registry::middleware::current_user::TrustedUserId;
4-
5-
use conduit::{header, Handler, HandlerResult, Method, RequestExt, StatusCode};
3+
use crate::util::encode_session_header;
4+
use conduit::{header, Handler, HandlerResult, Method, StatusCode};
65
use conduit_test::MockRequest;
76

87
static URL: &str = "/api/v1/me/updates";
@@ -49,8 +48,12 @@ fn token_auth_cannot_find_token() {
4948
#[test]
5049
fn cookie_auth_cannot_find_user() {
5150
let (app, anon) = TestApp::init().empty();
51+
52+
let session_key = &app.as_inner().session_key;
53+
let cookie = encode_session_header(session_key, -1);
54+
5255
let mut request = anon.request_builder(Method::GET, URL);
53-
request.mut_extensions().insert(TrustedUserId(-1));
56+
request.header(header::COOKIE, &cookie);
5457

5558
let response = call(&app, request);
5659
let log_message = response.map(|_| ()).unwrap_err().to_string();

src/tests/util.rs

+39-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use cargo_registry::{
2727
background_jobs::Environment,
2828
db::DieselPool,
2929
git::{Credentials, RepositoryConfig},
30-
middleware::current_user::TrustedUserId,
3130
models::{ApiToken, CreatedApiToken, User},
3231
util::AppResponse,
3332
App, Config,
@@ -37,7 +36,8 @@ use serde_json::Value;
3736
use std::{marker::PhantomData, rc::Rc, sync::Arc, time::Duration};
3837
use swirl::Runner;
3938

40-
use conduit::{Handler, HandlerResult, Method, RequestExt};
39+
use conduit::{Handler, HandlerResult, Method};
40+
use conduit_cookie::SessionMiddleware;
4141
use conduit_test::MockRequest;
4242

4343
use cargo_registry::git::Repository as WorkerRepository;
@@ -46,6 +46,8 @@ use git2::Repository as UpstreamRepository;
4646
use url::Url;
4747

4848
pub use conduit::{header, StatusCode};
49+
use cookie::Cookie;
50+
use std::collections::HashMap;
4951

5052
pub fn init_logger() {
5153
let _ = tracing_subscriber::fmt()
@@ -209,6 +211,37 @@ impl TestApp {
209211
}
210212
}
211213

214+
/// This function can be used to create a `Cookie` header for mock requests that
215+
/// include cookie-based authentication.
216+
///
217+
/// ```
218+
/// let cookie = encode_session_header(session_key, user_id);
219+
/// request.header(header::COOKIE, &cookie);
220+
/// ```
221+
///
222+
/// The implementation matches roughly what is happening inside of the
223+
/// `SessionMiddleware` from `conduit_cookie`.
224+
pub fn encode_session_header(session_key: &str, user_id: i32) -> String {
225+
let cookie_name = "cargo_session";
226+
let cookie_key = cookie::Key::derive_from(session_key.as_bytes());
227+
228+
// build session data map
229+
let mut map = HashMap::new();
230+
map.insert("user_id".into(), user_id.to_string());
231+
232+
// encode the map into a cookie value string
233+
let session_middleware = SessionMiddleware::new(cookie_name, cookie_key.clone(), false);
234+
let encoded = session_middleware.encode(&map);
235+
236+
// put the cookie into a signed cookie jar
237+
let cookie = Cookie::build(cookie_name, encoded).finish();
238+
let mut jar = cookie::CookieJar::new();
239+
jar.signed(&cookie_key).add(cookie);
240+
241+
// read the raw cookie from the cookie jar
242+
jar.get(&cookie_name).unwrap().to_string()
243+
}
244+
212245
pub struct TestAppBuilder {
213246
config: Config,
214247
proxy: Option<String>,
@@ -463,9 +496,11 @@ pub struct MockCookieUser {
463496

464497
impl RequestHelper for MockCookieUser {
465498
fn request_builder(&self, method: Method, path: &str) -> MockRequest {
499+
let session_key = &self.app.as_inner().session_key;
500+
let cookie = encode_session_header(session_key, self.user.id);
501+
466502
let mut request = req(method, path);
467-
let id = TrustedUserId(self.user.id);
468-
request.mut_extensions().insert(id);
503+
request.header(header::COOKIE, &cookie);
469504
request
470505
}
471506

0 commit comments

Comments
 (0)