admin controller tests, sans question

This commit is contained in:
Mark Moser 2016-08-18 15:35:17 -05:00
parent 6a3f652dd7
commit 430097b6ef
21 changed files with 275 additions and 55 deletions

View File

@ -1,12 +1,25 @@
module Admin module Admin
class AuthController < AdminController class AuthController < AdminController
skip_before_action :authorize_admin
def login def login
end end
def auth def auth
admin = User.find_by(email: auth_params[:email], role: 'admin')
if admin && admin.authenticate(auth_params[:password])
session[:user] = admin.to_i
redirect_to admin_path
else
redirect_to admin_login_path,
flash: { error: "Sorry, incorrect email or password. Please try again." }
end
end end
def logout def logout
reset_session
redirect_to admin_login_path
end end
end end
end end

View File

@ -1,21 +1,48 @@
module Admin module Admin
class QuizController < AdminController class QuizController < AdminController
def index def index
@quizzes = Quiz.all
end end
def new def new
@quiz = Quiz.new
end end
def create def create
@quiz = Quiz.create(quiz_params)
if @quiz.persisted?
redirect_to admin_quizzes_path, flash: { notice: "Sucessfully created quiz" }
else
flash[:error] = "Failed to save quiz."
render :new
end
end end
def view def view
@quiz = Quiz.find(params[:quiz_id])
end end
def edit def edit
@quiz = Quiz.find(params[:quiz_id])
end end
def update def update
@quiz = Quiz.find(params[:quiz_id])
if @quiz.update_attributes(quiz_params)
redirect_to admin_quiz_path(@quiz.to_i),
flash: { notice: "Sucessfully updated quiz" }
else
flash[:error] = "Failed to update quiz."
render :edit
end
end end
private
def quiz_params
params.require(:quiz).permit(:dept, :unit)
end
end end
end end

View File

@ -1,21 +1,50 @@
module Admin module Admin
class UserController < AdminController class UserController < AdminController
def index def index
@users = User.order(:name)
end end
def new def new
@user = User.new
end end
def create def create
default_passwd = SecureRandom.urlsafe_base64(12)
@user = User.create({ password: default_passwd }.merge(user_params.to_h))
if @user.persisted?
# TODO: UserMailer.welcome(@user, default_passwd).deliver_now
redirect_to admin_users_path, flash: { notice: "Sucessfully created user #{@user.name}" }
else
flash[:error] = "Failed to save user."
render :new
end
end end
def view def view
@user = User.find(params[:user_id])
end end
def edit def edit
@user = User.find(params[:user_id])
end end
def update def update
@user = User.find(params[:user_id])
if @user.update_attributes(user_params)
redirect_to admin_user_path(@user.to_i),
flash: { notice: "Sucessfully updated #{@user.name}" }
else
flash[:error] = "Failed to update user."
render :edit
end
end end
private
def user_params
params.require(:user).permit(:name, :email, :role, :password)
end
end end
end end

View File

@ -1,2 +1,18 @@
class AdminController < ApplicationController class AdminController < ApplicationController
before_action :authorize_admin
def dashboard
end
def current_admin
user_args = { id: session[:user], role: 'admin' }
@current_admin ||= User.find_by(user_args) if session[:user]
end
helper_method :current_admin
private
def authorize_admin
redirect_to admin_login_path unless current_admin
end
end end

View File

@ -1,4 +1,7 @@
class Quiz < ApplicationRecord class Quiz < ApplicationRecord
has_many :questions, -> { order(:sort) } has_many :questions, -> { order(:sort) }
has_many :candidates has_many :candidates
validates_presence_of :dept
validates_presence_of :unit
end end

View File

@ -1,4 +1,8 @@
class User < ApplicationRecord class User < ApplicationRecord
has_secure_password has_secure_password
has_many :candidates, foreign_key: "recruiter_id" has_many :candidates, foreign_key: "recruiter_id"
validates_presence_of :email
validates_presence_of :name
validates_presence_of :role
end end

View File

@ -0,0 +1 @@
huzzah! dashboard

View File

@ -0,0 +1,6 @@
<%= form_for quiz, url: action do |f| %>
<p>Unit: <%= f.text_field :unit %></p>
<p>Dept: <%= f.text_field :dept %></p>
<%= f.submit %>
<% end %>

View File

@ -1,2 +1,4 @@
<h1>Admin::Quizes#edit</h1> <h1>Admin::Quizes#edit</h1>
<p>Find me in app/views/admin/quizes/edit.html.erb</p> <p>Find me in app/views/admin/quizes/edit.html.erb</p>
<%= render partial: 'form', locals: { quiz: @quiz, action: admin_update_quiz_path } %>

View File

@ -1,2 +1,4 @@
<h1>Admin::Quizes#new</h1> <h1>Admin::Quizes#new</h1>
<p>Find me in app/views/admin/quizes/new.html.erb</p> <p>Find me in app/views/admin/quizes/new.html.erb</p>
<%= render partial: 'form', locals: { quiz: @quiz, action: admin_create_quiz_path } %>

View File

