Commit ea63d985701f93a8d4cc8bc5454a998642af8ce7

Authored by Larissa Reis
1 parent 4bcc8485

Makes ExternalProfile respond to all Person methods to avoid breakage

app/models/concerns/human.rb
... ... @@ -30,4 +30,13 @@ module Human
30 30 AbuseComplaint.finished.where(:requestor_id => self).count > 0
31 31 end
32 32  
  33 + # Sets the identifier for this person. Raises an exception when called on a
  34 + # existing person (since peoples' identifiers cannot be changed)
  35 + def identifier=(value)
  36 + unless self.new_record?
  37 + raise ArgumentError.new(_('An existing person cannot be renamed.'))
  38 + end
  39 + self[:identifier] = value
  40 + end
  41 +
33 42 end
... ...
app/models/external_person.rb
... ... @@ -32,7 +32,7 @@ class ExternalPerson < ActiveRecord::Base
32 32 end
33 33  
34 34 def url
35   - "http://#{self.source}/#{self.identifier}"
  35 + "http://#{self.source}/profile/#{self.identifier}"
36 36 end
37 37  
38 38 alias :public_profile_url :url
... ... @@ -41,6 +41,9 @@ class ExternalPerson < ActiveRecord::Base
41 41 "http://#{self.source}/myprofile/#{self.identifier}"
42 42 end
43 43  
  44 + def wall_url
  45 + self.url
  46 + end
44 47 def tasks_url
45 48 self.url
46 49 end
... ... @@ -104,6 +107,14 @@ class ExternalPerson < ActiveRecord::Base
104 107 [self.contact_email]
105 108 end
106 109  
  110 + def email_domain
  111 + self.source
  112 + end
  113 +
  114 + def email_addresses
  115 + ['%s@%s' % [self.identifier, self.source] ]
  116 + end
  117 +
107 118 def jid(options = {})
108 119 "#{self.identifier}@#{self.source}"
109 120 end
... ... @@ -151,26 +162,65 @@ class ExternalPerson < ActiveRecord::Base
151 162  
152 163 # External Person should respond to all methods in Person and Profile
153 164 def person_instance_methods
154   - {}
  165 + methods_and_responses = {
  166 + enterprises: Enterprise.none, communities: Community.none, friends:
  167 + Person.none, memberships: Profile.none, friendships: Person.none,
  168 + following_articles: Article.none, article_followers: ArticleFollower.none,
  169 + requested_tasks: Task.none, mailings: Mailing.none, scraps_sent:
  170 + Scrap.none, favorite_enterprise_people: FavoriteEnterprisePerson.none,
  171 + favorite_enterprises: Enterprise.none, acepted_forums: Forum.none,
  172 + articles_with_access: Article.none, suggested_profiles:
  173 + ProfileSuggestion.none, suggested_people: ProfileSuggestion.none,
  174 + suggested_communities: ProfileSuggestion.none, user: nil,
  175 + refused_communities: Community.none, has_permission?: false,
  176 + has_permission_with_admin?: false, has_permission_without_admin?: false,
  177 + has_permission_with_plugins?: false, has_permission_without_plugins?:
  178 + false, memberships_by_role: Person.none, can_change_homepage?: false,
  179 + can_control_scrap?: false, receives_scrap_notification?: false,
  180 + can_control_activity?: false, can_post_content?: false,
  181 + suggested_friend_groups: [], friend_groups: [], add_friend: nil,
  182 + already_request_friendship?: false, remove_friend: nil,
  183 + presence_of_required_fields: nil, active_fields: [], required_fields: [],
  184 + signup_fields: [], default_set_of_blocks: [], default_set_of_boxes: [],
  185 + default_set_of_articles: [], cell_phone: nil, comercial_phone: nil,
  186 + nationality: nil, schooling: nil, contact_information: nil, sex: nil,
  187 + birth_date: nil, jabber_id: nil, personal_website: nil, address_reference:
  188 + nil, district: nil, schooling_status: nil, formation: nil,
  189 + custom_formation: nil, area_of_study: nil, custom_area_of_study: nil,
  190 + professional_activity: nil, organization_website: nil, organization: nil,
  191 + photo: nil, city: nil, state: nil, country: nil, zip_code: nil,
  192 + address_line2: nil, copy_communities_from: nil,
  193 + has_organization_pending_tasks?: false, organizations_with_pending_tasks:
  194 + Organization.none, pending_tasks_for_organization: Task.none,
  195 + build_contact: nil, is_a_friend?: false, ask_to_join?: false, refuse_join:
  196 + nil, blocks_to_expire_cache: [], cache_keys: [], communities_cache_key: '',
  197 + friends_cache_key: '', manage_friends_cache_key: '',
  198 + relationships_cache_key: '', is_member_of?: false, follows?: false,
  199 + each_friend: nil, is_last_admin?: false, is_last_admin_leaving?: false,
  200 + leave: nil, last_notification: nil, notification_time: 0, notifier: nil,
  201 + remove_suggestion: nil, allow_invitation_from?: false
  202 + }
  203 +
  204 + derivated_methods = generate_derivated_methods(methods_and_responses)
  205 + derivated_methods.merge(methods_and_responses)
