spec: speed up api specs

liberal applicataion of once-ler and bulk_insert helpers, reduce runtime
from 50min -> 25min

Change-Id: I07c1952c4ead0a1c6caafc389de0b9586b27dc68
Reviewed-on: https://gerrit.instructure.com/37794
Reviewed-by: Landon Wilkins <lwilkins@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
Product-Review: Jon Jensen <jon@instructure.com>
QA-Review: Jon Jensen <jon@instructure.com>
This commit is contained in:
Jon Jensen 2014-07-13 01:07:19 -06:00
parent 2acbe015cf
commit 5480c8fecd
85 changed files with 1292 additions and 1412 deletions

View File

@ -309,6 +309,11 @@ class Folder < ActiveRecord::Base
@@path_lookups[key] = current_folder
end
def self.reset_path_lookups!
@@root_folders = {}
@@path_lookups = {}
end
def self.unfiled_folder(context)
folder = context.folders.find_by_parent_folder_id_and_workflow_state_and_name(Folder.root_folders(context).first.id, 'visible', 'unfiled')
unless folder

View File

@ -21,8 +21,11 @@ require File.expand_path(File.dirname(__FILE__) + '/../sharding_spec_helper')
describe "API Authentication", type: :request do
before do
before :once do
@key = DeveloperKey.create!
end
before :each do
@client_id = @key.id
@client_secret = @key.api_key
consider_all_requests_local(false)
@ -72,9 +75,12 @@ describe "API Authentication", type: :request do
describe "should continue to allow developer key + basic auth access" do
# this will continue to be supported until we notify api users and explicitly phase it out
before do
before :once do
user_with_pseudonym(:active_user => true, :username => 'test1@example.com', :password => 'test123')
course_with_teacher(:user => @user)
end
before :each do
post '/login', 'pseudonym_session[unique_id]' => 'test1@example.com', 'pseudonym_session[password]' => 'test123'
end
@ -469,7 +475,7 @@ describe "API Authentication", type: :request do
end
describe "access token" do
before do
before :once do
user_with_pseudonym(:active_user => true, :username => 'test1@example.com', :password => 'test123')
course_with_teacher(:user => @user)
@token = @user.access_tokens.create!
@ -566,7 +572,7 @@ describe "API Authentication", type: :request do
end
describe "as_user_id" do
before do
before :once do
course_with_teacher(:active_all => true)
@course1 = @course
course_with_student(:user => @user, :active_all => true)
@ -722,7 +728,7 @@ describe "API Authentication", type: :request do
end
describe "CSRF protection" do
before do
before :once do
course_with_teacher(:active_all => true)
@course1 = @course
course_with_student(:user => @user, :active_all => true)

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/api_spec_helper')
describe "API Error Handling", type: :request do
before do
before :once do
user_with_pseudonym(:active_all => true)
@token = @user.access_tokens.create!
end

View File

@ -82,7 +82,7 @@ describe "API", type: :request do
end
describe "json post format" do
before do
before :once do
course_with_teacher(:user => user_with_pseudonym, :active_all => true)
@token = @user.access_tokens.create!(:purpose => "specs")
end

View File

@ -39,7 +39,7 @@ shared_examples_for 'a locked api item' do
lock_info_extra.each { |attribute| lock_info[attribute.to_s].should_not be_nil, "expected lock_info to contain '#{attribute.to_s}'" }
end
before(:each) do
before(:once) do
course_with_student(:active_all => true)
end

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe LtiApiController, type: :request do
before do
before :once do
course_with_student(:active_all => true)
@student = @user
@course.enroll_teacher(user_with_pseudonym(:active_all => true))

View File

@ -19,9 +19,12 @@
require File.expand_path(File.dirname(__FILE__) + '/api_spec_helper')
describe UserContent, type: :request do
it "should translate course file download links to directly-downloadable urls" do
course_with_teacher_logged_in(:active_all => true)
before :once do
course_with_teacher(:active_all => true)
attachment_model
end
it "should translate course file download links to directly-downloadable urls" do
@assignment = @course.assignments.create!(:title => "first assignment", :description => <<-HTML)
<p>
Hello, students.<br>
@ -39,7 +42,6 @@ describe UserContent, type: :request do
end
it "should translate group file download links to directly-downloadable urls" do
course_with_teacher_logged_in(:active_all => true)
@group = @course.groups.create!(:name => "course group")
attachment_model(:context => @group)
@group.add_user(@teacher)
@ -60,8 +62,6 @@ describe UserContent, type: :request do
end
it "should translate file download links to directly-downloadable urls for deleted and replaced files" do
course_with_teacher_logged_in(:active_all => true)
attachment_model
@attachment.destroy
attachment2 = Attachment.create!(:folder => @attachment.folder, :context => @attachment.context, :filename => @attachment.filename, :uploaded_data => StringIO.new("first"))
@context.attachments.find(@attachment.id).id.should == attachment2.id
@ -83,7 +83,6 @@ describe UserContent, type: :request do
end
it "should not corrupt absolute links" do
course_with_teacher_logged_in
attachment_model(:context => @course)
@topic = @course.discussion_topics.create!(:title => "course topic", :user => @teacher, :message => <<-HTML)
<p>
@ -100,8 +99,6 @@ describe UserContent, type: :request do
end
it "should translate file preview links to directly-downloadable preview urls" do
course_with_teacher_logged_in(:active_all => true)
attachment_model
@assignment = @course.assignments.create!(:title => "first assignment", :description => <<-HTML)
<p>
Hello, students.<br>
@ -119,8 +116,6 @@ describe UserContent, type: :request do
end
it "should translate media comment links to embedded video tags" do
course_with_teacher_logged_in(:active_all => true)
attachment_model
@assignment = @course.assignments.create!(:title => "first assignment", :description => <<-HTML)
<p>
Hello, students.<br>
@ -149,8 +144,6 @@ describe UserContent, type: :request do
end
it "should translate media comment audio tags" do
course_with_teacher_logged_in(:active_all => true)
attachment_model
@assignment = @course.assignments.create!(:title => "first assignment", :description => <<-HTML)
<p>
Hello, students.<br>
@ -175,8 +168,6 @@ describe UserContent, type: :request do
end
it "should not translate links in content not viewable by user" do
course_with_teacher_logged_in(:active_all => true)
attachment_model
@assignment = @course.assignments.create!(:title => "first assignment", :description => <<-HTML)
<p>
Hello, students.<br>
@ -201,7 +192,6 @@ describe UserContent, type: :request do
end
it "should prepend the hostname to all absolute-path links" do
course_with_teacher_logged_in(:active_all => true)
@assignment = @course.assignments.create!(:title => "first assignment", :description => <<-HTML)
<p>
Hello, students.<br>
@ -229,7 +219,6 @@ describe UserContent, type: :request do
end
it "should not choke on funny email addresses" do
course_with_teacher_logged_in(:active_all => true)
@wiki_page = @course.wiki.front_page
@wiki_page.body = "<a href='mailto:djmankiewicz@homestarrunner,com'>e-nail</a>"
@wiki_page.workflow_state = 'active'
@ -242,7 +231,6 @@ describe UserContent, type: :request do
context "data api endpoints" do
context "course context" do
it "should process links to each type of object" do
course_with_teacher_logged_in(:active_all => true)
@wiki_page = @course.wiki.front_page
@wiki_page.body = <<-HTML
<p>
@ -322,7 +310,6 @@ describe UserContent, type: :request do
context "user context" do
it "should process links to each type of object" do
course_with_teacher_logged_in(:active_all => true)
@topic = @course.discussion_topics.create!(:message => <<-HTML)
<a href='/users/#{@teacher.id}/files'>file index</a>
<a href='/users/#{@teacher.id}/files/789/preview'>file</a>
@ -409,7 +396,6 @@ describe UserContent, type: :request do
describe ".api_bulk_load_user_content_attachments" do
it "returns a hash of assignment_id => assignment" do
course_with_teacher_logged_in(:active_all => true)
a1, a2, a3 = attachment_model, attachment_model, attachment_model
html1, html2 = <<-HTML1, <<-HTML2
<a href="/courses/#{@course.id}/files/#{a1.id}/download">uh...</a>

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "AccountAuthorizationConfigs API", type: :request do
before do
before :once do
@account = account_model(:name => 'root')
user_with_pseudonym(:active_all => true, :account => @account)
@account.account_users.create!(user: @user)
@ -366,7 +366,7 @@ describe "AccountAuthorizationConfigs API", type: :request do
end
context "discovery url" do
append_before do
before :once do
@account.auth_discovery_url = "http://example.com/auth"
@account.save!
end

View File

@ -20,7 +20,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "AccountAuthorizationConfigs API", type: :request do
before do
before :once do
@account = account_model(:name => 'root')
user_with_pseudonym(:active_all => true, :account => @account)
@account.account_users.create!(user: @user)

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe 'Account Reports API', type: :request do
before do
before :once do
@admin = account_admin_user
user_with_pseudonym(:user => @admin)
@report = AccountReport.new

View File