@ -1,2 +1,7 @@
<h1>Admin::Quizes#view</h1> <h1>Admin::Quizes#view</h1>
<p>Find me in app/views/admin/quizes/view.html.erb</p> <p>Find me in app/views/admin/quizes/view.html.erb</p>
<main>
<p><%= @quiz.dept %></p>
<p><%= @quiz.unit %></p>
</main>

View File

@ -0,0 +1,7 @@
<%= form_for user, url: action do |f| %>
<p>Name: <%= f.text_field :name %></p>
<p>eMail: <%= f.email_field :email %></p>
<p>Role: <%= f.text_field :role %></p>
<%= f.submit %>
<% end %>

View File

@ -1,2 +1,4 @@
<h1>Admin::Users#edit</h1> <h1>Admin::Users#edit</h1>
<p>Find me in app/views/admin/users/edit.html.erb</p> <p>Find me in app/views/admin/users/edit.html.erb</p>
<%= render partial: 'form', locals: {user: @user, action: admin_update_user_path } %>

View File

@ -1,2 +1,4 @@
<h1>Admin::Users#new</h1> <h1>Admin::Users#new</h1>
<p>Find me in app/views/admin/users/new.html.erb</p> <p>Find me in app/views/admin/users/new.html.erb</p>
<%= render partial: 'form', locals: {user: @user, action: admin_create_user_path } %>

View File

@ -1,2 +1,6 @@
<h1>Admin::Users#view</h1> <h1>Admin::Users#view</h1>
<p>Find me in app/views/admin/users/view.html.erb</p> <p>Find me in app/views/admin/users/view.html.erb</p>
<main>
<%= @user.name %>
</main>

View File

@ -1,7 +1,9 @@
Rails.application.routes.draw do Rails.application.routes.draw do
post "/admin/login", to: "admin/auth#auth", as: :admin_auth post "/admin/login", to: "admin/auth#auth", as: :admin_auth
get "/admin/login", to: "admin/auth#login", as: :admin_login
get "/admin/logout", to: "admin/auth#logout", as: :admin_logout get "/admin/logout", to: "admin/auth#logout", as: :admin_logout
get "/admin", to: "admin/auth#login", as: :admin
get "/admin", to: "admin#dashboard", as: :admin
get "/admin/quizzes", to: "admin/quiz#index", as: :admin_quizzes get "/admin/quizzes", to: "admin/quiz#index", as: :admin_quizzes
get "/admin/quiz/new", to: "admin/quiz#new", as: :admin_new_quiz get "/admin/quiz/new", to: "admin/quiz#new", as: :admin_new_quiz

View File

@ -3,19 +3,38 @@ require 'test_helper'
module Admin module Admin
class AuthControllerTest < ActionDispatch::IntegrationTest class AuthControllerTest < ActionDispatch::IntegrationTest
test "should get login" do test "should get login" do
get admin_url get admin_login_url
assert_response :success assert_response :success
assert_template 'admin/auth/login' assert_template 'admin/auth/login'
end end
test "should get auth" do test "should get logout" do
post admin_auth_url post admin_auth_url, params: { auth:
assert_response :success { email: 'alan.admin@mailinator.com', password: 'password' } }
get admin_logout_url
assert_redirected_to admin_login_url
assert session[:user].nil?
end end
test "should get logout" do test "should auth to dashboard" do
get admin_logout_url post admin_auth_url, params: { auth:
assert_response :success { email: 'alan.admin@mailinator.com', password: 'password' } }
assert_redirected_to admin_url
end
test "recruiter should not admin auth" do
post admin_auth_url, params: { auth:
{ email: 'pdr.recruiter@mailinator.com', password: 'password' } }
assert_redirected_to admin_login_url
assert_match(/incorrect.*email/, flash[:error])
end
test "reviewer should not admin auth" do
post admin_auth_url, params: { auth:
{ email: 'fed.reviewer@mailinator.com', password: 'password' } }
assert_redirected_to admin_login_url
assert_match(/incorrect.*email/, flash[:error])
end end
end end
end end

View File

@ -1,35 +1,35 @@
require 'test_helper' # require 'test_helper'
#
module Admin # module Admin
class QuestionControllerTest < ActionDispatch::IntegrationTest # class QuestionControllerTest < ActionDispatch::IntegrationTest
test "should get index" do # test "should get index" do
get admin_questions_url # get admin_questions_url
assert_response :success # assert_response :success
end # end
#
test "should get new" do # test "should get new" do
get admin_new_question_url # get admin_new_question_url
assert_response :success # assert_response :success
end # end
#
test "should post create" do # test "should post create" do
post admin_create_question_url # post admin_create_question_url
assert_response :success # assert_response :success
end # end
#
test "should get view" do # test "should get view" do
get admin_question_url questions(:fed5).to_i # get admin_question_url questions(:fed5).to_i
assert_response :success # assert_response :success
end # end
#
test "should get edit" do # test "should get edit" do
get admin_edit_question_url questions(:fed5).to_i # get admin_edit_question_url questions(:fed5).to_i
assert_response :success # assert_response :success
end # end
#
test "should post update question" do # test "should post update question" do
post admin_update_question_url questions(:fed5).to_i # post admin_update_question_url questions(:fed5).to_i
assert_response :success # assert_response :success
end # end
end # end
end # end

