diff --git a/app/controllers/concerns/lti.rb b/app/controllers/concerns/lti.rb index 434a106f..7c168ec6 100644 --- a/app/controllers/concerns/lti.rb +++ b/app/controllers/concerns/lti.rb @@ -102,12 +102,14 @@ module Lti ::NewRelic::Agent.add_custom_parameters({ score: score, session: session }) fail(Error, "Score #{score} must be between 0 and #{MAXIMUM_SCORE}!") unless (0..MAXIMUM_SCORE).include?(score) - lti_parameter = LtiParameter.where(consumers_id: session[:consumer_id], - external_users_id: user_id, - exercises_id: exercise_id).first + if session[:consumer_id] + lti_parameter = LtiParameter.where(consumers_id: session[:consumer_id], + external_users_id: user_id, + exercises_id: exercise_id).first - consumer = Consumer.find_by(id: session[:consumer_id]) - provider = build_tool_provider(consumer: consumer, parameters: lti_parameter.lti_parameters) + consumer = Consumer.find_by(id: session[:consumer_id]) + provider = build_tool_provider(consumer: consumer, parameters: lti_parameter.lti_parameters) + end if provider.nil? {status: 'error'} @@ -130,15 +132,16 @@ module Lti exercise = Exercise.where(token: options[:parameters][:custom_token]).first exercise_id = exercise.id unless exercise.nil? + current_user = ExternalUser.find_or_create_by(consumer_id: options[:consumer].id, external_id: options[:parameters][:user_id].to_s) lti_parameters = LtiParameter.find_or_create_by(consumers_id: options[:consumer].id, - external_users_id: @current_user.id, #options[:parameters][:user_id].to_s, + external_users_id: current_user.id, exercises_id: exercise_id) lti_parameters.lti_parameters = options[:parameters].slice(*SESSION_PARAMETERS).to_json lti_parameters.save! session[:consumer_id] = options[:consumer].id - session[:external_user_id] = @current_user.id + session[:external_user_id] = current_user.id end private :store_lti_session_data diff --git a/spec/concerns/lti_spec.rb b/spec/concerns/lti_spec.rb index 27708866..95181d3b 100644 --- a/spec/concerns/lti_spec.rb +++ b/spec/concerns/lti_spec.rb @@ -105,29 +105,25 @@ describe Lti do describe '#send_score' do let(:consumer) { FactoryGirl.create(:consumer) } let(:score) { 0.5 } - #let(:exercise) { FactoryGirl.create(:math) } let(:submission) { FactoryGirl.create(:submission) } let!(:lti_parameter) { FactoryGirl.create(:lti_parameter)} context 'with an invalid score' do it 'raises an exception' do - expect { controller.send(:send_score, Lti::MAXIMUM_SCORE * 2, submission.exercise_id, submission.user_id) }.to raise_error(Lti::Error) + expect { controller.send(:send_score, submission.exercise_id, Lti::MAXIMUM_SCORE * 2, submission.user_id) }.to raise_error(Lti::Error) end end context 'with an valid score' do - context 'with a tool provider' do + context 'with a tool consumer' do before(:each) do - #Todo replace session with lti_parameter controller.session[:consumer_id] = consumer.id - # controller.session[:lti_parameters] = {} - #Todo create empty LtiParameter instead end context 'when grading is not supported' do it 'returns a corresponding status' do expect_any_instance_of(IMS::LTI::ToolProvider).to receive(:outcome_service?).and_return(false) - expect(controller.send(:send_score, score)[:status]).to eq('unsupported') + expect(controller.send(:send_score, submission.exercise_id, score, submission.user_id)[:status]).to eq('unsupported') end end @@ -144,11 +140,11 @@ describe Lti do end it 'sends the score' do - controller.send(:send_score, score) + controller.send(:send_score, submission.exercise_id, score, submission.user_id) end it 'returns code, message, and status' do - result = controller.send(:send_score, score) + result = controller.send(:send_score, submission.exercise_id, score, submission.user_id) expect(result[:code]).to eq(response.response_code) expect(result[:message]).to eq(response.body) expect(result[:status]).to eq(response.code_major) @@ -156,34 +152,28 @@ describe Lti do end end - context 'without a tool provider' do + context 'without a tool consumer' do it 'returns a corresponding status' do - expect(controller).to receive(:build_tool_provider).and_return(nil) - expect(controller.send(:send_score, score)[:status]).to eq('error') + expect(controller.send(:send_score, submission.exercise_id, score, submission.user_id)[:status]).to eq('error') end end end end describe '#store_lti_session_data' do - #Todo replace session with lti_parameter let(:parameters) { {} } - before_count = LtiParameter.count - before(:each) { controller.instance_variable_set(:@current_user, FactoryGirl.create(:external_user)) } - #Todo do this with lti_parameter object - after(:each) { controller.send(:store_lti_session_data, consumer: FactoryGirl.build(:consumer), parameters: parameters) } it 'stores data in the session' do - #Todo replace session with lti_parameter + controller.instance_variable_set(:@current_user, FactoryGirl.create(:external_user)) expect(controller.session).to receive(:[]=).with(:consumer_id, anything) expect(controller.session).to receive(:[]=).with(:external_user_id, anything) - # expect(controller.session).to receive(:[]=).with(:lti_parameters, kind_of(Hash)) - #Todo it creates an LtiParameter Object - expect(LtiParameter.count).to eq(before_count + 1) + controller.send(:store_lti_session_data, consumer: FactoryGirl.build(:consumer), parameters: parameters) end - it 'stores only selected tuples' do - expect(parameters).to receive(:slice).with(*Lti::SESSION_PARAMETERS) + it 'it creates an LtiParameter Object' do + before_count = LtiParameter.count + controller.send(:store_lti_session_data, consumer: FactoryGirl.build(:consumer), parameters: parameters) + expect(LtiParameter.count).to eq(before_count + 1) end end diff --git a/spec/factories/lti_parameter.rb b/spec/factories/lti_parameter.rb index d80e85e4..ef91f30d 100644 --- a/spec/factories/lti_parameter.rb +++ b/spec/factories/lti_parameter.rb @@ -1,12 +1,23 @@ FactoryGirl.define do + #TODO do this proper factory :lti_parameter do - association :consumers_id, factory: :consumer - association :exercises_id, factory: :math - association :external_users_id, factory: :external_user + consumers_id 1 + exercises_id 1 + external_users_id 1 - - trait :lti_parameters do - JSON.parse('{"lis_result_sourcedid": "c2db0c7c-4411-4b27-a52b-ddfc3dc32065", "lis_outcome_service_url": "http://172.16.54.235:3000/courses/0132156a-9afb-434d-83cc-704780104105/sections/21c6c6f4-1fb6-43b4-af3c-04fdc098879e/items/999b1fe6-d4b6-47b7-a577-ea2b4b1041ec/tool_grading", "launch_presentation_return_url": "http://172.16.54.235:3000/courses/0132156a-9afb-434d-83cc-704780104105/sections/21c6c6f4-1fb6-43b4-af3c-04fdc098879e/items/999b1fe6-d4b6-47b7-a577-ea2b4b1041ec/tool_return"}') - end + lti_parameters JSON.parse('{"lis_result_sourcedid": "c2db0c7c-4411-4b27-a52b-ddfc3dc32065", + "lis_outcome_service_url": "http://172.16.54.235:3000/courses/0132156a-9afb-434d-83cc-704780104105/sections/21c6c6f4-1fb6-43b4-af3c-04fdc098879e/items/999b1fe6-d4b6-47b7-a577-ea2b4b1041ec/tool_grading", + "launch_presentation_return_url": "http://172.16.54.235:3000/courses/0132156a-9afb-434d-83cc-704780104105/sections/21c6c6f4-1fb6-43b4-af3c-04fdc098879e/items/999b1fe6-d4b6-47b7-a577-ea2b4b1041ec/tool_return"}') end + + # factory :lti_parameter do + # association :consumers_id, factory: :consumer + # association :exercises_id, factory: :math + # association :external_users_id, factory: :external_user + # + # + # trait :lti_parameters do + # JSON.parse('{"lis_result_sourcedid": "c2db0c7c-4411-4b27-a52b-ddfc3dc32065", "lis_outcome_service_url": "http://172.16.54.235:3000/courses/0132156a-9afb-434d-83cc-704780104105/sections/21c6c6f4-1fb6-43b4-af3c-04fdc098879e/items/999b1fe6-d4b6-47b7-a577-ea2b4b1041ec/tool_grading", "launch_presentation_return_url": "http://172.16.54.235:3000/courses/0132156a-9afb-434d-83cc-704780104105/sections/21c6c6f4-1fb6-43b4-af3c-04fdc098879e/items/999b1fe6-d4b6-47b7-a577-ea2b4b1041ec/tool_return"}') + # end + # end end \ No newline at end of file