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
@@ -11,3 +11,8 @@ require 'tasks/rails' | @@ -11,3 +11,8 @@ require 'tasks/rails' | ||
11 | 11 | ||
12 | task :default => [:test, :features] | 12 | task :default => [:test, :features] |
13 | 13 | ||
14 | +begin | ||
15 | + require 'delayed/tasks' | ||
16 | +rescue LoadError | ||
17 | + STDERR.puts "Run `rake gems:install` to install delayed_job" | ||
18 | +end |
app/controllers/prompts_controller.rb
@@ -72,8 +72,13 @@ class PromptsController < InheritedResources::Base | @@ -72,8 +72,13 @@ class PromptsController < InheritedResources::Base | ||
72 | if successful | 72 | if successful |
73 | #catchup_marketplace_ids = [120, 117, 1, 116] | 73 | #catchup_marketplace_ids = [120, 117, 1, 116] |
74 | if @question.uses_catchup? | 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 | else | 82 | else |
78 | next_prompt = @question.picked_prompt | 83 | next_prompt = @question.picked_prompt |
79 | end | 84 | end |
app/controllers/questions_controller.rb
@@ -59,7 +59,14 @@ class QuestionsController < InheritedResources::Base | @@ -59,7 +59,14 @@ class QuestionsController < InheritedResources::Base | ||
59 | unless params[:barebones] | 59 | unless params[:barebones] |
60 | if params[:algorithm] && params[:algorithm] == "catchup" | 60 | if params[:algorithm] && params[:algorithm] == "catchup" |
61 | logger.info("Question #{@question.id} requested catchup algorithm!") | 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 | else | 70 | else |
64 | @p = @question.picked_prompt | 71 | @p = @question.picked_prompt |
65 | end | 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,18 +4,26 @@ describe QuestionsController do | ||
4 | 4 | ||
5 | # integrate_views | 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 | # describe "GET index" do | 28 | # describe "GET index" do |
21 | # it "assigns all questions as @questions" do | 29 | # it "assigns all questions as @questions" do |
@@ -25,13 +33,32 @@ describe QuestionsController do | @@ -25,13 +33,32 @@ describe QuestionsController do | ||
25 | # end | 33 | # end |
26 | # end | 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 | # describe "GET new" do | 63 | # describe "GET new" do |
37 | # it "assigns a new question as @question" do | 64 | # it "assigns a new question as @question" do |