155 206 end
156 207  
157 208 def profile_instance_methods
158 209 methods_and_responses = {
159 210 role_assignments: RoleAssignment.none, favorite_enterprises:
160   - Enterprise.none, enterprises: Enterprise.none, memberships: Profile.none,
161   - friendships: Profile.none, friends: Profile.none, tasks: Task.none,
162   - suggested_profiles: ProfileSuggestion.none, suggested_people:
163   - ProfileSuggestion.none, suggested_communities: ProfileSuggestion.none,
164   - public_profile: true, nickname: nil, custom_footer: '', custom_header: '',
165   - address: '', zip_code: '', contact_phone: '', image_builder: nil,
166   - description: '', closed: false, template_id: nil, lat: nil, lng: nil,
167   - is_template: false, fields_privacy: {}, preferred_domain_id: nil,
168   - category_ids: [], country: '', city: '', state: '', national_region_code:
169   - '', redirect_l10n: false, notification_time: 0, custom_url_redirection:
170   - nil, email_suggestions: false, allow_members_to_invite: false,
171   - invite_friends_only: false, secret: false, profile_admin_mail_notification:
172   - false, redirection_after_login: nil, profile_activities:
173   - ProfileActivity.none, action_tracker_notifications:
  211 + Enterprise.none, memberships: Profile.none, friendships: Profile.none,
  212 + tasks: Task.none, suggested_profiles: ProfileSuggestion.none,
  213 + suggested_people: ProfileSuggestion.none, suggested_communities:
  214 + ProfileSuggestion.none, public_profile: true, nickname: nil, custom_footer:
  215 + '', custom_header: '', address: '', zip_code: '', contact_phone: '',
  216 + image_builder: nil, description: '', closed: false, template_id: nil, lat:
  217 + nil, lng: nil, is_template: false, fields_privacy: {}, preferred_domain_id:
  218 + nil, category_ids: [], country: '', city: '', state: '',
  219 + national_region_code: '', redirect_l10n: false, notification_time: 0,
  220 + custom_url_redirection: nil, email_suggestions: false,
  221 + allow_members_to_invite: false, invite_friends_only: false, secret: false,
  222 + profile_admin_mail_notification: false, redirection_after_login: nil,
  223 + profile_activities: ProfileActivity.none, action_tracker_notifications:
174 224 ActionTrackerNotification.none, tracked_notifications:
175 225 ActionTracker::Record.none, scraps_received: Scrap.none, template:
176 226 Profile.none, comments_received: Comment.none, email_templates:
... ... @@ -208,11 +258,7 @@ class ExternalPerson < ActiveRecord::Base
208 258 already_request_friendship?: false
209 259 }
210 260  
211   - derivated_methods = {}
212   - methods_and_responses.keys.each do |method|
213   - derivated_methods[method.to_s.insert(-1, '?').to_sym] = false
214   - derivated_methods[method.to_s.insert(-1, '=').to_sym] = nil
215   - end
  261 + derivated_methods = generate_derivated_methods(methods_and_responses)
