From 27b3f58f8683960ec33bf7b3fcd26de0563ec708 Mon Sep 17 00:00:00 2001 From: Matthew Bender Date: Sat, 13 Dec 2014 17:26:15 -0700 Subject: [PATCH] destroy zombie likes when likable is invalid MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - or when a Like tracking code doesn’t associate to a user --- app/jobs/process_like_job.rb | 11 +++++--- spec/jobs/process_like_job_spec.rb | 45 ++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/app/jobs/process_like_job.rb b/app/jobs/process_like_job.rb index db312275..f0a4a94b 100644 --- a/app/jobs/process_like_job.rb +++ b/app/jobs/process_like_job.rb @@ -8,10 +8,13 @@ def perform(process_type, like_id) case process_type when 'associate_to_user' begin - like.user_id = User.find_by_tracking_code(like.tracking_code) - like.save! - rescue ActiveRecord::RecordNotUnique => ex - ap ex + if user = User.find_by_tracking_code(like.tracking_code) + like.user = user + like.save! + else + like.destroy + end + rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid => ex like.destroy end end diff --git a/spec/jobs/process_like_job_spec.rb b/spec/jobs/process_like_job_spec.rb index ed517698..26a9f229 100644 --- a/spec/jobs/process_like_job_spec.rb +++ b/spec/jobs/process_like_job_spec.rb @@ -6,4 +6,49 @@ end end + describe 'processing' do + let(:user) { Fabricate(:user, tracking_code: 'fake_tracking_code') } + let(:protip) { Fabricate(:protip) } + + it 'associates the zombie like to the correct user' do + zombie_like = Fabricate(:like, likable: protip, + tracking_code: user.tracking_code) + + ProcessLikeJob.new.perform('associate_to_user', zombie_like.id) + + zombie_like.reload + + expect(zombie_like.user_id).to eql user.id + end + + it 'destroys like that are invalid' do + invalid_like = Like.new(value: 1, tracking_code: user.tracking_code) + invalid_like.save(validate: false) + + ProcessLikeJob.new.perform('associate_to_user', invalid_like.id) + + expect(Like.where(id: invalid_like.id)).not_to exist + end + + it 'destroys likes that are non-unique' do + original_like = Fabricate(:like, user: user, likable: protip) + + duplicate_like = Fabricate(:like, likable: protip, + tracking_code: user.tracking_code) + + ProcessLikeJob.new.perform('associate_to_user', duplicate_like.id) + + expect(Like.where(id: duplicate_like.id)).not_to exist + end + + it 'destroys likes if no user with the tracking code exists' do + unassociatable_like = Fabricate(:like, likable: protip, + tracking_code: 'unassociatable_tracking_code') + + ProcessLikeJob.new.perform('associate_to_user', unassociatable_like.id) + + expect(Like.where(id: unassociatable_like.id)).not_to exist + end + end + end