Skip to content

Commit

Permalink
Add ActorLimit adapter
Browse files Browse the repository at this point in the history
  • Loading branch information
bkeepers committed Feb 18, 2024
1 parent 9cef922 commit 6d767fe
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 0 deletions.
26 changes: 26 additions & 0 deletions lib/flipper/adapters/actor_limit.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module Flipper
module Adapters
class ActorLimit < Wrapper
LimitExceeded = Class.new(Flipper::Error)

def initialize(adapter, limit = 100)
super(adapter)
@limit = limit
end

def enable(feature, gate, resource)
if gate.is_a?(Flipper::Gates::Actor) && over_limit?(feature)
raise LimitExceeded, "Actor limit of #{@limit} exceeded for feature #{feature.key}"
else
super
end
end

private

def over_limit?(feature)
feature.actors_value.size >= @limit
end
end
end
end
20 changes: 20 additions & 0 deletions spec/flipper/adapters/actor_limit_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
require "flipper/adapters/actor_limit"

RSpec.describe Flipper::Adapters::ActorLimit do
it_should_behave_like 'a flipper adapter' do
let(:limit) { 5 }
let(:adapter) { Flipper::Adapters::ActorLimit.new(Flipper::Adapters::Memory.new, limit) }

subject { adapter }

describe '#enable' do
it "fails when limit exceeded" do
5.times { |i| feature.enable Flipper::Actor.new("User;#{i}") }

expect {
feature.enable Flipper::Actor.new("User;6")
}.to raise_error(Flipper::Adapters::ActorLimit::LimitExceeded)
end
end
end
end
20 changes: 20 additions & 0 deletions test/adapters/actor_limit_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
require "test_helper"
require "flipper/test/shared_adapter_test"
require "flipper/adapters/actor_limit"

class Flipper::Adapters::ActorLimitTest < MiniTest::Test
prepend Flipper::Test::SharedAdapterTests

def setup
@memory = Flipper::Adapters::Memory.new
@adapter = Flipper::Adapters::ActorLimit.new(@memory, 5)
end

def test_enable_fails_when_limit_exceeded
5.times { |i| @feature.enable Flipper::Actor.new("User;#{i}") }

assert_raises Flipper::Adapters::ActorLimit::LimitExceeded do
@feature.enable Flipper::Actor.new("User;6")
end
end
end

0 comments on commit 6d767fe

Please sign in to comment.