rollout 2.2.1 → 2.2.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c64885c4cf5254332da642dc02ee9b21aeaa62c8
4
- data.tar.gz: 7847a0a450a0641f71b1f47926ce867dc00e40af
3
+ metadata.gz: 4ba2a7c48e65a966b1b16abcb9efa4469eaadf61
4
+ data.tar.gz: ac9a3df6b56547de407611ee9f6faecf5b60acca
5
5
  SHA512:
6
- metadata.gz: 8d673450a953468fbe6ebca47ee985af3499a37627dd1e086f5b018216d6bc2d3c12ffac1a33e2bbc369802d059faff2a69ef8f5899f7a7e10b6750a852ffad3
7
- data.tar.gz: 594d9322387a7019ca0f0d34cf8d5c4133181ec960f7dd8749babc1353d978bd326505651f220dd3cf034b46113c7054a7c216f142605001cad43f0938860ffa
6
+ metadata.gz: 04d929b8f4cd7879140135c48f41a68080be70a6e17f6030657b68acae16f78459adf99a08772e491f64decbfbbcfe717699c2bf27c9cafc95be7acfad6d14d3
7
+ data.tar.gz: 39a9083e5295d7797a6c4aac21a1736c6df7a121c047f106b160de9400d2272bbf205529cf7f7a479aa922d418d14f0fe362bba896d099f3aa8ad67f1003d6bf
data/.travis.yml CHANGED
@@ -1,12 +1,16 @@
1
1
  language: ruby
2
+ cache: bundler
2
3
  sudo: false
3
4
  services:
4
5
  - redis-server
5
6
  rvm:
7
+ - 2.3.0
6
8
  - 2.2
7
9
  - 2.1
8
10
  - 2.0.0
9
11
  - 1.9.3
10
12
  - jruby-19mode
13
+ env:
14
+ - USE_REAL_REDIS=true
11
15
  script:
12
16
  - bundle exec rspec
