canvas_sync 0.10.3 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +57 -2
  3. data/db/migrate/20190916154829_add_fork_count_to_canvas_sync_job_logs.rb +13 -0
  4. data/lib/canvas_sync.rb +43 -8
  5. data/lib/canvas_sync/api_syncable.rb +8 -0
  6. data/lib/canvas_sync/generators/templates/migrations/create_admins.rb +7 -4
  7. data/lib/canvas_sync/generators/templates/migrations/create_roles.rb +3 -4
  8. data/lib/canvas_sync/generators/templates/models/account.rb +2 -0
  9. data/lib/canvas_sync/generators/templates/models/admin.rb +4 -5
  10. data/lib/canvas_sync/generators/templates/models/role.rb +0 -4
  11. data/lib/canvas_sync/generators/templates/models/term.rb +0 -2
  12. data/lib/canvas_sync/importers/bulk_importer.rb +7 -4
  13. data/lib/canvas_sync/job.rb +24 -1
  14. data/lib/canvas_sync/jobs/fork_gather.rb +59 -0
  15. data/lib/canvas_sync/jobs/report_starter.rb +12 -1
  16. data/lib/canvas_sync/jobs/sync_admins_job.rb +9 -5
  17. data/lib/canvas_sync/jobs/sync_assignment_groups_job.rb +2 -8
  18. data/lib/canvas_sync/jobs/sync_assignments_job.rb +2 -8
  19. data/lib/canvas_sync/jobs/sync_context_module_items_job.rb +2 -8
  20. data/lib/canvas_sync/jobs/sync_context_modules_job.rb +2 -8
  21. data/lib/canvas_sync/jobs/sync_provisioning_report_job.rb +23 -11
  22. data/lib/canvas_sync/jobs/sync_roles_job.rb +8 -5
  23. data/lib/canvas_sync/jobs/sync_simple_table_job.rb +17 -7
  24. data/lib/canvas_sync/jobs/sync_submissions_job.rb +1 -5
  25. data/lib/canvas_sync/jobs/sync_terms_job.rb +8 -2
  26. data/lib/canvas_sync/jobs/sync_users_job.rb +5 -7
  27. data/lib/canvas_sync/processors/assignment_groups_processor.rb +3 -2
  28. data/lib/canvas_sync/processors/assignments_processor.rb +3 -2
  29. data/lib/canvas_sync/processors/context_module_items_processor.rb +3 -2
  30. data/lib/canvas_sync/processors/context_modules_processor.rb +3 -2
  31. data/lib/canvas_sync/processors/normal_processor.rb +2 -1
  32. data/lib/canvas_sync/processors/provisioning_report_processor.rb +7 -2
  33. data/lib/canvas_sync/processors/submissions_processor.rb +3 -2
  34. data/lib/canvas_sync/version.rb +1 -1
  35. data/spec/canvas_sync/canvas_sync_spec.rb +17 -0
  36. data/spec/canvas_sync/jobs/fork_gather_spec.rb +73 -0
  37. data/spec/canvas_sync/jobs/job_spec.rb +39 -5
  38. data/spec/canvas_sync/jobs/sync_admins_job_spec.rb +2 -1
  39. data/spec/canvas_sync/jobs/sync_assignment_groups_job_spec.rb +1 -1
  40. data/spec/canvas_sync/jobs/sync_assignments_job_spec.rb +2 -2
  41. data/spec/canvas_sync/jobs/sync_context_module_items_job_spec.rb +2 -2
  42. data/spec/canvas_sync/jobs/sync_context_modules_job_spec.rb +2 -2
  43. data/spec/canvas_sync/jobs/sync_provisioning_report_job_spec.rb +20 -11
  44. data/spec/canvas_sync/jobs/sync_roles_job_spec.rb +2 -1
  45. data/spec/canvas_sync/jobs/sync_simple_table_job_spec.rb +1 -0
  46. data/spec/canvas_sync/jobs/sync_submissions_job_spec.rb +1 -1
  47. data/spec/canvas_sync/jobs/sync_users_job_spec.rb +1 -1
  48. data/spec/canvas_sync/models/admins_spec.rb +3 -5
  49. data/spec/canvas_sync/models/roles_spec.rb +5 -5
  50. data/spec/canvas_sync/models/term_spec.rb +3 -3
  51. data/spec/dummy/app/models/account.rb +2 -0
  52. data/spec/dummy/app/models/admin.rb +4 -5
  53. data/spec/dummy/app/models/role.rb +0 -4
  54. data/spec/dummy/app/models/term.rb +0 -2
  55. data/spec/dummy/db/migrate/{20190702203628_create_roles.rb → 20190927204545_create_roles.rb} +3 -4
  56. data/spec/dummy/db/migrate/{20190702203629_create_admins.rb → 20190927204546_create_admins.rb} +7 -4
  57. data/spec/dummy/db/schema.rb +12 -9
  58. data/spec/dummy/db/test.sqlite3 +0 -0
  59. data/spec/dummy/log/development.log +1248 -0
  60. data/spec/dummy/log/test.log +43258 -0
  61. data/spec/factories/admin_factory.rb +0 -1
  62. data/spec/support/fake_canvas.rb +2 -2
  63. data/spec/support/fixtures/canvas_responses/roles.json +6 -0
  64. data/spec/support/fixtures/reports/provisioning_csv_unzipped/courses.csv +3 -0
  65. data/spec/support/fixtures/reports/provisioning_csv_unzipped/users.csv +4 -0
  66. metadata +25 -12
