move summary and questions to quiz controller
This commit is contained in:
parent
cc0823e6f9
commit
e6358beec8
@ -46,7 +46,6 @@ Metrics/AbcSize:
|
|||||||
# TODO: remove this cop exception after refactor
|
# TODO: remove this cop exception after refactor
|
||||||
Metrics/ClassLength:
|
Metrics/ClassLength:
|
||||||
Exclude:
|
Exclude:
|
||||||
- app/controllers/candidate_controller.rb
|
|
||||||
- test/**/*
|
- test/**/*
|
||||||
|
|
||||||
Metrics/LineLength:
|
Metrics/LineLength:
|
||||||
|
@ -25,40 +25,6 @@ class CandidateController < ApplicationController
|
|||||||
reset_session
|
reset_session
|
||||||
end
|
end
|
||||||
|
|
||||||
def question
|
|
||||||
qid = prep_status.current_question_id || params[:question_id]
|
|
||||||
redirect_to :summary and return if qid.nil?
|
|
||||||
prep_question qid
|
|
||||||
prep_instance_answer @question
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_answer
|
|
||||||
qid = answer_params[:question_id] || prep_status.current_question_id
|
|
||||||
@answer = prep_answer qid
|
|
||||||
send "process_#{prep_question(qid).input_type}"
|
|
||||||
end
|
|
||||||
|
|
||||||
def live_coder
|
|
||||||
prep_question params[:question_id]
|
|
||||||
prep_instance_answer @question
|
|
||||||
prep_answer params[:question_id]
|
|
||||||
render @question.input_type, layout: false
|
|
||||||
end
|
|
||||||
|
|
||||||
def summary
|
|
||||||
@quiz = current_candidate.my_quiz
|
|
||||||
redirect_to :question and return unless prep_status.current_question_id.nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
def update_summary
|
|
||||||
prep_status
|
|
||||||
not_completed_error = 'You must complete all questions to submit your test.'
|
|
||||||
record_error = 'There was a problem with your submission. Please try again later.'
|
|
||||||
redirect_to :summary, flash: { error: not_completed_error } and return unless @status.can_submit
|
|
||||||
redirect_to :thankyou and return if current_candidate.complete!
|
|
||||||
redirect_to :summary, flash: { error: record_error }
|
|
||||||
end
|
|
||||||
|
|
||||||
def validate
|
def validate
|
||||||
candidate = Candidate.find_by(test_hash: params['test_id'])
|
candidate = Candidate.find_by(test_hash: params['test_id'])
|
||||||
redirect_to(root_path, flash: { error: "Sorry, incorrect test id" }) and return if candidate.nil?
|
redirect_to(root_path, flash: { error: "Sorry, incorrect test id" }) and return if candidate.nil?
|
||||||
@ -80,84 +46,4 @@ class CandidateController < ApplicationController
|
|||||||
def send_to_oops
|
def send_to_oops
|
||||||
redirect_to oops_path if current_candidate
|
redirect_to oops_path if current_candidate
|
||||||
end
|
end
|
||||||
|
|
||||||
def prep_question qid
|
|
||||||
@question = current_candidate.fetch_question(qid)
|
|
||||||
end
|
|
||||||
|
|
||||||
def prep_status
|
|
||||||
@status ||= QuizStatus.new(current_candidate)
|
|
||||||
end
|
|
||||||
|
|
||||||
def prep_instance_answer question
|
|
||||||
@answer = question.answer.nil? ? Answer.new : Answer.find(question.answer_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def answer_params
|
|
||||||
params.require(:answer).permit(
|
|
||||||
:question_id,
|
|
||||||
:answer_id,
|
|
||||||
:radio,
|
|
||||||
:text,
|
|
||||||
checkbox: [],
|
|
||||||
live_code: [:later, :html, :css, :js],
|
|
||||||
live_code_text: [:later, :html, :css, :js, :text]
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def prep_answer qid = answer_params[:question_id]
|
|
||||||
answer_ids = { question_id: qid, candidate_id: current_candidate.to_i }
|
|
||||||
answer = Answer.find_or_create_by(answer_ids)
|
|
||||||
answer
|
|
||||||
end
|
|
||||||
|
|
||||||
def route_answer
|
|
||||||
if @answer.errors.present?
|
|
||||||
prep_status
|
|
||||||
prep_question answer_params[:question_id]
|
|
||||||
flash[:answer_error] = answer_params[:question_id].to_i
|
|
||||||
render :question
|
|
||||||
else
|
|
||||||
flash.delete(:answer_error)
|
|
||||||
# TODO: change params.key? to submit = save/next/summary
|
|
||||||
# redirect_to :summary and return if params.key?(:update)
|
|
||||||
redirect_to :saved and return if params.key?(:save)
|
|
||||||
redirect_to :question
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def process_text
|
|
||||||
@answer.update(answer: answer_params[:text],
|
|
||||||
saved: params.key?(:save),
|
|
||||||
submitted: params.key?(:submit))
|
|
||||||
route_answer
|
|
||||||
end
|
|
||||||
|
|
||||||
def process_radio
|
|
||||||
@answer.update(answer: answer_params[:radio],
|
|
||||||
saved: params.key?(:save),
|
|
||||||
submitted: params.key?(:submit))
|
|
||||||
route_answer
|
|
||||||
end
|
|
||||||
|
|
||||||
def process_checkbox
|
|
||||||
@answer.update(answer: answer_params[:checkbox],
|
|
||||||
saved: params.key?(:save),
|
|
||||||
submitted: params.key?(:submit))
|
|
||||||
route_answer
|
|
||||||
end
|
|
||||||
|
|
||||||
def process_live_code
|
|
||||||
@answer.update(answer: answer_params[:live_code].to_h,
|
|
||||||
saved: params.key?(:save),
|
|
||||||
submitted: params.key?(:submit))
|
|
||||||
route_answer
|
|
||||||
end
|
|
||||||
|
|
||||||
def process_live_code_text
|
|
||||||
@answer.update(answer: answer_params[:live_code_text].to_h,
|
|
||||||
saved: params.key?(:save),
|
|
||||||
submitted: params.key?(:submit))
|
|
||||||
route_answer
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
119
app/controllers/quiz_controller.rb
Normal file
119
app/controllers/quiz_controller.rb
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
class QuizController < ApplicationController
|
||||||
|
before_action :authorize_candidate
|
||||||
|
|
||||||
|
def question
|
||||||
|
qid = prep_status.current_question_id || params[:question_id]
|
||||||
|
redirect_to :summary and return if qid.nil?
|
||||||
|
prep_question qid
|
||||||
|
prep_instance_answer @question
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_answer
|
||||||
|
qid = answer_params[:question_id] || prep_status.current_question_id
|
||||||
|
@answer = prep_answer qid
|
||||||
|
send "process_#{prep_question(qid).input_type}"
|
||||||
|
end
|
||||||
|
|
||||||
|
def live_coder
|
||||||
|
prep_question params[:question_id]
|
||||||
|
prep_instance_answer @question
|
||||||
|
prep_answer params[:question_id]
|
||||||
|
render @question.input_type, layout: false
|
||||||
|
end
|
||||||
|
|
||||||
|
def summary
|
||||||
|
@quiz = current_candidate.my_quiz
|
||||||
|
redirect_to :question and return unless prep_status.current_question_id.nil?
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_summary
|
||||||
|
prep_status
|
||||||
|
not_completed_error = 'You must complete all questions to submit your test.'
|
||||||
|
record_error = 'There was a problem with your submission. Please try again later.'
|
||||||
|
redirect_to :summary, flash: { error: not_completed_error } and return unless @status.can_submit
|
||||||
|
redirect_to :thankyou and return if current_candidate.complete!
|
||||||
|
redirect_to :summary, flash: { error: record_error }
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def prep_question qid
|
||||||
|
@question = current_candidate.fetch_question(qid)
|
||||||
|
end
|
||||||
|
|
||||||
|
def prep_status
|
||||||
|
@status ||= QuizStatus.new(current_candidate)
|
||||||
|
end
|
||||||
|
|
||||||
|
def prep_instance_answer question
|
||||||
|
@answer = question.answer.nil? ? Answer.new : Answer.find(question.answer_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def answer_params
|
||||||
|
params.require(:answer).permit(
|
||||||
|
:question_id,
|
||||||
|
:answer_id,
|
||||||
|
:radio,
|
||||||
|
:text,
|
||||||
|
checkbox: [],
|
||||||
|
live_code: [:later, :html, :css, :js],
|
||||||
|
live_code_text: [:later, :html, :css, :js, :text]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def prep_answer qid = answer_params[:question_id]
|
||||||
|
answer_ids = { question_id: qid, candidate_id: current_candidate.to_i }
|
||||||
|
answer = Answer.find_or_create_by(answer_ids)
|
||||||
|
answer
|
||||||
|
end
|
||||||
|
|
||||||
|
def route_answer
|
||||||
|
if @answer.errors.present?
|
||||||
|
prep_status
|
||||||
|
prep_question answer_params[:question_id]
|
||||||
|
flash[:answer_error] = answer_params[:question_id].to_i
|
||||||
|
render :question
|
||||||
|
else
|
||||||
|
flash.delete(:answer_error)
|
||||||
|
# TODO: change params.key? to submit = save/next/summary
|
||||||
|
# redirect_to :summary and return if params.key?(:update)
|
||||||
|
redirect_to :saved and return if params.key?(:save)
|
||||||
|
redirect_to :question
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_text
|
||||||
|
@answer.update(answer: answer_params[:text],
|
||||||
|
saved: params.key?(:save),
|
||||||
|
submitted: params.key?(:submit))
|
||||||
|
route_answer
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_radio
|
||||||
|
@answer.update(answer: answer_params[:radio],
|
||||||
|
saved: params.key?(:save),
|
||||||
|
submitted: params.key?(:submit))
|
||||||
|
route_answer
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_checkbox
|
||||||
|
@answer.update(answer: answer_params[:checkbox],
|
||||||
|
saved: params.key?(:save),
|
||||||
|
submitted: params.key?(:submit))
|
||||||
|
route_answer
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_live_code
|
||||||
|
@answer.update(answer: answer_params[:live_code].to_h,
|
||||||
|
saved: params.key?(:save),
|
||||||
|
submitted: params.key?(:submit))
|
||||||
|
route_answer
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_live_code_text
|
||||||
|
@answer.update(answer: answer_params[:live_code_text].to_h,
|
||||||
|
saved: params.key?(:save),
|
||||||
|
submitted: params.key?(:submit))
|
||||||
|
route_answer
|
||||||
|
end
|
||||||
|
end
|
@ -1 +0,0 @@
|
|||||||
<%= render partial: "candidate/live_code", locals: {question: question, form: form} %>
|
|
@ -14,4 +14,4 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %>
|
<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %>
|
@ -11,7 +11,7 @@
|
|||||||
Please revisit this page with JavaScript enabled to modify your answer.
|
Please revisit this page with JavaScript enabled to modify your answer.
|
||||||
</div> -->
|
</div> -->
|
||||||
|
|
||||||
<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %>
|
<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %>
|
||||||
|
|
||||||
<div data-id="live-coder-finish-later">
|
<div data-id="live-coder-finish-later">
|
||||||
<p class="warning">
|
<p class="warning">
|
1
app/views/quiz/_live_code_text.html.erb
Normal file
1
app/views/quiz/_live_code_text.html.erb
Normal file
@ -0,0 +1 @@
|
|||||||
|
<%= render partial: "quiz/live_code", locals: {question: question, form: form} %>
|
@ -9,4 +9,4 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %>
|
<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %>
|
@ -5,4 +5,4 @@
|
|||||||
|
|
||||||
<div class="chars <%= hidden %>">Characters remaining: <span></span></div>
|
<div class="chars <%= hidden %>">Characters remaining: <span></span></div>
|
||||||
|
|
||||||
<%= render partial: "candidate/answer_errors", locals: {question: question, answer: @answer} %>
|
<%= render partial: "quiz/answer_errors", locals: {question: question, answer: @answer} %>
|
@ -21,7 +21,7 @@
|
|||||||
<% end %>
|
<% end %>
|
||||||
<fieldset disabled class="answer-block">
|
<fieldset disabled class="answer-block">
|
||||||
<%= hidden_field_tag 'answer[question_id]', question.question_id %>
|
<%= hidden_field_tag 'answer[question_id]', question.question_id %>
|
||||||
<%= render partial: "candidate/#{question.input_type}", locals: {question: question, form: form} %>
|
<%= render partial: "quiz/#{question.input_type}", locals: {question: question, form: form} %>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
@ -4,14 +4,14 @@ Rails.application.routes.draw do
|
|||||||
get "/welcome", to: "candidate#welcome", as: :welcome
|
get "/welcome", to: "candidate#welcome", as: :welcome
|
||||||
get "/saved", to: "candidate#saved", as: :saved
|
get "/saved", to: "candidate#saved", as: :saved
|
||||||
get "/thankyou", to: "candidate#thankyou", as: :thankyou
|
get "/thankyou", to: "candidate#thankyou", as: :thankyou
|
||||||
|
|
||||||
get "/oops", to: "candidate#oops", as: :oops
|
get "/oops", to: "candidate#oops", as: :oops
|
||||||
|
|
||||||
post "/question(/:answer_id)", to: "candidate#update_answer", as: :post_answer
|
post "/question(/:answer_id)", to: "quiz#update_answer", as: :post_answer
|
||||||
get "/question(/:question_id)", to: "candidate#question", as: :question
|
get "/question(/:question_id)", to: "quiz#question", as: :question
|
||||||
get "/live-coder-entry/:question_id", to: "candidate#live_coder", as: :live_coder
|
get "/live-coder-entry/:question_id", to: "quiz#live_coder", as: :live_coder
|
||||||
|
post "/summary", to: "quiz#update_summary", as: :post_summary
|
||||||
post "/summary", to: "candidate#update_summary", as: :post_summary
|
get "/summary", to: "quiz#summary", as: :summary
|
||||||
get "/summary", to: "candidate#summary", as: :summary
|
|
||||||
|
|
||||||
get "/review/logout", to: "review#logout", as: :review_logout
|
get "/review/logout", to: "review#logout", as: :review_logout
|
||||||
post "/review/login", to: "review#auth", as: :review_auth
|
post "/review/login", to: "review#auth", as: :review_auth
|
||||||
|
@ -17,15 +17,6 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest
|
|||||||
|
|
||||||
get thankyou_path
|
get thankyou_path
|
||||||
assert_redirected_to login_path
|
assert_redirected_to login_path
|
||||||
|
|
||||||
get summary_path
|
|
||||||
assert_redirected_to login_path
|
|
||||||
|
|
||||||
get question_path
|
|
||||||
assert_redirected_to login_path
|
|
||||||
|
|
||||||
get question_path(questions(:fed1).id)
|
|
||||||
assert_redirected_to login_path
|
|
||||||
end
|
end
|
||||||
|
|
||||||
test "should auth to welcome" do
|
test "should auth to welcome" do
|
||||||
@ -71,16 +62,6 @@ class CandidateControllerTest < ActionDispatch::IntegrationTest
|
|||||||
assert_response :success
|
assert_response :success
|
||||||
end
|
end
|
||||||
|
|
||||||
test "should get flash message on bad radio response" do
|
|
||||||
setup_auth candidates(:martha)
|
|
||||||
qid = questions(:fed1).id
|
|
||||||
post post_answer_path, params: { answer: { question_id: qid, radio: nil } }
|
|
||||||
|
|
||||||
assert_response :success
|
|
||||||
assert session[:test_id].present?
|
|
||||||
assert_equal qid, flash[:answer_error]
|
|
||||||
end
|
|
||||||
|
|
||||||
test "should NOT send mailers on submission" do
|
test "should NOT send mailers on submission" do
|
||||||
setup_auth candidates(:dawn)
|
setup_auth candidates(:dawn)
|
||||||
|
|
||||||
|
28
test/controllers/quiz_controller_test.rb
Normal file
28
test/controllers/quiz_controller_test.rb
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class QuizControllerTest < ActionDispatch::IntegrationTest
|
||||||
|
def setup_auth candidate
|
||||||
|
post validate_candidate_url, params: { test_id: candidate.test_hash }
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should require auth and redirect" do
|
||||||
|
get summary_path
|
||||||
|
assert_redirected_to login_path
|
||||||
|
|
||||||
|
get question_path
|
||||||
|
assert_redirected_to login_path
|
||||||
|
|
||||||
|
get question_path(questions(:fed1).id)
|
||||||
|
assert_redirected_to login_path
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should get flash message on bad radio response" do
|
||||||
|
setup_auth candidates(:martha)
|
||||||
|
qid = questions(:fed1).id
|
||||||
|
post post_answer_path, params: { answer: { question_id: qid, radio: nil } }
|
||||||
|
|
||||||
|
assert_response :success
|
||||||
|
assert session[:test_id].present?
|
||||||
|
assert_equal qid, flash[:answer_error]
|
||||||
|
end
|
||||||
|
end
|
@ -1,6 +1,6 @@
|
|||||||
require 'test_helper'
|
require 'test_helper'
|
||||||
|
|
||||||
class QuestionFeatureTest < ActionDispatch::IntegrationTest
|
class QuestionAttachmentsTest < ActionDispatch::IntegrationTest
|
||||||
def setup_auth candidate
|
def setup_auth candidate
|
||||||
post validate_candidate_url, params: { test_id: candidate.test_hash }
|
post validate_candidate_url, params: { test_id: candidate.test_hash }
|
||||||
end
|
end
|
18
test/integration/question_live_coder_test.rb
Normal file
18
test/integration/question_live_coder_test.rb
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class QuestionLiveCoderTest < ActionDispatch::IntegrationTest
|
||||||
|
def setup_auth candidate
|
||||||
|
post validate_candidate_url, params: { test_id: candidate.test_hash }
|
||||||
|
end
|
||||||
|
|
||||||
|
test "can load a live coder question" do
|
||||||
|
setup_auth candidates(:dawn)
|
||||||
|
question = questions(:fed7)
|
||||||
|
|
||||||
|
get question_path(question.id)
|
||||||
|
assert_response :success
|
||||||
|
assert_select '.question-text', question.question
|
||||||
|
# TODO: add in capybara and test form post
|
||||||
|
# assert_redirected summary_path
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user