flipper-ui 0.2.0.beta2 → 0.2.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +12 -11
- data/README.md +5 -7
- data/examples/basic.ru +27 -26
- data/flipper-ui.gemspec +5 -3
- data/lib/flipper-ui.rb +1 -0
- data/lib/flipper/ui.rb +11 -2
- data/lib/flipper/ui/action.rb +45 -4
- data/lib/flipper/ui/actions/actors_gate.rb +48 -0
- data/lib/flipper/ui/actions/add_feature.rb +20 -0
- data/lib/flipper/ui/actions/boolean_gate.rb +26 -0
- data/lib/flipper/ui/actions/feature.rb +32 -0
- data/lib/flipper/ui/actions/features.rb +23 -3
- data/lib/flipper/ui/actions/file.rb +1 -1
- data/lib/flipper/ui/actions/gate.rb +11 -117
- data/lib/flipper/ui/actions/groups_gate.rb +43 -0
- data/lib/flipper/ui/actions/{index.rb → home.rb} +3 -3
- data/lib/flipper/ui/actions/percentage_of_actors_gate.rb +27 -0
- data/lib/flipper/ui/actions/percentage_of_time_gate.rb +27 -0
- data/lib/flipper/ui/actor.rb +13 -0
- data/lib/flipper/ui/assets/javascripts/application.coffee +0 -305
- data/lib/flipper/ui/assets/stylesheets/_bootstrap-compass.scss +9 -0
- data/lib/flipper/ui/assets/stylesheets/_bootstrap-mincer.scss +19 -0
- data/lib/flipper/ui/assets/stylesheets/_bootstrap-sprockets.scss +9 -0
- data/lib/flipper/ui/assets/stylesheets/_bootstrap.scss +50 -0
- data/lib/flipper/ui/assets/stylesheets/application.scss +33 -216
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_alerts.scss +73 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_badges.scss +68 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumbs.scss +26 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-groups.scss +243 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +160 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +269 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +36 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +69 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_component-animations.scss +37 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdowns.scss +214 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +578 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_glyphicons.scss +305 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +84 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-groups.scss +166 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +50 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_labels.scss +66 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +124 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +61 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +39 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_modals.scss +150 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +662 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_navs.scss +242 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_normalize.scss +427 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_pager.scss +54 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +88 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_panels.scss +265 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_popovers.scss +135 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +107 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress-bars.scss +87 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_responsive-embed.scss +35 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_responsive-utilities.scss +177 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_scaffolding.scss +162 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +234 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_theme.scss +273 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_thumbnails.scss +38 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +102 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +298 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +55 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +866 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/_wells.scss +29 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alerts.scss +14 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +11 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +18 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +52 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_center-block.scss +7 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +22 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +88 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +58 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +81 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +122 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hide-text.scss +21 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +33 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_labels.scss +12 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +31 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +10 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss +9 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_opacity.scss +8 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +23 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_panels.scss +24 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_progress-bar.scss +10 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-filter.scss +8 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +6 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss +21 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +10 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_tab-focus.scss +9 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +28 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +11 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-overflow.scss +8 -0
- data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss +222 -0
- data/lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml +446 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_alerts.scss +106 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_avatars.scss +36 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_base.scss +40 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss +96 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_buttons.scss +404 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_counter.scss +10 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss +68 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss +20 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_forms.scss +756 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_layout.scss +69 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_menu.scss +113 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_mixins.scss +53 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_normalize.scss +425 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_states.scss +32 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss +65 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss +255 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_truncate.scss +27 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_type.scss +92 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_utility.scss +73 -0
- data/lib/flipper/ui/assets/stylesheets/primer/_variables.scss +34 -0
- data/lib/flipper/ui/assets/stylesheets/primer/primer.scss +39 -0
- data/lib/flipper/ui/decorators/feature.rb +37 -4
- data/lib/flipper/ui/middleware.rb +12 -3
- data/lib/flipper/ui/public/css/application.css +2563 -144
- data/lib/flipper/ui/public/css/primer.css +1 -0
- data/lib/flipper/ui/public/css/primer/primer.css +1933 -0
- data/lib/flipper/ui/public/css/scss/primer.css +1933 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg +288 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
- data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
- data/lib/flipper/ui/public/js/application.js +0 -539
- data/lib/flipper/ui/public/js/bootstrap-sprockets.js +12 -0
- data/lib/flipper/ui/public/js/bootstrap.js +2317 -0
- data/lib/flipper/ui/public/js/bootstrap.min.js +7 -0
- data/lib/flipper/ui/public/js/bootstrap/affix.js +162 -0
- data/lib/flipper/ui/public/js/bootstrap/alert.js +94 -0
- data/lib/flipper/ui/public/js/bootstrap/button.js +116 -0
- data/lib/flipper/ui/public/js/bootstrap/carousel.js +237 -0
- data/lib/flipper/ui/public/js/bootstrap/collapse.js +211 -0
- data/lib/flipper/ui/public/js/bootstrap/dropdown.js +161 -0
- data/lib/flipper/ui/public/js/bootstrap/modal.js +339 -0
- data/lib/flipper/ui/public/js/bootstrap/popover.js +108 -0
- data/lib/flipper/ui/public/js/bootstrap/scrollspy.js +172 -0
- data/lib/flipper/ui/public/js/bootstrap/tab.js +153 -0
- data/lib/flipper/ui/public/js/bootstrap/tooltip.js +476 -0
- data/lib/flipper/ui/public/js/bootstrap/transition.js +59 -0
- data/lib/flipper/ui/public/octicons/LICENSE.txt +9 -0
- data/lib/flipper/ui/public/octicons/README.md +1 -0
- data/lib/flipper/ui/public/octicons/octicons-local.ttf +0 -0
- data/lib/flipper/ui/public/octicons/octicons.css +236 -0
- data/lib/flipper/ui/public/octicons/octicons.eot +0 -0
- data/lib/flipper/ui/public/octicons/octicons.less +235 -0
- data/lib/flipper/ui/public/octicons/octicons.svg +200 -0
- data/lib/flipper/ui/public/octicons/octicons.ttf +0 -0
- data/lib/flipper/ui/public/octicons/octicons.woff +0 -0
- data/lib/flipper/ui/public/octicons/sprockets-octicons.scss +232 -0
- data/lib/flipper/ui/util.rb +4 -0
- data/lib/flipper/ui/version.rb +1 -1
- data/lib/flipper/ui/views/add_actor.erb +22 -0
- data/lib/flipper/ui/views/add_feature.erb +18 -0
- data/lib/flipper/ui/views/add_group.erb +31 -0
- data/lib/flipper/ui/views/feature.erb +209 -0
- data/lib/flipper/ui/views/features.erb +46 -0
- data/lib/flipper/ui/views/layout.erb +31 -149
- data/script/release +15 -0
- data/spec/flipper/ui/actions/actors_gate_spec.rb +68 -0
- data/spec/flipper/ui/actions/add_feature_spec.rb +17 -0
- data/spec/flipper/ui/actions/boolean_gate_spec.rb +41 -0
- data/spec/flipper/ui/actions/feature_spec.rb +59 -0
- data/spec/flipper/ui/actions/features_spec.rb +37 -0
- data/spec/flipper/ui/actions/file_spec.rb +43 -0
- data/spec/flipper/ui/actions/gate_spec.rb +24 -0
- data/spec/flipper/ui/actions/groups_gate_spec.rb +80 -0
- data/spec/flipper/ui/actions/home_spec.rb +16 -0
- data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +40 -0
- data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +39 -0
- data/spec/flipper/ui/decorators/feature_spec.rb +38 -1
- data/spec/flipper/ui/decorators/gate_spec.rb +1 -1
- data/spec/flipper/ui_spec.rb +18 -441
- data/spec/helper.rb +22 -7
- metadata +199 -52
- data/examples/flipper.html +0 -14
- data/examples/flipper.png +0 -0
- data/lib/flipper/ui/assets/javascripts/spine/ajax.coffee +0 -223
- data/lib/flipper/ui/assets/javascripts/spine/list.coffee +0 -43
- data/lib/flipper/ui/assets/javascripts/spine/local.coffee +0 -16
- data/lib/flipper/ui/assets/javascripts/spine/manager.coffee +0 -83
- data/lib/flipper/ui/assets/javascripts/spine/relation.coffee +0 -148
- data/lib/flipper/ui/assets/javascripts/spine/route.coffee +0 -146
- data/lib/flipper/ui/assets/javascripts/spine/spine.coffee +0 -542
- data/lib/flipper/ui/assets/javascripts/spine/version +0 -1
- data/lib/flipper/ui/public/css/images/animated-overlay.gif +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_flat_10_000000_40x100.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_222222_256x240.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_228ef1_256x240.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_ef8c08_256x240.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_ffd27a_256x240.png +0 -0
- data/lib/flipper/ui/public/css/images/ui-icons_ffffff_256x240.png +0 -0
- data/lib/flipper/ui/public/css/jquery-ui-1.10.3.slider.min.css +0 -5
- data/lib/flipper/ui/public/js/handlebars.js +0 -1992
- data/lib/flipper/ui/public/js/jquery-ui-1.10.3.slider.min.js +0 -6
- data/lib/flipper/ui/public/js/jquery.js +0 -9555
- data/lib/flipper/ui/public/js/jquery.min.js +0 -4
- data/lib/flipper/ui/public/js/jquery.min.map +0 -1
- data/lib/flipper/ui/public/js/spine/ajax.js +0 -320
- data/lib/flipper/ui/public/js/spine/list.js +0 -72
- data/lib/flipper/ui/public/js/spine/local.js +0 -29
- data/lib/flipper/ui/public/js/spine/manager.js +0 -157
- data/lib/flipper/ui/public/js/spine/relation.js +0 -260
- data/lib/flipper/ui/public/js/spine/route.js +0 -223
- data/lib/flipper/ui/public/js/spine/spine.js +0 -927
- data/lib/flipper/ui/views/index.erb +0 -9
data/script/release
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
#/ Usage: release
|
3
|
+
#/
|
4
|
+
#/ Package and release the gem to rubyforge.
|
5
|
+
#/
|
6
|
+
|
7
|
+
set -e
|
8
|
+
cd $(dirname "$0")/..
|
9
|
+
|
10
|
+
[ "$1" = "--help" -o "$1" = "-h" -o "$1" = "help" ] && {
|
11
|
+
grep '^#/' <"$0"| cut -c4-
|
12
|
+
exit 0
|
13
|
+
}
|
14
|
+
|
15
|
+
script/bootstrap && bundle exec rake release
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'flipper/ui/actor'
|
3
|
+
|
4
|
+
describe Flipper::UI::Actions::ActorsGate do
|
5
|
+
describe "GET /features/:feature/actors" do
|
6
|
+
before do
|
7
|
+
get "features/search/actors"
|
8
|
+
end
|
9
|
+
|
10
|
+
it "responds with success" do
|
11
|
+
last_response.status.should be(200)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "renders add new actor form" do
|
15
|
+
last_response.body.should include('<form action="/features/search/actors" method="post">')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "POST /features/:feature/actors" do
|
20
|
+
context "enabling an actor" do
|
21
|
+
before do
|
22
|
+
post "features/search/actors",
|
23
|
+
{"value" => "User:6", "operation" => "enable", "authenticity_token" => "a"},
|
24
|
+
"rack.session" => {:csrf => "a"}
|
25
|
+
end
|
26
|
+
|
27
|
+
it "adds item to members" do
|
28
|
+
flipper[:search].actors_value.should include("User:6")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "redirects back to feature" do
|
32
|
+
last_response.status.should be(302)
|
33
|
+
last_response.headers["Location"].should eq("/features/search")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "disabling an actor" do
|
38
|
+
before do
|
39
|
+
flipper[:search].enable_actor Flipper::UI::Actor.new("User:6")
|
40
|
+
post "features/search/actors",
|
41
|
+
{"value" => "User:6", "operation" => "disable", "authenticity_token" => "a"},
|
42
|
+
"rack.session" => {:csrf => "a"}
|
43
|
+
end
|
44
|
+
|
45
|
+
it "removes item from members" do
|
46
|
+
flipper[:search].actors_value.should_not include("User:6")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "redirects back to feature" do
|
50
|
+
last_response.status.should be(302)
|
51
|
+
last_response.headers["Location"].should eq("/features/search")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "for an invalid actor value" do
|
56
|
+
before do
|
57
|
+
post "features/search/actors",
|
58
|
+
{"value" => "", "operation" => "enable", "authenticity_token" => "a"},
|
59
|
+
"rack.session" => {:csrf => "a"}
|
60
|
+
end
|
61
|
+
|
62
|
+
it "redirects back to feature" do
|
63
|
+
last_response.status.should be(302)
|
64
|
+
last_response.headers["Location"].should eq("/features/search/actors?error=%22%22+is+not+a+valid+actor+value.")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Flipper::UI::Actions::AddFeature do
|
4
|
+
describe "GET /features/new" do
|
5
|
+
before do
|
6
|
+
get "/features/new"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "responds with success" do
|
10
|
+
last_response.status.should be(200)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "renders template" do
|
14
|
+
last_response.body.should include('<form action="/features" method="post">')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Flipper::UI::Actions::BooleanGate do
|
4
|
+
describe "POST /features/:feature/boolean" do
|
5
|
+
context "with enable" do
|
6
|
+
before do
|
7
|
+
flipper.disable :search
|
8
|
+
post "features/search/boolean",
|
9
|
+
{"action" => "Enable", "authenticity_token" => "a"},
|
10
|
+
"rack.session" => {:csrf => "a"}
|
11
|
+
end
|
12
|
+
|
13
|
+
it "enables the feature" do
|
14
|
+
flipper.enabled?(:search).should be(true)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "redirects back to feature" do
|
18
|
+
last_response.status.should be(302)
|
19
|
+
last_response.headers["Location"].should eq("/features/search")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with disable" do
|
24
|
+
before do
|
25
|
+
flipper.enable :search
|
26
|
+
post "features/search/boolean",
|
27
|
+
{"action" => "Disable", "authenticity_token" => "a"},
|
28
|
+
"rack.session" => {:csrf => "a"}
|
29
|
+
end
|
30
|
+
|
31
|
+
it "disables the feature" do
|
32
|
+
flipper.enabled?(:search).should be(false)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "redirects back to feature" do
|
36
|
+
last_response.status.should be(302)
|
37
|
+
last_response.headers["Location"].should eq("/features/search")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Flipper::UI::Actions::Feature do
|
4
|
+
describe "DELETE /features/:feature" do
|
5
|
+
before do
|
6
|
+
flipper.enable :search
|
7
|
+
delete "/features/search",
|
8
|
+
{"authenticity_token" => "a"},
|
9
|
+
"rack.session" => {:csrf => "a"}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "removes feature" do
|
13
|
+
flipper.features.map(&:key).should_not include("search")
|
14
|
+
end
|
15
|
+
|
16
|
+
it "redirects to features" do
|
17
|
+
last_response.status.should be(302)
|
18
|
+
last_response.headers["Location"].should eq("/features")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "POST /features/:feature with _method=DELETE" do
|
23
|
+
before do
|
24
|
+
flipper.enable :search
|
25
|
+
post "/features/search",
|
26
|
+
{"_method" => "DELETE", "authenticity_token" => "a"},
|
27
|
+
"rack.session" => {:csrf => "a"}
|
28
|
+
end
|
29
|
+
|
30
|
+
it "removes feature" do
|
31
|
+
flipper.features.map(&:key).should_not include("search")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "redirects to features" do
|
35
|
+
last_response.status.should be(302)
|
36
|
+
last_response.headers["Location"].should eq("/features")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "GET /features/:feature" do
|
41
|
+
before do
|
42
|
+
get "/features/search"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "responds with success" do
|
46
|
+
last_response.status.should be(200)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "renders template" do
|
50
|
+
last_response.body.should include("search")
|
51
|
+
last_response.body.should include("Enable")
|
52
|
+
last_response.body.should include("Disable")
|
53
|
+
last_response.body.should include("Actors")
|
54
|
+
last_response.body.should include("Groups")
|
55
|
+
last_response.body.should include("Percentage of Time")
|
56
|
+
last_response.body.should include("Percentage of Actors")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Flipper::UI::Actions::Features do
|
4
|
+
describe "GET /features" do
|
5
|
+
before do
|
6
|
+
flipper[:stats].enable
|
7
|
+
flipper[:search].enable
|
8
|
+
get "/features"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "responds with success" do
|
12
|
+
last_response.status.should be(200)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "renders template" do
|
16
|
+
last_response.body.should include("stats")
|
17
|
+
last_response.body.should include("search")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "POST /features" do
|
22
|
+
before do
|
23
|
+
post "/features",
|
24
|
+
{"value" => "notifications_next", "authenticity_token" => "a"},
|
25
|
+
"rack.session" => {:csrf => "a"}
|
26
|
+
end
|
27
|
+
|
28
|
+
it "adds feature" do
|
29
|
+
flipper.features.map(&:key).should include("notifications_next")
|
30
|
+
end
|
31
|
+
|
32
|
+
it "redirects to features" do
|
33
|
+
last_response.status.should be(302)
|
34
|
+
last_response.headers["Location"].should eq("/features")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Flipper::UI::Actions::File do
|
4
|
+
describe "GET /images/logo.png" do
|
5
|
+
before do
|
6
|
+
get '/images/logo.png'
|
7
|
+
end
|
8
|
+
|
9
|
+
it "responds with 200" do
|
10
|
+
last_response.status.should be(200)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "GET /css/application.css" do
|
15
|
+
before do
|
16
|
+
get '/css/application.css'
|
17
|
+
end
|
18
|
+
|
19
|
+
it "responds with 200" do
|
20
|
+
last_response.status.should be(200)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "GET /fonts/bootstrap/glyphicons-halflings-regular.eot" do
|
25
|
+
before do
|
26
|
+
get '/fonts/bootstrap/glyphicons-halflings-regular.eot'
|
27
|
+
end
|
28
|
+
|
29
|
+
it "responds with 200" do
|
30
|
+
last_response.status.should be(200)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "GET /octicons/octicons.eot" do
|
35
|
+
before do
|
36
|
+
get '/octicons/octicons.eot'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "responds with 200" do
|
40
|
+
last_response.status.should be(200)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Flipper::UI::Actions::Gate do
|
4
|
+
describe "POST /features/:feature/non-existent-gate" do
|
5
|
+
before do
|
6
|
+
post "/features/search/non-existent-gate",
|
7
|
+
{"authenticity_token" => "a"},
|
8
|
+
"rack.session" => {:csrf => "a"}
|
9
|
+
end
|
10
|
+
|
11
|
+
it "responds with redirect" do
|
12
|
+
last_response.status.should be(302)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "escapes error message" do
|
16
|
+
last_response.headers["Location"].should eq("/features/search?error=%22non-existent-gate%22+gate+does+not+exist+therefore+it+cannot+be+updated.")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "renders error in template" do
|
20
|
+
follow_redirect!
|
21
|
+
last_response.body.should match(/non-existent-gate.*gate does not exist/)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Flipper::UI::Actions::GroupsGate do
|
4
|
+
describe "GET /features/:feature/groups" do
|
5
|
+
before do
|
6
|
+
Flipper.register(:admins) { |user| user.admin? }
|
7
|
+
get "features/search/groups"
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
Flipper.unregister_groups
|
12
|
+
end
|
13
|
+
|
14
|
+
it "responds with success" do
|
15
|
+
last_response.status.should be(200)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "renders add new group form" do
|
19
|
+
last_response.body.should include('<form action="/features/search/groups" method="post">')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "POST /features/:feature/groups" do
|
24
|
+
before do
|
25
|
+
Flipper.register(:admins) { |user| user.admin? }
|
26
|
+
end
|
27
|
+
|
28
|
+
after do
|
29
|
+
Flipper.unregister_groups
|
30
|
+
end
|
31
|
+
|
32
|
+
context "enabling a group" do
|
33
|
+
before do
|
34
|
+
post "features/search/groups",
|
35
|
+
{"value" => "admins", "operation" => "enable", "authenticity_token" => "a"},
|
36
|
+
"rack.session" => {:csrf => "a"}
|
37
|
+
end
|
38
|
+
|
39
|
+
it "adds item to members" do
|
40
|
+
flipper[:search].groups_value.should include("admins")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "redirects back to feature" do
|
44
|
+
last_response.status.should be(302)
|
45
|
+
last_response.headers["Location"].should eq("/features/search")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "disabling a group" do
|
50
|
+
before do
|
51
|
+
flipper[:search].enable_group :admins
|
52
|
+
post "features/search/groups",
|
53
|
+
{"value" => "admins", "operation" => "disable", "authenticity_token" => "a"},
|
54
|
+
"rack.session" => {:csrf => "a"}
|
55
|
+
end
|
56
|
+
|
57
|
+
it "removes item from members" do
|
58
|
+
flipper[:search].groups_value.should_not include("admins")
|
59
|
+
end
|
60
|
+
|
61
|
+
it "redirects back to feature" do
|
62
|
+
last_response.status.should be(302)
|
63
|
+
last_response.headers["Location"].should eq("/features/search")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "for an unregistered group" do
|
68
|
+
before do
|
69
|
+
post "features/search/groups",
|
70
|
+
{"value" => "not_here", "operation" => "enable", "authenticity_token" => "a"},
|
71
|
+
"rack.session" => {:csrf => "a"}
|
72
|
+
end
|
73
|
+
|
74
|
+
it "redirects back to feature" do
|
75
|
+
last_response.status.should be(302)
|
76
|
+
last_response.headers["Location"].should eq("/features/search/groups?error=The+group+named+%22not_here%22+has+not+been+registered.")
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Flipper::UI::Actions::Home do
|
4
|
+
describe "GET /" do
|
5
|
+
before do
|
6
|
+
flipper[:stats].enable
|
7
|
+
flipper[:search].enable
|
8
|
+
get "/"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "responds with redirect" do
|
12
|
+
last_response.status.should be(302)
|
13
|
+
last_response.headers["Location"].should eq("/features")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'helper'
|
2
|
+
require 'flipper/ui/actor'
|
3
|
+
|
4
|
+
describe Flipper::UI::Actions::PercentageOfActorsGate do
|
5
|
+
describe "POST /features/:feature/percentage_of_actors" do
|
6
|
+
context "with valid value" do
|
7
|
+
before do
|
8
|
+
post "features/search/percentage_of_actors",
|
9
|
+
{"value" => "24", "authenticity_token" => "a"},
|
10
|
+
"rack.session" => {:csrf => "a"}
|
11
|
+
end
|
12
|
+
|
13
|
+
it "enables the feature" do
|
14
|
+
flipper[:search].percentage_of_actors_value.should be(24)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "redirects back to feature" do
|
18
|
+
last_response.status.should be(302)
|
19
|
+
last_response.headers["Location"].should eq("/features/search")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with invalid value" do
|
24
|
+
before do
|
25
|
+
post "features/search/percentage_of_actors",
|
26
|
+
{"value" => "555", "authenticity_token" => "a"},
|
27
|
+
"rack.session" => {:csrf => "a"}
|
28
|
+
end
|
29
|
+
|
30
|
+
it "does not change value" do
|
31
|
+
flipper[:search].percentage_of_actors_value.should be(0)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "redirects back to feature" do
|
35
|
+
last_response.status.should be(302)
|
36
|
+
last_response.headers["Location"].should eq("/features/search?error=Invalid+percentage+of+actors+value%3A+value+must+be+a+positive+number+less+than+or+equal+to+100%2C+but+was+555")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|