test plan:
* validated e-mails listed under the "Ways to Contact"
on the user settings right side should not be
non-functional links
closes #CNVS-25966
Change-Id: I7fe9811f59ff65bb82feb28c1d7c5b5f07f8f82b
Reviewed-on: https://gerrit.instructure.com/73252
Tested-by: Jenkins
Reviewed-by: Clay Diffrient <cdiffrient@instructure.com>
QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
iow, don't let image_tag generate alt text badly
test plan: (T_T)
fixes CNVS-27489
fixes CNVS-27043
Change-Id: I52dfe7703f57074df61358262f195161cd34c32f
Reviewed-on: https://gerrit.instructure.com/73334
Tested-by: Jenkins
Reviewed-by: Simon Williams <simon@instructure.com>
QA-Review: Heath Hales <hhales@instructure.com>
Product-Review: Jeremy Stanley <jeremy@instructure.com>
it prevents clearing schema caches. it was likely intended to
prevent truncating the same table multiple times in spec_helper,
but we haven't used all_models for that in a long time
Change-Id: Ife47ea6c565c1334c3049f91e3012b7e1f1de0f7
Reviewed-on: https://gerrit.instructure.com/73406
Reviewed-by: Brad Horrocks <bhorrocks@instructure.com>
Tested-by: Jenkins
Reviewed-by: Jacob Fugal <jacob@instructure.com>
Product-Review: Cody Cutrer <cody@instructure.com>
QA-Review: Cody Cutrer <cody@instructure.com>
fixes CNVS-27480
test plan
- run lti report on a sub account
- it should only contain lti tools from sub_account
Change-Id: I4f70326b0da296c30c2fed039be27c900347afb8
Reviewed-on: https://gerrit.instructure.com/72897
Reviewed-by: Cody Cutrer <cody@instructure.com>
Tested-by: Jenkins
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Product-Review: Rob Orton <rob@instructure.com>
There have been some inconsistencies in date and time formats. However,
by standardizing our own translation config files on 24 hour time
formats and including the Hebrew Geresh symbol (׳) in our day and month
name abbreviations we have found a configuration that seems to work well
(or at least consistently).
closes CNVS-26264
test plan:
- enable translations locally and set your language to hebrew
- make sure both ruby and javascript translations work
- check a datetime field specifically
Change-Id: I07128071fb89d7129a1fbdc1e0c446866850f3f5
Reviewed-on: https://gerrit.instructure.com/69911
Reviewed-by: Rob Orton <rob@instructure.com>
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Tested-by: Jenkins
Product-Review: Simon Williams <simon@instructure.com>
We're removing this volume for now because it ends up getting the wrong
permissions making it impossible for a fresh install to work properly.
Change-Id: I9e08510722bf7bcc8b87c04fce697d5ba26f299b
Reviewed-on: https://gerrit.instructure.com/73495
Reviewed-by: Clay Diffrient <cdiffrient@instructure.com>
Tested-by: Jenkins
Product-Review: Tyler Pickett <tpickett@instructure.com>
QA-Review: Tyler Pickett <tpickett@instructure.com>
test plan:
* create a course with two sections
* create an assignment that is only assigned
for one course section
* create two modules and make the first a prerequisite
for the second
* add the assignment as a requirement for the first
* add a student in the other course section
* the second module should be unlocked for them since
they can't see the required assignment
* edit the assignment to be assigned to the other
course section
* revisit the modules page as the student
* the assignment should be visible and the second module locked
closes #CNVS-27470
Change-Id: I366592d11302362b7d92019f211915ce2c29266e
Reviewed-on: https://gerrit.instructure.com/73076
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Deepeeca Soundarrajan <dsoundarrajan@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
the only thing that was using this were some specs
for moderatedGrading. since we only run our qUnit
tests in modern browsers that have native `Promise`
support, we don't need to polyfill it there
whenJS(someVal) is exactly the same as Promise.resolve(someVal)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve
test plan:
moderatedActionsSpec should pass
Change-Id: Ia0f8d24f8452bf0aafce8b11e4e36dad9e472797
Reviewed-on: https://gerrit.instructure.com/73243
Reviewed-by: Clay Diffrient <cdiffrient@instructure.com>
Tested-by: Jenkins
Product-Review: Ryan Shaw <ryan@instructure.com>
QA-Review: Ryan Shaw <ryan@instructure.com>
in the gradebook, we should default to sorting by
assignment group if the custom sort setting is
invalid. we normally do default to sorting by
assignment group if the custom sort setting is
invalid, but a regression was introduced in
696f099e7c
closes CNVS-27545
test plan:
- enter a rails console and find a teacher for
one of your courses
$ bundle exec rails console
$ course = Course.find(1)
$ teacher = course.teachers.active.first
- set the teacher's gradebook sort settings to
an invalid custom sort (it is invalid if it
does not have a customOrder property)
$ teacher.preferences[:gradebook_column_order] =
{ course.id => { "sortType" => "custom" } }
$ teacher.save!
- log in as the teacher above and go to the
gradebook for the course above
- verify the gradebook loads
Change-Id: I84a4d620c2cc1c4fe38d383cd0db254e30e9d245
Reviewed-on: https://gerrit.instructure.com/73448
Reviewed-by: Derek Bender <djbender@instructure.com>
Tested-by: Jenkins
QA-Review: KC Naegle <knaegle@instructure.com>
Reviewed-by: Keith T. Garner <kgarner@instructure.com>
Product-Review: Keith T. Garner <kgarner@instructure.com>
test plan:
* create a custom course role for an account
* create a sub-account
* enable the permission on the parent account, but
disable it on the sub-account
* create a course for the sub account
* enroll a user in the course using the custom role
* check the disabled permission for the user
* it should be disabled
closes #CNVS-25230
Change-Id: I39c3d65f74c73ae3ae4d6457c072cb2fbab35512
Reviewed-on: https://gerrit.instructure.com/73225
Reviewed-by: Cody Cutrer <cody@instructure.com>
Tested-by: Jenkins
QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
test plan:
* from the course settings, click "Copy this Course"
* on the course copy form, enter a start date
* enter an end date before the start date
* it should prevent the form from being submitted
and pop up an error
* changing the date to a valid one should work
closes #CNVS-26590
Change-Id: I98ac199c946c432d4ab1ea1e19a182d6955d20de
Reviewed-on: https://gerrit.instructure.com/73356
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
test plan:
* create a user with notification preferences
for "Membership Update" (under Groups) set to ASAP
* enroll the user in a course as a teacher enrollment
but reject the invitation
* enroll a student in the course and accept the invitation
* it should not send a message to the teacher who rejected
closes #CNVS-27533
Change-Id: I7d65c697b80378642b934610bfebce9c3ef89f17
Reviewed-on: https://gerrit.instructure.com/73228
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
test plan:
* try to upload a file greater than 50MB for a quiz
file upload question submission
* it should be successful
closes #CNVS-27148
Change-Id: Id92ac58a31d0ab38b311fc5227dbd139bb1e35ad
Reviewed-on: https://gerrit.instructure.com/73050
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
test plan:
* import the package referenced in the ticket
* it should not create any module items linked to announcements
closes #CNVS-27609
Change-Id: I86a8c7ec2efbc766e7f82dac46a449faf0989788
Reviewed-on: https://gerrit.instructure.com/73412
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
fixes CNVS-27335
test plan
- users with just manage sis should not be able
to import sis data.
- users with just import sis permission should be
able to import sis data
- import sis permissions should only exist on
root_accounts
- manage sis users should still see the sis tab
on the account, but should not see any import
options
Change-Id: If965796a4b14630d6674f221805eff7d56da439f
Reviewed-on: https://gerrit.instructure.com/72411
Tested-by: Jenkins
Reviewed-by: Cody Cutrer <cody@instructure.com>
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Product-Review: Rob Orton <rob@instructure.com>
refs CNVS-27581
this ensures we have one correlation ID for a request coming
through the ecosystem rather than a seperate ID for each request
at each service. Each request id must be signed to make sure
others can't just submit whatever they want.
TEST PLAN:
1) make an API request and provide the header 'X-Request-Context-Id'
2) make sure to include the X-Request-Context-Signature header, which
should have the value of the sha512 signature with the shared
secret for the services ecosystem
2) the logs should show your provided value as the context Id for that
canvas request
Change-Id: I610fbe8c4df355d43c05360670f80971d1459644
Reviewed-on: https://gerrit.instructure.com/73166
Tested-by: Jenkins
Reviewed-by: Simon Williams <simon@instructure.com>
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Product-Review: Ethan Vizitei <evizitei@instructure.com>
Fixes: CNVS-27418
Test plan:
- With the new UI on, as an admin, go to your user
account settings, and turn on High Contrast UI.
- Go to Theme Editor, and you should see the
following alert at the top of the screen:
http://screencast.com/t/shbAlU6H
- The link should take you to your account settings
page
- Turn off High Contrast UI, go back into Theme
Editor, and the alert should no longer show.
Change-Id: I1686bd5e45405195cb511bd8a479e34975fec0b7
Reviewed-on: https://gerrit.instructure.com/73165
Tested-by: Jenkins
Reviewed-by: Jennifer Stern <jstern@instructure.com>
Product-Review: Jennifer Stern <jstern@instructure.com>
QA-Review: Myller de Araujo <myller@instructure.com>
closes CNVS-27597
We need to not slam consul for rarely changing data.
the '#find' method still gets the value from consul everytime.
Cache can be infinite or with timeout.
TEST PLAN:
1) have some data in consul for what the signing secret is for canvas
2) Make sure to query it (Canvas::Security::ServicesJwt.signing_secret)
3) change the consul data
4) query it again, it should not have updated
5) send a SIGHUP
6) query it again, it should have changed
Change-Id: I5b923b8e44ab90692e87969c494a7c65fafcad72
Reviewed-on: https://gerrit.instructure.com/73198
Reviewed-by: Cody Cutrer <cody@instructure.com>
Reviewed-by: Brian Palmer <brianp@instructure.com>
Tested-by: Jenkins
Reviewed-by: David Adams <dadams@instructure.com>
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Product-Review: Simon Williams <simon@instructure.com>
Fixes CNVS-27413
Test plan:
- Create an assignment
- Create more than 10 users
- Submit the assignment as each user
- As a teacher, verify that the actual number of assignments that
were submitted shows up next to the assignment in the to-do list
Change-Id: I3720ac1e24abbc78bf56f384dfd19400f51f1409
Reviewed-on: https://gerrit.instructure.com/72990
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
Tested-by: Jenkins
QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com>
Product-Review: Allison Weiss <allison@instructure.com>
these specs fail ~85% of the time (though they usually pass reruns).
switch to :once instead since it confers the same speed benefits without
the following drawbacks of :all hooks:
1. things like cached special accounts may be invalid (usually the failure
here)
2. you have to manually clean up afterward, otherwise later specs can break
test plan:
1. jenkins should pass with none of these failing
2. `rspec spec/selenium/gradebook_student_spec.rb:140:255 --order defined`
should now pass locally
Change-Id: Ie21c97a4ce54abe705db43b7fea6dc18b49ae63f
Reviewed-on: https://gerrit.instructure.com/73383
Reviewed-by: Michael Hargiss <mhargiss@instructure.com>
Tested-by: Jenkins
Product-Review: Jon Jensen <jon@instructure.com>
QA-Review: Jon Jensen <jon@instructure.com>
refs #CNVS-27475
Change-Id: I241b4c5454fb9d1e306a5a6281dca6f1da439f7c
Reviewed-on: https://gerrit.instructure.com/73357
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
QA-Review: James Williams <jamesw@instructure.com>
different runners on the same node could stomp on each other's
unzipped_file_path
also remove @export_folder, since it wasn't used
Change-Id: Ifcc75e8e1da7e568c457e8c0d1fc8fec0f1f6877
Reviewed-on: https://gerrit.instructure.com/73353
Tested-by: Jenkins
Reviewed-by: Landon Wilkins <lwilkins@instructure.com>
Product-Review: Landon Wilkins <lwilkins@instructure.com>
QA-Review: Landon Wilkins <lwilkins@instructure.com>
closes CNVS-24740
test plan:
- manually inspect the SQS payload and ensure that the request_id is
included
Change-Id: Ie694d77e8093b77fd96a09227aa1bc9e11156f9c
Reviewed-on: https://gerrit.instructure.com/72791
Tested-by: Jenkins
Reviewed-by: Jonathan Featherstone <jfeatherstone@instructure.com>
QA-Review: Gentry Beckmann <gbeckmann@instructure.com>
Product-Review: Simon Williams <simon@instructure.com>
Fixes: CNVS-26813
Note: This is really old code, with all inline
styles; so to fix the bug I had to create a new
stylesheet for this view and move the affected
inline styles to classes. This feature needs a
whole bunch of additional updating; but for now,
these changes address the problem in the ticket and
overall make the page a little nicer to use in the
new UI.
Also, this page iframes Canvas inside itself, so
I created a new environment variable that we can
use to generate a class for the body; so we can
style only the Canvas that is inside the iframe.
Test plan:
- Turn on the new UI
- As a student or teacher, create or go to an
assignment submission and click on the
Submission Details link in the top-right box.
- For the new UI, the changes in this commit are
as follows:
Before: http://screencast.com/t/LoPnF8F59
After: http://screencast.com/t/5aWTI7o9s
- For legacy UI, the changes in this commit are
minimal:
http://screencast.com/t/gIXRi3xA7aUP
Change-Id: I95ff8586c479b1d8ac049fb3f501b3ef8e961eba
Reviewed-on: https://gerrit.instructure.com/72075
Tested-by: Jenkins
Reviewed-by: Colleen Palmer <colleen@instructure.com>
Product-Review: Colleen Palmer <colleen@instructure.com>
QA-Review: Myller de Araujo <myller@instructure.com>
for an account csv sis import, the file must include the
parent_account_id column even if all the values in it are blank, so that
we can differentiate the file from a group import.
fixes CNVS-16875
test plan:
- check sis csv docs
Change-Id: I5c897a249886e8234a530ce9ea8e3b3dec88c093
Reviewed-on: https://gerrit.instructure.com/73205
Tested-by: Jenkins
Reviewed-by: Cody Cutrer <cody@instructure.com>
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Product-Review: Simon Williams <simon@instructure.com>
test plan:
- create an assignment with a long name that requires grading
- as a student, submit to the assignment
- ensure the teacher's todo item aligns the icon and
assignment name properly (see screenshots in the ticket)
fixes CNVS-26349
Change-Id: I9d9ef37699958622ff1cabfdcd979f3065500d08
Reviewed-on: https://gerrit.instructure.com/72955
Tested-by: Jenkins
Reviewed-by: James Williams <jamesw@instructure.com>
QA-Review: Deepeeca Soundarrajan <dsoundarrajan@instructure.com>
Product-Review: Jeremy Stanley <jeremy@instructure.com>
when setting up sharding beforehand via sql import (versus migrations), the
roles table won't be populated in the other shards. additionally the initial
call to truncate_all_tables generally won't populate it, since the shards
table will be empty.
Change-Id: Ia0565164da0bf3d904a1c45385e97ac564c0810e
Reviewed-on: https://gerrit.instructure.com/73231
Tested-by: Jenkins
Reviewed-by: Landon Wilkins <lwilkins@instructure.com>
Product-Review: Landon Wilkins <lwilkins@instructure.com>
QA-Review: Landon Wilkins <lwilkins@instructure.com>
if we get the same failure ten times in a row, bail the run. this should
help when a runner or node gets in a bad state in test-queue land, as the
other runners will pick up the slack
(though if all nodes are screwed, then test-queue will hang and the build
will time out, but that's still just a failure so ¯\_(ツ)_/¯ ... we can
revisit that behavior in a change to test-queue)
test plan:
1. see patchset 1 test plan and test build
Change-Id: Idfd86b8b9537c202cc32d60ff36d15abc5aded33
Reviewed-on: https://gerrit.instructure.com/72863
Tested-by: Jenkins
Reviewed-by: Landon Wilkins <lwilkins@instructure.com>
Product-Review: Landon Wilkins <lwilkins@instructure.com>
QA-Review: Landon Wilkins <lwilkins@instructure.com>
test plan:
* create a module with two required items
* as a student, fulfill one of the requirements
* change the module so the completed item
requires a different action (e.g. change a
"Must view" assignment requirement to "Must submit")
* on the modules page, as a student, it should not
mark the former requirement as completed
closes #CNVS-26337
Change-Id: I50af98e481d650a2a0163f6ab5438da261ab8526
Reviewed-on: https://gerrit.instructure.com/72999
Tested-by: Jenkins
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Jahnavi Yetukuri <jyetukuri@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
closes CNVS-27212
Gives us the ability to turn on RCE integration
for one category of use case at a time rather than all
at once
TEST PLAN:
1) nothing uses the higher level feature flags yet
2) make sure you can enable and disable the new feature flags?
Change-Id: I187f2da931a1374ff0893000849a6dbef3332c0b
Reviewed-on: https://gerrit.instructure.com/73065
Tested-by: Jenkins
Reviewed-by: Simon Williams <simon@instructure.com>
QA-Review: Jeremy Putnam <jeremyp@instructure.com>
Product-Review: Ethan Vizitei <evizitei@instructure.com>
When exporting to a CSV when a student name beings with an equals, the
gradebook exporter will set the name to be a forumula that explicity
sets the cell to name. This will allow a teacher using Excel to be
safe from potential security issues caused by a student changing their
student name name to a function or macro.
This commit also contains a fix to an existing spec that didn't test
what it was intending to.
fixes CNVS-25317
test plan:
- Have a course and gradebook that has a student with the name of
=sum(A)
- Export the gradebook to a CSV.
- Open the CSV in a text file and note that the name looks like
="=sum(A)"
- Open the CSV in excel and note the student name is properly
displayed in the grid as =sum(A)
Change-Id: I1ff77f1c49f93d997cb5dcde8ad0d2239edbc4c7
Reviewed-on: https://gerrit.instructure.com/72914
Reviewed-by: Spencer Olson <solson@instructure.com>
Reviewed-by: Derek Bender <djbender@instructure.com>
Tested-by: Jenkins
QA-Review: KC Naegle <knaegle@instructure.com>
Product-Review: Keith T. Garner <kgarner@instructure.com>
closes #CNVS-27475
Change-Id: I68bbab410a0c2dbb867edceb424496155319f290
Reviewed-on: https://gerrit.instructure.com/73227
Reviewed-by: Alex Boyd <aboyd@instructure.com>
Tested-by: Jenkins
Product-Review: James Williams <jamesw@instructure.com>
QA-Review: James Williams <jamesw@instructure.com>
fixes CNVS-26359
- Add Enrollment.not_yet_started.
- Update `to` blocks in Assignment's set_broadcast_policy declarations
to exclude users for whom their enrollment in the course has not
started.
test plan:
Configurations:
- A student belonging to a course section that starts in the future.
- A course that is published but that starts in the future.
- A course without an explicit start date, but belonging to a term that
starts in the future.
The following should be performed with all of the above configurations:
- Add an assignment to the course.
- Observe that the student does not receive a notification.
- Make a change to an assignment that is at least 30 minutes old, check
the "Notify users that this content has changed" checkbox, and save
the assignment.
- Observe that the student does not receive a notification.
- Make a change to the due dates on an assignment that is more than 3
hours old, check the "Notify users that this content has changed"
checkbox, and save the assignment.
- Observe that the student does not receive a notification.
- Unmute a muted assignment.
- Observe that the student does not receive a notification.
Also confirm that, given a course that has already started, all
assignment-related notifications are sent as expected.
Change-Id: I5bff23ff35e72081b2c1a3127dfb42a71d3fa25d
Reviewed-on: https://gerrit.instructure.com/71217
Tested-by: Jenkins
Reviewed-by: Matt Berns <mberns@instructure.com>
Reviewed-by: Sterling Cobb <sterling@instructure.com>
Reviewed-by: Matthew Wheeler <mwheeler@instructure.com>
QA-Review: Michael Hargiss <mhargiss@instructure.com>
Product-Review: Jason Sparks <jsparks@instructure.com>
Fix the edit for a multi-section course where an assignment
override is made for a student in another section than the
teacher who is editing the assignment.
fixes CNVS-23944
Test Plan:
-Create a course with two sections.
-Add a teacher that can only grade their section.
-Create a quiz or assignment
-Override with only student(s) that the sub-teacher cant see
-Masquerade as the teacher and go attempt to edit the assignment.
-Make a change
-Click save and see that it now saves..
-Repeat with override with mix of students that the sub-teacher
can/cannot see
-Repeat with various combos not stated that you can think of
-Make sure to also test that groups and section overrides still work
Change-Id: I360368bf3340a15452da5e60e734817841df139c
Reviewed-on: https://gerrit.instructure.com/71526
Tested-by: Jenkins
Reviewed-by: Mike Nomitch <mnomitch@instructure.com>
QA-Review: Michael Hargiss <mhargiss@instructure.com>
Product-Review: Jason Sparks <jsparks@instructure.com>
fixes CNVS-26295
test plan:
- enable Turnitin on an account
(gollum.instructure.com/OtherServiceTestAccounts#Turnitin)
- toggle an assignment to have Turnitin enabled and choose
a submission type.
- the assignment show page should show Turnitin as active
- make the assignment "no submission"
- the assignment show page should not show Turnitin
as active
- re-select a submission type for the assignment so
the Turnitin text appears again
- disable Turnitin on the account
- the assignment show page should not show Turnitin
as active
Change-Id: Iac174e52831ddc5e565acfd3d294189f6f4cefd1
Reviewed-on: https://gerrit.instructure.com/71626
Reviewed-by: John Corrigan <jcorrigan@instructure.com>
Tested-by: Jenkins
QA-Review: Michael Hargiss <mhargiss@instructure.com>
Product-Review: Jason Sparks <jsparks@instructure.com>
closes CNVS-27576
TEST PLAN:
1) JWT with nbf in the future should get rejected (tests prove this)
Change-Id: I55f5bde030a6be4caee323a14988e3fbb49cfa95
Reviewed-on: https://gerrit.instructure.com/73132
Reviewed-by: Jacob Fugal <jacob@instructure.com>
Tested-by: Jenkins
Product-Review: Ethan Vizitei <evizitei@instructure.com>
QA-Review: Ethan Vizitei <evizitei@instructure.com>
fixes PLAT-1335
test plan:
install the test tool with a 'collaboration' placement
the tool should show up as a collaboration type
you should be able to create a collaboration using content-item
Change-Id: Icaeaec480e37babd37dfe5443490560644c22f99
Reviewed-on: https://gerrit.instructure.com/72504
Reviewed-by: Andrew Butterfield <abutterfield@instructure.com>
Tested-by: Jenkins
QA-Review: August Thornton <august@instructure.com>
Product-Review: Nathan Mills <nathanm@instructure.com>