@@ -8,15 +8,16 @@ module CanvasSync
8
8
  # @param options [Hash]
9
9
  class SubmissionsProcessor < ReportProcessor
10
10
  def self.process(report_file_path, _options, report_id)
11
- new(report_file_path)
11
+ new(report_file_path, _options)
12
12
  end
13
13
 
14
- def initialize(report_file_path)
14
+ def initialize(report_file_path, options)
15
15
  CanvasSync::Importers::BulkImporter.import(
16
16
  report_file_path,
17
17
  mapping[:submissions][:report_columns],
18
18
  Submission,
19
19
  mapping[:submissions][:conflict_target].to_sym,
20
+ import_args: options
20
21
  )
21
22
  end
22
23
  end
@@ -1,3 +1,3 @@
1
1
  module CanvasSync
2
- VERSION = "0.10.3".freeze
2
+ VERSION = "0.11.1".freeze
3
3
  end
@@ -24,6 +24,23 @@ RSpec.describe CanvasSync do
24
24
  end
25
25
 
26
26
  describe '.default_provisioning_report_chain' do
27
+ it 'splits an options: Hash into options for separate models' do
28
+ chain = CanvasSync.default_provisioning_report_chain(['users', 'courses'], :active, options: {
29
+ terms: { a: 1 },
30
+ users: { b: 2 },
31
+ provisioning: { c: 3 },
32
+ global: { d: 4 },
33
+ })
34
+ expect(chain).to eq({
35
+ jobs: [
36
+ { job: CanvasSync::Jobs::SyncTermsJob.to_s, options: { a: 1 } },
37
+ { job: CanvasSync::Jobs::SyncUsersJob.to_s, options: { b: 2 } },
38
+ { job: CanvasSync::Jobs::SyncProvisioningReportJob.to_s, options: { term_scope: 'active', models: ['courses'], c: 3 } }
39
+ ],
40
+ global_options: { legacy_support: false, d: 4 }
41
+ })
42
+ end
43
+
27
44
  context 'we are syncing users with a term scope' do
28
45
  it 'syncs the users in a separate job that runs first' do