@ -19,8 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Accounts API", type: :request do
before do
Pseudonym.any_instance.stubs(:works_for_account?).returns(true)
before :once do
user_with_pseudonym(:active_all => true)
@a1 = account_model(:name => 'root', :default_time_zone => 'UTC', :default_storage_quota_mb => 123, :default_user_storage_quota_mb => 45, :default_group_storage_quota_mb => 42)
@a1.account_users.create!(user: @user)
@ -33,6 +32,10 @@ describe "Accounts API", type: :request do
@a4 = account_model(:name => 'implicit-access', :parent_account => @a1, :root_account => @a1)
end
before :each do
Pseudonym.any_instance.stubs(:works_for_account?).returns(true)
end
describe 'index' do
it "should return the account list" do
json = api_call(:get, "/api/v1/accounts.json",
@ -68,7 +71,7 @@ describe "Accounts API", type: :request do
end
describe 'sub_accounts' do
before do
before :once do
root = @a1
a1 = root.sub_accounts.create! :name => "Account 1"
a2 = root.sub_accounts.create! :name => "Account 2"
@ -244,7 +247,7 @@ describe "Accounts API", type: :request do
end
context 'with :manage_storage_quotas' do
before(:each) do
before(:once) do
# remove the user from being an Admin
@a1.account_users.where(user_id: @user).delete_all
@ -294,7 +297,7 @@ describe "Accounts API", type: :request do
end
context 'without :manage_storage_quotas' do
before(:each) do
before(:once) do
# remove the user from being an Admin
@a1.account_users.where(user_id: @user).delete_all
@ -387,7 +390,7 @@ describe "Accounts API", type: :request do
end
describe "courses filtered by state[]" do
before do
before :once do
@me = @user
[:c1, :c2, :c3, :c4].each do |course|
instance_variable_set("@#{course}".to_sym, course_model(:name => course.to_s, :account => @a1))
@ -433,7 +436,7 @@ describe "Accounts API", type: :request do
end
describe "?with_enrollments" do
before do
before :once do
@me = @user
c1 = course_model(:account => @a1, :name => 'c1') # has a teacher
c2 = Course.create!(:account => @a1, :name => 'c2') # has no enrollments
@ -460,7 +463,7 @@ describe "Accounts API", type: :request do
end
describe "?published" do
before do
before :once do
@me = @user
[:c1, :c2].each do |course|
instance_variable_set("@#{course}".to_sym, course_model(:name => course.to_s, :account => @a1))
@ -489,7 +492,7 @@ describe "Accounts API", type: :request do
end
describe "?completed" do
before do
before :once do
@me = @user
[:c1, :c2, :c3, :c4].each do |course|
instance_variable_set("@#{course}".to_sym, course_model(:name => course.to_s, :account => @a1, :conclude_at => 2.days.from_now))
@ -526,7 +529,7 @@ describe "Accounts API", type: :request do
end
describe "?by_teachers" do
before do
before :once do
@me = @user
course_with_teacher(:account => @a1, :course_name => 'c1a', :user => user_with_pseudonym(:account => @a1))
@pseudonym.sis_user_id = 'a_sis_id'
@ -563,7 +566,7 @@ describe "Accounts API", type: :request do
end
describe "?by_subaccounts" do
before do
before :once do
@me = @user
@sub1 = account_model(:name => 'sub1', :parent_account => @a1, :root_account => @a1, :sis_source_id => 'sub1')
@sub1a = account_model(:name => 'sub1a', :parent_account => @sub1, :root_account => @a1, :sis_source_id => 'sub1a')
@ -615,16 +618,16 @@ describe "Accounts API", type: :request do
end
it "should limit the maximum per-page returned" do
@me = @user
15.times { |i| course_model(:name => "c#{i}", :account => @a1, :root_account => @a1) }
@user = @me
create_courses(15, account: @a1, account_associations: true)
api_call(:get, "/api/v1/accounts/#{@a1.id}/courses?per_page=12", :controller => "accounts", :action => "courses_api", :account_id => @a1.to_param, :format => 'json', :per_page => '12').size.should == 12
Setting.set('api_max_per_page', '5')
api_call(:get, "/api/v1/accounts/#{@a1.id}/courses?per_page=12", :controller => "accounts", :action => "courses_api", :account_id => @a1.to_param, :format => 'json', :per_page => '12').size.should == 5
end
it "should return courses filtered search term" do
@user, @courses = @user, (5..12).map { |i| course_model(:name => "name#{i}", :course_code => "code#{i}", :account => @a1, :root_account => @a1) }
data = (5..12).map{ |i| {name: "name#{i}", course_code: "code#{i}" }}
@courses = create_courses(data, account: @a1, account_associations: true, return_type: :record)
@course = @courses.last
search_term = "name"
json = api_call(:get, "/api/v1/accounts/#{@a1.id}/courses?search_term=#{search_term}",

View File

@ -19,13 +19,13 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Admins API", type: :request do
before do
before :once do
@admin = account_admin_user
user_with_pseudonym(:user => @admin)
end
describe "create" do
before :each do
before :once do
@new_user = user(:name => 'new guy')
@admin.account.root_account.pseudonyms.create!(unique_id: 'user', user: @new_user)
@user = @admin
@ -111,7 +111,7 @@ describe "Admins API", type: :request do
end
describe "destroy" do
before do
before :once do
@account = Account.default
@new_user = user_with_managed_pseudonym(:name => 'bad admin', :account => @account, :sis_user_id => 'badmin')
@user = @admin
@ -133,7 +133,7 @@ describe "Admins API", type: :request do
end
context "with AccountAdmin membership" do
before do
before :once do
@au = @account.account_users.create! :user => @new_user
@account.account_users.find_by_user_id(@new_user.id).should_not be_nil
end
@ -168,7 +168,7 @@ describe "Admins API", type: :request do
end
context "with custom membership" do
before do
before :once do
@au = @account.account_users.create! :user => @new_user, :membership_type => 'CustomAdmin'
end
@ -189,7 +189,7 @@ describe "Admins API", type: :request do
end
context "with multiple memberships" do
before do
before :once do
@au1 = @account.account_users.create! :user => @new_user
@au2 = @account.account_users.create! :user => @new_user, :membership_type => 'CustomAdmin'
end
@ -212,7 +212,7 @@ describe "Admins API", type: :request do
end
describe "index" do
before do
before :once do
@account = Account.default
@path = "/api/v1/accounts/#{@account.id}/admins"
@path_opts = { :controller => "admins", :action => "index", :format => "json", :account_id => @account.to_param }
@ -229,24 +229,28 @@ describe "Admins API", type: :request do
end
context "with account users" do
it "should return the correct format" do
json = api_call(:get, @path, @path_opts)
json.should ==[{"id"=>@admin.account_users.first.id,
"role"=>"AccountAdmin",
"user"=>
{"id"=>@admin.id,
"name"=>@admin.name,
"sortable_name"=>@admin.sortable_name,
"short_name"=>@admin.short_name,
"login_id"=>@admin.pseudonym.unique_id}}]
end
it "should scope the results to the user_id if given" do
before :once do
2.times do |x|
u = user(:name => "User #{x}", :account => @account)
@account.account_users.create!(:user => u, :membership_type => "MT #{x}")
end
@another_admin = @user
@user = @admin
end
it "should return the correct format" do
json = api_call(:get, @path, @path_opts)
json.should be_include({"id"=>@admin.account_users.first.id,
"role"=>"AccountAdmin",
"user"=>
{"id"=>@admin.id,
"name"=>@admin.name,
"sortable_name"=>@admin.sortable_name,
"short_name"=>@admin.short_name,
"login_id"=>@admin.pseudonym.unique_id}})
end
it "should scope the results to the user_id if given" do
json = api_call(:get, @path, @path_opts.merge(user_id: @admin.id))
json.should ==[{"id"=>@admin.account_users.first.id,
"role"=>"AccountAdmin",
@ -259,13 +263,7 @@ describe "Admins API", type: :request do
end
it "should scope the results to the array of user_ids if given" do
2.times do |x|
u = user(:name => "User #{x}", :account => @account)
@account.account_users.create!(:user => u, :membership_type => "MT #{x}")
end
another_admin = @user
@user = @admin
json = api_call(:get, @path, @path_opts.merge(user_id: [@admin.id, another_admin.id]))
json = api_call(:get, @path, @path_opts.merge(user_id: [@admin.id, @another_admin.id]))
json.should ==[{"id"=>@admin.account_users.first.id,
"role"=>"AccountAdmin",
"user"=>
@ -274,34 +272,26 @@ describe "Admins API", type: :request do
"sortable_name"=>@admin.sortable_name,
"short_name"=>@admin.short_name,
"login_id"=>@admin.pseudonym.unique_id}},
{"id"=>another_admin.account_users.first.id,
{"id"=>@another_admin.account_users.first.id,
"role"=>"MT 1",
"user"=>
{"id"=>another_admin.id,
"name"=>another_admin.name,
"sortable_name"=>another_admin.sortable_name,
"short_name"=>another_admin.short_name}}]
{"id"=>@another_admin.id,
"name"=>@another_admin.name,
"sortable_name"=>@another_admin.sortable_name,
"short_name"=>@another_admin.short_name}}]
end
it "should paginate" do
4.times do |x|
u = user(:name => "User #{x}", :account => @account)
@account.account_users.create!(:user => u, :membership_type => "MT #{x}")
end
@user = @admin
json = api_call(:get, @path + "?per_page=3", @path_opts.merge(:per_page => '3'))
json = api_call(:get, @path + "?per_page=2", @path_opts.merge(:per_page => '2'))
response.headers['Link'].should match(%r{<http://www.example.com/api/v1/accounts/#{@account.id}/admins\?.*page=2.*>; rel="next",<http://www.example.com/api/v1/accounts/#{@account.id}/admins\?.*page=1.*>; rel="first",<http://www.example.com/api/v1/accounts/#{@account.id}/admins\?.*page=2.*>; rel="last"})
json.map{ |au| { :user => au['user']['name'], :role => au['role'] } }.should == [
{ :user => @admin.name, :role => 'AccountAdmin' },
{ :user => "User 0", :role => "MT 0" },
{ :user => "User 1", :role => "MT 1" }
]
json = api_call(:get, @path + "?per_page=3&page=2", @path_opts.merge(:per_page => '3', :page => '2'))
json = api_call(:get, @path + "?per_page=2&page=2", @path_opts.merge(:per_page => '2', :page => '2'))
response.headers['Link'].should match(%r{<http://www.example.com/api/v1/accounts/#{@account.id}/admins\?.*page=1.*>; rel="prev",<http://www.example.com/api/v1/accounts/#{@account.id}/admins\?.*page=1.*>; rel="first",<http://www.example.com/api/v1/accounts/#{@account.id}/admins\?.*page=2.*>; rel="last"})
json.map{ |au| { :user => au['user']['name'], :role => au['role'] } }.should == [
{ :user => "User 2", :role => "MT 2" },
{ :user => "User 3", :role => "MT 3" }
{ :user => "User 1", :role => "MT 1" }
]
end
end

View File

@ -19,12 +19,15 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe AppointmentGroupsController, type: :request do
before do
before :once do
course_with_teacher(:active_all => true, :user => user_with_pseudonym(:active_user => true))
@course1 = @course
course_with_teacher(:active_all => true, :user => @user)
@course2 = @course
@me = @user
@student1 = student_in_course(:course => @course, :active_all => true).user
@student2 = student_in_course(:course => @course, :active_all => true).user
@user = @me
end
expected_fields = [
@ -153,25 +156,23 @@ describe AppointmentGroupsController, type: :request do
end
it 'should paginate appointment groups' do
ids = 25.times.map { |i| AppointmentGroup.create!(:title => "#{i}".object_id, :contexts => [@course]) }
json = api_call(:get, "/api/v1/appointment_groups?scope=manageable&per_page=10", {
ids = 5.times.map { |i| AppointmentGroup.create!(:title => "#{i}".object_id, :contexts => [@course]) }
json = api_call(:get, "/api/v1/appointment_groups?scope=manageable&per_page=2", {
:controller => 'appointment_groups', :action => 'index', :format => 'json',
:scope => 'manageable', :per_page => '10'})
json.size.should eql 10
:scope => 'manageable', :per_page => '2'})
json.size.should eql 2
response.headers['Link'].should match(%r{<http://www.example.com/api/v1/appointment_groups\?.*page=2.*>; rel="next",<http://www.example.com/api/v1/appointment_groups\?.*page=1.*>; rel="first",<http://www.example.com/api/v1/appointment_groups\?.*page=3.*>; rel="last"})
json = api_call(:get, "/api/v1/appointment_groups?scope=manageable&per_page=10&page=3", {
json = api_call(:get, "/api/v1/appointment_groups?scope=manageable&per_page=2&page=3", {
:controller => 'appointment_groups', :action => 'index', :format => 'json',
:scope => 'manageable', :per_page => '10', :page => '3'})
json.size.should eql 5
:scope => 'manageable', :per_page => '2', :page => '3'})
json.size.should eql 1
response.headers['Link'].should match(%r{<http://www.example.com/api/v1/appointment_groups\?.*page=2.*>; rel="prev",<http://www.example.com/api/v1/appointment_groups\?.*page=1.*>; rel="first",<http://www.example.com/api/v1/appointment_groups\?.*page=3.*>; rel="last"})
end
it 'should include appointments and child_events, if requested' do
ag = AppointmentGroup.create!(:title => "something", :new_appointments => [["#{Time.now.year + 1}-01-01 12:00:00", "#{Time.now.year + 1}-01-01 13:00:00"]], :contexts => [@course])
student = student_in_course(:course => @course, :active_all => true).user
ag.appointments.first.reserve_for student, @me
@user = @me
ag.appointments.first.reserve_for @student1, @me
json = api_call(:get, "/api/v1/appointment_groups?scope=manageable&include[]=appointments", {
:controller => 'appointment_groups', :action => 'index', :format => 'json', :scope => 'manageable', :include => ['appointments']})
@ -186,7 +187,7 @@ describe AppointmentGroupsController, type: :request do
ajson.first.keys.should include('child_events')
cjson = ajson.first['child_events']
cjson.first.keys.should include('user')
cjson.first['user']['id'].should eql student.id
cjson.first['user']['id'].should eql @student1.id
end
it 'should get a manageable appointment group' do
@ -204,9 +205,7 @@ describe AppointmentGroupsController, type: :request do
it 'should include child_events, if requested' do
ag = AppointmentGroup.create!(:title => "something", :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
student = student_in_course(:course => @course, :active_all => true).user
ag.appointments.first.reserve_for student, @me
@user = @me
ag.appointments.first.reserve_for @student1, @me
json = api_call(:get, "/api/v1/appointment_groups/#{ag.id}?include[]=child_events", {
:controller => 'appointment_groups', :action => 'show', :format => 'json', :id => ag.id.to_s, :include => ['child_events']})
@ -217,12 +216,11 @@ describe AppointmentGroupsController, type: :request do
ajson.first.keys.should include('child_events')
cjson = ajson.first['child_events']
cjson.first.keys.should include('user')
cjson.first['user']['id'].should eql student.id
cjson.first['user']['id'].should eql @student1.id
end
it 'should get a reservable appointment group' do
student_in_course :course => course(:active_all => true), :user => @me, :active_all => true
@user = @me
ag = AppointmentGroup.create!(:title => "yay", :new_appointments => [["#{Time.now.year + 1}-01-01 12:00:00", "#{Time.now.year + 1}-01-01 13:00:00"]], :contexts => [@course])
ag.publish!
@ -235,7 +233,6 @@ describe AppointmentGroupsController, type: :request do
it 'should require action until the min has been met' do
student_in_course :course => course(:active_all => true), :user => @me, :active_all => true
@user = @me
ag = AppointmentGroup.create!(:title => "yay", :new_appointments => [["#{Time.now.year + 1}-01-01 12:00:00", "#{Time.now.year + 1}-01-01 13:00:00"]], :min_appointments_per_participant => 1, :contexts => [@course])
ag.publish!
appt = ag.appointments.first
@ -257,7 +254,6 @@ describe AppointmentGroupsController, type: :request do
it 'should enforce create permissions' do
student_in_course :course => course(:active_all => true), :user => @me, :active_all => true
@user = @me
raw_api_call(:post, "/api/v1/appointment_groups",
{:controller => 'appointment_groups', :action => 'create', :format => 'json'},
{:appointment_group => {:context_codes => [@course.asset_string], :title => "ohai"} })
@ -286,7 +282,6 @@ describe AppointmentGroupsController, type: :request do
it 'should enforce update permissions' do
student_in_course :course => course(:active_all => true), :user => @me, :active_all => true
@user = @me
ag = AppointmentGroup.create!(:title => "something", :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
raw_api_call(:put, "/api/v1/appointment_groups/#{ag.id}",
{:controller => 'appointment_groups', :action => 'update', :format => 'json', :id => ag.id.to_s},
@ -323,7 +318,6 @@ describe AppointmentGroupsController, type: :request do
it 'should enforce delete permissions' do
student_in_course :course => course(:active_all => true), :user => @me, :active_all => true
@user = @me
ag = AppointmentGroup.create!(:title => "something", :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
raw_api_call(:delete, "/api/v1/appointment_groups/#{ag.id}",
{:controller => 'appointment_groups', :action => 'destroy', :format => 'json', :id => ag.id.to_s})
@ -384,24 +378,22 @@ describe AppointmentGroupsController, type: :request do
'users' => proc {
@ag = AppointmentGroup.create!(:title => "yay", :new_appointments => [["#{Time.now.year + 1}-01-01 12:00:00", "#{Time.now.year + 1}-01-01 13:00:00"], ["#{Time.now.year + 1}-01-01 13:00:00", "#{Time.now.year + 1}-01-01 14:00:00"]], :contexts => [@course])
@ag.publish!
student1 = student_in_course(:course => @course, :active_all => true).user
@ag.appointments.first.reserve_for student1, @me
student2 = student_in_course(:course => @course, :active_all => true).user
@ag.appointments.first.reserve_for @student1, @me
},
'groups' => proc {
cat = @course.group_categories.create(name: "foo")
@ag = AppointmentGroup.create!(:title => "yay", :sub_context_codes => [cat.asset_string], :new_appointments => [["#{Time.now.year + 1}-01-01 12:00:00", "#{Time.now.year + 1}-01-01 13:00:00"], ["#{Time.now.year + 1}-01-01 13:00:00", "#{Time.now.year + 1}-01-01 14:00:00"]], :contexts => [@course])
@ag.publish!
group1 = cat.groups.create(:context => @course)
group1.users << student_in_course(:course => @course, :active_all => true).user
group1.users << @student1
@ag.appointments.first.reserve_for group1, @me
group2 = cat.groups.create(:context => @course)
group2.users << student_in_course(:course => @course, :active_all => true).user
group2.users << @student2
}
}
types.each do |type, block|
context "#{type.singularize}-level appointment groups" do
before &block
before :once, &block
it "should return all #{type}" do
json = api_call(:get, "/api/v1/appointment_groups/#{@ag.id}/#{type}", {

View File

@ -22,8 +22,7 @@ describe AssignmentGroupsController, type: :request do
include Api
include Api::V1::Assignment
def set_up_course_with_groups
course_with_teacher(:active_all => true)
def set_up_groups
@group1 = @course.assignment_groups.create!(:name => 'group1')
@group1.update_attribute(:position, 10)
@group1.update_attribute(:group_weight, 40)
@ -39,10 +38,13 @@ describe AssignmentGroupsController, type: :request do
@a4 = @course.assignments.create!({:title => "test4", :assignment_group => @group2, :points_possible => 9}.merge(assignment_opts))
end
before :once do
course_with_teacher(:active_all => true)
end
it "should sort the returned list of assignment groups" do
# the API returns the assignments sorted by
# assignment_groups.position
course_with_teacher(:active_all => true)
group1 = @course.assignment_groups.create!(:name => 'group1')
group1.update_attribute(:position, 10)
group2 = @course.assignment_groups.create!(:name => 'group2')
@ -81,7 +83,7 @@ describe AssignmentGroupsController, type: :request do
end
it "should include full assignment jsonification when specified" do
set_up_course_with_groups
set_up_groups
set_up_four_assignments
rubric_model(:user => @user, :context => @course, :points_possible => 12,
@ -131,7 +133,7 @@ describe AssignmentGroupsController, type: :request do
context "differentiated assignments on" do
it "should only return visible assignments when differentiated assignments is on" do
set_up_course_with_groups
set_up_groups
set_up_four_assignments(only_visible_to_overrides: true)
@user.enrollments.each(&:delete)
@section = @course.course_sections.create!(name: "test section")
@ -168,7 +170,6 @@ describe AssignmentGroupsController, type: :request do
end
it "should include assignment_visibility when requested" do
course_with_teacher active_all: true
@course.assignments.create!
@course.enable_feature!(:differentiated_assignments)
json = api_call(:get,
@ -188,7 +189,6 @@ describe AssignmentGroupsController, type: :request do
end
it "should include module_ids when requested" do
course_with_teacher active_all: true
mods = 2.times.map { |i| @course.context_modules.create! name: "Mod#{i}" }
g = @course.assignment_groups.create! name: 'assignments'
a = @course.assignments.create! assignment_group: g, title: "blah"
@ -204,7 +204,6 @@ describe AssignmentGroupsController, type: :request do
end
it "should not include all dates " do
course_with_teacher(:active_all => true)
group = @course.assignment_groups.build(:name => 'group1')
group.position = 10
group.group_weight = 40
@ -248,7 +247,6 @@ describe AssignmentGroupsController, type: :request do
end
it "should include all dates" do
course_with_teacher(:active_all => true)
group = @course.assignment_groups.build(:name => 'group1')
group.position = 10
group.group_weight = 40
@ -289,7 +287,6 @@ describe AssignmentGroupsController, type: :request do
end
it "should exclude deleted assignments" do
course_with_teacher(:active_all => true)
group1 = @course.assignment_groups.create!(:name => 'group1')
group1.update_attribute(:position, 10)
@ -311,7 +308,6 @@ describe AssignmentGroupsController, type: :request do
end
it "should return weights that aren't being applied" do
course_with_teacher(:active_all => true)
@course.update_attribute(:group_weighting_scheme, 'equal')
group1 = @course.assignment_groups.create!(:name => 'group1', :group_weight => 50)
@ -325,7 +321,6 @@ describe AssignmentGroupsController, type: :request do
end
it "should not explode on assignments with <objects> with percentile widths" do
course_with_teacher(:active_all => true)
group = @course.assignment_groups.create!(:name => 'group')
assignment = @course.assignments.create!(:title => "test", :assignment_group => group, :points_possible => 10)
assignment.description = '<object width="100%" />'
@ -340,7 +335,7 @@ describe AssignmentGroupsController, type: :request do
end
it "should not return unpublished assignments to students" do
course_with_student(:active_all => true)
student_in_course(:active_all => true)
@course.root_account.enable_feature!(:draft_state)
@course.require_assignment_group
assignment = @course.assignments.create! do |a|
@ -368,7 +363,7 @@ describe AssignmentGroupsApiController, type: :request do
context '#show' do
before do
before :once do
course_with_teacher(:active_all => true)
rules_in_db = "drop_lowest:1\ndrop_highest:1\nnever_drop:1\nnever_drop:2\n"
@group = @course.assignment_groups.create!(:name => 'group', :rules => rules_in_db)
@ -472,7 +467,7 @@ describe AssignmentGroupsApiController, type: :request do
end
context '#update' do
before do
before :once do
course_with_teacher(:active_all => true)
@assignment_group = @course.assignment_groups.create!(:name => 'Some group', :position => 1)
end
@ -512,7 +507,7 @@ describe AssignmentGroupsApiController, type: :request do
end
context '#destroy' do
before do
before :once do
course_with_teacher(:active_all => true)
@assignment_group = @course.assignment_groups.create!(:name => 'Some group', :position => 1)
end

View File

@ -73,7 +73,7 @@ describe AssignmentOverridesController, type: :request do
end
context "index" do
before :each do
before :once do
course_with_teacher(:active_all => true)
assignment_model(:course => @course)
assignment_override_model(:assignment => @assignment)
@ -126,7 +126,7 @@ describe AssignmentOverridesController, type: :request do
end
context "show" do
before :each do
before :once do
course_with_teacher(:active_all => true)
assignment_model(:course => @course, :group_category => 'category')
assignment_override_model(:assignment => @assignment)
@ -149,7 +149,6 @@ describe AssignmentOverridesController, type: :request do
describe 'as an account admin not enrolled in the class' do
before :each do
account_admin_user(:account => Account.site_admin, :active_all => true)
user_session(@admin)
end
it 'it works' do
@ -231,7 +230,7 @@ describe AssignmentOverridesController, type: :request do
end
context "group alias" do
before :each do
before :once do
course_with_teacher(:active_all => true)
assignment_model(:course => @course, :group_category => 'category')
group_model(:context => @course, :group_category => @assignment.group_category)
@ -276,7 +275,7 @@ describe AssignmentOverridesController, type: :request do
end
context "section alias" do
before :each do
before :once do
course_with_teacher(:active_all => true)
assignment_model(:course => @course)
assignment_override_model(:assignment => @assignment)
@ -331,7 +330,7 @@ describe AssignmentOverridesController, type: :request do
data)
end
before :each do
before :once do
course_with_teacher(:active_all => true)
assignment_model(:course => @course)
end
@ -342,7 +341,7 @@ describe AssignmentOverridesController, type: :request do
end
context "adhoc" do
before :each do
before :once do
@student = student_in_course(:course => @course, :user => user_with_pseudonym).user
@title = 'adhoc title'
@user = @teacher
@ -397,7 +396,7 @@ describe AssignmentOverridesController, type: :request do
end
context "group" do
before :each do
before :once do
@assignment.group_category = @course.group_categories.create!(name: "foo")
@assignment.save!
@group = group_model(:context => @course, :group_category => @assignment.group_category)
@ -620,7 +619,7 @@ describe AssignmentOverridesController, type: :request do
data)
end
before :each do
before :once do
course_with_teacher(:active_all => true)
assignment_model(:course => @course)
assignment_override_model(:assignment => @assignment)
@ -648,7 +647,7 @@ describe AssignmentOverridesController, type: :request do
end
context "adhoc override" do
before :each do
before :once do
@student = student_in_course(:course => @course).user
@title = 'adhoc title'
@user = @teacher
@ -699,7 +698,7 @@ describe AssignmentOverridesController, type: :request do
end
context "group override" do
before :each do
before :once do
@assignment.group_category = @course.group_categories.create!(name: "foo")
@assignment.save!
@group = group_model(:context => @course, :group_category => @assignment.group_category)
@ -738,7 +737,7 @@ describe AssignmentOverridesController, type: :request do
end
context "section override" do
before :each do
before :once do
@override.set = @course.default_section
@override.save!
end
@ -771,7 +770,7 @@ describe AssignmentOverridesController, type: :request do
end
context "overridden due_at" do
before :each do
before :once do
@override.set = @course.default_section
@override.save!
@ -817,7 +816,7 @@ describe AssignmentOverridesController, type: :request do
end
context "overridden unlock_at" do
before :each do
before :once do
@override.set = @course.default_section
@override.save!
@ -864,7 +863,7 @@ describe AssignmentOverridesController, type: :request do
end
context "overridden lock_at" do
before :each do
before :once do
@override.set = @course.default_section
@override.save!
@ -922,7 +921,7 @@ describe AssignmentOverridesController, type: :request do
end
context "destroy" do
before :each do
before :once do
course_with_teacher(:active_all => true)
assignment_model(:course => @course, :group_category => 'category')
assignment_override_model(:assignment => @assignment)

View File

@ -25,17 +25,17 @@ describe AssignmentsApiController, type: :request do
include Api::V1::Submission
context 'locked api item' do
include_examples 'a locked api item'
let(:item_type) { 'assignment' }
let(:locked_item) do
let_once(:locked_item) do
@course.assignments.create!(:title => 'Locked Assignment')
end
def api_get_json
api_get_assignment_in_course(locked_item, @course)
end
include_examples 'a locked api item'
end
def create_submitted_assignment_with_user(user=@user)
@ -69,6 +69,9 @@ describe AssignmentsApiController, type: :request do
end
describe "GET /courses/:course_id/assignments (#index)" do
before :once do
course_with_teacher(:active_all => true)
end
it "returns unauthorized for users who cannot :read the course" do
# unpublished course with invited student
@ -92,7 +95,6 @@ describe AssignmentsApiController, type: :request do
it "sorts the returned list of assignments" do
# the API returns the assignments sorted by
# [assignment_groups.position, assignments.position]
course_with_teacher(:active_all => true)
group1 = @course.assignment_groups.create!(:name => 'group1')
group1.update_attribute(:position, 10)
group2 = @course.assignment_groups.create!(:name => 'group2')
@ -136,7 +138,6 @@ describe AssignmentsApiController, type: :request do
end
it "should search for assignments by title" do
course_with_teacher(:active_all => true)
2.times {|i| @course.assignments.create!(:title => "First_#{i}") }
ids = @course.assignments.map(&:id)
2.times {|i| @course.assignments.create!(:title => "second_#{i}") }
@ -156,7 +157,6 @@ describe AssignmentsApiController, type: :request do
it "should return the assignments list with API-formatted Rubric data" do
# the API changes the structure of the data quite a bit, to hide
# implementation details and ease API use.
course_with_teacher(:active_all => true)
@group = @course.assignment_groups.create!({:name => "some group"})
@assignment = @course.assignments.create!(:title => "some assignment",
:assignment_group => @group,
@ -206,7 +206,6 @@ describe AssignmentsApiController, type: :request do
end
it "should return learning outcome info with rubric criterions if available" do
course_with_teacher(:active_all => true)
@group = @course.assignment_groups.create!({:name => "some group"})
@assignment = @course.assignments.create!(:title => "some assignment",
:assignment_group => @group,
@ -243,7 +242,6 @@ describe AssignmentsApiController, type: :request do
end
it "should exclude deleted assignments in the list return" do
course_with_teacher(:active_all => true)
@context = @course
@assignment = factory_with_protected_attributes(
@course.assignments,
@ -259,7 +257,7 @@ describe AssignmentsApiController, type: :request do
end
describe "enable draft" do
before do
before :once do
course_with_teacher(:active_all => true)
@assignment = @course.assignments.create :name => 'some assignment'
@assignment.workflow_state = 'unpublished'
@ -282,7 +280,7 @@ describe AssignmentsApiController, type: :request do
end
describe "differentiated assignments" do
before do
before :once do
course_with_teacher(:active_all => true)
@assignment = @course.assignments.create :name => 'differentiated assignment'
end
@ -384,8 +382,8 @@ describe AssignmentsApiController, type: :request do
describe "draft state" do
before do
course_with_student_logged_in(:active_all => true)
before :once do
course_with_student(:active_all => true)
@course.account.enable_feature!(:draft_state)
@published = @course.assignments.create!({:name => "published assignment"})
@published.workflow_state = 'published'
@ -406,7 +404,6 @@ describe AssignmentsApiController, type: :request do
user
@enrollment = @course.enroll_user(@user, 'TeacherEnrollment')
@enrollment.course = @course # set the reverse association
user_session(@user, :active_all => true)
json = api_get_assignments_index_from_course(@course)
json.length.should == 2
@ -464,7 +461,7 @@ describe AssignmentsApiController, type: :request do
}
end
before do
before :once do
course_with_teacher(:active_all => true)
end
@ -715,6 +712,9 @@ describe AssignmentsApiController, type: :request do
end
describe "PUT /courses/:course_id/assignments/:id (#update)" do
before :once do
course_with_teacher(:active_all => true)
end
it "returns unauthorized for users who do not have permission" do
course_with_student(:active_all => true)
@ -739,7 +739,6 @@ describe AssignmentsApiController, type: :request do
end
it "should update published/unpublished" do
course_with_teacher(:active_all => true)
@course.account.enable_feature!(:draft_state)
@assignment = @course.assignments.create({
:name => "some assignment",
@ -781,7 +780,6 @@ describe AssignmentsApiController, type: :request do
end
it "should 400 with invalid date times" do
course_with_teacher(:active_all => true)
the_date = 1.day.ago
@assignment = @course.assignments.create({
:name => "some assignment",
@ -802,7 +800,6 @@ describe AssignmentsApiController, type: :request do
end
it "should allow clearing dates" do
course_with_teacher(:active_all => true)
the_date = 1.day.ago
@assignment = @course.assignments.create({
:name => "some assignment",
@ -878,8 +875,7 @@ describe AssignmentsApiController, type: :request do
end
context "without overrides or frozen attributes" do
before do
course_with_teacher(:active_all => true)
before :once do
@start_group = @course.assignment_groups.create!({:name => "start group"})
@group = @course.assignment_groups.create!({:name => "new group"})
@assignment = @course.assignments.create!(:title => "some assignment",
@ -897,7 +893,9 @@ describe AssignmentsApiController, type: :request do
@assignment.save!
@new_grading_standard = grading_standard_for(@course)
end
before :each do
@json = api_update_assignment_call(@course,@assignment,{
'name' => 'some assignment',
'points_possible' => '12',
@ -1003,7 +1001,6 @@ describe AssignmentsApiController, type: :request do
end
it "should process html content in description on update" do
course_with_teacher(:active_all => true)
@assignment = @course.assignments.create!
should_process_incoming_user_content(@course) do |content|
@ -1018,13 +1015,15 @@ describe AssignmentsApiController, type: :request do
context "with assignment overrides on the assignment" do
describe 'updating assignment overrides' do
before do
course_with_teacher(:active_all => true)
before :once do
student_in_course(:course => @course, :active_enrollment => true)
@assignment = @course.assignments.create!
@adhoc_due_at = 5.days.from_now
@section_due_at = 7.days.from_now
@user = @teacher
end
before :each do
api_update_assignment_call(@course,@assignment,{
'name' => 'Assignment With Overrides',
'assignment_overrides' => {
@ -1064,7 +1063,6 @@ describe AssignmentsApiController, type: :request do
describe "deleting all CourseSection overrides from assignment" do
it "works when :assignment_overrides key is nil" do
course_with_teacher(:active_all => true)
student_in_course(:course => @course, :active_all => true)
@assignment = @course.assignments.create!
Assignment.where(:id => @assignment).update_all(:created_at => Time.zone.now - 1.day)
@ -1084,9 +1082,8 @@ describe AssignmentsApiController, type: :request do
end
context "broadcasting while updating overrides" do
before do
before :once do
@notification = Notification.create! :name => "Assignment Changed"
course_with_teacher(:active_all => true)
student_in_course(:course => @course, :active_all => true)
@student.communication_channels.create(:path => "student@instructure.com").confirm!
@student.email_channel.notification_policies.
@ -1126,8 +1123,7 @@ describe AssignmentsApiController, type: :request do
end
context "when turnitin is enabled on the context" do
before do
course_with_teacher(:active_all => true)
before :once do
@assignment = @course.assignments.create!
acct = @course.account
acct.turnitin_account_id = 0
@ -1199,12 +1195,14 @@ describe AssignmentsApiController, type: :request do
end
context "when a non-admin tries to update a frozen assignment" do
before do
course_with_teacher(:active_all => true)
PluginSetting.stubs(:settings_for_plugin).returns({"title" => "yes"}).at_least_once
before :once do
@assignment = create_frozen_assignment_in_course(@course)
end
before :each do
PluginSetting.stubs(:settings_for_plugin).returns({"title" => "yes"}).at_least_once
end
it "doesn't allow the non-admin to update a frozen attribute" do
title_before_update = @assignment.title
raw_api_update_assignment(@course,@assignment,{
@ -1239,8 +1237,7 @@ describe AssignmentsApiController, type: :request do
end
context "differentiated assignments" do
before do
course_with_teacher(:active_all => true)
before :once do
@assignment = @course.assignments.create(:name => 'test', :only_visible_to_overrides => false)
@flag_before = @assignment.only_visible_to_overrides
end
@ -1262,9 +1259,8 @@ describe AssignmentsApiController, type: :request do
end
context "when an admin tried to update a grading_standard" do
before(:each) do
@user = account_admin_user
course_with_teacher(:active_all => true, :user => @user)
before(:once) do
account_admin_user(user: @user)
@assignment = @course.assignments.create({:name => "some assignment"})
@assignment.save!
@account_standard = @course.account.grading_standards.create!(:title => "account standard", :standard_data => {:a => {:name => 'A', :value => '95'}, :b => {:name => 'B', :value => '80'}, :f => {:name => 'F', :value => ''}})
@ -1415,7 +1411,7 @@ describe AssignmentsApiController, type: :request do
end
describe "DELETE /courses/:course_id/assignments/:id (#delete)" do
before do
before :once do
course_with_student(:active_all => true)
@assignment = @course.assignments.create!(
:title => "Test Assignment",
@ -1462,14 +1458,20 @@ describe AssignmentsApiController, type: :request do
describe "GET /courses/:course_id/assignments/:id (#show)" do
before :once do
course_with_student(:active_all => true)
end
describe 'with a normal assignment' do
before do
course_with_student(:active_all => true)
before :once do
@assignment = @course.assignments.create!(
:title => "Locked Assignment",
:description => "secret stuff"
)
end
before :each do
@assignment.any_instantiation.stubs(:overridden_for).
returns @assignment
@assignment.any_instantiation.stubs(:locked_for?).returns(
@ -1497,7 +1499,7 @@ describe AssignmentsApiController, type: :request do
end
it "returns the discussion topic url" do
course_with_teacher(:active_all => true)
@user = @teacher
@context = @course
@assignment = factory_with_protected_attributes(
@course.assignments,
@ -1548,7 +1550,6 @@ describe AssignmentsApiController, type: :request do
end
it "fulfills module progression requirements" do
course_with_student(:active_all => true)
@assignment = @course.assignments.create!(
:title => "Test Assignment",
:description => "public stuff"
@ -1576,8 +1577,6 @@ describe AssignmentsApiController, type: :request do
end
it "returns the dates for assignment as they apply to the user" do
course_with_student(:active_all => true)
@user = @student
@student.enrollments.map(&:destroy!)
@assignment = @course.assignments.create!(
:title => "Test Assignment",
@ -1595,8 +1594,6 @@ describe AssignmentsApiController, type: :request do
end
it "returns original assignment due dates" do
course_with_student(:active_all => true)
@user = @student
@student.enrollments.map(&:destroy!)
@assignment = @course.assignments.create!(
:title => "Test Assignment",
@ -1622,7 +1619,6 @@ describe AssignmentsApiController, type: :request do
end
it "does not fulfill requirements when description isn't returned" do
course_with_student(:active_all => true)
@assignment = @course.assignments.create!(
:title => "Locked Assignment",
:description => "locked!"
@ -1644,7 +1640,6 @@ describe AssignmentsApiController, type: :request do
end
it "includes submission info when requested with include flag" do
course_with_student_logged_in(:active_all => true)
assignment,submission = create_submitted_assignment_with_user(@user)
json = api_call(:get,
"/api/v1/courses/#{@course.id}/assignments/#{assignment.id}.json",
@ -1659,7 +1654,7 @@ describe AssignmentsApiController, type: :request do
context "AssignmentFreezer plugin disabled" do
before do
course_with_teacher(:active_all => true)
@user = @teacher
@assignment = create_frozen_assignment_in_course(@course)
PluginSetting.stubs(:settings_for_plugin).returns {}
@json = api_get_assignment_in_course(@assignment,@course)
@ -1675,10 +1670,13 @@ describe AssignmentsApiController, type: :request do
context "AssignmentFreezer plugin enabled" do
context "assignment frozen" do
before do
course_with_teacher(:active_all => true)
PluginSetting.stubs(:settings_for_plugin).returns({"title" => "yes"})
before :once do
@user = @teacher
@assignment = create_frozen_assignment_in_course(@course)
end
before :each do
PluginSetting.stubs(:settings_for_plugin).returns({"title" => "yes"})
@json = api_get_assignment_in_course(@assignment,@course)
end
@ -1702,13 +1700,16 @@ describe AssignmentsApiController, type: :request do
end
context "assignment not frozen" do
before do
course_with_teacher(:active_all => true)
PluginSetting.stubs(:settings_for_plugin).returns({"title" => "yes"}) #enable plugin
before :once do
@user = @teacher
@assignment = @course.assignments.create!({
:title => "Frozen",
:description => "frozen!"
})
end
before :each do
PluginSetting.stubs(:settings_for_plugin).returns({"title" => "yes"}) #enable plugin
@assignment.any_instantiation.expects(:overridden_for).returns @assignment
@assignment.any_instantiation.expects(:frozen?).at_least_once.returns false
@json = api_get_assignment_in_course(@assignment,@course)
@ -1729,7 +1730,7 @@ describe AssignmentsApiController, type: :request do
context "assignment with quiz" do
before do
course_with_teacher(:active_all => true)
@user = @teacher
@quiz = Quizzes::Quiz.create!(:title => 'Quiz Name', :context => @course)
@quiz.did_edit!
@quiz.offer!
@ -1748,16 +1749,18 @@ describe AssignmentsApiController, type: :request do
context "external tool assignment" do
before do
course_with_student(:active_all => true)
assignment = @course.assignments.create!
before :once do
@assignment = @course.assignments.create!
@tool_tag = ContentTag.new({:url => 'http://www.example.com', :new_tab=>false})
@tool_tag.context = assignment
@tool_tag.context = @assignment
@tool_tag.save!
assignment.submission_types = 'external_tool'
assignment.save!
assignment.external_tool_tag.should_not be_nil
@json = api_get_assignment_in_course(assignment, @course)
@assignment.submission_types = 'external_tool'
@assignment.save!
@assignment.external_tool_tag.should_not be_nil
end
before :each do
@json = api_get_assignment_in_course(@assignment, @course)
end
it 'has the external tool submission type' do
@ -1783,8 +1786,7 @@ describe AssignmentsApiController, type: :request do
context "draft state" do
before do
course_with_student_logged_in(:active_all => true)
before :once do
@course.account.enable_feature!(:draft_state)
@assignment = @course.assignments.create!({
:name => "unpublished assignment",
@ -1794,7 +1796,6 @@ describe AssignmentsApiController, type: :request do
@assignment.save!
end
it "returns an authorization error to students if an assignment is unpublished" do
raw_api_call(:get,
@ -1832,7 +1833,7 @@ describe AssignmentsApiController, type: :request do
context "differentiated assignments" do
before :once do
course_with_teacher_logged_in(:active_all => true)
@user = @teacher
@course.enable_feature!(:differentiated_assignments)
@assignment1 = @course.assignments.create! :only_visible_to_overrides => true
@assignment2 = @course.assignments.create! :only_visible_to_overrides => true
@ -1878,7 +1879,7 @@ describe AssignmentsApiController, type: :request do
describe "assignment_json" do
let(:result) { assignment_json(@assignment, @user, {}) }
before do
before :once do
course_with_teacher(:active_all => true)
@assignment = @course.assignments.create!(:title => "some assignment")
end
@ -1904,7 +1905,7 @@ describe AssignmentsApiController, type: :request do
end
context "update_from_params" do
before do
before :once do
course_with_teacher(:active_all => true)
@assignment = @course.assignments.create!(:title => "some assignment")
end

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe CalendarEventsApiController, type: :request do
before do
before :once do
course_with_teacher(:active_all => true, :user => user_with_pseudonym(:active_user => true))
@me = @user
end
@ -78,36 +78,30 @@ describe CalendarEventsApiController, type: :request do
end
context "timezones" do
it "shows today's events in user's timezone, even if UTC has crossed into tomorrow" do
akst = ActiveSupport::TimeZone.new('Alaska')
before :once do
@akst = ActiveSupport::TimeZone.new('Alaska')
e1 = @user.calendar_events.create!(:title => "yesterday in AKST", :start_at => akst.parse('2012-01-28 21:00:00')) { |c| c.context = @user }
e2 = @user.calendar_events.create!(:title => "today in AKST", :start_at => akst.parse('2012-01-29 21:00:00')) { |c| c.context = @user }
e3 = @user.calendar_events.create!(:title => "tomorrow in AKST", :start_at => akst.parse('2012-01-30 21:00:00')) { |c| c.context = @user }
@e1 = @user.calendar_events.create!(:title => "yesterday in AKST", :start_at => @akst.parse('2012-01-28 21:00:00')) { |c| c.context = @user }
@e2 = @user.calendar_events.create!(:title => "today in AKST", :start_at => @akst.parse('2012-01-29 21:00:00')) { |c| c.context = @user }
@e3 = @user.calendar_events.create!(:title => "tomorrow in AKST", :start_at => @akst.parse('2012-01-30 21:00:00')) { |c| c.context = @user }
@user.update_attributes! :time_zone => "Alaska"
end
Timecop.freeze(akst.parse('2012-01-29 22:00:00')) do
it "shows today's events in user's timezone, even if UTC has crossed into tomorrow" do
Timecop.freeze(@akst.parse('2012-01-29 22:00:00')) do
json = api_call(:get, "/api/v1/calendar_events", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json'
})
json.size.should eql 1
json.first.keys.sort.should eql expected_fields
json.first.slice('id', 'title').should eql({'id' => e2.id, 'title' => 'today in AKST'})
json.first.slice('id', 'title').should eql({'id' => @e2.id, 'title' => 'today in AKST'})
end
end
it "interprets user-specified date range in the user's time zone" do
akst = ActiveSupport::TimeZone.new('Alaska')
e1 = @user.calendar_events.create!(:title => "yesterday in AKST", :start_at => akst.parse('2012-01-28 21:00:00')) { |c| c.context = @user }
e2 = @user.calendar_events.create!(:title => "today in AKST", :start_at => akst.parse('2012-01-29 21:00:00')) { |c| c.context = @user }
e3 = @user.calendar_events.create!(:title => "tomorrow in AKST", :start_at => akst.parse('2012-01-30 21:00:00')) { |c| c.context = @user }
@user.update_attributes! :time_zone => "Alaska"
Timecop.freeze(akst.parse('2012-01-29 22:00:00')) do
Timecop.freeze(@akst.parse('2012-01-29 22:00:00')) do
json = api_call(:get, "/api/v1/calendar_events", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json'
})
@ -117,24 +111,24 @@ describe CalendarEventsApiController, type: :request do
:context_codes => ["user_#{@user.id}"], :start_date => '2012-01-28', :end_date => '2012-01-29'})
json.size.should eql 2
json[0].keys.sort.should eql expected_fields
json[0].slice('id', 'title').should eql({'id' => e1.id, 'title' => 'yesterday in AKST'})
json[1].slice('id', 'title').should eql({'id' => e2.id, 'title' => 'today in AKST'})
json[0].slice('id', 'title').should eql({'id' => @e1.id, 'title' => 'yesterday in AKST'})
json[1].slice('id', 'title').should eql({'id' => @e2.id, 'title' => 'today in AKST'})
end
end
end
it 'should paginate events' do
ids = 25.times.map { |i| @course.calendar_events.create(:title => "#{i}", :start_at => '2012-01-08 12:00:00').id }
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-08&end_date=2012-01-08&context_codes[]=course_#{@course.id}&per_page=10", {
ids = 5.times.map { |i| @course.calendar_events.create(:title => "#{i}", :start_at => '2012-01-08 12:00:00').id }
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-08&end_date=2012-01-08&context_codes[]=course_#{@course.id}&per_page=2", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => ["course_#{@course.id}"], :start_date => '2012-01-08', :end_date => '2012-01-08', :per_page => '10'})
json.size.should eql 10
:context_codes => ["course_#{@course.id}"], :start_date => '2012-01-08', :end_date => '2012-01-08', :per_page => '2'})
json.size.should eql 2
response.headers['Link'].should match(%r{<http://www.example.com/api/v1/calendar_events\?.*page=2.*>; rel="next",<http://www.example.com/api/v1/calendar_events\?.*page=1.*>; rel="first",<http://www.example.com/api/v1/calendar_events\?.*page=3.*>; rel="last"})
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-08&end_date=2012-01-08&context_codes[]=course_#{@course.id}&per_page=10&page=3", {
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-08&end_date=2012-01-08&context_codes[]=course_#{@course.id}&per_page=2&page=3", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => ["course_#{@course.id}"], :start_date => '2012-01-08', :end_date => '2012-01-08', :per_page => '10', :page => '3'})
json.size.should eql 5
:context_codes => ["course_#{@course.id}"], :start_date => '2012-01-08', :end_date => '2012-01-08', :per_page => '2', :page => '3'})
json.size.should eql 1
response.headers['Link'].should match(%r{<http://www.example.com/api/v1/calendar_events\?.*page=2.*>; rel="prev",<http://www.example.com/api/v1/calendar_events\?.*page=1.*>; rel="first",<http://www.example.com/api/v1/calendar_events\?.*page=3.*>; rel="last"})
end
@ -148,11 +142,9 @@ describe CalendarEventsApiController, type: :request do
it 'should return events from up to 10 contexts' do
contexts = [@course.asset_string]
contexts.concat 15.times.map { |i|
course_with_teacher(:active_all => true, :user => @me)
@course.calendar_events.create(:title => "#{i}", :start_at => '2012-01-08 12:00:00')
@course.asset_string
}
course_ids = create_courses(15, enroll_user: @me)
create_records(CalendarEvent, course_ids.map{ |id| {context_id: id, context_type: 'Course', context_code: "course_#{id}", title: "#{id}", start_at: '2012-01-08 12:00:00', workflow_state: 'active'}})
contexts.concat course_ids.map{ |id| "course_#{id}" }
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-08&end_date=2012-01-07&per_page=25&context_codes[]=" + contexts.join("&context_codes[]="), {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => contexts, :start_date => '2012-01-08', :end_date => '2012-01-07', :per_page => '25'})
@ -212,14 +204,14 @@ describe CalendarEventsApiController, type: :request do
end
it "should allow anonymous users to access public context" do
course(:active_all => true)
@user = nil
public_course_query() do |c|
c.is_public = true
end
end
it "should allow anonymous users to access a public syllabus" do
course(:active_all => true)
@user = nil
public_course_query() do |c|
c.public_syllabus = true
end
@ -236,7 +228,7 @@ describe CalendarEventsApiController, type: :request do
end
context 'all events' do
before do
before :once do
@course.calendar_events.create(:title => 'undated')
@course.calendar_events.create(:title => 'dated', :start_at => '2012-01-08 12:00:00')
end
@ -316,157 +308,150 @@ describe CalendarEventsApiController, type: :request do
end
end
it 'should return events from reservable appointment_groups, if specified as a context' do
course(:active_all => true)
@teacher = @course.admins.first
student_in_course :course => @course, :user => @me, :active_all => true
group1 = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
group1.publish!
event1 = group1.appointments.first
3.times { event1.reserve_for(student_in_course(:course => @course, :active_all => true).user, @teacher) }
cat = @course.group_categories.create(name: "foo")
group2 = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :sub_context_codes => [cat.asset_string], :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
group2.publish!
event2 = group2.appointments.first
g = cat.groups.create(:context => @course)
g.users << @me
event2.reserve_for(g, @teacher)
@user = @me
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{group1.asset_string}&context_codes[]=#{group2.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [group1.asset_string, group2.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 2
json.sort_by! { |e| e['id'] }
ejson = json.first
ejson.keys.sort.should eql((expected_slot_fields + ['reserved']).sort)
ejson['child_events'].should == [] # not reserved, so no child events can be seen
ejson['reserve_url'].should match %r{calendar_events/#{event1.id}/reservations/#{@me.id}}
ejson['reserved'].should be_false
ejson['available_slots'].should eql 1
ejson = json.last
ejson.keys.sort.should eql((expected_slot_fields + ['reserved']).sort)
ejson['reserve_url'].should match %r{calendar_events/#{event2.id}/reservations/#{g.id}}
ejson['reserved'].should be_true
ejson['available_slots'].should eql 3
end
it 'should not return child_events for other students, if the appointment group doesn\'t allows it' do
course(:active_all => true)
@teacher = @course.admins.first
student_in_course :course => @course, :user => @me, :active_all => true
group = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :participant_visibility => 'private', :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
group.publish!
event = group.appointments.first
event.reserve_for(@me, @teacher)
2.times { event.reserve_for(student_in_course(:course => @course, :active_all => true).user, @teacher) }
@user = @me
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{group.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [group.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 1
ejson = json.first
ejson.keys.should include 'child_events'
ejson['child_events_count'].should eql 3
ejson['child_events'].size.should eql 1
ejson['child_events'].first['own_reservation'].should be_true
end
it 'should return child_events for students, if the appointment group allows it' do
course(:active_all => true)
@teacher = @course.admins.first
student_in_course :course => @course, :user => @me, :active_all => true
group = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :participant_visibility => 'protected', :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
group.publish!
event = group.appointments.first
event.reserve_for(@me, @teacher)
2.times { event.reserve_for(student_in_course(:course => @course, :active_all => true).user, @teacher) }
@user = @me
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{group.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [group.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 1
ejson = json.first
ejson.keys.should include 'child_events'
ejson['child_events'].size.should eql ejson['child_events_count']
ejson['child_events'].size.should eql 3
ejson['child_events'].select { |e| e['url'] }.size.should eql 1
own_reservation = ejson['child_events'].select { |e| e['own_reservation'] }
own_reservation.size.should eql 1
own_reservation.first.keys.sort.should eql((expected_reservation_fields + ['own_reservation', 'user']).sort)
end
it 'should return own appointment_participant events in their effective contexts' do
course(:active_all => true)
@teacher = @course.admins.first
student_in_course :course => @course, :user => @me, :active_all => true
otherguy = student_in_course(:course => @course, :active_all => true).user
course1 = @course
course_with_teacher(:user => @teacher, :active_all => true)
course2, @course = @course, course1
ag1 = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [course2])
ag1.publish!
ag1.contexts = [course1, course2]
ag1.save!
event1 = ag1.appointments.first
my_personal_appointment = event1.reserve_for(@me, @me)
event1.reserve_for(otherguy, otherguy)
cat = @course.group_categories.create(name: "foo")
mygroup = cat.groups.create(:context => @course)
mygroup.users << @me
othergroup = cat.groups.create(:context => @course)
othergroup.users << otherguy
@me.reload
ag2 = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :sub_context_codes => [cat.asset_string], :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [course1])
ag2.publish!
event2 = ag2.appointments.first
my_group_appointment = event2.reserve_for(mygroup, @me)
event2.reserve_for(othergroup, otherguy)
@user = @me
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{@course.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [@course.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
# the group appointment won't show on the course calendar
json.size.should eql 1
json.first.keys.sort.should eql(expected_reservation_event_fields)
json.first['id'].should eql my_personal_appointment.id
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{mygroup.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [mygroup.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 1
json.first.keys.sort.should eql(expected_reservation_event_fields - ['effective_context_code'])
json.first['id'].should eql my_group_appointment.id
# if we go look at those appointment slots, they now show as reserved
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{ag1.asset_string}&context_codes[]=#{ag2.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [ag1.asset_string, ag2.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 2
json.sort_by! { |e| e['id'] }
json.each do |e|
e.keys.sort.should eql((expected_slot_fields + ['reserved']).sort)
e['reserved'].should be_true
e['child_events_count'].should eql 2
e['child_events'].size.should eql 1 # can't see otherguy's stuff
e['available_slots'].should eql 2
context "basic scenarios" do
before :once do
course(:active_all => true)
@teacher = @course.admins.first
student_in_course :course => @course, :user => @me, :active_all => true
end
json.first['child_events'].first.keys.sort.should eql((expected_reservation_fields + ['own_reservation', 'user']).sort)
json.last['child_events'].first.keys.sort.should eql((expected_reservation_fields + ['own_reservation', 'group'] - ['effective_context_code']).sort)
it 'should return events from reservable appointment_groups, if specified as a context' do
group1 = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
group1.publish!
event1 = group1.appointments.first
3.times { event1.reserve_for(student_in_course(:course => @course, :active_all => true).user, @teacher) }
cat = @course.group_categories.create(name: "foo")
group2 = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :sub_context_codes => [cat.asset_string], :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
group2.publish!
event2 = group2.appointments.first
g = cat.groups.create(:context => @course)
g.users << @me
event2.reserve_for(g, @teacher)
@user = @me
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{group1.asset_string}&context_codes[]=#{group2.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [group1.asset_string, group2.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 2
json.sort_by! { |e| e['id'] }
ejson = json.first
ejson.keys.sort.should eql((expected_slot_fields + ['reserved']).sort)
ejson['child_events'].should == [] # not reserved, so no child events can be seen
ejson['reserve_url'].should match %r{calendar_events/#{event1.id}/reservations/#{@me.id}}
ejson['reserved'].should be_false
ejson['available_slots'].should eql 1
ejson = json.last
ejson.keys.sort.should eql((expected_slot_fields + ['reserved']).sort)
ejson['reserve_url'].should match %r{calendar_events/#{event2.id}/reservations/#{g.id}}
ejson['reserved'].should be_true
ejson['available_slots'].should eql 3
end
it 'should not return child_events for other students, if the appointment group doesn\'t allows it' do
group = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :participant_visibility => 'private', :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
group.publish!
event = group.appointments.first
event.reserve_for(@me, @teacher)
2.times { event.reserve_for(student_in_course(:course => @course, :active_all => true).user, @teacher) }
@user = @me
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{group.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [group.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 1
ejson = json.first
ejson.keys.should include 'child_events'
ejson['child_events_count'].should eql 3
ejson['child_events'].size.should eql 1
ejson['child_events'].first['own_reservation'].should be_true
end
it 'should return child_events for students, if the appointment group allows it' do
group = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :participant_visibility => 'protected', :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [@course])
group.publish!
event = group.appointments.first
event.reserve_for(@me, @teacher)
2.times { event.reserve_for(student_in_course(:course => @course, :active_all => true).user, @teacher) }
@user = @me
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{group.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [group.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 1
ejson = json.first
ejson.keys.should include 'child_events'
ejson['child_events'].size.should eql ejson['child_events_count']
ejson['child_events'].size.should eql 3
ejson['child_events'].select { |e| e['url'] }.size.should eql 1
own_reservation = ejson['child_events'].select { |e| e['own_reservation'] }
own_reservation.size.should eql 1
own_reservation.first.keys.sort.should eql((expected_reservation_fields + ['own_reservation', 'user']).sort)
end
it 'should return own appointment_participant events in their effective contexts' do
otherguy = student_in_course(:course => @course, :active_all => true).user
course1 = @course
course_with_teacher(:user => @teacher, :active_all => true)
course2, @course = @course, course1
ag1 = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [course2])
ag1.publish!
ag1.contexts = [course1, course2]
ag1.save!
event1 = ag1.appointments.first
my_personal_appointment = event1.reserve_for(@me, @me)
event1.reserve_for(otherguy, otherguy)
cat = @course.group_categories.create(name: "foo")
mygroup = cat.groups.create(:context => @course)
mygroup.users << @me
othergroup = cat.groups.create(:context => @course)
othergroup.users << otherguy
@me.reload
ag2 = AppointmentGroup.create!(:title => "something", :participants_per_appointment => 4, :sub_context_codes => [cat.asset_string], :new_appointments => [["2012-01-01 12:00:00", "2012-01-01 13:00:00"]], :contexts => [course1])
ag2.publish!
event2 = ag2.appointments.first
my_group_appointment = event2.reserve_for(mygroup, @me)
event2.reserve_for(othergroup, otherguy)
@user = @me
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{@course.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [@course.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
# the group appointment won't show on the course calendar
json.size.should eql 1
json.first.keys.sort.should eql(expected_reservation_event_fields)
json.first['id'].should eql my_personal_appointment.id
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{mygroup.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [mygroup.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 1
json.first.keys.sort.should eql(expected_reservation_event_fields - ['effective_context_code'])
json.first['id'].should eql my_group_appointment.id
# if we go look at those appointment slots, they now show as reserved
json = api_call(:get, "/api/v1/calendar_events?start_date=2012-01-01&end_date=2012-01-31&context_codes[]=#{ag1.asset_string}&context_codes[]=#{ag2.asset_string}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json',
:context_codes => [ag1.asset_string, ag2.asset_string], :start_date => '2012-01-01', :end_date => '2012-01-31'})
json.size.should eql 2
json.sort_by! { |e| e['id'] }
json.each do |e|
e.keys.sort.should eql((expected_slot_fields + ['reserved']).sort)
e['reserved'].should be_true
e['child_events_count'].should eql 2
e['child_events'].size.should eql 1 # can't see otherguy's stuff
e['available_slots'].should eql 2
end
json.first['child_events'].first.keys.sort.should eql((expected_reservation_fields + ['own_reservation', 'user']).sort)
json.last['child_events'].first.keys.sort.should eql((expected_reservation_fields + ['own_reservation', 'group'] - ['effective_context_code']).sort)
end
end
context "reservations" do
@ -502,113 +487,113 @@ describe CalendarEventsApiController, type: :request do
@user = @me
end
it "should reserve the appointment for @current_user" do
prepare(true)
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields)
json['appointment_group_id'].should eql(@ag1.id)
context "as a student" do
before(:once) { prepare(true) }
json = api_call(:post, "/api/v1/calendar_events/#{@event3.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event3.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields - ['effective_context_code']) # group one is on the group, no effective context
json['appointment_group_id'].should eql(@ag2.id)
it "should reserve the appointment for @current_user" do
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields)
json['appointment_group_id'].should eql(@ag1.id)
json = api_call(:post, "/api/v1/calendar_events/#{@event3.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event3.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields - ['effective_context_code']) # group one is on the group, no effective context
json['appointment_group_id'].should eql(@ag2.id)
end
it "should not allow students to reserve non-appointment calendar_events" do
e = @course.calendar_events.create
raw_api_call(:post, "/api/v1/calendar_events/#{e.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => e.id.to_s})
JSON.parse(response.body)['status'].should == 'unauthorized'
end
it "should not allow students to reserve an appointment twice" do
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s})
response.should be_success
raw_api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s})
errors = JSON.parse(response.body)
errors.size.should eql 1
error = errors.first
error.slice("attribute", "type", "message").should eql({"attribute" => "reservation", "type" => "calendar_event", "message" => "participant has already reserved this appointment"})
error['reservations'].size.should eql 1
end
it "should cancel existing reservations if cancel_existing = true" do
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields)
json['appointment_group_id'].should eql(@ag1.id)
@ag1.reservations_for(@me).map(&:parent_calendar_event_id).should eql [@event1.id]
json = api_call(:post, "/api/v1/calendar_events/#{@event2.id}/reservations?cancel_existing=1", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event2.id.to_s, :cancel_existing => '1'})
json.keys.sort.should eql(expected_reservation_event_fields)
json['appointment_group_id'].should eql(@ag1.id)
@ag1.reservations_for(@me).map(&:parent_calendar_event_id).should eql [@event2.id]
end
it "should not allow students to specify the participant" do
raw_api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations/#{@other_guy.id}", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s, :participant_id => @other_guy.id.to_s})
errors = JSON.parse(response.body)
errors.size.should eql 1
error = errors.first
error.slice("attribute", "type", "message").should eql({"attribute" => "reservation", "type" => "calendar_event", "message" => "invalid participant"})
error['reservations'].size.should eql 0
end
it "should notify the teacher when appointment is canceled" do
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api',
:action => 'reserve',
:format => 'json',
:id => @event1.id.to_s})
reservation = CalendarEvent.find(json["id"])
raw_api_call(:delete, "/api/v1/calendar_events/#{reservation.id}", {
:controller => 'calendar_events_api',
:action => 'destroy',
:format => 'json',
:id => reservation.id.to_s
},
:cancel_reason => "Too busy")
message = Message.last
message.notification_name.should == 'Appointment Canceled By User'
message.to.should == "test_channel_email_#{@teacher.id}"
message.body.should =~ /Too busy/
end
end
it "should not allow students to reserve non-appointment calendar_events" do
prepare(true)
e = @course.calendar_events.create
raw_api_call(:post, "/api/v1/calendar_events/#{e.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => e.id.to_s})
JSON.parse(response.body)['status'].should == 'unauthorized'
end
context "as an admin" do
before(:once) { prepare }
it "should not allow students to reserve an appointment twice" do
prepare(true)
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s})
response.should be_success
raw_api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s})
errors = JSON.parse(response.body)
errors.size.should eql 1
error = errors.first
error.slice("attribute", "type", "message").should eql({"attribute" => "reservation", "type" => "calendar_event", "message" => "participant has already reserved this appointment"})
error['reservations'].size.should eql 1
end
it "should allow admins to specify the participant" do
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations/#{@other_guy.id}", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s, :participant_id => @other_guy.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields)
json['appointment_group_id'].should eql(@ag1.id)
it "should cancel existing reservations if cancel_existing = true" do
prepare(true)
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields)
json['appointment_group_id'].should eql(@ag1.id)
@ag1.reservations_for(@me).map(&:parent_calendar_event_id).should eql [@event1.id]
json = api_call(:post, "/api/v1/calendar_events/#{@event3.id}/reservations/#{@group.id}", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event3.id.to_s, :participant_id => @group.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields - ['effective_context_code'])
json['appointment_group_id'].should eql(@ag2.id)
end
json = api_call(:post, "/api/v1/calendar_events/#{@event2.id}/reservations?cancel_existing=1", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event2.id.to_s, :cancel_existing => '1'})
json.keys.sort.should eql(expected_reservation_event_fields)
json['appointment_group_id'].should eql(@ag1.id)
@ag1.reservations_for(@me).map(&:parent_calendar_event_id).should eql [@event2.id]
end
it "should not allow students to specify the participant" do
prepare(true)
raw_api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations/#{@other_guy.id}", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s, :participant_id => @other_guy.id.to_s})
errors = JSON.parse(response.body)
errors.size.should eql 1
error = errors.first
error.slice("attribute", "type", "message").should eql({"attribute" => "reservation", "type" => "calendar_event", "message" => "invalid participant"})
error['reservations'].size.should eql 0
end
it "should allow admins to specify the participant" do
prepare
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations/#{@other_guy.id}", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s, :participant_id => @other_guy.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields)
json['appointment_group_id'].should eql(@ag1.id)
json = api_call(:post, "/api/v1/calendar_events/#{@event3.id}/reservations/#{@group.id}", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event3.id.to_s, :participant_id => @group.id.to_s})
json.keys.sort.should eql(expected_reservation_event_fields - ['effective_context_code'])
json['appointment_group_id'].should eql(@ag2.id)
end
it "should reject invalid participants" do
prepare
raw_api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations/#{@me.id}", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s, :participant_id => @me.id.to_s})
errors = JSON.parse(response.body)
errors.size.should eql 1
error = errors.first
error.slice("attribute", "type", "message").should eql({"attribute" => "reservation", "type" => "calendar_event", "message" => "invalid participant"})
error['reservations'].size.should eql 0
end
it "should notify the teacher when appointment is canceled" do
prepare(true)
json = api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations", {
:controller => 'calendar_events_api',
:action => 'reserve',
:format => 'json',
:id => @event1.id.to_s})
reservation = CalendarEvent.find(json["id"])
raw_api_call(:delete, "/api/v1/calendar_events/#{reservation.id}", {
:controller => 'calendar_events_api',
:action => 'destroy',
:format => 'json',
:id => reservation.id.to_s
},
:cancel_reason => "Too busy")
message = Message.last
message.notification_name.should == 'Appointment Canceled By User'
message.to.should == "test_channel_email_#{@teacher.id}"
message.body.should =~ /Too busy/
it "should reject invalid participants" do
raw_api_call(:post, "/api/v1/calendar_events/#{@event1.id}/reservations/#{@me.id}", {
:controller => 'calendar_events_api', :action => 'reserve', :format => 'json', :id => @event1.id.to_s, :participant_id => @me.id.to_s})
errors = JSON.parse(response.body)
errors.size.should eql 1
error = errors.first
error.slice("attribute", "type", "message").should eql({"attribute" => "reservation", "type" => "calendar_event", "message" => "invalid participant"})
error['reservations'].size.should eql 0
end
end
end
end
@ -714,6 +699,13 @@ describe CalendarEventsApiController, type: :request do
end
context "child_events" do
let_once :event do
event = @course.calendar_events.build(:title => 'event', :child_event_data => {"0" => {:start_at => "2012-01-01 12:00:00", :end_at => "2012-01-01 13:00:00", :context_code => @course.default_section.asset_string}})
event.updating_user = @user
event.save!
event
end
it "should create an event with child events" do
json = api_call(:post, "/api/v1/calendar_events",
{:controller => 'calendar_events_api', :action => 'create', :format => 'json'},
@ -728,10 +720,6 @@ describe CalendarEventsApiController, type: :request do
end
it "should update an event with child events" do
event = @course.calendar_events.build(:title => 'event', :child_event_data => {"0" => {:start_at => "2012-01-01 12:00:00", :end_at => "2012-01-01 13:00:00", :context_code => @course.default_section.asset_string}})
event.updating_user = @user
event.save!
json = api_call(:put, "/api/v1/calendar_events/#{event.id}",
{:controller => 'calendar_events_api', :action => 'update', :id => event.id.to_s, :format => 'json'},
{:calendar_event => {:title => "ohai", :child_event_data => {"0" => {:start_at => "2012-01-01 13:00:00", :end_at => "2012-01-01 14:00:00", :context_code => @course.default_section.asset_string}}}})
@ -744,10 +732,6 @@ describe CalendarEventsApiController, type: :request do
end
it "should remove all child events" do
event = @course.calendar_events.build(:title => 'event', :child_event_data => {"0" => {:start_at => "2012-01-01 12:00:00", :end_at => "2012-01-01 13:00:00", :context_code => @course.default_section.asset_string}})
event.updating_user = @user
event.save!
json = api_call(:put, "/api/v1/calendar_events/#{event.id}",
{:controller => 'calendar_events_api', :action => 'update', :id => event.id.to_s, :format => 'json'},
{:calendar_event => {:title => "ohai", :remove_child_events => '1'}})
@ -760,15 +744,11 @@ describe CalendarEventsApiController, type: :request do
end
it "should add the section name to a child event's title" do
event = @course.calendar_events.build(:title => 'ohai', :child_event_data => {"0" => {:start_at => "2012-01-01 12:00:00", :end_at => "2012-01-01 13:00:00", :context_code => @course.default_section.asset_string}})
event.updating_user = @user
event.save!
child_event_id = event.child_event_ids.first
json = api_call(:get, "/api/v1/calendar_events/#{child_event_id}",
{:controller => 'calendar_events_api', :action => 'show', :id => child_event_id.to_s, :format => 'json'})
json.keys.sort.should eql((expected_fields + ['effective_context_code']).sort)
json['title'].should eql "ohai (#{@course.default_section.name})"
json['title'].should eql "event (#{@course.default_section.name})"
json['hidden'].should be_false
end
end
@ -808,7 +788,7 @@ describe CalendarEventsApiController, type: :request do
end
it 'should paginate assignments' do
ids = 25.times.map { |i| @course.assignments.create(:title => "#{i}", :due_at => '2012-01-08 12:00:00').id }
ids = create_assignments(@course.id, 25, due_at: '2012-01-08 12:00:00')
json = api_call(:get, "/api/v1/calendar_events?type=assignment&start_date=2012-01-08&end_date=2012-01-08&context_codes[]=course_#{@course.id}&per_page=10", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json', :type => 'assignment',
:context_codes => ["course_#{@course.id}"], :start_date => '2012-01-08', :end_date => '2012-01-08', :per_page => '10'})
@ -842,11 +822,9 @@ describe CalendarEventsApiController, type: :request do
it 'should return assignments from up to 10 contexts' do
contexts = [@course.asset_string]
contexts.concat 15.times.map { |i|
course_with_teacher(:active_all => true, :user => @me)
@course.assignments.create(:title => "#{i}", :due_at => '2012-01-08 12:00:00')
@course.asset_string
}
course_ids = create_courses(15, enroll_user: @me)
create_assignments(course_ids, 1, due_at: '2012-01-08 12:00:00')
contexts.concat course_ids.map{ |id| "course_#{id}" }
json = api_call(:get, "/api/v1/calendar_events?type=assignment&start_date=2012-01-08&end_date=2012-01-07&per_page=25&context_codes[]=" + contexts.join("&context_codes[]="), {
:controller => 'calendar_events_api', :action => 'index', :format => 'json', :type => 'assignment',
:context_codes => contexts, :start_date => '2012-01-08', :end_date => '2012-01-07', :per_page => '25'})
@ -864,7 +842,7 @@ describe CalendarEventsApiController, type: :request do
end
context 'unpublished assignments' do
before do
before :once do
@course1 = @course
course_with_teacher(:active_course => true, :active_enrollment => true, :user => @teacher)
@course2 = @course
@ -942,7 +920,7 @@ describe CalendarEventsApiController, type: :request do
end
context 'all assignments' do
before do
before :once do
@course.assignments.create(:title => 'undated')
@course.assignments.create(:title => 'dated', :due_at => '2012-01-08 12:00:00')
end
@ -1005,20 +983,19 @@ describe CalendarEventsApiController, type: :request do
end
context 'date overrides' do
before :each do
before :once do
@default_assignment = @course.assignments.create(:title => 'overridden', :due_at => '2012-01-12 12:00:00') # out of range
@default_assignment.workflow_state = 'published'
@default_assignment.save!
end
context 'as student' do
before :each do
before :once do
@student = user :active_all => true, :active_state => 'active'
user_session(@student)
end
context 'when no sections' do
before :each do
before :once do
@course.enroll_student(@student, :enrollment_state => 'active')
end
@ -1123,7 +1100,7 @@ describe CalendarEventsApiController, type: :request do
end
context 'with sections' do
before :each do
before :once do
@section1 = @course.course_sections.create!(:name => 'Section A')
@section2 = @course.course_sections.create!(:name => 'Section B')
@course.enroll_user(@student, 'StudentEnrollment', :section => @section2, :enrollment_state => 'active')
@ -1206,7 +1183,7 @@ describe CalendarEventsApiController, type: :request do
end
context 'with sections' do
before :each do
before :once do
@section1 = @course.course_sections.create!(:name => 'Section A')
@section2 = @course.course_sections.create!(:name => 'Section B')
student_in_section(@section1)
@ -1254,15 +1231,15 @@ describe CalendarEventsApiController, type: :request do
end
context 'as TA' do
before :each do
before :once do
@ta = user :active_all => true, :active_state => 'active'
user_session(@ta)
end
context 'when no sections' do
before :each do
before :once do
@course.enroll_user(@ta, 'TaEnrollment', :enrollment_state => 'active')
end
it 'should return a non-overridden assignment' do
json = api_call(:get, "/api/v1/calendar_events?type=assignment&start_date=2012-01-07&end_date=2012-01-16&per_page=25&context_codes[]=course_#{@course.id}", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json', :type => 'assignment',
@ -1288,7 +1265,7 @@ describe CalendarEventsApiController, type: :request do
end
context 'when TA of one section' do
before :each do
before :once do
@section1 = @course.course_sections.create!(:name => 'Section A')
@section2 = @course.course_sections.create!(:name => 'Section B')
@course.enroll_user(@ta, 'TaEnrollment', :enrollment_state => 'active', :section => @section1) # only in 1 section
@ -1320,15 +1297,13 @@ describe CalendarEventsApiController, type: :request do
end
context 'as observer' do
before :each do
before :once do
@student = user(:active_all => true, :active_state => 'active')
@observer = user(:active_all => true, :active_state => 'active')
user_session(@observer)
end
context 'when not observing any students' do
before(:each) do
before :once do
@course.enroll_user(@observer,
'ObserverEnrollment',
:enrollment_state => 'active',
@ -1360,7 +1335,7 @@ describe CalendarEventsApiController, type: :request do
end
context 'observing single student' do
before :each do
before :once do
@student_enrollment = @course.enroll_user(@student, 'StudentEnrollment', :enrollment_state => 'active', :section => @course.default_section)
@observer_enrollment = @course.enroll_user(@observer, 'ObserverEnrollment', :enrollment_state => 'active', :section => @course.default_section)
@observer_enrollment.update_attribute(:associated_user_id, @student.id)
@ -1387,18 +1362,15 @@ describe CalendarEventsApiController, type: :request do
end
context 'with sections' do
before :each do
before :once do
@section1 = @course.course_sections.create!(:name => 'Section A')
@section2 = @course.course_sections.create!(:name => 'Section B')
@student_enrollment = @course.enroll_user(@student, 'StudentEnrollment', :enrollment_state => 'active', :section => @section1)
@observer_enrollment = @course.enroll_user(@observer, 'ObserverEnrollment', :enrollment_state => 'active', :section => @section1)
@observer_enrollment.update_attribute(:associated_user_id, @student.id)
end
context 'observing single student' do
before :each do
@observer_enrollment.update_attribute(:associated_user_id, @student.id)
end
it 'should return linked student specific override' do
assignment_override_model(:assignment => @default_assignment, :set => @section1,
:due_at => DateTime.parse('2012-01-13 12:00:00'))
@ -1424,7 +1396,7 @@ describe CalendarEventsApiController, type: :request do
end
context 'observing multiple students' do
before :each do
before :once do
@student2 = user(:active_all => true, :active_state => 'active')
end
@ -1436,7 +1408,6 @@ describe CalendarEventsApiController, type: :request do
course_section: @section1,
workflow_state: 'active')
@observer_enrollment.update_attribute(:associated_user_id, @student.id)
@observer_enrollment2.associated_user_id = @student2.id
@observer_enrollment2.save!
end
@ -1461,7 +1432,6 @@ describe CalendarEventsApiController, type: :request do
:course_section => @section2,
:workflow_state => 'active')
@observer_enrollment.update_attribute(:associated_user_id, @student.id)
@observer_enrollment2.update_attribute(:associated_user_id, @student2.id)
end
@ -1520,17 +1490,15 @@ describe CalendarEventsApiController, type: :request do
# Admins who are not enrolled in the course
context 'as admin' do
before :each do
before :once do
@admin = account_admin_user
@section1 = @course.default_section
@section2 = @course.course_sections.create!(:name => 'Section B')
student_in_section(@section2)
user_session @admin
@user = @admin
end
context 'when viewing own calendar' do
it 'should return 0 course assignments' do
json = api_call(:get, "/api/v1/calendar_events?type=assignment&start_date=2012-01-07&end_date=2012-01-16&per_page=25", {
:controller => 'calendar_events_api', :action => 'index', :format => 'json', :type => 'assignment',
@ -1562,7 +1530,7 @@ describe CalendarEventsApiController, type: :request do
end
context "calendar feed" do
before :each do
before :once do
now = Time.now
@student = user(:active_all => true, :active_state => 'active')
@course.enroll_student(@student, :enrollment_state => 'active')

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe CollaborationsController, type: :request do
before do
before :once do
PluginSetting.new(:name => 'etherpad', :settings => {}).save!
course_with_teacher(:active_all => true)
@members = (1..5).map do

View File

@ -21,7 +21,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
include Api::V1::Collaborator
describe Api::V1::Collaborator do
before(:each) do
before(:once) do
@current_user = user_with_pseudonym(:active_all => true)
@collaboration = Collaboration.new(:title => 'Test collaboration')
@collaboration.type = 'EtherPad'

View File

@ -22,10 +22,9 @@ describe CommMessagesApiController, type: :request do
describe "index" do
context "a site admin" do
context "with permission" do
before do
before :once do
@test_user = user(:active_all => true)
site_admin_user
user_session(@admin)
end
it "should be able to see all messages" do
@ -95,7 +94,6 @@ describe CommMessagesApiController, type: :request do
@test_user = user(:active_all => true)
account_admin_user_with_role_changes(:account => Account.site_admin,
:role_changes => {:read_messages => false})
user_session(@admin)
end
it "should receive unauthorized" do
@ -109,11 +107,10 @@ describe CommMessagesApiController, type: :request do
context "an account admin" do
context "with permission" do
before do
before :once do
@test_user = user(:active_all => true)
account_admin_user_with_role_changes(:account => Account.default,
:role_changes => {:view_notifications => true})
user_session(@admin)
end
it "should receive unauthorized if account setting disabled" do
@ -143,7 +140,6 @@ describe CommMessagesApiController, type: :request do
@test_user = user(:active_all => true)
account_admin_user_with_role_changes(:account => Account.default,
:role_changes => {:view_notifications => false})
user_session(@admin)
end
it "should receive unauthorized" do
@ -159,7 +155,6 @@ describe CommMessagesApiController, type: :request do
before do
@test_user = user(:active_all => true)
@user = user(:active_all => true)
user_session(@user)
end
it "should receive unauthorized" do

View File

@ -20,7 +20,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe 'CommunicationChannels API', type: :request do
describe 'index' do
before do
before :once do
@someone = user_with_pseudonym
@admin = user_with_pseudonym
@ -65,7 +65,7 @@ describe 'CommunicationChannels API', type: :request do
end
describe 'create' do
before do
before :once do
@someone = user_with_pseudonym
@admin = user_with_pseudonym
@site_admin = user_with_pseudonym
@ -191,17 +191,15 @@ describe 'CommunicationChannels API', type: :request do
end
describe 'destroy' do
# let! so that these are evaluated before the before(:each) { @user = ... }
# blocks. otherwise they stomp on @user and make api calls as the wrong user
let! (:someone) { user_with_pseudonym }
let! (:admin) do
let_once(:someone) { user_with_pseudonym }
let_once(:admin) do
user = user_with_pseudonym
Account.default.account_users.create!(user: user)
user
end
let (:channel) { someone.communication_channel }
let (:path) {"/api/v1/users/#{someone.id}/communication_channels/#{channel.id}"}
let (:path_options) do
let_once(:channel) { someone.communication_channel }
let(:path) {"/api/v1/users/#{someone.id}/communication_channels/#{channel.id}"}
let(:path_options) do
{ :controller => 'communication_channels',
:action => 'destroy', :user_id => someone.to_param, :format => 'json',
:id => channel.to_param }

View File

@ -23,17 +23,19 @@ include Api::V1::Json
include Api
describe "Conferences API", type: :request do
before do
before :once do
# these specs need an enabled web conference plugin
@plugin = PluginSetting.find_or_create_by_name('wimba')
@plugin.update_attribute(:settings, { :domain => 'wimba.test' })
@category_path_options = { :controller => "conferences", :format => "json" }
course_with_teacher(:active_all => true)
student_in_course(:active_all => true)
@user = @teacher
end
describe "GET list of conferences" do
it "should require authorization" do
course_with_teacher(:active_all => true)
@user = nil
raw_api_call(:get, "/api/v1/courses/#{@course.to_param}/conferences", @category_path_options.
merge(action: 'index', course_id: @course.to_param))
@ -41,7 +43,6 @@ describe "Conferences API", type: :request do
end
it "should list all the conferences" do
course_with_teacher(:active_all => true)
@conferences = (1..2).map { |i| @course.web_conferences.create!(:conference_type => 'Wimba',
:duration => 60,
:user => @teacher,
@ -53,7 +54,6 @@ describe "Conferences API", type: :request do
end
it "should not list conferences for disabled plugins" do
course_with_teacher(:active_all => true)
plugin = PluginSetting.find_or_create_by_name('adobe_connect')
plugin.update_attribute(:settings, { :domain => 'adobe_connect.test' })
@conferences = ['AdobeConnect', 'Wimba'].map {|ct| @course.web_conferences.create!(:conference_type => ct,
@ -68,7 +68,7 @@ describe "Conferences API", type: :request do
end
it "should only list conferences the user is a participant of" do
course_with_student(:active_all => true)
@user = @student
@conferences = (1..2).map { |i| @course.web_conferences.create!(:conference_type => 'Wimba',
:duration => 60,
:user => @teacher,
@ -81,7 +81,7 @@ describe "Conferences API", type: :request do
end
it 'should get a conferences for a group' do
course_with_student(:active_all => true)
@user = @student
@group = @course.groups.create!(:name => "My Group")
@group.add_user(@student, 'accepted', true)
@conferences = (1..2).map { |i| @group.web_conferences.create!(:conference_type => 'Wimba',
@ -94,4 +94,4 @@ describe "Conferences API", type: :request do
end
end
end
end

View File

@ -19,11 +19,11 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe ContentExportsApiController, type: :request do
let(:t_teacher) do
let_once(:t_teacher) do
user(active_all: true)
end
let(:t_course) do
let_once(:t_course) do
course_with_teacher(user: t_teacher, active_all: true)
@course.wiki.wiki_pages.create! title: "something to export"
@course
@ -198,118 +198,113 @@ describe ContentExportsApiController, type: :request do
end
end
it "should create a selective course export with old migration id format" do
att_to_copy = Attachment.create!(:context => t_course, :filename => 'hi.txt',
:uploaded_data => StringIO.new("stuff"), :folder => Folder.unfiled_folder(t_course))
att_to_not_copy = Attachment.create!(:context => t_course, :filename => 'derp.txt',
:uploaded_data => StringIO.new("more stuff"), :folder => Folder.unfiled_folder(t_course))
context "selective exports" do
let_once :att_to_copy do
Attachment.create!(:context => t_course, :filename => 'hi.txt',
:uploaded_data => StringIO.new("stuff"), :folder => Folder.unfiled_folder(t_course))
end
let_once :att_to_not_copy do
Attachment.create!(:context => t_course, :filename => 'derp.txt',
:uploaded_data => StringIO.new("more stuff"), :folder => Folder.unfiled_folder(t_course))
end
let_once :page_to_copy do
page_to_copy = t_course.wiki.wiki_pages.create!(:title => "other page")
page_to_copy.body = "<p><a href=\"/courses/#{t_course.id}/files/#{att_to_copy.id}/preview\">hey look a link</a></p>"
page_to_copy.save!
page_to_copy
end
let_once(:page_to_not_copy){ t_course.wiki.wiki_pages.create!(:title => "another page") }
let_once(:mod) do
# both the wiki page and the referenced attachment should be exported implicitly through the module
mod = t_course.context_modules.create!(:name => "who cares")
mod.add_item(:id => page_to_copy.id, :type => "wiki_page")
mod
end
page_to_copy = t_course.wiki.wiki_pages.create!(:title => "other page")
page_to_copy.body = "<p><a href=\"/courses/#{t_course.id}/files/#{att_to_copy.id}/preview\">hey look a link</a></p>"
page_to_copy.save!
page_to_not_copy = t_course.wiki.wiki_pages.create!(:title => "another page")
it "should create a selective course export with old migration id format" do
json = api_call_as_user(t_teacher, :post, "/api/v1/courses/#{t_course.id}/content_exports?export_type=common_cartridge",
{ controller: 'content_exports_api', action: 'create', format: 'json', course_id: t_course.to_param, export_type: 'common_cartridge'},
{ :select => {:context_modules => {mod.asset_string => "1"}}})
export = t_course.content_exports.find_by_id(json['id'])
export.should_not be_nil
export.workflow_state.should eql 'created'
export.export_type.should eql 'common_cartridge'
export.user_id.should eql t_teacher.id
export.settings['selected_content']['context_modules'].should == {CC::CCHelper.create_key(mod) => "1"}
export.job_progress.should be_queued
# both the wiki page and the referenced attachment should be exported implicitly through the module
mod = t_course.context_modules.create!(:name => "who cares")
mod.add_item(:id => page_to_copy.id, :type => "wiki_page")
run_jobs
json = api_call_as_user(t_teacher, :post, "/api/v1/courses/#{t_course.id}/content_exports?export_type=common_cartridge",
{ controller: 'content_exports_api', action: 'create', format: 'json', course_id: t_course.to_param, export_type: 'common_cartridge'},
{ :select => {:context_modules => {mod.asset_string => "1"}}})
export = t_course.content_exports.find_by_id(json['id'])
export.should_not be_nil
export.workflow_state.should eql 'created'
export.export_type.should eql 'common_cartridge'
export.user_id.should eql t_teacher.id
export.settings['selected_content']['context_modules'].should == {CC::CCHelper.create_key(mod) => "1"}
export.job_progress.should be_queued
export.reload
export.workflow_state.should eql 'exported'
export.job_progress.should be_completed
export.attachment.should_not be_nil
run_jobs
course
cm = @course.content_migrations.new
cm.attachment = export.attachment
cm.migration_type = "canvas_cartridge_importer"
cm.migration_settings[:import_immediately] = true
cm.save!
cm.queue_migration
export.reload
export.workflow_state.should eql 'exported'
export.job_progress.should be_completed
export.attachment.should_not be_nil
run_jobs
course
cm = @course.content_migrations.new
cm.attachment = export.attachment
cm.migration_type = "canvas_cartridge_importer"
cm.migration_settings[:import_immediately] = true
cm.save!
cm.queue_migration
@course.context_modules.find_by_migration_id(CC::CCHelper.create_key(mod)).should_not be_nil
copied_page = @course.wiki.wiki_pages.find_by_migration_id(CC::CCHelper.create_key(page_to_copy))
copied_page.should_not be_nil
@course.wiki.wiki_pages.find_by_migration_id(CC::CCHelper.create_key(page_to_not_copy)).should be_nil
run_jobs
copied_att = @course.attachments.find_by_filename(att_to_copy.filename)
copied_att.should_not be_nil
copied_page.body.should == "<p><a href=\"/courses/#{@course.id}/files/#{copied_att.id}/preview\">hey look a link</a></p>"
@course.attachments.find_by_filename(att_to_not_copy.filename).should be_nil
end
@course.context_modules.find_by_migration_id(CC::CCHelper.create_key(mod)).should_not be_nil
copied_page = @course.wiki.wiki_pages.find_by_migration_id(CC::CCHelper.create_key(page_to_copy))
copied_page.should_not be_nil
@course.wiki.wiki_pages.find_by_migration_id(CC::CCHelper.create_key(page_to_not_copy)).should be_nil
it "should create a selective course export with arrays of ids" do
json = api_call_as_user(t_teacher, :post, "/api/v1/courses/#{t_course.id}/content_exports?export_type=common_cartridge",
{ controller: 'content_exports_api', action: 'create', format: 'json', course_id: t_course.to_param, export_type: 'common_cartridge'},
{ :select => {:context_modules => [mod.id]}})
export = t_course.content_exports.find_by_id(json['id'])
export.should_not be_nil
export.workflow_state.should eql 'created'
export.export_type.should eql 'common_cartridge'
export.user_id.should eql t_teacher.id
export.settings['selected_content']['context_modules'].should == {CC::CCHelper.create_key(mod) => "1"}
export.job_progress.should be_queued
copied_att = @course.attachments.find_by_filename(att_to_copy.filename)
copied_att.should_not be_nil
copied_page.body.should == "<p><a href=\"/courses/#{@course.id}/files/#{copied_att.id}/preview\">hey look a link</a></p>"
@course.attachments.find_by_filename(att_to_not_copy.filename).should be_nil
end
run_jobs
it "should create a selective course export with arrays of ids" do
att_to_copy = Attachment.create!(:context => t_course, :filename => 'hi.txt',
:uploaded_data => StringIO.new("stuff"), :folder => Folder.unfiled_folder(t_course))
att_to_not_copy = Attachment.create!(:context => t_course, :filename => 'derp.txt',
:uploaded_data => StringIO.new("more stuff"), :folder => Folder.unfiled_folder(t_course))
export.reload
export.workflow_state.should eql 'exported'
export.job_progress.should be_completed
export.attachment.should_not be_nil
page_to_copy = t_course.wiki.wiki_pages.create!(:title => "other page")
page_to_copy.body = "<p><a href=\"/courses/#{t_course.id}/files/#{att_to_copy.id}/preview\">hey look a link</a></p>"
page_to_copy.save!
page_to_not_copy = t_course.wiki.wiki_pages.create!(:title => "another page")
course
cm = @course.content_migrations.new
cm.attachment = export.attachment
cm.migration_type = "canvas_cartridge_importer"
cm.migration_settings[:import_immediately] = true
cm.save!
cm.queue_migration
# both the wiki page and the referenced attachment should be exported implicitly through the module
mod = t_course.context_modules.create!(:name => "who cares")
mod.add_item(:id => page_to_copy.id, :type => "wiki_page")
run_jobs
json = api_call_as_user(t_teacher, :post, "/api/v1/courses/#{t_course.id}/content_exports?export_type=common_cartridge",
{ controller: 'content_exports_api', action: 'create', format: 'json', course_id: t_course.to_param, export_type: 'common_cartridge'},
{ :select => {:context_modules => [mod.id]}})
export = t_course.content_exports.find_by_id(json['id'])
export.should_not be_nil
export.workflow_state.should eql 'created'
export.export_type.should eql 'common_cartridge'
export.user_id.should eql t_teacher.id
export.settings['selected_content']['context_modules'].should == {CC::CCHelper.create_key(mod) => "1"}
export.job_progress.should be_queued
@course.context_modules.find_by_migration_id(CC::CCHelper.create_key(mod)).should_not be_nil
copied_page = @course.wiki.wiki_pages.find_by_migration_id(CC::CCHelper.create_key(page_to_copy))
copied_page.should_not be_nil
@course.wiki.wiki_pages.find_by_migration_id(CC::CCHelper.create_key(page_to_not_copy)).should be_nil
run_jobs
export.reload
export.workflow_state.should eql 'exported'
export.job_progress.should be_completed
export.attachment.should_not be_nil
course
cm = @course.content_migrations.new
cm.attachment = export.attachment
cm.migration_type = "canvas_cartridge_importer"
cm.migration_settings[:import_immediately] = true
cm.save!
cm.queue_migration
run_jobs
@course.context_modules.find_by_migration_id(CC::CCHelper.create_key(mod)).should_not be_nil
copied_page = @course.wiki.wiki_pages.find_by_migration_id(CC::CCHelper.create_key(page_to_copy))
copied_page.should_not be_nil
@course.wiki.wiki_pages.find_by_migration_id(CC::CCHelper.create_key(page_to_not_copy)).should be_nil
copied_att = @course.attachments.find_by_filename(att_to_copy.filename)
copied_att.should_not be_nil
copied_page.body.should == "<p><a href=\"/courses/#{@course.id}/files/#{copied_att.id}/preview\">hey look a link</a></p>"
@course.attachments.find_by_filename(att_to_not_copy.filename).should be_nil
copied_att = @course.attachments.find_by_filename(att_to_copy.filename)
copied_att.should_not be_nil
copied_page.body.should == "<p><a href=\"/courses/#{@course.id}/files/#{copied_att.id}/preview\">hey look a link</a></p>"
@course.attachments.find_by_filename(att_to_not_copy.filename).should be_nil
end
end
end
describe "#content_list" do
it "should return a list of exportable content for a course directly" do
course_with_teacher_logged_in(:active_all => true)
@dt1 = @course.discussion_topics.create!(:message => "hi", :title => "discussion title")
@cm = @course.context_modules.create!(:name => "some module")
@att = Attachment.create!(:filename => 'first.txt', :uploaded_data => StringIO.new('ohai'), :folder => Folder.unfiled_folder(@course), :context => @course)
@ -331,7 +326,7 @@ describe ContentExportsApiController, type: :request do
{"type"=>"discussion_topics", "property"=>"select[all_discussion_topics]", "title"=>"Discussion Topics", "count"=>1, "sub_items_url"=>"http://www.example.com/api/v1/courses/#{@course.id}/content_list?type=discussion_topics"},
{"type"=>"quizzes", "property"=>"select[all_quizzes]", "title"=>"Quizzes", "count"=>1, "sub_items_url"=>"http://www.example.com/api/v1/courses/#{@course.id}/content_list?type=quizzes"},
{"type"=>"syllabus_body", "property"=>"select[all_syllabus_body]", "title"=>"Syllabus Body"},
{"type"=>"wiki_pages", "property"=>"select[all_wiki_pages]", "title"=>"Wiki Pages", "count"=>1, "sub_items_url"=>"http://www.example.com/api/v1/courses/#{@course.id}/content_list?type=wiki_pages"}
{"type"=>"wiki_pages", "property"=>"select[all_wiki_pages]", "title"=>"Wiki Pages", "count"=>2, "sub_items_url"=>"http://www.example.com/api/v1/courses/#{@course.id}/content_list?type=wiki_pages"}
]
json = api_call(:get, list_url + '?type=context_modules', params.merge({type: 'context_modules'}))

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe ContentMigrationsController, type: :request do
before do
before :once do
course_with_teacher_logged_in(:active_all => true, :user => user_with_pseudonym)
@migration_url = "/api/v1/courses/#{@course.id}/content_migrations"
@params = { :controller => 'content_migrations', :format => 'json', :course_id => @course.id.to_param}
@ -121,7 +121,7 @@ describe ContentMigrationsController, type: :request do
end
describe 'show' do
before do
before :once do
@migration_url = @migration_url + "/#{@migration.id}"
@params = @params.merge( :action => 'show', :id => @migration.id.to_param )
end
@ -254,7 +254,7 @@ describe ContentMigrationsController, type: :request do
end
describe 'create' do
before do
before :once do
@params = {:controller => 'content_migrations', :format => 'json', :course_id => @course.id.to_param, :action => 'create'}
@post_params = {:migration_type => 'common_cartridge_importer', :pre_attachment => {:name => "test.zip"}}
end
@ -413,7 +413,7 @@ describe ContentMigrationsController, type: :request do
end
context "User" do
before do
before :once do
@migration_url = "/api/v1/users/#{@user.id}/content_migrations"
@params = @params.reject{|k| k == :course_id}.merge(:user_id => @user.to_param)
@folder = Folder.root_folders(@user).first
@ -511,7 +511,7 @@ describe ContentMigrationsController, type: :request do
end
context "selective content" do
before do
before :once do
@migration.workflow_state = 'exported'
@migration.migration_settings[:import_immediately] = false
@migration.save!
@ -576,7 +576,7 @@ describe ContentMigrationsController, type: :request do
end
describe 'content selection' do
before do
before :once do
@migration_url = "/api/v1/courses/#{@course.id}/content_migrations/#{@migration.id}/selective_data"
@params = {:controller => 'content_migrations', :format => 'json', :course_id => @course.id.to_param, :action => 'content_list', :id => @migration.id.to_param}
@orig_course = @course

View File

@ -18,7 +18,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Module Items API", type: :request do
before do
before :once do
course.offer!
@module1 = @course.context_modules.create!(:name => "module1")
@ -57,7 +57,7 @@ describe "Module Items API", type: :request do
end
context "as a teacher" do
before :each do
before :once do
course_with_teacher(:course => @course, :active_all => true)
end
@ -782,7 +782,7 @@ describe "Module Items API", type: :request do
end
context "with duplicate items" do
before do
before :once do
@other_quiz_tag = @module3.add_item(:id => @quiz.id, :type => 'quiz')
end
@ -826,8 +826,8 @@ describe "Module Items API", type: :request do
end
context "as a student" do
before :each do
course_with_student_logged_in(:course => @course, :active_all => true)
before :once do
course_with_student(:course => @course, :active_all => true)
end
def override_assignment
@ -873,7 +873,7 @@ describe "Module Items API", type: :request do
end
let(:assignment_details) { json.find{|item| item['id'] == @assignment_tag.id}['content_details'] }
before do
before :once do
override_assignment
end
@ -906,7 +906,7 @@ describe "Module Items API", type: :request do
end
let(:assignment_details) { json['content_details'] }
before do
before :once do
override_assignment
end
@ -1011,7 +1011,7 @@ describe "Module Items API", type: :request do
describe "GET 'module_item_sequence'" do
context "unpublished item" do
before do
before :once do
@quiz_tag.unpublish
end
@ -1036,7 +1036,7 @@ describe "Module Items API", type: :request do
end
context "unpublished module" do
before do
before :once do
@new_assignment_1 = @course.assignments.create!
@new_assignment_1_tag = @module3.add_item :type => 'assignment', :id => @new_assignment_1.id
@module4 = @course.context_modules.create!
@ -1069,7 +1069,7 @@ describe "Module Items API", type: :request do
end
context "unauthorized user" do
before do
before :once do
user
end

View File

@ -18,7 +18,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Modules API", type: :request do
before do
before :once do
course.offer!
@module1 = @course.context_modules.create!(:name => "module1")
@ -56,7 +56,7 @@ describe "Modules API", type: :request do
end
context "as a teacher" do
before :each do
before :once do
course_with_teacher(:course => @course, :active_all => true)
end
@ -292,7 +292,7 @@ describe "Modules API", type: :request do
end
describe "batch update" do
before do
before :once do
@path = "/api/v1/courses/#{@course.id}/modules"
@path_opts = { :controller => "context_modules_api", :action => "batch_update", :format => "json",
:course_id => @course.to_param }
@ -391,8 +391,8 @@ describe "Modules API", type: :request do
end
describe "update" do
before :each do
course_with_teacher_logged_in(:active_all => true)
before :once do
course_with_teacher(:active_all => true)
@module1 = @course.context_modules.create(:name => "unpublished")
@module1.workflow_state = 'unpublished'
@ -522,8 +522,8 @@ describe "Modules API", type: :request do
end
describe "create" do
before :each do
course_with_teacher_logged_in(:active_all => true)
before :once do
course_with_teacher(:active_all => true)
end
it "should create a module with attributes" do
@ -639,8 +639,8 @@ describe "Modules API", type: :request do
end
context "as a student" do
before :each do
course_with_student_logged_in(:course => @course, :active_all => true)
before :once do
course_with_student(:course => @course, :active_all => true)
end
it "should show locked state" do

View File

@ -20,7 +20,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
require File.expand_path(File.dirname(__FILE__) + '/../../sharding_spec_helper')
describe ConversationsController, type: :request do
before do
before :once do
@other = user(active_all: true)
course_with_teacher(:active_course => true, :active_enrollment => true, :user => user_with_pseudonym(:active_user => true))
@ -127,7 +127,8 @@ describe ConversationsController, type: :request do
end
it "should paginate and return proper pagination headers" do
7.times{ conversation(student_in_course) }
students = create_users_in_course(@course, 7, return_type: :record)
students.each{ |s| conversation(s) }
@user.conversations.size.should eql 7
json = api_call(:get, "/api/v1/conversations.json?scope=default&per_page=3",
{:controller => 'conversations', :action => 'index', :format => 'json', :scope => 'default', :per_page => '3'})
@ -192,7 +193,7 @@ describe ConversationsController, type: :request do
end
describe "context_name" do
before :each do
before :once do
@c1 = conversation(@bob, :workflow_state => 'read') # implicit tag from shared context
@c2 = conversation(@bob, @billy, :workflow_state => 'unread', :subscribed => false) # manually specified context which would not be implied
course_with_student(:course_name => 'the other course')
@ -230,7 +231,7 @@ describe ConversationsController, type: :request do
context "filtering by tags" do
specs_require_sharding
before do
before :once do
@conversations = []
end
@ -243,7 +244,7 @@ describe ConversationsController, type: :request do
end
context "tag context on default shard" do
before do
before :once do
Shard.default.activate do
account = Account.create!
course_with_teacher(:account => account, :active_course => true, :active_enrollment => true, :user => @me)
@ -270,7 +271,7 @@ describe ConversationsController, type: :request do
end
context "tag context on non-default shard" do
before do
before :once do
@shard1.activate do
account = Account.create!
course_with_teacher(:account => account, :active_course => true, :active_enrollment => true, :user => @me)
@ -301,7 +302,7 @@ describe ConversationsController, type: :request do
end
context "tag user on default shard" do
before do
before :once do
Shard.default.activate do
account = Account.create!
course_with_teacher(:account => account, :active_course => true, :active_enrollment => true, :user => @me)
@ -322,7 +323,7 @@ describe ConversationsController, type: :request do
end
context "tag user on non-default shard" do
before do
before :once do
@shard1.activate do
account = Account.create!
course_with_teacher(:account => account, :active_course => true, :active_enrollment => true)
@ -525,7 +526,7 @@ describe ConversationsController, type: :request do
end
context "sub-accounts" do
before do
before :once do
@sub_account = Account.default.sub_accounts.build(name: "subby")
@sub_account.root_account_id = Account.default.id
@sub_account.save!
@ -596,129 +597,120 @@ describe ConversationsController, type: :request do
]
end
it "should update the private conversation if it already exists" do
context "private conversations" do
# set up a private conversation in advance
conversation = conversation(@bob)
before(:once) { @conversation = conversation(@bob) }
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id], :body => "test" })
conversation.reload
json.each { |c|
c.delete("avatar_url")
c["participants"].each{ |p|
p.delete("avatar_url")
it "should update the private conversation if it already exists" do
conversation = @conversation
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id], :body => "test" })
conversation.reload
json.each { |c|
c.delete("avatar_url")
c["participants"].each{ |p|
p.delete("avatar_url")
}
}
}
json.each {|c| c["messages"].each {|m| m["participating_user_ids"].sort!}}
json.should eql [
{
"id" => conversation.conversation_id,
"subject" => nil,
"workflow_state" => "read",
"last_message" => "test",
"last_message_at" => conversation.last_message_at.to_json[1, 20],
"last_authored_message" => "test",
"last_authored_message_at" => conversation.last_authored_at.to_json[1, 20],
"message_count" => 2, # two messages total now, though we'll only get the latest one in the response
"subscribed" => true,
"private" => true,
"starred" => false,
"properties" => ["last_author"],
"visible" => true,
"context_code" => conversation.conversation.context_code,
"audience" => [@bob.id],
"audience_contexts" => {
"groups" => {},
"courses" => {@course.id.to_s => ["StudentEnrollment"]}
},
"participants" => [
{"id" => @me.id, "name" => @me.name, "common_courses" => {}, "common_groups" => {}},
{"id" => @bob.id, "name" => @bob.name, "common_courses" => {@course.id.to_s => ["StudentEnrollment"]}, "common_groups" => {}}
],
"messages" => [
{"id" => conversation.messages.first.id, "created_at" => conversation.messages.first.created_at.to_json[1, 20], "body" => "test", "author_id" => @me.id, "generated" => false, "media_comment" => nil, "forwarded_messages" => [], "attachments" => [], "participating_user_ids" => [@me.id, @bob.id].sort}
]
}
]
end
json.each {|c| c["messages"].each {|m| m["participating_user_ids"].sort!}}
json.should eql [
{
"id" => conversation.conversation_id,
"subject" => nil,
"workflow_state" => "read",
"last_message" => "test",
"last_message_at" => conversation.last_message_at.to_json[1, 20],
"last_authored_message" => "test",
"last_authored_message_at" => conversation.last_authored_at.to_json[1, 20],
"message_count" => 2, # two messages total now, though we'll only get the latest one in the response
"subscribed" => true,
"private" => true,
"starred" => false,
"properties" => ["last_author"],
"visible" => true,
"context_code" => conversation.conversation.context_code,
"audience" => [@bob.id],
"audience_contexts" => {
"groups" => {},
"courses" => {@course.id.to_s => ["StudentEnrollment"]}
},
"participants" => [
{"id" => @me.id, "name" => @me.name, "common_courses" => {}, "common_groups" => {}},
{"id" => @bob.id, "name" => @bob.name, "common_courses" => {@course.id.to_s => ["StudentEnrollment"]}, "common_groups" => {}}
],
"messages" => [
{"id" => conversation.messages.first.id, "created_at" => conversation.messages.first.created_at.to_json[1, 20], "body" => "test", "author_id" => @me.id, "generated" => false, "media_comment" => nil, "forwarded_messages" => [], "attachments" => [], "participating_user_ids" => [@me.id, @bob.id].sort}
]
}
]
end
it "should create/update bulk private conversations synchronously" do
# set up one private conversation in advance
conversation(@bob)
it "should create/update bulk private conversations synchronously" do
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id, @joe.id, @billy.id], :body => "test" })
json.size.should eql 3
json.map{ |c| c['id'] }.sort.should eql @me.all_conversations.map(&:conversation_id).sort
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id, @joe.id, @billy.id], :body => "test" })
json.size.should eql 3
json.map{ |c| c['id'] }.sort.should eql @me.all_conversations.map(&:conversation_id).sort
batch = ConversationBatch.first
batch.should_not be_nil
batch.should be_sent
batch = ConversationBatch.first
batch.should_not be_nil
batch.should be_sent
@me.all_conversations.size.should eql(3)
@me.conversations.size.should eql(1) # just the initial conversation with bob is visible to @me
@bob.conversations.size.should eql(1)
@billy.conversations.size.should eql(1)
@joe.conversations.size.should eql(1)
end
@me.all_conversations.size.should eql(3)
@me.conversations.size.should eql(1) # just the initial conversation with bob is visible to @me
@bob.conversations.size.should eql(1)
@billy.conversations.size.should eql(1)
@joe.conversations.size.should eql(1)
end
it "should set the context on new synchronous bulk private conversations" do
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id, @joe.id, @billy.id], :body => "test", :context_code => "course_#{@course.id}" })
json.size.should eql 3
json.map{ |c| c['id'] }.sort.should eql @me.all_conversations.map(&:conversation_id).sort
it "should set the context on new synchronous bulk private conversations" do
# set up one private conversation in advance
conversation(@bob)
batch = ConversationBatch.first
batch.should_not be_nil
batch.should be_sent
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id, @joe.id, @billy.id], :body => "test", :context_code => "course_#{@course.id}" })
json.size.should eql 3
json.map{ |c| c['id'] }.sort.should eql @me.all_conversations.map(&:conversation_id).sort
[@me, @bob].each {|u| u.conversations.first.conversation.context.should be_nil} # an existing conversation does not get a context
[@billy, @joe].each {|u| u.conversations.first.conversation.context.should eql(@course)}
end
batch = ConversationBatch.first
batch.should_not be_nil
batch.should be_sent
it "should create/update bulk private conversations asynchronously" do
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id, @joe.id, @billy.id], :body => "test", :mode => "async" })
json.should eql([])
[@me, @bob].each {|u| u.conversations.first.conversation.context.should be_nil} # an existing conversation does not get a context
[@billy, @joe].each {|u| u.conversations.first.conversation.context.should eql(@course)}
end
batch = ConversationBatch.first
batch.should_not be_nil
batch.should be_created
batch.deliver
it "should create/update bulk private conversations asynchronously" do
# set up one private conversation in advance
conversation(@bob)
@me.all_conversations.size.should eql(3)
@me.conversations.size.should eql(1) # just the initial conversation with bob is visible to @me
@bob.conversations.size.should eql(1)
@billy.conversations.size.should eql(1)
@joe.conversations.size.should eql(1)
end
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id, @joe.id, @billy.id], :body => "test", :mode => "async" })
json.should eql([])
it "should set the context on new asynchronous bulk private conversations" do
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id, @joe.id, @billy.id], :body => "test", :mode => "async", :context_code => "course_#{@course.id}" })
json.should eql([])
batch = ConversationBatch.first
batch.should_not be_nil
batch.should be_created
batch.deliver
batch = ConversationBatch.first
batch.should_not be_nil
batch.should be_created
batch.deliver
@me.all_conversations.size.should eql(3)
@me.conversations.size.should eql(1) # just the initial conversation with bob is visible to @me
@bob.conversations.size.should eql(1)
@billy.conversations.size.should eql(1)
@joe.conversations.size.should eql(1)
end
it "should set the context on new asynchronous bulk private conversations" do
# set up one private conversation in advance
conversation(@bob)
json = api_call(:post, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'create', :format => 'json' },
{ :recipients => [@bob.id, @joe.id, @billy.id], :body => "test", :mode => "async", :context_code => "course_#{@course.id}" })
json.should eql([])
batch = ConversationBatch.first
batch.should_not be_nil
batch.should be_created
batch.deliver
[@me, @bob].each {|u| u.conversations.first.conversation.context.should be_nil} # an existing conversation does not get a context
[@billy, @joe].each {|u| u.conversations.first.conversation.context.should eql(@course)}
[@me, @bob].each {|u| u.conversations.first.conversation.context.should be_nil} # an existing conversation does not get a context
[@billy, @joe].each {|u| u.conversations.first.conversation.context.should eql(@course)}
end
end
it "should create a conversation with forwarded messages" do
@ -774,7 +766,7 @@ describe ConversationsController, type: :request do
"forwarded_messages" => [
{
"id" => forwarded_message.id, "created_at" => forwarded_message.created_at.to_json[1, 20], "body" => "test", "author_id" => @bob.id, "generated" => false, "media_comment" => nil, "forwarded_messages" => [],
"attachments" => [{'filename' => 'test my file? hai!&.png', 'url' => "http://www.example.com/files/#{attachment.id}/download?download_frd=1&verifier=#{attachment.uuid}", 'content-type' => 'image/png', 'display_name' => 'test my file? hai!&.png', 'id' => attachment.id, 'size' => attachment.size,
"attachments" => [{'filename' => attachment.filename, 'url' => "http://www.example.com/files/#{attachment.id}/download?download_frd=1&verifier=#{attachment.uuid}", 'content-type' => 'image/png', 'display_name' => 'test my file? hai!&.png', 'id' => attachment.id, 'size' => attachment.size,
'unlock_at' => nil,
'locked' => false,
'hidden' => false,
@ -1549,7 +1541,7 @@ describe ConversationsController, type: :request do
end
context "recipients" do
before do
before :once do
@group = @course.groups.create(:name => "the group")
@group.users = [@me, @bob, @joe]
end
@ -1598,12 +1590,11 @@ describe ConversationsController, type: :request do
end
describe "bulk updates" do
it "should mark conversations as read" do
c1 = conversation(@me, @bob, :workflow_state => 'unread')
c2 = conversation(@me, @jane, :workflow_state => 'read')
@me.reload.unread_conversations_count.should eql(1)
let_once(:c1) { conversation(@me, @bob, :workflow_state => 'unread') }
let_once(:c2) { conversation(@me, @jane, :workflow_state => 'read') }
let_once(:conversation_ids) { [c1,c2].map {|c| c.conversation.id} }
conversation_ids = [c1,c2].map {|c| c.conversation.id}
it "should mark conversations as read" do
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :event => 'mark_as_read', :conversation_ids => conversation_ids })
@ -1616,11 +1607,6 @@ describe ConversationsController, type: :request do
end
it "should mark conversations as unread" do
c1 = conversation(@me, @bob, :workflow_state => 'unread')
c2 = conversation(@me, @jane, :workflow_state => 'read')
@me.reload.unread_conversations_count.should eql(1)
conversation_ids = [c1,c2].map {|c| c.conversation.id}
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :event => 'mark_as_unread', :conversation_ids => conversation_ids })
@ -1633,11 +1619,8 @@ describe ConversationsController, type: :request do
end
it "should mark conversations as starred" do
c1 = conversation(@me, @bob, :workflow_state => 'unread', :starred => true)
c2 = conversation(@me, @jane, :workflow_state => 'read')
@me.reload.unread_conversations_count.should eql(1)
c1.update_attribute :starred, true
conversation_ids = [c1,c2].map {|c| c.conversation.id}
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :event => 'star', :conversation_ids => conversation_ids })
@ -1650,11 +1633,8 @@ describe ConversationsController, type: :request do
end
it "should mark conversations as unstarred" do
c1 = conversation(@me, @bob, :workflow_state => 'unread', :starred => true)
c2 = conversation(@me, @jane, :workflow_state => 'read')
@me.reload.unread_conversations_count.should eql(1)
c1.update_attribute :starred, true
conversation_ids = [c1,c2].map {|c| c.conversation.id}
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :event => 'unstar', :conversation_ids => conversation_ids })
@ -1688,11 +1668,6 @@ describe ConversationsController, type: :request do
end
it "should destroy conversations" do
c1 = conversation(@me, @bob, :workflow_state => 'unread')
c2 = conversation(@me, @jane, :workflow_state => 'read')
@me.reload.unread_conversations_count.should eql(1)
conversation_ids = [c1,c2].map {|c| c.conversation.id}
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :event => 'destroy', :conversation_ids => conversation_ids })
@ -1706,10 +1681,6 @@ describe ConversationsController, type: :request do
describe "immediate failures" do
it "should fail if event is invalid" do
c1 = conversation(@me, @bob, :workflow_state => 'unread')
c2 = conversation(@me, @jane, :workflow_state => 'read')
conversation_ids = [c1,c2].map {|c| c.conversation.id}
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :event => 'NONSENSE', :conversation_ids => conversation_ids },
@ -1719,10 +1690,6 @@ describe ConversationsController, type: :request do
end
it "should fail if event parameter is not specified" do
c1 = conversation(@me, @bob, :workflow_state => 'unread')
c2 = conversation(@me, @jane, :workflow_state => 'read')
conversation_ids = [c1,c2].map {|c| c.conversation.id}
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :conversation_ids => conversation_ids },
@ -1732,10 +1699,6 @@ describe ConversationsController, type: :request do
end
it "should fail if conversation_ids is not specified" do
c1 = conversation(@me, @bob, :workflow_state => 'unread')
c2 = conversation(@me, @jane, :workflow_state => 'read')
conversation_ids = [c1,c2].map {|c| c.conversation.id}
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :event => 'mark_as_read' },
@ -1756,9 +1719,6 @@ describe ConversationsController, type: :request do
describe "progress" do
it "should create and update a progress object" do
c1 = conversation(@me, @bob, :workflow_state => 'unread')
c2 = conversation(@me, @jane, :workflow_state => 'read')
conversation_ids = [c1,c2].map {|c| c.conversation.id}
json = api_call(:put, "/api/v1/conversations",
{ :controller => 'conversations', :action => 'batch_update', :format => 'json' },
{ :event => 'mark_as_read', :conversation_ids => conversation_ids })
@ -1773,8 +1733,6 @@ describe ConversationsController, type: :request do
describe "progress failures" do
it "should not update conversations the current user does not participate in" do
c1 = conversation(@me, @bob, :workflow_state => 'unread')
c2 = conversation(@me, @jane, :workflow_state => 'read')
c3 = conversation(@bob, @jane, :sender => @bob, :workflow_state => 'unread')
conversation_ids = [c1,c2,c3].map {|c| c.conversation.id}
@ -1844,13 +1802,12 @@ describe ConversationsController, type: :request do
account_admin_user
p = Account.default.pseudonyms.create!(:unique_id => 'admin', :user => @user)
user_session(@user, p)
json = raw_api_call(:delete, "/api/v1/conversations/#{conv.id}/delete_for_all",
{:controller => 'conversations', :action => 'delete_for_all', :format => 'json', :id => conv.id.to_s},
{})
assert_status(401)
user_session(@me)
@user = @me
json = raw_api_call(:delete, "/api/v1/conversations/#{conv.id}/delete_for_all",
{:controller => 'conversations', :action => 'delete_for_all', :format => 'json', :id => conv.id.to_s},
{})
@ -1861,7 +1818,7 @@ describe ConversationsController, type: :request do
end
it "should fail if conversation doesn't exist" do
user_session(site_admin_user)
site_admin_user
json = raw_api_call(:delete, "/api/v1/conversations/0/delete_for_all",
{:controller => 'conversations', :action => 'delete_for_all', :format => 'json', :id => "0"},
{})
@ -1877,7 +1834,7 @@ describe ConversationsController, type: :request do
user.stream_item_instances.size.should eql 1 unless user.id == @me.id
end
user_session(site_admin_user)
site_admin_user
json = api_call(:delete, "/api/v1/conversations/#{conv.id}/delete_for_all",
{:controller => 'conversations', :action => 'delete_for_all', :format => 'json', :id => conv.id.to_s},
{})
@ -1909,7 +1866,7 @@ describe ConversationsController, type: :request do
user.stream_item_instances.size.should eql 1 unless user.id == @me.id
end
user_session(site_admin_user)
site_admin_user
@shard2.activate do
json = api_call(:delete, "/api/v1/conversations/#{conv.id}/delete_for_all",
{:controller => 'conversations', :action => 'delete_for_all', :format => 'json', :id => conv.id.to_s},

View File

@ -29,7 +29,7 @@ end
describe Api::V1::Course do
describe '#course_json' do
before do
before :once do
@test_api = TestCourseApi.new
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
@me = @user
@ -165,9 +165,7 @@ end
describe CoursesController, type: :request do
USER_API_FIELDS = %w(id name sortable_name short_name)
before do
Course.any_instance.stubs(:start_at).returns nil
Course.any_instance.stubs(:end_at).returns nil
before :once do
course_with_teacher(:active_all => true, :user => user_with_pseudonym(:name => 'UWP'))
@me = @user
@course1 = @course
@ -178,6 +176,11 @@ describe CoursesController, type: :request do
@user.pseudonym.update_attribute(:sis_user_id, 'user1')
end
before :each do
Course.any_instance.stubs(:start_at).returns nil
Course.any_instance.stubs(:end_at).returns nil
end
describe "permissions for courses" do
describe "undelete_courses" do
before do
@ -240,14 +243,17 @@ describe CoursesController, type: :request do
describe "course creation" do
context "an account admin" do
before do
Course.any_instance.unstub(:start_at, :end_at)
before :once do
@account = Account.default
account_admin_user
@resource_path = "/api/v1/accounts/#{@account.id}/courses"
@resource_params = { :controller => 'courses', :action => 'create', :format => 'json', :account_id => @account.id.to_s }
end
before :each do
Course.any_instance.unstub(:start_at, :end_at)
end
it "should create a new course" do
term = @account.enrollment_terms.create
post_params = {
@ -403,13 +409,12 @@ describe CoursesController, type: :request do
end
context "without :manage_storage_quotas" do
before do
before :once do
custom_account_role 'lamer', :account => @account
@account.role_overrides.create! :permission => 'manage_courses', :enabled => true,
:enrollment_type => 'lamer'
user
@account.account_users.create!(user: @user, membership_type: 'lamer')
user_session @user
end
it "should ignore storage_quota" do
@ -451,8 +456,7 @@ describe CoursesController, type: :request do
end
describe "course update" do
before do
Course.any_instance.unstub(:start_at, :end_at)
before :once do
account_admin_user
@term = @course.root_account.enrollment_terms.create
@path = "/api/v1/courses/#{@course.id}"
@ -480,6 +484,10 @@ describe CoursesController, type: :request do
}, 'offer' => true }
end
before :each do
Course.any_instance.unstub(:start_at, :end_at)
end
context "an account admin" do
it "should be able to update a course" do
Auditors::Course.expects(:record_updated).once
@ -643,7 +651,7 @@ describe CoursesController, type: :request do
end
context "a teacher" do
before do
before :once do
user
enrollment = @course.enroll_teacher(@user)
enrollment.accept!
@ -701,7 +709,7 @@ describe CoursesController, type: :request do
end
describe "course deletion" do
before do
before :once do
account_admin_user
@path = "/api/v1/courses/#{@course.id}"
@params = { :controller => 'courses', :action => 'destroy', :format => 'json', :id => @course.id.to_s }
@ -761,7 +769,7 @@ describe CoursesController, type: :request do
end
describe "batch edit" do
before do
before :once do
@account = Account.default
account_admin_user
theuser = @user
@ -1100,7 +1108,7 @@ describe CoursesController, type: :request do
end
describe "enrollment_role" do
before do
before :once do
role = Account.default.roles.build :name => 'SuperTeacher'
role.base_role_type = 'TeacherEnrollment'
role.save!
@ -1129,7 +1137,7 @@ describe CoursesController, type: :request do
end
describe "course state" do
before do
before :once do
@course3 = course
@course3.enroll_user(@me, 'TeacherEnrollment', { :role_name => 'SuperTeacher', :active_all => true })
@course4 = course
@ -1218,7 +1226,7 @@ describe CoursesController, type: :request do
end
describe "root account filter" do
before do
before :once do
@course1 = course_with_student(account: Account.default, active_all: true).course
@course2 = course_with_student(account: account_model(name: 'other root account'), user: @student, active_all: true).course
end
@ -1366,7 +1374,7 @@ describe CoursesController, type: :request do
end
describe "users" do
before(:each) do
before :once do
@section1 = @course1.default_section
@section2 = @course1.course_sections.create!(:name => 'Section B')
@ta = user(:name => 'TAPerson')
@ -1574,7 +1582,7 @@ describe CoursesController, type: :request do
end
describe "enrollment_role" do
before do
before :once do
role = Account.default.roles.build :name => 'EliteStudent'
role.base_role_type = 'StudentEnrollment'
role.save!
@ -1692,7 +1700,7 @@ describe CoursesController, type: :request do
end
describe "as a student" do
append_before do
before :once do
@other_user = user_with_pseudonym(:name => 'Waldo', :username => 'dontfindme@example.com')
@other_user.pseudonym.update_attribute(:sis_user_id, 'mysis_8675309')
@course1.enroll_student(@other_user).accept!
@ -1766,12 +1774,10 @@ describe CoursesController, type: :request do
it "should paginate unique users correctly" do
students = [@student1, @student2]
section2 = @course1.course_sections.create!(:name => 'Section B')
8.times do |i|
s = student_in_course(:course => @course1, :active_all => true).user
@course1.enroll_student(s, :section => section2, :allow_multiple_enrollments => true).accept!
end
@user = @me
user_ids = create_users_in_course(@course1, 8)
create_enrollments(@course1, user_ids, section_id: section2.id)
json = api_call(:get, "/api/v1/courses/#{@course1.id}/users.json",
{ :controller => 'courses', :action => 'users', :course_id => @course1.id.to_s, :format => 'json' },
{ :enrollment_type => 'student', :page => 1, :per_page => 5 })
@ -1786,14 +1792,10 @@ describe CoursesController, type: :request do
it "should allow jumping to a user's page based on id" do
@other_section = @course1.course_sections.create!
students = []
5.times do |i|
s = student_in_course(:course => @course1, :name => "User #{i+1}", :active_all => true).user
@course1.enroll_student(s, :section => @other_section, :allow_multiple_enrollments => true)
students << s
end
students = create_users(5.times.map{ |i| {name: "User #{i+1}", sortable_name: "#{i+1}, User"} }, return_type: :record)
create_enrollments(@course1, students)
create_enrollments(@course1, students, section_id: @other_section.id)
@target = students[4]
@user = @me
json = api_call(:get, "/api/v1/courses/#{@course1.id}/users.json",
{ :controller => 'courses', :action => 'users', :course_id => @course1.id.to_s, :format => 'json' },
{ :enrollment_type => 'student', :user_id => @target.id, :page => 1, :per_page => 1 })
@ -1949,10 +1951,9 @@ describe CoursesController, type: :request do
end
context "when scoped to account" do
before do
before :once do
@admin = account_admin_user(:account => @course.account, :active_all => true)
user_with_pseudonym(:user => @admin)
user_session(@admin)
end
it "should 401 for unauthorized users" do
@ -2005,7 +2006,7 @@ describe CoursesController, type: :request do
end
context "when course is deleted" do
before do
before :once do
@course.destroy
end
@ -2059,8 +2060,8 @@ describe CoursesController, type: :request do
end
describe "/settings" do
before do
course_with_teacher_logged_in(:active_all => true)
before :once do
course_with_teacher(:active_all => true)
end
it "should render settings json" do
@ -2103,8 +2104,8 @@ describe CoursesController, type: :request do
end
describe "/recent_students" do
before do
course_with_teacher_logged_in(:active_all => true)
before :once do
course_with_teacher(:active_all => true)
@student1 = student_in_course(:active_all => true, :name => "Sheldon Cooper").user
@student2 = student_in_course(:active_all => true, :name => "Leonard Hofstadter").user
@student3 = student_in_course(:active_all => true, :name => "Howard Wolowitz").user
@ -2129,8 +2130,8 @@ describe CoursesController, type: :request do
end
describe "/preview_html" do
before do
course_with_teacher_logged_in(:active_all => true)
before :once do
course_with_teacher(:active_all => true)
end
it "should sanitize html and process links" do
@ -2156,26 +2157,20 @@ describe CoursesController, type: :request do
end
it "should return the activity stream" do
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
@context = @course
@topic1 = discussion_topic_model
discussion_topic_model
json = api_call(:get, "/api/v1/courses/#{@course.id}/activity_stream.json",
{ controller: "courses", course_id: @course.id.to_s, action: "activity_stream", format: 'json' })
json.size.should == 1
end
it "should return the activity stream summary" do
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
@context = @course
@topic1 = discussion_topic_model
discussion_topic_model
json = api_call(:get, "/api/v1/courses/#{@course.id}/activity_stream/summary.json",
{ controller: "courses", course_id: @course.id.to_s, action: "activity_stream_summary", format: 'json' })
json.should == [{"type" => "DiscussionTopic", "count" => 1, "unread_count" => 1, "notification_category" => nil}]
end
it "should update activity time" do
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
@context = @course
@enrollment.last_activity_at.should be_nil
api_call(:post, "/api/v1/courses/#{@course.id}/ping",
{ controller: "courses", course_id: @course.id.to_s, action: "ping", format: 'json' })
@ -2191,8 +2186,8 @@ def each_copy_option
end
describe ContentImportsController, type: :request do
before(:each) do
course_with_teacher_logged_in(:active_all => true, :name => 'origin story')
before :once do
course_with_teacher(:active_all => true, :name => 'origin story')
@copy_from = @course
@copy_from.sis_source_id = 'from_course'

View File

@ -22,7 +22,7 @@ describe CustomGradebookColumnDataApiController, type: :request do
include Api
include Api::V1::CustomGradebookColumn
before do
before :once do
course_with_teacher active_all: true
s1, s2 = 2.times.map { |i|
@course.course_sections.create! name: "section #{i}"
@ -42,7 +42,7 @@ describe CustomGradebookColumnDataApiController, type: :request do
end
describe 'index' do
before do
before :once do
[@student1, @student2].each_with_index { |s,i|
@col.custom_gradebook_column_data.build(content: "Blah #{i}").tap { |d|
d.user_id = s.id

View File

@ -22,14 +22,14 @@ describe CustomGradebookColumnsApiController, type: :request do
include Api
include Api::V1::CustomGradebookColumn
before do
before :once do
course_with_teacher active_all: true
student_in_course active_all: true
@user = @teacher
end
describe 'index' do
before do
before :once do
@cols = 2.times.map { |i|
@course.custom_gradebook_columns.create! title: "Col #{i+1}",
position: i
@ -103,7 +103,7 @@ describe CustomGradebookColumnsApiController, type: :request do
end
describe 'update' do
before { @col = @course.custom_gradebook_columns.create! title: "Foo" }
before(:once) { @col = @course.custom_gradebook_columns.create! title: "Foo" }
it 'checks permissions' do
@user = @student
@ -129,7 +129,7 @@ describe CustomGradebookColumnsApiController, type: :request do
end
describe 'delete' do
before do
before :once do
@col = @course.custom_gradebook_columns.create! title: "Foo"
end

View File

@ -73,7 +73,6 @@ describe DeveloperKeysController, type: :request do
def admin_session
account_admin_user(:account => Account.site_admin)
user_session(@admin)
end
def index_call

View File

@ -28,7 +28,7 @@ class DiscussionTopicsTestCourseApi
end
describe Api::V1::DiscussionTopics do
before do
before :once do
@test_api = DiscussionTopicsTestCourseApi.new
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
@me = @user
@ -76,9 +76,11 @@ describe DiscussionTopicsController, type: :request do
include Api::V1::User
context 'locked api item' do
include_examples 'a locked api item'
let(:item_type) { 'discussion_topic' }
let(:locked_item) do
let_once(:locked_item) do
@course.discussion_topics.create!(:user => @user, :message => 'Locked Discussion')
end
@ -90,11 +92,9 @@ describe DiscussionTopicsController, type: :request do
{:controller => 'discussion_topics_api', :action => 'show', :format => 'json', :course_id => @course.id.to_s, :topic_id => locked_item.id.to_s},
)
end
include_examples 'a locked api item'
end
before(:each) do
before(:once) do
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
end
@ -241,10 +241,13 @@ describe DiscussionTopicsController, type: :request do
end
context "With item" do
before do
before :once do
@attachment = create_attachment(@course)
@topic = create_topic(@course, :title => "Topic 1", :message => "<p>content here</p>", :podcast_enabled => true, :attachment => @attachment)
@sub = create_subtopic(@topic, :title => "Sub topic", :message => "<p>i'm subversive</p>")
end
before :each do
@response_json =
{"read_state"=>"read",
"unread_count"=>0,
@ -994,7 +997,7 @@ describe DiscussionTopicsController, type: :request do
end
context "creating an entry under a topic" do
before :each do
before :once do
@topic = create_topic(@course, :title => "Topic 1", :message => "<p>content here</p>")
@message = "my message"
end
@ -1123,7 +1126,7 @@ describe DiscussionTopicsController, type: :request do
end
context "listing top-level discussion entries" do
before :each do
before :once do
@topic = create_topic(@course, :title => "topic", :message => "topic")
@attachment = create_attachment(@course)
@entry = create_entry(@topic, :message => "first top-level entry", :attachment => @attachment)
@ -1239,7 +1242,7 @@ describe DiscussionTopicsController, type: :request do
end
context "listing replies" do
before :each do
before :once do
@topic = create_topic(@course, :title => "topic", :message => "topic")
@entry = create_entry(@topic, :message => "top-level entry")
@reply = create_reply(@entry, :message => "first reply")
@ -1313,7 +1316,7 @@ describe DiscussionTopicsController, type: :request do
# stolen and adjusted from spec/controllers/discussion_topics_controller_spec.rb
context "require initial post" do
before(:each) do
before(:once) do
course_with_student(:active_all => true)
@observer = user(:name => "Observer", :active_all => true)
@ -1346,7 +1349,7 @@ describe DiscussionTopicsController, type: :request do
end
describe "student" do
before(:each) do
before(:once) do
@topic.reply_from(user: @teacher, text: 'Lorem ipsum dolor')
@user = @student
@url = "/api/v1/courses/#{@course.id}/discussion_topics/#{@topic.id}"
@ -1377,7 +1380,7 @@ describe DiscussionTopicsController, type: :request do
end
describe "observer" do
before(:each) do
before(:once) do
@topic.reply_from(user: @teacher, text: 'Lorem ipsum')
@user = @observer
@url = "/api/v1/courses/#{@course.id}/discussion_topics/#{@topic.id}/entries"
@ -1402,7 +1405,7 @@ describe DiscussionTopicsController, type: :request do
end
context "update entry" do
before do
before :once do
@topic = create_topic(@course, :title => "topic", :message => "topic")
@entry = create_entry(@topic, :message => "<p>top-level entry</p>")
end
@ -1450,7 +1453,7 @@ describe DiscussionTopicsController, type: :request do
end
context "delete entry" do
before do
before :once do
@topic = create_topic(@course, :title => "topic", :message => "topic")
@entry = create_entry(@topic, :message => "top-level entry")
end
@ -1512,7 +1515,7 @@ describe DiscussionTopicsController, type: :request do
end
context "read/unread state" do
before(:each) do
before(:once) do
@topic = create_topic(@course, :title => "topic", :message => "topic")
@entry = create_entry(@topic, :message => "top-level entry")
@reply = create_reply(@entry, :message => "first reply")
@ -1696,7 +1699,7 @@ describe DiscussionTopicsController, type: :request do
end
context "subscribing" do
before do
before :once do
student_in_course(:active_all => true)
@topic1 = create_topic(@course, :user => @student)
@topic2 = create_topic(@course, :user => @teacher, :require_initial_post => true)
@ -1788,7 +1791,7 @@ describe DiscussionTopicsController, type: :request do
end
describe "threaded discussions" do
before do
before :once do
student_in_course(:active_all => true)
@topic = create_topic(@course, :threaded => true)
@entry = create_entry(@topic)

View File

@ -22,7 +22,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe EnrollmentsApiController, type: :request do
describe "enrollment creation" do
context "an admin user" do
before do
before :once do
account_admin_user(:active_all => true)
course(:active_course => true)
@unenrolled_user = user_with_pseudonym
@ -254,7 +254,7 @@ describe EnrollmentsApiController, type: :request do
end
context "custom course-level roles" do
before :each do
before :once do
@course_role = @course.root_account.roles.build(:name => 'newrole')
@course_role.base_role_type = 'TeacherEnrollment'
@course_role.save!
@ -374,7 +374,7 @@ describe EnrollmentsApiController, type: :request do
end
context "a teacher" do
before do
before :once do
course_with_teacher(:active_all => true)
@course_with_teacher = @course
@course_wo_teacher = course
@ -449,7 +449,7 @@ describe EnrollmentsApiController, type: :request do
end
context "a student" do
before do
before :once do
course_with_student(:active_all => true)
@unenrolled_user = user_with_pseudonym
@path = "/api/v1/courses/#{@course.id}/enrollments"
@ -470,7 +470,7 @@ describe EnrollmentsApiController, type: :request do
end
context "self enrollment" do
before do
before :once do
course(active_all: true)
@course.update_attribute(:self_enrollment, true)
@unenrolled_user = user_with_pseudonym
@ -522,7 +522,7 @@ describe EnrollmentsApiController, type: :request do
end
describe "enrollment listing" do
before do
before :once do
course_with_student(:active_all => true, :user => user_with_pseudonym)
@teacher = User.create(:name => 'Señor Chang')
@teacher.pseudonyms.create(:unique_id => 'chang@example.com')
@ -538,7 +538,7 @@ describe EnrollmentsApiController, type: :request do
end
context "an account admin" do
before do
before :once do
@user = user_with_pseudonym(:username => 'admin@example.com')
Account.default.account_users.create!(user: @user)
end
@ -717,7 +717,7 @@ describe EnrollmentsApiController, type: :request do
describe "custom roles" do
context "user context" do
before do
before :once do
@original_course = @course
course.offer!
role = @course.account.roles.build :name => 'CustomStudent'
@ -750,7 +750,7 @@ describe EnrollmentsApiController, type: :request do
end
context "course context" do
before do
before :once do
role = @course.account.roles.build :name => 'CustomStudent'
role.base_role_type = 'StudentEnrollment'
role.save!
@ -1022,7 +1022,7 @@ describe EnrollmentsApiController, type: :request do
end
context "a user without permissions" do
before do
before :once do
@user = user_with_pseudonym(:name => 'Don Draper', :username => 'ddraper@sterling-cooper.com')
end
@ -1100,7 +1100,7 @@ describe EnrollmentsApiController, type: :request do
end
describe "enrollment deletion and conclusion" do
before do
before :once do
course_with_student(:active_all => true, :user => user_with_pseudonym)
@enrollment = @student.enrollments.first
@ -1112,7 +1112,9 @@ describe EnrollmentsApiController, type: :request do
@path = "/api/v1/courses/#{@course.id}/enrollments/#{@enrollment.id}"
@params = { :controller => 'enrollments_api', :action => 'destroy', :course_id => @course.id.to_param,
:id => @enrollment.id.to_param, :format => 'json' }
end
before :each do
time = Time.now
Time.stubs(:now).returns(time)
end

View File

@ -20,7 +20,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe 'ExternalFeedsController', type: :request do
shared_examples_for "Announcement External Feeds" do
before do
before :once do
@url_params = { :controller => "external_feeds", :action => "index", :format => "json" }
end
@ -102,7 +102,7 @@ describe 'ExternalFeedsController', type: :request do
describe "in a Course" do
include_examples "Announcement External Feeds"
before do
before :once do
@allowed_user = teacher_in_course(:active_all => true).user
@context = @course
@denied_user = student_in_course(:course => @course, :active_all => true).user
@ -113,7 +113,7 @@ describe 'ExternalFeedsController', type: :request do
describe "in a Group" do
include_examples "Announcement External Feeds"
before do
before :once do
group_with_user(:moderator => true, :active_all => true)
@allowed_user = @user
@allowed_user.pseudonyms.create!(:unique_id => 'user1', :account => Account.default)

View File

@ -21,7 +21,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe ExternalToolsController, type: :request do
describe "in a course" do
before(:each) do
before(:once) do
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
end
@ -193,7 +193,7 @@ describe ExternalToolsController, type: :request do
end
describe "in an account" do
before(:each) do
before(:once) do
account_admin_user(:active_all => true, :user => user_with_pseudonym)
@account = @user.account
end

View File

@ -18,10 +18,9 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Favorites API", type: :request do
before :each do
before :once do
@courses = []
@courses << course_with_student(:active_all => true, :course_name => "Course 0").course
user_session(@user)
5.times do |x|
@courses << course_with_student(:course_name => "Course #{x + 1}", :user => @user, :active_all => true).course
end
@ -42,7 +41,7 @@ describe "Favorites API", type: :request do
end
context "explicit favorites" do
before :each do
before :once do
@courses[0...3].each do |course|
@user.favorites.build(:context => course)
end

View File

@ -18,12 +18,12 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Feature Flags API", type: :request do
let(:t_site_admin) { Account.site_admin }
let(:t_root_account) { account_model }
let(:t_teacher) { user_with_pseudonym account: t_root_account }
let(:t_sub_account) { account_model parent_account: t_root_account }
let(:t_course) { course_with_teacher(user: t_teacher, account: t_sub_account, active_all: true).course }
let(:t_root_admin) { account_admin_user account: t_root_account }
let_once(:t_site_admin) { Account.site_admin }
let_once(:t_root_account) { account_model }
let_once(:t_teacher) { user_with_pseudonym account: t_root_account }
let_once(:t_sub_account) { account_model parent_account: t_root_account }
let_once(:t_course) { course_with_teacher(user: t_teacher, account: t_sub_account, active_all: true).course }
let_once(:t_root_admin) { account_admin_user account: t_root_account }
before do
Feature.stubs(:definitions).returns({
@ -354,7 +354,7 @@ describe "Feature Flags API", type: :request do
end
context "AccountManager" do
before do
before :once do
t_site_admin.role_overrides.create!(permission: 'manage_feature_flags',
enrollment_type: 'AccountManager',
enabled: true,

View File

@ -39,12 +39,12 @@ describe "Files API", type: :request do
include_examples 'a locked api item'
end
before do
before :once do
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
end
describe "api_create_success" do
before do
before :once do
@attachment = Attachment.new
@attachment.context = @course
@attachment.filename = "test.txt"
@ -166,7 +166,7 @@ describe "Files API", type: :request do
end
describe "#index" do
append_before do
before :once do
@root = Folder.root_folders(@course).first
@f1 = @root.sub_folders.create!(:name => "folder1", :context => @course)
@a1 = Attachment.create!(:filename => 'ztest.txt', :display_name => "ztest.txt", :position => 1, :uploaded_data => StringIO.new('file'), :folder => @f1, :context => @course)
@ -235,7 +235,7 @@ describe "Files API", type: :request do
end
context "content_types" do
before do
before :once do
txt = attachment_model :display_name => 'thing.txt', :content_type => 'text/plain', :context => @course, :folder => @f1
png = attachment_model :display_name => 'thing.png', :content_type => 'image/png', :context => @course, :folder => @f1
gif = attachment_model :display_name => 'thing.gif', :content_type => 'image/gif', :context => @course, :folder => @f1
@ -281,7 +281,7 @@ describe "Files API", type: :request do
end
describe "#index for courses" do
append_before do
before :once do
@root = Folder.root_folders(@course).first
@f1 = @root.sub_folders.create!(:name => "folder1", :context => @course)
@a1 = Attachment.create!(:filename => 'ztest.txt', :display_name => "ztest.txt", :position => 1, :uploaded_data => StringIO.new('file'), :folder => @f1, :context => @course)
@ -393,7 +393,7 @@ describe "Files API", type: :request do
end
context "content_types" do
before do
before :once do
txt = attachment_model :display_name => 'thing.txt', :content_type => 'text/plain', :context => @course, :folder => @f1
png = attachment_model :display_name => 'thing.png', :content_type => 'image/png', :context => @course, :folder => @f1
gif = attachment_model :display_name => 'thing.gif', :content_type => 'image/gif', :context => @course, :folder => @f1
@ -441,7 +441,7 @@ describe "Files API", type: :request do
end
describe "#show" do
append_before do
before :once do
@root = Folder.root_folders(@course).first
@att = Attachment.create!(:filename => 'test.png', :display_name => "test-frd.png", :uploaded_data => stub_png_data, :folder => @root, :context => @course)
@file_path = "/api/v1/files/#{@att.id}"
@ -563,7 +563,7 @@ describe "Files API", type: :request do
end
describe "#destroy" do
append_before do
before :once do
@root = Folder.root_folders(@course).first
@att = Attachment.create!(:filename => 'test.txt', :display_name => "test.txt", :uploaded_data => StringIO.new('file'), :folder => @root, :context => @course)
@file_path = "/api/v1/files/#{@att.id}"
@ -587,7 +587,7 @@ describe "Files API", type: :request do
end
describe "#update" do
append_before do
before :once do
@root = Folder.root_folders(@course).first
@att = Attachment.create!(:filename => 'test.txt', :display_name => "test.txt", :uploaded_data => StringIO.new('file'), :folder => @root, :context => @course)
@file_path = "/api/v1/files/#{@att.id}"
@ -630,7 +630,7 @@ describe "Files API", type: :request do
end
describe "quota" do
let(:t_course) do
let_once(:t_course) do
course_with_teacher_logged_in active_all: true
@course.storage_quota = 111.megabytes
@course.save
@ -638,7 +638,7 @@ describe "Files API", type: :request do
@course
end
let(:t_teacher) do
let_once(:t_teacher) do
t_course.teachers.first
end

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Folders API", type: :request do
before do
before :once do
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
@root = Folder.root_folders(@course).first
@ -344,7 +344,7 @@ describe "Folders API", type: :request do
end
describe "#update" do
append_before do
before :once do
@sub1 = @root.sub_folders.create!(:name => "sub1", :context => @course)
@update_url = @folders_path + "/#{@sub1.id}"
@folders_path_options = { :controller => "folders", :action => "update", :format => "json", :id => @sub1.id.to_param }
@ -387,12 +387,12 @@ describe "Folders API", type: :request do
end
describe "#resolve_path" do
before do
before :once do
@params_hash = { controller: 'folders', action: 'resolve_path', format: 'json' }
end
context "course" do
before do
before :once do
course active_all: true
@root_folder = Folder.root_folders(@course).first
@request_path = "/api/v1/courses/#{@course.id}/folders/by_path"
@ -411,7 +411,7 @@ describe "Folders API", type: :request do
end
describe "with full_path" do
before do
before :once do
@folder = @course.folders.create! parent_folder: @root_folder, name: 'a folder'
@sub_folder = @course.folders.create! parent_folder: @folder, name: 'locked subfolder', locked: true
@path = [@folder.name, @sub_folder.name].join('/')
@ -439,7 +439,7 @@ describe "Folders API", type: :request do
end
context "group" do
before do
before :once do
group_with_user
@root_folder = Folder.root_folders(@group).first
@params_hash.merge!(group_id: @group.id)
@ -458,7 +458,7 @@ describe "Folders API", type: :request do
end
context "user" do
before do
before :once do
user active_all: true
@root_folder = Folder.root_folders(@user).first
@params_hash.merge!(user_id: @user.id)

View File

@ -72,7 +72,7 @@ describe GradebookHistoryApiController, type: :request do
let(:date) { Time.now.in_time_zone }
let(:date_string) { date.strftime('%Y-%m-%d') }
before do
before :once do
course_with_teacher(:active_all => true)
@student = user_with_pseudonym(:username => 'student@example.com', :active_all => 1)
student_in_course(:user => @student, :active_all => 1)
@ -119,7 +119,7 @@ describe GradebookHistoryApiController, type: :request do
end
describe 'GET /courses/:course_id/gradebook_history/feed' do
before do
before :once do
course_with_teacher(:active_all => true)
@student1 = user_with_pseudonym(:username => 'student@example.com', :active_all => 1)

View File

@ -39,9 +39,9 @@ module Api::V1
end
describe '#days_json' do
let!(:course) { ::Course.create! }
let_once(:course) { ::Course.create! }
before do
before :once do
students = (1..3).inject([]) do |memo, idx|
student = ::User.create!
course.enroll_student(student)
@ -55,6 +55,9 @@ module Api::V1
submit(@assignment1, students[1], now, @grader2)
submit(@assignment1, students[2], yesterday, @grader2)
submit(@assignment2, students[0], yesterday, @grader2)
end
before :each do
harness = GradebookHistoryHarness.new
harness.instance_variable_set(:@domain_root_account, ::Account.default)
@days = harness.days_json(course, api_context)
@ -94,8 +97,9 @@ module Api::V1
end
describe '#json_for_date' do
before do
course = ::Course.create!
let_once(:course) { ::Course.create! }
before :once do
student1 = ::User.create!
course.enroll_student(student1)
student2 = ::User.create!
@ -105,6 +109,9 @@ module Api::V1
@assignment = course.assignments.create!(:title => "some assignment")
submit(@assignment, student1, now, @grader1)
submit(@assignment, student2, now, @grader2)
end
before :each do
harness = GradebookHistoryHarness.new
harness.instance_variable_set(:@domain_root_account, ::Account.default)
@day_hash = harness.json_for_date(now, course, api_context)
@ -122,7 +129,7 @@ module Api::V1
end
describe '#submissions_for' do
before do
before :once do
@course = ::Course.create!
student1 = ::User.create!
@course.enroll_student(student1)
@ -193,18 +200,18 @@ module Api::V1
end
describe '#submissions' do
let!(:course) { ::Course.create! }
let!(:assignment) { course.assignments.create! }
let!(:student) { ::User.create! }
let_once(:course) { ::Course.create! }
let_once(:assignment) { course.assignments.create! }
let_once(:student) { ::User.create! }
let(:submissions) { gradebook_history.submissions_set(course, api_context) }
before do
before :once do
course.enroll_student(student)
@submission = bare_submission_model(assignment, student)
end
context 'when the submission has been graded' do
before do
before :once do
@submission.graded_at = Time.now.in_time_zone
@submission.save!
end

View File

@ -21,7 +21,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe GradingStandardsApiController, type: :request do
context "account admin" do
describe 'grading standards creation' do
before do
before :once do
@account = Account.default
account_admin_user
@resource_path = "/api/v1/accounts/#{@account.id}/grading_standards"
@ -80,7 +80,7 @@ describe GradingStandardsApiController, type: :request do
end
context "teacher" do
before do
before :once do
@account = Account.default
@resource_path = "/api/v1/accounts/#{@account.id}/grading_standards"
@resource_params = { :controller => 'grading_standards_api', :action => 'create', :format => 'json', :account_id => @account.id.to_s }
@ -105,4 +105,4 @@ describe GradingStandardsApiController, type: :request do
end
end
end

View File

@ -36,13 +36,13 @@ describe "Group Categories API", type: :request do
}
end
before do
before :once do
@account = Account.default
@category_path_options = {:controller => "group_categories", :format => "json"}
end
describe "course group categories" do
before do
before :once do
@course = course(:course_name => 'Math 101', :account => @account, :active_course => true)
@category = GroupCategory.student_organized_for(@course)
end
@ -58,7 +58,7 @@ describe "Group Categories API", type: :request do
}
end
before do
before :once do
@user = user(:name => "joe mcCool")
@course.enroll_user(@user,'TeacherEnrollment',:enrollment_state => :active)
@ -67,8 +67,11 @@ describe "Group Categories API", type: :request do
6.times { course_with_student({:course => @course}) }
@user = @course.teacher_enrollments.first.user
@user = @course.teacher_enrollments.first.user
end
before :each do
json = api_call(:post, "/api/v1/courses/#{@course.id}/group_categories",
@category_path_options.merge(:action => 'create',
:course_id => @course.to_param),
@ -140,7 +143,7 @@ describe "Group Categories API", type: :request do
end
describe "teacher actions with no group" do
before do
before :once do
@name = 'some group name'
@user = user(:name => "joe mcCool")
@course.enroll_user(@user,'TeacherEnrollment',:enrollment_state => :active)
@ -158,8 +161,7 @@ describe "Group Categories API", type: :request do
end
it "should allow a teacher to update a category and distribute students to new groups" do
6.times { course_with_student({:course => @course}) }
@user = @course.teacher_enrollments.first.user
create_users_in_course(@course, 6)
json = api_call :put, "/api/v1/group_categories/#{@category.id}",
@category_path_options.merge(:action => 'update',
:group_category_id => @category.to_param),
@ -173,8 +175,7 @@ describe "Group Categories API", type: :request do
end
it "should create group category/groups and split students between groups" do
6.times { course_with_student({:course => @course}) }
@user = @course.teacher_enrollments.first.user
create_users_in_course(@course, 6)
json = api_call(:post, "/api/v1/courses/#{@course.id}/group_categories",
@category_path_options.merge(:action => 'create',
:course_id => @course.to_param),
@ -244,7 +245,7 @@ describe "Group Categories API", type: :request do
end
describe "teacher actions with a group" do
before do
before :once do
@study_group = group_model(:name => @name, :group_category => @category,
:context => @course)
end
@ -332,7 +333,7 @@ describe "Group Categories API", type: :request do
end
describe "student actions" do
before do
before :once do
@user = user(:name => "derrik hans")
@course.enroll_user(@user,'StudentEnrollment',:enrollment_state => :active)
end
@ -393,7 +394,6 @@ describe "Group Categories API", type: :request do
student = @course.enroll_student(user_model).user
category = @course.group_categories.create(:name => "Group Category")
user_session(student)
raw_api_call :post, "/api/v1/group_categories/#{category.id}/assign_unassigned_members",
@category_path_options.merge(:action => 'assign_unassigned_members',
:group_category_id => category.to_param),
@ -486,12 +486,12 @@ describe "Group Categories API", type: :request do
end
describe "account group categories" do
before do
before :once do
@communities = GroupCategory.communities_for(@account)
end
describe "admin actions" do
before do
before :once do
@user = account_admin_user(:account => @account)
end

View File

@ -74,7 +74,7 @@ describe "Groups API", type: :request do
json
end
before do
before :once do
@moderator = user_model
@member = user_with_pseudonym
@ -312,15 +312,14 @@ describe "Groups API", type: :request do
end
describe "quota" do
before do
before :once do
@account = Account.default
Setting.set('group_default_quota', 11.megabytes)
end
context "with manage_storage_quotas permission" do
before do
before :once do
account_admin_user :account => @account
user_session(@admin)
end
it "should set the quota on create" do
@ -339,9 +338,8 @@ describe "Groups API", type: :request do
end
context "without manage_storage_quotas permission" do
before do
before :once do
account_admin_user_with_role_changes(:role_changes => {:manage_storage_quotas => false})
user_session(@admin)
end
it "should ignore the quota on create" do
@ -766,7 +764,7 @@ describe "Groups API", type: :request do
end
describe "/preview_html" do
before do
before :once do
course_with_teacher_logged_in(:active_all => true)
@group = @course.groups.create!(:name => 'Group 1')
end

View File

@ -19,17 +19,17 @@
require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe LiveAssessments::AssessmentsController, type: :request do
let(:assessment_course) { course(active_all: true) }
let(:teacher) { assessment_course.teachers.first }
let(:student) { course_with_student(course: assessment_course).user }
let(:outcome) do
let_once(:assessment_course) { course(active_all: true) }
let_once(:teacher) { assessment_course.teachers.first }
let_once(:student) { course_with_student(course: assessment_course).user }
let_once(:outcome) do
outcome = assessment_course.created_learning_outcomes.create!(:description => 'this is a test outcome', :short_description => 'test outcome')
assessment_course.root_outcome_group.add_outcome(outcome)
assessment_course.root_outcome_group.save!
assessment_course.reload
outcome
end
let(:unrelated_outcome) {course_with_teacher.course.created_learning_outcomes.create!(description: 'this outcome is in a different course', short_description: 'unrelated outcome')}
let_once(:unrelated_outcome) {course_with_teacher.course.created_learning_outcomes.create!(description: 'this outcome is in a different course', short_description: 'unrelated outcome')}
let(:assessment_hash) {{key: '2014-05-28-Outcome-52', title: 'a test assessment'}}
describe 'POST create' do

View File

@ -19,18 +19,18 @@
require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe LiveAssessments::ResultsController, type: :request do
let(:assessment_course) { course(active_all: true) }
let(:teacher) { assessment_course.teachers.first }
let(:student) { course_with_student(course: assessment_course).user }
let(:another_student) { course_with_student(course: assessment_course).user }
let(:outcome) do
let_once(:assessment_course) { course(active_all: true) }
let_once(:teacher) { assessment_course.teachers.first }
let_once(:student) { course_with_student(course: assessment_course).user }
let_once(:another_student) { course_with_student(course: assessment_course).user }
let_once(:outcome) do
outcome = assessment_course.created_learning_outcomes.create!(:description => 'this is a test outcome', :short_description => 'test outcome')
assessment_course.root_outcome_group.add_outcome(outcome)
assessment_course.root_outcome_group.save!
assessment_course.reload
outcome
end
let(:assessment) do
let_once(:assessment) do
assessment = LiveAssessments::Assessment.create!(context: assessment_course, key: '2014-05-28-Outcome-1', title: 'an assessment')
outcome.align(assessment, assessment_course, mastery_type: 'none', mastery_score: 0.6)
assessment

View File

@ -19,8 +19,8 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe MigrationIssuesController, type: :request do
before do
course_with_teacher_logged_in(:active_all => true, :user => user_with_pseudonym)
before :once do
course_with_teacher(:active_all => true, :user => user_with_pseudonym)
@migration = @course.content_migrations.create!
@issue_url = "/api/v1/courses/#{@course.id}/content_migrations/#{@migration.id}/migration_issues"
@params = { :controller => 'migration_issues', :format => 'json', :course_id => @course.id.to_param, :content_migration_id => @migration.id.to_param}

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe NotificationPreferencesController, type: :request do
before do
before :once do
user_with_pseudonym
Notification.delete_all
Notification.create!(name: 'New Announcement', category: 'Announcements')

View File

@ -19,9 +19,12 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Outcome Groups API", type: :request do
before :once do
user_with_pseudonym(:active_all => true)
end
before :each do
Pseudonym.any_instance.stubs(:works_for_account?).returns(true)
user_with_pseudonym(:active_all => true)
end
def revoke_permission(account_user, permission)
@ -37,7 +40,7 @@ describe "Outcome Groups API", type: :request do
describe "redirect" do
describe "global context" do
before :each do
before :once do
@account_user = @user.account_users.create(:account => Account.site_admin)
end
@ -84,7 +87,7 @@ describe "Outcome Groups API", type: :request do
end
describe "account context" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
end
@ -151,7 +154,7 @@ describe "Outcome Groups API", type: :request do
end
describe "index" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
end
@ -195,7 +198,7 @@ describe "Outcome Groups API", type: :request do
describe "show" do
describe "global context" do
before :each do
before :once do
@account_user = @user.account_users.create(:account => Account.site_admin)
end
@ -293,7 +296,7 @@ describe "Outcome Groups API", type: :request do
end
describe "non-global context" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
end
@ -335,7 +338,7 @@ describe "Outcome Groups API", type: :request do
end
describe "update" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@root_group = @account.root_outcome_group
@ -490,7 +493,7 @@ describe "Outcome Groups API", type: :request do
end
describe "destroy" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@root_group = @account.root_outcome_group
@ -578,7 +581,7 @@ describe "Outcome Groups API", type: :request do
end
describe "outcomes" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@group = @account.root_outcome_group
@ -662,33 +665,33 @@ describe "Outcome Groups API", type: :request do
end
it "should paginate the links" do
links = 25.times.map { |i| create_outcome(:title => "#{i}".object_id) }
links = 5.times.map { |i| create_outcome(:title => "#{i}".object_id) }
json = api_call(:get, "/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes?per_page=10",
json = api_call(:get, "/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes?per_page=2",
:controller => 'outcome_groups_api',
:action => 'outcomes',
:account_id => @account.id.to_s,
:id => @group.id.to_s,
:format => 'json',
:per_page => '10')
json.size.should eql 10
:per_page => '2')
json.size.should eql 2
response.headers['Link'].should match(%r{<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=2.*>; rel="next",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=1.*>; rel="first",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=3.*>; rel="last"})
json = api_call(:get, "/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes?per_page=10&page=3",
json = api_call(:get, "/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes?per_page=2&page=3",
:controller => 'outcome_groups_api',
:action => 'outcomes',
:account_id => @account.id.to_s,
:id => @group.id.to_s,
:format => 'json',
:per_page => '10',
:per_page => '2',
:page => '3')
json.size.should eql 5
response.headers['Link'].should match(%r{<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=1.*>; rel="prev",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=1.*>; rel="first",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=3.*>; rel="last"})
json.size.should eql 1
response.headers['Link'].should match(%r{<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=2.*>; rel="prev",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=1.*>; rel="first",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/outcomes\?.*page=3.*>; rel="last"})
end
end
describe "link existing" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@group = @account.root_outcome_group
@ -782,7 +785,7 @@ describe "Outcome Groups API", type: :request do
end
describe "link new" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@group = @account.root_outcome_group
@ -860,7 +863,7 @@ describe "Outcome Groups API", type: :request do
end
describe "unlink" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@group = @account.root_outcome_group
@ -969,7 +972,7 @@ describe "Outcome Groups API", type: :request do
end
describe "subgroups" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@group = @account.root_outcome_group
@ -1041,33 +1044,33 @@ describe "Outcome Groups API", type: :request do
end
it "should paginate the subgroups" do
subgroups = 25.times.map { |i| create_subgroup }
subgroups = 5.times.map { |i| create_subgroup }
json = api_call(:get, "/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups?per_page=10",
json = api_call(:get, "/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups?per_page=2",
:controller => 'outcome_groups_api',
:action => 'subgroups',
:account_id => @account.id.to_s,
:id => @group.id.to_s,
:format => 'json',
:per_page => '10')
json.size.should eql 10
:per_page => '2')
json.size.should eql 2
response.headers['Link'].should match(%r{<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=2.*>; rel="next",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=1.*>; rel="first",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=3.*>; rel="last"})
json = api_call(:get, "/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups?per_page=10&page=3",
json = api_call(:get, "/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups?per_page=2&page=3",
:controller => 'outcome_groups_api',
:action => 'subgroups',
:account_id => @account.id.to_s,
:id => @group.id.to_s,
:format => 'json',
:per_page => '10',
:per_page => '2',
:page => '3')
json.size.should eql 5
response.headers['Link'].should match(%r{<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=1.*>; rel="prev",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=1.*>; rel="first",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=3.*>; rel="last"})
json.size.should eql 1
response.headers['Link'].should match(%r{<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=2.*>; rel="prev",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=1.*>; rel="first",<.*/api/v1/accounts/#{@account.id}/outcome_groups/#{@group.id}/subgroups\?.*page=3.*>; rel="last"})
end
end
describe "create" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@group = @account.root_outcome_group
@ -1150,7 +1153,7 @@ describe "Outcome Groups API", type: :request do
end
describe "import" do
before :each do
before :once do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@source_group = LearningOutcomeGroup.global_root_outcome_group.child_outcome_groups.create!(

View File

@ -20,44 +20,40 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Outcome Results API", type: :request do
let(:outcome_course) do
course(active_all: true) unless @course
let_once(:outcome_course) do
course(active_all: true)
@course
end
let(:outcome_teacher) do
teacher_in_course(active_all: true) unless @teacher
let_once(:outcome_teacher) do
teacher_in_course(active_all: true, course: outcome_course)
@teacher
end
let(:outcome_student) do
student_in_course(active_all: true) unless @student
let_once(:outcome_student) do
student_in_course(active_all: true, course: outcome_course)
@student
end
let(:outcome_rubric) do
create_outcome_rubric unless @rubric
@rubric
let_once(:outcome_rubric) do
create_outcome_rubric
end
let(:outcome_object) do
outcome_rubric unless @outcome
let_once(:outcome_object) do
outcome_rubric
@outcome
end
let(:outcome_assignment) do
create_outcome_assignment
let_once(:outcome_assignment) do
assignment = create_outcome_assignment
find_or_create_outcome_submission assignment: assignment
assignment
end
let(:outcome_rubric_association) do
let_once(:outcome_rubric_association) do
create_outcome_rubric_association
end
let(:outcome_submission) do
find_or_create_outcome_submission
end
let(:outcome_criterion) do
find_outcome_criterion
end
@ -73,15 +69,13 @@ describe "Outcome Results API", type: :request do
def find_or_create_outcome_submission(opts = {})
student = opts[:student] || outcome_student
assignment = opts[:assignment] ||
(opts[:association].assignment if opts[:association]) ||
(create_outcome_assignment if opts[:new]) ||
outcome_assignment
assignment.find_or_create_submission(student)
end
def create_outcome_assessment(opts = {})
association = opts[:association] ||
(create_outcome_rubric_association(opts) if opts[:new]) ||
association = (create_outcome_rubric_association(opts) if opts[:new]) ||
outcome_rubric_association
criterion = find_outcome_criterion(association.rubric)
submission = opts[:submission] || find_or_create_outcome_submission(opts)
@ -104,7 +98,7 @@ describe "Outcome Results API", type: :request do
def create_outcome_rubric
outcome_course
outcome_with_rubric(mastery_points: 3)
@outcome.rubric_criterion = find_outcome_criterion
@outcome.rubric_criterion = find_outcome_criterion(@rubric)
@outcome.save
@rubric
end
@ -118,11 +112,9 @@ describe "Outcome Results API", type: :request do
end
def create_outcome_rubric_association(opts = {})
rubric = opts[:rubric] ||
(create_outcome_rubric if opts[:new]) ||
rubric = (create_outcome_rubric if opts[:new]) ||
outcome_rubric
assignment = opts[:assignment] ||
(create_outcome_assignment if opts[:new]) ||
assignment = (create_outcome_assignment if opts[:new]) ||
outcome_assignment
rubric.associate_with(assignment, outcome_course, purpose: 'grading', use_for_grading: true)
end
@ -168,19 +160,21 @@ describe "Outcome Results API", type: :request do
api_v1_course_outcome_results_url(context, params)
end
before do
@user = @teacher # api calls as teacher, by default
end
describe "outcome rollups" do
describe "error handling" do
it "requires manage grades permisssion" do
course_with_student_logged_in
@user = @student
raw_api_call(:get, outcome_rollups_url(outcome_course),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s)
assert_status(403)
end
it "allows students to read their own results" do
outcome_students
@user = outcome_students[0]
user_session(@user)
raw_api_call(:get, outcome_rollups_url(outcome_course),
controller: 'outcome_results', action: 'rollups', format: 'json',
course_id: outcome_course.id.to_s, user_ids: [outcome_students[0].id])
@ -188,9 +182,7 @@ describe "Outcome Results API", type: :request do
end
it "does not allow students to read other users' results" do
outcome_students
@user = outcome_students[0]
user_session(@user)
raw_api_call(:get, outcome_rollups_url(outcome_course),
controller: 'outcome_results', action: 'rollups', format: 'json',
course_id: outcome_course.id.to_s, user_ids: [outcome_students[1].id])
@ -198,16 +190,12 @@ describe "Outcome Results API", type: :request do
end
it "does not allow students to read other users' results via csv" do
outcome_students
@user = outcome_students[0]
user_session(@user)
user_session outcome_students[0]
get "courses/#{@course.id}/outcome_rollups.csv"
assert_status(403)
end
it "requires an existing context" do
outcome_course
course_with_teacher_logged_in(course: @course, active_all: true)
bogus_course = Course.new { |c| c.id = -1 }
raw_api_call(:get, outcome_rollups_url(bogus_course),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: bogus_course.id.to_s)
@ -215,8 +203,6 @@ describe "Outcome Results API", type: :request do
end
it "verifies the aggregate parameter" do
outcome_course
course_with_teacher_logged_in(course: @course, active_all: true)
raw_api_call(:get, outcome_rollups_url(@course, aggregate: 'invalid'),
controller: 'outcome_results', action: 'rollups', format: 'json',
course_id: @course.id.to_s, aggregate: 'invalid')
@ -224,8 +210,6 @@ describe "Outcome Results API", type: :request do
end
it "requires user ids to be students in the context" do
outcome_course
course_with_teacher_logged_in(course: @course, active_all: true)
raw_api_call(:get, outcome_rollups_url(@course, user_ids: "#{@teacher.id}"),
controller: 'outcome_results', action: 'rollups', format: 'json',
course_id: @course.id.to_s, user_ids: @teacher.id)
@ -233,18 +217,14 @@ describe "Outcome Results API", type: :request do
end
it "requires section id to be a section in the context" do
outcome_course
bogus_section = course(active_course: true).course_sections.create!(name: 'bogus section')
course_with_teacher_logged_in(course: outcome_course, active_all: true)
raw_api_call(:get, outcome_rollups_url(outcome_course, section_id: bogus_section.id),
controller: 'outcome_results', action: 'rollups', format: 'json',
course_id: @course.id.to_s, section_id: bogus_section.id.to_s)
course_id: outcome_course.id.to_s, section_id: bogus_section.id.to_s)
assert_status(400)
end
it "verifies the include[] parameter" do
outcome_course
course_with_teacher_logged_in(course: @course, active_all: true)
raw_api_call(:get, outcome_rollups_url(@course, include: ['invalid']),
controller: 'outcome_results', action: 'rollups', format: 'json',
course_id: @course.id.to_s, include: ['invalid'])
@ -254,8 +234,6 @@ describe "Outcome Results API", type: :request do
describe "basic response" do
it "returns a json api structure" do
outcome_student
course_with_teacher_logged_in(course: @course, active_all: true)
outcome_result
api_call(:get, outcome_rollups_url(outcome_course),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s)
@ -279,9 +257,8 @@ describe "Outcome Results API", type: :request do
end
it "returns a csv file" do
outcome_student
course_with_teacher_logged_in(course: @course, active_all: true)
outcome_result
user_session @user
get "courses/#{@course.id}/outcome_rollups.csv"
response.should be_success
response.body.should == "Student name,Student ID,new outcome result,new outcome mastery points\n"+
@ -290,10 +267,9 @@ describe "Outcome Results API", type: :request do
describe "user_ids parameter" do
it "restricts results to specified users" do
outcome_students
student_ids = outcome_students[0..1].map(&:id).map(&:to_s)
student_id_str = student_ids.join(',')
course_with_teacher_logged_in(course: outcome_course, active_all: true)
@user = @teacher
api_call(:get, outcome_rollups_url(outcome_course, user_ids: student_id_str, include: ['users']),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s, user_ids: student_id_str, include: ['users'])
json = JSON.parse(response.body)
@ -321,7 +297,7 @@ describe "Outcome Results API", type: :request do
describe "section_id parameter" do
it "restricts results to the specified section" do
sectioned_outcome_students
course_with_teacher_logged_in(course: outcome_course, active_all: true)
@user = @teacher
api_call(:get, outcome_rollups_url(outcome_course, section_id: outcome_course_sections[0].id, include: ['users']),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s, section_id: outcome_course_sections[0].id.to_s, include: ['users'])
json = JSON.parse(response.body)
@ -348,8 +324,6 @@ describe "Outcome Results API", type: :request do
describe "include[] parameter" do
it "side loads courses" do
outcome_object
course_with_teacher_logged_in(course: outcome_course, active_all: true)
api_call(:get, outcome_rollups_url(outcome_course, include: ['courses'], aggregate: 'course'),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s, include: ['courses'], aggregate: 'course')
json = JSON.parse(response.body)
@ -359,8 +333,6 @@ describe "Outcome Results API", type: :request do
end
it "side loads outcomes" do
outcome_object
course_with_teacher_logged_in(course: outcome_course, active_all: true)
api_call(:get, outcome_rollups_url(outcome_course, include: ['outcomes']),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s, include: ['outcomes'])
json = JSON.parse(response.body)
@ -370,11 +342,9 @@ describe "Outcome Results API", type: :request do
end
it "side loads outcome groups" do
outcome_object
root_group = outcome_course.root_outcome_group
child_group = root_group.child_outcome_groups.create!(title: 'child group')
grandchild_group = child_group.child_outcome_groups.create!(title: 'grandchild_group')
course_with_teacher_logged_in(course: outcome_course, active_all: true)
api_call(:get, outcome_rollups_url(outcome_course, include: ['outcome_groups']),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s, include: ['outcome_groups'])
json = JSON.parse(response.body)
@ -386,8 +356,6 @@ describe "Outcome Results API", type: :request do
end
it "side loads outcome links" do
outcome_object
course_with_teacher_logged_in(course: outcome_course, active_all: true)
api_call(:get, outcome_rollups_url(outcome_course, include: ['outcome_links']),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s, include: ['outcome_links'])
json = JSON.parse(response.body)
@ -401,7 +369,6 @@ describe "Outcome Results API", type: :request do
it "side loads users" do
outcome_assessment
course_with_teacher_logged_in(course: outcome_course, active_all: true)
api_call(:get, outcome_rollups_url(outcome_course, include: ['users']),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s, include: ['users'])
json = JSON.parse(response.body)
@ -412,7 +379,6 @@ describe "Outcome Results API", type: :request do
it "side loads alignments" do
outcome_assessment
course_with_teacher_logged_in(course: outcome_course, active_all: true)
api_call(:get, outcome_rollups_url(outcome_course, include: ['outcomes', 'outcomes.alignments']),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s, include: ['outcomes', 'outcomes.alignments'])
json = JSON.parse(response.body)
@ -433,7 +399,7 @@ describe "Outcome Results API", type: :request do
end
describe "outcomes" do
before do
before :once do
@outcomes = 0.upto(3).map do |i|
create_outcome_assessment(new: true)
@outcome
@ -443,7 +409,6 @@ describe "Outcome Results API", type: :request do
create_outcome_assessment(new: true)
@outcome
end
course_with_teacher_logged_in(course: @course, active_all: true)
end
it "supports multiple outcomes" do
@ -480,8 +445,6 @@ describe "Outcome Results API", type: :request do
describe "aggregate response" do
it "returns an aggregate json api structure" do
outcome_student
course_with_teacher_logged_in(course: @course, active_all: true)
outcome_result
api_call(:get, outcome_rollups_url(outcome_course, aggregate: 'course'),
controller: 'outcome_results', action: 'rollups', format: 'json',
@ -506,7 +469,7 @@ describe "Outcome Results API", type: :request do
it "restricts aggregate to specified users" do
outcome_students
student_id_str = outcome_students[0..1].map(&:id).join(',')
course_with_teacher_logged_in(course: outcome_course, active_all: true)
@user = @teacher
api_call(:get, outcome_rollups_url(outcome_course, aggregate: 'course', user_ids: student_id_str),
controller: 'outcome_results', action: 'rollups', format: 'json',
course_id: outcome_course.id.to_s, aggregate: 'course',
@ -531,7 +494,7 @@ describe "Outcome Results API", type: :request do
describe "section_id parameter" do
it "restricts aggregate to the specified section" do
sectioned_outcome_students
course_with_teacher_logged_in(course: outcome_course, active_all: true)
@user = @teacher
api_call(:get, outcome_rollups_url(outcome_course, aggregate: 'course', section_id: outcome_course_sections[0].id),
controller: 'outcome_results', action: 'rollups', format: 'json',
course_id: outcome_course.id.to_s, aggregate: 'course',
@ -560,7 +523,6 @@ describe "Outcome Results API", type: :request do
# we test some of that logic that is more specifically useful to the index endpoint
it "side loads alignments" do
outcome_assessment
course_with_teacher_logged_in(course: outcome_course, active_all: true)
api_call(:get, outcome_results_url(outcome_course, include: ['alignments']),
controller: 'outcome_results', action: 'index', format: 'json', course_id: outcome_course.id.to_s, include: ['alignments'])
json = JSON.parse(response.body)
@ -571,7 +533,6 @@ describe "Outcome Results API", type: :request do
it "returns outcome results" do
outcome_assessment
course_with_teacher_logged_in(course: outcome_course, active_all: true)
api_call(:get, outcome_results_url(outcome_course),
controller: 'outcome_results', action: 'index', format: 'json', course_id: outcome_course.id.to_s)
json = JSON.parse(response.body)
@ -593,7 +554,7 @@ describe "Outcome Results API", type: :request do
student2 = @shard2.activate { User.create!(name: 'outofshard') }
enrollment = @course.enroll_student(student2, enrollment_state: 'active')
create_outcome_assessment(student: student2)
course_with_teacher_logged_in(course: @course, active_all: true)
@user = @teacher
api_call(:get, outcome_rollups_url(outcome_course),
controller: 'outcome_results', action: 'rollups', format: 'json', course_id: outcome_course.id.to_s)

View File

@ -20,16 +20,8 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Outcomes API", type: :request do
before :each do
Pseudonym.any_instance.stubs(:works_for_account?).returns(true)
before :once do
user_with_pseudonym(:active_all => true)
end
def revoke_permission(account_user, permission)
RoleOverride.manage_role_override(account_user.account, account_user.membership_type, permission.to_s, :override => false)
end
before :each do
@account = Account.default
@account_user = @user.account_users.create(:account => @account)
@outcome = @account.created_learning_outcomes.create!(
@ -39,6 +31,14 @@ describe "Outcomes API", type: :request do
)
end
before :each do
Pseudonym.any_instance.stubs(:works_for_account?).returns(true)
end
def revoke_permission(account_user, permission)
RoleOverride.manage_role_override(account_user.account, account_user.membership_type, permission.to_s, :override => false)
end
describe "show" do
it "should not require manage permission" do
revoke_permission(@account_user, :manage_outcomes)

View File

@ -49,7 +49,7 @@ describe "Pages API", type: :request do
include_examples 'a locked api item'
end
before do
before :once do
course
@course.offer!
@wiki = @course.wiki
@ -62,7 +62,7 @@ describe "Pages API", type: :request do
end
context 'versions' do
before :each do
before :once do
@page = @wiki.wiki_pages.create!(:title => 'Test Page', :body => 'Test content')
end
@ -126,7 +126,7 @@ describe "Pages API", type: :request do
end
context "as a teacher" do
before :each do
before :once do
course_with_teacher(:course => @course, :active_all => true)
end
@ -218,7 +218,7 @@ describe "Pages API", type: :request do
end
describe "show" do
before do
before :once do
@teacher.short_name = 'the teacher'
@teacher.save!
@hidden_page.user_id = @teacher.id
@ -305,7 +305,7 @@ describe "Pages API", type: :request do
end
describe "revisions" do
before do
before :once do
@timestamps = %w(2013-01-01 2013-01-02 2013-01-03).map { |d| Time.zone.parse(d) }
course_with_ta :course => @course, :active_all => true
Timecop.freeze(@timestamps[0]) do # rev 1
@ -684,14 +684,14 @@ describe "Pages API", type: :request do
end
context 'hide_from_students' do
before :each do
before :once do
@test_page = @course.wiki.wiki_pages.build(:title => 'Test Page')
@test_page.workflow_state = 'active'
@test_page.save!
end
context 'without draft state' do
before :each do
before :once do
set_course_draft_state false
end
@ -733,7 +733,7 @@ describe "Pages API", type: :request do
end
context 'with draft state' do
before :each do
before :once do
set_course_draft_state true
end
@ -766,14 +766,13 @@ describe "Pages API", type: :request do
end
context 'with unpublished page' do
before do
before :once do
set_course_draft_state
@unpublished_page = @course.wiki.wiki_pages.build(:title => 'Unpublished Page', :body => 'Body of unpublished page')
@unpublished_page.workflow_state = 'unpublished'
@unpublished_page.save!
@unpublished_page.reload
@unpublished_page.should be_unpublished
end
it 'should publish a page with published=true' do
@ -840,7 +839,7 @@ describe "Pages API", type: :request do
end
describe "notify_of_update" do
before do
before :once do
@notify_page = @hidden_page
@notify_page.publish!
@ -891,7 +890,7 @@ describe "Pages API", type: :request do
end
context "unpublished pages" do
before do
before :once do
@deleted_page = @wiki.wiki_pages.create! :title => "Deleted page"
@deleted_page.destroy
@course.account.allow_feature!(:draft_state)
@ -940,7 +939,7 @@ describe "Pages API", type: :request do
end
context "as a student" do
before :each do
before :once do
course_with_student(:course => @course, :active_all => true)
end
@ -952,18 +951,18 @@ describe "Pages API", type: :request do
end
it "should paginate, excluding hidden" do
11.times { |i| @wiki.wiki_pages.create!(:title => "New Page #{i}") }
json = api_call(:get, "/api/v1/courses/#{@course.id}/pages",
:controller=>'wiki_pages_api', :action=>'index', :format=>'json', :course_id=>"#{@course.id}")
json.size.should == 10
2.times { |i| @wiki.wiki_pages.create!(:title => "New Page #{i}") }
json = api_call(:get, "/api/v1/courses/#{@course.id}/pages?per_page=2",
:controller=>'wiki_pages_api', :action=>'index', :format=>'json', :course_id=>"#{@course.id}", :per_page => "2")
json.size.should == 2
urls = json.collect{ |page| page['url'] }
json = api_call(:get, "/api/v1/courses/#{@course.id}/pages?page=2",
:controller=>'wiki_pages_api', :action=>'index', :format=>'json', :course_id=>"#{@course.id}", :page => "2")
json.size.should == 2
json = api_call(:get, "/api/v1/courses/#{@course.id}/pages?per_page=2&page=2",
:controller=>'wiki_pages_api', :action=>'index', :format=>'json', :course_id=>"#{@course.id}", :per_page => "2", :page => "2")
json.size.should == 1
urls += json.collect{ |page| page['url'] }
urls.should == @wiki.wiki_pages.select{ |p| !p.hide_from_students }.sort_by(&:id).collect(&:url)
urls.should == @wiki.wiki_pages.select{ |p| !p.hide_from_students }.sort_by(&:id).collect(&:url)
end
it "should refuse to show a hidden page" do
@ -1040,7 +1039,7 @@ describe "Pages API", type: :request do
end
describe "with students in editing_roles" do
before do
before :once do
@editable_page = @course.wiki.wiki_pages.create! :title => 'Editable Page', :editing_roles => 'students'
@editable_page.workflow_state = 'active'
@editable_page.save!
@ -1146,7 +1145,7 @@ describe "Pages API", type: :request do
end
context "unpublished pages" do
before do
before :once do
@course.account.allow_feature!(:draft_state)
@course.enable_feature!(:draft_state)
@unpublished_page = @wiki.wiki_pages.create(:title => "Draft Page", :body => "Don't text and drive.")
@ -1183,7 +1182,7 @@ describe "Pages API", type: :request do
end
context "revisions" do
before do
before :once do
@vpage = @course.wiki.wiki_pages.build :title => 'student version test page', :body => 'draft'
@vpage.workflow_state = 'unpublished'
@vpage.save! # rev 1
@ -1225,7 +1224,7 @@ describe "Pages API", type: :request do
end
context "with page-level student editing role" do
before do
before :once do
@vpage.editing_roles = 'teachers,students'
@vpage.body = 'with student editing roles'
@vpage.save! # rev 4
@ -1277,7 +1276,7 @@ describe "Pages API", type: :request do
end
context "with course-level student editing role" do
before do
before :once do
@course.default_wiki_editing_roles = 'teachers,students'
@course.save!
end
@ -1295,7 +1294,7 @@ describe "Pages API", type: :request do
end
context "group" do
before :each do
before :once do
group_with_user(:active_all => true)
5.times { |i| @group.wiki.wiki_pages.create!(:title => "Group Wiki Page #{i}", :body => "<blink>Content of page #{i}</blink>") }
end
@ -1336,7 +1335,7 @@ describe "Pages API", type: :request do
end
context "revisions" do
before do
before :once do
@vpage = @group.wiki.wiki_pages.create! :title => 'revision test page', :body => 'old version'
@vpage.body = 'new version'
@vpage.save!

View File

@ -19,12 +19,12 @@
require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe Polling::PollChoicesController, type: :request do
before :each do
course_with_teacher_logged_in active_all: true
before :once do
course_with_teacher active_all: true
end
describe 'GET index' do
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: "Example Poll")
@poll.poll_choices.create!(text: "Poll Choice 1", is_correct:false, position: 1)
@poll.poll_choices.create!(text: "Poll Choice 3", is_correct:false, position: 3)
@ -77,7 +77,7 @@ describe Polling::PollChoicesController, type: :request do
end
context "as a student" do
before(:each) do
before :once do
student_in_course(:active_all => true, :course => @course)
end
@ -101,7 +101,7 @@ describe Polling::PollChoicesController, type: :request do
end
describe 'GET show' do
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: 'An Example Poll')
@poll_choice = @poll.poll_choices.create!(text: 'A Poll Choice', is_correct: true)
end
@ -125,7 +125,7 @@ describe Polling::PollChoicesController, type: :request do
end
context "as a student" do
before(:each) do
before :once do
student_in_course(:active_all => true, :course => @course)
end
@ -169,7 +169,7 @@ describe Polling::PollChoicesController, type: :request do
end
describe 'POST create' do
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: 'An Example Poll')
end
@ -207,7 +207,7 @@ describe Polling::PollChoicesController, type: :request do
end
describe 'PUT update' do
before :each do
before :once do
@poll = @teacher.polls.create!(question: 'An Old Title')
@poll_choice = @poll.poll_choices.create!(text: 'Old Poll Choice', is_correct: true)
end
@ -249,7 +249,7 @@ describe Polling::PollChoicesController, type: :request do
end
describe 'DELETE destroy' do
before :each do
before :once do
@poll = @teacher.polls.create!(question: 'A Poll Title')
@poll_choice = @poll.poll_choices.create!(text: 'Poll Choice', is_correct: true)
end

View File

@ -19,13 +19,13 @@
require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe Polling::PollSessionsController, type: :request do
before :each do
course_with_teacher_logged_in active_all: true
before :once do
course_with_teacher active_all: true
@section = @course.course_sections.first
end
describe 'GET index' do
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: "Example Poll")
3.times do |n|
@poll.poll_sessions.create!(course: @course, course_section: @section)
@ -81,16 +81,12 @@ describe Polling::PollSessionsController, type: :request do
)
end
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: 'An Example Poll')
@poll_session = @poll.poll_sessions.new(course: @course, course_section: @section)
@poll_session.publish!
end
after(:each) do
@user = @teacher
end
def get_show(raw = false, data = {})
helper = method(raw ? :raw_api_call : :api_call)
helper.call(:get,
@ -249,7 +245,7 @@ describe Polling::PollSessionsController, type: :request do
end
describe 'POST create' do
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: 'An Example Poll')
end
@ -288,7 +284,7 @@ describe Polling::PollSessionsController, type: :request do
end
describe 'PUT update' do
before :each do
before :once do
@poll = @teacher.polls.create!(question: 'An Old Title')
@poll_session = @poll.poll_sessions.create!(course: @course, course_section: @section)
end
@ -346,7 +342,7 @@ describe Polling::PollSessionsController, type: :request do
end
describe 'GET open' do
before :each do
before :once do
@poll = @teacher.polls.create!(question: 'An Old Title')
@poll_session = @poll.poll_sessions.create!(course: @course, course_section: @section)
end
@ -406,7 +402,7 @@ describe Polling::PollSessionsController, type: :request do
end
describe 'GET close' do
before :each do
before :once do
@poll = @teacher.polls.create!(question: 'An Old Title')
@poll_session = @poll.poll_sessions.create!(course: @course, course_section: @section)
@poll_session.publish!
@ -460,7 +456,7 @@ describe Polling::PollSessionsController, type: :request do
end
describe 'GET opened' do
before :each do
before :once do
@course1 = course_model
@course2 = course_model
@teacher1 = teacher_in_course(course: @course1).user
@ -531,7 +527,7 @@ describe Polling::PollSessionsController, type: :request do
end
describe 'GET closed' do
before :each do
before :once do
@course1 = course_model
@course2 = course_model
@teacher1 = teacher_in_course(course: @course1).user

View File

@ -19,8 +19,8 @@
require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe Polling::PollSubmissionsController, type: :request do
before(:each) do
course_with_teacher_logged_in active_all: true
before :once do
course_with_teacher active_all: true
@section = @course.course_sections.first
@poll = @teacher.polls.create!(question: "What is your favorite color?")
@ -37,7 +37,7 @@ describe Polling::PollSubmissionsController, type: :request do
end
describe 'GET show' do
before(:each) do
before :once do
@student = student_in_course(active_user: true).user
@selected = @poll.poll_choices.where(text: "Green").first
@ -60,7 +60,6 @@ describe Polling::PollSubmissionsController, type: :request do
end
it "retrieves the poll submission specified" do
user_session(@student)
json = get_show
poll_submission_json = json['poll_submissions'].first
poll_submission_json['id'].should == @submission.id.to_s
@ -69,7 +68,7 @@ describe Polling::PollSubmissionsController, type: :request do
end
describe 'POST create' do
before(:each) do
before :once do
@selected = @poll.poll_choices.where(text: "Green").first
end

View File

@ -19,12 +19,12 @@
require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe Polling::PollsController, type: :request do
before(:each) do
course_with_teacher_logged_in active_all: true
before :once do
course_with_teacher active_all: true
end
describe 'GET index' do
before(:each) do
before :once do
5.times do |n|
@teacher.polls.create!(question: "Example Poll #{n+1}")
end
@ -79,7 +79,7 @@ describe Polling::PollsController, type: :request do
end
describe 'GET show' do
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: 'An Example Poll')
end
@ -181,7 +181,7 @@ describe Polling::PollsController, type: :request do
end
describe 'PUT update' do
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: 'An Old Title')
end
@ -214,7 +214,7 @@ describe Polling::PollsController, type: :request do
end
describe 'DELETE destroy' do
before(:each) do
before :once do
@poll = @teacher.polls.create!(question: 'An Old Title')
@choice = @poll.poll_choices.create!(text: 'Blah')
@session = @poll.poll_sessions.create!(course: @course)

View File

@ -21,7 +21,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe ProgressController, type: :request do
describe "show" do
before do
before :once do
@account = account_model
account_admin_user :account => @account
@progress = @account.progresses.build :tag => 'course_batch_update', :completion => 55.0, :message => 'hello'

View File

@ -19,7 +19,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe PseudonymsController, type: :request do
before do
before :once do
course_with_student(:active_all => true)
account_admin_user
@account = @user.account
@ -100,7 +100,7 @@ describe PseudonymsController, type: :request do
end
context "An unauthorized user" do
before do
before :once do
@user = user_with_pseudonym
end
@ -204,7 +204,7 @@ describe PseudonymsController, type: :request do
end
describe "pseudonym updates" do
before do
before :once do
@student.pseudonyms.create!(:unique_id => 'student@example.com')
@admin.pseudonyms.create!(:unique_id => 'admin@example.com')
@teacher.pseudonyms.create!(:unique_id => 'teacher@example.com')
@ -278,7 +278,7 @@ describe PseudonymsController, type: :request do
end
describe "pseudonym deletion" do
before do
before :once do
@student.pseudonyms.create!(:unique_id => 'student@example.com')
@path = "/api/v1/users/#{@student.id}/logins/#{@student.pseudonym.id}"
@path_options = { :controller => 'pseudonyms',

View File

@ -18,12 +18,13 @@
require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe Quizzes::QuizExtensionsController, type: :request do
before :each do
before :once do
course
@quiz = @course.quizzes.create!(:title => 'quiz')
@quiz.published_at = Time.now
@quiz.workflow_state = 'available'
@quiz.save!
@student = student_in_course(course: @course, active_all: true).user
end
describe "POST /api/v1/courses/:course_id/quizzes/:quiz_id/extensions (create)" do
@ -36,10 +37,6 @@ describe Quizzes::QuizExtensionsController, type: :request do
end
context "as a student" do
before :each do
@student = student_in_course(course: @course, active_all: true).user
end
it "should be unauthorized" do
quiz_extension_params = [
{user_id: @student.id, extra_attempts: 2},
@ -54,13 +51,13 @@ describe Quizzes::QuizExtensionsController, type: :request do
end
context "as a teacher" do
before :each do
@student1 = student_in_course(course: @course, active_all: true).user
before :once do
@student1 = @student
@student2 = student_in_course(course: @course, active_all: true).user
@teacher = teacher_in_course(course: @course, active_all: true).user
end
it "should extend attempts for a existing submission" do
@teacher = teacher_in_course(course: @course, active_all: true).user
quiz_submission = @quiz.generate_submission(@student1)
quiz_submission.grants_right?(@teacher, :add_attempts)
@ -72,8 +69,6 @@ describe Quizzes::QuizExtensionsController, type: :request do
end
it "should extend attempts for a new submission" do
@teacher = teacher_in_course(course: @course, active_all: true).user
quiz_extension_params = [
{user_id: @student1.id, extra_attempts: 2}
]
@ -82,9 +77,6 @@ describe Quizzes::QuizExtensionsController, type: :request do
end
it "should extend attempts for multiple students" do
@student2 = student_in_course(course: @course, active_all: true).user
@teacher = teacher_in_course(course: @course, active_all: true).user
quiz_extension_params = [
{user_id: @student1.id, extra_attempts: 2},
{user_id: @student2.id, extra_attempts: 3}

View File

@ -20,6 +20,12 @@ require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
require File.expand_path(File.dirname(__FILE__) + '/../../locked_spec')
describe Quizzes::QuizGroupsController, type: :request do
before :once do
teacher_in_course(:active_all => true)
@quiz = @course.quizzes.create! :title => 'title'
@bank = @course.assessment_question_banks.create! :title => 'Test Bank'
end
describe "POST /api/v1/courses/:course_id/quizzes/:quiz_id/groups (create)" do
def api_create_quiz_group(quiz_group_params, opts={})
@ -29,12 +35,6 @@ describe Quizzes::QuizGroupsController, type: :request do
{'Accept' => 'application/vnd.api+json'}, opts)
end
before do
teacher_in_course(:active_all => true)
@quiz = @course.quizzes.create! :title => 'title'
@bank = @course.assessment_question_banks.create! :title => 'Test Bank'
end
let (:new_quiz_group) { @quiz.quiz_groups.all[0] }
it "creates a question group for a quiz" do
@ -94,12 +94,8 @@ describe Quizzes::QuizGroupsController, type: :request do
{'Accept' => 'application/vnd.api+json'}, opts)
end
before do
teacher_in_course(:active_all => true)
@quiz = @course.quizzes.create! :title => 'title'
before :once do
@group = @quiz.quiz_groups.create :name => 'Test Group'
@bank = @course.assessment_question_banks.create! :title => 'Test Bank'
end
it "updates group attributes" do
@ -141,8 +137,6 @@ describe Quizzes::QuizGroupsController, type: :request do
describe "DELETE /courses/:course_id/quizzes/:quiz_id/groups/:id (destroy)" do
before do
teacher_in_course(:active_all => true)
@quiz = @course.quizzes.create! :title => 'title'
@group = @quiz.quiz_groups.create :name => 'Test Group'
end
@ -156,8 +150,6 @@ describe Quizzes::QuizGroupsController, type: :request do
describe "POST /courses/:course_id/quizzes/:quiz_id/groups/:id/reorder" do
before do
teacher_in_course(:active_all => true)
@quiz = @course.quizzes.create! :title => 'title'
@question1 = @quiz.quiz_questions.create!(:question_data => {'name' => 'test question 1', 'answers' => [{'id' => 1}, {'id' => 2}], :position => 1})
@question2 = @quiz.quiz_questions.create!(:question_data => {'name' => 'test question 2', 'answers' => [{'id' => 3}, {'id' => 4}], :position => 2})
@question3 = @quiz.quiz_questions.create!(:question_data => {'name' => 'test question 3', 'answers' => [{'id' => 5}, {'id' => 6}], :position => 3})

View File

@ -19,8 +19,8 @@
require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe Quizzes::QuizIpFiltersController, type: :request do
before :each do
course_with_teacher_logged_in :active_all => true
before :once do
course_with_teacher :active_all => true
@quiz = Quizzes::Quiz.create!(:title => 'quiz', :context => @course)
@quiz.save!

View File

@ -20,7 +20,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
describe Quizzes::QuizQuestionsController, type: :request do
context 'as a teacher' do
before do
before :once do
@course = course
teacher_in_course active_all: true
@quiz = @course.quizzes.create!(:title => "A Sample Quiz")
@ -96,8 +96,8 @@ describe Quizzes::QuizQuestionsController, type: :request do
end
context 'as a student' do
before do
course_with_student_logged_in :active_all => true
before :once do
course_with_student :active_all => true
@quiz = @course.quizzes.create!(:title => 'quiz')
@quiz.published_at = Time.now
@ -128,7 +128,7 @@ describe Quizzes::QuizQuestionsController, type: :request do
end
context 'whom has started a quiz' do
before do
before :once do
@quiz.generate_submission(@student)
end

View File

@ -42,7 +42,7 @@ describe Quizzes::QuizReportsController, type: :request do
end
context 'with privileged access' do
before do
before :once do
teacher_in_course(:active_all => true)
@quiz = @course.quizzes.create({ title: 'Test Quiz' })
end
@ -109,7 +109,7 @@ describe Quizzes::QuizReportsController, type: :request do
}, params, headers
end
before do
before :once do
teacher_in_course(:active_all => true)
@me = @user
simple_quiz_with_submissions %w{T T T}, %w{T T T}, %w{T F F}, %w{T F T}, :user => @user, :course => @course
@ -173,7 +173,7 @@ describe Quizzes::QuizReportsController, type: :request do
end
context 'with privileged access' do
before do
before :once do
teacher_in_course(:active_all => true)
@quiz = @course.quizzes.create({ title: 'Test Quiz' })
@report = @quiz.current_statistics_for('student_analysis')

View File

@ -14,8 +14,8 @@ describe Quizzes::QuizStatisticsController, type: :request do
}, params, { 'Accept' => 'application/vnd.api+json' })
end
before :each do
course_with_teacher_logged_in :active_all => true
before :once do
course_with_teacher :active_all => true
teacher = @user
@ -65,4 +65,4 @@ describe Quizzes::QuizStatisticsController, type: :request do
end
end
end
end
end

View File

@ -21,8 +21,8 @@ require File.expand_path(File.dirname(__FILE__) + '/../../file_uploads_spec_help
describe Quizzes::QuizSubmissionFilesController, type: :request do
context "quiz submissions file uploads" do
before do
course_with_student_logged_in :active_all => true
before :once do
course_with_student :active_all => true
@quiz = Quizzes::Quiz.create!(:title => 'quiz', :context => @course)
@quiz.did_edit!
@quiz.offer!

View File

@ -125,7 +125,7 @@ describe Quizzes::QuizSubmissionQuestionsController, :type => :request do
describe 'GET /quiz_submissions/:quiz_submission_id/questions [index]' do
before :each do
course_with_student_logged_in(:active_all => true)
course_with_student(:active_all => true)
@quiz = quiz_model(course: @course)
@quiz_submission = @quiz.generate_submission(@student)
end
@ -159,8 +159,8 @@ describe Quizzes::QuizSubmissionQuestionsController, :type => :request do
end
describe 'GET /quiz_submissions/:quiz_submission_id/questions/:id [show]' do
before :each do
course_with_student_logged_in(:active_all => true)
before :once do
course_with_student(:active_all => true)
@quiz = quiz_model(course: @course)
@quiz_submission = @quiz.generate_submission(@student)
@ -266,8 +266,8 @@ describe Quizzes::QuizSubmissionQuestionsController, :type => :request do
end
context 'as a student' do
before :each do
course_with_student_logged_in(:active_all => true)
before :once do
course_with_student(:active_all => true)
@quiz = quiz_model(course: @course)
@quiz_submission = @quiz.generate_submission(@student)
end

View File

@ -18,9 +18,8 @@ require File.expand_path(File.dirname(__FILE__) + '/../../api_spec_helper')
require File.expand_path(File.dirname(__FILE__) + '/../../../models/quizzes/quiz_user_messager_spec_helper')
describe Quizzes::QuizSubmissionUsersController, type: :request do
before do
course_with_teacher_logged_in(active_all: true)
course_quiz(true)
before :once do
course_with_teacher(active_all: true)
end
def controller_options(options)
@ -36,7 +35,8 @@ describe Quizzes::QuizSubmissionUsersController, type: :request do
describe "POST message" do
include Quizzes::QuizUserMessagerSpecHelper
before do
before :once do
course_quiz(true)
@finder = Quizzes::QuizUserFinder.new(@quiz, @teacher)
course_with_student(active_all: true, course: @course)
@user = @teacher
@ -71,6 +71,12 @@ describe Quizzes::QuizSubmissionUsersController, type: :request do
end
describe "GET submission_users" do
before :once do
@student1 = course_with_student(course: @course, active_all: true).user
quiz_with_graded_submission([], course: @course, user: @student1)
@student2 = course_with_student(course: @course, active_all: true).user
@user = @teacher
end
def get_submitted_users(options={})
options = controller_options(options.reverse_merge!(action: 'index'))
@ -84,52 +90,34 @@ describe Quizzes::QuizSubmissionUsersController, type: :request do
end
it "does not allow students to view information at the endpoint" do
course_with_student_logged_in(course: @course, active_all: true)
@user = @student1
get_submitted_users
response.should_not be_success
end
it "allows teachers to see submitted students with ?submitted=true" do
course_with_student(active_all: true, course: @course)
quiz_with_graded_submission([], course: @course, user: @student)
@user = @teacher
json = get_submitted_users(submitted: true)
response.should be_success
json['users'].first['id'].should == @student.id.to_s
json['users'].first['id'].should == @student1.id.to_s
end
it "allows teachers to see unsubmitted students with ?submitted=false" do
course_with_student(active_all: true, course: @course)
@student_frd = @student
quiz_with_graded_submission([], course: @course, user: @student_frd)
course_with_student(active_all: true, course: @course)
@user = @teacher
json = get_submitted_users(submitted: false)
response.should be_success
user_ids = json['users'].map { |h| h['id'] }
user_ids.should_not include @student_frd.id.to_s
user_ids.should include @student.id.to_s
user_ids.should_not include @student1.id.to_s
user_ids.should include @student2.id.to_s
end
it "allows teachers to see all students for quiz when submitted parameter not passed" do
course_with_student(active_all: true, course: @course)
@student_frd = @student
quiz_with_graded_submission([], course: @course, user: @student_frd)
course_with_student(active_all: true, course: @course)
@user = @teacher
json = get_submitted_users
response.should be_success
user_ids = json['users'].map { |h| h['id'] }
user_ids.should include @student_frd.id.to_s
user_ids.should include @student.id.to_s
user_ids.should include @student1.id.to_s
user_ids.should include @student2.id.to_s
end
it "will sideload quiz_submissions" do
course_with_student(active_all: true, course: @course)
@student_frd = @student
quiz_with_graded_submission([], course: @course, user: @student_frd)
course_with_student(active_all: true, course: @course)
@user = @teacher
json = get_submitted_users(include: ['quiz_submissions'])
response.should be_success
json['quiz_submissions'].first.with_indifferent_access[:id].should == @quiz_submission.id.to_s

View File

@ -43,20 +43,15 @@ end
describe Quizzes::QuizSubmissionsApiController, type: :request do
module Helpers
def enroll_student(opts = {})
def enroll_student
last_user = @teacher = @user
student_in_course
@student = @user
@user = last_user
if opts[:login]
remove_user_session
user_session(@student)
end
end
def enroll_student_and_submit(submission_data = {}, login=false)
enroll_student({ login: login })
def enroll_student_and_submit(submission_data = {})
enroll_student
@quiz_submission = @quiz.generate_submission(@student)
@quiz_submission.submission_data = submission_data
@ -138,8 +133,8 @@ describe Quizzes::QuizSubmissionsApiController, type: :request do
include Helpers
before :each do
course_with_teacher_logged_in :active_all => true
before :once do
course_with_teacher :active_all => true
@quiz = Quizzes::Quiz.create!(:title => 'quiz', :context => @course)
@quiz.published_at = Time.now
@ -162,7 +157,7 @@ describe Quizzes::QuizSubmissionsApiController, type: :request do
end
it 'should be accessible by the owner student' do
enroll_student_and_submit({}, true)
enroll_student_and_submit
json = qs_api_index
json.has_key?('quiz_submissions').should be_true
@ -177,7 +172,7 @@ describe Quizzes::QuizSubmissionsApiController, type: :request do
end
describe 'GET /courses/:course_id/quizzes/:quiz_id/submissions/:id [SHOW]' do
before :each do
before :once do
enroll_student_and_submit
end
@ -311,8 +306,8 @@ describe Quizzes::QuizSubmissionsApiController, type: :request do
end
describe 'POST /courses/:course_id/quizzes/:quiz_id/submissions [create]' do
before :each do
enroll_student({ login: true })
before :once do
enroll_student
end
it 'should create a quiz submission' do
@ -365,8 +360,8 @@ describe Quizzes::QuizSubmissionsApiController, type: :request do
end
describe 'POST /courses/:course_id/quizzes/:quiz_id/submissions/:id/complete [complete]' do
before :each do
enroll_student({ login: true })
before :once do
enroll_student
@quiz_submission = @quiz.generate_submission(@student)
# @quiz_submission.submission_data = { "question_1" => "1658" }
@ -429,7 +424,7 @@ describe Quizzes::QuizSubmissionsApiController, type: :request do
end
describe 'PUT /courses/:course_id/quizzes/:quiz_id/submissions/:id [update]' do
before :each do
before :once do
# We're gonna test with 2 questions to make sure there are no side effects
# when we modify a single question
@qq1 = @quiz.quiz_questions.create!({

View File

@ -39,7 +39,7 @@ describe Quizzes::QuizzesApiController, type: :request do
end
describe "GET /courses/:course_id/quizzes (index)" do
before { teacher_in_course(:active_all => true) }
before(:once) { teacher_in_course(:active_all => true) }
it "should return list of quizzes" do
quizzes = (0..3).map{ |i| @course.quizzes.create! :title => "quiz_#{i}" }
@ -113,7 +113,7 @@ describe Quizzes::QuizzesApiController, type: :request do
end
describe "GET /courses/:course_id/quizzes/:id (show)" do
before { course_with_teacher_logged_in(:active_all => true, :course => @course) }
before(:once) { course_with_teacher(:active_all => true, :course => @course) }
context "unpublished quiz" do
before do
@ -165,7 +165,7 @@ describe Quizzes::QuizzesApiController, type: :request do
{:quiz => quiz_params}, {}, opts)
end
before { teacher_in_course(:active_all => true) }
before(:once) { teacher_in_course(:active_all => true) }
let (:new_quiz) { @course.quizzes.first }
@ -209,9 +209,9 @@ describe Quizzes::QuizzesApiController, type: :request do
describe "validations" do
context "assignment_group_id" do
let!(:my_group) { @course.assignment_groups.create! :name => 'my group' }
let (:other_course) { Course.create! :name => 'other course' }
let!(:other_group) { other_course.groups.create! :name => 'other group' }
let_once(:my_group) { @course.assignment_groups.create! :name => 'my group' }
let_once(:other_course) { Course.create! :name => 'other course' }
let_once(:other_group) { other_course.groups.create! :name => 'other group' }
it "should put the quiz in a group owned by its course" do
api_create_quiz({'title' => 'test quiz', 'assignment_group_id' => my_group.id})
@ -352,7 +352,7 @@ describe Quizzes::QuizzesApiController, type: :request do
end
context 'lockdown_browser' do
before do
before :once do
# require_lockdown_browser, require_lockdown_browser_for_results and
# require_lockdown_browser_monitor will only return true if the plugin is enabled,
# so register and enable it for these test
@ -498,7 +498,7 @@ describe Quizzes::QuizzesApiController, type: :request do
end
describe "POST /courses/:course_id/quizzes/:id/reorder (reorder)" do
before do
before :once do
teacher_in_course(:active_all => true)
@quiz = @course.quizzes.create! :title => 'title'
@question1 = @quiz.quiz_questions.create!(:question_data => {'name' => 'test question 1', 'answers' => [{'id' => 1}, {'id' => 2}], :position => 1})

View File

@ -19,14 +19,14 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Roles API", type: :request do
before do
before :once do
@account = Account.default
account_admin_user(:account => @account)
user_with_pseudonym(:user => @admin)
end
describe "Roles CRUD" do
before :each do
before :once do
@role = 'NewRole'
@permission = 'read_reports'
@initial_count = @account.role_overrides.size
@ -86,7 +86,7 @@ describe "Roles API", type: :request do
end
context "with state parameter" do
before do
before :once do
role = @account.roles.create :name => 'inactive_role'
role.base_role_type = 'StudentEnrollment'
role.workflow_state = 'inactive'
@ -197,6 +197,18 @@ describe "Roles API", type: :request do
end
context "when there are enrollments using a course-level role" do
before :once do
course1 = Course.create!(:name => "blah", :account => @account)
user1 = user()
enrollment1 = course1.enroll_user(user1, 'TeacherEnrollment')
enrollment1.role_name = @role
enrollment1.invite
enrollment1.accept
enrollment1.save!
@user = @admin
end
before :each do
base_role_type = 'TeacherEnrollment'
@ -206,16 +218,6 @@ describe "Roles API", type: :request do
@account.reload
@account.roles.active.map(&:name).should include(@role)
course1 = Course.create!(:name => "blah", :account => @account)
user1 = user()
account_admin_user(:account => @account)
enrollment1 = course1.enroll_user(user1, 'TeacherEnrollment')
enrollment1.role_name = @role
enrollment1.invite
enrollment1.accept
enrollment1.save!
end
it "should deactivate a course-level role" do
@ -472,7 +474,7 @@ describe "Roles API", type: :request do
end
describe "create permission overrides" do
before do
before :once do
@account = Account.default
@path = "/api/v1/accounts/#{@account.id}/roles/TeacherEnrollment"
@path_options = { :controller => 'role_overrides', :action => 'update',

View File

@ -1,7 +1,7 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe SearchController, type: :request do
before do
before :once do
@account = Account.default
course_with_teacher(:active_course => true, :active_enrollment => true, :user => user_with_pseudonym(:active_user => true))
@course.update_attribute(:name, "the course")
@ -26,7 +26,7 @@ describe SearchController, type: :request do
end
context "recipients" do
before do
before :once do
@group = @course.groups.create(:name => "the group")
@group.users = [@me, @bob, @joe]
end
@ -146,7 +146,7 @@ describe SearchController, type: :request do
u
end
before do
before :once do
@bobs_mom = observer_in_course(:name => "bob's mom", :associated_user => @bob)
@lonely = observer_in_course(:name => "lonely observer")
end
@ -288,7 +288,7 @@ describe SearchController, type: :request do
context "pagination" do
it "should paginate even if no type is specified" do
4.times{ student_in_course(:name => "cletus") }
create_users_in_course(@course, 4.times.map{ {name: "cletus", sortable_name: "cletus"}})
json = api_call(:get, "/api/v1/search/recipients.json?search=cletus&per_page=3",
{:controller => 'search', :action => 'recipients', :format => 'json', :search => 'cletus', :per_page => '3'})
@ -297,7 +297,7 @@ describe SearchController, type: :request do
end
it "should paginate users and return proper pagination headers" do
4.times{ student_in_course(:name => "cletus") }
create_users_in_course(@course, 4.times.map{ {name: "cletus", sortable_name: "cletus"}})
json = api_call(:get, "/api/v1/search/recipients.json?search=cletus&type=user&per_page=3",
{:controller => 'search', :action => 'recipients', :format => 'json', :search => 'cletus', :type => 'user', :per_page => '3'})
@ -323,10 +323,7 @@ describe SearchController, type: :request do
end
it "should paginate contexts and return proper pagination headers" do
4.times{
course_with_teacher(:active_course => true, :active_enrollment => true, :user => @user)
@course.update_attribute(:name, "ofcourse")
}
create_courses(4.times.map{ {name: "ofcourse"} }, enroll_user: @user)
json = api_call(:get, "/api/v1/search/recipients.json?search=ofcourse&type=context&per_page=3",
{:controller => 'search', :action => 'recipients', :format => 'json', :search => 'ofcourse', :type => 'context', :per_page => '3'})
@ -352,7 +349,7 @@ describe SearchController, type: :request do
end
it "should ignore invalid per_page" do
11.times{ student_in_course(:name => "cletus") }
create_users_in_course(@course, 11.times.map{ {name: "cletus", sortable_name: "cletus"}})
json = api_call(:get, "/api/v1/search/recipients.json?search=cletus&type=user&per_page=-1",
{:controller => 'search', :action => 'recipients', :format => 'json', :search => 'cletus', :type => 'user', :per_page => '-1'})
@ -379,14 +376,11 @@ describe SearchController, type: :request do
it "should paginate combined context/user results" do
# 6 courses, 6 users, 12 items total
course_ids = []
courses = create_courses(6.times.map{ {name: "term"} }, enroll_user: @user, return_type: :record)
course_ids = courses.map(&:asset_string)
user_ids = []
6.times do
course_with_teacher(:active_course => true, :active_enrollment => true, :user => @user)
@course.update_attribute(:name, "term")
student = student_in_course(:name => "term")
course_ids << @course.asset_string
user_ids << student.id
courses.each do |course|
user_ids.concat create_users_in_course(course, [{name: "term", sortable_name: "term"}])
end
json = api_call(:get, "/api/v1/search/recipients.json?search=term&per_page=4",

View File

@ -22,7 +22,7 @@ describe SectionsController, type: :request do
describe '#index' do
USER_API_FIELDS = %w(id name sortable_name short_name)
before do
before :once do
course_with_teacher(:active_all => true, :user => user_with_pseudonym(:name => 'UWP'))
@me = @user
@course1 = @course
@ -88,8 +88,8 @@ describe SectionsController, type: :request do
end
describe "#show" do
before do
course_with_teacher_logged_in
before :once do
course_with_teacher
@section = @course.default_section
end
@ -183,7 +183,7 @@ describe SectionsController, type: :request do
end
context "as an admin" do
before do
before :once do
site_admin_user
@section = @course.default_section
@path_prefix = "/api/v1/courses/#{@course.id}/sections"
@ -209,15 +209,15 @@ describe SectionsController, type: :request do
end
describe "#create" do
before do
before :once do
course
@path_prefix = "/api/v1/courses/#{@course.id}/sections"
@path_params = { :controller => 'sections', :action => 'create', :course_id => @course.to_param, :format => 'json' }
end
context "as teacher" do
before do
course_with_teacher_logged_in :course => @course
before :once do
course_with_teacher :course => @course
end
it "should create a section with default parameters" do
@ -273,7 +273,6 @@ describe SectionsController, type: :request do
context "as admin" do
before do
site_admin_user
user_session(@admin)
end
it "should set the sis source id" do
@ -289,7 +288,7 @@ describe SectionsController, type: :request do
end
describe "#update" do
before do
before :once do
course
@section = @course.course_sections.create! :name => "Test Section"
@section.update_attribute(:sis_source_id, "SISsy")
@ -298,8 +297,8 @@ describe SectionsController, type: :request do
end
context "as teacher" do
before do
course_with_teacher_logged_in :course => @course
before :once do
course_with_teacher :course => @course
end
it "should modify section data by id" do
@ -365,7 +364,6 @@ describe SectionsController, type: :request do
context "as admin" do
before do
site_admin_user
user_session(@admin)
end
it "should set the sis id" do
@ -380,7 +378,7 @@ describe SectionsController, type: :request do
end
describe "#delete" do
before do
before :once do
course
@section = @course.course_sections.create! :name => "Test Section"
@section.update_attribute(:sis_source_id, "SISsy")
@ -389,8 +387,8 @@ describe SectionsController, type: :request do
end
context "as teacher" do
before do
course_with_teacher_logged_in :course => @course
before :once do
course_with_teacher :course => @course
end
it "should delete a section by id" do
@ -434,7 +432,7 @@ describe SectionsController, type: :request do
end
describe "#crosslist" do
before do
before :once do
@dest_course = course
course
@section = @course.course_sections.create!
@ -442,9 +440,8 @@ describe SectionsController, type: :request do
end
context "as admin" do
before do
before :once do
site_admin_user
user_session(@admin)
end
it "should cross-list a section" do
@ -504,6 +501,7 @@ describe SectionsController, type: :request do
end
it "should confirm crosslist by sis id" do
user_session(@admin)
@dest_course.update_attribute(:sis_source_id, "blargh")
raw_api_call(:get, "/courses/#{@course.id}/sections/#{@section.id}/crosslist/confirm/#{@dest_course.sis_source_id}",
@params.merge(:action => 'crosslist_check', :course_id => @course.to_param, :section_id => @section.to_param, :new_course_id => @dest_course.sis_source_id))
@ -525,7 +523,7 @@ describe SectionsController, type: :request do
end
describe "#uncrosslist" do
before do
before :once do
@dest_course = course
course
@section = @course.course_sections.create!
@ -534,9 +532,8 @@ describe SectionsController, type: :request do
end
context "as admin" do
before do
before :once do
site_admin_user
user_session(@admin)
end
it "should un-crosslist a section" do

View File

@ -19,8 +19,11 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe "Services API", type: :request do
before do
before :once do
user_with_pseudonym(:active_all => true)
end
before :each do
@kal = mock('CanvasKaltura::ClientV3')
CanvasKaltura::ClientV3.stubs(:config).returns({
'domain' => 'kaltura.fake.local',

View File

@ -19,9 +19,8 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe SisImportsApiController, type: :request do
before do
before :once do
@user = user_with_pseudonym :active_all => true
user_session @user
@account = Account.default
@account.allow_sis_import = true
@account.save
@ -458,7 +457,6 @@ describe SisImportsApiController, type: :request do
it "should list sis imports for an account" do
@user = user_with_pseudonym :active_all => true
user_session @user
@account = Account.create(name: 'sis account')
@account.allow_sis_import = true
@account.save!

View File

@ -22,7 +22,7 @@ describe UsersController, type: :request do
include Api
include Api::V1::Assignment
before do
before :once do
course_with_student(:active_all => true)
end

View File

@ -23,7 +23,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../file_uploads_spec_helper'
describe 'Submissions Comment API', type: :request do
describe '#create_file' do
before do
before :once do
teacher_in_course active_all: true
student_in_course active_all: true
@assignment = @course.assignments.create! name: "blah",

View File

@ -21,9 +21,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../file_uploads_spec_helper'
describe 'Submissions API', type: :request do
before {
before :each do
HostUrl.stubs(:file_host_with_shard).returns(["www.example.com", Shard.default])
}
end
def submit_homework(assignment, student, opts = {:body => "test!"})
@submit_homework_time ||= Time.zone.at(0)
@ -75,7 +75,7 @@ describe 'Submissions API', type: :request do
end
describe "using section ids" do
before do
before :once do
@student1 = user(:active_all => true)
course_with_teacher(:active_all => true)
@default_section = @course.default_section
@ -267,8 +267,8 @@ describe 'Submissions API', type: :request do
end
context 'submission comment attachments' do
before do
course_with_student_logged_in(active_all: true)
before :once do
course_with_student(active_all: true)
@assignment = @course.assignments.create! name: "blah",
submission_types: "online_upload"
@attachment = Attachment.create! context: @assignment,
@ -1162,7 +1162,7 @@ describe 'Submissions API', type: :request do
end
describe "for_students non-admin" do
before do
before :once do
course_with_student :active_all => true
@student1 = @student
@student2 = student_in_course(:active_all => true).user
@ -1265,7 +1265,7 @@ describe 'Submissions API', type: :request do
end
context "observers" do
before do
before :once do
@observer = user :active_all => true
@course.enroll_user(@observer, 'ObserverEnrollment', :associated_user_id => @student1.id).accept!
@course.enroll_user(@observer, 'ObserverEnrollment', :allow_multiple_enrollments => true, :associated_user_id => @student2.id).accept!
@ -1302,7 +1302,7 @@ describe 'Submissions API', type: :request do
end
context "observer that is a student" do
before do
before :once do
@course.enroll_student(@observer, :allow_multiple_enrollments => true).accept!
submit_homework(@assignment1, @observer)
@assignment1.grade_student(@observer, grade: 5)
@ -2010,7 +2010,7 @@ describe 'Submissions API', type: :request do
end
context "create" do
before do
before :once do
course_with_student(:active_all => true)
assignment_model(:course => @course, :submission_types => "online_url", :points_possible => 12)
@url = "/api/v1/courses/#{@course.id}/assignments/#{@assignment.id}/submissions"
@ -2116,7 +2116,7 @@ describe 'Submissions API', type: :request do
end
context "submission file uploads" do
before do
before :once do
@assignment.update_attributes(:submission_types => 'online_upload')
@student1 = @student
course_with_student(:course => @course)
@ -2158,7 +2158,7 @@ describe 'Submissions API', type: :request do
end
context "draft assignments" do
before do
before :once do
course_with_teacher(:active_all => true)
student_in_course(:active_all => true)
@a2 = @course.assignments.create!({:title => 'assignment2'})

View File

@ -253,7 +253,7 @@ describe TabsController, type: :request do
end
describe "teacher in a course" do
before :each do
before :once do
course_with_teacher(active_all: true)
@tab_ids = [0, 1, 3, 8, 5, 6, 14, 2, 11, 15, 4, 10, 13]
@tab_lookup = {}.with_indifferent_access

View File

@ -20,7 +20,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe TermsApiController, type: :request do
describe "index" do
before do
before :once do
@account = Account.create(name: 'new')
account_admin_user(account: @account)
@account.enrollment_terms.scoped.delete_all

View File

@ -27,7 +27,7 @@ describe UsersController, type: :request do
@a2_json['assignment'] = controller.assignment_json(@a2,@user,session)
end
before do
before :once do
@teacher = course_with_teacher(:active_all => true, :user => user_with_pseudonym(:active_all => true))
@teacher_course = @course
@student_course = course(:active_all => true)
@ -43,6 +43,9 @@ describe UsersController, type: :request do
@teacher_course.enroll_student(student).accept!
@sub = @a2.reload.submit_homework(student, :submission_type => 'online_text_entry', :body => 'done')
@a2.reload
end
before :each do
@a1_json =
{
'type' => 'submitting',

View File

@ -30,7 +30,7 @@ describe UsersController, type: :request do
end
context "with current_user" do
before do
before :once do
course_with_teacher(:active_all => true, :user => user_with_pseudonym(:active_user => true))
@me = @user
# course_with_student(:active_all => true)

View File

@ -19,17 +19,17 @@
require File.expand_path(File.dirname(__FILE__) + '/../api_spec_helper')
describe UserObserveesController, type: :request do
let(:parent) { user_with_pseudonym(name: 'Parent Smith', active_all: true) }
let(:student) { student_pseudonym.user }
let(:student_pseudonym) { user_with_pseudonym(name: 'Child Smith', active_all: true); @pseudonym }
let(:student2) { student2_pseudonym.user }
let(:student2_pseudonym) { user_with_pseudonym(name: 'Another Smith', active_all: true); @pseudonym }
let(:allowed_admin) do
let_once(:parent) { user_with_pseudonym(name: 'Parent Smith', active_all: true) }
let_once(:student) { student_pseudonym.user }
let_once(:student_pseudonym) { user_with_pseudonym(name: 'Child Smith', active_all: true); @pseudonym }
let_once(:student2) { student2_pseudonym.user }
let_once(:student2_pseudonym) { user_with_pseudonym(name: 'Another Smith', active_all: true); @pseudonym }
let_once(:allowed_admin) do
a = account_admin_user_with_role_changes(active_all: true, role_changes: {manage_user_observers: true})
pseudonym(a)
a
end
let(:multi_admin) do
let_once(:multi_admin) do
a = account_admin_user_with_role_changes(active_all: true, role_changes: {manage_user_observers: true})
pseudonym(a)
account_admin_user_with_role_changes(active_all: true, user: a, account: external_account, role_changes: {manage_user_observers: true})
@ -42,11 +42,11 @@ describe UserObserveesController, type: :request do
a
end
let(:external_account) { account_model(name: 'External Account') }
let(:external_parent) { user_with_pseudonym(name: 'Parent External', active_all: true, account: external_account) }
let(:external_student) { external_student_pseudonym.user }
let(:external_student_pseudonym) { user_with_pseudonym(name: 'Child External', active_all: true, account: external_account); @pseudonym }
let(:external_allowed_admin) do
let_once(:external_account) { account_model(name: 'External Account') }
let_once(:external_parent) { user_with_pseudonym(name: 'Parent External', active_all: true, account: external_account) }
let_once(:external_student) { external_student_pseudonym.user }
let_once(:external_student_pseudonym) { user_with_pseudonym(name: 'Child External', active_all: true, account: external_account); @pseudonym }
let_once(:external_allowed_admin) do
a = account_admin_user_with_role_changes(active_all: true, role_changes: {manage_user_observers: true})
pseudonym(a, account: external_account)
a

View File

@ -30,7 +30,7 @@ class TestUserApi
end
describe "User Profile API", type: :request do
before do
before :once do
@admin = account_admin_user
course_with_student(:user => user_with_pseudonym(:name => 'Student', :username => 'pvuser@example.com'))
@student.pseudonym.update_attribute(:sis_user_id, 'sis-user-id')
@ -151,7 +151,7 @@ describe "User Profile API", type: :request do
end
context "user_services" do
before do
before :once do
@student.user_services.create! :service => 'skype', :service_user_name => 'user', :service_user_id => 'user', :visible => false
@student.user_services.create! :service => 'twitter', :service_user_name => 'user', :service_user_id => 'user', :visible => true
end

View File

@ -35,9 +35,7 @@ class TestUserApi
end
describe Api::V1::User do
before do
@test_api = TestUserApi.new
@test_api.services_enabled = []
before :once do
@admin = account_admin_user
course_with_student(:user => user_with_pseudonym(:name => 'Student', :username => 'pvuser@example.com'))
@student = @user
@ -47,6 +45,11 @@ describe Api::V1::User do
user_with_pseudonym(:user => @user)
end
before :each do
@test_api = TestUserApi.new
@test_api.services_enabled = []
end
context 'user_json' do
it 'should support optionally providing the avatar if avatars are enabled' do
@test_api.user_json(@student, @admin, {}, ['avatar_url'], @course).has_key?("avatar_url").should be_false
@ -136,14 +139,17 @@ describe Api::V1::User do
end
context "computed scores" do
before do
before :once do
@enrollment.computed_current_score = 95.0;
@enrollment.computed_final_score = 85.0;
def @course.grading_standard_enabled?; true; end
@student1_enrollment = @enrollment
@student2 = course_with_student(:course => @course).user
end
before :each do
def @course.grading_standard_enabled?; true; end
end
it "should return scores as admin" do
json = @test_api.user_json(@student, @admin, {}, [], @course, [@student1_enrollment])
json['enrollments'].first['grades'].should == {
@ -244,7 +250,7 @@ describe "Users API", type: :request do
"http://www.example.com/images/users/#{User.avatar_key(id)}?fallback=http%3A%2F%2Fwww.example.com%2Fimages%2Fmessages%2Favatar-50.png"
end
before do
before :once do
@admin = account_admin_user
course_with_student(:user => user_with_pseudonym(:name => 'Student', :username => 'pvuser@example.com', :active_user => true))
@student.pseudonym.update_attribute(:sis_user_id, 'sis-user-id')
@ -312,6 +318,11 @@ describe "Users API", type: :request do
include_examples "page view api"
describe "cassandra page views" do
before do
# can't use :once'd @student, since cassandra doesn't reset
student_in_course(:course => @course, :user => user_with_pseudonym(:name => 'Student', :username => 'pvuser2@example.com', :active_user => true))
@user = @admin
end
include_examples "cassandra page views"
include_examples "page view api"
end
@ -367,13 +378,13 @@ describe "Users API", type: :request do
it "should limit the maximum number of users returned" do
@account = @user.account
15.times do |n|
3.times do |n|
user = User.create(:name => "u#{n}")
user.pseudonyms.create!(:unique_id => "u#{n}@example.com", :account => @account)
end
api_call(:get, "/api/v1/accounts/#{@account.id}/users?per_page=12", :controller => "users", :action => "index", :account_id => @account.id.to_param, :format => 'json', :per_page => '12').size.should == 12
Setting.set('api_max_per_page', '5')
api_call(:get, "/api/v1/accounts/#{@account.id}/users?per_page=12", :controller => "users", :action => "index", :account_id => @account.id.to_param, :format => 'json', :per_page => '12').size.should == 5
api_call(:get, "/api/v1/accounts/#{@account.id}/users?per_page=2", :controller => "users", :action => "index", :account_id => @account.id.to_param, :format => 'json', :per_page => '2').size.should == 2
Setting.set('api_max_per_page', '1')
api_call(:get, "/api/v1/accounts/#{@account.id}/users?per_page=2", :controller => "users", :action => "index", :account_id => @account.id.to_param, :format => 'json', :per_page => '2').size.should == 1
end
it "should return unauthorized for users without permissions" do
@ -442,7 +453,7 @@ describe "Users API", type: :request do
end
context 'as a site admin' do
before do
before :once do
@site_admin = user_with_pseudonym
Account.site_admin.account_users.create!(user: @site_admin)
end
@ -513,7 +524,7 @@ describe "Users API", type: :request do
end
context "as a non-administrator" do
before do
before :once do
user(active_all: true)
end
@ -630,7 +641,7 @@ describe "Users API", type: :request do
end
describe "user account updates" do
before do
before :once do
# an outer before sets this
@student.pseudonym.update_attribute(:sis_user_id, nil)
@ -761,7 +772,7 @@ describe "Users API", type: :request do
end
describe "user settings" do
before do
before :once do
course_with_student(active_all: true)
account_admin_user
end
@ -900,7 +911,7 @@ describe "Users API", type: :request do
end
describe "user deletion" do
before do
before :once do
@admin = account_admin_user
course_with_student(:user => user_with_pseudonym(:name => 'Student', :username => 'student@example.com'))
@student = @user
@ -986,8 +997,8 @@ describe "Users API", type: :request do
end
end
describe "user merge" do
before do
describe "user merge" do
before :once do
@account = Account.default
@user1 = user_with_managed_pseudonym(
active_all: true, account: @account, name: 'Jony Ive',

View File

@ -432,6 +432,7 @@ end
c.before :record do
Account.clear_special_account_cache!
AdheresToPolicy::Cache.clear
Folder.reset_path_lookups!
end
end
@ -477,6 +478,7 @@ end
Notification.reset_cache!
ActiveRecord::Base.reset_any_instantiation!
Attachment.clear_cached_mime_ids
Folder.reset_path_lookups!
RoleOverride.clear_cached_contexts
Delayed::Job.redis.flushdb if Delayed::Job == Delayed::Backend::Redis::Job
Rails::logger.try(:info, "Running #{self.class.description} #{@method_name}")
@ -629,7 +631,6 @@ end
pseudonym(user, opts)
@pseudonym.sis_user_id = opts[:sis_user_id] || "U001"
@pseudonym.save!
@pseudonym.should be_managed_password
@pseudonym
end
@ -1518,6 +1519,59 @@ end
scope.pluck(:id).reverse
end
end
# create a bunch of courses at once, optionally enrolling a user in them
# records can either be the number of records to create, or an array of
# hashes of attributes you want to insert
def create_courses(records, options = {})
account = options[:account] || Account.default
records = records.times.map{ {} } if records.is_a?(Fixnum)
records = records.map { |record| course_valid_attributes.merge(account_id: account.id, root_account_id: account.id, workflow_state: 'available', enrollment_term_id: account.default_enrollment_term.id).merge(record) }
course_data = create_records(Course, records, options[:return_type])
course_ids = options[:return_type] == :record ?
course_data.map(&:id) :
course_data
if options[:account_associations]
create_records(CourseAccountAssociation, course_ids.map{ |id| {account_id: account.id, course_id: id, depth: 0}})
end
if user = options[:enroll_user]
section_ids = create_records(CourseSection, course_ids.map{ |id| {course_id: id, root_account_id: account.id, name: "Default Section", default_section: true}})
type = options[:enrollment_type] || "TeacherEnrollment"
create_records(Enrollment, course_ids.each_with_index.map{ |id, i| {course_id: id, user_id: user.id, type: type, course_section_id: section_ids[i], root_account_id: account.id, workflow_state: 'active'}})
end
course_data
end
def create_users(records, options = {})
records = records.times.map{ {} } if records.is_a?(Fixnum)
records = records.map { |record| valid_user_attributes.merge(workflow_state: "registered").merge(record) }
create_records(User, records, options[:return_type])
end
# create a bunch of users at once, and enroll them all in the same course
def create_users_in_course(course, records, options = {})
user_data = create_users(records, options)
create_enrollments(course, user_data, options)
user_data
end
def create_enrollments(course, users, options = {})
user_ids = users.first.is_a?(User) ?
users.map(&:id) :
users
section_id = options[:section_id] || course.default_section.id
type = options[:enrollment_type] || "StudentEnrollment"
create_records(Enrollment, user_ids.map{ |id| {course_id: course.id, user_id: id, type: type, course_section_id: section_id, root_account_id: course.account.id, workflow_state: 'active'}})
end
def create_assignments(course_ids, count_per_course = 1, fields = {})
course_ids = Array(course_ids)
course_ids *= count_per_course
create_records(Assignment, course_ids.each_with_index.map { |id, i| {context_id: id, context_type: 'Course', context_code: "course_#{id}", title: "#{id}:#{i}", workflow_state: 'published'}.merge(fields)})
end
end
class String