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 |