canvas-lms/spec/views/communication_channels/confirm.html.erb_spec.rb

246 lines
12 KiB
Ruby

#
# Copyright (C) 2011 - 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 File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
require File.expand_path(File.dirname(__FILE__) + '/../views_helper')
describe "communication_channels/confirm.html.erb" do
before do
user_factory
assign(:user, @user)
@cc = @communication_channel = assign(:communication_channel, @user.communication_channels.create!(:path => 'johndoe@example.com'))
assign(:nonce, @cc.confirmation_code)
assign(:body_classes, [])
assign(:domain_root_account, assign(:root_account, Account.default))
allow(view).to receive(:require_terms?).and_return(nil) # since controller-defined helper methods don't get plumbed down here
end
shared_examples_for "user registration" do
it "should only show the registration form if no merge opportunities" do
assign(:merge_opportunities, [])
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
registration_form = page.css('#registration_confirmation_form').first
expect(registration_form).not_to be_nil
if @enrollment
expect(registration_form['style']).to match /display:\s*none/
expect(page.css('#register.btn').first).not_to be_nil
expect(page.css('#back.btn').first).to be_nil
else
expect(registration_form['style']).to be_blank
# no "back", "use this account", "new account", etc. buttons
expect(page.css('a.btn')).to be_empty
end
end
it "should follow the simple path for not logged in" do
user_with_pseudonym(:active_all => 1)
assign(:merge_opportunities, [[@user, [@user.pseudonym]]])
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
registration_form = page.css('#registration_confirmation_form').first
expect(registration_form).not_to be_nil
expect(registration_form['style']).to match /display:\s*none/
expect(page.css('input[type="radio"][name="pseudonym_select"]')).to be_empty
expect(page.css('#register.btn').first).not_to be_nil
merge_button = page.css('#merge.btn').first
expect(merge_button).not_to be_nil
expect(merge_button['href']).to eq login_url(:host => HostUrl.default_host, :confirm => @communication_channel.confirmation_code, :enrollment => @enrollment.try(:uuid), :pseudonym_session => {:unique_id => @pseudonym.unique_id}, :expected_user_id => @pseudonym.user_id)
expect(page.css('#back.btn').first).not_to be_nil
end
it "should follow the simple path for logged in as a matching user" do
user_with_pseudonym(:active_all => 1)
@user.communication_channels.create!(:path => 'johndoe@example.com') { |cc| cc.workflow_state = 'active' }
assign(:merge_opportunities, [[@user, [@user.pseudonym]]])
assign(:current_user, @user)
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
registration_form = page.css('#registration_confirmation_form').first
expect(registration_form).not_to be_nil
expect(registration_form['style']).to match /display:\s*none/
expect(page.css('input[type="radio"][name="pseudonym_select"]')).to be_empty
expect(page.css('#register.btn').first).not_to be_nil
merge_button = page.css('#merge.btn').first
expect(merge_button).not_to be_nil
expect(merge_button.text).to eq 'Yes'
expect(merge_button['href']).to eq registration_confirmation_path(@communication_channel.confirmation_code, :enrollment => @enrollment.try(:uuid), :confirm => 1)
expect(page.css('#back.btn').first).not_to be_nil
end
it "should follow the simple path for logged in as a non-matching user" do
user_with_pseudonym(:active_all => 1)
assign(:merge_opportunities, [[@user, [@user.pseudonym]]])
assign(:current_user, @user)
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
registration_form = page.css('#registration_confirmation_form').first
expect(registration_form).not_to be_nil
expect(registration_form['style']).to match /display:\s*none/
expect(page.css('input[type="radio"][name="pseudonym_select"]')).to be_empty
expect(page.css('#register.btn').first).not_to be_nil
merge_button = page.css('#merge.btn').first
expect(merge_button).not_to be_nil
expect(merge_button['href']).to eq registration_confirmation_path(@communication_channel.confirmation_code, :enrollment => @enrollment.try(:uuid), :confirm => 1)
expect(merge_button.text).to eq 'Yes, Add Email Address'
expect(page.css('#back.btn').first).not_to be_nil
end
it "should follow the mostly-simple-path for not-logged in with multiple pseudonyms" do
user_with_pseudonym(:active_all => 1)
account2 = Account.create!
assign(:merge_opportunities, [[@user, [@user.pseudonym, @user.pseudonyms.create!(:unique_id => 'johndoe', :account => account2)]]])
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
registration_form = page.css('#registration_confirmation_form').first
expect(registration_form).not_to be_nil
expect(registration_form['style']).to match /display:\s*none/
expect(page.css('input[type="radio"][name="pseudonym_select"]').length).to eq 2
expect(page.css('#register.btn').first).not_to be_nil
merge_button = page.css('#merge.btn').first
expect(merge_button).not_to be_nil
expect(merge_button['href']).to eq login_url(:host => HostUrl.default_host, :confirm => @communication_channel.confirmation_code, :enrollment => @enrollment.try(:uuid), :pseudonym_session => {:unique_id => @pseudonym.unique_id}, :expected_user_id => @pseudonym.user_id)
expect(page.css('#back.btn').first).not_to be_nil
end
it "should render for multiple merge opportunities" do
@user1 = user_with_pseudonym(:active_all => 1)
@user2 = user_with_pseudonym(:active_all => 1, :username => 'janedoe@example.com')
@user3 = user_with_pseudonym(:active_all => 1, :username => 'freddoe@example.com')
account2 = Account.create!
@user3.pseudonyms.create!(:unique_id => 'johndoe', :account => account2)
@user4 = user_with_pseudonym(:active_all => 1, :username => 'georgedoe@example.com', :account => account2)
assign(:merge_opportunities, [
[@user1, [@user1.pseudonym]],
[@user2, [@user2.pseudonym]],
[@user3, @user3.pseudonyms],
[@user4, [@user4.pseudonym]]
])
assign(:current_user, @user1)
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
registration_form = page.css('#registration_confirmation_form').first
expect(registration_form).not_to be_nil
expect(registration_form['style']).to match /display:\s*none/
expect(page.css('input[type="radio"][name="pseudonym_select"]').length).to eq 6
expect(page.css('#register.btn')).to be_empty
merge_button = page.css('#merge.btn').first
expect(merge_button).not_to be_nil
expect(merge_button['href']).to eq registration_confirmation_path(@communication_channel.confirmation_code, :enrollment => @enrollment.try(:uuid), :confirm => 1)
expect(page.css('#back.btn').first).not_to be_nil
end
end
context "invitations" do
before do
course_factory(active_all: true)
assign(:course, @course)
@enrollment = assign(:enrollment, @course.enroll_user(@user))
end
it "should render transfer enrollment form" do
assign(:merge_opportunities, [])
@user.register
@pseudonym1 = @user.pseudonyms.create!(:unique_id => 'jt@instructure.com')
user_with_pseudonym(:active_all => 1)
assign(:current_user, @user)
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
expect(page.css('#registration_confirmation_form').first).to be_nil
transfer_button = page.css('#transfer.btn').first
expect(transfer_button).not_to be_nil
expect(transfer_button['href']).to eq registration_confirmation_path(@communication_channel.confirmation_code, :enrollment => @enrollment.uuid, :transfer_enrollment => 1)
login_button = page.css('#login.btn').first
expect(login_button).not_to be_nil
expect(login_button['href']).to eq login_url(:enrollment => @enrollment.uuid, :pseudonym_session => { :unique_id => 'jt@instructure.com'}, :expected_user_id => @pseudonym1.user_id, :host => "test.host")
end
context "open registration" do
before do
@user.update_attribute(:workflow_state, 'creation_pending')
assign(:pseudonym, @user.pseudonyms.build(:account => Account.default))
end
include_examples "user registration"
end
end
context "merging" do
before do
@user.register
end
it "should render to merge with the current user" do
user_with_pseudonym(:active_all => 1)
assign(:current_user, @user)
assign(:merge_opportunities, [[@user, [@pseudonym]]])
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
expect(page.css('input[type="radio"][name="pseudonym_select"]')).to be_empty
expect(page.css('#registration_confirmation_form').first).to be_nil
expect(page.css('#register.btn').first).to be_nil
merge_button = page.css('#merge.btn').first
expect(merge_button).not_to be_nil
expect(merge_button.text).to eq 'Combine'
expect(merge_button['href']).to eq registration_confirmation_path(@communication_channel.confirmation_code, :confirm => 1, :enrollment => nil)
end
it "should render to merge with the current user that doesn't have a pseudonym in the default account" do
account = Account.create!
user_with_pseudonym(:active_all => 1, :account => account)
assign(:current_user, @user)
assign(:merge_opportunities, [[@user, [@pseudonym]]])
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
expect(page.css('input[type="radio"][name="pseudonym_select"]')).to be_empty
expect(page.css('#registration_confirmation_form').first).to be_nil
expect(page.css('#register.btn').first).to be_nil
merge_button = page.css('#merge.btn').first
expect(merge_button).not_to be_nil
expect(merge_button.text).to eq 'Combine'
expect(merge_button['href']).to eq registration_confirmation_path(@communication_channel.confirmation_code, :confirm => 1, :enrollment => nil)
end
it "should render to merge multiple users" do
user_with_pseudonym(:active_all => 1)
@user1 = @user
@pseudonym1 = @pseudonym
user_with_pseudonym(:active_all => 1, :username => 'georgedoe@example.com')
@user2 = @user
assign(:merge_opportunities, [[@user1, [@user1.pseudonym]], [@user2, [@user2.pseudonym]]])
render
page = Nokogiri::HTML('<document>' + response.body + '</document>')
expect(page.css('input[type="radio"][name="pseudonym_select"]').length).to eq 2
expect(page.css('#registration_confirmation_form').first).to be_nil
expect(page.css('#register.btn').first).to be_nil
merge_button = page.css('#merge.btn').first
expect(merge_button).not_to be_nil
expect(merge_button.text).to eq 'Continue'
expect(merge_button['href']).to eq login_url(:host => HostUrl.default_host, :confirm => @communication_channel.confirmation_code, :pseudonym_session => {:unique_id => @pseudonym1.unique_id}, :expected_user_id => @pseudonym1.user_id)
end
end
context "self-registration" do
before do
assign(:pseudonym, @user.pseudonyms.create!(:unique_id => 'johndoe@example.com'))
end
include_examples "user registration"
end
end