rock_rms 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -3
  3. data/lib/rock_rms/client.rb +3 -0
  4. data/lib/rock_rms/error.rb +1 -1
  5. data/lib/rock_rms/resources/group.rb +35 -0
  6. data/lib/rock_rms/resources/group_member.rb +32 -0
  7. data/lib/rock_rms/resources/person.rb +16 -6
  8. data/lib/rock_rms/resources/phone_number.rb +15 -0
  9. data/lib/rock_rms/responses/campus.rb +34 -0
  10. data/lib/rock_rms/responses/group.rb +42 -0
  11. data/lib/rock_rms/responses/group_location.rb +34 -0
  12. data/lib/rock_rms/responses/location.rb +37 -0
  13. data/lib/rock_rms/responses/person.rb +29 -17
  14. data/lib/rock_rms/responses/phone_number.rb +27 -0
  15. data/lib/rock_rms/version.rb +1 -1
  16. data/spec/rock_rms/client_spec.rb +3 -3
  17. data/spec/rock_rms/resources/group_member_spec.rb +67 -0
  18. data/spec/rock_rms/resources/group_spec.rb +111 -0
  19. data/spec/rock_rms/resources/person_spec.rb +50 -0
  20. data/spec/rock_rms/resources/phone_number_spec.rb +34 -0
  21. data/spec/rock_rms/responses/campus_spec.rb +30 -0
  22. data/spec/rock_rms/responses/group_location_spec.rb +36 -0
  23. data/spec/rock_rms/responses/group_spec.rb +52 -0
  24. data/spec/rock_rms/responses/location_spec.rb +33 -0
  25. data/spec/rock_rms/responses/phone_number_spec.rb +25 -0
  26. data/spec/spec_helper.rb +5 -0
  27. data/spec/support/client_factory.rb +12 -0
  28. data/spec/support/fixtures/campuses.json +23 -0
  29. data/spec/support/fixtures/create_group_member.json +1 -0
  30. data/spec/support/fixtures/families.json +45 -0
  31. data/spec/support/fixtures/group.json +43 -0
  32. data/spec/support/fixtures/group_locations.json +60 -0
  33. data/spec/support/fixtures/groups.json +32 -0
  34. data/spec/support/fixtures/groups_with_campus.json +53 -0
  35. data/spec/support/fixtures/groups_with_locations.json +92 -0
  36. data/spec/support/fixtures/groups_with_members.json +454 -0
  37. data/spec/support/fixtures/locations.json +42 -0
  38. data/spec/support/fixtures/people_search.json +36 -0
  39. data/spec/support/fixtures/phone_numbers.json +28 -0
  40. data/spec/support/fixtures_helper.rb +5 -0
  41. data/spec/support/rock_mock.rb +41 -0
  42. metadata +33 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d81db433d9edd22ba5fa2148c2b0a82ac7f1150
4
- data.tar.gz: 6b4b51e866c128c254aad44755fe03170946fd3b
3
+ metadata.gz: c3bf2fbd0092ad9afa7bc274f05201848d886b5f
4
+ data.tar.gz: 10715556852bd2472671646798a50ab35c78dd54
5
5
  SHA512:
6
- metadata.gz: 33ffe1335a1d8b40e2388d65d9fdab92419644dd7cbabe9c468873fc9322655c033e77db9f1b92dcaf76e74b97fc7d6ec74ec5f8d446358c41b7267138723afd
7
- data.tar.gz: 1c37aa2af141e7ba2e2b68bfcb13c859a7bd5b83e172053f61a5d4e6a8948161631f4667925016d8de44895b6ea71e0fa69e693b726fae78888a38cae07f082b
6
+ metadata.gz: 96eda68c2764ce38ecab7e8efcda03c6558c279c12f728bc9a927223ceb60bc40ce0ec971086475ce51d770f54036b8c933eec78d8c7ac1a9643d118b19a5536
7
+ data.tar.gz: 2862be265f417d8a922a6c45c123d2d8c85cb4347be3d2f279bfc949a0af56c8a3df5c20a424227ddbb8895d404678491e1e857c5b5a048dac1e79d05bba4277
data/README.md CHANGED
@@ -1,5 +1,3 @@
1
- ⚠️ Code is highly subject to change. Consider this an alpha release.
2
-
3
1
  ### A Ruby wrapper for the Rock RMS API