29
46
  chain = CanvasSync.default_provisioning_report_chain(['users', 'courses'], :active)
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe CanvasSync::Jobs::ForkGather do
4
+ describe '#perform' do
5
+ let!(:job_log) { CanvasSync::JobLog.create!(job_id: 'BLAH', fork_count: 3) }
6
+ let(:job_chain) { {jobs: [], global_options: { fork_path: ['BLAH'] }} }
7
+
8
+ it 'decrements fork_count' do
9
+ CanvasSync::Jobs::ForkGather.perform_now(job_chain, {})
10
+ expect(job_log.reload.fork_count).to eq 2
11
+ end
12
+
13
+ it 'does not continue chain if fork_count > 0' do
14
+ expect(CanvasSync).not_to receive(:invoke_next)
15
+ CanvasSync::Jobs::ForkGather.perform_now(job_chain, {})
16
+ end
17
+
18
+ it 'continues the chain if fork_count <= 0' do
19
+ job_log.update!(fork_count: 1)
20
+ expect(CanvasSync).to receive(:invoke_next)
21
+ CanvasSync::Jobs::ForkGather.perform_now(job_chain, {})
22
+ end
23
+
24
+ it 'continues if no fork_path is specified' do
25
+ job_chain[:global_options].delete(:fork_path)
26
+ expect(CanvasSync).to receive(:invoke_next)
27
+ CanvasSync::Jobs::ForkGather.perform_now(job_chain, {})
28
+ end
29
+
30
+ it 'pops the most-recent fork_path enrty' do
31
+ job_log.update!(fork_count: 1)
32
+ expect(CanvasSync).to receive(:invoke_next) do |*args|
33
+ expect(args[0][:global_options][:fork_path]).to eq []
34
+ end
35
+ CanvasSync::Jobs::ForkGather.perform_now(job_chain, {})
36
+ end
37
+ end
38
+
39
+ describe 'handle_branch_error' do
40
+ let(:error) { StandardError.new }
41
+
42
+ let(:job_chain) {
43
+ {
44
+ jobs: [
45
+ { job: 'CanvasSync::Jobs::ReportChecker' },
46
+ { job: 'CanvasSync::Jobs::ReportChecker' },
47
+ { job: 'CanvasSync::Jobs::ForkGather' },
48
+ { job: 'CanvasSync::Jobs::ReportChecker' },
49
+ ],
50
+ global_options: {
51
+ fork_path: ['BLAH'],
52
+ }
53
+ }
54
+ }
55
+
56
+ it 'skips to and performs the next ForkGatherJob' do
57
+ expect(CanvasSync).to receive(:invoke_next) do |*args|
58
+ expect(args[0][:jobs][0][:job]).to eq 'CanvasSync::Jobs::ForkGather'
59
+ end
60
+ expect(CanvasSync::Jobs::ForkGather.handle_branch_error(error, job_chain: job_chain)).to be true
61
+ end
62
+
63
+ it 'does nothing if no ForkGather is in the chain' do
64
+ job_chain[:jobs].delete_at(2)
65
+ expect(CanvasSync::Jobs::ForkGather.handle_branch_error(error, job_chain: job_chain)).to be nil
66
+ end
67
+
68
+ it 'does nothing if no fork_path is present' do
69
+ job_chain[:global_options][:fork_path] = []
70
+ expect(CanvasSync::Jobs::ForkGather.handle_branch_error(error, job_chain: job_chain)).to be nil
71
+ end
72
+ end
73
+ end
@@ -1,40 +1,74 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  class GoodJob < CanvasSync::Job
4
- def perform(argument)
4
+ def perform(job_chain, argument)
5
5
  end
6
6
  end
7
7
 
8
8
  class EvilError < StandardError; end;
9
9
 
10
10
  class BadJob < CanvasSync::Job
11
- def perform(argument)
11
+ def perform(job_chain, argument)
12
12
  raise EvilError
13
13
  end
14
+
15
+ def self.evil_catcher(e, *opts)
16
+ raise EvilError
17
+ end
18
+
19
+ def self.good_catcher(e, *opts)
20
+
21
+ end
14
22
  end
15
23
 
16
24
  RSpec.describe CanvasSync::Job do
17
25
  describe '#perform' do
18
26
  it 'creates a CanvasSync::JobLog and logs relevant data on it' do
