spec: add Catalog consumer to Pact contract test suite
closes USERS-436 test plan: - requires a pact contract in local or public broker - execute tests against Pact files - run `bin/contracts-verify-live-events` Change-Id: I847787780e1bc4e5024e0cd2c46001dac6e31dfa Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/230402 Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com> QA-Review: August Thornton <august@instructure.com> Product-Review: August Thornton <august@instructure.com> Reviewed-by: Brian Watson <bwatson@instructure.com> Reviewed-by: Robin Kuss <rkuss@instructure.com>
This commit is contained in:
parent
5a1ad391f2
commit
630721d212
|
@ -0,0 +1,51 @@
|
||||||
|
#
|
||||||
|
# Copyright (C) 2020 - present Instructure, Inc.
|
||||||
|
#
|
||||||
|
# This file is part of Canvas.
|
||||||
|
#
|
||||||
|
# Canvas is free software: you can redistribute it and/or modify it under
|
||||||
|
# the terms of the GNU Affero General Public License as published by the Free
|
||||||
|
# Software Foundation, version 3 of the License.
|
||||||
|
#
|
||||||
|
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License along
|
||||||
|
# with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
|
||||||
|
require_relative '../live_events_pact_helper'
|
||||||
|
|
||||||
|
RSpec.describe 'Canvas LMS Live Events', :pact_live_events do
|
||||||
|
describe 'course_completed' do
|
||||||
|
let(:live_event) do
|
||||||
|
LiveEvents::PactHelper::Event.new(
|
||||||
|
event_name: 'course_completed', event_subscriber: PactConfig::LiveEventConsumers::CATALOG
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'keeps the contract' do
|
||||||
|
live_event.emit_with do
|
||||||
|
course_model
|
||||||
|
assignment_model(course: @course)
|
||||||
|
student_in_course(active_all: true, course: @course)
|
||||||
|
@user.update(email: 'user@example.com')
|
||||||
|
context_module = @course.context_modules.create!
|
||||||
|
tag = context_module.add_item({ id: @assignment.id, type: 'assignment' })
|
||||||
|
context_module.completion_requirements = { tag.id => { type: 'must_submit' } }
|
||||||
|
context_module.update(requirement_count: 1)
|
||||||
|
context_module_progression =
|
||||||
|
context_module.context_module_progressions.create!(
|
||||||
|
user_id: @user.id,
|
||||||
|
workflow_state: 'completed',
|
||||||
|
requirements_met: [{ id: tag.id, type: 'must_submit' }]
|
||||||
|
)
|
||||||
|
Canvas::LiveEvents.course_completed(context_module_progression)
|
||||||
|
end
|
||||||
|
|
||||||
|
expect(live_event).to have_kept_the_contract
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -26,6 +26,14 @@ module LiveEvents
|
||||||
module PactHelper
|
module PactHelper
|
||||||
include PactConfig
|
include PactConfig
|
||||||
|
|
||||||
|
def self.message_contract_for(consumer, event)
|
||||||
|
Pact::Messages.get_message_contract(
|
||||||
|
PactConfig::Providers::CANVAS_LMS_LIVE_EVENTS,
|
||||||
|
consumer,
|
||||||
|
event
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
class Event
|
class Event
|
||||||
attr_reader :event_message, :event_name, :event_settings, :event_subscriber, :stream_client
|
attr_reader :event_message, :event_name, :event_settings, :event_subscriber, :stream_client
|
||||||
|
|
||||||
|
@ -66,11 +74,18 @@ module LiveEvents
|
||||||
end
|
end
|
||||||
|
|
||||||
def contract_message
|
def contract_message
|
||||||
|
# Canvas Live Event Subscribers
|
||||||
|
catalog = PactConfig::LiveEventConsumers::CATALOG
|
||||||
|
outcomes = PactConfig::LiveEventConsumers::OUTCOMES
|
||||||
|
quiz_lti = PactConfig::LiveEventConsumers::QUIZ_LTI
|
||||||
|
|
||||||
case event_subscriber
|
case event_subscriber
|
||||||
when PactConfig::LiveEventConsumers::QUIZ_LTI
|
when catalog
|
||||||
LiveEvents::PactHelper.quiz_lti_contract_for(event_name)
|
LiveEvents::PactHelper.message_contract_for(catalog, event_name)
|
||||||
when PactConfig::LiveEventConsumers::OUTCOMES
|
when outcomes
|
||||||
LiveEvents::PactHelper.outcomes_contract_for(event_name)
|
LiveEvents::PactHelper.message_contract_for(outcomes, event_name)
|
||||||
|
when quiz_lti
|
||||||
|
LiveEvents::PactHelper.message_contract_for(quiz_lti, event_name)
|
||||||
else
|
else
|
||||||
raise ArgumentError, "Invalid event_subscriber: #{event_subscriber}"
|
raise ArgumentError, "Invalid event_subscriber: #{event_subscriber}"
|
||||||
end
|
end
|
||||||
|
@ -108,25 +123,5 @@ module LiveEvents
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class << self
|
|
||||||
def quiz_lti_contract_for(event)
|
|
||||||
message_contract_for(PactConfig::LiveEventConsumers::QUIZ_LTI, event)
|
|
||||||
end
|
|
||||||
|
|
||||||
def outcomes_contract_for(event)
|
|
||||||
message_contract_for(PactConfig::LiveEventConsumers::OUTCOMES, event)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def message_contract_for(consumer, event)
|
|
||||||
Pact::Messages.get_message_contract(
|
|
||||||
PactConfig::Providers::CANVAS_LMS_LIVE_EVENTS,
|
|
||||||
consumer,
|
|
||||||
event
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -37,7 +37,7 @@ module PactConfig
|
||||||
FIU = 'lmsAPI'.freeze
|
FIU = 'lmsAPI'.freeze
|
||||||
else
|
else
|
||||||
# internal consumers
|
# internal consumers
|
||||||
# These first 3 are legacy android consumers. ANDROID, below, represents our latest pact
|
# These first 3 are legacy android consumers. ANDROID, below, represents our latest pact
|
||||||
# testing effort.
|
# testing effort.
|
||||||
ANDROID_STUDENT = 'Android Student'.freeze
|
ANDROID_STUDENT = 'Android Student'.freeze
|
||||||
ANDROID_TEACHER = 'Android Teacher'.freeze
|
ANDROID_TEACHER = 'Android Teacher'.freeze
|
||||||
|
@ -53,6 +53,7 @@ module PactConfig
|
||||||
|
|
||||||
# Add new Live Events consumers to this module
|
# Add new Live Events consumers to this module
|
||||||
module LiveEventConsumers
|
module LiveEventConsumers
|
||||||
|
CATALOG = 'Catalog'.freeze
|
||||||
OUTCOMES = 'Outcomes'.freeze
|
OUTCOMES = 'Outcomes'.freeze
|
||||||
QUIZ_LTI = 'Quiz LTI'.freeze
|
QUIZ_LTI = 'Quiz LTI'.freeze
|
||||||
end
|
end
|
||||||
|
@ -69,9 +70,7 @@ module PactConfig
|
||||||
|
|
||||||
def broker_uri
|
def broker_uri
|
||||||
URI::HTTP.build(
|
URI::HTTP.build(
|
||||||
scheme: protocol,
|
scheme: protocol, userinfo: "#{broker_username}:#{broker_password}", host: broker_host
|
||||||
userinfo: "#{broker_username}:#{broker_password}",
|
|
||||||
host: broker_host
|
|
||||||
).to_s
|
).to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue