recruiter can edit candidate

completes #82
This commit is contained in:
Mark Moser 2016-09-16 11:36:48 -05:00
parent f17ed8e8b1
commit a51a751524
12 changed files with 160 additions and 81 deletions

View File

@ -63,8 +63,9 @@ guard :minitest, spring: "bin/rails test", all_after_pass: true do
watch(%r{^lib/(.+)\.rb$}) { |m| "test/lib/#{m[1]}_test.rb" } watch(%r{^lib/(.+)\.rb$}) { |m| "test/lib/#{m[1]}_test.rb" }
watch(%r{^test/test_helper\.rb$}) { 'test' } watch(%r{^test/test_helper\.rb$}) { 'test' }
watch(%r{^test/.+_test\.rb$}) watch(%r{^test/.+_test\.rb$})
# run controller/integration test when touching erb files # run controller/integration test when touching the router or erb files
watch(%r{^app/views/((?!_mailer).)*([^/]+)\.erb$}) { ["test/controllers", "test/integration"] } watch(%r{^app/views/((?!_mailer).)*([^/]+)\.erb$}) { ["test/controllers", "test/integration"] }
watch(%r{^config/routes.rb}) { ["test/controllers", "test/integration"] }
# run mailers/integration test when touching mailer erb files # run mailers/integration test when touching mailer erb files
watch(%r{^app/views/(.*_mailer/)?([^/]+)\.erb$}) { ["test/mailers", "test/integration"] } watch(%r{^app/views/(.*_mailer/)?([^/]+)\.erb$}) { ["test/mailers", "test/integration"] }
end end

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class RecruiterController < ApplicationController class RecruiterController < ApplicationController
before_action :authorize_recruiter, except: [:login, :auth] before_action :authorize_recruiter, except: [:login, :auth]
before_action :collect_quizzes, except: [:login, :auth]
def index def index
@candidates = current_recruiter.candidates @candidates = current_recruiter.candidates
@ -8,12 +9,10 @@ class RecruiterController < ApplicationController
def new def new
@candidate = Candidate.new @candidate = Candidate.new
@quizzes = Quiz.order(:name) render :new
render :form
end end
def create def create
@quizzes = Quiz.order(:name)
@candidate = Candidate.create(candidate_params.merge(recruiter_id: current_recruiter.id)) @candidate = Candidate.create(candidate_params.merge(recruiter_id: current_recruiter.id))
if @candidate.persisted? if @candidate.persisted?
@ -22,7 +21,23 @@ class RecruiterController < ApplicationController
redirect_to recruiter_path, flash: { success: "Sucessfully created candidate #{@candidate.name}" } redirect_to recruiter_path, flash: { success: "Sucessfully created candidate #{@candidate.name}" }
else else
flash[:error] = "Failed to save candidate." flash[:error] = "Failed to save candidate."
render :form render :new
end
end
def edit
@candidate = Candidate.find_by(id: params[:id])
end
def update
@candidate = Candidate.find_by(id: params[:id])
@candidate.update(candidate_params)
if @candidate.save
redirect_to recruiter_path, flash: { success: "#{@candidate.name} updated!" }
else
flash[:error] = "Failed to save candidate."
render :edit
end end
end end
@ -58,4 +73,8 @@ class RecruiterController < ApplicationController
def candidate_params def candidate_params
params.require(:candidate).permit(:name, :email, :experience, :quiz_id) params.require(:candidate).permit(:name, :email, :experience, :quiz_id)
end end
def collect_quizzes
@quizzes ||= Quiz.order(:name)
end
end end

View File

