uselesskey_token/lib.rs
1#![forbid(unsafe_code)]
2
3//! Token fixtures built on `uselesskey-core`.
4//!
5//! This crate generates realistic test-token shapes without committing
6//! secret-looking blobs to version control.
7//!
8//! Most users should depend on the [`uselesskey`](https://crates.io/crates/uselesskey)
9//! facade crate, which re-exports this crate's types behind the `token` feature flag.
10//!
11//! Supported token kinds:
12//! - API key style tokens (`uk_test_<base62>`)
13//! - Opaque bearer tokens (base64url)
14//! - OAuth-style JWT access tokens (`header.payload.signature`)
15//!
16//! # Examples
17//!
18//! ```
19//! use uselesskey_core::Factory;
20//! use uselesskey_token::{TokenFactoryExt, TokenSpec};
21//!
22//! let fx = Factory::random();
23//! let tok = fx.token("api-key", TokenSpec::api_key());
24//! let value = tok.value();
25//! assert!(!value.is_empty());
26//! ```
27//!
28//! # Deterministic Mode
29//!
30//! Use deterministic mode for reproducible test fixtures:
31//!
32//! ```
33//! use uselesskey_core::{Factory, Seed};
34//! use uselesskey_token::{TokenFactoryExt, TokenSpec};
35//!
36//! let seed = Seed::from_env_value("test-seed").unwrap();
37//! let fx = Factory::deterministic(seed);
38//!
39//! // Same seed + label + spec = same token
40//! let t1 = fx.token("billing", TokenSpec::api_key());
41//! let t2 = fx.token("billing", TokenSpec::api_key());
42//! assert_eq!(t1.value(), t2.value());
43//!
44//! // Different labels produce different tokens
45//! let t3 = fx.token("other", TokenSpec::api_key());
46//! assert_ne!(t1.value(), t3.value());
47//! ```
48
49mod token;
50
51pub use token::{DOMAIN_TOKEN_FIXTURE, TokenFactoryExt, TokenFixture};
52pub use uselesskey_token_spec::TokenSpec;