Commit 05ae50f0c53fefe150d3f201414289a89e137e6f
1 parent
a60f1d6b
Exists in
master
and in
1 other branch
Basic background prompt queue working. Tweaking necessary
Showing
5 changed files
with
79 additions
and
26 deletions
Show diff stats
Rakefile
app/controllers/prompts_controller.rb
| ... | ... | @@ -72,8 +72,13 @@ class PromptsController < InheritedResources::Base |
| 72 | 72 | if successful |
| 73 | 73 | #catchup_marketplace_ids = [120, 117, 1, 116] |
| 74 | 74 | if @question.uses_catchup? |
| 75 | - logger.info("Question #{@question.id} is using catchup algorithm!") | |
| 76 | - next_prompt = @question.catchup_choose_prompt | |
| 75 | + logger.info("Question #{@question.id} is using catchup algorithm!") | |
| 76 | + next_prompt = @question.pop_prompt_queue | |
| 77 | + if next_prompt.nil? | |
| 78 | + logger.info("Catchup prompt cache miss! Nothing in prompt_queue") | |
| 79 | + next_prompt = @question.catchup_choose_prompt | |
| 80 | + end | |
| 81 | + @question.send_later :add_prompt_to_queue | |
| 77 | 82 | else |
| 78 | 83 | next_prompt = @question.picked_prompt |
| 79 | 84 | end | ... | ... |
app/controllers/questions_controller.rb
| ... | ... | @@ -59,7 +59,14 @@ class QuestionsController < InheritedResources::Base |
| 59 | 59 | unless params[:barebones] |
| 60 | 60 | if params[:algorithm] && params[:algorithm] == "catchup" |
| 61 | 61 | logger.info("Question #{@question.id} requested catchup algorithm!") |
| 62 | - @p = @question.catchup_choose_prompt | |
| 62 | + | |
| 63 | + @p = @question.pop_prompt_queue | |
| 64 | + if @p.nil? | |
| 65 | + logger.info("Catchup prompt cache miss! Nothing in prompt_queue") | |
| 66 | + @p = @question.catchup_choose_prompt | |
| 67 | + end | |
| 68 | + @question.send_later :add_prompt_to_queue | |
| 69 | + | |
| 63 | 70 | else |
| 64 | 71 | @p = @question.picked_prompt |
| 65 | 72 | end | ... | ... |
config/initializers/delayed_job.rb
| 1 | -# Delayed::Job.destroy_failed_jobs = false | |
| 1 | +Delayed::Worker.backend = :active_record | |
| 2 | +Delayed::Worker.destroy_failed_jobs = false | |
| 3 | +Delayed::Worker.sleep_delay = 5 | |
| 4 | +Delayed::Worker.max_attempts = 3 | |
| 5 | +Delayed::Worker.max_run_time = 10.minutes | |
| 6 | + | |
| 7 | +#class Delayed::Worker | |
| 8 | +# alias_method :original_handle_failed_job, :handle_failed_job | |
| 2 | 9 | # |
| 3 | -# silence_warnings do | |
| 4 | -# Delayed::Job.const_set("MAX_ATTEMPTS", 3) | |
| 5 | -# Delayed::Job.const_set("MAX_RUN_TIME", 5.minutes) | |
| 6 | -# end | |
| 10 | +#protected | |
| 11 | +# def handle_failed_job(job, error) | |
| 12 | +# HoptoadNotifier.notify(error) | |
| 13 | +# original_handle_failed_job(job,error) | |
| 14 | +# end | |
| 15 | +#end | ... | ... |
spec/controllers/questions_controller_spec.rb
| ... | ... | @@ -4,18 +4,26 @@ describe QuestionsController do |
| 4 | 4 | |
| 5 | 5 | # integrate_views |
| 6 | 6 | # |
| 7 | - # def sign_in_as(user) | |
| 8 | - # @controller.current_user = user | |
| 9 | - # return user | |
| 10 | - # end | |
| 7 | + def sign_in_as(user) | |
| 8 | + @controller.current_user = user | |
| 9 | + return user | |
| 10 | + end | |
| 11 | 11 | # |
| 12 | - # before(:each) do | |
| 13 | - # sign_in_as(@user = Factory(:email_confirmed_user)) | |
| 14 | - # end | |
| 15 | - # | |
| 16 | - # def mock_question(stubs={}) | |
| 17 | - # @mock_question ||= mock_model(Question, stubs) | |
| 18 | - # end | |
| 12 | + before(:each) do | |
| 13 | + sign_in_as(@user = Factory(:email_confirmed_user)) | |
| 14 | + end | |
| 15 | + # | |
| 16 | + def mock_question(stubs={}) | |
| 17 | + @mock_question ||= mock_model(Question, stubs) | |
| 18 | + end | |
| 19 | + | |
| 20 | + def mock_prompt(stubs={}) | |
| 21 | + @mock_prompt ||= mock_model(Prompt, stubs) | |
| 22 | + end | |
| 23 | + | |
| 24 | + def mock_appearance(stubs={}) | |
| 25 | + @mock_appearance||= mock_model(Appearance, stubs) | |
| 26 | + end | |
| 19 | 27 | # |
| 20 | 28 | # describe "GET index" do |
| 21 | 29 | # it "assigns all questions as @questions" do |
| ... | ... | @@ -25,13 +33,32 @@ describe QuestionsController do |
| 25 | 33 | # end |
| 26 | 34 | # end |
| 27 | 35 | # |
| 28 | - # describe "GET show" do | |
| 29 | - # it "assigns the requested question as @question" do | |
| 30 | - # Question.stub!(:find).with("37").and_return(mock_question) | |
| 31 | - # get :show, :id => "37" | |
| 32 | - # assigns[:question].should equal(mock_question) | |
| 33 | - # end | |
| 34 | - # end | |
| 36 | + describe "GET show normal" do | |
| 37 | + before(:each) do | |
| 38 | + Question.stub!(:find).with("37").and_return(mock_question) | |
| 39 | + mock_question.stub!(:picked_prompt).and_return(mock_prompt) | |
| 40 | + end | |
| 41 | + | |
| 42 | + it "assigns the requested question as @question" do | |
| 43 | + Question.stub!(:find).with("37").and_return(mock_question) | |
| 44 | + #TODO it shouldn't call this unless we are generating an appearance, right? | |
| 45 | + | |
| 46 | + get :show, :id => "37" | |
| 47 | + assigns[:question].should equal(mock_question) | |
| 48 | + assigns[:prompt].should equal(mock_prompt) | |
| 49 | + assigns[:a].should be_nil | |
| 50 | + end | |
| 51 | + | |
| 52 | + #TODO this is not a particularly intutive param to pass in order to create an appearance | |
| 53 | + it "creates an appearance when a visitor identifier is a param" do | |
| 54 | + @user.stub!(:record_appearance).with("somelongunique32charstring", mock_prompt).and_return(mock_appearance) | |
| 55 | + get :show, :id => "37", :visitor_identifier => "somelongunique32charstring" | |
| 56 | + assigns[:question].should equal(mock_question) | |
| 57 | + assigns[:prompt].should equal(mock_prompt) | |
| 58 | + assigns[:a].should equal(mock_appearance) | |
| 59 | + | |
| 60 | + end | |
| 61 | + end | |
| 35 | 62 | # |
| 36 | 63 | # describe "GET new" do |
| 37 | 64 | # it "assigns a new question as @question" do | ... | ... |