19
27
  expect {
20
- GoodJob.perform_now("argument")
28
+ GoodJob.perform_now({}, "argument")
21
29
  }.to change { CanvasSync::JobLog.count }.by(1)
22
30
 
23
31
  job_log = CanvasSync::JobLog.last
24
32
  expect(job_log.started_at).to_not be_nil
25
33
  expect(job_log.job_class).to eq(GoodJob.to_s)
26
- expect(job_log.job_arguments).to eq(["argument"])
34
+ expect(job_log.job_arguments).to eq([{}, "argument"])
27
35
  expect(job_log.completed_at).to_not be_nil
28
36
  end
29
37
 
30
38
  it 'logs exceptions on the CanvasSync::JobLog and then re-raises' do
31
39
  expect {
32
- BadJob.perform_now("argument")
40
+ BadJob.perform_now({}, "argument")
33
41
  }.to raise_exception(StandardError)
34
42
 
35
43
  job_log = CanvasSync::JobLog.last
36
44
  expect(job_log.exception).to eq("EvilError: EvilError")
37
45
  expect(job_log.backtrace).to_not be_nil
38
46
  end
47
+
48
+ it 'invokes an error handler' do
49
+ expect(BadJob).to receive(:good_catcher).once
50
+ expect {
51
+ BadJob.perform_now({
52
+ jobs: [],
53
+ global_options: {
54
+ on_failure: 'BadJob.good_catcher'
55
+ }
56
+ })
57
+ }.to raise_exception(StandardError)
58
+ end
59
+
60
+ it 'logs a failing error handler' do
61
+ expect(BadJob).to receive(:bad_catcher).once.and_call_original
62
+ expect {
63
+ BadJob.perform_now({
64
+ jobs: [],
65
+ global_options: {
66
+ on_failure: 'BadJob.bad_catcher'
67
+ }
68
+ })
69
+ }.to raise_exception(StandardError)
70
+ job_log = CanvasSync::JobLog.last
71
+ expect(job_log.backtrace).to include "Error Occurred while handling an Error"
72
+ end
39
73
  end
40
74
  end
@@ -2,10 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe CanvasSync::Jobs::SyncAdminsJob do
4
4
  describe '#perform' do
5
+ let!(:account) { FactoryGirl.create(:account, canvas_id: 1) }
5
6
  let(:admin_params) { open_canvas_fixture('admins') }
6
7
  let(:job_chain) { { jobs: [], global_options: {}} }
7
8
 
8
- it 'retrieves all terms from the Canvas API and then invokes the next job' do
9
+ it 'retrieves all admins from the Canvas API and then invokes the next job' do
9
10
  expect(CanvasSync).to receive(:invoke_next).with(job_chain)
10
11
 