4
2
 
5
3
  To get a general overview of Rock RMS: https://www.rockrms.com
@@ -12,7 +10,7 @@ I'm a big fan of Rock so if you have problems using the gem or would like to see
12
10
  Add this line to your application's Gemfile:
13
11
  ````ruby
14
12
  # in your Gemfile
15
- gem 'rock_rms', '~> 1.0'
13
+ gem 'rock_rms', '~> 1.1'
16
14
 
17
15
  # then...
18
16
  bundle install
@@ -10,8 +10,11 @@ module RockRMS
10
10
  include RockRMS::Client::Batch
11
11
  include RockRMS::Client::Donation
12
12
  include RockRMS::Client::Fund
13
+ include RockRMS::Client::Group
14
+ include RockRMS::Client::GroupMember
13
15
  include RockRMS::Client::PaymentMethod
14
16
  include RockRMS::Client::Person
17
+ include RockRMS::Client::PhoneNumber
15
18
  include RockRMS::Client::RecurringDonation
16
19
  include RockRMS::Client::TransactionDetail
17
20
 
@@ -9,7 +9,7 @@ module FaradayMiddleware
9
9
  def on_complete(env)
10
10
  case env[:status]
11
11
  when ERROR_STATUSES
12
- raise RockRMS::Error, "#{env.status}: #{env.body}"
12
+ raise RockRMS::Error, "#{env[:status]}: #{env[:body]}"
13
13
  end
14
14
  end
15
15
  end
@@ -0,0 +1,35 @@
1
+ module RockRMS
2
+ class Client
3
+ module Group
4
+ def list_groups(options = {})
5
+ RockRMS::Responses::Group.format(get(group_path, options))
6
+ end
7
+
8
+ def find_group(id)
9
+ RockRMS::Responses::Group.format(get(group_path(id)))
10
+ end
11
+
12
+ def list_groups_for_person(person_id, options = {})
13
+ opts = options.dup
14
+ opts['$filter'] = Array(opts['$filter'])
15
+ .push("Members/any(m: m/PersonId eq #{person_id})")
16
+ .join(' and ')
17
+ opts['$expand'] ||= 'Members'
18
+
19
+ list_groups(opts)
20
+ end
21
+
22
+ def list_families_for_person(person_id, options = {})
23
+ RockRMS::Responses::Group.format(
24
+ get("Groups/GetFamilies/#{person_id}", options)
25
+ )
26
+ end
27
+
28
+ private
29
+
30
+ def group_path(id = nil)
31
+ id ? "Groups/#{id}" : 'Groups'
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,32 @@
1
+ module RockRMS
2
+ class Client
3
+ module GroupMember
4
+ def create_group_member(group_id:,
5
+ group_member_status:,
6
+ group_role_id:,
7
+ person_id:)
8
+ post(
9
+ group_member_path,
10
+ {
11
+ IsSystem: false,
12
+ GroupId: group_id,
13
+ GroupMemberStatus: group_member_status,
14
+ GroupRoleId: group_role_id,
15
+ PersonId: person_id
16
+ }
17
+ )
18
+ end
19
+
20
+ def delete_group_member(id)
21
+ delete(group_member_path(id))
22
+ end
23
+
24
+ private
25
+
26
+ def group_member_path(id = nil)
27
+ id ? "GroupMembers/#{id}" : 'GroupMembers'
28
+ end
29
+ end
30
+ end
31
+ end
32
+
@@ -3,22 +3,32 @@ module RockRMS
3
3
  module Person
4
4
  def list_people(options = {})
5
5
  res = get(people_path, options)