@ -11,6 +11,10 @@ module ApplicationHelper
], disabled: "-", selected: (val.blank? ? '' : val)) ], disabled: "-", selected: (val.blank? ? '' : val))
end end
def quiz_options quizzes, selected_val
options_from_collection_for_select(quizzes, 'id', 'name', selected_val)
end
def admin_role_options val def admin_role_options val
options_for_select([ options_for_select([
%w(Reviewer reviewer), %w(Reviewer reviewer),

View File

@ -0,0 +1,25 @@
<%= render partial: 'shared/form_model_errors', locals: { obj: candidate } %>
<%= form_for candidate, url: create_candidate_path do |form| %>
<div class="form-group">
<%= form.label :name, "Candidate name" %>
<%= form.text_field :name %>
</div>
<div class="form-group">
<%= form.label :email, "Candidate email" %>
<%= form.email_field :email %>
</div>
<div class="form-group">
<%= form.label :experience, "Years of experience" %>
<%= form.select :experience, experience_options(candidate.experience), include_blank: false %>
</div>
<div class="form-group">
<%= form.label :quiz_id, "Quiz" %>
<%= form.select :quiz_id, quiz_options(quizzes, candidate.quiz_id), include_blank: (quizzes.size > 1) %>
</div>
<%= submit_tag %>
<% end %>

View File

@ -0,0 +1,6 @@
<main class="intro_tpl">
<h1>Edit: <%= @candidate.name %></h1>
<p><strong>Test ID: </strong><%= @candidate.test_hash %></p>
<%= render partial: 'form', locals: { candidate: @candidate, quizzes: @quizzes } %>
</main>

View File

@ -1,28 +0,0 @@
<main class="intro_tpl">
<h1>New Candidate</h1>
<%= render partial: 'shared/form_model_errors', locals: { obj: @candidate } %>
<%= form_for @candidate, url: create_candidate_path do |form| %>
<div class="form-group">
<%= form.label :name, "Candidate name" %>
<%= form.text_field :name %>
</div>
<div class="form-group">
<%= form.label :email, "Candidate email" %>
<%= form.email_field :email %>
</div>
<div class="form-group">
<%= form.label :experience, "Years of experience" %>
<%= form.select :experience, experience_options(@candidate.experience), include_blank: false %>
</div>
<div class="form-group">
<%= form.label :quiz_id, "Quiz" %>
<%= form.select :quiz_id, options_from_collection_for_select(@quizzes, 'id', 'name'), include_blank: (@quizzes.size > 1) %>
</div>
<%= submit_tag "Create" %>
<% end %>
</main>

View File

@ -18,7 +18,7 @@
<% @candidates.each do |candidate| %> <% @candidates.each do |candidate| %>
<tr> <tr>
<td><%= candidate.name %></td> <td><%= link_to candidate.name, edit_candidate_path(candidate.id) %></td>
<td><%= candidate.test_hash %></td> <td><%= candidate.test_hash %></td>
<td> <td>
<%= mail_to(candidate.email) %> <%= mail_to(candidate.email) %>

View File

@ -0,0 +1,5 @@
<main class="intro_tpl">
<h1>New Candidate</h1>
<%= render partial: 'form', locals: { candidate: @candidate, quizzes: @quizzes } %>
</main>

View File

@ -63,8 +63,10 @@ Rails.application.routes.draw do
get "/resend/welcome/:id", to: "recruiter#resend_welcome", as: :resend_welcome get "/resend/welcome/:id", to: "recruiter#resend_welcome", as: :resend_welcome
get "/recruiter", to: "recruiter#index", as: :recruiter get "/recruiter", to: "recruiter#index", as: :recruiter
get "/recruiter/new-candidate", to: "recruiter#new", as: :new_candidate get "/recruiter/candidate", to: "recruiter#new", as: :new_candidate
post "/recruiter/new-candidate", to: "recruiter#create", as: :create_candidate post "/recruiter/candidate", to: "recruiter#create", as: :create_candidate
get "/recruiter/candidate/:id", to: "recruiter#edit", as: :edit_candidate
post "/recruiter/candidate/:id", to: "recruiter#update", as: :update_candidate
get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout get "/recruiter/logout", to: "recruiter#logout", as: :recruiter_logout
get "/recruiter/login", to: "recruiter#login", as: :recruiter_login get "/recruiter/login", to: "recruiter#login", as: :recruiter_login
post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth post "/recruiter/login", to: "recruiter#auth", as: :recruiter_auth

View File

@ -0,0 +1,56 @@
# frozen_string_literal: true
require 'test_helper'
class RecruiterControllerTest < ActionDispatch::IntegrationTest
test "should get login" do
get recruiter_login_url
assert_response :success
end
test 'should logout and reset session' do
auth_recruiter
get recruiter_logout_path
assert :success
assert session[:user].nil?
end
test "should require auth or redirect" do
get recruiter_url
assert_redirected_to recruiter_login_path
get new_candidate_url
assert_redirected_to recruiter_login_path
post create_candidate_url, params: { candidate: { name: 'foo', email: 'bar', experience: 'baz' } }
assert_redirected_to recruiter_login_path
end
test "should auth to index" do
auth_recruiter
assert_redirected_to recruiter_path
assert session[:user].present?
end
test "should fail auth with flash" do
post recruiter_auth_url, params: { auth:
{ email: 'pdr.recruiter@mailinator.com', password: 'bad-password' } }
assert_redirected_to recruiter_login_path
assert flash[:error]
end
test "should get candidate list" do
auth_recruiter
get recruiter_url
assert_response :success
assert assigns(:candidates), "@candidates not present"
end
test 'should have edit links' do
auth_recruiter
get recruiter_url
assert_response :success
assert_select "a[href='#{edit_candidate_path(candidates(:martha))}']"
end
end

View File

@ -4,51 +4,6 @@ require 'test_helper'
class RecruiterControllerTest < ActionDispatch::IntegrationTest class RecruiterControllerTest < ActionDispatch::IntegrationTest
include ActiveJob::TestHelper include ActiveJob::TestHelper
test "should get login" do
get recruiter_login_url
assert_response :success
end
test 'should logout and reset session' do
auth_recruiter
get recruiter_logout_path
assert :success
assert session[:user].nil?
end
test "should require auth or redirect" do
get recruiter_url
assert_redirected_to recruiter_login_path
get new_candidate_url
assert_redirected_to recruiter_login_path
post create_candidate_url, params: { candidate: { name: 'foo', email: 'bar', experience: 'baz' } }
assert_redirected_to recruiter_login_path
end
test "should auth to index" do
auth_recruiter
assert_redirected_to recruiter_path
assert session[:user].present?
end
test "should fail auth with flash" do
post recruiter_auth_url, params: { auth:
{ email: 'pdr.recruiter@mailinator.com', password: 'bad-password' } }
assert_redirected_to recruiter_login_path
assert flash[:error]
end
test "should get candidate list" do
auth_recruiter
get recruiter_url
assert_response :success
assert assigns(:candidates), "@candidates not present"
end
test "should get new" do test "should get new" do
auth_recruiter auth_recruiter
get new_candidate_url get new_candidate_url

View File

@ -0,0 +1,34 @@
# frozen_string_literal: true
require 'test_helper'
class RecruiterControllerTest < ActionDispatch::IntegrationTest
test 'should edit candidate' do
auth_recruiter
candidate = candidates(:martha)
get edit_candidate_path(candidate.id)
assert_response :success
assert_select 'form'
end
test 'should update candidate, but NOT test_hash' do
auth_recruiter
candidate = candidates(:martha)
post update_candidate_url(id: candidate.id), params:
{ candidate: { name: 'new name', email: "mail@martha.me", test_hash: 'SOMENEWSTRING' } }
refute_equal candidate.name, Candidate.find_by(id: candidate.id).name
assert_equal candidate.test_hash, Candidate.find_by(id: candidate.id).test_hash
assert_redirected_to recruiter_url
end
test 'should redirect to form on fail' do
auth_recruiter
candidate = candidates(:martha)
post update_candidate_url(id: candidate.id), params:
{ candidate: { name: 'new name', email: "mail@martha" } }
assert :success
assert_match(/failed.*save/i, flash[:error])
end
end