Skip to content

Commit

Permalink
Added meetup api member search and sync to update user data with meet…
Browse files Browse the repository at this point in the history
…up data

I also added an editorconfig so my editor would "do the right thing" in
regards to the rubocop settings. I wasn't able to actually make a call
against the meetup api so my fixture data is best guess.
  • Loading branch information
BRIMIL01 committed Oct 5, 2018
1 parent 8a7a2e8 commit 1ff8536
Show file tree
Hide file tree
Showing 6 changed files with 161 additions and 0 deletions.
23 changes: 23 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# EditorConfig is awesome: https://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

# Tab indentation (no size specified)
[Makefile]
indent_style = tab

[**.rb]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[.travis.yml]
indent_style = space
indent_size = 2
19 changes: 19 additions & 0 deletions app/jobs/meetup_member_sync.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
class MeetupMemberSync
include Sidekiq::Worker

def perform
meetup_client = Meetup.new
members = meetup_client.members_by_email

User.where(email: members.keys).each do |user|
member = members[user.email]
user.latitude ||= member['lat']
user.longitude ||= member['lon']
user.city ||= member['city']
user.state ||= member['state']

# Only update a user if values have changed
user.save if user.changed?
end
end
end
34 changes: 34 additions & 0 deletions app/lib/meetup.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,40 @@ def operationcode_data
return_value_for response
end

# GET all Operation Code Pro members
### Member
# chapters - Pro organization groups that the member belongs to
# id - Id of the group
# name - Name of the group
# urlname - Urlname used to identify the group on meetup.com
# city - City of the member
# country - Country of the member
# email - Email address of the member if the member opted to share it with the organization
# events_attended - The number of attended events
# is_organizer - Organizer status of the member
# join_time - The time when the member joined Meetup
# last_access_time - The time when the last activity occured
# lat - Latitude
# lon - Longitude
# member_id - Id of the member
# member_name - Name of the member
# photo_thumb_url - Url of the photo thumbnail of the member
# state - State of the member, if in US or Canada
def members
response = self.class.get('/pro/operationcode/members', options)
return_value_for response
end

# List of members indexed by email for easy access
def members_by_email
member_map = {}
members.map do |member|
member_map[member['email']] = member
end

member_map
end

# GET events for each group
def get_events_for(urlname)
response = self.class.get("/#{urlname}/events", options)
Expand Down
33 changes: 33 additions & 0 deletions test/jobs/meetup_member_sync_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
require 'test_helper'

class MeetupMemberSyncTest < ActiveSupport::TestCase
member = {
'email' => '[email protected]',
'lat' => 36.900001525878906,
'lon' => -76.20999908447266,
'city' => 'Norfolk',
'state' => 'VA'
}

test 'it only updates nil fields on a found user' do
job = MeetupMemberSync.new
user_id = FactoryGirl.create(:user, email: '[email protected]', city: nil).id
Meetup.any_instance.expects(:members_by_email).returns('[email protected]' => member)
job.perform

user = User.find(user_id)
assert user.city == 'Norfolk'
assert user.state != 'VA'
end

test 'it only updates users with matching emails' do
job = MeetupMemberSync.new
FactoryGirl.create(:user, email: '[email protected]', city: nil)
user2 = FactoryGirl.create(:user, email: '[email protected]', city: nil)

Meetup.any_instance.expects(:members_by_email).returns('[email protected]' => member)
job.perform

assert user2 == User.find(user2.id)
end
end
19 changes: 19 additions & 0 deletions test/lib/meetup_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,25 @@ class MeetupTest < ActiveSupport::TestCase
assert_raises(Exception) { Meetup.new.operationcode_data }
end

test 'members response code of 200 returns response' do
Meetup.stubs(:get).with('/pro/operationcode/members', options).returns(member_endpoint_response)

assert_nothing_raised { Meetup.new.members }
end

test 'members response code not equal to 200 raises error' do
Meetup.stubs(:get).with('/pro/operationcode/members', options).returns(build_response(400))

assert_raises(Exception) { Meetup.new.members }
end

test 'members by email returns a hash indexed by email addresses from the response' do
Meetup.stubs(:get).with('/pro/operationcode/members', options).returns(member_endpoint_response)

members_by_email = Meetup.new.members_by_email
refute_nil members_by_email['[email protected]']
end

test 'event response code of 200 returns response' do
url = 'Operation-Code-Hampton-Roads'

Expand Down
33 changes: 33 additions & 0 deletions test/support/meetups/sample_api_responses.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@ def event_endpoint_response
response
end

def member_endpoint_response
response = build_response
response.parsed_response = member_parsed_response
response
end

def build_response(code = 200)
response_struct = OpenStruct.new
response_struct.code = code
Expand Down Expand Up @@ -322,3 +328,30 @@ def group_endpoint_parsed_response
}
].as_json
end

def member_parsed_response
[
{
"chapters": [
{
"id": 1,
"name": 'group',
"urlname": 'groupname'
}
],
"city": 'Virginia Beach',
"country": 'us',
"email": '[email protected]',
"events_attended": 4,
"is_organizer": false,
"join_time": 1483543375000,
"last_access_time": 1506171600000,
"lat": 36.844764709472656,
"lon": -75.97899627685547,
"member_id": 10,
"member_name": 'test account',
"photo_thumb_url": 'https://secure.meetupstatic.com/photos/event/b/d/1/4/600_457308404.jpeg',
"state": 'VA'
}
].as_json
end

0 comments on commit 1ff8536

Please sign in to comment.