Commit 3977fd27618d606d64c1c237567d19429997a51b
1 parent
a5cf65d0
Exists in
master
and in
1 other branch
Add full management controls for users.
Showing
10 changed files
with
178 additions
and
5 deletions
Show diff stats
README.md
@@ -6,4 +6,12 @@ Installation | @@ -6,4 +6,12 @@ Installation | ||
6 | 6 | ||
7 | 1. Install MongoDB | 7 | 1. Install MongoDB |
8 | 2. Install & Run Bundler | 8 | 2. Install & Run Bundler |
9 | -3. Seed DB - rake db:seed | ||
10 | \ No newline at end of file | 9 | \ No newline at end of file |
10 | +3. Seed DB - rake db:seed | ||
11 | + | ||
12 | +TODO | ||
13 | +---- | ||
14 | + | ||
15 | +Add capistrano | ||
16 | +Add form.error_messages | ||
17 | +Add a deployment view | ||
18 | +Add ability for watchers to be configured for types of notifications they should receive | ||
11 | \ No newline at end of file | 19 | \ No newline at end of file |
app/controllers/application_controller.rb
@@ -5,7 +5,7 @@ class ApplicationController < ActionController::Base | @@ -5,7 +5,7 @@ class ApplicationController < ActionController::Base | ||
5 | 5 | ||
6 | protected | 6 | protected |
7 | 7 | ||
8 | - def authenticate_admin! | 8 | + def require_admin! |
9 | redirect_to(root_path) and return(false) unless user_signed_in? && current_user.admin? | 9 | redirect_to(root_path) and return(false) unless user_signed_in? && current_user.admin? |
10 | end | 10 | end |
11 | 11 |
app/controllers/users_controller.rb
1 | class UsersController < ApplicationController | 1 | class UsersController < ApplicationController |
2 | respond_to :html | 2 | respond_to :html |
3 | 3 | ||
4 | - before_filter :authenticate_admin! | 4 | + before_filter :require_admin! |
5 | 5 | ||
6 | def index | 6 | def index |
7 | @users = User.paginate(:page => params[:page]) | 7 | @users = User.paginate(:page => params[:page]) |
@@ -12,18 +12,47 @@ class UsersController < ApplicationController | @@ -12,18 +12,47 @@ class UsersController < ApplicationController | ||
12 | end | 12 | end |
13 | 13 | ||
14 | def new | 14 | def new |
15 | + @user = User.new | ||
15 | end | 16 | end |
16 | 17 | ||
17 | def edit | 18 | def edit |
19 | + @user = User.find(params[:id]) | ||
18 | end | 20 | end |
19 | 21 | ||
20 | def create | 22 | def create |
23 | + @user = User.new(params[:user]) | ||
24 | + | ||
25 | + if @user.save | ||
26 | + flash[:success] = "#{@user.name} is now part of the team. Be sure to add them as a project watcher." | ||
27 | + redirect_to user_path(@user) | ||
28 | + else | ||
29 | + render :new | ||
30 | + end | ||
21 | end | 31 | end |
22 | 32 | ||
23 | def update | 33 | def update |
34 | + # Devise Hack | ||
35 | + if params[:user][:password].blank? && params[:user][:password_confirmation].blank? | ||
36 | + params[:user].delete(:password) | ||
37 | + params[:user].delete(:password_confirmation) | ||
38 | + end | ||
39 | + | ||
40 | + @user = User.find(params[:id]) | ||
41 | + | ||
42 | + if @user.update_attributes(params[:user]) | ||
43 | + flash[:success] = "#{@user.name}'s information was successfully updated" | ||
44 | + redirect_to user_path(@user) | ||
45 | + else | ||
46 | + render :edit | ||
47 | + end | ||
24 | end | 48 | end |
25 | 49 | ||
26 | def destroy | 50 | def destroy |
51 | + @user = User.find(params[:id]) | ||
52 | + @user.destroy | ||
53 | + | ||
54 | + flash[:notice] = "That's sad. #{@user.name} is no longer part of your team." | ||
55 | + redirect_to users_path | ||
27 | end | 56 | end |
28 | 57 | ||
29 | end | 58 | end |
app/models/user.rb
@@ -0,0 +1,19 @@ | @@ -0,0 +1,19 @@ | ||
1 | +.required | ||
2 | + = f.label :name | ||
3 | + = f.text_field :name | ||
4 | + | ||
5 | +.required | ||
6 | + = f.label :email | ||
7 | + = f.text_field :email | ||
8 | + | ||
9 | +.required | ||
10 | + = f.label :password | ||
11 | + = f.password_field :password | ||
12 | + | ||
13 | +.required | ||
14 | + = f.label :password_confirmation | ||
15 | + = f.password_field :password_confirmation | ||
16 | + | ||
17 | +.checkbox | ||
18 | + = f.check_box :admin | ||
19 | + = f.label :admin, 'Admin?' | ||
0 | \ No newline at end of file | 20 | \ No newline at end of file |
spec/controllers/deploys_controller_spec.rb
@@ -30,7 +30,7 @@ describe DeploysController do | @@ -30,7 +30,7 @@ describe DeploysController do | ||
30 | post :create, :deploy => @params, :api_key => 'APIKEY' | 30 | post :create, :deploy => @params, :api_key => 'APIKEY' |
31 | end | 31 | end |
32 | 32 | ||
33 | - it 'sends an email notification', :focused => true do | 33 | + it 'sends an email notification' do |
34 | post :create, :deploy => @params, :api_key => 'APIKEY' | 34 | post :create, :deploy => @params, :api_key => 'APIKEY' |
35 | email = ActionMailer::Base.deliveries.last | 35 | email = ActionMailer::Base.deliveries.last |
36 | email.to.should include(@app.watchers.first.email) | 36 | email.to.should include(@app.watchers.first.email) |
spec/controllers/users_controller_spec.rb
@@ -26,5 +26,105 @@ describe UsersController do | @@ -26,5 +26,105 @@ describe UsersController do | ||
26 | assigns(:user).should == user | 26 | assigns(:user).should == user |
27 | end | 27 | end |
28 | end | 28 | end |
29 | + | ||
30 | + context "GET /users/new" do | ||
31 | + it 'assigns a new user' do | ||
32 | + get :new | ||
33 | + assigns(:user).should be_a(User) | ||
34 | + assigns(:user).should be_new_record | ||
35 | + end | ||
36 | + end | ||
37 | + | ||
38 | + context "GET /users/:id/edit" do | ||
39 | + it 'finds the user' do | ||
40 | + user = Factory(:user) | ||
41 | + get :edit, :id => user.id | ||
42 | + assigns(:user).should == user | ||
43 | + end | ||
44 | + end | ||
45 | + | ||
46 | + context "POST /users" do | ||
47 | + context "when the create is successful" do | ||
48 | + before do | ||
49 | + @user = Factory(:user) | ||
50 | + User.should_receive(:new).and_return(@user) | ||
51 | + @user.should_receive(:save).and_return(true) | ||
52 | + end | ||
53 | + | ||
54 | + it "sets a message to display" do | ||
55 | + post :create | ||
56 | + request.flash[:success].should include('part of the team') | ||
57 | + end | ||
58 | + | ||
59 | + it "redirects to the user's page" do | ||
60 | + post :create | ||
61 | + response.should redirect_to(user_path(@user)) | ||
62 | + end | ||
63 | + end | ||
64 | + | ||
65 | + context "when the create is unsuccessful" do | ||
66 | + before do | ||
67 | + @user = Factory(:user) | ||
68 | + User.should_receive(:new).and_return(@user) | ||
69 | + @user.should_receive(:save).and_return(false) | ||
70 | + end | ||
71 | + | ||
72 | + it "renders the new page" do | ||
73 | + post :create | ||
74 | + response.should render_template(:new) | ||
75 | + end | ||
76 | + end | ||
77 | + end | ||
78 | + | ||
79 | + context "PUT /users/:id" do | ||
80 | + context "when the update is successful" do | ||
81 | + before do | ||
82 | + @user = Factory(:user) | ||
83 | + end | ||
84 | + | ||
85 | + it "sets a message to display" do | ||
86 | + put :update, :id => @user.to_param, :user => {:name => 'Kermit'} | ||
87 | + request.flash[:success].should include('updated') | ||
88 | + end | ||
89 | + | ||
90 | + it "redirects to the user's page" do | ||
91 | + put :update, :id => @user.to_param, :user => {:name => 'Kermit'} | ||
92 | + response.should redirect_to(user_path(@user)) | ||
93 | + end | ||
94 | + end | ||
95 | + | ||
96 | + context "when the update is unsuccessful" do | ||
97 | + before do | ||
98 | + @user = Factory(:user) | ||
99 | + end | ||
100 | + | ||
101 | + it "renders the edit page" do | ||
102 | + put :update, :id => @user.to_param, :user => {:name => nil} | ||
103 | + response.should render_template(:edit) | ||
104 | + end | ||
105 | + end | ||
106 | + end | ||
107 | + | ||
108 | + context "DELETE /users/:id" do | ||
109 | + before do | ||
110 | + @user = Factory(:user) | ||
111 | + end | ||
112 | + | ||
113 | + it "destroys the user" do | ||
114 | + delete :destroy, :id => @user.id | ||
115 | + User.where(:id => @user.id).first.should be_nil | ||
116 | + end | ||
117 | + | ||
118 | + it "redirects to the users index page" do | ||
119 | + delete :destroy, :id => @user.id | ||
120 | + response.should redirect_to(users_path) | ||
121 | + end | ||
122 | + | ||
123 | + it "sets a message to display" do | ||
124 | + delete :destroy, :id => @user.id | ||
125 | + request.flash[:notice].should include('no longer part of your team') | ||
126 | + end | ||
127 | + end | ||
128 | + | ||
29 | end | 129 | end |
30 | end | 130 | end |
spec/spec_helper.rb
@@ -13,6 +13,10 @@ RSpec.configure do |config| | @@ -13,6 +13,10 @@ RSpec.configure do |config| | ||
13 | config.mock_with :rspec | 13 | config.mock_with :rspec |
14 | config.include Devise::TestHelpers, :type => :controller | 14 | config.include Devise::TestHelpers, :type => :controller |
15 | 15 | ||
16 | + config.filter_run :focused => true | ||
17 | + config.run_all_when_everything_filtered = true | ||
18 | + config.alias_example_to :fit, :focused => true | ||
19 | + | ||
16 | config.before(:each) do | 20 | config.before(:each) do |
17 | DatabaseCleaner.orm = "mongoid" | 21 | DatabaseCleaner.orm = "mongoid" |
18 | DatabaseCleaner.strategy = :truncation | 22 | DatabaseCleaner.strategy = :truncation |