Skip to content

Commit 2453c55

Browse files
committed
feat(badges): use simple in-memory cache for badges
1 parent 83540e5 commit 2453c55

File tree

4 files changed

+80
-4
lines changed

4 files changed

+80
-4
lines changed

lib/pact_broker/api/resources/badge.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def forbidden?
3131
private
3232

3333
def to_svg
34-
badges_service.pact_verification_badge pact, label, initials, verification_status
34+
badge_service.pact_verification_badge pact, label, initials, verification_status
3535
end
3636

3737
def pact
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require 'pact_broker/logging'
2+
require 'pact_broker/badges/service'
3+
4+
module PactBroker
5+
module Badges
6+
module CachedService
7+
8+
extend self
9+
include PactBroker::Logging
10+
extend PactBroker::Services
11+
12+
CACHE = {}
13+
private_constant :CACHE
14+
15+
def pact_verification_badge pact, label, initials, verification_status
16+
badge_key = key(pact, label, initials, verification_status)
17+
CACHE[badge_key] ||= PactBroker::Badges::Service.pact_verification_badge(pact, label, initials, verification_status)
18+
end
19+
20+
private
21+
22+
def key pact, label, initials, verification_status
23+
"#{pact.consumer.name}-#{pact.provider.name}-#{label}-#{initials}-#{verification_status}"
24+
end
25+
end
26+
end
27+
end

lib/pact_broker/services.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ def verification_service
4242
Verifications::Service
4343
end
4444

45-
def badges_service
46-
require 'pact_broker/badges/service'
47-
Badges::Service
45+
def badge_service
46+
require 'pact_broker/badges/cached_service'
47+
Badges::CachedService
4848
end
4949
end
5050
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
require 'pact_broker/badges/cached_service'
2+
require 'pact_broker/badges/service'
3+
4+
module PactBroker
5+
module Badges
6+
describe CachedService do
7+
8+
let(:consumer) { double('consumer', name: 'foo') }
9+
let(:provider) { double('provider', name: 'bar') }
10+
let(:pact) { double('pact', consumer: consumer, provider: provider) }
11+
let(:label) { 'consumer' }
12+
let(:initials) { false }
13+
let(:verification_status) { 'status' }
14+
15+
describe "#pact_verification_badge" do
16+
17+
before do
18+
allow(Service).to receive(:pact_verification_badge).and_return('badge')
19+
stub_const('PactBroker::Badges::CachedService::CACHE', {})
20+
end
21+
22+
subject { CachedService.pact_verification_badge pact, label, initials, verification_status }
23+
24+
it "returns the badge" do
25+
expect(subject).to eq 'badge'
26+
end
27+
28+
context "when the badge is not in the cache" do
29+
before do
30+
stub_const('PactBroker::Badges::CachedService::CACHE', {})
31+
end
32+
33+
it "retrieves the badge from the Badges::Service" do
34+
expect(Service).to receive(:pact_verification_badge)
35+
subject
36+
end
37+
end
38+
39+
context "when the badge is in the cache" do
40+
it "returns the cached badge" do
41+
expect(Service).to receive(:pact_verification_badge).once
42+
CachedService.pact_verification_badge pact, label, initials, verification_status
43+
CachedService.pact_verification_badge pact, label, initials, verification_status
44+
end
45+
end
46+
end
47+
end
48+
end
49+
end

0 commit comments

Comments
 (0)