From 1fbe078ae074f29395d79db0856d1991f1675ab5 Mon Sep 17 00:00:00 2001
From: Blake Erickson <o.blakeerickson@gmail.com>
Date: Thu, 23 May 2019 19:40:20 -0600
Subject: [PATCH] FIX: Undefined method when serializing a user

Apparently is is possible to have a user without a user_profile. This
fix will return nil for any user_profile fields during serialization
(like the after delete web hook) instead of blowing up.
---
 app/serializers/user_serializer.rb       | 12 ++++++------
 spec/serializers/user_serializer_spec.rb | 13 +++++++++++++
 2 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/app/serializers/user_serializer.rb b/app/serializers/user_serializer.rb
index a093c836e9a..6b294c351ad 100644
--- a/app/serializers/user_serializer.rb
+++ b/app/serializers/user_serializer.rb
@@ -220,15 +220,15 @@ class UserSerializer < BasicUserSerializer
   end
 
   def bio_raw
-    object.user_profile.bio_raw
+    object.user_profile&.bio_raw
   end
 
   def bio_cooked
-    object.user_profile.bio_processed
+    object.user_profile&.bio_processed
   end
 
   def website
-    object.user_profile.website
+    object.user_profile&.website
   end
 
   def website_name
@@ -246,7 +246,7 @@ class UserSerializer < BasicUserSerializer
   end
 
   def location
-    object.user_profile.location
+    object.user_profile&.location
   end
 
   def can_edit
@@ -300,7 +300,7 @@ class UserSerializer < BasicUserSerializer
   end
 
   def bio_excerpt
-    object.user_profile.bio_excerpt(350 , keep_newlines: true, keep_emoji_images: true)
+    object.user_profile&.bio_excerpt(350 , keep_newlines: true, keep_emoji_images: true)
   end
 
   def include_suspend_reason?
@@ -470,7 +470,7 @@ class UserSerializer < BasicUserSerializer
   end
 
   def profile_view_count
-    object.user_profile.views
+    object.user_profile&.views
   end
 
   def time_read
diff --git a/spec/serializers/user_serializer_spec.rb b/spec/serializers/user_serializer_spec.rb
index 7f896a285ff..a02d4e9ca71 100644
--- a/spec/serializers/user_serializer_spec.rb
+++ b/spec/serializers/user_serializer_spec.rb
@@ -250,4 +250,17 @@ describe UserSerializer do
       expect(json[:user_api_keys][2][:id]).to eq(user_api_key_2.id)
     end
   end
+
+  context "with missing user profile" do
+    fab!(:user) { Fabricate(:user) }
+
+    it "does not throw an error" do
+      id = user.id
+      UserProfile.delete(id)
+      user_b = User.find(id)
+      json = UserSerializer.new(user_b, scope: Guardian.new(user_b), root: false).as_json
+
+      expect(json[:bio_raw]).to eq nil
+    end
+  end
 end