Skip to content

Commit

Permalink
Default to EMERGENCY_BANNER_REDIS_URL in Banner's Redis
Browse files Browse the repository at this point in the history
This is a new environment variable we've currently added to Integration
to allow us to using Whitehall's Redis instance, which is shared with
Static.

For environments that don't have this variable set yet (i.e. Staging and
Production) we fallback on the default `REDIS_URL`.

This is temporary - once we've moved all environments over to the new
URL we can remove this default.

`mock_env` is shamelessly copied from
[here](https://gist.github.com/jazzytomato/79bb6ff516d93486df4e14169f4426af)
and allows us to specify some environment variables that won't persist
between tests.

The memoization of the instance variable in the class method was a
tricky one to overcome, as the setup persisted across tests. I've had to
manually clear it on these new tests to get this working.
  • Loading branch information
Gweaton committed Sep 26, 2024
1 parent b92a570 commit 9683ede
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/emergency_banner/display.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ class Display
class << self
def client
@client ||= Redis.new(
url: ENV.fetch("EMERGENCY_BANNER_REDIS_URL", ENV["REDIS_URL"]),
reconnect_attempts: [
15,
30,
Expand Down
55 changes: 55 additions & 0 deletions test/unit/emergency_banner/display_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,51 @@
@banner = EmergencyBanner::Display.new
end

context ".client" do
context "when the EMERGENCY_BANNER_REDIS_URL environment variable has been set" do
should "use that value as the URL for the Redis client" do
mock_env("EMERGENCY_BANNER_REDIS_URL" => "redis://emergency-banner") do
EmergencyBanner::Display.instance_variable_set(:@client, nil)

Redis.expects(:new).with(
url: "redis://emergency-banner",
reconnect_attempts: [
15,
30,
45,
60,
],
)

EmergencyBanner::Display.client
end
end
end

context "when the EMERGENCY_BANNER_REDIS_URL environment variable has not been set" do
should "use the default REDIS_URL as the URL for the Redis client" do
mock_env({
"EMERGENCY_BANNER_REDIS_URL" => nil,
"REDIS_URL" => "redis://my-redis-url",
}) do
EmergencyBanner::Display.instance_variable_set(:@client, nil)

Redis.expects(:new).with(
url: "redis://my-redis-url",
reconnect_attempts: [
15,
30,
45,
60,
],
)

EmergencyBanner::Display.client
end
end
end
end

context "#enabled?" do
should "return enabled is false when redis connection times out and send an error notification" do
err = Redis::CannotConnectError.new("Timed out connecting to Redis")
Expand Down Expand Up @@ -155,5 +200,15 @@
assert_nil @banner.link_text
end
end

def mock_env(partial_env_hash)
old_env = ENV.to_hash
ENV.update partial_env_hash
begin
yield
ensure
ENV.replace old_env
end
end
end
# rubocop:enable Rails/RefuteMethods

0 comments on commit 9683ede

Please sign in to comment.