View File

@ -2,34 +2,66 @@ require 'test_helper'
module Admin module Admin
class QuizControllerTest < ActionDispatch::IntegrationTest class QuizControllerTest < ActionDispatch::IntegrationTest
def setup
post admin_auth_url, params: { auth:
{ email: 'alan.admin@mailinator.com', password: 'password' } }
end
test "should get index" do test "should get index" do
get admin_quizzes_url get admin_quizzes_url
assert_response :success assert_response :success
assert assigns :quizzes
end end
test "should get new" do test "should get new" do
get admin_new_quiz_url get admin_new_quiz_url
assert_response :success assert_response :success
assert assigns :quiz
end
test "should fail create" do
assert_difference("Quiz.count", 0) do
post admin_create_quiz_url, params: { quiz: { dept: nil } }
end
assert :success
assert_match(/failed/i, session[:flash].values.join)
end end
test "should post create" do test "should post create" do
post admin_create_quiz_url assert_difference("Quiz.count", 1) do
assert_response :success post admin_create_quiz_url, params: { quiz: { unit: 'PDW', dept: 'MBL' } }
end
assert_redirected_to admin_quizzes_url
end end
test "should get view" do test "should get view" do
get admin_quiz_url quizzes(:fed).to_i quiz = quizzes :fed
get admin_quiz_url quiz.to_i
assert_response :success assert_response :success
assert_select 'p', quiz.dept
end end
test "should get edit" do test "should get edit" do
get admin_edit_quiz_url quizzes(:fed).to_i quiz = quizzes :fed
get admin_edit_quiz_url quiz.to_i
assert_response :success assert_response :success
assert_select "[value=?]", quiz.dept
end end
test "should post update quiz" do test "should post update quiz" do
post admin_update_quiz_url quizzes(:fed).to_i quiz = quizzes(:fed)
assert_response :success post admin_update_quiz_url(quiz.to_i), params: { quiz: { dept: 'new', unit: 'another' } }
assert_redirected_to admin_quiz_path(quiz.to_i)
get admin_quiz_path quiz.to_i
assert_select 'p', 'another'
end
test "should fail to update quiz" do
quiz = quizzes(:fed)
post admin_update_quiz_url(quiz.to_i), params: { quiz: { dept: nil } }
assert :success
assert_match(/failed/i, session[:flash].values.join)
end end
end end
end end

View File

@ -2,34 +2,67 @@ require 'test_helper'
module Admin module Admin
class UserControllerTest < ActionDispatch::IntegrationTest class UserControllerTest < ActionDispatch::IntegrationTest
def setup
post admin_auth_url, params: { auth:
{ email: 'alan.admin@mailinator.com', password: 'password' } }
end
test "should get index" do test "should get index" do
get admin_users_url get admin_users_url
assert_response :success assert_response :success
assert assigns :users
end end
test "should get new" do test "should get new" do
get admin_new_user_url get admin_new_user_url
assert_response :success assert_response :success
assert assigns :user
end
test "should fail create" do
assert_difference("User.count", 0) do
post admin_create_user_url, params: { user: { name: 'New User' } }
end
assert :success
assert_match(/failed/i, session[:flash].values.join)
end end
test "should post create" do test "should post create" do
post admin_create_user_url assert_difference("User.count", 1) do
assert_response :success post admin_create_user_url, params: { user:
{ email: 'new.user@mailinator.com', name: 'New User', role: 'reviewer' } }
end
assert_redirected_to admin_users_url
end end
test "should get view" do test "should get view" do
get admin_user_url users(:recruiter).to_i user = users(:recruiter)
get admin_user_url user.to_i
assert_response :success assert_response :success
assert_select 'main', user.name
end end
test "should get edit" do test "should get edit" do
get admin_edit_user_url users(:recruiter).to_i user = users(:recruiter)
get admin_edit_user_url user.to_i
assert_response :success assert_response :success
assert_select "[value=?]", user.name
end end
test "should post update user" do test "should post update user" do
post admin_update_user_url users(:recruiter).to_i user = users(:recruiter)
assert_response :success post admin_update_user_url(user.to_i), params: { user: { name: 'new name' } }
assert_redirected_to admin_user_path(user.to_i)
get admin_user_url user.to_i
assert_select 'main', 'new name'
end
test "should fail to update user" do
user = users(:recruiter)
post admin_update_user_url(user.to_i), params: { user: { name: nil } }
assert :success
assert_match(/failed/i, session[:flash].values.join)
end end
end end
end end

View File

@ -1,4 +1,15 @@
require 'test_helper' require 'test_helper'
class AdminControllerTest < ActionDispatch::IntegrationTest class AdminControllerTest < ActionDispatch::IntegrationTest
test "dashboard should require auth" do
get admin_url
assert_redirected_to admin_login_url
end
test "should get dashboard" do
post admin_auth_url, params: { auth:
{ email: 'alan.admin@mailinator.com', password: 'password' } }
get admin_url
assert_response :success
end
end end