use std::fmt;
pub const PUBLIC_HEADER_NAME: &str = "X-Shopify-Storefront-Access-Token";
pub const PRIVATE_HEADER_NAME: &str = "Shopify-Storefront-Private-Token";
#[derive(Clone)]
pub enum StorefrontToken {
Public(String),
Private(String),
}
impl StorefrontToken {
#[must_use]
pub const fn header_name(&self) -> &'static str {
match self {
Self::Public(_) => PUBLIC_HEADER_NAME,
Self::Private(_) => PRIVATE_HEADER_NAME,
}
}
#[must_use]
pub fn header_value(&self) -> &str {
match self {
Self::Public(token) | Self::Private(token) => token,
}
}
}
impl fmt::Debug for StorefrontToken {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Public(_) => f.write_str("StorefrontToken::Public(*****)"),
Self::Private(_) => f.write_str("StorefrontToken::Private(*****)"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_public_token_returns_correct_header_name() {
let token = StorefrontToken::Public("test-token".to_string());
assert_eq!(token.header_name(), "X-Shopify-Storefront-Access-Token");
}
#[test]
fn test_private_token_returns_correct_header_name() {
let token = StorefrontToken::Private("test-token".to_string());
assert_eq!(token.header_name(), "Shopify-Storefront-Private-Token");
}
#[test]
fn test_public_token_header_value_returns_token_string() {
let token = StorefrontToken::Public("my-public-token".to_string());
assert_eq!(token.header_value(), "my-public-token");
}
#[test]
fn test_private_token_header_value_returns_token_string() {
let token = StorefrontToken::Private("my-private-token".to_string());
assert_eq!(token.header_value(), "my-private-token");
}
#[test]
fn test_debug_masks_public_token_value() {
let token = StorefrontToken::Public("super-secret-token".to_string());
let debug_output = format!("{:?}", token);
assert_eq!(debug_output, "StorefrontToken::Public(*****)");
assert!(!debug_output.contains("super-secret-token"));
}
#[test]
fn test_debug_masks_private_token_value() {
let token = StorefrontToken::Private("super-secret-token".to_string());
let debug_output = format!("{:?}", token);
assert_eq!(debug_output, "StorefrontToken::Private(*****)");
assert!(!debug_output.contains("super-secret-token"));
}
#[test]
fn test_public_token_clone_works_correctly() {
let original = StorefrontToken::Public("cloneable-token".to_string());
let cloned = original.clone();
assert_eq!(cloned.header_value(), "cloneable-token");
assert_eq!(cloned.header_name(), original.header_name());
}
#[test]
fn test_private_token_clone_works_correctly() {
let original = StorefrontToken::Private("cloneable-token".to_string());
let cloned = original.clone();
assert_eq!(cloned.header_value(), "cloneable-token");
assert_eq!(cloned.header_name(), original.header_name());
}
#[test]
fn test_public_header_name_constant() {
assert_eq!(PUBLIC_HEADER_NAME, "X-Shopify-Storefront-Access-Token");
}
#[test]
fn test_private_header_name_constant() {
assert_eq!(PRIVATE_HEADER_NAME, "Shopify-Storefront-Private-Token");
}
}