data/Gemfile.lock CHANGED
@@ -1,23 +1,61 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rollout (2.2.1)
4
+ rollout (2.2.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
+ addressable (2.4.0)
10
+ builder (3.2.2)
9
11
  codeclimate-test-reporter (0.4.8)
10
12
  simplecov (>= 0.7.1, < 1.0.0)
13
+ descendants_tracker (0.0.4)
14
+ thread_safe (~> 0.3, >= 0.3.1)
11
15
  diff-lcs (1.2.5)
12
16
  docile (1.1.5)
17
+ fakeredis (0.5.0)
18
+ redis (~> 3.0)
19
+ faraday (0.9.2)
20
+ multipart-post (>= 1.2, < 3)
13
21
  git (1.2.9.1)
14
- jeweler (1.6.4)
15
- bundler (~> 1.0)
22
+ github_api (0.13.1)
23
+ addressable (~> 2.4.0)
24
+ descendants_tracker (~> 0.0.4)
25
+ faraday (~> 0.8, < 0.10)
26
+ hashie (>= 3.4)
27
+ multi_json (>= 1.7.5, < 2.0)
28
+ oauth2
29
+ hashie (3.4.3)
30
+ highline (1.7.8)
31
+ jeweler (2.0.1)
32
+ builder
33
+ bundler (>= 1.0)
16
34
  git (>= 1.2.5)
35
+ github_api
36
+ highline (>= 1.6.15)
37
+ nokogiri (>= 1.5.10)
17
38
  rake
39
+ rdoc
18
40
  json (1.8.3)
19
- rake (10.4.2)
20
- redis (3.2.1)
41
+ jwt (1.5.1)
42
+ mini_portile2 (2.0.0)
43
+ multi_json (1.11.2)
44
+ multi_xml (0.5.5)
45
+ multipart-post (2.0.0)
46
+ nokogiri (1.6.7.2)
47
+ mini_portile2 (~> 2.0.0.rc2)
48
+ oauth2 (1.1.0)
49
+ faraday (>= 0.8, < 0.10)
50
+ jwt (~> 1.0, < 1.5.2)
51
+ multi_json (~> 1.3)
52
+ multi_xml (~> 0.5)
53
+ rack (>= 1.2, < 3)
54
+ rack (1.6.4)
55
+ rake (10.5.0)
56
+ rdoc (4.2.2)
57
+ json (~> 1.4)
58
+ redis (3.2.2)
21
59
  rspec (3.4.0)
22
60
  rspec-core (~> 3.4.0)
23
61
  rspec-expectations (~> 3.4.0)
@@ -36,6 +74,7 @@ GEM
36
74
  json (~> 1.8)
37
75
  simplecov-html (~> 0.10.0)
38
76
  simplecov-html (0.10.0)
77
+ thread_safe (0.3.5)
39
78
 
40
79
  PLATFORMS
41
80
  ruby
@@ -43,7 +82,8 @@ PLATFORMS
43
82
  DEPENDENCIES
44
83
  bundler (>= 1.0.0)
45
84
  codeclimate-test-reporter
46
- jeweler (~> 1.6.4)
85
+ fakeredis
86
+ jeweler
47
87
  redis
48
88
  rollout!
49
89
  rspec
data/README.md CHANGED
@@ -4,6 +4,8 @@ Feature flippers.
4
4
 
5
5
  [![Build Status](https://travis-ci.org/FetLife/rollout.svg?branch=master)](https://travis-ci.org/FetLife/rollout)
6
6
  [![Code Climate](https://codeclimate.com/github/FetLife/rollout/badges/gpa.svg)](https://codeclimate.com/github/FetLife/rollout)
7
+ [![Dependency
8
+ Status](https://gemnasium.com/FetLife/rollout.svg)](https://gemnasium.com/FetLife/rollout)
7
9
  [//]: # ([![Test Coverage](https://codeclimate.com/github/FetLife/rollout/badges/coverage.svg)](https://codeclimate.com/github/FetLife/rollout/coverage))
8
10
 
9
11
  ## MAKE SURE TO READ THIS: 2.X Changes and Migration Path
@@ -17,17 +19,6 @@ This also has the effect of rollout no longer being dependent on redis. Just
17
19
  give it something that responds to `set(key,value)`, `get(key)` and
18
20
  `del(key)`.
19
21
 
20
- If you have been using the 1.x format, you can initialize Rollout with
21
- `migrate: true` and it'll do its best to automatically migrate your old
22
- features to the new format. There will be some performance impact, but it
23
- should be limited and short-lived since each feature only needs to get
24
- migrated once.
25
-
26
- ## Rollout::Legacy
27
-
28
- If you'd prefer to continue to use the old layout in redis, `Rollout::Legacy`
29
- is a copy and paste of the old code :-).
30
-
31
22
  ## Install it
32
23
 
33
24
  ```bash
@@ -138,7 +129,21 @@ $rollout = Rollout.new($redis, randomize_percentage: true)
138
129
  When on `randomize_percentage` will make sure that 50% of users for feature A
139
130
  are selected independently from users for feature B.
140
131
 
141
- ## Feature is broken
132
+ ## Global actions
133
+
134
+ While groups can come in handy, the actual global setter for a feature does not require a group to be passed.
135
+
136
+ ```ruby
137
+ $rollout.activate(:chat)
138
+ ```
139
+
140
+ In that case you can check the global availability of a feature using the following
141
+
142
+ ```ruby
143
+ $rollout.active?(:chat)
144
+ ```
145
+
146
+ And if something is wrong you can set a feature off for everybody using
142
147
 
143
148
  Deactivate everybody at once:
144
149
 
data/lib/rollout.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require "rollout/version"
2
- require "rollout/legacy"
3
2
  require "zlib"
4
3
  require "set"
5
4
 
@@ -50,13 +49,13 @@ class Rollout
50
49
  end
51
50
 
52
51
  def active?(rollout, user)
53
- if user.nil?
54
- @percentage == 100
55
- else
52
+ if user
56
53
  id = user_id(user)
57
54
  user_in_percentage?(id) ||
58
55
  user_in_active_users?(id) ||
59
56
  user_in_active_group?(user, rollout)
57
+ else
58
+ @percentage == 100
60
59
  end
61
60
  end
62
61
 
@@ -1,3 +1,3 @@
1
1
  class Rollout
2
- VERSION = "2.2.1"
2
+ VERSION = "2.2.2"
3
3
  end
data/rollout.gemspec CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.email = ["jamesgolick@gmail.com"]
10
10
  s.description = "Feature flippers with redis."
11
11
  s.summary = "Feature flippers with redis."
12
- s.homepage = "https://github.com/jamesgolick/rollout"
12
+ s.homepage = "https://github.com/FetLife/rollout"
13
13
 
14
14
  s.files = `git ls-files`.split("\n")
15
15
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -18,7 +18,8 @@ Gem::Specification.new do |s|
18
18
 
19
19
  s.add_development_dependency "rspec"
20
20
  s.add_development_dependency "bundler", ">= 1.0.0"
21
- s.add_development_dependency "jeweler", "~> 1.6.4"
21
+ s.add_development_dependency "jeweler"
22
22
  s.add_development_dependency "redis"
23
+ s.add_development_dependency "fakeredis"
23
24
  s.add_development_dependency "codeclimate-test-reporter"
24
25
  end
data/spec/rollout_spec.rb CHANGED
@@ -417,37 +417,6 @@ RSpec.describe "Rollout" do
417
417
  end
418
418
  end
419
419
 
420
- describe "migration mode" do
421
- before do
422
- @legacy = Rollout::Legacy.new(@redis)
423
- @legacy.activate_percentage(:chat, 12)
424
- @legacy.activate_user(:chat, double(id: 42))
425
- @legacy.activate_user(:chat, double(id: 24))
426
- @legacy.activate_group(:chat, :dope_people)
427
- @rollout = Rollout.new(@redis, migrate: true)
428
- end
429
-
430
- it "imports the settings from the legacy rollout once" do
431
- expect(@rollout.get(:chat).to_hash).to eq({
432
- percentage: 12,
433
- users: %w(24 42),
434
- groups: [:dope_people]
435
- })
436
- @legacy.deactivate_all(:chat)
437
- expect(@rollout.get(:chat).to_hash).to eq({
438
- percentage: 12,
439
- users: %w(24 42).to_set,
440
- groups: [:dope_people].to_set
441
- })
442
- expect(@redis.get("feature:chat")).not_to be_nil
443
- end
444
-
445
- it "imports settings that were globally activated" do
446
- @legacy.activate_globally(:video_chat)
447
- expect(@rollout.get(:video_chat).to_hash[:percentage]).to eq(100)
448
- end
449
- end
450
-
451
420
  describe "#feature_states" do
452
421
  let(:user_double) { double(id: 7) }
453
422
 
data/spec/spec_helper.rb CHANGED
@@ -2,7 +2,7 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
3
  require "rollout"
4
4
  require "rspec"
5
- require "redis"
5
+ require ENV["USE_REAL_REDIS"] == "true" ? "redis" : "fakeredis"
6
6
  require "codeclimate-test-reporter"
7
7
 
8
8
  SimpleCov.start do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rollout
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.1
4
+ version: 2.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Golick
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-21 00:00:00.000000000 Z
11
+ date: 2016-02-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: jeweler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 1.6.4
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 1.6.4
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: redis
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: fakeredis
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: codeclimate-test-reporter
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -96,13 +110,11 @@ files:
96
110
  - LICENSE
97
111
  - README.md
98
112
  - lib/rollout.rb
99
- - lib/rollout/legacy.rb
100
113
  - lib/rollout/version.rb
101
114
  - rollout.gemspec
102
- - spec/legacy_spec.rb
103
115
  - spec/rollout_spec.rb
104
116
  - spec/spec_helper.rb
105
- homepage: https://github.com/jamesgolick/rollout
117
+ homepage: https://github.com/FetLife/rollout
106
118
  licenses: []
107
119
  metadata: {}
108
120
  post_install_message:
@@ -126,6 +138,5 @@ signing_key:
126
138
  specification_version: 4
127
139
  summary: Feature flippers with redis.
128
140
  test_files:
129
- - spec/legacy_spec.rb
130
141
  - spec/rollout_spec.rb
131
142
  - spec/spec_helper.rb
@@ -1,134 +0,0 @@
1
- class Rollout
2
- class Legacy
3
- def initialize(redis)
4
- @redis = redis
5
- @groups = {"all" => lambda { |user| true }}
6
- end
7
-
8
- def activate_globally(feature)
9
- @redis.sadd(global_key, feature)
10
- end
11
-
12
- def deactivate_globally(feature)
13
- @redis.srem(global_key, feature)
14
- end
15
-
16
- def activate_group(feature, group)
17
- @redis.sadd(group_key(feature), group)
18
- end
19
-
20
- def deactivate_group(feature, group)
21
- @redis.srem(group_key(feature), group)
22
- end
23
-
24
- def deactivate_all(feature)
25
- @redis.del(group_key(feature))
26
- @redis.del(user_key(feature))
27
- @redis.del(percentage_key(feature))
28
- deactivate_globally(feature)
29
- end
30
-
31
- def activate_user(feature, user)
32
- @redis.sadd(user_key(feature), user.id)
33
- end
34
-
35
- def deactivate_user(feature, user)
36
- @redis.srem(user_key(feature), user.id)
37
- end
38
-
39
- def define_group(group, &block)
40
- @groups[group.to_s] = block
41
- end
42
-
43
- def active?(feature, user = nil)
44
- if user
45
- active_globally?(feature) ||
46
- user_in_active_group?(feature, user) ||
47
- user_active?(feature, user) ||
48
- user_within_active_percentage?(feature, user)
49
- else
50
- active_globally?(feature)
51
- end
52
- end
53
-
54
- def activate_percentage(feature, percentage)
55
- @redis.set(percentage_key(feature), percentage)
56
- end
57
-
58
- def deactivate_percentage(feature)
59
- @redis.del(percentage_key(feature))
60
- end
61
-
62
- def info(feature = nil)
63
- if feature
64
- {
65
- :percentage => (active_percentage(feature) || 0).to_i,
66
- :groups => active_groups(feature).map { |g| g.to_sym },
67
- :users => active_user_ids(feature),
68
- :global => active_global_features
69
- }
70
- else
71
- {
72
- :global => active_global_features
73
- }
74
- end
75
- end
76
-
77
- private
78
- def key(name)
79
- "feature:#{name}"
80
- end
81
-
82
- def group_key(name)
83
- "#{key(name)}:groups"
84
- end
85
-
86
- def user_key(name)
87
- "#{key(name)}:users"
88
- end
89
-
90
- def percentage_key(name)
91
- "#{key(name)}:percentage"
92
- end
93
-
94
- def global_key
95
- "feature:__global__"
96
- end
97
-
98
- def active_groups(feature)
99
- @redis.smembers(group_key(feature)) || []
100
- end
101
-
102
- def active_user_ids(feature)
103
- @redis.smembers(user_key(feature)).map { |id| id.to_i }
104
- end
105
-
106
- def active_global_features
107
- (@redis.smembers(global_key) || []).map(&:to_sym)
108
- end
109
-
110
- def active_percentage(feature)
111
- @redis.get(percentage_key(feature))
112
- end
113
-
114
- def active_globally?(feature)
115
- @redis.sismember(global_key, feature)
116
- end
117
-
118
- def user_in_active_group?(feature, user)
119
- active_groups(feature).any? do |group|
120
- @groups.key?(group) && @groups[group].call(user)
121
- end
122
- end
123
-
124
- def user_active?(feature, user)
125
- @redis.sismember(user_key(feature), user.id)
126
- end
127
-
128
- def user_within_active_percentage?(feature, user)
129
- percentage = active_percentage(feature)
130
- return false if percentage.nil?
131
- user.id % 100 < percentage.to_i
132
- end
133
- end
134
- end
data/spec/legacy_spec.rb DELETED
@@ -1,221 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe "Rollout::Legacy" do
4
- before do
5
- @redis = Redis.new
6
- @rollout = Rollout::Legacy.new(@redis)
7
- end
8
-
9
- describe "when a group is activated" do
10
- before do
11
- @rollout.define_group(:fivesonly) { |user| user.id == 5 }
12
- @rollout.activate_group(:chat, :fivesonly)
13
- end
14
-
15
- it "the feature is active for users for which the block evaluates to true" do
16
- expect(@rollout).to be_active(:chat, double(id: 5))
17
- end
18
-
19
- it "is not active for users for which the block evaluates to false" do
20
- expect(@rollout).not_to be_active(:chat, double(id: 1))
21
- end
22
-
23
- it "is not active if a group is found in Redis but not defined in Rollout" do
24
- @rollout.activate_group(:chat, :fake)
25
- expect(@rollout).not_to be_active(:chat, double(id: 1))
26
- end
27
- end
28
-
29
- describe "the default all group" do
30
- before do
31
- @rollout.activate_group(:chat, :all)
32
- end
33
-
34
- it "evaluates to true no matter what" do
35
- expect(@rollout).to be_active(:chat, double(id: 0))
36
- end
37
- end
38
-
39
- describe "deactivating a group" do
40
- before do
41
- @rollout.define_group(:fivesonly) { |user| user.id == 5 }
42
- @rollout.activate_group(:chat, :all)
43
- @rollout.activate_group(:chat, :fivesonly)
44
- @rollout.deactivate_group(:chat, :all)
45
- end
46
-
47
- it "deactivates the rules for that group" do
48
- expect(@rollout).not_to be_active(:chat, double(id: 10))
49
- end
50
-
51
- it "leaves the other groups active" do
52
- expect(@rollout).to be_active(:chat, double(id: 5))
53
- end
54
- end
55
-
56
- describe "deactivating a feature completely" do
57
- before do
58
- @rollout.define_group(:fivesonly) { |user| user.id == 5 }
59
- @rollout.activate_group(:chat, :all)
60
- @rollout.activate_group(:chat, :fivesonly)
61
- @rollout.activate_user(:chat, double(id: 51))
62
- @rollout.activate_percentage(:chat, 100)
63
- @rollout.activate_globally(:chat)
64
- @rollout.deactivate_all(:chat)
65
- end
66
-
67
- it "removes all of the groups" do
68
- expect(@rollout).not_to be_active(:chat, double(id: 0))
69
- end
70
-
71
- it "removes all of the users" do
72
- expect(@rollout).not_to be_active(:chat, double(id: 51))
73
- end
74
-
75
- it "removes the percentage" do
76
- expect(@rollout).not_to be_active(:chat, double(id: 24))
77
- end
78
-
79
- it "removes globally" do
80
- expect(@rollout).not_to be_active(:chat)
81
- end
82
- end
83
-
84
- describe "activating a specific user" do
85
- before do
86
- @rollout.activate_user(:chat, double(id: 42))
87
- end
88
-
89
- it "is active for that user" do
90
- expect(@rollout).to be_active(:chat, double(id: 42))
91
- end
92
-
93
- it "remains inactive for other users" do
94
- expect(@rollout).not_to be_active(:chat, double(id: 24))
95
- end
96
- end
97
-
98
- describe "deactivating a specific user" do
99
- before do
100
- @rollout.activate_user(:chat, double(id: 42))
101
- @rollout.activate_user(:chat, double(id: 24))
102
- @rollout.deactivate_user(:chat, double(id: 42))
103
- end
104
-
105
- it "that user should no longer be active" do
106
- expect(@rollout).not_to be_active(:chat, double(id: 42))
107
- end
108
-
109
- it "remains active for other active users" do
110
- expect(@rollout).to be_active(:chat, double(id: 24))
111
- end
112
- end
113
-
114
- describe "activating a feature globally" do
115
- before do
116
- @rollout.activate_globally(:chat)
117
- end
118
-
119
- it "activates the feature" do
120
- expect(@rollout).to be_active(:chat)
121
- end
122
- end
123
-
124
- describe "activating a feature for a percentage of users" do
125
- before do
126
- @rollout.activate_percentage(:chat, 20)
127
- end
128
-
129
- it "activates the feature for that percentage of the users" do
130
- expect((1..120).select { |id| @rollout.active?(:chat, double(id: id)) }.length).to eq(39)
131
- end
132
- end
133
-
134
- describe "activating a feature for a percentage of users" do
135
- before do
136
- @rollout.activate_percentage(:chat, 20)
137
- end
138
-
139
- it "activates the feature for that percentage of the users" do
140
- expect((1..200).select { |id| @rollout.active?(:chat, double(id: id)) }.length).to eq(40)
141
- end
142
- end
143
-
144
- describe "activating a feature for a percentage of users" do
145
- before do
146
- @rollout.activate_percentage(:chat, 5)
147
- end
148
-
149
- it "activates the feature for that percentage of the users" do
150
- expect((1..100).select { |id| @rollout.active?(:chat, double(id: id)) }.length).to eq(5)
151
- end
152
- end
153
-
154
-
155
- describe "deactivating the percentage of users" do
156
- before do
157
- @rollout.activate_percentage(:chat, 100)
158
- @rollout.deactivate_percentage(:chat)
159
- end
160
-
161
- it "becomes inactivate for all users" do
162
- expect(@rollout).not_to be_active(:chat, double(id: 24))
163
- end
164
- end
165
-
166
- describe "deactivating the feature globally" do
167
- before do
168
- @rollout.activate_globally(:chat)
169
- @rollout.deactivate_globally(:chat)
170
- end
171
-
172
- it "becomes inactivate" do
173
- expect(@rollout).not_to be_active(:chat)
174
- end
175
- end
176
-
177
- describe "#info" do
178
- context "global features" do
179
- let(:features) { [:signup, :chat, :table] }
180
-
181
- before do
182
- features.each do |f|
183
- @rollout.activate_globally(f)
184
- end
185
- end
186
-
187
- it "returns all global features" do
188
- expect(@rollout.info[:global]).to include(*features)
189
- end
190
- end
191
-
192
- describe "with a percentage set" do
193
- before do
194
- @rollout.activate_percentage(:chat, 10)
195
- @rollout.activate_group(:chat, :caretakers)
196
- @rollout.activate_group(:chat, :greeters)
197
- @rollout.activate_globally(:signup)
198
- @rollout.activate_user(:chat, double(id: 42))
199
- end
200
-
201
- it "returns info about all the activations" do
202
- info = @rollout.info(:chat)
203
- expect(info[:percentage]).to eq(10)
204
- expect(info[:groups]).to include(:caretakers, :greeters)
205
- expect(info[:users]).to include(42)
206
- expect(info[:global]).to include(:signup)
207
- end
208
- end
209
-
210
- describe "without a percentage set" do
211
- it "defaults to 0" do
212
- expect(@rollout.info(:chat)).to eq(
213
- percentage: 0,
214
- groups: [],
215
- users: [],
216
- global: [],
217
- )
218
- end
219
- end
220
- end
221
- end