6
- RockRMS::Person.format(res)
6
+ RockRMS::Responses::Person.format(res)
7
7
  end
8
8
 
9
9
  def find_person(id)
10
10
  res = get(people_path(id))
11
- RockRMS::Person.format(res)
11
+ RockRMS::Responses::Person.format(res)
12
12
  end
13
13
 
14
14
  def find_person_by_email(email)
15
15
  res = get("People/GetByEmail/#{email}")
16
- RockRMS::Person.format(res)
16
+ RockRMS::Responses::Person.format(res)
17
17
  end
18
18
 
19
- def find_person_by_name(full_name)
20
- res = get("People/Search?name=#{full_name}&includeHtml=false&includeDetails=true&includeBusinesses=false&includeDeceased=false")
21
- RockRMS::Person.format(res)
19
+ NAME_SEARCH_DEFAULTS = {
20
+ includeHtml: false,
21
+ includeDetails: true,
22
+ includeBusinesses: false,
23
+ includeDeceased: false
24
+ }.freeze
25
+
26
+ def find_person_by_name(full_name, options = {})
27
+ priority = options.merge(name: full_name)
28
+
29
+ RockRMS::Responses::Person.format(
30
+ get('People/Search', NAME_SEARCH_DEFAULTS.merge(priority))
31
+ )
22
32
  end
23
33
 
24
34
  def create_person(first_name:, last_name:, email:)
@@ -0,0 +1,15 @@
1
+ module RockRMS
2
+ class Client
3
+ module PhoneNumber
4
+ def list_phone_numbers(options = {})
5
+ RockRMS::Responses::PhoneNumber.format(get(phone_number_path, options))
6
+ end
7
+
8
+ private
9
+
10
+ def phone_number_path(id = nil)
11
+ id ? "PhoneNumbers/#{id}" : "PhoneNumbers"
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,34 @@
1
+ module RockRMS
2
+ module Responses
3
+ class Campus
4
+ MAP = {
5
+ id: 'Id',
6
+ name: 'Name',
7
+ is_active: 'IsActive',
8
+ description: 'Description',
9
+ short_code: 'ShortCode',
10
+ url: 'Url',
11
+ location_id: 'LocationId',
12
+ phone_number: 'PhoneNumber',
13
+ service_times: 'ServiceTimes',
14
+ guid: 'Guid'
15
+ }.freeze
16
+
17
+ def self.format(data)
18
+ if data.is_a?(Array)
19
+ data.map { |object| format_single(object) }
20
+ else
21
+ format_single(data)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def self.format_single(data)
28
+ MAP.each.with_object({}) do |(l,r), object|
29
+ object[l] = data[r]
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,42 @@
1
+ module RockRMS
2
+ module Responses
3
+ class Group
4
+ MAP = {
5
+ id: "Id",
6
+ name: "Name",
7
+ group_type_id: "GroupTypeId",
8
+ parent_group_id: "ParentGroupId",
9
+ campus_id: "CampusId",
10
+ is_active: "IsActive",
11
+ guid: "Guid",
12
+ members: "Members"
13
+ }.freeze
14
+
15
+ def self.format(data)
16
+ if data.is_a?(Array)
17
+ data.map { |object| format_single(object) }
18
+ else
19
+ format_single(data)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def self.format_single(data)
26
+ result = MAP.each.with_object({}) do |(l,r), object|
27
+ object[l] = data[r]
28
+ end
29
+
30
+ if group_locations = data['GroupLocations']
31
+ result[:group_locations] = GroupLocation.format(group_locations)
32
+ end
33
+
34
+ if campus = data['Campus']
35
+ result[:campus] = Campus.format(campus)
36
+ end
37
+
38
+ result
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ module RockRMS
2
+ module Responses
3
+ class GroupLocation
4
+ MAP = {
5
+ id: 'Id',
6
+ group_id: 'GroupId',
7
+ location_id: 'LocationId',
8
+ guid: 'Guid'
9
+ }.freeze
10
+
11
+ def self.format(data)
12
+ if data.is_a?(Array)
13
+ data.map { |object| format_single(object) }
14
+ else
15
+ format_single(data)
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def self.format_single(data)
22
+ result = MAP.each.with_object({}) do |(l,r), object|
23
+ object[l] = data[r]
24
+ end
25
+
26
+ if location = data['Location']
27
+ result[:location] = Location.format(location)
28
+ end
29
+
30
+ result
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,37 @@
1
+ module RockRMS
2
+ module Responses
3
+ class Location
4
+ MAP = {
5
+ id: 'Id',
6
+ name: 'Name',
7
+ is_active: 'IsActive',
8
+ street1: 'Street1',
9
+ street2: 'Street2',
10
+ city: 'City',
11
+ county: 'County',
12
+ state: 'State',
13
+ country: 'Country',
14
+ postal_code: 'PostalCode',
15
+ latitude: 'Latitude',
16
+ longitude: 'Longitude',
17
+ guid: 'Guid'
18
+ }.freeze
19
+
20
+ def self.format(data)
21
+ if data.is_a?(Array)
22
+ data.map { |object| format_single(object) }
23
+ else
24
+ format_single(data)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def self.format_single(data)
31
+ MAP.each.with_object({}) do |(l,r), object|
32
+ object[l] = data[r]
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,23 +1,35 @@
1
1
  module RockRMS
