discourse/spec/jobs/update_gravatar_spec.rb
Blake Erickson 67dec38f31 FIX: Gravatar download attempt if user is missing their email
It is possible that a user could exist without an email, if so we should
not enqueue a job to download their gravatar.

This commit resolves this error that can occur:

```
Job exception: undefined method `email' for nil:NilClass
/var/www/discourse/app/models/user.rb:1204:in `email'
/var/www/discourse/app/jobs/regular/update_gravatar.rb:12:in `execute'
```

This commit also fixes the original spec which actually was wrong. The
job never enqueued in the original spec and so the gravatar was never
actually updated and the test was checking if the two values were the
same, but they were both null and never updated, so of course they were
the same!

A new test has also been added to make sure the gravatar job isn't
enqueued when a user's email is missing.
2020-09-02 20:19:46 -06:00

51 lines
1.4 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe Jobs::UpdateGravatar do
fab!(:user) { Fabricate(:user) }
let(:temp) { Tempfile.new('test') }
fab!(:upload) { Fabricate(:upload, user: user) }
let(:avatar) { user.create_user_avatar! }
it "picks gravatar if system avatar is picked and gravatar was just downloaded" do
temp.binmode
# tiny valid png
temp.write(Base64.decode64("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg=="))
temp.rewind
FileHelper.expects(:download).returns(temp)
Jobs.run_immediately!
expect(user.uploaded_avatar_id).to eq(nil)
expect(user.user_avatar.gravatar_upload_id).to eq(nil)
SiteSetting.automatically_download_gravatars = true
user.refresh_avatar
user.reload
expect(user.uploaded_avatar_id).to_not eq(nil)
expect(user.uploaded_avatar_id).to eq(user.user_avatar.gravatar_upload_id)
temp.unlink
end
it "does not enqueue a job when user is missing their email" do
user.primary_email.destroy
user.reload
expect(user.uploaded_avatar_id).to eq(nil)
expect(user.user_avatar.gravatar_upload_id).to eq(nil)
SiteSetting.automatically_download_gravatars = true
expect { user.refresh_avatar }
.to change { Jobs::UpdateGravatar.jobs.count }.by(0)
user.reload
expect(user.uploaded_avatar_id).to eq(nil)
expect(user.user_avatar.gravatar_upload_id).to eq(nil)
end
end