neuron_auth_static/
lib.rs1#![deny(missing_docs)]
2use async_trait::async_trait;
7use neuron_auth::{AuthError, AuthProvider, AuthRequest, AuthToken};
8
9pub struct StaticAuthProvider {
11 token: Vec<u8>,
12}
13
14impl StaticAuthProvider {
15 pub fn new(token: impl Into<Vec<u8>>) -> Self {
17 Self {
18 token: token.into(),
19 }
20 }
21}
22
23#[async_trait]
24impl AuthProvider for StaticAuthProvider {
25 async fn provide(&self, _request: &AuthRequest) -> Result<AuthToken, AuthError> {
26 Ok(AuthToken::permanent(self.token.clone()))
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33 use std::sync::Arc;
34
35 fn _assert_send_sync<T: Send + Sync>() {}
36
37 #[test]
38 fn object_safety() {
39 _assert_send_sync::<Box<dyn AuthProvider>>();
40 _assert_send_sync::<Arc<dyn AuthProvider>>();
41 let _: Arc<dyn AuthProvider> = Arc::new(StaticAuthProvider::new(b"token".to_vec()));
42 }
43
44 #[tokio::test]
45 async fn returns_fixed_token() {
46 let provider = StaticAuthProvider::new(b"my-secret-token".to_vec());
47 let token = provider.provide(&AuthRequest::new()).await.unwrap();
48 token.with_bytes(|b| assert_eq!(b, b"my-secret-token"));
49 }
50
51 #[tokio::test]
52 async fn returns_same_token_every_time() {
53 let provider = StaticAuthProvider::new(b"fixed".to_vec());
54 let t1 = provider.provide(&AuthRequest::new()).await.unwrap();
55 let t2 = provider.provide(&AuthRequest::new()).await.unwrap();
56 t1.with_bytes(|b| assert_eq!(b, b"fixed"));
57 t2.with_bytes(|b| assert_eq!(b, b"fixed"));
58 }
59
60 #[tokio::test]
61 async fn ignores_request_context() {
62 let provider = StaticAuthProvider::new(b"ignored".to_vec());
63 let req = AuthRequest::new()
64 .with_audience("https://vault.internal")
65 .with_scope("admin");
66 let token = provider.provide(&req).await.unwrap();
67 token.with_bytes(|b| assert_eq!(b, b"ignored"));
68 }
69}