require "./spec_helper" describe JosieHealth::Utils::Timezone do describe ".resolve_alias" do it "resolves EST to America/New_York" do JosieHealth::Utils::Timezone.resolve_alias("EST").should eq("America/New_York") end it "resolves cet to Europe/Berlin (case insensitive)" do JosieHealth::Utils::Timezone.resolve_alias("cet").should eq("Europe/Berlin") JosieHealth::Utils::Timezone.resolve_alias("CET").should eq("Europe/Berlin") end it "resolves UTC" do JosieHealth::Utils::Timezone.resolve_alias("utc").should eq("UTC") JosieHealth::Utils::Timezone.resolve_alias("z").should eq("UTC") end it "resolves PST to America/Los_Angeles" do JosieHealth::Utils::Timezone.resolve_alias("pst").should eq("America/Los_Angeles") end it "resolves JST to Asia/Tokyo" do JosieHealth::Utils::Timezone.resolve_alias("jst").should eq("Asia/Tokyo") end it "returns nil for unknown alias" do JosieHealth::Utils::Timezone.resolve_alias("unknown").should be_nil end it "handles whitespace" do JosieHealth::Utils::Timezone.resolve_alias(" est ").should eq("America/New_York") end end describe ".alias?" do it "returns true for known aliases" do JosieHealth::Utils::Timezone.alias?("EST").should be_true JosieHealth::Utils::Timezone.alias?("pst").should be_true JosieHealth::Utils::Timezone.alias?("UTC").should be_true end it "returns false for unknown aliases" do JosieHealth::Utils::Timezone.alias?("unknown").should be_false JosieHealth::Utils::Timezone.alias?("America/New_York").should be_false end end describe ".parse_offset" do it "parses +02:00 format" do result = JosieHealth::Utils::Timezone.parse_offset("+02:00") result.should_not be_nil result.not_nil![:sign].should eq("+") result.not_nil![:hours].should eq(2) result.not_nil![:minutes].should eq(0) end it "parses -05:30 format" do result = JosieHealth::Utils::Timezone.parse_offset("-05:30") result.should_not be_nil result.not_nil![:sign].should eq("-") result.not_nil![:hours].should eq(5) result.not_nil![:minutes].should eq(30) end it "parses +2 short format" do result = JosieHealth::Utils::Timezone.parse_offset("+2") result.should_not be_nil result.not_nil![:hours].should eq(2) result.not_nil![:minutes].should eq(0) end it "parses -530 without colon" do result = JosieHealth::Utils::Timezone.parse_offset("-530") result.should_not be_nil result.not_nil![:hours].should eq(5) result.not_nil![:minutes].should eq(30) end it "returns nil for invalid hours (>14)" do JosieHealth::Utils::Timezone.parse_offset("+15:00").should be_nil end it "returns nil for invalid minutes (>59)" do JosieHealth::Utils::Timezone.parse_offset("+02:60").should be_nil end it "returns nil for invalid format" do JosieHealth::Utils::Timezone.parse_offset("invalid").should be_nil end end describe ".format_offset" do it "formats positive offset" do JosieHealth::Utils::Timezone.format_offset("+", 2, 0).should eq("+02:00") end it "formats negative offset" do JosieHealth::Utils::Timezone.format_offset("-", 5, 30).should eq("-05:30") end it "pads single digit hours" do JosieHealth::Utils::Timezone.format_offset("+", 1, 0).should eq("+01:00") end end describe ".valid_iana?" do it "returns true for valid IANA timezone" do JosieHealth::Utils::Timezone.valid_iana?("America/New_York").should be_true JosieHealth::Utils::Timezone.valid_iana?("Europe/London").should be_true JosieHealth::Utils::Timezone.valid_iana?("UTC").should be_true end it "returns false for invalid timezone" do JosieHealth::Utils::Timezone.valid_iana?("Invalid/Zone").should be_false JosieHealth::Utils::Timezone.valid_iana?("NotReal/Fake").should be_false end end describe ".current_offset" do it "returns UTC offset for IANA timezone" do result = JosieHealth::Utils::Timezone.current_offset("UTC") result.should eq("UTC+00:00") end it "returns formatted offset for stored offset format" do result = JosieHealth::Utils::Timezone.current_offset("+02:00") result.should eq("UTC+02:00") end it "returns UTC for invalid timezone" do result = JosieHealth::Utils::Timezone.current_offset("Invalid/Zone") result.should eq("UTC") end end describe ".all_aliases" do it "returns array of all known aliases" do aliases = JosieHealth::Utils::Timezone.all_aliases aliases.should be_a(Array(String)) aliases.should contain("est") aliases.should contain("pst") aliases.should contain("utc") end end end