add provisioning report and fix security issue

closes #10201

test plan
* run report
* report should contain all active accounts, users, course ...

Change-Id: I591300670fb5fea0ca01b74c5fe90f0610997d24
Reviewed-on: https://gerrit.instructure.com/13260
Reviewed-by: Cody Cutrer <cody@instructure.com>
Tested-by: Jenkins <jenkins@instructure.com>
This commit is contained in:
rob orton 2012-08-27 15:02:32 -06:00 committed by Rob Orton
parent e31aa27b6b
commit 3369c4e2b3
7 changed files with 1108 additions and 929 deletions

View File

@ -0,0 +1,2 @@
<p><%= t('account_reports.sis_export.description.text', %{This report will export all the needed information that
relates to provisioning Canvas in its respective categories.}) %></p>

View File

@ -0,0 +1,3 @@
<p><%= t('account_reports.sis_export.description.text', %{ SIS Export report: This report will export all the needed
files for Users, Accounts, Terms, Courses, Sections, Enrollments, Groups, Group Memberships, and Cross Listings for an
SIS import in their respective categories.}) %></p>

View File

@ -39,6 +39,7 @@ Rails.configuration.to_prepare do
'sis_export_csv'=> {
:title => 'SIS Export',
:parameters_partial => true,
:description_partial => true,
:parameters => {
:users => {
:description => 'Get the SIS file for users'
@ -68,6 +69,40 @@ Rails.configuration.to_prepare do
:description => 'Get the SIS file for cross listed courses'
},
}
},
'provisioning_csv'=> {
:title => 'Provisioning',
:parameters_partial => 'sis_export_csv_parameters',
:description_partial => true,
:parameters => {
:users => {
:description => 'Get the Provisioning file for users'
},
:accounts => {
:description => 'Get the Provisioning file for accounts'
},
:terms => {
:description => 'Get the Provisioning file for terms'
},
:courses => {
:description => 'Get the Provisioning file for courses'
},
:sections => {
:description => 'Get the Provisioning file for sections'
},
:enrollments => {
:description => 'Get the Provisioning file for enrollments'
},
:groups => {
:description => 'Get the Provisioning file for groups'
},
:group_membership => {
:description => 'Get the Provisioning file for group_membership'
},
:xlist => {
:description => 'Get the Provisioning file for cross listed courses'
},
}
}
}
end

View File

