Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/dbt-jinja/minijinja-contrib/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ unicode_wordwrap = [

[dependencies]
chrono = { version = "0.4.26", features = ["serde"] }
chrono-tz = { version = "0.10.1" }
chrono-tz = { version = "0.10.1" , features = ["case-insensitive"] }
fancy-regex = { workspace = true }
iana-time-zone = { workspace = true }
minijinja = { workspace = true }
Expand Down
42 changes: 40 additions & 2 deletions crates/dbt-jinja/minijinja-contrib/src/modules/pytz.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ use chrono_tz::Tz;
use minijinja::{Error, ErrorKind, Value};
use std::collections::BTreeMap;
use std::fmt;
use std::str::FromStr;
use std::sync::Arc;

/// A Python-like "pytz" timezone object that wraps a `chrono_tz::Tz`.
Expand Down Expand Up @@ -81,7 +80,7 @@ fn timezone(args: &[Value]) -> Result<Value, Error> {
})?;

// Try to parse it as a Chrono Tz.
match Tz::from_str(tz_name) {
match Tz::from_str_insensitive(tz_name) {
Ok(tz) => Ok(Value::from_object(PytzTimezone::new(tz))),
Err(_) => Err(Error::new(
ErrorKind::InvalidArgument,
Expand Down Expand Up @@ -116,3 +115,42 @@ impl minijinja::value::Object for PytzTimezone {
write!(f, "{}", self.tz)
}
}

#[cfg(test)]
mod tests {
use crate::modules::pytz::{timezone, PytzTimezone};
use minijinja::Value;
use chrono_tz::Tz;

#[test]
fn test_valid_timezone_utc() {
let args = vec![Value::from("UTC")];
let result = timezone(&args);
assert!(result.is_ok());

let actual = result.unwrap();
let expected = Value::from_object(PytzTimezone::new(chrono_tz::UTC));
assert_eq!(actual, expected);
}

#[test]
fn test_valid_timezone_case_insensitive() {
let args = vec![Value::from("asia/ho_chi_minh")];
let result = timezone(&args);
assert!(result.is_ok());

let actual = result.unwrap();
let expected = Value::from_object(PytzTimezone::new(Tz::Asia__Ho_Chi_Minh));
assert_eq!(actual, expected);
}

#[test]
fn test_invalid_timezone() {
let args = vec![Value::from("Invalid/Zone")];
let result = timezone(&args);
assert!(result.is_err());

let err = result.unwrap_err();
assert!(err.to_string().contains("Invalid timezone name"));
}
}