canvas_sync 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -11
- data/lib/canvas_sync.rb +6 -12
- data/lib/canvas_sync/jobs/application_job.rb +0 -9
- data/lib/canvas_sync/jobs/report_checker.rb +2 -8
- data/lib/canvas_sync/jobs/report_processor_job.rb +2 -4
- data/lib/canvas_sync/jobs/report_starter.rb +2 -7
- data/lib/canvas_sync/jobs/sync_provisioning_report_job.rb +1 -7
- data/lib/canvas_sync/jobs/sync_terms_job.rb +3 -7
- data/lib/canvas_sync/jobs/sync_users_job.rb +1 -5
- data/lib/canvas_sync/version.rb +1 -1
- data/spec/canvas_sync/canvas_sync_spec.rb +2 -7
- data/spec/canvas_sync/jobs/report_checker_spec.rb +1 -5
- data/spec/canvas_sync/jobs/report_processor_job_spec.rb +1 -5
- data/spec/canvas_sync/jobs/report_starter_spec.rb +1 -4
- data/spec/canvas_sync/jobs/sync_provisioning_report_job_spec.rb +0 -13
- data/spec/canvas_sync/jobs/sync_terms_job_spec.rb +2 -5
- data/spec/canvas_sync/jobs/sync_users_job_spec.rb +1 -4
- data/spec/dummy/db/test.sqlite3 +0 -0
- data/spec/dummy/log/test.log +9462 -0
- data/spec/spec_helper.rb +4 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1489eac6e822527f27f73828fbe9bcccad401e55
|
4
|
+
data.tar.gz: e91a8c75620d6006dc935a2f7774e2cce04b4922
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a8bb596f0e3c59b5318c1cb79927ca74fc08733a0e4db1733dc9ba45b6c2613ae13d1732a3b79dd8c99e3ec0f55be69c0740b44a3beced935c1a0c390f8e9ba
|
7
|
+
data.tar.gz: 163a3abc8abcba6f3406bcc0feb31fdb5b71fed6648d730bb716af112aa4fa8fddfd6487f1f4c860ed0117c9fad7f813400fb9bcfcb67601f05bf599eed7352c
|
data/README.md
CHANGED
@@ -34,16 +34,27 @@ The yard server will give you a URL you can visit to view the docs.
|
|
34
34
|
|
35
35
|
## Basic Usage
|
36
36
|
|
37
|
-
Your tool must have an `ActiveJob` compatible job queue adapter configured, such as DelayedJob or Sidekiq.
|
37
|
+
Your tool must have an `ActiveJob` compatible job queue adapter configured, such as DelayedJob or Sidekiq. Additionally, you must have a method called `canvas_sync_client` defined in an initializer that returns a Bearcat client for the Canvas instance you are syncing against. Example:
|
38
38
|
|
39
39
|
```ruby
|
40
|
-
|
40
|
+
# config/initializers/canvas_sync.rb
|
41
|
+
def canvas_sync_client
|
42
|
+
Bearcat::Client.new(token: current_organization.settings[:api_token], prefix: current_organization.settings[:base_url])
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
46
|
+
(Having the client defined here means the sensitive API token doesn't have to be passed in plain text between jobs.)
|
47
|
+
|
48
|
+
Once that's done and you've used the generator to create your models and migrations you can run the standard provisioning sync:
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
CanvasSync.provisioning_sync(<array of models to sync>, <optional term scope>)
|
41
52
|
```
|
42
53
|
|
43
54
|
Example:
|
44
55
|
|
45
56
|
```ruby
|
46
|
-
CanvasSync.provisioning_sync(
|
57
|
+
CanvasSync.provisioning_sync(['users', 'courses'], :active)
|
47
58
|
```
|
48
59
|
|
49
60
|
This will kick off a string of jobs to sync your specified models.
|
@@ -76,14 +87,12 @@ end
|
|
76
87
|
|
77
88
|
You must implement a job that will enqueue a report starter for your report. (TODO: would be nice to make some sort of builder for this, so you just define the report and its params and then the gem runs it in a pre-defined job.)
|
78
89
|
|
79
|
-
Let's say we have a custom Canvas report called "my_really_cool_report_csv". First, we would need to create a job class that will enqueue a report starter. To work with the `CanvasSync` interface, your class must accept
|
90
|
+
Let's say we have a custom Canvas report called "my_really_cool_report_csv". First, we would need to create a job class that will enqueue a report starter. To work with the `CanvasSync` interface, your class must accept 2 parameters: `job_chain`, and `options`.
|
80
91
|
|
81
92
|
```ruby
|
82
93
|
class MyReallyCoolReportJob < CanvasSync::Jobs::ReportStarter
|
83
|
-
def perform(
|
94
|
+
def perform(job_chain, options)
|
84
95
|
super(
|
85
|
-
canvas_base_url,
|
86
|
-
canvas_api_token,
|
87
96
|
job_chain,
|
88
97
|
'my_really_cool_report_csv', # Report name
|
89
98
|
{ "parameters[param1]" => true }, # Report parameters
|
@@ -121,7 +130,7 @@ job_chain = {
|
|
121
130
|
options: {}
|
122
131
|
}
|
123
132
|
|
124
|
-
CanvasSync.process_jobs(
|
133
|
+
CanvasSync.process_jobs(job_chain)
|
125
134
|
```
|
126
135
|
|
127
136
|
What if you've got some other job that you want run that doesn't deal with a report? No problem! Just make sure you call `CanvasSync.invoke_next` at the end of your job. Example:
|
@@ -129,10 +138,10 @@ What if you've got some other job that you want run that doesn't deal with a rep
|
|
129
138
|
|
130
139
|
```
|
131
140
|
class SomeRandomJob < CanvasSync::Jobs::ApplicationJob
|
132
|
-
def perform(
|
141
|
+
def perform(job_chain, options)
|
133
142
|
i_dunno_do_something!
|
134
143
|
|
135
|
-
CanvasSync.invoke_next(
|
144
|
+
CanvasSync.invoke_next(job_chain)
|
136
145
|
end
|
137
146
|
end
|
138
147
|
|
@@ -144,7 +153,7 @@ job_chain = {
|
|
144
153
|
options: {}
|
145
154
|
}
|
146
155
|
|
147
|
-
CanvasSync.process_jobs(
|
156
|
+
CanvasSync.process_jobs(job_chain)
|
148
157
|
```
|
149
158
|
|
150
159
|
### Batching
|
data/lib/canvas_sync.rb
CHANGED
@@ -21,36 +21,30 @@ module CanvasSync
|
|
21
21
|
# and have also specified a Term scope, Users will by synced first, before
|
22
22
|
# every other model (as Users are never scoped to Term).
|
23
23
|
#
|
24
|
-
# @param canvas_base_url [String] e.g., "https://pseng.instructure.com"
|
25
|
-
# @param canvas_api_token [String] A Canvas API token for the specified Canvas instance
|
26
24
|
# @param models [Array<String>] A list of models to sync. e.g., ['users', 'courses'].
|
27
25
|
# must be one of SUPPORTED_MODELS
|
28
26
|
# @param term_scope [Symbol, nil] An optional symbol representing a scope that exists on the Term model.
|
29
27
|
# The provisioning report will be run for each of the terms contained in that scope.
|
30
|
-
def self.provisioning_sync(
|
28
|
+
def self.provisioning_sync(models, term_scope=nil)
|
31
29
|
validate_models!(models)
|
32
|
-
invoke_next(
|
30
|
+
invoke_next(default_provisioning_report_chain(models, term_scope))
|
33
31
|
end
|
34
32
|
|
35
33
|
# Runs a chain of ordered jobs
|
36
34
|
#
|
37
35
|
# See the README for usage and examples
|
38
36
|
#
|
39
|
-
# @param canvas_base_url [String]
|
40
|
-
# @param canvas_api_token [String]
|
41
37
|
# @param job_chain [Hash]
|
42
|
-
def self.process_jobs(
|
43
|
-
invoke_next(
|
38
|
+
def self.process_jobs(job_chain)
|
39
|
+
invoke_next(job_chain)
|
44
40
|
end
|
45
41
|
|
46
42
|
# Invokes the next job in a chain of jobs.
|
47
43
|
#
|
48
44
|
# This should typically be called automatically by the gem where necessary.
|
49
45
|
#
|
50
|
-
# @param canvas_base_url [String] e.g., "https://pseng.instructure.com"
|
51
|
-
# @param canvas_api_token [String] A Canvas API token for the specified Canvas instance
|
52
46
|
# @param job_chain [Hash] A chain of jobs to execute
|
53
|
-
def self.invoke_next(
|
47
|
+
def self.invoke_next(job_chain)
|
54
48
|
return if job_chain[:jobs].empty?
|
55
49
|
|
56
50
|
# Make sure all job classes are serialized as strings
|
@@ -60,7 +54,7 @@ module CanvasSync
|
|
60
54
|
jobs = duped_job_chain[:jobs]
|
61
55
|
next_job = jobs.shift
|
62
56
|
next_job_class = next_job[:job].constantize
|
63
|
-
next_job_class.perform_later(
|
57
|
+
next_job_class.perform_later(duped_job_chain, next_job[:options])
|
64
58
|
end
|
65
59
|
|
66
60
|
# Syncs terms, users if necessary, then the rest of the specified models.
|
@@ -5,15 +5,6 @@ module CanvasSync
|
|
5
5
|
# Inherit from this class to build a Job that integrates
|
6
6
|
# well with this gem.
|
7
7
|
class ApplicationJob < ActiveJob::Base
|
8
|
-
# Generates a Bearcat::Client used for Canvas API calls
|
9
|
-
#
|
10
|
-
# @param canvas_base_url [String]
|
11
|
-
# @param canvas_api_token [String]
|
12
|
-
# @return [Bearcat::Client]
|
13
|
-
def canvas_client(canvas_base_url, canvas_api_token)
|
14
|
-
Bearcat::Client.new(token: canvas_api_token, prefix: canvas_base_url)
|
15
|
-
end
|
16
|
-
|
17
8
|
# Returns the amount of time to wait between report status checks
|
18
9
|
#
|
19
10
|
# @return [Integer]
|
@@ -4,22 +4,18 @@ module CanvasSync
|
|
4
4
|
# Re-enqueues itself if the report is still processing on Canvas.
|
5
5
|
# Enqueues the ReportProcessor when the report has completed.
|
6
6
|
class ReportChecker < ApplicationJob
|
7
|
-
# @param canvas_base_url [String]
|
8
|
-
# @param canvas_api_token [String]
|
9
7
|
# @param job_chain [Hash]
|
10
8
|
# @param report_name [Hash] e.g., 'provisioning_csv'
|
11
9
|
# @param report_id [Integer]
|
12
10
|
# @param processor [String] a stringified report processor class name
|
13
11
|
# @param options [Hash] hash of options that will be passed to the job processor
|
14
12
|
# @return [nil]
|
15
|
-
def perform(
|
16
|
-
report_status =
|
13
|
+
def perform(job_chain, report_name, report_id, processor, options)
|
14
|
+
report_status = canvas_sync_client.report_status('self', report_name, report_id)
|
17
15
|
|
18
16
|
case report_status['status'].downcase
|
19
17
|
when 'complete'
|
20
18
|
CanvasSync::Jobs::ReportProcessorJob.perform_later(
|
21
|
-
canvas_base_url,
|
22
|
-
canvas_api_token,
|
23
19
|
job_chain,
|
24
20
|
report_name,
|
25
21
|
report_status['attachment']['url'],
|
@@ -33,8 +29,6 @@ module CanvasSync
|
|
33
29
|
else
|
34
30
|
CanvasSync::Jobs::ReportChecker.set(wait: report_checker_wait_time)
|
35
31
|
.perform_later(
|
36
|
-
canvas_base_url,
|
37
|
-
canvas_api_token,
|
38
32
|
job_chain,
|
39
33
|
report_name,
|
40
34
|
report_id,
|
@@ -6,20 +6,18 @@ module CanvasSync
|
|
6
6
|
# download the report, and then pass the file path and options into the
|
7
7
|
# process method on the processor.
|
8
8
|
class ReportProcessorJob < ApplicationJob
|
9
|
-
# @param canvas_base_url [String]
|
10
|
-
# @param canvas_api_token [String]
|
11
9
|
# @param job_chain [Hash]
|
12
10
|
# @param report_name [Hash] e.g., 'provisioning_csv'
|
13
11
|
# @param report_url [String]
|
14
12
|
# @param processor [String] a stringified report processor class name
|
15
13
|
# @param options [Hash] hash of options that will be passed to the job processor
|
16
14
|
# @return [nil]
|
17
|
-
def perform(
|
15
|
+
def perform(job_chain, report_name, report_url, processor, options)
|
18
16
|
download(report_name, report_url) do |file_path|
|
19
17
|
processor.constantize.process(file_path, options)
|
20
18
|
end
|
21
19
|
|
22
|
-
CanvasSync.invoke_next(
|
20
|
+
CanvasSync.invoke_next(job_chain)
|
23
21
|
end
|
24
22
|
|
25
23
|
private
|
@@ -2,21 +2,16 @@ module CanvasSync
|
|
2
2
|
module Jobs
|
3
3
|
# Starts a Canvas report and enqueues a ReportChecker
|
4
4
|
class ReportStarter < ApplicationJob
|
5
|
-
# @param canvas_base_url [String]
|
6
|
-
# @param canvas_api_token [String]
|
7
5
|
# @param job_chain [Hash]
|
8
6
|
# @param report_name [Hash] e.g., 'provisioning_csv'
|
9
7
|
# @param report_params [Hash] The Canvas report parameters
|
10
8
|
# @param processor [String] a stringified report processor class name
|
11
9
|
# @param options [Hash] hash of options that will be passed to the job processor
|
12
10
|
# @return [nil]
|
13
|
-
def perform(
|
14
|
-
|
15
|
-
report = client.start_report('self', report_name, report_params)
|
11
|
+
def perform(job_chain, report_name, report_params, processor, options)
|
12
|
+
report = canvas_sync_client.start_report('self', report_name, report_params)
|
16
13
|
|
17
14
|
CanvasSync::Jobs::ReportChecker.set(wait: report_checker_wait_time).perform_later(
|
18
|
-
canvas_base_url,
|
19
|
-
canvas_api_token,
|
20
15
|
job_chain,
|
21
16
|
report_name,
|
22
17
|
report['id'],
|
@@ -2,15 +2,11 @@ module CanvasSync
|
|
2
2
|
module Jobs
|
3
3
|
# ActiveJob class that starts a Canvas provisioning report
|
4
4
|
class SyncProvisioningReportJob < ApplicationJob
|
5
|
-
# @param canvas_base_url [String]
|
6
|
-
# @param canvas_api_token [String]
|
7
5
|
# @param job_chain [Hash]
|
8
6
|
# @param options [Hash] If options contains a :term_scope a seperate provisioning report
|
9
7
|
# will be started for each term in that scope. :models should be an array of
|
10
8
|
# models to sync.
|
11
|
-
def perform(
|
12
|
-
@canvas_base_url = canvas_base_url
|
13
|
-
@canvas_api_token = canvas_api_token
|
9
|
+
def perform(job_chain, options)
|
14
10
|
@job_chain = job_chain
|
15
11
|
|
16
12
|
if options[:term_scope]
|
@@ -30,8 +26,6 @@ module CanvasSync
|
|
30
26
|
|
31
27
|
def start_report(report_params, options)
|
32
28
|
CanvasSync::Jobs::ReportStarter.perform_later(
|
33
|
-
@canvas_base_url,
|
34
|
-
@canvas_api_token,
|
35
29
|
@job_chain,
|
36
30
|
'proservices_provisioning_csv',
|
37
31
|
report_params,
|
@@ -5,18 +5,14 @@ module CanvasSync
|
|
5
5
|
#
|
6
6
|
# Terms are pre-synced so that provisioning reports can be scoped to term.
|
7
7
|
#
|
8
|
-
# @param canvas_base_url [String]
|
9
|
-
# @param canvas_api_token [String]
|
10
8
|
# @param job_chain [Hash]
|
11
9
|
# @param options [Hash]
|
12
|
-
def perform(
|
13
|
-
|
14
|
-
|
15
|
-
client.terms('self').all_pages!.each do |term_params|
|
10
|
+
def perform(job_chain, options)
|
11
|
+
canvas_sync_client.terms('self').all_pages!.each do |term_params|
|
16
12
|
Term.create_or_update(term_params)
|
17
13
|
end
|
18
14
|
|
19
|
-
CanvasSync.invoke_next(
|
15
|
+
CanvasSync.invoke_next(job_chain)
|
20
16
|
end
|
21
17
|
end
|
22
18
|
end
|
@@ -12,14 +12,10 @@ module CanvasSync
|
|
12
12
|
# running provisioning by term we sync users first so we don't duplicate
|
13
13
|
# the work of syncing all users for each term.
|
14
14
|
#
|
15
|
-
# @param canvas_base_url [String]
|
16
|
-
# @param canvas_api_token [String]
|
17
15
|
# @param job_chain [Hash]
|
18
16
|
# @param options [Hash]
|
19
|
-
def perform(
|
17
|
+
def perform(job_chain, options)
|
20
18
|
super(
|
21
|
-
canvas_base_url,
|
22
|
-
canvas_api_token,
|
23
19
|
job_chain,
|
24
20
|
'proservices_provisioning_csv',
|
25
21
|
REPORT_PARAMS,
|
data/lib/canvas_sync/version.rb
CHANGED
@@ -2,28 +2,23 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
RSpec.describe CanvasSync do
|
4
4
|
describe '.provisioning_sync' do
|
5
|
-
let(:canvas_base_url) { 'https://test.instructure.com' }
|
6
|
-
let(:canvas_api_token) { 'cool-api-token' }
|
7
|
-
|
8
5
|
it 'invokes the first job in the queue and passes on the rest of the job chain' do
|
9
6
|
expected_job_chain = CanvasSync.default_provisioning_report_chain(['courses'], nil)
|
10
7
|
first_job = expected_job_chain[:jobs].shift
|
11
8
|
|
12
9
|
expect(CanvasSync::Jobs::SyncTermsJob).to receive(:perform_later)
|
13
10
|
.with(
|
14
|
-
canvas_base_url,
|
15
|
-
canvas_api_token,
|
16
11
|
expected_job_chain,
|
17
12
|
first_job[:options]
|
18
13
|
)
|
19
14
|
|
20
|
-
CanvasSync.provisioning_sync(
|
15
|
+
CanvasSync.provisioning_sync(['courses'])
|
21
16
|
end
|
22
17
|
|
23
18
|
context 'an invalid model is passed in' do
|
24
19
|
it 'raises a helpful exception' do
|
25
20
|
expect {
|
26
|
-
CanvasSync.provisioning_sync(
|
21
|
+
CanvasSync.provisioning_sync(['courses', 'cheeses'])
|
27
22
|
}.to raise_error("Invalid model(s) specified: cheeses. Only #{CanvasSync::SUPPORTED_MODELS.join(', ')} are supported.")
|
28
23
|
end
|
29
24
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe CanvasSync::Jobs::ReportChecker do
|
4
|
-
let(:canvas_base_url) { 'https://test.instructure.com' }
|
5
|
-
let(:canvas_api_token) { 'cool-api-token' }
|
6
4
|
let(:client_double) { double('client') }
|
7
5
|
let(:report_id) { 1 }
|
8
6
|
let(:report_name) { 'provisioning_csv' }
|
@@ -11,8 +9,6 @@ RSpec.describe CanvasSync::Jobs::ReportChecker do
|
|
11
9
|
describe '#perform' do
|
12
10
|
def start_job
|
13
11
|
CanvasSync::Jobs::ReportChecker.perform_now(
|
14
|
-
canvas_base_url,
|
15
|
-
canvas_api_token,
|
16
12
|
[],
|
17
13
|
'provisioning_csv',
|
18
14
|
report_id,
|
@@ -28,7 +24,7 @@ RSpec.describe CanvasSync::Jobs::ReportChecker do
|
|
28
24
|
.and_return({ 'status' => 'complete', 'attachment' => { 'url' => 'blah' } })
|
29
25
|
|
30
26
|
expect(CanvasSync::Jobs::ReportProcessorJob).to receive(:perform_later)
|
31
|
-
.with(
|
27
|
+
.with([], report_name, 'blah', processor, {})
|
32
28
|
|
33
29
|
start_job
|
34
30
|
end
|
@@ -3,8 +3,6 @@ require 'spec_helper'
|
|
3
3
|
class FakeProcessor; end;
|
4
4
|
|
5
5
|
RSpec.describe CanvasSync::Jobs::ReportProcessorJob do
|
6
|
-
let(:canvas_base_url) { 'https://test.instructure.com' }
|
7
|
-
let(:canvas_api_token) { 'cool-api-token' }
|
8
6
|
let(:report_name) { 'provisioning_csv' }
|
9
7
|
let(:report_url) { 'https://test.instructure.com/sample_report_download' }
|
10
8
|
let(:processor) { FakeProcessor.to_s }
|
@@ -14,11 +12,9 @@ RSpec.describe CanvasSync::Jobs::ReportProcessorJob do
|
|
14
12
|
it 'downloads the report to a file and then calls the process method on the processor, and then invokes the next job' do
|
15
13
|
expect(IO).to receive(:copy_stream)
|
16
14
|
expect(FakeProcessor).to receive(:process)
|
17
|
-
expect(CanvasSync).to receive(:invoke_next).with(
|
15
|
+
expect(CanvasSync).to receive(:invoke_next).with(job_chain)
|
18
16
|
|
19
17
|
CanvasSync::Jobs::ReportProcessorJob.perform_now(
|
20
|
-
canvas_base_url,
|
21
|
-
canvas_api_token,
|
22
18
|
job_chain,
|
23
19
|
report_name,
|
24
20
|
report_url,
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe CanvasSync::Jobs::ReportStarter do
|
4
|
-
let(:canvas_base_url) { 'https://test.instructure.com' }
|
5
|
-
let(:canvas_api_token) { 'cool-api-token' }
|
6
4
|
let(:report_params) { { 'parameters[users]' => true } }
|
7
5
|
let(:report_name) { 'provisioning_csv' }
|
8
6
|
let(:processor) { 'CoolProcessor' }
|
@@ -15,8 +13,7 @@ RSpec.describe CanvasSync::Jobs::ReportStarter do
|
|
15
13
|
|
16
14
|
expect(CanvasSync::Jobs::ReportChecker).to receive(:set).and_call_original
|
17
15
|
|
18
|
-
CanvasSync::Jobs::ReportStarter.perform_now(
|
19
|
-
canvas_api_token,
|
16
|
+
CanvasSync::Jobs::ReportStarter.perform_now(
|
20
17
|
[],
|
21
18
|
report_name,
|
22
19
|
report_params,
|
@@ -1,9 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
|
4
|
-
let(:canvas_base_url) { 'https://test.instructure.com' }
|
5
|
-
let(:canvas_api_token) { 'cool-api-token' }
|
6
|
-
|
7
4
|
describe '#perform' do
|
8
5
|
context 'a term scope is specified' do
|
9
6
|
let!(:active_term_1) { FactoryGirl.create(:term) }
|
@@ -13,8 +10,6 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
|
|
13
10
|
it 'enqueues a ReportStarter for a provisioning report for the specified models for each term' do
|
14
11
|
expect(CanvasSync::Jobs::ReportStarter).to receive(:perform_later)
|
15
12
|
.with(
|
16
|
-
canvas_base_url,
|
17
|
-
canvas_api_token,
|
18
13
|
[],
|
19
14
|
'proservices_provisioning_csv',
|
20
15
|
{
|
@@ -29,8 +24,6 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
|
|
29
24
|
|
30
25
|
expect(CanvasSync::Jobs::ReportStarter).to receive(:perform_later)
|
31
26
|
.with(
|
32
|
-
canvas_base_url,
|
33
|
-
canvas_api_token,
|
34
27
|
[],
|
35
28
|
'proservices_provisioning_csv',
|
36
29
|
{
|
@@ -44,8 +37,6 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
|
|
44
37
|
)
|
45
38
|
|
46
39
|
CanvasSync::Jobs::SyncProvisioningReportJob.perform_now(
|
47
|
-
canvas_base_url,
|
48
|
-
canvas_api_token,
|
49
40
|
[],
|
50
41
|
{ models: ['users', 'courses'], term_scope: 'active' }
|
51
42
|
)
|
@@ -56,8 +47,6 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
|
|
56
47
|
it 'enqueues a single ReportStarter for a provisioning report across all terms for the specified models' do
|
57
48
|
expect(CanvasSync::Jobs::ReportStarter).to receive(:perform_later)
|
58
49
|
.with(
|
59
|
-
canvas_base_url,
|
60
|
-
canvas_api_token,
|
61
50
|
[],
|
62
51
|
'proservices_provisioning_csv',
|
63
52
|
{
|
@@ -70,8 +59,6 @@ RSpec.describe CanvasSync::Jobs::SyncProvisioningReportJob do
|
|
70
59
|
)
|
71
60
|
|
72
61
|
CanvasSync::Jobs::SyncProvisioningReportJob.perform_now(
|
73
|
-
canvas_base_url,
|
74
|
-
canvas_api_token,
|
75
62
|
[],
|
76
63
|
{ models: ['users', 'courses'] }
|
77
64
|
)
|