2
- class Person
3
- def self.format(response)
4
- if response.is_a?(Array)
5
- response.map { |person| format_person(person) }
6
- else
7
- format_person(response)
2
+ module Responses
3
+ class Person
4
+ MAP = {
5
+ id: 'Id',
6
+ name: 'FullName',
7
+ email: 'Email',
8
+ first_name: 'FirstName',
9
+ last_name: 'LastName',
10
+ giving_id: 'GivingId',
11
+ alias_id: 'PrimaryAliasId',
12
+ connection_status_value_id: 'ConnectionStatusValueId'
13
+ }.freeze
14
+
15
+ def self.format(data)
16
+ if data.is_a?(Array)
17
+ data.map { |object| format_single(object) }
18
+ else
19
+ format_single(data)
20
+ end
8
21
  end
9
- end
10
22
 
11
- def self.format_person(person)
12
- {
13
- id: person['Id'],
14
- name: person['FullName'],
15
- email: person['Email'],
16
- first_name: person['FirstName'],
17
- last_name: person['LastName'],
18
- giving_id: person['GivingId'],
19
- alias_id: person['PrimaryAliasId']
20
- }
23
+ private
24
+
25
+ def self.format_single(data)
26
+ MAP.each.with_object({}) do |(l,r), object|
27
+ object[l] = data[r]
28
+ end
29
+ end
21
30
  end
22
31
  end
32
+
33
+ # for backwards compatibility
34
+ Person = Responses::Person
23
35
  end
@@ -0,0 +1,27 @@
1
+ module RockRMS
2
+ module Responses
3
+ class PhoneNumber
4
+ MAP = {
5
+ id: 'Id',
6
+ person_id: 'PersonId',
7
+ number: 'Number',
8
+ formatted: 'NumberFormatted',
9
+ formatted_with_cc: 'NumberFormattedWithCountryCode'
10
+ }.freeze
11
+
12
+ def self.format(response)
13
+ if response.is_a?(Array)
14
+ response.map { |number| format_number(number) }
15
+ else
16
+ format_number(response)
17
+ end
18
+ end
19
+
20
+ def self.format_number(data)
21
+ MAP.each.with_object({}) do |(l,r), object|
22
+ object[l] = data[r]
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module RockRMS
2
- VERSION = '1.0.1'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -117,15 +117,15 @@ RSpec.describe RockRMS::Client do
117
117
  include_examples 'param request', :delete
118
118
  end
119
119
 
120
- describe '#patch(path, req_body)' do
120
+ describe '#patch(path, options = {})' do
121
121
  include_examples 'body request', :patch
