Skip to content

Commit 27b3f58

Browse files
committed
destroy zombie likes when likable is invalid
- or when a Like tracking code doesn’t associate to a user
1 parent 71a0a2d commit 27b3f58

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

app/jobs/process_like_job.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@ def perform(process_type, like_id)
88
case process_type
99
when 'associate_to_user'
1010
begin
11-
like.user_id = User.find_by_tracking_code(like.tracking_code)
12-
like.save!
13-
rescue ActiveRecord::RecordNotUnique => ex
14-
ap ex
11+
if user = User.find_by_tracking_code(like.tracking_code)
12+
like.user = user
13+
like.save!
14+
else
15+
like.destroy
16+
end
17+
rescue ActiveRecord::RecordNotUnique, ActiveRecord::RecordInvalid => ex
1518
like.destroy
1619
end
1720
end

spec/jobs/process_like_job_spec.rb

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,49 @@
66
end
77
end
88

9+
describe 'processing' do
10+
let(:user) { Fabricate(:user, tracking_code: 'fake_tracking_code') }
11+
let(:protip) { Fabricate(:protip) }
12+
13+
it 'associates the zombie like to the correct user' do
14+
zombie_like = Fabricate(:like, likable: protip,
15+
tracking_code: user.tracking_code)
16+
17+
ProcessLikeJob.new.perform('associate_to_user', zombie_like.id)
18+
19+
zombie_like.reload
20+
21+
expect(zombie_like.user_id).to eql user.id
22+
end
23+
24+
it 'destroys like that are invalid' do
25+
invalid_like = Like.new(value: 1, tracking_code: user.tracking_code)
26+
invalid_like.save(validate: false)
27+
28+
ProcessLikeJob.new.perform('associate_to_user', invalid_like.id)
29+
30+
expect(Like.where(id: invalid_like.id)).not_to exist
31+
end
32+
33+
it 'destroys likes that are non-unique' do
34+
original_like = Fabricate(:like, user: user, likable: protip)
35+
36+
duplicate_like = Fabricate(:like, likable: protip,
37+
tracking_code: user.tracking_code)
38+
39+
ProcessLikeJob.new.perform('associate_to_user', duplicate_like.id)
40+
41+
expect(Like.where(id: duplicate_like.id)).not_to exist
42+
end
43+
44+
it 'destroys likes if no user with the tracking code exists' do
45+
unassociatable_like = Fabricate(:like, likable: protip,
46+
tracking_code: 'unassociatable_tracking_code')
47+
48+
ProcessLikeJob.new.perform('associate_to_user', unassociatable_like.id)
49+
50+
expect(Like.where(id: unassociatable_like.id)).not_to exist
51+
end
52+
end
53+
954
end

0 commit comments

Comments
 (0)