Skip to content

Commit e5f08ad

Browse files
committed
feat(badges): only cache successful badge responses from shields.io
1 parent 6fc78ff commit e5f08ad

File tree

7 files changed

+50
-95
lines changed

7 files changed

+50
-95
lines changed

lib/pact_broker/badges/cached_service.rb

-32
This file was deleted.

lib/pact_broker/badges/service.rb

+26-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module Service
1212
include PactBroker::Logging
1313

1414
SPACE_DASH_UNDERSCORE = /[\s_\-]/
15+
CACHE = {}
1516

1617
def pact_verification_badge pact, label, initials, verification_status
1718
return static_svg(pact, verification_status) unless pact
@@ -23,6 +24,10 @@ def pact_verification_badge pact, label, initials, verification_status
2324
dynamic_svg(title, status, color) || static_svg(pact, verification_status)
2425
end
2526

27+
def clear_cache
28+
CACHE.clear
29+
end
30+
2631
private
2732

2833
def badge_title pact, label, initials
@@ -79,7 +84,7 @@ def dynamic_svg left_text, right_text, color
7984
response = do_request(uri)
8085
response.code == '200' ? response.body : nil
8186
rescue StandardError => e
82-
log_error e, "Error retrieving badge from #{uri}"
87+
logger.error "Error retrieving badge from #{uri} due to #{e.class} - #{e.message}"
8388
nil
8489
end
8590
end
@@ -95,11 +100,27 @@ def escape_text text
95100
end
96101

97102
def do_request(uri)
98-
request = Net::HTTP::Get.new(uri)
99-
Net::HTTP.start(uri.hostname, uri.port,
100-
use_ssl: uri.scheme == 'https', read_timeout: 1000) do |http|
101-
http.request request
103+
with_cache uri do
104+
request = Net::HTTP::Get.new(uri)
105+
Net::HTTP.start(uri.hostname, uri.port,
106+
use_ssl: uri.scheme == 'https',
107+
read_timeout: 3,
108+
open_timeout: 1,
109+
ssl_timeout: 1,
110+
continue_timeout: 1) do |http|
111+
http.request request
112+
end
113+
end
114+
end
115+
116+
def with_cache uri
117+
if !(response = CACHE[uri])
118+
response = yield
119+
if response.code == '200'
120+
CACHE[uri] = response
121+
end
102122
end
123+
response
103124
end
104125

105126
def static_svg pact, verification_status

lib/pact_broker/services.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ def verification_service
4343
end
4444

4545
def badge_service
46-
require 'pact_broker/badges/cached_service'
47-
Badges::CachedService
46+
require 'pact_broker/badges/service'
47+
Badges::Service
4848
end
4949
end
5050
end

spec/lib/pact_broker/api/resources/badge_spec.rb

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
require 'pact_broker/api/resources/badge'
2-
require 'pact_broker/badges/cached_service'
2+
require 'pact_broker/badges/service'
33

44
module PactBroker
55
module Api
@@ -11,7 +11,7 @@ module Resources
1111
before do
1212
allow(PactBroker::Pacts::Service).to receive(:find_latest_pact).and_return(pact)
1313
allow(PactBroker::Verifications::Service).to receive(:find_latest_verification_for).and_return(verification)
14-
allow(PactBroker::Badges::CachedService).to receive(:pact_verification_badge).and_return("badge")
14+
allow(PactBroker::Badges::Service).to receive(:pact_verification_badge).and_return("badge")
1515
allow(PactBroker::Verifications::Status).to receive(:new).and_return(verification_status)
1616
end
1717

@@ -68,7 +68,7 @@ module Resources
6868
end
6969

7070
it "creates a badge" do
71-
expect(PactBroker::Badges::CachedService).to receive(:pact_verification_badge).with(pact, nil, false, :verified)
71+
expect(PactBroker::Badges::Service).to receive(:pact_verification_badge).with(pact, nil, false, :verified)
7272
subject
7373
end
7474

@@ -84,7 +84,7 @@ module Resources
8484
let(:params) { {label: 'consumer'} }
8585

8686
it "creates a badge with the specified label" do
87-
expect(PactBroker::Badges::CachedService).to receive(:pact_verification_badge).with(anything, 'consumer', anything, anything)
87+
expect(PactBroker::Badges::Service).to receive(:pact_verification_badge).with(anything, 'consumer', anything, anything)
8888
subject
8989
end
9090
end
@@ -93,7 +93,7 @@ module Resources
9393
let(:params) { {initials: 'true'} }
9494

9595
it "creates a badge with initials" do
96-
expect(PactBroker::Badges::CachedService).to receive(:pact_verification_badge).with(anything, anything, true, anything)
96+
expect(PactBroker::Badges::Service).to receive(:pact_verification_badge).with(anything, anything, true, anything)
9797
subject
9898
end
9999
end

spec/lib/pact_broker/badges/cached_service_spec.rb

-48
This file was deleted.

spec/lib/pact_broker/badges/service_spec.rb

+15-1
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,22 @@ module Service
2020
stub_request(:get, expected_url).to_return(:status => response_status, :body => "svg")
2121
end
2222

23-
let(:subject) { PactBroker::Badges::Service.pact_verification_badge pact, label, initials, verification_status }
23+
subject { PactBroker::Badges::Service.pact_verification_badge pact, label, initials, verification_status }
24+
25+
before do
26+
Service.clear_cache
27+
end
2428

2529
it "returns the svg file" do
2630
expect(subject).to eq "svg"
2731
end
2832

33+
it "caches the response" do
34+
PactBroker::Badges::Service.pact_verification_badge pact, label, initials, verification_status
35+
PactBroker::Badges::Service.pact_verification_badge pact, label, initials, verification_status
36+
expect(http_request).to have_been_made.once
37+
end
38+
2939
context "when the label is not specified" do
3040
it "creates a badge with the consumer and provider names" do
3141
subject
@@ -221,6 +231,10 @@ module Service
221231
it "returns a static image" do
222232
expect(subject).to include ">pact</"
223233
end
234+
235+
it "does not cache the response" do
236+
expect(Service::CACHE.size).to eq 0
237+
end
224238
end
225239

226240
context "when the shields_io_base_url is not configured" do

spec/spec_helper.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323

2424
config.before :each do
2525
PactBroker.reset_configuration
26-
require 'pact_broker/badges/cached_service'
27-
PactBroker::Badges::CachedService.clear_cache
26+
require 'pact_broker/badges/service'
27+
PactBroker::Badges::Service.clear_cache
2828
end
2929

3030
config.include Rack::Test::Methods

0 commit comments

Comments
 (0)