Commit 159f970193d94ea5cc1cb63a15aea59ea35a9b41

Authored by Daniela Feitosa
1 parent 40df430a

Update of suggestions when the relation change

When the number of a category increases or a new category is verified, the
suggestion is updated with the new values

(ActionItem3234)
app/models/profile_suggestion.rb
@@ -31,7 +31,7 @@ class ProfileSuggestion < ActiveRecord::Base @@ -31,7 +31,7 @@ class ProfileSuggestion < ActiveRecord::Base
31 end 31 end
32 32
33 RULES = %w[ 33 RULES = %w[
34 - friends_of_friends_with_common_friends 34 + friends_of_friends
35 people_with_common_communities 35 people_with_common_communities
36 people_with_common_tags 36 people_with_common_tags
37 communities_with_common_friends 37 communities_with_common_friends
@@ -53,7 +53,7 @@ class ProfileSuggestion < ActiveRecord::Base @@ -53,7 +53,7 @@ class ProfileSuggestion < ActiveRecord::Base
53 # Number of friends in common 53 # Number of friends in common
54 COMMON_TAGS = 2 54 COMMON_TAGS = 2
55 55
56 - def self.friends_of_friends_with_common_friends(person) 56 + def self.friends_of_friends(person)
57 person_attempts = 0 57 person_attempts = 0
58 person_friends = person.friends 58 person_friends = person.friends
59 person_friends.each do |friend| 59 person_friends.each do |friend|
@@ -63,7 +63,9 @@ class ProfileSuggestion < ActiveRecord::Base @@ -63,7 +63,9 @@ class ProfileSuggestion < ActiveRecord::Base
63 unless friend_of_friend == person || friend_of_friend.is_a_friend?(person) || person.already_request_friendship?(friend_of_friend) 63 unless friend_of_friend == person || friend_of_friend.is_a_friend?(person) || person.already_request_friendship?(friend_of_friend)
64 common_friends = friend_of_friend.friends & person_friends 64 common_friends = friend_of_friend.friends & person_friends
65 if common_friends.size >= COMMON_FRIENDS 65 if common_friends.size >= COMMON_FRIENDS
66 - person.profile_suggestions.create(:suggestion => friend_of_friend, :common_friends => common_friends.size) 66 + suggestion = person.profile_suggestions.find_or_initialize_by_suggestion_id(friend_of_friend.id)
  67 + suggestion.common_friends = common_friends.size
  68 + suggestion.save
67 end 69 end
68 end 70 end
69 end 71 end
@@ -80,7 +82,9 @@ class ProfileSuggestion < ActiveRecord::Base @@ -80,7 +82,9 @@ class ProfileSuggestion < ActiveRecord::Base
80 unless member == person || member.is_a_friend?(person) || person.already_request_friendship?(member) 82 unless member == person || member.is_a_friend?(person) || person.already_request_friendship?(member)
81 common_communities = person_communities & member.communities 83 common_communities = person_communities & member.communities
82 if common_communities.size >= COMMON_COMMUNITIES 84 if common_communities.size >= COMMON_COMMUNITIES
83 - person.profile_suggestions.create(:suggestion => member, :common_communities => common_communities.size) 85 + suggestion = person.profile_suggestions.find_or_initialize_by_suggestion_id(member.id)
  86 + suggestion.common_communities = common_communities.size
  87 + suggestion.save
84 end 88 end
85 end 89 end
86 end 90 end
@@ -99,7 +103,9 @@ class ProfileSuggestion < ActiveRecord::Base @@ -99,7 +103,9 @@ class ProfileSuggestion < ActiveRecord::Base
99 unless author.nil? || author == person || author.is_a_friend?(person) || person.already_request_friendship?(author) 103 unless author.nil? || author == person || author.is_a_friend?(person) || person.already_request_friendship?(author)
100 common_tags = tags & author.article_tags.keys 104 common_tags = tags & author.article_tags.keys
101 if common_tags.size >= COMMON_TAGS 105 if common_tags.size >= COMMON_TAGS
102 - person.profile_suggestions.create(:suggestion => author, :common_tags => common_tags.size) 106 + suggestion = person.profile_suggestions.find_or_initialize_by_suggestion_id(author.id)
  107 + suggestion.common_tags = common_tags.size
  108 + suggestion.save
103 end 109 end
104 end 110 end
105 end 111 end
@@ -116,7 +122,9 @@ class ProfileSuggestion < ActiveRecord::Base @@ -116,7 +122,9 @@ class ProfileSuggestion < ActiveRecord::Base
116 unless person.is_member_of?(community) || community.already_request_membership?(person) 122 unless person.is_member_of?(community) || community.already_request_membership?(person)
117 common_friends = community.members & person.friends 123 common_friends = community.members & person.friends
118 if common_friends.size >= COMMON_FRIENDS 124 if common_friends.size >= COMMON_FRIENDS
119 - person.profile_suggestions.create(:suggestion => community, :common_friends => common_friends.size) 125 + suggestion = person.profile_suggestions.find_or_initialize_by_suggestion_id(community.id)
  126 + suggestion.common_friends = common_friends.size
  127 + suggestion.save
120 end 128 end
121 end 129 end
122 end 130 end
@@ -135,7 +143,9 @@ class ProfileSuggestion < ActiveRecord::Base @@ -135,7 +143,9 @@ class ProfileSuggestion < ActiveRecord::Base
135 unless !profile.community? || person.is_member_of?(profile) || profile.already_request_membership?(person) 143 unless !profile.community? || person.is_member_of?(profile) || profile.already_request_membership?(person)
136 common_tags = tags & profile.article_tags.keys 144 common_tags = tags & profile.article_tags.keys
137 if common_tags.size >= COMMON_TAGS 145 if common_tags.size >= COMMON_TAGS
138 - person.profile_suggestions.create(:suggestion => profile, :common_tags => common_tags.size) 146 + suggestion = person.profile_suggestions.find_or_initialize_by_suggestion_id(profile.id)
  147 + suggestion.common_tags = common_tags.size
  148 + suggestion.save
139 end 149 end
140 end 150 end
141 end 151 end
test/unit/profile_suggestion_test.rb
@@ -3,19 +3,19 @@ require File.dirname(__FILE__) + '/../test_helper' @@ -3,19 +3,19 @@ require File.dirname(__FILE__) + '/../test_helper'
3 3
4 class ProfileSuggestionTest < ActiveSupport::TestCase 4 class ProfileSuggestionTest < ActiveSupport::TestCase
5 5
6 - should 'save the profile class' do  
7 - person = create_user('person').person  
8 - suggested_community = fast_create(Community) 6 + def setup
  7 + @person = create_user('test_user').person
  8 + @community = fast_create(Community)
  9 + end
  10 + attr_reader :person, :community
9 11
10 - suggestion = ProfileSuggestion.create(:person => person, :suggestion => suggested_community) 12 + should 'save the profile class' do
  13 + suggestion = ProfileSuggestion.create(:person => person, :suggestion => community)
11 assert_equal 'Community', suggestion.suggestion_type 14 assert_equal 'Community', suggestion.suggestion_type
12 end 15 end
13 16
14 should 'only accept pre-defined categories' do 17 should 'only accept pre-defined categories' do
15 - person = create_user('person').person  
16 - suggested_community = fast_create(Community)  
17 -  
18 - suggestion = ProfileSuggestion.new(:person => person, :suggestion => suggested_community) 18 + suggestion = ProfileSuggestion.new(:person => person, :suggestion => community)
19 19
20 suggestion.categories = {:unexistent => 1} 20 suggestion.categories = {:unexistent => 1}
21 suggestion.valid? 21 suggestion.valid?
@@ -23,25 +23,99 @@ class ProfileSuggestionTest &lt; ActiveSupport::TestCase @@ -23,25 +23,99 @@ class ProfileSuggestionTest &lt; ActiveSupport::TestCase
23 end 23 end
24 24
25 should 'disable a suggestion' do 25 should 'disable a suggestion' do
26 - person = create_user('person').person  
27 - suggested_community = fast_create(Community)  
28 -  
29 - suggestion = ProfileSuggestion.create(:person => person, :suggestion => suggested_community) 26 + suggestion = ProfileSuggestion.create(:person => person, :suggestion => community)
30 27
31 suggestion.disable 28 suggestion.disable
32 assert_equal false, ProfileSuggestion.find(suggestion.id).enabled? 29 assert_equal false, ProfileSuggestion.find(suggestion.id).enabled?
33 end 30 end
34 31
35 should 'not suggest the same community twice' do 32 should 'not suggest the same community twice' do
36 - person = create_user('person').person  
37 - suggested_community = fast_create(Community)  
38 -  
39 - ProfileSuggestion.create(:person => person, :suggestion => suggested_community) 33 + ProfileSuggestion.create(:person => person, :suggestion => community)
40 34
41 - repeated_suggestion = ProfileSuggestion.new(:person => person, :suggestion => suggested_community) 35 + repeated_suggestion = ProfileSuggestion.new(:person => person, :suggestion => community)
42 36
43 repeated_suggestion.valid? 37 repeated_suggestion.valid?
44 assert_equal true, repeated_suggestion.errors[:suggestion_id.to_s].present? 38 assert_equal true, repeated_suggestion.errors[:suggestion_id.to_s].present?
45 end 39 end
46 40
  41 + should 'update existing person suggestion when the number of common friends increase' do
  42 + suggested_person = create_user('test_user').person
  43 + suggestion = ProfileSuggestion.create(:person => person, :suggestion => suggested_person, :common_friends => 2)
  44 +
  45 + friend = create_user('friend').person
  46 + friend2 = create_user('friend2').person
  47 + friend3 = create_user('friend2').person
  48 + person.add_friend friend
  49 + person.add_friend friend2
  50 + person.add_friend friend3
  51 +
  52 + friend.add_friend suggested_person
  53 +
  54 + suggested_person.add_friend friend
  55 + suggested_person.add_friend friend2
  56 + suggested_person.add_friend friend3
  57 +
  58 + assert_difference 'ProfileSuggestion.find(suggestion.id).common_friends', 1 do
  59 + ProfileSuggestion.friends_of_friends(person)
  60 + end
  61 + end
  62 +
  63 + should 'update existing person suggestion when the number of common communities increase' do
  64 + suggested_person = create_user('test_user').person
  65 + suggestion = ProfileSuggestion.create(:person => person, :suggestion => suggested_person, :common_communities => 1)
  66 +
  67 + community.add_member person
  68 + community.add_member suggested_person
  69 +
  70 + community2 = fast_create(Community)
  71 + community2.add_member person
  72 + community2.add_member suggested_person
  73 +
  74 + assert_difference 'ProfileSuggestion.find(suggestion.id).common_communities', 1 do
  75 + ProfileSuggestion.people_with_common_communities(person)
  76 + end
  77 + end
  78 +
  79 + should 'update existing person suggestion when the number of common tags increase' do
  80 + suggested_person = create_user('test_user').person
  81 + suggestion = ProfileSuggestion.create(:person => person, :suggestion => suggested_person, :common_tags => 1)
  82 +
  83 + create(Article, :created_by => person, :profile => person, :tag_list => 'first-tag, second-tag, third-tag, fourth-tag')
  84 + create(Article, :created_by => suggested_person, :profile => suggested_person, :tag_list => 'first-tag, second-tag, third-tag')
  85 +
  86 + assert_difference 'ProfileSuggestion.find(suggestion.id).common_tags', 2 do
  87 + ProfileSuggestion.people_with_common_tags(person)
  88 + end
  89 + end
  90 +
  91 + should 'update existing community suggestion when the number of common friends increase' do
  92 + suggestion = ProfileSuggestion.create(:person => person, :suggestion => community, :common_friends => 1)
  93 +
  94 + member1 = create_user('member1').person
  95 + member2 = create_user('member2').person
  96 +
  97 + person.add_friend member1
  98 + person.add_friend member2
  99 +
  100 + community.add_member member1
  101 + community.add_member member2
  102 +
  103 + assert_difference 'ProfileSuggestion.find(suggestion.id).common_friends', 1 do
  104 + ProfileSuggestion.communities_with_common_friends(person)
  105 + end
  106 +
  107 + end
  108 +
  109 + should 'update existing community suggestion when the number of common tags increase' do
  110 + other_person = create_user('test_user').person
  111 +
  112 + suggestion = ProfileSuggestion.create(:person => person, :suggestion => community, :common_tags => 1)
  113 +
  114 + create(Article, :created_by => person, :profile => person, :tag_list => 'first-tag, second-tag, third-tag, fourth-tag')
  115 + create(Article, :created_by => other_person, :profile => community, :tag_list => 'first-tag, second-tag, third-tag')
  116 +
  117 + assert_difference 'ProfileSuggestion.find(suggestion.id).common_tags', 2 do
  118 + ProfileSuggestion.communities_with_common_tags(person)
  119 + end
  120 + end
47 end 121 end
test/unit/profile_suggestions_job_test.rb
@@ -6,26 +6,15 @@ class ProfileSuggestionsJobTest &lt; ActiveSupport::TestCase @@ -6,26 +6,15 @@ class ProfileSuggestionsJobTest &lt; ActiveSupport::TestCase
6 person = create_user('person').person 6 person = create_user('person').person
7 friend = create_user('friend').person 7 friend = create_user('friend').person
8 friend2 = create_user('friend2').person 8 friend2 = create_user('friend2').person
9 - friend3 = create_user('friend3').person  
10 9
11 person.add_friend friend 10 person.add_friend friend
12 - friend.add_friend person  
13 -  
14 person.add_friend friend2 11 person.add_friend friend2
15 - friend2.add_friend person  
16 -  
17 - person.add_friend friend3  
18 - friend3.add_friend person  
19 12
20 friend_of_friend = create_user('friend_of_friend').person 13 friend_of_friend = create_user('friend_of_friend').person
21 friend.add_friend friend_of_friend 14 friend.add_friend friend_of_friend
22 - friend_of_friend.add_friend friend  
23 15
  16 + friend_of_friend.add_friend friend
24 friend_of_friend.add_friend friend2 17 friend_of_friend.add_friend friend2
25 - friend2.add_friend friend_of_friend  
26 -  
27 - friend_of_friend.add_friend friend3  
28 - friend3.add_friend friend_of_friend  
29 18
30 job = ProfileSuggestionsJob.new(person.id) 19 job = ProfileSuggestionsJob.new(person.id)
31 assert_difference 'ProfileSuggestion.count', 1 do 20 assert_difference 'ProfileSuggestion.count', 1 do