Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Memoize node presenters #2172

Merged
merged 5 commits into from
Dec 8, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions app/presenters/flow_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ def initialize(request, flow)
@request = request
@params = request.params
@flow = flow
@node_presenters = {}
end

def artefact
Expand Down Expand Up @@ -74,9 +75,10 @@ def presenter_for(node)
QuestionPresenter
when SmartAnswer::Outcome
OutcomePresenter
else NodePresenter
else
NodePresenter
end
presenter_class.new(node, current_state)
@node_presenters[node.name] ||= presenter_class.new(node, current_state)
end

def current_question_number
Expand All @@ -93,7 +95,7 @@ def current_node

def start_node
node = SmartAnswer::Node.new(@flow, @flow.name.underscore.to_sym)
StartNodePresenter.new(node)
@start_node ||= StartNodePresenter.new(node)
end

def change_collapsed_question_link(question_number)
Expand Down
90 changes: 90 additions & 0 deletions test/unit/flow_presenter_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
require_relative "../test_helper"

class FlowPresenterTest < ActiveSupport::TestCase
setup do
@flow = SmartAnswer::Flow.new do
name 'flow-name'
value_question :first_question_key
end
@request = ActionDispatch::TestRequest.new
@flow_presenter = FlowPresenter.new(@request, @flow)
end

test '#presenter_for returns presenter for Date question' do
question = @flow.date_question(:question_key).last
node_presenter = @flow_presenter.presenter_for(question)
assert_instance_of DateQuestionPresenter, node_presenter
end

test '#presenter_for returns presenter for CountrySelect question' do
question = @flow.country_select(:question_key).last
node_presenter = @flow_presenter.presenter_for(question)
assert_instance_of CountrySelectQuestionPresenter, node_presenter
end

test '#presenter_for returns presenter for MultipleChoice question' do
question = @flow.multiple_choice(:question_key).last
node_presenter = @flow_presenter.presenter_for(question)
assert_instance_of MultipleChoiceQuestionPresenter, node_presenter
end

test '#presenter_for returns presenter for Checkbox question' do
question = @flow.checkbox_question(:question_key).last
node_presenter = @flow_presenter.presenter_for(question)
assert_instance_of CheckboxQuestionPresenter, node_presenter
end

test '#presenter_for returns presenter for Value question' do
question = @flow.value_question(:question_key).last
node_presenter = @flow_presenter.presenter_for(question)
assert_instance_of ValueQuestionPresenter, node_presenter
end

test '#presenter_for returns presenter for Money question' do
question = @flow.money_question(:question_key).last
node_presenter = @flow_presenter.presenter_for(question)
assert_instance_of MoneyQuestionPresenter, node_presenter
end

test '#presenter_for returns presenter for Salary question' do
question = @flow.salary_question(:question_key).last
node_presenter = @flow_presenter.presenter_for(question)
assert_instance_of SalaryQuestionPresenter, node_presenter
end

test '#presenter_for returns presenter for other question types' do
question = @flow.send(:add_question, SmartAnswer::Question::Base, :question_key).last
node_presenter = @flow_presenter.presenter_for(question)
assert_instance_of QuestionPresenter, node_presenter
end

test '#presenter_for returns presenter for outcome' do
outcome = @flow.outcome(:outcome_key).last
node_presenter = @flow_presenter.presenter_for(outcome)
assert_instance_of OutcomePresenter, node_presenter
end

test '#presenter_for returns presenter for other node types' do
node = @flow.send(:add_question, SmartAnswer::Node, :node_key).last
node_presenter = @flow_presenter.presenter_for(node)
assert_instance_of NodePresenter, node_presenter
end

test '#presenter_for always returns same presenter for a given question' do
question = @flow.multiple_choice(:question_key).last
node_presenter_1 = @flow_presenter.presenter_for(question)
node_presenter_2 = @flow_presenter.presenter_for(question)
assert_same node_presenter_1, node_presenter_2
end

test '#start_node returns presenter for landing page node' do
start_node = @flow_presenter.start_node
assert_instance_of StartNodePresenter, start_node
end

test '#start_node always returns same presenter for landing page node' do
start_node_1 = @flow_presenter.start_node
start_node_2 = @flow_presenter.start_node
assert_same start_node_1, start_node_2
end
end