11
12
  expect {
@@ -5,7 +5,7 @@ RSpec.describe CanvasSync::Jobs::SyncAssignmentGroupsJob do
5
5
  context "a term id is in the global_options" do
6
6
  it "enqueues a ReportStarter for the proserv_assignment_group_export_csv for the given term" do
7
7
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
8
- .with("self", "proserv_assignment_group_export_csv", "parameters[enrollment_term_id]" => 1)
8
+ .with("self", "proserv_assignment_group_export_csv", { parameters: { enrollment_term_id: 1 } })
9
9
  .and_return("id" => 1)
10
10
 
11
11
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -5,7 +5,7 @@ RSpec.describe CanvasSync::Jobs::SyncAssignmentsJob do
5
5
  context "a term id is in the global_options" do
6
6
  it "enqueues a ReportStarter for the proserv_assignment_export_csv for the given term" do
7
7
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
8
- .with("self", "proserv_assignment_export_csv", "parameters[enrollment_term_id]" => 1)
8
+ .with("self", "proserv_assignment_export_csv", { parameters: { enrollment_term_id: 1 } })
9
9
  .and_return("id" => 1)
10
10
 
11
11
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -17,7 +17,7 @@ RSpec.describe CanvasSync::Jobs::SyncAssignmentsJob do
17
17
  context "no term id is specified" do
18
18
  it "enqueues a ReportStarter for the proserv_assignment_export_csv for all terms" do
19
19
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
20
- .with("self", "proserv_assignment_export_csv", {})
20
+ .with("self", "proserv_assignment_export_csv", { parameters: {} })
21
21
  .and_return("id" => 1)
22
22
 
23
23
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -5,7 +5,7 @@ RSpec.describe CanvasSync::Jobs::SyncContextModuleItemsJob do
5
5
  context "a term id is in the global_options" do
6
6
  it "enqueues a ReportStarter for the proserv_context_module_items_csv for the given term" do
7
7
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
8
- .with("self", "proserv_context_module_items_csv", "parameters[enrollment_term_id]" => 1)
8
+ .with("self", "proserv_context_module_items_csv", { parameters: { enrollment_term_id: 1 } })
9
9
  .and_return("id" => 1)
10
10
 
11
11
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -17,7 +17,7 @@ RSpec.describe CanvasSync::Jobs::SyncContextModuleItemsJob do
17
17
  context "no term id is specified" do
18
18
  it "enqueues a ReportStarter for the proserv_context_module_items_csv for all terms" do
19
19
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
20
- .with("self", "proserv_context_module_items_csv", {})
20
+ .with("self", "proserv_context_module_items_csv", { parameters: { } })
21
21
  .and_return("id" => 1)
22
22
 
23
23
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -5,7 +5,7 @@ RSpec.describe CanvasSync::Jobs::SyncContextModulesJob do
5
5
  context "a term id is in the global_options" do
6
6
  it "enqueues a ReportStarter for the proserv_context_modules_csv for the given term" do
7
7
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
8
- .with("self", "proserv_context_modules_csv", "parameters[enrollment_term_id]" => 1)
8
+ .with("self", "proserv_context_modules_csv", { parameters: { enrollment_term_id: 1 } })
9
9
  .and_return("id" => 1)
10
10
 
11
11
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -17,7 +17,7 @@ RSpec.describe CanvasSync::Jobs::SyncContextModulesJob do
17
17
  context "no term id is specified" do
18
18
  it "enqueues a ReportStarter for the proserv_context_modules_csv for all terms" do
19
19
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
20
- .with("self", "proserv_context_modules_csv", {})
20
+ .with("self", "proserv_context_modules_csv", { parameters: { } })
21
21
  .and_return("id" => 1)
22
22
 
23
23
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -12,16 +12,19 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
12
12
  it 'enqueues a ReportStarter for a provisioning report for the specified models for each term' do
13
13
  expected_job_chain = Marshal.load(Marshal.dump(job_chain))
14
14
  expected_job_chain[:global_options][:canvas_term_id] = active_term_1.canvas_id
15
+ expected_job_chain[:global_options] = hash_including(expected_job_chain[:global_options])
15
16
 
16
17
  expect(CanvasSync::Jobs::ReportStarter).to receive(:perform_later)
17
18
  .with(
18
19
  expected_job_chain,
19
20
  'proservices_provisioning_csv',
20
21
  {
21
- "parameters[include_deleted]" => true,
22
- "parameters[users]" => true,
23
- "parameters[courses]" => true,
24
- "parameters[enrollment_term_id]" => active_term_1.canvas_id
22
+ parameters: {
23
+ include_deleted: true,
24
+ 'users' => true,
25
+ 'courses' => true,
26
+ enrollment_term_id: active_term_1.canvas_id
27
+ }
25
28
  },
26
29
  CanvasSync::Processors::ProvisioningReportProcessor.to_s,
27
30
  { models: ['users', 'courses'], term_scope: 'active' }
@@ -29,16 +32,19 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
29
32
 
30
33
  expected_job_chain_2 = Marshal.load(Marshal.dump(job_chain))
31
34
  expected_job_chain_2[:global_options][:canvas_term_id] = active_term_2.canvas_id
35
+ expected_job_chain_2[:global_options] = hash_including(expected_job_chain_2[:global_options])
32
36
 
33
37
  expect(CanvasSync::Jobs::ReportStarter).to receive(:perform_later)
34
38
  .with(
35
39
  expected_job_chain_2,
36
40
  'proservices_provisioning_csv',
37
41
  {
38
- "parameters[include_deleted]" => true,
39
- "parameters[users]" => true,
40
- "parameters[courses]" => true,
41
- "parameters[enrollment_term_id]" => active_term_2.canvas_id
42
+ parameters: {
43
+ include_deleted: true,
44
+ 'users' => true,
45
+ 'courses' => true,
46
+ enrollment_term_id: active_term_2.canvas_id
47
+ }
42
48
  },
43
49
  CanvasSync::Processors::ProvisioningReportProcessor.to_s,
44
50
  { models: ['users', 'courses'], term_scope: 'active' }
@@ -48,6 +54,7 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
48
54
  job_chain,
49
55
  { models: ['users', 'courses'], term_scope: 'active' }
50
56
  )
57
+ expect(CanvasSync::JobLog.last.fork_count).to eq 2
51
58
  end
52
59
  end
53
60
 
@@ -58,9 +65,11 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
58
65
  job_chain,
59
66
  'proservices_provisioning_csv',
60
67
  {
61
- "parameters[include_deleted]" => true,
62
- "parameters[users]" => true,
63
- "parameters[courses]" => true
68
+ parameters: {
69
+ include_deleted: true,
70
+ 'users' => true,
71
+ 'courses' => true,
72
+ }
64
73
  },
65
74
  CanvasSync::Processors::ProvisioningReportProcessor.to_s,
66
75
  { models: ['users', 'courses'] }
@@ -2,10 +2,11 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe CanvasSync::Jobs::SyncRolesJob do
4
4
  describe '#perform' do
5
+ let!(:account) { FactoryGirl.create(:account, canvas_id: 1) }
5
6
  let(:role_params) { open_canvas_fixture('roles') }
6
7
  let(:job_chain) { { jobs: [], global_options: {}} }
7
8
 
8
- it 'retrieves all terms from the Canvas API and then invokes the next job' do
9
+ it 'retrieves all roles from the Canvas API and then invokes the next job' do
9
10
  expect(CanvasSync).to receive(:invoke_next).with(job_chain)
10
11
 
11
12
  expect {
@@ -11,6 +11,7 @@ RSpec.describe CanvasSync::Jobs::SyncSimpleTableJob do
11
11
  it 'enqueues a ReportStarter for a provisioning report for the specified model for a term' do
12
12
  expected_job_chain = Marshal.load(Marshal.dump(job_chain))
13
13
  expected_job_chain[:global_options][:canvas_term_id] = active_term_1.canvas_id
14
+ expected_job_chain[:global_options] = hash_including(expected_job_chain[:global_options])
14
15
 
15
16
  expect(CanvasSync::Jobs::ReportStarter).to receive(:perform_later)
16
17
  .with(
@@ -5,7 +5,7 @@ RSpec.describe CanvasSync::Jobs::SyncSubmissionsJob do
5
5
  context "a term id is in the global_options" do
6
6
  it "enqueues a ReportStarter for the proserv_student_submissions_csv for the given term" do
7
7
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
8
- .with("self", "proserv_student_submissions_csv", "parameters[enrollment_term_id]" => 1)
8
+ .with("self", "proserv_student_submissions_csv", { parameters: { enrollment_term_id: 1, include_all: nil } })
9
9
  .and_return("id" => 1)
10
10
 
11
11
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -4,7 +4,7 @@ RSpec.describe CanvasSync::Jobs::SyncUsersJob do
4
4
  describe '#perform' do
5
5
  it 'enqueues a ReportStarter for a provisioning report across all terms with just users' do
6
6
  expect_any_instance_of(Bearcat::Client).to receive(:start_report)
7
- .with('self', 'proservices_provisioning_csv', CanvasSync::Jobs::SyncUsersJob::REPORT_PARAMS)
7
+ .with('self', 'proservices_provisioning_csv', { parameters: { users: true, include_deleted: true } })
8
8
  .and_return({ 'id' => 1 })
9
9
 
10
10
  expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
@@ -8,19 +8,18 @@ RSpec.describe Admin, type: :model do
8
8
  it { should validate_uniqueness_of(:canvas_id) }
9
9
  end
10
10
 
11
- describe '.create_or_update' do
11
+ describe '.create_or_update_from_api_params' do
12
12
  let(:admin_params) { open_canvas_fixture('admins')[0] }
13
13
 
14
14
  context 'the admin does not already exist' do
15
15
  it 'creates it' do
16
16
  expect {
17
- Admin.create_or_update(admin_params)
17
+ Admin.create_or_update_from_api_params(admin_params)
18
18
  }.to change { Admin.count }.by(1)
19
19
 
20
20
  admin = Admin.last
21
21
  expect(admin.role_name).to eq(admin_params['role'])
22
22
  expect(admin.canvas_role_id).to eq(admin_params['role_id'])
23
- expect(admin.user_data).to eq(admin_params['user'])
24
23
  expect(admin.canvas_user_id).to eq(admin_params['user']['id'])
25
24
  expect(admin.workflow_state).to eq(admin_params['workflow_state'])
26
25
  end
@@ -31,13 +30,12 @@ RSpec.describe Admin, type: :model do
31
30
 
32
31
  it 'updates it' do
33
32
  expect {
34
- Admin.create_or_update(admin_params)
33
+ Admin.create_or_update_from_api_params(admin_params)
35
34
  }.to_not change { Admin.count }
36
35
 
37
36
  existing_admin.reload
38
37
  expect(existing_admin.role_name).to eq(admin_params['role'])
39
38
  expect(existing_admin.canvas_role_id).to eq(admin_params['role_id'])
40
- expect(existing_admin.user_data).to eq(admin_params['user'])
41
39
  expect(existing_admin.canvas_user_id).to eq(admin_params['user']['id'])
42
40
  expect(existing_admin.workflow_state).to eq(admin_params['workflow_state'])
43
41
  end
@@ -8,19 +8,19 @@ RSpec.describe Role, type: :model do
8
8
  it { should validate_uniqueness_of(:canvas_id) }
9
9
  end
10
10
 
11
- describe '.create_or_update' do
11
+ describe '.create_or_update_from_api_params' do
12
12
  let(:role_params) { open_canvas_fixture('roles')[0] }
13
13
 
14
14
  context 'the role does not already exist' do
15
15
  it 'creates it' do
16
16
  expect {
17
- Role.create_or_update(role_params)
17
+ Role.create_or_update_from_api_params(role_params)
18
18
  }.to change { Role.count }.by(1)
19
19
 
20
20
  role = Role.last
21
21
  expect(role.label).to eq(role_params['label'])
22
22
  expect(role.base_role_type).to eq(role_params['base_role_type'])
23
- expect(role.account).to eq(role_params['account'])
23
+ expect(role.canvas_account_id).to eq(role_params['account']['id'])
24
24
  expect(role.permissions).to eq(role_params['permissions'])
25
25
  expect(role.workflow_state).to eq(role_params['workflow_state'])
26
26
  end
@@ -31,13 +31,13 @@ RSpec.describe Role, type: :model do
31
31
 
32
32
  it 'updates it' do
33
33
  expect {
34
- Role.create_or_update(role_params)
34
+ Role.create_or_update_from_api_params(role_params)
35
35
  }.to_not change { Role.count }
36
36
 
37
37
  existing_role.reload
38
38
  expect(existing_role.label).to eq(role_params['label'])
39
39
  expect(existing_role.base_role_type).to eq(role_params['base_role_type'])
40
- expect(existing_role.account).to eq(role_params['account'])
40
+ expect(existing_role.canvas_account_id).to eq(role_params['account']['id'])
41
41
  expect(existing_role.permissions).to eq(role_params['permissions'])
42
42
  expect(existing_role.workflow_state).to eq(role_params['workflow_state'])
43
43
  end