Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions app/mailers/school_ownership_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,16 @@ def request_ownership_transfer
message_stream: 'outbound')
end

def complete_ownership_transfer
@school = ownership_transfer.school
@new_owner_name = users_by_id[ownership_transfer.nominated_user_id]&.name.presence || 'there'

mail(to: ownership_transfer.email_address,
subject: "You're now the owner of the Code Classroom account for #{@school.name}",
track_opens: 'true',
message_stream: 'outbound')
end

private

def ownership_transfer
Expand Down
6 changes: 6 additions & 0 deletions app/models/ownership_transfer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class OwnershipTransfer < ApplicationRecord
validate :nominee_has_the_school_teacher_role_for_the_school

after_create_commit :send_ownership_transfer_request_email
after_update_commit :send_ownership_transfer_completed_email,
if: -> { saved_change_to_status?(from: 'pending', to: 'completed') }
Comment thread
DNR500 marked this conversation as resolved.
encrypts :email_address

private
Expand All @@ -35,4 +37,8 @@ def nominee_has_the_school_teacher_role_for_the_school
def send_ownership_transfer_request_email
SchoolOwnershipMailer.with(ownership_transfer: self).request_ownership_transfer.deliver_later
end

def send_ownership_transfer_completed_email
SchoolOwnershipMailer.with(ownership_transfer: self).complete_ownership_transfer.deliver_later
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
Hi <%= @new_owner_name %>,

Ownership of the Code Classroom account for <%= @school.name %> has been transferred to you.

As the owner, you can now:

- Manage school members: https://classroom.raspberrypi.org/en-US/school/members
- Access school settings and feature controls: https://classroom.raspberrypi.org/en-US/school/settings
- Invite a new teacher to the account
- Transfer ownership to someone else if needed
- Delete students

To access more resources, please visit our Help Center: https://help.editor.raspberrypi.org/hc/en-us/categories/115000275003-Code-Editor-for-Education

Kind Regards,
The Code Classroom team
13 changes: 13 additions & 0 deletions spec/mailers/previews/school_ownership_mailer_preview.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,19 @@ def request_ownership_transfer
with_stubbed_user_info_api { SchoolOwnershipMailer.with(ownership_transfer:).request_ownership_transfer.message }
end

def complete_ownership_transfer
school = School.new(name: 'Elmwood Secondary School')
ownership_transfer = OwnershipTransfer.new(
email_address: 'teacher@example.com',
school:,
nominated_user_id: NOMINEE[:id],
requested_by_user_id: REQUESTED_OWNER[:id],
status: :completed
)

with_stubbed_user_info_api { SchoolOwnershipMailer.with(ownership_transfer:).complete_ownership_transfer.message }
end

private

# fake the user info response, but only for the duration of
Expand Down
53 changes: 53 additions & 0 deletions spec/mailers/school_ownership_mailer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,57 @@
expect(email.subject).to include(ownership_transfer.school.name)
end
end

describe 'complete_ownership_transfer' do
subject(:email) { described_class.with(ownership_transfer:).complete_ownership_transfer }

let(:school) { create(:verified_school) }
let(:nominee) { create(:teacher, school:) }
let(:requested_owner) { create(:owner, school:) }
let(:ownership_transfer) do
create(
:ownership_transfer,
school:,
nominated_user_id: nominee.id,
requested_by_user_id: requested_owner.id,
status: :completed
)
end

before do
stub_user_info_api_fetch_by_ids(
user_ids: [nominee.id, requested_owner.id],
users: [{ id: nominee.id, name: nominee.name }, { id: requested_owner.id, name: requested_owner.name }]
)
end

it 'is sent to the new owner' do
expect(email.to).to eq([ownership_transfer.email_address])
end

it 'includes the new owner\'s name in the body' do
expect(email.body.to_s).to include(nominee.name)
end

it 'includes the school name in the body' do
expect(email.body.to_s).to include(ownership_transfer.school.name)
end

it 'includes the school name in the subject' do
expect(email.subject).to include(ownership_transfer.school.name)
end

context 'when the new owner is missing from the user-info response' do
before do
stub_user_info_api_fetch_by_ids(
user_ids: [nominee.id, requested_owner.id],
users: [{ id: requested_owner.id, name: requested_owner.name }]
)
end

it 'greets them generically instead of leaving the greeting blank' do
expect(email.body.to_s).to include('Hi there,')
end
end
end
end
34 changes: 34 additions & 0 deletions spec/models/ownership_transfer_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -173,4 +173,38 @@
)
end
end

describe 'the completion email' do
before { ownership_transfer.save! }

it 'is enqueued with the transfer as the mailer param when the transfer completes' do
ownership_transfer.update!(status: :completed)

assert_enqueued_email_with(
SchoolOwnershipMailer, :complete_ownership_transfer, params: { ownership_transfer: }
)
end

it 'is not enqueued when the transfer resolves to a different status' do
assert_no_enqueued_emails do
ownership_transfer.update!(status: :rejected)
end
end

it 'is not enqueued when an already-completed transfer is saved again unchanged' do
ownership_transfer.update!(status: :completed)

assert_no_enqueued_emails do
ownership_transfer.update!(status: :completed)
end
end

it 'is not enqueued when a non-pending transfer is corrected to completed' do
ownership_transfer.update!(status: :rejected)

assert_no_enqueued_emails do
ownership_transfer.update!(status: :completed)
end
end
end
end
Loading