216 262 derivated_methods.merge(methods_and_responses)
217 263 end
218 264  
... ... @@ -230,4 +276,15 @@ class ExternalPerson < ActiveRecord::Base
230 276 profile_instance_methods.keys.include?(method_name) ||
231 277 super
232 278 end
  279 +
  280 + private
  281 +
  282 + def generate_derivated_methods(methods)
  283 + derivated_methods = {}
  284 + methods.keys.each do |method|
  285 + derivated_methods[method.to_s.insert(-1, '?').to_sym] = false
  286 + derivated_methods[method.to_s.insert(-1, '=').to_sym] = nil
  287 + end
  288 + derivated_methods
  289 + end
233 290 end
... ...
app/models/person.rb
... ... @@ -164,15 +164,6 @@ class Person < Profile
164 164 (self.has_permission?('post_content', profile) || self.has_permission?('publish_content', profile))
165 165 end
166 166  
167   - # Sets the identifier for this person. Raises an exception when called on a
168   - # existing person (since peoples' identifiers cannot be changed)
169   - def identifier=(value)
170   - unless self.new_record?
171   - raise ArgumentError.new(_('An existing person cannot be renamed.'))
172   - end
173   - self[:identifier] = value
174   - end
175   -
176 167 def suggested_friend_groups
177 168 (friend_groups.compact + [ _('friends'), _('work'), _('school'), _('family') ]).map {|i| i if !i.empty?}.compact.uniq
178 169 end
... ...
test/unit/external_person_test.rb
... ... @@ -65,41 +65,43 @@ class ExternalPersonTest < ActiveSupport::TestCase
65 65 end
66 66  
67 67 should 'have an avatar from its original environment' do
68   - assert_match /http:\/\/#{@external_person.source}\/.*/, @external_person.avatar
  68 + assert_match(/http:\/\/#{@external_person.source}\/.*/, @external_person.avatar)
69 69 end
70 70  
71 71 should 'generate a custom profile icon based on its avatar' do
  72 + skip
72 73 end
73 74  
74 75 should 'have an url to its profile on its original environment' do
  76 + skip
75 77 end
76 78  
77 79 should 'have a public profile url' do
  80 + skip
78 81 end
79 82  
80 83 should 'have an admin url to its profile on its original environment' do
81   - end
82   -
83   - should 'respond to lat and lng' do
84   - assert_respond_to ExternalPerson.new, :lat
85   - assert_respond_to ExternalPerson.new, :lng
86   - assert_nil @external_person.lat
87   - assert_nil @external_person.lng
  84 + skip
88 85 end
89 86  
90 87 should 'never be a friend of another person' do
  88 + skip
91 89 end
92 90  
93 91 should 'never send a friend request to another person' do
  92 + skip
94 93 end
95 94  
96 95 should 'not follow another profile' do
  96 + skip
97 97 end
98 98  
99 99 should 'have an image' do
  100 + skip
100 101 end
101 102  
102 103 should 'profile image has public filename and mimetype' do
  104 + skip
103 105 end
104 106  
105 107 should 'respond to all instance methods in Profile' do
... ... @@ -112,4 +114,13 @@ class ExternalPersonTest < ActiveSupport::TestCase
112 114 end
113 115 end
114 116  
  117 + should 'respond to all instance methods in Person' do
  118 + methods = Person.public_instance_methods(false)
  119 + methods.each do |method|
  120 + # We test if ExternalPerson responds to same methods as Person, but we
  121 + # skip methods generated by plugins, libs and validations, which are
  122 + # usually only used internally
  123 + assert_respond_to ExternalPerson.new, method.to_sym unless method =~ /^autosave_.*|validate_.*|^before_.*|^after_.*|^assignment_.*|^(city|state)_.*/
  124 + end
  125 + end
115 126 end
... ...