Commit 159f970193d94ea5cc1cb63a15aea59ea35a9b41
1 parent
40df430a
Exists in
master
and in
29 other branches
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)
Showing
3 changed files
with
109 additions
and
36 deletions
Show diff stats
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 < ActiveSupport::TestCase | @@ -23,25 +23,99 @@ class ProfileSuggestionTest < 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 < ActiveSupport::TestCase | @@ -6,26 +6,15 @@ class ProfileSuggestionsJobTest < 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 |