@ -132,237 +132,12 @@ module Canvas::AccountReports
result
end
SIS_CSV_REPORTS = ["users", "accounts", "terms", "courses", "sections", "enrollments", "groups", "group_membership", "xlist"]
def self.sis_export_csv(account_report)
term = account_report.parameters["enrollment_term"].presence
reports = SIS_CSV_REPORTS & account_report.parameters.keys
if reports.length == 0
Canvas::AccountReports.message_recipient(account_report, "SIS export report for #{account_report.account.name} has been successfully generated.")
elsif reports.length == 1
csv = self.send(reports.first, term, account_report.account)
Canvas::AccountReports.message_recipient(account_report, "SIS export report for #{account_report.account.name} has been successfully generated.", csv)
csv
else
csvs = {}
reports.each do |report_name|
csvs[report_name] = self.send(report_name, term, account_report.account)
end
Canvas::AccountReports.message_recipient(account_report, "SIS export reports for #{account_report.account.name} have been successfully generated.", csvs)
csvs
end
SisExporter.new(account_report, {:sis_format => true}).csv
end
def self.users(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['user_id','login_id', 'password','first_name','last_name','email', 'status']
pseudonym = account.pseudonyms.active.scoped(:include => [ :user], :conditions => "sis_user_id IS NOT NULL")
pseudonym.each do |i|
row = []
row << i.sis_user_id
row << i.login
row << nil
row << i.user.first_name
row << i.user.last_name
row << i.user.email
row << i.workflow_state
csv << row
end
end
list_csv
end
def self.accounts(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['account_id','parent_account_id', 'name','status']
Account.find_each(:select => "accounts.*, parent_account.sis_source_id as parent_sis_source_id",
:joins => "INNER JOIN accounts as parent_account ON accounts.parent_account_id = parent_account.id",
:conditions => "accounts.sis_source_id IS NOT NULL and accounts.workflow_state = 'active' and accounts.root_account_id = #{account.id}") do |a|
row = []
row << a.sis_source_id
row << a.parent_sis_source_id
row << a.name
row << a.workflow_state
csv << row
end
end
list_csv
end
def self.terms(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['term_id','name','status', 'start_date', 'end_date']
terms = account.enrollment_terms.scoped(:conditions => "sis_source_id IS NOT NULL")
terms.each do |t|
row = []
row << t.sis_source_id
row << t.name
row << t.workflow_state
row << t.start_at.try(:iso8601)
row << t.end_at.try(:iso8601)
csv << row
end
end
list_csv
end
def self.courses(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['course_id','short_name', 'long_name','account_id','term_id', 'status', 'start_date', 'end_date']
if term
term = " and enrollment_term_id =#{term}"
else
term = ""
end
courses = account.all_courses.active.scoped(:conditions => "sis_source_id IS NOT NULL#{term}", :include => [:account, :enrollment_term])
courses.find_each do |c|
row = []
row << c.sis_source_id
row << c.course_code
row << c.name
row << c.account.try(:sis_source_id)
row << c.enrollment_term.try(:sis_source_id)
row << 'active'
if c.restrict_enrollments_to_course_dates
row << c.start_at.try(:iso8601)
row << c.conclude_at.try(:iso8601)
else
row << nil
row << nil
end
csv << row
end
end
list_csv
end
def self.sections(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['section_id', 'course_id', 'name', 'status', 'start_date', 'end_date', 'account_id']
if term
term = " and courses.enrollment_term_id =#{term}"
else
term = ""
end
sections = account.course_sections.active.scoped(:include => [:course, :account, :nonxlist_course], :conditions => "course_sections.sis_source_id IS NOT NULL#{term}")
sections.find_each do |s|
row = []
row << s.sis_source_id
row << (s.nonxlist_course || s.course).sis_source_id
row << s.name
row << s.workflow_state
if s.restrict_enrollments_to_section_dates
row << s.start_at.try(:iso8601)
row << s.end_at.try(:iso8601)
else
row << nil
row << nil
end
row << s.account.try(:sis_source_id)
csv << row
end
end
list_csv
end
def self.enrollments(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['course_id', 'user_id', 'role', 'section_id', 'status', 'associated_user_id']
if term
term = " and courses.enrollment_term_id = #{term}"
else
term = ""
end
Enrollment.find_each(:select => "enrollments.*, courses.sis_source_id as course_sis_id,
course_sections.sis_source_id as course_section_sis_id,
pseudonyms.sis_user_id as pseudonym_sis_id,
associated_user.sis_user_id as associated_user_sis_id,
CASE WHEN enrollments.type = 'TeacherEnrollment' THEN 'teacher'
WHEN enrollments.type='TaEnrollment' THEN 'ta'
WHEN enrollments.type='StudentEnrollment' THEN 'student'
WHEN enrollments.type='ObserverEnrollment' THEN 'observer' END as enrollment_type",
:joins => "INNER JOIN courses on courses.id = enrollments.course_id
INNER JOIN course_sections on course_sections.id = enrollments.course_section_id
INNER JOIN pseudonyms ON pseudonyms.user_id=enrollments.user_id
AND pseudonyms.sis_user_id IS NOT NULL AND pseudonyms.account_id=#{account.id}
LEFT OUTER JOIN pseudonyms as associated_user on associated_user.user_id = enrollments.associated_user_id
AND pseudonyms.sis_user_id IS NOT NULL AND pseudonyms.account_id=#{account.id}",
:conditions => "enrollments.root_account_id = #{account.id}
and enrollments.workflow_state = 'active'
and pseudonyms.sis_user_id IS NOT NULL
and (courses.sis_source_id IS NOT NULL or course_sections.sis_source_id IS NOT NULL)
#{term}") do |e|
row = []
row << e.course_sis_id
row << e.pseudonym_sis_id
row << e.enrollment_type
row << e.course_section_sis_id
row << 'active'
row << e.associated_user_sis_id
csv << row
end
end
list_csv
end
def self.groups(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['group_id', 'account_id', 'name', 'status']
Group.find_each(:select => "groups.*, accounts.sis_source_id as account_sis_id",
:joins => "INNER JOIN accounts on accounts.id = groups.account_id",
:conditions => "groups.sis_source_id IS NOT NULL and groups.root_account_id = #{account.id}") do |g|
row = []
row << g.sis_source_id
row << g.account_sis_id
row << g.name
row << g.workflow_state
csv << row
end
end
list_csv
end
def self.group_membership(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['group_id', 'user_id', 'status']
GroupMembership.find_each(:select => "group_memberships.*, groups.sis_source_id as group_sis_id, pseudonyms.sis_user_id as users_sis_id",
:joins => "INNER JOIN groups on groups.id = group_memberships.group_id
INNER JOIN pseudonyms ON pseudonyms.user_id=group_memberships.user_id
AND pseudonyms.sis_user_id IS NOT NULL AND pseudonyms.account_id=#{account.id}",
:conditions => "groups.root_account_id = #{account.id}
and group_memberships.sis_batch_id IS NOT NULL
and group_memberships.workflow_state = 'accepted'") do |gm|
row = []
row << gm.group_sis_id
row << gm.users_sis_id
row << gm.workflow_state
csv << row
end
end
list_csv
end
def self.xlist(term, account)
list_csv = FasterCSV.generate do |csv|
csv << ['xlist_course_id','section_id', 'status']
if term
term = " and courses.enrollment_term_id =#{term}"
else
term = ""
end
xlists = account.course_sections.active.scoped(:include => [:course, :account, :nonxlist_course], :conditions => "courses.sis_source_id IS NOT NULL AND course_sections.sis_source_id IS NOT NULL AND course_sections.nonxlist_course_id IS NOT NULL#{term}")
xlists.find_each do |x|
row = []
row << x.course.sis_source_id
row << x.sis_source_id
row << x.workflow_state
csv << row
end
end
list_csv
def self.provisioning_csv(account_report)
SisExporter.new(account_report, {:sis_format => false}).csv
end
end
end

View File

@ -0,0 +1,319 @@
#
# Copyright (C) 2012 Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
module Canvas::AccountReports
class SisExporter
SIS_CSV_REPORTS = ["users", "accounts", "terms", "courses", "sections", "enrollments", "groups", "group_membership", "xlist"]
def initialize(account_report, params = {})
@account_report = account_report
@term = @account_report.parameters["enrollment_term"].presence
@account = @account_report.account
@reports = SIS_CSV_REPORTS & @account_report.parameters.keys
@sis_format = params[:sis_format]
end
def csv
if @reports.length == 0
Canvas::AccountReports.message_recipient(@account_report, "SIS export report for #{@account.name} has been successfully generated.")
elsif @reports.length == 1
csv = self.send(@reports.first)
Canvas::AccountReports.message_recipient(@account_report, "SIS export report for #{@account.name} has been successfully generated.", csv)
csv
else
csvs = {}
@reports.each do |report_name|
csvs[report_name] = self.send(report_name)
end
Canvas::AccountReports.message_recipient(@account_report, "SIS export reports for #{@account.name} have been successfully generated.", csvs)
csvs
end
end
def users
list_csv = FasterCSV.generate do |csv|
headers = ['user_id','login_id', 'password','first_name','last_name','email', 'status']
headers.unshift 'canvas_user_id' unless @sis_format
csv << headers
users = @account.pseudonyms.active.scoped(:include => :user)
users = users.scoped(:conditions => 'sis_user_id IS NOT NULL') if @sis_format
users.find_each do |i|
row = []
row << i.user_id unless @sis_format
row << i.sis_user_id
row << i.login
row << nil
row << i.user.first_name
row << i.user.last_name
row << i.user.email
row << i.workflow_state
csv << row
end
end
list_csv
end
def accounts
list_csv = FasterCSV.generate do |csv|
headers = ['account_id','parent_account_id', 'name','status']
headers.unshift 'canvas_account_id' unless @sis_format
csv << headers
accounts = Account.active.scoped(:conditions => ["accounts.root_account_id=?", @account.id],
:select => "accounts.*, parent_account.sis_source_id as parent_sis_source_id",
:joins => "INNER JOIN accounts as parent_account ON accounts.parent_account_id = parent_account.id")
accounts = accounts.scoped(:conditions => "accounts.sis_source_id IS NOT NULL") if @sis_format
accounts.find_each do |a|
row = []
row << a.id unless @sis_format
row << a.sis_source_id
row << a.parent_sis_source_id
row << a.name
row << a.workflow_state
csv << row
end
end
list_csv
end
def terms
list_csv = FasterCSV.generate do |csv|
headers = ['term_id','name','status', 'start_date', 'end_date']
headers.unshift 'canvas_term_id' unless @sis_format
csv << headers
terms = @account.enrollment_terms.active
terms = terms.scoped(:conditions => "sis_source_id IS NOT NULL") if @sis_format
terms.each do |t|
row = []
row << t.id unless @sis_format
row << t.sis_source_id
row << t.name
row << t.workflow_state
row << t.start_at.try(:iso8601)
row << t.end_at.try(:iso8601)
csv << row
end
end
list_csv
end
def courses
list_csv = FasterCSV.generate do |csv|
headers = ['course_id','short_name', 'long_name','account_id','term_id', 'status', 'start_date', 'end_date']
headers.unshift 'canvas_course_id' unless @sis_format
csv << headers
courses = @account.all_courses.active.scoped(:include => [:account, :enrollment_term],
:select => "courses.*,
CASE WHEN courses.workflow_state = 'claimed' THEN 'unpublished'
WHEN courses.workflow_state = 'created' THEN 'unpublished'
WHEN courses.workflow_state = 'available' THEN 'active' END as course_state")
courses = courses.scoped(:conditions => ["enrollment_term_id=?", @term]) if @term
courses = courses.scoped(:conditions => "sis_source_id IS NOT NULL") if @sis_format
courses.find_each do |c|
row = []
row << c.id unless @sis_format
row << c.sis_source_id
row << c.course_code
row << c.name
row << c.account.try(:sis_source_id)
row << c.enrollment_term.try(:sis_source_id)
row << 'active' if @sis_format
row << c.course_state unless @sis_format
if c.restrict_enrollments_to_course_dates
row << c.start_at.try(:iso8601)
row << c.conclude_at.try(:iso8601)
else
row << nil
row << nil
end
csv << row
end
end
list_csv
end
def sections
list_csv = FasterCSV.generate do |csv|
headers = ['section_id', 'course_id', 'name', 'status', 'start_date', 'end_date', 'account_id']
unless @sis_format
headers = [ 'canvas_section_id', 'section_id', 'canvas_course_id', 'course_id', 'name', 'status', 'start_date', 'end_date', 'canvas_account_id', 'account_id']
end
csv << headers
sections = @account.course_sections.active.scoped(
:select => "course_sections.*,
Coalesce(non_xlist_courses.sis_source_id, real_courses.sis_source_id) as section_course_sis_id,
accounts.sis_source_id as account_sis_id",
:joins => "INNER JOIN courses as real_courses ON course_sections.course_id = real_courses.id
LEFT OUTER JOIN courses as non_xlist_courses ON course_sections.nonxlist_course_id = non_xlist_courses.id
LEFT OUTER JOIN accounts on course_sections.account_id = accounts.id")
sections = sections.scoped(:conditions => ["real_courses.enrollment_term_id=?", @term]) if @term
sections = sections.scoped(:conditions => "course_sections.sis_source_id IS NOT NULL
and (non_xlist_courses.sis_source_id IS NOT NULL
or real_courses.sis_source_id IS NOT NULL)") if @sis_format
sections.find_each do |s|
row = []
row << s.id unless @sis_format
row << s.sis_source_id
row << (s.nonxlist_course_id || s.course_id) unless @sis_format
row << s.section_course_sis_id
row << s.name
row << s.workflow_state
if s.restrict_enrollments_to_section_dates
row << s.start_at.try(:iso8601)
row << s.end_at.try(:iso8601)
else
row << nil
row << nil
end
row << s.account_id unless @sis_format
row << s.try(:account_sis_id)
csv << row
end
end
list_csv
end
def enrollments
list_csv = FasterCSV.generate do |csv|
headers = ['course_id', 'user_id', 'role', 'section_id', 'status', 'associated_user_id']
unless @sis_format
headers = ['canvas_course_id', 'course_id', 'canvas_user_id', 'user_id', 'role', 'canvas_section_id', 'section_id', 'status', 'canvas_associated_user_id', 'associated_user_id']
end
csv << headers
parameters = {}
parameters[:root_account_id] = @account.id
if @term
parameters[:term ] = @term
end
enrollments = Enrollment.active.scoped(:select => "enrollments.*, courses.sis_source_id as course_sis_id,
course_sections.sis_source_id as course_section_sis_id,
pseudonyms.sis_user_id as pseudonym_sis_id,
associated_user.sis_user_id as associated_user_sis_id,
CASE WHEN enrollments.type = 'TeacherEnrollment' THEN 'teacher'
WHEN enrollments.type='TaEnrollment' THEN 'ta'
WHEN enrollments.type='StudentEnrollment' THEN 'student'
WHEN enrollments.type='ObserverEnrollment' THEN 'observer' END as enrollment_type",
:joins => "INNER JOIN courses on courses.id = enrollments.course_id
INNER JOIN course_sections on course_sections.id = enrollments.course_section_id
INNER JOIN pseudonyms ON pseudonyms.user_id=enrollments.user_id
LEFT OUTER JOIN pseudonyms as associated_user on associated_user.user_id = enrollments.associated_user_id
AND associated_user.account_id = #{@account.id}",
:conditions => ["enrollments.root_account_id = :root_account_id
AND enrollments.workflow_state = 'active'
AND pseudonyms.account_id = :root_account_id", parameters])
enrollments = enrollments.scoped(:conditions => ["courses.enrollment_term_id = :term", parameters]) if @term
enrollments = enrollments.scoped(:conditions => "pseudonyms.sis_user_id IS NOT NULL
AND (courses.sis_source_id IS NOT NULL or course_sections.sis_source_id IS NOT NULL)") if @sis_format
enrollments.find_each do |e|
row = []
row << e.course_id unless @sis_format
row << e.course_sis_id
row << e.user_id unless @sis_format
row << e.pseudonym_sis_id
row << e.enrollment_type
row << e.course_section_id unless @sis_format
row << e.course_section_sis_id
row << 'active'
row << e.associated_user_id unless @sis_format
row << e.associated_user_sis_id
csv << row
end
end
list_csv
end
def groups
list_csv = FasterCSV.generate do |csv|
headers = ['group_id', 'account_id', 'name', 'status']
unless @sis_format
headers = ['canvas_group_id', 'group_id', 'canvas_account_id', 'account_id', 'name', 'status']
end
csv << headers
groups = Group.active.scoped(:select => "groups.*, accounts.sis_source_id as account_sis_id",
:joins => "INNER JOIN accounts on accounts.id = groups.account_id",
:conditions => ["groups.root_account_id=?", @account.id])
groups = groups.scoped(:conditions => "groups.sis_source_id IS NOT NULL") if @sis_format
groups.find_each do |g|
row = []
row << g.id unless @sis_format
row << g.sis_source_id
row << g.account_id unless @sis_format
row << g.account_sis_id
row << g.name
row << g.workflow_state
csv << row
end
end
list_csv
end
def group_membership
list_csv = FasterCSV.generate do |csv|
headers = ['group_id', 'user_id', 'status']
unless @sis_format
headers = ['canvas_group_id', 'group_id','canvas_user_id', 'user_id', 'status']
end
csv << headers
group_members = GroupMembership.active.scoped(:select => "group_memberships.*, groups.sis_source_id as group_sis_id, pseudonyms.sis_user_id as user_sis_id",
:joins => "INNER JOIN groups on groups.id = group_memberships.group_id
INNER JOIN pseudonyms ON pseudonyms.user_id=group_memberships.user_id",
:conditions => ["groups.root_account_id=?
AND pseudonyms.account_id=?
AND group_memberships.workflow_state in ('accepted', 'invited')", @account.id, @account.id])
group_members = group_members.scoped(:conditions => "pseudonyms.sis_user_id IS NOT NULL
AND group_memberships.sis_batch_id IS NOT NULL
AND group_memberships.workflow_state in ('accepted')") if @sis_format
group_members.find_each do |gm|
row = []
row << gm.group_id unless @sis_format
row << gm.group_sis_id
row << gm.user_id unless @sis_format
row << gm.user_sis_id
row << gm.workflow_state
csv << row
end
end
list_csv
end
def xlist
list_csv = FasterCSV.generate do |csv|
headers = ['xlist_course_id', 'section_id', 'status']
unless @sis_format
headers = ['canvas_xlist_course_id', 'xlist_course_id', 'canvas_section_id', 'section_id', 'status']
end
csv << headers
cross_listings = @account.course_sections.active.scoped(:include => [:course, :account, :nonxlist_course],
:conditions => "course_sections.nonxlist_course_id IS NOT NULL")
cross_listings = cross_listings.scoped(:conditions => ["courses.enrollment_term_id=?", @term]) if @term
cross_listings = cross_listings.scoped(:conditions => "courses.sis_source_id IS NOT NULL AND course_sections.sis_source_id IS NOT NULL") if @sis_format
cross_listings.find_each do |x|
row = []
row << x.course_id unless @sis_format
row << x.course.sis_source_id
row << x.id unless @sis_format
row << x.sis_source_id
row << x.workflow_state
csv << row
end
end
list_csv
end
end
end

View File

@ -350,706 +350,6 @@ describe "Default Account Reports" do
end
def run_report(parameters = {}, column = 0)
account_report = AccountReport.new(:user => @admin, :account => @account, :report_type => "sis_export_csv")
account_report.parameters = {}
account_report.parameters = parameters
account_report.save
csv_report = Canvas::AccountReports::Default.sis_export_csv(account_report)
if csv_report.is_a? Hash
csv_report.inject({}) do |result, (key, csv)|
all_parsed = FasterCSV.parse(csv).to_a
all_parsed[1..-1].sort_by { |r| r[column] }
result[key] = all_parsed
result
end
else
all_parsed = FasterCSV.parse(csv_report).to_a
all_parsed[1..-1].sort_by { |r| r[column] }
end
end
describe "SIS export reports" do
it "should run the SIS Users" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
@admin = account_admin_user(:account => @account)
user1 = user_with_pseudonym(:active_all => true, :account => @account, :name => "John St. Clair", :sortable_name => "St. Clair, John", :username => 'john@stclair.com')
@user.pseudonym.sis_user_id = "user_sis_id_01"
@user.pseudonym.save!
user2 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelbolton.com', :name => 'Michael Bolton', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_02"
@user.pseudonym.save!
user3 = user_with_pseudonym(:name => 'Rick Astley', :account => @account)
#user3 has no sis_id and should not be in the report
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["users"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0][0].should == user1.pseudonym.sis_user_id
parsed[0][1].should == user1.pseudonym.login
parsed[0][2].should == nil
parsed[0][3].should == "John St."
parsed[0][4].should == "Clair"
parsed[0][5].should == "john@stclair.com"
parsed[0][6].should == "active"
parsed[1][0].should == user2.pseudonym.sis_user_id
parsed[1][1].should == user2.pseudonym.login
parsed[1][2].should == nil
parsed[1][3].should == "Michael"
parsed[1][4].should == "Bolton"
parsed[1][5].should == "micheal@michaelbolton.com"
parsed[1][6].should == "active"
parameters = {}
parameters["users"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0].should == ["user_sis_id_01", "john@stclair.com", nil, "John St.", "Clair", "john@stclair.com", "active"]
parsed[1].should == ["user_sis_id_02", "micheal@michaelbolton.com", nil, "Michael", "Bolton", "micheal@michaelbolton.com", "active"]
end
it "should run the SIS Accounts" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
sub_sub_account = Account.create(:parent_account => sub_account, :name => 'ESL')
sub_sub_account.sis_source_id = 'subsub1'
sub_sub_account.save!
sub_account2 = Account.create(:parent_account => @account, :name => 'Math')
sub_account2.sis_source_id = 'sub2'
sub_account2.save!
sub_account3 = Account.create(:parent_account => @account, :name => 'other')
#sub_account 3 does not have sis id and should not be in the report
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["accounts"] = true
parsed = run_report(parameters)
parsed.length.should == 3
parsed[0][0].should == sub_account.sis_source_id
parsed[0][1].should == nil
parsed[0][2].should == "English"
parsed[0][3].should == "active"
parsed[1][0].should == sub_account2.sis_source_id
parsed[1][1].should == nil
parsed[1][2].should == "Math"
parsed[1][3].should == "active"
parsed[2][0].should == sub_sub_account.sis_source_id
parsed[2][1].should == sub_account.sis_source_id
parsed[2][2].should == "ESL"
parsed[2][3].should == "active"
parameters = {}
parameters["accounts"] = true
parsed = run_report(parameters)
parsed.length.should == 3
parsed[0].should == ["sub1", nil, "English", "active"]
parsed[1].should == ["sub2", nil, "Math", "active"]
parsed[2].should == ["subsub1", "sub1", "ESL", "active"]
end
it "should run the SIS Terms" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
term2 = EnrollmentTerm.create(:name => 'Winter', :start_at => '07-01-2013', :end_at => '28-04-2013')
term2.root_account = @account
term2.sis_source_id = 'winter13'
term2.save!
#default term should not be included in the report since it does not have an sis id
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["terms"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0][0].should == term1.sis_source_id
parsed[0][1].should == term1.name
parsed[0][2].should == "active"
parsed[0][3].should == term1.start_at.iso8601
parsed[0][4].should == term1.end_at.iso8601
parsed[1][0].should == term2.sis_source_id
parsed[1][1].should == term2.name
parsed[1][2].should == "active"
parsed[1][3].should == term2.start_at.iso8601
parsed[1][4].should == term2.end_at.iso8601
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["terms"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0].should == ["fall12", "Fall", "active", "2012-08-20T00:00:00Z", "2012-12-20T00:00:00Z"]
parsed[1].should == ["winter13", "Winter", "active", "2013-01-07T00:00:00Z", "2013-04-28T00:00:00Z"]
end
it "should run the SIS Courses" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
start_at = 1.day.ago
end_at = 10.days.from_now
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :start_at => start_at, :conclude_at => end_at, :account => sub_account, :enrollment_term => term1)
course1.save
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.restrict_enrollments_to_course_dates = true
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :conclude_at => end_at, :account => @account)
course2.save
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.restrict_enrollments_to_course_dates = true
course2.save!
course3 = Course.new(:name => 'Science 101', :course_code => 'SCI101', :account => @account)
course3.save
course3.sis_source_id = "SIS_COURSE_ID_3"
course3.save!
course4 = Course.new(:name => 'self help')
#course4 should not show up since it does not have sis id
course5 = Course.new(:name => 'math 100', :course_code => 'ENG101', :start_at => start_at, :conclude_at => end_at, :account => sub_account, :enrollment_term => term1)
course5.workflow_state = 'completed'
course5.save!
#course5 should not show up since it is not active
parameters = {}
parameters["courses"] = true
parsed = run_report(parameters)
parsed.length.should == 3
parsed[0][0].should == course1.sis_source_id
parsed[0][1].should == course1.course_code
parsed[0][2].should == course1.name
parsed[0][3].should == sub_account.sis_source_id
parsed[0][4].should == term1.sis_source_id
parsed[0][5].should == "active"
parsed[0][6].should == start_at.iso8601
parsed[0][7].should == end_at.iso8601
parsed[1][0].should == course2.sis_source_id
parsed[1][1].should == course2.course_code
parsed[1][2].should == course2.name
parsed[1][3].should == nil
parsed[1][4].should == nil
parsed[1][5].should == "active"
parsed[1][6].should == nil
parsed[1][7].should == end_at.iso8601
parsed[2][0].should == course3.sis_source_id
parsed[2][1].should == course3.course_code
parsed[2][2].should == course3.name
parsed[2][3].should == nil
parsed[2][4].should == nil
parsed[2][5].should == "active"
parsed[2][6].should == nil
parsed[2][7].should == nil
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["courses"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0].should == ["SIS_COURSE_ID_2", "MAT101", "Math 101", nil, nil, "active", nil, end_at.iso8601]
parsed[1].should == ["SIS_COURSE_ID_3", "SCI101", "Science 101", nil, nil, "active", nil, nil]
end
it "should run the SIS Sections" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
start_at = 1.day.ago
end_at = 10.days.from_now
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :start_at => start_at, :conclude_at => end_at, :account => sub_account)
course1.save
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :conclude_at => end_at, :account => @account, :enrollment_term => term1)
course2.save
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.save!
section1 = CourseSection.new(:name => 'English_01', :course => course1, :account => sub_account, :start_at => start_at, :end_at => end_at)
section1.sis_source_id = 'english_section_1'
section1.root_account_id = @account.id
section1.restrict_enrollments_to_section_dates = true
section1.save!
section2 = CourseSection.new(:name => 'English_02', :course => course1, :end_at => end_at)
section2.sis_source_id = 'english_section_2'
section2.root_account_id = @account.id
section2.restrict_enrollments_to_section_dates = true
section2.save!
section3 = CourseSection.new(:name => 'Math_01', :course => course2, :end_at => end_at)
section3.sis_source_id = 'english_section_3'
section3.root_account_id = @account.id
section3.restrict_enrollments_to_section_dates = true
section3.save!
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["sections"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0][0].should == section1.sis_source_id
parsed[0][1].should == course1.sis_source_id
parsed[0][2].should == section1.name
parsed[0][3].should == "active"
parsed[0][4].should == start_at.iso8601
parsed[0][5].should == end_at.iso8601
parsed[0][6].should == sub_account.sis_source_id
parsed[1][0].should == section2.sis_source_id
parsed[1][1].should == course1.sis_source_id
parsed[1][2].should == section2.name
parsed[1][3].should == "active"
parsed[1][4].should == nil
parsed[1][5].should == end_at.iso8601
parsed[1][6].should == nil
parameters = {}
parameters["sections"] = true
parsed = run_report(parameters)
parsed.length.should == 3
parsed[0][0].should == section1.sis_source_id
parsed[0][1].should == course1.sis_source_id
parsed[0][2].should == section1.name
parsed[0][3].should == "active"
parsed[0][4].should == start_at.iso8601
parsed[0][5].should == end_at.iso8601
parsed[0][6].should == sub_account.sis_source_id
parsed[1][0].should == section2.sis_source_id
parsed[1][1].should == course1.sis_source_id
parsed[1][2].should == section2.name
parsed[1][3].should == "active"
parsed[1][4].should == nil
parsed[1][5].should == end_at.iso8601
parsed[1][6].should == nil
parsed[2].should == ["english_section_3", "SIS_COURSE_ID_2", "Math_01", "active", nil, end_at.iso8601, nil]
end
it "should run the SIS Enrollments" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :account => @account)
course1.save
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :account => @account, :enrollment_term => term1)
course2.save
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.save!
course3 = Course.new(:name => 'Science 101', :course_code => 'SCI101', :account => @account)
course3.save!
#this course should not be in the report since it does not have an sis id
section1 = CourseSection.new(:name => 'sci_01', :course => course3)
section1.sis_source_id = 'science_section_1'
section1.root_account_id = @account.id
section1.save!
user1 = user_with_pseudonym(:active_all => true, :account => @account, :name => "John St. Clair", :sortable_name => "St. Clair, John", :username => 'john@stclair.com')
@user.pseudonym.sis_user_id = "user_sis_id_01"
@user.pseudonym.save!
user2 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelbolton.com', :name => 'Michael Bolton', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_02"
@user.pseudonym.save!
user3 = user_with_pseudonym(:active_all => true, :account => @account, :name => "Rick Astley", :sortable_name => "Astley, Rick", :username => 'rick@roll.com')
@user.pseudonym.sis_user_id = "user_sis_id_03"
@user.pseudonym.save!
user4 = user_with_pseudonym(:active_all => true, :username => 'jason@donovan.com', :name => 'Jason Donovan', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_04"
@user.pseudonym.save!
user5 = user_with_pseudonym(:name => 'James Brown', :account => @account)
#user5 has no sis_id and should not be in the report
user6 = user_with_pseudonym(:active_all => true, :username => 'john@smith.com', :name => 'John Smith',:sortable_name => "Smith, John", :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_06"
@user.pseudonym.save!
enrollment1 = course1.enroll_user(user1, 'ObserverEnrollment')
enrollment1.invite
enrollment1.accept
enrollment1.save!
enrollment2 = course3.enroll_user(user2, 'StudentEnrollment')
enrollment2.invite
enrollment2.accept
enrollment2.save!
enrollment3 = course1.enroll_user(user2, 'TaEnrollment')
enrollment3.accept
enrollment3.save!
user2.reload
enrollment4 = course1.enroll_user(user3, 'StudentEnrollment')
enrollment4.invite
enrollment4.accept
enrollment4.save!
enrollment5 = course2.enroll_user(user3, 'StudentEnrollment')
enrollment5.invite
enrollment5.accept
enrollment5.save!
user3.reload
enrollment6 = course1.enroll_user(user4, 'TeacherEnrollment')
enrollment6.accept
enrollment6.save!
enrollment7 = course2.enroll_user(user1, 'ObserverEnrollment')
enrollment7.associated_user_id = user3.id
enrollment7.invite
enrollment7.accept
enrollment7.save!
user1.reload
enrollment8 = course2.enroll_user(user5, 'TeacherEnrollment')
enrollment8.accept
enrollment8.save!
user5.reload
enrollment9 = section1.enroll_user(user4, 'TeacherEnrollment')
enrollment9.accept
enrollment9.save!
user4.reload
enrollment10 = course1.enroll_user(user6, 'TeacherEnrollment')
enrollment10.accept
enrollment10.save!
enrollment10.workflow_state = 'completed'
enrollment10.save!
user6.reload
parameters = {}
parameters["enrollments"] = true
parsed = run_report(parameters, 1)
parsed.length.should == 7
parsed[0].should == ["SIS_COURSE_ID_1", "user_sis_id_01", "observer", nil, "active", nil]
parsed[1].should == ["SIS_COURSE_ID_2", "user_sis_id_01", "observer", nil, "active", "user_sis_id_03"]
parsed[2].should == ["SIS_COURSE_ID_1", "user_sis_id_02", "ta", nil, "active", nil]
parsed[3].should == ["SIS_COURSE_ID_1", "user_sis_id_03", "student", nil, "active", nil]
parsed[4].should == ["SIS_COURSE_ID_2", "user_sis_id_03", "student", nil, "active", nil]
parsed[5].should == ["SIS_COURSE_ID_1", "user_sis_id_04", "teacher", nil, "active", nil]
parsed[6].should == [nil, "user_sis_id_04", "teacher", "science_section_1", "active", nil]
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["enrollments"] = true
parsed = run_report(parameters, 1)
parsed.length.should == 5
parsed[0].should == ["SIS_COURSE_ID_1", "user_sis_id_01", "observer", nil, "active", nil]
parsed[1].should == ["SIS_COURSE_ID_1", "user_sis_id_02", "ta", nil, "active", nil]
parsed[2].should == ["SIS_COURSE_ID_1", "user_sis_id_03", "student", nil, "active", nil]
parsed[3].should == ["SIS_COURSE_ID_1", "user_sis_id_04", "teacher", nil, "active", nil]
parsed[4].should == [nil, "user_sis_id_04", "teacher", "science_section_1", "active", nil]
end
it "should run the SIS Groups" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
group1 = @account.groups.create(:name => 'group1name')
group1.sis_source_id = 'group1sis'
group1.save!
group2 = sub_account.groups.create(:name => 'group2name')
group2.sis_source_id = 'group2sis'
group2.save!
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["groups"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0].should == ["group1sis", nil, "group1name", "available"]
parsed[1].should == ["group2sis", "sub1", "group2name", "available"]
parameters = {}
parameters["groups"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0].should == ["group1sis", nil, "group1name", "available"]
parsed[1].should == ["group2sis", "sub1", "group2name", "available"]
end
it "should run the SIS Groups Memberships" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
user1 = user_with_pseudonym(:active_all => true, :account => @account, :name => "John St. Clair", :sortable_name => "St. Clair, John", :username => 'john@stclair.com')
@user.pseudonym.sis_user_id = "user_sis_id_01"
@user.pseudonym.save!
user2 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelbolton.com', :name => 'Michael Bolton', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_02"
@user.pseudonym.save!
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
group1 = @account.groups.create(:name => 'group1name')
group1.sis_source_id = 'group1sis'
group1.save!
group2 = sub_account.groups.create(:name => 'group2name')
group2.sis_source_id = 'group2sis'
group2.save!
gm1 = GroupMembership.create(:group => group1, :user => user1, :workflow_state => "accepted")
gm1.sis_batch_id = 1
gm1.save!
gm2 = GroupMembership.create(:group => group2, :user => user2, :workflow_state => "accepted")
gm2.sis_batch_id = 1
gm2.save!
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["group_membership"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0].should == [group1.sis_source_id, "user_sis_id_01", "accepted"]
parsed[1].should == [group2.sis_source_id, "user_sis_id_02", "accepted"]
parameters = {}
parameters["group_membership"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0].should == [group1.sis_source_id, "user_sis_id_01", "accepted"]
parsed[1].should == [group2.sis_source_id, "user_sis_id_02", "accepted"]
end
it "should run the x list report" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :account => @account, :enrollment_term => term1)
course1.save
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :account => @account, :enrollment_term => term1)
course2.save
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.save!
course3 = Course.new(:name => 'Science 101', :course_code => 'SCI101', :account => @account)
course3.save
course3.sis_source_id = "SIS_COURSE_ID_3"
course3.save!
course4 = Course.new(:name => 'Science 1011', :course_code => 'SCI1011', :account => @account)
course4.save
course4.sis_source_id = "SIS_COURSE_ID_4"
course4.save!
section1 = CourseSection.new(:name => 'English_01', :course => course1)
section1.sis_source_id = 'english_section_1'
section1.root_account_id = @account.id
section1.save!
section2 = CourseSection.new(:name => 'English_02', :course => course2)
section2.sis_source_id = 'english_section_2'
section2.root_account_id = @account.id
section2.save!
section3 = CourseSection.new(:name => 'Math_01', :course => course3)
section3.sis_source_id = 'english_section_3'
section3.root_account_id = @account.id
section3.save!
section4 = CourseSection.new(:name => 'Math_012', :course => course4)
section4.sis_source_id = 'english_section_4'
section4.root_account_id = @account.id
section4.save!
section1.crosslist_to_course(course2)
section3.crosslist_to_course(course4)
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["xlist"] = true
parsed = run_report(parameters)
parsed.length.should == 1
parsed[0].should == ["SIS_COURSE_ID_4", "english_section_3", "active"]
parameters = {}
parameters["xlist"] = true
parsed = run_report(parameters)
parsed.length.should == 2
parsed[0].should == ["SIS_COURSE_ID_2", "english_section_1", "active"]
parsed[1].should == ["SIS_COURSE_ID_4", "english_section_3", "active"]
end
it "should run the SIS Export" do
@account = Account.default
@admin = account_admin_user(:account => @account)
user1 = user_with_pseudonym(:active_all => true, :account => @account, :name => "John St. Clair", :sortable_name => "St. Clair, John", :username => 'john@stclair.com')
@user.pseudonym.sis_user_id = "user_sis_id_01"
@user.pseudonym.save!
user2 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelbolton.com', :name => 'Michael Bolton', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_02"
@user.pseudonym.save!
user3 = user_with_pseudonym(:name => 'Rick Astley', :account => @account)
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
sub_sub_account = Account.create(:parent_account => sub_account, :name => 'ESL')
sub_sub_account.sis_source_id = 'subsub1'
sub_sub_account.save!
sub_account2 = Account.create(:parent_account => @account, :name => 'Math')
sub_account2.sis_source_id = 'sub2'
sub_account2.save!
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
term2 = EnrollmentTerm.create(:name => 'Winter', :start_at => '07-01-2013', :end_at => '28-04-2013')
term2.root_account = @account
term2.sis_source_id = 'winter13'
term2.save!
start_at = 1.day.ago
end_at = 10.days.from_now
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :start_at => start_at, :conclude_at => end_at, :account => sub_account, :enrollment_term => term1)
course1.save
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.restrict_enrollments_to_course_dates = true
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :conclude_at => end_at, :account => @account)
course2.save
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.restrict_enrollments_to_course_dates = true
course2.save!
course3 = Course.new(:name => 'Science 101', :course_code => 'SCI101', :account => @account)
course3.save
course3.sis_source_id = "SIS_COURSE_ID_3"
course3.save!
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["accounts"] = true
parameters["users"] = true
parameters["courses"] = true
parsed = run_report(parameters)
accounts_report = parsed["accounts"][1..-1].sort_by { |r| r[0] }
accounts_report[0].should == ["sub1", nil, "English", "active"]
accounts_report[1].should == ["sub2", nil, "Math", "active"]
accounts_report[2].should == ["subsub1", "sub1", "ESL", "active"]
users_report = parsed["users"][1..-1].sort_by { |r| r[0] }
users_report[0].should == ["user_sis_id_01", "john@stclair.com", nil, "John St.", "Clair", "john@stclair.com", "active"]
users_report[1].should == ["user_sis_id_02", "micheal@michaelbolton.com", nil, "Michael", "Bolton", "micheal@michaelbolton.com", "active"]
courses_report = parsed["courses"][1..-1].sort_by { |r| r[0] }
courses_report[0].should == ["SIS_COURSE_ID_2", "MAT101", "Math 101", nil, nil, "active", nil, end_at.iso8601]
courses_report[1].should == ["SIS_COURSE_ID_3", "SCI101", "Science 101", nil, nil, "active", nil, nil]
parameters = {}
parameters["accounts"] = true
parameters["users"] = true
parameters["courses"] = true
parsed = run_report(parameters)
accounts_report = parsed["accounts"][1..-1].sort_by { |r| r[0] }
accounts_report[0].should == ["sub1", nil, "English", "active"]
accounts_report[1].should == ["sub2", nil, "Math", "active"]
accounts_report[2].should == ["subsub1", "sub1", "ESL", "active"]
users_report = parsed["users"][1..-1].sort_by { |r| r[0] }
users_report[0].should == ["user_sis_id_01", "john@stclair.com", nil, "John St.", "Clair", "john@stclair.com", "active"]
users_report[1].should == ["user_sis_id_02", "micheal@michaelbolton.com", nil, "Michael", "Bolton", "micheal@michaelbolton.com", "active"]
courses_report = parsed["courses"][1..-1].sort_by { |r| r[0] }
courses_report[0].should == ["SIS_COURSE_ID_1", "ENG101", "English 101", "sub1", "fall12", "active", start_at.iso8601, end_at.iso8601]
courses_report[1].should == ["SIS_COURSE_ID_2", "MAT101", "Math 101", nil, nil, "active", nil, end_at.iso8601]
courses_report[2].should == ["SIS_COURSE_ID_3", "SCI101", "Science 101", nil, nil, "active", nil, nil]
end
it "should run the SIS Export reports with no data" do
@account = Account.default
@admin = account_admin_user(:account => @account)
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
parameters = {}
parameters["accounts"] = true
parameters["users"] = true
parameters["terms"] = true
parameters["courses"] = true
parameters["sections"] = true
parameters["enrollments"] = true
parameters["groups"] = true
parameters["group_membership"] = true
parameters["xlist"] = true
parsed = run_report(parameters)
parsed["accounts"].should == [["account_id", "parent_account_id", "name", "status"]]
parsed["terms"].should == [["term_id", "name", "status", "start_date", "end_date"]]
parsed["users"].should == [["user_id", "login_id", "password", "first_name", "last_name", "email", "status"]]
parsed["courses"].should == [["course_id", "short_name", "long_name", "account_id", "term_id", "status", "start_date", "end_date"]]
parsed["sections"].should == [["section_id", "course_id", "name", "status", "start_date", "end_date", "account_id"]]
parsed["enrollments"].should == [["course_id", "user_id", "role", "section_id", "status", "associated_user_id"]]
parsed["groups"].should == [["group_id", "account_id", "name", "status"]]
parsed["group_membership"].should == [["group_id", "user_id", "status"]]
parsed["xlist"].should == [["xlist_course_id", "section_id", "status"]]
end
end
it "should find the default module and configured reports" do
CustomReportsSpecHelper.find_account_module_and_reports('default')
end

View File

@ -0,0 +1,745 @@
#
# Copyright (C) 2012 Instructure, Inc.
#
# This file is part of Canvas.
#
# Canvas is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the Free
# Software Foundation, version 3 of the License.
#
# Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
require File.expand_path(File.dirname(__FILE__) + '/reports_helper')
describe "Default Account Reports" do
def run_report(report_type, parameters = {}, column = 0)
account_report = AccountReport.new(:user => @admin, :account => @account, :report_type => report_type)
account_report.parameters = {}
account_report.parameters = parameters
account_report.save
csv_report = Canvas::AccountReports::Default.send(report_type, account_report)
if csv_report.is_a? Hash
csv_report.inject({}) do |result, (key, csv)|
all_parsed = FasterCSV.parse(csv).to_a
all_parsed[1..-1].sort_by { |r| r[column] }
result[key] = all_parsed
result
end
else
all_parsed = FasterCSV.parse(csv_report).to_a
all_parsed[1..-1].sort_by { |r| r[column] }
end
end
describe "SIS export reports and Provisioning reports" do
it "should run the SIS and Provisioning Users reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
@admin = account_admin_user(:account => @account)
user1 = user_with_pseudonym(:active_all => true, :account => @account, :name => "John St. Clair", :sortable_name => "St. Clair, John", :username => 'john@stclair.com')
@user.pseudonym.sis_user_id = "user_sis_id_01"
@user.pseudonym.save!
user2 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelbolton.com', :name => 'Michael Bolton', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_02"
@user.pseudonym.save!
user3 = user_with_pseudonym(:name => 'Rick Astley', :account => @account)
#user3 has no sis_id and should not be in the sis report
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["users"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0].should == ["user_sis_id_01", "john@stclair.com", nil, "John St.", "Clair", "john@stclair.com", "active"]
parsed[1].should == ["user_sis_id_02", "micheal@michaelbolton.com", nil, "Michael", "Bolton", "micheal@michaelbolton.com", "active"]
parameters = {}
parameters["users"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0].should == ["user_sis_id_01", "john@stclair.com", nil, "John St.", "Clair", "john@stclair.com", "active"]
parsed[1].should == ["user_sis_id_02", "micheal@michaelbolton.com", nil, "Michael", "Bolton", "micheal@michaelbolton.com", "active"]
parsed = run_report("provisioning_csv", parameters)
parsed.length.should == 3
parsed[0].should == [user1.id.to_s, "user_sis_id_01", "john@stclair.com", nil, "John St.", "Clair", "john@stclair.com", "active"]
parsed[1].should == [user2.id.to_s, "user_sis_id_02", "micheal@michaelbolton.com", nil, "Michael", "Bolton", "micheal@michaelbolton.com", "active"]
parsed[2].should == [user3.id.to_s, nil, "nobody@example.com", nil, "Rick", "Astley", "nobody@example.com", "active"]
end
it "should run the SIS and Provisioning Accounts reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
sub_sub_account = Account.create(:parent_account => sub_account, :name => 'sESL')
sub_sub_account.sis_source_id = 'subsub1'
sub_sub_account.save!
sub_account2 = Account.create(:parent_account => @account, :name => 'Math')
sub_account2.sis_source_id = 'sub2'
sub_account2.save!
sub_account3 = Account.create(:parent_account => @account, :name => 'other')
#sub_account 3 does not have sis id and should not be in the sis report
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["accounts"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 3
parsed[0].should == ["sub1", nil, "English", "active"]
parsed[1].should == ["sub2", nil, "Math", "active"]
parsed[2].should == ["subsub1", "sub1", "sESL", "active"]
parameters = {}
parameters["accounts"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 3
parsed[0].should == ["sub1", nil, "English", "active"]
parsed[1].should == ["sub2", nil, "Math", "active"]
parsed[2].should == ["subsub1", "sub1", "sESL", "active"]
parsed = run_report("provisioning_csv", parameters, 3)
parsed.length.should == 4
parsed[0].should == [sub_account.id.to_s, "sub1", nil, "English", "active"]
parsed[1].should == [sub_account2.id.to_s, "sub2", nil, "Math", "active"]
parsed[2].should == [sub_account3.id.to_s, nil, nil, "other", "active"]
parsed[3].should == [sub_sub_account.id.to_s, "subsub1", "sub1", "sESL", "active"]
end
it "should run the SIS and Provisioning Terms reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
term2 = EnrollmentTerm.create(:name => 'Winter', :start_at => '07-01-2013', :end_at => '28-04-2013')
term2.root_account = @account
term2.sis_source_id = 'winter13'
term2.save!
term3 = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME)
#default term should not be included in the sis report since it does not have an sis id
parameters = {}
parameters["enrollment_term"] = term3.id
parameters["terms"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0][0].should == term1.sis_source_id
parsed[0][1].should == term1.name
parsed[0][2].should == "active"
parsed[0][3].should == term1.start_at.iso8601
parsed[0][4].should == term1.end_at.iso8601
parsed[1][0].should == term2.sis_source_id
parsed[1][1].should == term2.name
parsed[1][2].should == "active"
parsed[1][3].should == term2.start_at.iso8601
parsed[1][4].should == term2.end_at.iso8601
parameters = {}
parameters["terms"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0].should == ["fall12", "Fall", "active", "2012-08-20T00:00:00Z", "2012-12-20T00:00:00Z"]
parsed[1].should == ["winter13", "Winter", "active", "2013-01-07T00:00:00Z", "2013-04-28T00:00:00Z"]
parsed = run_report("provisioning_csv", parameters, 2)
parsed.length.should == 3
parsed[0].should == [term3.id.to_s, nil, "Default Term", "active", nil, nil]
parsed[1].should == [term1.id.to_s, "fall12", "Fall", "active", "2012-08-20T00:00:00Z", "2012-12-20T00:00:00Z"]
parsed[2].should == [term2.id.to_s, "winter13", "Winter", "active", "2013-01-07T00:00:00Z", "2013-04-28T00:00:00Z"]
end
it "should run the SIS and Provisioning Course reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
start_at = 1.day.ago
end_at = 10.days.from_now
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :start_at => start_at, :conclude_at => end_at, :account => sub_account, :enrollment_term => term1)
course1.save
course1.workflow_state = 'available'
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.restrict_enrollments_to_course_dates = true
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :conclude_at => end_at, :account => @account)
course2.save
course2.workflow_state = 'available'
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.restrict_enrollments_to_course_dates = true
course2.save!
course3 = Course.new(:name => 'Science 101', :course_code => 'SCI101', :account => @account)
course3.save
course3.workflow_state = 'available'
course3.sis_source_id = "SIS_COURSE_ID_3"
course3.save!
course4 = Course.new(:name => 'self help',:course_code => 'self')
course4.workflow_state = 'claimed'
course4.save!
#course4 should not show up in the sis report since it does not have sis id
course5 = Course.new(:name => 'math 100', :course_code => 'ENG101', :start_at => start_at, :conclude_at => end_at, :account => sub_account, :enrollment_term => term1)
course5.sis_source_id = "SIS_COURSE_ID_5"
course5.workflow_state = 'deleted'
course5.save!
#course5 should not show up since it is not active
parameters = {}
parameters["courses"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 3
parsed[0].should == [course1.sis_source_id, course1.course_code, course1.name, sub_account.sis_source_id, term1.sis_source_id, "active", start_at.iso8601, end_at.iso8601]
parsed[1].should == ["SIS_COURSE_ID_2", "MAT101", "Math 101", nil, nil, "active", nil, end_at.iso8601]
parsed[2].should == ["SIS_COURSE_ID_3", "SCI101", "Science 101", nil, nil, "active", nil, nil]
parsed = run_report("provisioning_csv", parameters)
parsed.length.should == 4
parsed[0].should == [course1.id.to_s, course1.sis_source_id, course1.course_code, course1.name, sub_account.sis_source_id, term1.sis_source_id, "active", start_at.iso8601, end_at.iso8601]
parsed[1].should == [course2.id.to_s, "SIS_COURSE_ID_2", "MAT101", "Math 101", nil, nil, "active", nil, end_at.iso8601]
parsed[2].should == [course3.id.to_s, "SIS_COURSE_ID_3", "SCI101", "Science 101", nil, nil, "active", nil, nil]
parsed[3].should == [course4.id.to_s, nil, "self", "self help", nil, nil, "unpublished", nil, nil]
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["courses"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0].should == ["SIS_COURSE_ID_2", "MAT101", "Math 101", nil, nil, "active", nil, end_at.iso8601]
parsed[1].should == ["SIS_COURSE_ID_3", "SCI101", "Science 101", nil, nil, "active", nil, nil]
end
it "should run the SIS and Provisioning Sections reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
start_at = 1.day.ago
end_at = 10.days.from_now
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :start_at => start_at, :conclude_at => end_at, :account => sub_account)
course1.save
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :conclude_at => end_at, :account => @account, :enrollment_term => term1)
course2.save
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.save!
section1 = CourseSection.new(:name => 'English_01', :course => course1, :account => sub_account, :start_at => start_at, :end_at => end_at)
section1.sis_source_id = 'english_section_1'
section1.root_account_id = @account.id
section1.restrict_enrollments_to_section_dates = true
section1.save!
section2 = CourseSection.new(:name => 'English_02', :course => course1, :end_at => end_at)
section2.sis_source_id = 'english_section_2'
section2.root_account_id = @account.id
section2.restrict_enrollments_to_section_dates = true
section2.save!
section3 = CourseSection.new(:name => 'Math_01', :course => course2, :end_at => end_at)
section3.sis_source_id = 'english_section_3'
section3.root_account_id = @account.id
section3.restrict_enrollments_to_section_dates = true
section3.save!
section4 = CourseSection.new(:name => 'Math_02', :course => course2)
section4.root_account_id = @account.id
section4.save!
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["sections"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0].should ==[section1.sis_source_id, course1.sis_source_id, section1.name, "active", start_at.iso8601, end_at.iso8601, sub_account.sis_source_id]
parsed[1].should == [section2.sis_source_id, course1.sis_source_id, section2.name, "active", nil, end_at.iso8601, nil]
parameters = {}
parameters["sections"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 3
parsed[0].should ==[section1.sis_source_id, course1.sis_source_id, section1.name, "active", start_at.iso8601, end_at.iso8601, sub_account.sis_source_id]
parsed[1].should == [section2.sis_source_id, course1.sis_source_id, section2.name, "active", nil, end_at.iso8601, nil]
parsed[2].should == ["english_section_3", "SIS_COURSE_ID_2", "Math_01", "active", nil, end_at.iso8601, nil]
parsed = run_report("provisioning_csv", parameters)
parsed.length.should == 4
parsed[0].should ==[section1.id.to_s, section1.sis_source_id, course1.id.to_s, course1.sis_source_id, section1.name, "active", start_at.iso8601, end_at.iso8601, sub_account.id.to_s, sub_account.sis_source_id]
parsed[1].should == [section2.id.to_s, section2.sis_source_id, course1.id.to_s, course1.sis_source_id, section2.name, "active", nil, end_at.iso8601, nil, nil]
parsed[2].should == [section3.id.to_s, "english_section_3", course2.id.to_s, "SIS_COURSE_ID_2", "Math_01", "active", nil, end_at.iso8601, nil, nil]
parsed[3].should == [section4.id.to_s, nil, course2.id.to_s, "SIS_COURSE_ID_2", "Math_02", "active", nil, nil, nil, nil]
end
it "should run the SIS and provisioning Enrollment reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :account => @account)
course1.save
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :account => @account, :enrollment_term => term1)
course2.save
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.save!
course3 = Course.new(:name => 'Science 101', :course_code => 'SCI101', :account => @account)
course3.save!
course4 = Course.new(:name => 'Spanish 101', :course_code => 'SPA101', :account => @account)
course4.save!
#this course should not be in the sis report since it does not have an sis id
section1 = CourseSection.new(:name => 'sci_01', :course => course3)
section1.sis_source_id = 'science_section_1'
section1.root_account_id = @account.id
section1.save!
user1 = user_with_pseudonym(:active_all => true, :account => @account, :name => "John St. Clair", :sortable_name => "St. Clair, John", :username => 'john@stclair.com')
@user.pseudonym.sis_user_id = "user_sis_id_01"
@user.pseudonym.save!
user2 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelbolton.com', :name => 'Michael Bolton', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_02"
@user.pseudonym.save!
user3 = user_with_pseudonym(:active_all => true, :account => @account, :name => "Rick Astley", :sortable_name => "Astley, Rick", :username => 'rick@roll.com')
@user.pseudonym.sis_user_id = "user_sis_id_03"
@user.pseudonym.save!
user4 = user_with_pseudonym(:active_all => true, :username => 'jason@donovan.com', :name => 'Jason Donovan', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_04"
@user.pseudonym.save!
user5 = user_with_pseudonym(:name => 'James Brown', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_05"
@user.pseudonym.save!
user6 = user_with_pseudonym(:active_all => true, :username => 'john@smith.com', :name => 'John Smith',:sortable_name => "Smith, John", :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_06"
@user.pseudonym.save!
enrollment1 = course1.enroll_user(user1, 'ObserverEnrollment')
enrollment1.invite
enrollment1.accept
enrollment1.save!
enrollment2 = course3.enroll_user(user2, 'StudentEnrollment')
enrollment2.invite
enrollment2.accept
enrollment2.save!
enrollment3 = course1.enroll_user(user2, 'TaEnrollment')
enrollment3.accept
enrollment3.save!
user2.reload
enrollment4 = course1.enroll_user(user3, 'StudentEnrollment')
enrollment4.invite
enrollment4.accept
enrollment4.save!
enrollment5 = course2.enroll_user(user3, 'StudentEnrollment')
enrollment5.invite
enrollment5.accept
enrollment5.save!
user3.reload
enrollment6 = course1.enroll_user(user4, 'TeacherEnrollment')
enrollment6.accept
enrollment6.save!
enrollment7 = course2.enroll_user(user1, 'ObserverEnrollment')
enrollment7.associated_user_id = user3.id
enrollment7.invite
enrollment7.accept
enrollment7.save!
user1.reload
enrollment8 = course4.enroll_user(user5, 'TeacherEnrollment')
enrollment8.accept
enrollment8.save!
user5.reload
enrollment9 = section1.enroll_user(user4, 'TeacherEnrollment')
enrollment9.accept
enrollment9.save!
user4.reload
enrollment10 = course1.enroll_user(user6, 'TeacherEnrollment')
enrollment10.accept
enrollment10.save!
enrollment10.workflow_state = 'completed'
enrollment10.save!
user6.reload
parameters = {}
parameters["enrollments"] = true
parsed = run_report("sis_export_csv", parameters, 1)
parsed.length.should == 7
parsed[0].should == ["SIS_COURSE_ID_1", "user_sis_id_01", "observer", nil, "active", nil]
parsed[1].should == ["SIS_COURSE_ID_2", "user_sis_id_01", "observer", nil, "active", "user_sis_id_03"]
parsed[2].should == ["SIS_COURSE_ID_1", "user_sis_id_02", "ta", nil, "active", nil]
parsed[3].should == ["SIS_COURSE_ID_1", "user_sis_id_03", "student", nil, "active", nil]
parsed[4].should == ["SIS_COURSE_ID_2", "user_sis_id_03", "student", nil, "active", nil]
parsed[5].should == ["SIS_COURSE_ID_1", "user_sis_id_04", "teacher", nil, "active", nil]
parsed[6].should == [nil, "user_sis_id_04", "teacher", "science_section_1", "active", nil]
parsed = run_report("provisioning_csv", parameters, 3)
parsed.length.should == 9
parsed[0].should == [course1.id.to_s, "SIS_COURSE_ID_1", user1.id.to_s, "user_sis_id_01", "observer", enrollment1.course_section_id.to_s, nil, "active", nil, nil]
parsed[1].should == [course2.id.to_s, "SIS_COURSE_ID_2", user1.id.to_s, "user_sis_id_01", "observer", enrollment7.course_section_id.to_s, nil, "active", user3.id.to_s, "user_sis_id_03"]
parsed[2].should == [course3.id.to_s, nil, user2.id.to_s, "user_sis_id_02", "student", enrollment2.course_section_id.to_s, nil, "active", nil, nil]
parsed[3].should == [course1.id.to_s, "SIS_COURSE_ID_1", user2.id.to_s, "user_sis_id_02", "ta", enrollment3.course_section_id.to_s, nil, "active", nil, nil]
parsed[4].should == [course1.id.to_s, "SIS_COURSE_ID_1", user3.id.to_s, "user_sis_id_03", "student", enrollment4.course_section_id.to_s, nil, "active", nil, nil]
parsed[5].should == [course2.id.to_s, "SIS_COURSE_ID_2", user3.id.to_s, "user_sis_id_03", "student", enrollment5.course_section_id.to_s, nil, "active", nil, nil]
parsed[6].should == [course1.id.to_s, "SIS_COURSE_ID_1", user4.id.to_s, "user_sis_id_04", "teacher", enrollment6.course_section_id.to_s, nil, "active", nil, nil]
parsed[7].should == [course3.id.to_s, nil, user4.id.to_s, "user_sis_id_04", "teacher", enrollment9.course_section_id.to_s, "science_section_1", "active", nil, nil]
parsed[8].should == [course4.id.to_s, nil, user5.id.to_s, "user_sis_id_05", "teacher", enrollment8.course_section_id.to_s, nil, "active", nil, nil]
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["enrollments"] = true
parsed = run_report("sis_export_csv", parameters, 1)
parsed.length.should == 5
parsed[0].should == ["SIS_COURSE_ID_1", "user_sis_id_01", "observer", nil, "active", nil]
parsed[1].should == ["SIS_COURSE_ID_1", "user_sis_id_02", "ta", nil, "active", nil]
parsed[2].should == ["SIS_COURSE_ID_1", "user_sis_id_03", "student", nil, "active", nil]
parsed[3].should == ["SIS_COURSE_ID_1", "user_sis_id_04", "teacher", nil, "active", nil]
parsed[4].should == [nil, "user_sis_id_04", "teacher", "science_section_1", "active", nil]
end
it "should run the SIS and provisioning Groups reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
group1 = @account.groups.create(:name => 'group1name')
group1.sis_source_id = 'group1sis'
group1.save!
group2 = sub_account.groups.create(:name => 'group2name')
group2.sis_source_id = 'group2sis'
group2.save!
group3 = sub_account.groups.create(:name => 'group3name')
group3.save!
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["groups"] = true
parsed = run_report("sis_export_csv", parameters, 2)
parsed.length.should == 2
parsed[0].should == ["group1sis", nil, "group1name", "available"]
parsed[1].should == ["group2sis", "sub1", "group2name", "available"]
parameters = {}
parameters["groups"] = true
parsed = run_report("sis_export_csv", parameters, 2)
parsed.length.should == 2
parsed[0].should == ["group1sis", nil, "group1name", "available"]
parsed[1].should == ["group2sis", "sub1", "group2name", "available"]
parsed = run_report("provisioning_csv", parameters, 4)
parsed.length.should == 3
parsed[0].should == [group1.id.to_s, "group1sis", @account.id.to_s, nil, "group1name", "available"]
parsed[1].should == [group2.id.to_s, "group2sis", sub_account.id.to_s, "sub1", "group2name", "available"]
parsed[2].should == [group3.id.to_s, nil, sub_account.id.to_s, "sub1", "group3name", "available"]
end
it "should run the SIS and provisioning Groups Membership reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
user1 = user_with_pseudonym(:active_all => true, :account => @account, :name => "John St. Clair", :sortable_name => "St. Clair, John", :username => 'john@stclair.com')
@user.pseudonym.sis_user_id = "user_sis_id_01"
@user.pseudonym.save!
user2 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelbolton.com', :name => 'Michael Bolton', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_02"
@user.pseudonym.save!
user3 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelscott.com', :name => 'Michael Scott', :account => @account)
@user.pseudonym.save!
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
group1 = @account.groups.create(:name => 'group1name')
group1.sis_source_id = 'group1sis'
group1.save!
group2 = sub_account.groups.create(:name => 'group2name')
group2.sis_source_id = 'group2sis'
group2.save!
group3 = sub_account.groups.create(:name => 'group3name')
group3.save!
gm1 = GroupMembership.create(:group => group1, :user => user1, :workflow_state => "accepted")
gm1.sis_batch_id = 1
gm1.save!
gm2 = GroupMembership.create(:group => group2, :user => user2, :workflow_state => "accepted")
gm2.sis_batch_id = 1
gm2.save!
gm3 = GroupMembership.create(:group => group3, :user => user3, :workflow_state => "accepted")
gm3.save!
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["group_membership"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0].should == [group1.sis_source_id, "user_sis_id_01", "accepted"]
parsed[1].should == [group2.sis_source_id, "user_sis_id_02", "accepted"]
parameters = {}
parameters["group_membership"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0].should == [group1.sis_source_id, "user_sis_id_01", "accepted"]
parsed[1].should == [group2.sis_source_id, "user_sis_id_02", "accepted"]
parsed = run_report("provisioning_csv", parameters)
parsed.length.should == 3
parsed[0].should == [group1.id.to_s, group1.sis_source_id, user1.id.to_s, "user_sis_id_01", "accepted"]
parsed[1].should == [group2.id.to_s, group2.sis_source_id, user2.id.to_s, "user_sis_id_02", "accepted"]
parsed[2].should == [group3.id.to_s, group3.sis_source_id, user3.id.to_s, nil, "accepted"]
end
it "should run the x list reports" do
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
@account = Account.default
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :account => @account, :enrollment_term => term1)
course1.save
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :account => @account, :enrollment_term => term1)
course2.save
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.save!
course3 = Course.new(:name => 'Science 101', :course_code => 'SCI101', :account => @account)
course3.save
course3.sis_source_id = "SIS_COURSE_ID_3"
course3.save!
course4 = Course.new(:name => 'Science 1011', :course_code => 'SCI1011', :account => @account)
course4.save
course4.sis_source_id = "SIS_COURSE_ID_4"
course4.save!
course5 = Course.new(:name => 'Spanish 1011', :course_code => 'SPA1011', :account => @account)
course5.save
section1 = CourseSection.new(:name => 'English_01', :course => course1)
section1.sis_source_id = 'english_section_1'
section1.root_account_id = @account.id
section1.save!
section2 = CourseSection.new(:name => 'English_02', :course => course2)
section2.sis_source_id = 'english_section_2'
section2.root_account_id = @account.id
section2.save!
section3 = CourseSection.new(:name => 'Math_01', :course => course3)
section3.sis_source_id = 'english_section_3'
section3.root_account_id = @account.id
section3.save!
section4 = CourseSection.new(:name => 'Math_012', :course => course4)
section4.sis_source_id = 'english_section_4'
section4.root_account_id = @account.id
section4.save!
section5 = CourseSection.new(:name => 'spanish_012', :course => course5)
section5.root_account_id = @account.id
section5.save!
section1.crosslist_to_course(course2)
section3.crosslist_to_course(course4)
section5.crosslist_to_course(course2)
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["xlist"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 1
parsed[0].should == ["SIS_COURSE_ID_4", "english_section_3", "active"]
parameters = {}
parameters["xlist"] = true
parsed = run_report("sis_export_csv", parameters)
parsed.length.should == 2
parsed[0].should == ["SIS_COURSE_ID_2", "english_section_1", "active"]
parsed[1].should == ["SIS_COURSE_ID_4", "english_section_3", "active"]
parsed = run_report("provisioning_csv", parameters)
parsed.length.should == 3
parsed[0].should == [course2.id.to_s, "SIS_COURSE_ID_2", section1.id.to_s, "english_section_1", "active"]
parsed[1].should == [course2.id.to_s, "SIS_COURSE_ID_2", section5.id.to_s, nil, "active"]
parsed[2].should == [course4.id.to_s, "SIS_COURSE_ID_4", section3.id.to_s, "english_section_3", "active"]
end
it "should run the SIS Export" do
@account = Account.default
@admin = account_admin_user(:account => @account)
user1 = user_with_pseudonym(:active_all => true, :account => @account, :name => "John St. Clair", :sortable_name => "St. Clair, John", :username => 'john@stclair.com')
@user.pseudonym.sis_user_id = "user_sis_id_01"
@user.pseudonym.save!
user2 = user_with_pseudonym(:active_all => true, :username => 'micheal@michaelbolton.com', :name => 'Michael Bolton', :account => @account)
@user.pseudonym.sis_user_id = "user_sis_id_02"
@user.pseudonym.save!
user3 = user_with_pseudonym(:name => 'Rick Astley', :account => @account)
sub_account = Account.create(:parent_account => @account, :name => 'English')
sub_account.sis_source_id = 'sub1'
sub_account.save!
sub_sub_account = Account.create(:parent_account => sub_account, :name => 'ESL')
sub_sub_account.sis_source_id = 'subsub1'
sub_sub_account.save!
sub_account2 = Account.create(:parent_account => @account, :name => 'Math')
sub_account2.sis_source_id = 'sub2'
sub_account2.save!
term1 = EnrollmentTerm.create(:name => 'Fall', :start_at => '20-08-2012', :end_at => '20-12-2012')
term1.root_account = @account
term1.sis_source_id = 'fall12'
term1.save!
term2 = EnrollmentTerm.create(:name => 'Winter', :start_at => '07-01-2013', :end_at => '28-04-2013')
term2.root_account = @account
term2.sis_source_id = 'winter13'
term2.save!
start_at = 1.day.ago
end_at = 10.days.from_now
course1 = Course.new(:name => 'English 101', :course_code => 'ENG101', :start_at => start_at, :conclude_at => end_at, :account => sub_account, :enrollment_term => term1)
course1.save
course1.workflow_state = 'available'
course1.sis_source_id = "SIS_COURSE_ID_1"
course1.restrict_enrollments_to_course_dates = true
course1.save!
course2 = Course.new(:name => 'Math 101', :course_code => 'MAT101', :conclude_at => end_at, :account => @account)
course2.save
course2.workflow_state = 'available'
course2.sis_source_id = "SIS_COURSE_ID_2"
course2.restrict_enrollments_to_course_dates = true
course2.save!
course3 = Course.new(:name => 'Science 101', :course_code => 'SCI101', :account => @account)
course3.save
course3.workflow_state = 'available'
course3.sis_source_id = "SIS_COURSE_ID_3"
course3.save!
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
parameters = {}
parameters["enrollment_term"] = @account.enrollment_terms.active.find_or_create_by_name(EnrollmentTerm::DEFAULT_TERM_NAME).id
parameters["accounts"] = true
parameters["users"] = true
parameters["courses"] = true
parsed = run_report("sis_export_csv", parameters)
accounts_report = parsed["accounts"][1..-1].sort_by { |r| r[0] }
accounts_report[0].should == ["sub1", nil, "English", "active"]
accounts_report[1].should == ["sub2", nil, "Math", "active"]
accounts_report[2].should == ["subsub1", "sub1", "ESL", "active"]
users_report = parsed["users"][1..-1].sort_by { |r| r[0] }
users_report[0].should == ["user_sis_id_01", "john@stclair.com", nil, "John St.", "Clair", "john@stclair.com", "active"]
users_report[1].should == ["user_sis_id_02", "micheal@michaelbolton.com", nil, "Michael", "Bolton", "micheal@michaelbolton.com", "active"]
courses_report = parsed["courses"][1..-1].sort_by { |r| r[0] }
courses_report[0].should == ["SIS_COURSE_ID_2", "MAT101", "Math 101", nil, nil, "active", nil, end_at.iso8601]
courses_report[1].should == ["SIS_COURSE_ID_3", "SCI101", "Science 101", nil, nil, "active", nil, nil]
parameters = {}
parameters["accounts"] = true
parameters["users"] = true
parameters["courses"] = true
parsed = run_report("sis_export_csv", parameters)
accounts_report = parsed["accounts"][1..-1].sort_by { |r| r[0] }
accounts_report[0].should == ["sub1", nil, "English", "active"]
accounts_report[1].should == ["sub2", nil, "Math", "active"]
accounts_report[2].should == ["subsub1", "sub1", "ESL", "active"]
users_report = parsed["users"][1..-1].sort_by { |r| r[0] }
users_report[0].should == ["user_sis_id_01", "john@stclair.com", nil, "John St.", "Clair", "john@stclair.com", "active"]
users_report[1].should == ["user_sis_id_02", "micheal@michaelbolton.com", nil, "Michael", "Bolton", "micheal@michaelbolton.com", "active"]
courses_report = parsed["courses"][1..-1].sort_by { |r| r[0] }
courses_report[0].should == ["SIS_COURSE_ID_1", "ENG101", "English 101", "sub1", "fall12", "active", start_at.iso8601, end_at.iso8601]
courses_report[1].should == ["SIS_COURSE_ID_2", "MAT101", "Math 101", nil, nil, "active", nil, end_at.iso8601]
courses_report[2].should == ["SIS_COURSE_ID_3", "SCI101", "Science 101", nil, nil, "active", nil, nil]
end
it "should run the SIS Export reports with no data" do
@account = Account.default
@admin = account_admin_user(:account => @account)
Notification.find_or_create_by_name("Report Generated")
Notification.find_or_create_by_name("Report Generation Failed")
parameters = {}
parameters["accounts"] = true
parameters["users"] = true
parameters["terms"] = true
parameters["courses"] = true
parameters["sections"] = true
parameters["enrollments"] = true
parameters["groups"] = true
parameters["group_membership"] = true
parameters["xlist"] = true
parsed = run_report("sis_export_csv", parameters)
parsed["accounts"].should == [["account_id", "parent_account_id", "name", "status"]]
parsed["terms"].should == [["term_id", "name", "status", "start_date", "end_date"]]
parsed["users"].should == [["user_id", "login_id", "password", "first_name", "last_name", "email", "status"]]
parsed["courses"].should == [["course_id", "short_name", "long_name", "account_id", "term_id", "status", "start_date", "end_date"]]
parsed["sections"].should == [["section_id", "course_id", "name", "status", "start_date", "end_date", "account_id"]]
parsed["enrollments"].should == [["course_id", "user_id", "role", "section_id", "status", "associated_user_id"]]
parsed["groups"].should == [["group_id", "account_id", "name", "status"]]
parsed["group_membership"].should == [["group_id", "user_id", "status"]]
parsed["xlist"].should == [["xlist_course_id", "section_id", "status"]]
end
end
end