canvas-lms/spec/selenium/users_spec.rb

325 lines
12 KiB
Ruby

require File.expand_path(File.dirname(__FILE__) + '/common')
describe "users" do
include_context "in-process server selenium tests"
context "logins" do
it "should allow setting passwords for new pseudonyms" do
admin = User.create!
Account.site_admin.account_users.create!(user: admin)
user_session(admin)
@user = User.create!
course.enroll_student(@user)
get "/users/#{@user.id}"
pseudonym_form = f('#edit_pseudonym_form')
f(".add_pseudonym_link").click
wait_for_ajaximations
pseudonym_form.find_element(:css, "#pseudonym_unique_id").send_keys('new_user')
pseudonym_form.find_element(:css, "#pseudonym_password").send_keys('qwerty1')
pseudonym_form.find_element(:css, "#pseudonym_password_confirmation").send_keys('qwerty1')
submit_form(pseudonym_form)
wait_for_ajaximations
new_login = ff('.login').find { |e| e.attribute(:class) !~ /blank/ }
expect(new_login).not_to be_nil
expect(new_login.find_element(:css, '.account_name').text()).not_to be_blank
pseudonym = Pseudonym.by_unique_id('new_user').first
expect(pseudonym.valid_password?('qwerty1')).to be_truthy
end
end
context "page views" do
before (:each) do
course_with_admin_logged_in
@student = student_in_course.user
Setting.set('enable_page_views', 'db')
end
it "should validate a basic page view" do
page_view(:user => @student, :course => @course, :url => 'assignments')
get "/users/#{@student.id}"
rows = ff('#page_view_results tr')
expect(rows.count).to eq 1
page_view = rows.first
expect(page_view).to include_text('Firefox')
expect(page_view).to include_text('assignments')
expect(f('#page_view_results tr img')).to be_nil # should not have a participation
end
it "should validate page view with a participation" do
page_view(:user => @student, :course => @course, :participated => true)
get "/users/#{@student.id}"
expect(f("#page_view_results img")).to have_attribute(:src, '/images/checked.png')
end
it "should validate a page view url" do
second_student_name = 'test student for page views'
get "/users/#{@student.id}"
page_view(:user => @student, :course => @course, :participated => true, :url => student_in_course(:name => second_student_name).user.id.to_s)
refresh_page # in order to get the generated page view
page_view_url = f('#page_view_results a')
second_student = User.where(name: second_student_name).first
expect(page_view_url.text).to eq second_student.id.to_s
expect_new_page_load { page_view_url.click }
expect(f('.user_details .name').text).to eq second_student.name
expect(ff("#page_view_results tr").length).to eq 0 # validate the second student has no page views
end
it "should validate all page views were loaded" do
page_views_count = 100
page_views_count.times { |i| page_view(:user => @student, :course => @course, :url => "#{"%03d" % i}") }
get "/users/#{@student.id}"
wait_for_ajaximations
driver.execute_script("$('#pageviews').scrollTop($('#pageviews')[0].scrollHeight);")
wait_for_ajaximations
expect(ff("#page_view_results tr").length).to eq page_views_count
end
end
context "admin merge" do
def setup_user_merge(from_user, into_user)
get "/users/#{from_user.id}/admin_merge"
f('#manual_user_id').send_keys(into_user.id)
expect_new_page_load { f('button[type="submit"]').click }
end
def reload_users(users)
users.each { |user| user.reload }
end
def submit_merge
expect_new_page_load { f('#prepare_to_merge').click }
expect_new_page_load { f('button[type="submit"]').click }
end
def validate_login_info(user_id)
expect(f('#login_information')).to include_text(user_id)
end
before (:each) do
@student_1_id = 'student1@example.com'
@student_2_id = 'student2@example.com'
course_with_admin_logged_in
@student_1 = User.create!(:name => 'Student One')
@student_1.register!
@student_1.pseudonyms.create!(:unique_id => @student_1_id, :password => 'asdfasdf', :password_confirmation => 'asdfasdf')
@course.enroll_user(@student_1).accept!
@student_2 = User.create!(:name => 'Student Two')
@student_2.register!
@student_2.pseudonyms.create!(:unique_id => @student_2_id, :password => 'asdfasdf', :password_confirmation => 'asdfasdf')
@course.enroll_user(@student_2).accept!
@users = [@student_1, @student_2]
end
it "should merge user a with user b" do
setup_user_merge(@student_2, @student_1)
submit_merge
reload_users(@users)
expect(@student_1.workflow_state).to eq 'registered'
expect(@student_2.workflow_state).to eq 'deleted'
validate_login_info(@student_1_id)
end
it "should merge user b with user a" do
setup_user_merge(@student_1, @student_2)
submit_merge
reload_users(@users)
expect(@student_1.workflow_state).to eq 'deleted'
expect(@student_2.workflow_state).to eq 'registered'
validate_login_info(@student_2_id)
end
it "should validate switching the users to merge" do
setup_user_merge(@student_2, @student_1)
user_names = ff('.result td')
expect(user_names[0]).to include_text(@student_2.name)
expect(user_names[1]).to include_text(@student_1.name)
f('#switch_user_positions').click
wait_for_ajaximations
user_names = ff('.result td')
expect(user_names[0]).to include_text(@student_1.name)
expect(user_names[1]).to include_text(@student_2.name)
submit_merge
reload_users(@users)
expect(@student_1.workflow_state).to eq 'deleted'
expect(@student_2.workflow_state).to eq 'registered'
validate_login_info(@student_1_id)
end
it "should cancel a merge and validate both users still exist" do
setup_user_merge(@student_2, @student_1)
expect_new_page_load { f('#prepare_to_merge').click }
wait_for_ajaximations
expect_new_page_load { f('.button-secondary').click }
wait_for_ajaximations
expect(f('#courses_menu_item')).to be_displayed
expect(@student_1.workflow_state).to eq 'registered'
expect(@student_2.workflow_state).to eq 'registered'
end
it "should show an error if the user id entered is the current users" do
get "/users/#{@student_1.id}/admin_merge"
expect(flash_message_present?(:error)).to be_falsey
f('#manual_user_id').send_keys(@student_1.id)
expect_new_page_load { f('button[type="submit"]').click }
wait_for_ajaximations
expect(flash_message_present?(:error, /You can't merge an account with itself./)).to be_truthy
end
it "should show an error if invalid text is entered in the id box" do
get "/users/#{@student_1.id}/admin_merge"
expect(flash_message_present?(:error)).to be_falsey
f('#manual_user_id').send_keys("azxcvbytre34567uijmm23456yhj")
expect_new_page_load { f('button[type="submit"]').click }
wait_for_ajaximations
expect(flash_message_present?(:error, /No active user with that ID was found./)).to be_truthy
end
it "should show an error if the user id doesnt exist" do
get "/users/#{@student_1.id}/admin_merge"
expect(flash_message_present?(:error)).to be_falsey
f('#manual_user_id').send_keys(1234567809)
expect_new_page_load { f('button[type="submit"]').click }
expect(flash_message_present?(:error, /No active user with that ID was found./)).to be_truthy
end
end
context "registration" do
before :each do
a = Account.default
a.settings = {:self_registration => true}
a.save!
end
it "should not require terms if globally not configured to do so" do
Setting.set('terms_required', 'false')
get '/register'
%w{teacher student parent}.each do |type|
f("#signup_#{type}").click
form = fj('.ui-dialog:visible form')
expect(f('input[name="user[terms_of_use]"]', form)).to be_nil
fj('.ui-dialog-titlebar-close:visible').click
end
end
it "should not require terms if account not configured to do so" do
default_account = Account.default
default_account.settings[:account_terms_required] = false
default_account.save!
get '/register'
%w{teacher student parent}.each do |type|
f("#signup_#{type}").click
form = fj('.ui-dialog:visible form')
expect(f('input[name="user[terms_of_use]"]', form)).to be_nil
fj('.ui-dialog-titlebar-close:visible').click
end
end
it "should require terms if configured to do so" do
get "/register"
%w{teacher student parent}.each do |type|
f("#signup_#{type}").click
form = fj('.ui-dialog:visible form')
input = f('input[name="user[terms_of_use]"]', form)
expect(input).not_to be_nil
form.submit
wait_for_ajaximations
assert_error_box 'input[name="user[terms_of_use]"]:visible'
fj('.ui-dialog-titlebar-close:visible').click
end
end
it "should register a student with a join code" do
Account.default.allow_self_enrollment!
course(:active_all => true)
@course.update_attribute(:self_enrollment, true)
get '/register'
f('#signup_student').click
form = fj('.ui-dialog:visible form')
f('#student_join_code').send_keys(@course.self_enrollment_code)
f('#student_name').send_keys('student!')
f('#student_username').send_keys('student')
f('#student_password').send_keys('asdfasdf')
f('#student_password_confirmation').send_keys('asdfasdf')
f('input[name="user[terms_of_use]"]', form).click
expect_new_page_load { form.submit }
# confirm the user is authenticated into the dashboard
expect(f('#identity .logout')).to be_present
expect(User.last.initial_enrollment_type).to eq 'student'
end
it "should register a teacher" do
get '/register'
f('#signup_teacher').click
form = fj('.ui-dialog:visible form')
f('#teacher_name').send_keys('teacher!')
f('#teacher_email').send_keys('teacher@example.com')
# if instructure_misc_plugin is installed, number of registration fields increase
if (Dir.exist?('./gems/plugins/instructure_misc_plugin') || Dir.exist?('./vendor/plugins/instructure_misc_plugin'))
set_value f('#teacher_organization_type'), 'Higher Ed'
set_value f('#teacher_school_position'), 'Dean'
f('#teacher_phone').send_keys('1231231234')
f('#teacher_school_name').send_keys('example org')
set_value f('#location'), 'United States and Canada'
end
f('input[name="user[terms_of_use]"]', form).click
expect_new_page_load { form.submit }
# confirm the user is authenticated into the dashboard
expect(f('#identity .logout')).to be_present
expect(User.last.initial_enrollment_type).to eq 'teacher'
end
it "should register an observer" do
user_with_pseudonym(:active_all => true, :password => 'lolwut')
get '/register'
f('#signup_parent').click
form = fj('.ui-dialog:visible form')
f('#parent_name').send_keys('parent!')
f('#parent_email').send_keys('parent@example.com')
f('#parent_child_username').send_keys(@pseudonym.unique_id)
f('#parent_child_password').send_keys('lolwut')
f('input[name="user[terms_of_use]"]', form).click
expect_new_page_load { form.submit }
# confirm the user is authenticated into the dashboard
expect(f('#identity .logout')).to be_present
expect(User.last.initial_enrollment_type).to eq 'observer'
end
end
context "masquerading" do
it "should masquerade as a user", priority: "1", test_id: 134743 do
site_admin_logged_in(:name => 'The Admin')
user_with_pseudonym(:active_user => true, :name => 'The Student')
get "/users/#{@user.id}/masquerade"
f('.masquerade_button').click
wait_for_ajaximations
expect(f('#identity .user_name')).to include_text 'The Student'
bar = f('#masquerade_bar')
expect(bar).to include_text 'You are currently masquerading'
bar.find_element(:css, '.stop_masquerading').click
wait_for_ajaximations
expect(f('#identity .user_name')).to include_text 'The Admin'
end
end
end