122
122
  end
123
123
 
124
- describe '#post(path, req_body)' do
124
+ describe '#post(path, options = {})' do
125
125
  include_examples 'body request', :post
126
126
  end
127
127
 
128
- describe '#put(path, req_body)' do
128
+ describe '#put(path, options = {})' do
129
129
  include_examples 'body request', :put
130
130
  end
131
131
  end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RockRMS::Client::GroupMember, type: :model do
4
+ include_context 'resource specs'
5
+
6
+ describe '#create_group_member' do
7
+ context 'arguments' do
8
+ it 'require `group_id`' do
9
+ expect { client.create_group_member }
10
+ .to raise_error(ArgumentError, /group_id/)
11
+ end
12
+
13
+ it 'require `group_member_status`' do
14
+ expect { client.create_group_member }
15
+ .to raise_error(ArgumentError, /group_member_status/)
16
+ end
17
+
18
+ it 'require `group_role_id`' do
19
+ expect { client.create_group_member }
20
+ .to raise_error(ArgumentError, /group_role_id/)
21
+ end
22
+
23
+ it 'require `person_id`' do
24
+ expect { client.create_group_member }
25
+ .to raise_error(ArgumentError, /person_id/)
26
+ end
27
+
28
+ end
29
+
30
+ subject(:resource) {
31
+ client.create_group_member(
32
+ group_id: 123,
33
+ group_member_status: 1,
34
+ group_role_id: 456,
35
+ person_id: 123456
36
+ )
37
+ }
38
+
39
+ it 'returns integer' do
40
+ expect(resource).to be_a(Integer)
41
+ end
42
+
43
+ it 'passes options' do
44
+ expect(client).to receive(:post)
45
+ .with('GroupMembers', {
46
+ IsSystem: false,
47
+ GroupId: 123,
48
+ GroupMemberStatus: 1,
49
+ GroupRoleId: 456,
50
+ PersonId: 123456
51
+ })
52
+ .and_call_original
53
+ resource
54
+ end
55
+ end
56
+
57
+ describe '#delete_group_member' do
58
+ it 'returns nothing' do
59
+ expect(client.delete_group_member(123)).to eq(nil)
60
+ end
61
+
62
+ it 'passes id' do
63
+ expect(client).to receive(:delete).with('GroupMembers/123')
64
+ client.delete_group_member(123)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,111 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RockRMS::Client::Group, type: :model do
4
+ include_context 'resource specs'
5
+
6
+ describe '#find_group(id)' do
7
+ it 'returns a hash' do
8
+ expect(client.find_group(123)).to be_a(Hash)
9
+ end
10
+
11
+ it 'queries groups' do
12
+ expect(client).to receive(:get).with('Groups/123')
13
+ .and_call_original
14
+
15
+ resource = client.find_group(123)
16
+
17
+ expect(resource[:id]).to eq(112233)
18
+ end
19
+
20
+ it 'formats with Group' do
21
+ response = double
22
+ expect(RockRMS::Responses::Group).to receive(:format).with(response)
23
+ allow(client).to receive(:get).and_return(response)
24
+ client.find_group(123)
25
+ end
26
+ end
27
+
28
+ describe '#list_groups(options = {})' do
29
+ it 'returns a array of hashes' do
30
+ resource = client.list_groups
31
+ expect(resource).to be_a(Array)
32
+ expect(resource.first).to be_a(Hash)
33
+ end
34
+
35
+ it 'queries groups' do
36
+ expect(client).to receive(:get).with('Groups', {})
37
+ .and_call_original
38
+ client.list_groups
39
+ end
40
+
41
+ it 'passes options' do
42
+ expect(client).to receive(:get)
43
+ .with('Groups', { option1: '1' })
44
+ .and_return([])
45
+ client.list_groups(option1: '1')
46
+ end
47
+
48
+ it 'formats with Group' do
49
+ response = double
50
+ expect(RockRMS::Responses::Group).to receive(:format).with(response)
51
+ allow(client).to receive(:get).and_return(response)
52
+ client.list_groups
53
+ end
54
+ end
55
+
56
+ describe '#list_groups_for_person' do
57
+ it 'delegates to `list_groups`' do
58
+ expect(client).to receive(:list_groups)
59
+ client.list_groups_for_person(123)
60
+ end
61
+
62
+ it 'filters members by person_id' do
63
+ expect(client).to receive(:list_groups).with(
64
+ hash_including('$filter' => 'Members/any(m: m/PersonId eq 123)')
65
+ )
66
+ client.list_groups_for_person(123)
67
+ end
68
+
69
+ it 'expands member data by default' do
70
+ expect(client).to receive(:list_groups).with(
71
+ hash_including('$expand' => 'Members')
72
+ )
73
+ client.list_groups_for_person(123)
74
+ end
75
+
76
+ it 'supports passing additional filters' do
77
+ expect(client).to receive(:list_groups).with(
78
+ hash_including('$filter' => /GroupTypeId eq 45 and /)
79
+ )
80
+ client.list_groups_for_person(123, '$filter' => 'GroupTypeId eq 45')
81
+ end
82
+ end
83
+
84
+ describe '#list_families_for_person' do
85
+ it 'returns a array of hashes' do
86
+ resource = client.list_families_for_person(123)
87
+ expect(resource).to be_a(Array)
88
+ expect(resource.first).to be_a(Hash)
89
+ end
90
+
91
+ it 'queries families scoped to person' do
92
+ expect(client).to receive(:get).with('Groups/GetFamilies/123', {})
93
+ .and_call_original
94
+ client.list_families_for_person(123)
95
+ end
96
+
97
+ it 'passes options' do
98
+ expect(client).to receive(:get)
99
+ .with('Groups/GetFamilies/123', { option1: '1' })
100
+ .and_return([])
101
+ client.list_families_for_person(123, option1: '1')
102
+ end
103
+
104
+ it 'formats with Group' do
105
+ response = double
106
+ allow(client).to receive(:get).and_return(response)
107
+ expect(RockRMS::Responses::Group).to receive(:format).with(response)
108
+ client.list_families_for_person(123)
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe RockRMS::Client::Person, type: :model do
4
+ include_context 'resource specs'
5
+
6
+ describe '#find_person_by_name(full_name)' do
7
+ it 'returns a array of hashes' do
8
+ resource = client.find_person_by_name('Some Name')
9
+ expect(resource).to be_a(Array)
10
+ expect(resource.first).to be_a(Hash)
11
+ end
12
+
13
+ it 'queries people by name' do
14
+ expect(client).to receive(:get)
15
+ .with('People/Search', hash_including(name: 'Some Name'))
16
+ .and_call_original
17
+ client.find_person_by_name('Some Name')
18
+ end
19
+
20
+ it 'includes default options' do
21
+ expect(client).to receive(:get)
22
+ .with(
23
+ 'People/Search',
24
+ hash_including(**described_class::NAME_SEARCH_DEFAULTS)
25
+ ).and_call_original
26
+ client.find_person_by_name('Some Name')
27
+ end
28
+
29
+ it 'passes options' do
30
+ expect(client).to receive(:get)
31
+ .with('People/Search', hash_including(option1: '1'))
32
+ .and_call_original
33
+ client.find_person_by_name('Some Name', option1: '1')
34
+ end
35
+
36
+ it 'overrides default options' do
37
+ expect(client).to receive(:get)
38
+ .with('People/Search', hash_including(includeHtml: true))
39
+ .and_call_original
40
+ client.find_person_by_name('Some Name', includeHtml: true)
41
+ end
42
+
43
+ it 'formats with Person' do
44
+ response = double
45
+ expect(RockRMS::Responses::Person).to receive(:format).with(response)
46
+ allow(client).to receive(:get).and_return(response)
47
+ client.find_person_by_name('Some Name')
48
+ end
49
+ end
50
+ end