Commit 3977fd27618d606d64c1c237567d19429997a51b

Authored by Jared Pace
1 parent a5cf65d0
Exists in master and in 1 other branch production

Add full management controls for users.

README.md
... ... @@ -6,4 +6,12 @@ Installation
6 6  
7 7 1. Install MongoDB
8 8 2. Install & Run Bundler
9   -3. Seed DB - rake db:seed
10 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 19 \ No newline at end of file
... ...
app/controllers/application_controller.rb
... ... @@ -5,7 +5,7 @@ class ApplicationController < ActionController::Base
5 5  
6 6 protected
7 7  
8   - def authenticate_admin!
  8 + def require_admin!
9 9 redirect_to(root_path) and return(false) unless user_signed_in? && current_user.admin?
10 10 end
11 11  
... ...
app/controllers/users_controller.rb
1 1 class UsersController < ApplicationController
2 2 respond_to :html
3 3  
4   - before_filter :authenticate_admin!
  4 + before_filter :require_admin!
5 5  
6 6 def index
7 7 @users = User.paginate(:page => params[:page])
... ... @@ -12,18 +12,47 @@ class UsersController &lt; ApplicationController
12 12 end
13 13  
14 14 def new
  15 + @user = User.new
15 16 end
16 17  
17 18 def edit
  19 + @user = User.find(params[:id])
18 20 end
19 21  
20 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 31 end
22 32  
23 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 48 end
25 49  
26 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 56 end
28 57  
29 58 end
... ...
app/models/user.rb
... ... @@ -8,7 +8,6 @@ class User
8 8  
9 9 field :name
10 10 field :admin, :type => Boolean, :default => false
11   - key :name
12 11  
13 12 validates_presence_of :name
14 13  
... ...
app/views/users/_fields.html.haml 0 → 100644
... ... @@ -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 20 \ No newline at end of file
... ...
app/views/users/edit.html.haml 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +- content_for :title, "Edit #{@user.name}"
  2 +
  3 += form_for @user do |f|
  4 + = @user.errors.full_messages.to_sentence
  5 + = render 'fields', :f => f
  6 +
  7 + %div= f.submit 'Update'
0 8 \ No newline at end of file
... ...
app/views/users/new.html.haml 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +- content_for :title, 'New User'
  2 +
  3 += form_for @user do |f|
  4 +
  5 + = render 'fields', :f => f
  6 +
  7 + %div= f.submit 'Add'
0 8 \ No newline at end of file
... ...
spec/controllers/deploys_controller_spec.rb
... ... @@ -30,7 +30,7 @@ describe DeploysController do
30 30 post :create, :deploy => @params, :api_key => 'APIKEY'
31 31 end
32 32  
33   - it 'sends an email notification', :focused => true do
  33 + it 'sends an email notification' do
34 34 post :create, :deploy => @params, :api_key => 'APIKEY'
35 35 email = ActionMailer::Base.deliveries.last
36 36 email.to.should include(@app.watchers.first.email)
... ...
spec/controllers/users_controller_spec.rb
... ... @@ -26,5 +26,105 @@ describe UsersController do
26 26 assigns(:user).should == user
27 27 end
28 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 129 end
30 130 end
... ...
spec/spec_helper.rb
... ... @@ -13,6 +13,10 @@ RSpec.configure do |config|
13 13 config.mock_with :rspec
14 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 20 config.before(:each) do
17 21 DatabaseCleaner.orm = "mongoid"
18 22 DatabaseCleaner.strategy = :truncation
... ...