Skip to main content

neuron_auth_static/
lib.rs

1#![deny(missing_docs)]
2//! Static auth provider that always returns the same token.
3//!
4//! Intended for dev/test use only. Not suitable for production.
5
6use async_trait::async_trait;
7use neuron_auth::{AuthError, AuthProvider, AuthRequest, AuthToken};
8
9/// A static auth provider that always returns the same token. Dev/test only.
10pub struct StaticAuthProvider {
11    token: Vec<u8>,
12}
13
14impl StaticAuthProvider {
15    /// Create with a fixed token.
16    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}