mailchimp_api_v3 0.2.17 → 0.2.18

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -0
  3. data/.travis.yml +9 -2
  4. data/Gemfile +5 -1
  5. data/Guardfile +1 -0
  6. data/README.md +1 -1
  7. data/Rakefile +9 -0
  8. data/lib/mailchimp_api_v3.rb +9 -0
  9. data/lib/mailchimp_api_v3/account.rb +1 -0
  10. data/lib/mailchimp_api_v3/client.rb +2 -7
  11. data/lib/mailchimp_api_v3/client/remote.rb +1 -0
  12. data/lib/mailchimp_api_v3/collection.rb +1 -0
  13. data/lib/mailchimp_api_v3/collection/paging.rb +1 -0
  14. data/lib/mailchimp_api_v3/exception.rb +1 -0
  15. data/lib/mailchimp_api_v3/instance.rb +1 -0
  16. data/lib/mailchimp_api_v3/interest.rb +1 -0
  17. data/lib/mailchimp_api_v3/interest_category.rb +1 -0
  18. data/lib/mailchimp_api_v3/list.rb +1 -0
  19. data/lib/mailchimp_api_v3/member.rb +1 -0
  20. data/lib/mailchimp_api_v3/version.rb +2 -1
  21. data/mailchimp_api_v3.gemspec +3 -2
  22. metadata +14 -73
  23. data/spec/fixtures/cassettes/account.yml +0 -96
  24. data/spec/fixtures/cassettes/client.yml +0 -301
  25. data/spec/fixtures/cassettes/exception.yml +0 -189
  26. data/spec/fixtures/cassettes/interest.yml +0 -431
  27. data/spec/fixtures/cassettes/interest_categories.yml +0 -660
  28. data/spec/fixtures/cassettes/interest_category.yml +0 -436
  29. data/spec/fixtures/cassettes/interests.yml +0 -799
  30. data/spec/fixtures/cassettes/list.yml +0 -246
  31. data/spec/fixtures/cassettes/lists.yml +0 -158
  32. data/spec/fixtures/cassettes/mailchimp.yml +0 -96
  33. data/spec/fixtures/cassettes/member.yml +0 -298
  34. data/spec/fixtures/cassettes/members.yml +0 -808
  35. data/spec/fixtures/cassettes/members_create_or_update.yml +0 -817
  36. data/spec/fixtures/cassettes/members_paging.yml +0 -264
  37. data/spec/fixtures/cassettes/members_with_interest_categories.yml +0 -902
  38. data/spec/mailchimp_api_v3/account_spec.rb +0 -15
  39. data/spec/mailchimp_api_v3/client_spec.rb +0 -77
  40. data/spec/mailchimp_api_v3/exception_spec.rb +0 -55
  41. data/spec/mailchimp_api_v3/interest_categories_spec.rb +0 -41
  42. data/spec/mailchimp_api_v3/interest_category_spec.rb +0 -25
  43. data/spec/mailchimp_api_v3/interest_spec.rb +0 -23
  44. data/spec/mailchimp_api_v3/interests_spec.rb +0 -43
  45. data/spec/mailchimp_api_v3/list_spec.rb +0 -65
  46. data/spec/mailchimp_api_v3/lists_spec.rb +0 -21
  47. data/spec/mailchimp_api_v3/member_spec.rb +0 -58
  48. data/spec/mailchimp_api_v3/members_spec.rb +0 -132
  49. data/spec/mailchimp_spec.rb +0 -14
  50. data/spec/spec_helper.rb +0 -24
  51. data/spec/support/api_key.rb +0 -12
  52. data/spec/support/vcr_setup.rb +0 -17
@@ -1,15 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::Account, vcr: { cassette_name: 'account' } do
4
- it 'is the expected class' do
5
- expect(Mailchimp.connect.account).to be_a Mailchimp::Account
6
- end
7
-
8
- it 'has a name' do
9
- expect(Mailchimp.connect.account.name).to eq 'InSite Arts'
10
- end
11
-
12
- it 'has an id' do
13
- expect(Mailchimp.connect.account.id).to eq '1dbca289fd41b54838bcbb501'
14
- end
15
- end
@@ -1,77 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::Client, vcr: { cassette_name: 'client' } do
4
- context 'unauthorized API key' do
5
- let(:bad_key) { 'xxxxxxxxxx-us11' }
6
-
7
- it 'raises an exception if we try to get data' do
8
- expect { Mailchimp::Client.new(bad_key).account }.to raise_error Mailchimp::Exception::APIKeyError
9
- end
10
-
11
- it 'says it is not connected' do
12
- expect(Mailchimp::Client.new(bad_key).connected?).to be_falsey
13
- end
14
- end
15
-
16
- context 'valid API key' do
17
- it 'says it is connected' do
18
- expect(Mailchimp::Client.new.connected?).to be_truthy
19
- end
20
-
21
- it 'is the expected class' do
22
- expect(Mailchimp::Client.new).to be_a Mailchimp::Client
23
- end
24
-
25
- it 'has an account method' do
26
- expect(Mailchimp::Client.new.account).to be_a Mailchimp::Account
27
- end
28
-
29
- it 'has a lists collection' do
30
- lists = Mailchimp::Client.new.lists
31
- expect(lists).to be_an Array
32
- expect(lists.sample).to be_a Mailchimp::List
33
- end
34
-
35
- it 'retrieves a list by name' do
36
- list = Mailchimp::Client.new.lists 'My first list'
37
- expect(list).to be_a Mailchimp::List
38
- expect(list.name).to eq 'My first list'
39
- end
40
-
41
- it "doesn't respond to everything" do
42
- expect(Mailchimp::Client.new.respond_to?(:zzz)).to be_falsey
43
- end
44
- end
45
-
46
- context 'exceptions' do
47
- let(:client) { Mailchimp::Client.new }
48
-
49
- context 'problems we can retry the request for' do
50
- it 'eventually raises the exception' do
51
- allow(client).to receive(:remote_no_payload).and_raise SocketError.new('test message')
52
-
53
- expect { client.account }.to raise_error { |e|
54
- expect(e).to be_a(SocketError)
55
- expect(e.message).to eq('test message')
56
- }
57
- end
58
-
59
- it 'only raises the exception after several retries' do
60
- allow(client).to receive(:remote_no_payload).twice.and_raise SocketError.new('test message')
61
- allow(client).to receive(:remote_no_payload).and_return '"id":1'
62
- expect { client.account }.not_to raise_error
63
- end
64
- end
65
-
66
- context 'unexpected error' do
67
- it 'raises an exception if it encounters an unexpected error' do
68
- exception = NotImplementedError.new('test message')
69
-
70
- expect { client.__send__(:managed_remote_exception, exception) }.to raise_error { |e|
71
- expect(e).to be_a(NotImplementedError)
72
- expect(e.message).to eq('test message')
73
- }
74
- end
75
- end
76
- end
77
- end
@@ -1,55 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::Exception::APIKeyError, vcr: { cassette_name: 'exception' } do
4
- let(:bad_key) { 'xxxxxxxxxx-us11' }
5
-
6
- it 'raises an exception if the API key is not valid' do
7
- expect { Mailchimp.connect(bad_key).account }.to raise_error { |e|
8
- expect(e).to be_a Mailchimp::Exception::APIKeyError
9
- expect(e.type).to eq 'http://developer.mailchimp.com/documentation/mailchimp/guides/error-glossary/'
10
- expect(e.title).to eq 'API Key Invalid'
11
- expect(e.status).to eq 401
12
- expect(e.detail).to eq 'Your API key may be invalid, or you\'ve attempted to access the wrong datacenter.'
13
- }
14
- end
15
-
16
- it 'does not raise an exception if the API key is valid' do
17
- expect { Mailchimp.connect.account }.not_to raise_error
18
- end
19
- end
20
-
21
- describe Mailchimp::Exception::UnknownAttribute, vcr: { cassette_name: 'mailchimp' } do
22
- let(:account) { Mailchimp.connect.account }
23
-
24
- it 'returns a known attribute' do
25
- expect { account.name }.not_to raise_error
26
- end
27
-
28
- it 'fails if we ask for an unknown attribute' do
29
- expect { account.blarbleferry }.to raise_error NoMethodError
30
- end
31
- end
32
-
33
- describe Mailchimp::Exception::BadRequest do
34
- it 'raises a Duplicate exception if the message says so' do
35
- data = { 'detail' => 'The thing already exists, idiot' }
36
- expect { Mailchimp::Exception.parse_invalid_resource_exception data }
37
- .to raise_error Mailchimp::Exception::Duplicate
38
- end
39
-
40
- it 'raises a MissingField exception if the message says so' do
41
- data = { 'detail' => 'The thing can\'t be blank, idiot' }
42
- expect { Mailchimp::Exception.parse_invalid_resource_exception data }
43
- .to raise_error Mailchimp::Exception::MissingField
44
- end
45
-
46
- it 'raises a BadRequest exception otherwise' do
47
- data = { 'detail' => 'The thing is an idiot' }
48
- expect { Mailchimp::Exception.parse_invalid_resource_exception data }
49
- .to raise_error Mailchimp::Exception::BadRequest
50
- end
51
-
52
- it 'responds to everything' do
53
- expect(Mailchimp::Exception::BadRequest.new('xxx').respond_to?(:zzz)).to be_truthy
54
- end
55
- end
@@ -1,41 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::List::InterestCategories, vcr: { cassette_name: 'interest_categories' } do
4
- let(:list) { Mailchimp.connect.lists.first }
5
- let(:interest_categories) { list.interest_categories }
6
-
7
- it 'is the expected class' do
8
- expect(interest_categories).to be_a Mailchimp::List::InterestCategories
9
- end
10
-
11
- context 'adding and deleting' do
12
- context '#create, #find_by, #delete, #first_or_create' do
13
- it 'can add and delete a new instance' do
14
- title = 'Days'
15
- data = { 'title' => title, 'type' => 'checkboxes' }
16
-
17
- # #create
18
- expect { interest_categories.create data }.to change { list.interest_categories.count }.by(1)
19
- expect { interest_categories.create data }.to raise_error Mailchimp::Exception::Duplicate
20
-
21
- # #find_by
22
- interest_category = list.interest_categories.find_by title: title
23
- expect(interest_category).to be_a Mailchimp::List::InterestCategory
24
- expect(interest_category.title).to eq title
25
-
26
- # #first_or_create finds the same instance
27
- interest_category2 = list.interest_categories.first_or_create title: title
28
- expect(interest_category.id).to eq(interest_category2.id)
29
-
30
- # #delete
31
- expect { interest_category.delete }.to change { list.interest_categories.count }.by(-1)
32
-
33
- # #first_or_create creates a new instance
34
- title = 'Sex'
35
- data = { 'title' => title, 'type' => 'radio' }
36
- interest_category = interest_categories.first_or_create data
37
- expect(interest_category.title).to eq title
38
- end
39
- end
40
- end
41
- end
@@ -1,25 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::List::InterestCategory, vcr: { cassette_name: 'interest_category' } do
4
- let(:lists) { Mailchimp.connect.lists }
5
- let(:list) { lists.first }
6
- let(:title) { 'Days' }
7
- let(:interest_category) { list.interest_categories.create 'title' => title, 'type' => 'checkboxes' }
8
-
9
- it 'is the expected class' do
10
- expect(interest_category).to be_a Mailchimp::List::InterestCategory
11
- end
12
-
13
- it 'has a title' do
14
- expect(interest_category.title).to eq title
15
- end
16
-
17
- it 'has an interests collection' do
18
- expect(interest_category.interests.count).to eq 0
19
- interest_category.interests.create name: 'Monday'
20
- interest_category.interests.create name: 'Tuesday'
21
- interests = interest_category.interests
22
- expect(interests).to be_an Array
23
- expect(interests.sample).to be_a Mailchimp::List::InterestCategory::Interest
24
- end
25
- end
@@ -1,23 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::List::InterestCategory::Interest, vcr: { cassette_name: 'interest' } do
4
- let(:lists) { Mailchimp.connect.lists }
5
- let(:list) { lists.first }
6
- let(:title) { 'Days' }
7
- let(:interest_category) { list.interest_categories.create 'title' => title, 'type' => 'checkboxes' }
8
- let(:name) { 'Monday' }
9
- let(:interest) { interest_category.interests.create name: name }
10
-
11
- it 'is the expected class' do
12
- expect(interest).to be_a Mailchimp::List::InterestCategory::Interest
13
- end
14
-
15
- it 'has a name' do
16
- expect(interest.name).to eq name
17
- end
18
-
19
- it 'deletes an instance' do
20
- interest2 = interest_category.interests.create name: 'Tuesday'
21
- expect { interest2.delete }.to change { interest_category.interests.count }.by(-1)
22
- end
23
- end
@@ -1,43 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::List::InterestCategory::Interests, vcr: { cassette_name: 'interests' } do
4
- let(:list) { Mailchimp.connect.lists.first }
5
- let(:title) { 'Days' }
6
- let(:interest_category) { list.interest_categories.create 'title' => title, 'type' => 'checkboxes' }
7
- let(:interests) { interest_category.interests }
8
-
9
- it 'is the expected class' do
10
- expect(interests).to be_a Mailchimp::List::InterestCategory::Interests
11
- end
12
-
13
- context 'adding and deleting' do
14
- context '#create, #find_by, #delete, #first_or_create' do
15
- it 'can add and delete a new instance' do
16
- name = 'Monday'
17
- data = { 'name' => name }
18
-
19
- # #create
20
- expect { interests.create data }.to change { interest_category.interests.count }.by(1)
21
- expect { interests.create data }.to raise_error Mailchimp::Exception::Duplicate
22
-
23
- # #find_by
24
- interest = interest_category.interests.find_by name: name
25
- expect(interest).to be_a Mailchimp::List::InterestCategory::Interest
26
- expect(interest.name).to eq name
27
-
28
- # #first_or_create finds the same instance
29
- interest2 = interest_category.interests.first_or_create name: name
30
- expect(interest.id).to eq(interest2.id)
31
-
32
- # #delete
33
- expect { interest.delete }.to change { interest_category.interests.count }.by(-1)
34
-
35
- # #first_or_create creates a new instance
36
- name = 'Tuesday'
37
- data = { 'name' => name }
38
- interest = interests.first_or_create data
39
- expect(interest.name).to eq name
40
- end
41
- end
42
- end
43
- end
@@ -1,65 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::List, vcr: { cassette_name: 'list' } do
4
- let(:lists) { Mailchimp.connect.lists }
5
- let(:list) { lists.first }
6
-
7
- it 'is the expected class' do
8
- expect(list).to be_a Mailchimp::List
9
- end
10
-
11
- it 'has a name' do
12
- expect(list.name).to eq 'My first list'
13
- end
14
-
15
- it 'has an id' do
16
- expect(list.id).to eq 'e73f5910ca'
17
- end
18
-
19
- it 'has an id + name method' do
20
- expect(list.id_and_name).to eq 'e73f5910ca___My first list'
21
- end
22
-
23
- it 'has a members collection' do
24
- members = list.members
25
- expect(members).to be_an Array
26
- expect(members.sample).to be_a Mailchimp::List::Member
27
- end
28
-
29
- it 'gets a subset of members' do
30
- members = list.members last_name: 'Example'
31
- expect(members).to be_an Array
32
- expect(members.sample).to be_a Mailchimp::List::Member
33
- end
34
-
35
- it 'has a interest_categories collection' do
36
- interest_categories = list.interest_categories
37
- expect(interest_categories).to be_an Array
38
- expect(interest_categories.sample).to be_a Mailchimp::List::InterestCategory
39
- end
40
-
41
- context 'get a specific member' do
42
- let(:email_address) { 'ann@sayers.cc' }
43
- let(:id) { '140b91c107d2058dee730e75be0b1151' }
44
-
45
- it 'gets a member by id' do
46
- member = list.members id
47
- expect(member).to be_a Mailchimp::List::Member
48
- expect(member.id).to eq id
49
- expect(member.email_address).to eq email_address
50
- end
51
-
52
- it 'gets a member by email address' do
53
- member = list.members email_address
54
- expect(member).to be_a Mailchimp::List::Member
55
- expect(member.id).to eq id
56
- expect(member.email_address).to eq email_address
57
- end
58
-
59
- it 'gets a member by name' do
60
- member = list.members 'William Bonkers'
61
- expect(member).to be_a Mailchimp::List::Member
62
- expect(member.id).to eq id
63
- end
64
- end
65
- end
@@ -1,21 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::Lists, vcr: { cassette_name: 'lists' } do
4
- let(:lists) { Mailchimp.connect.lists }
5
-
6
- it 'is the expected class' do
7
- expect(lists).to be_a Mailchimp::Lists
8
- end
9
-
10
- it 'has a count' do
11
- expect(lists.count).to eq 4
12
- end
13
-
14
- it 'returns a list by id' do
15
- expect(Mailchimp.connect.lists('aa923b0da6')).to be_a Mailchimp::List
16
- end
17
-
18
- it 'handles a non-existent id' do
19
- expect(Mailchimp.connect.lists('beef')).to be_nil
20
- end
21
- end
@@ -1,58 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::List::Member, vcr: { cassette_name: 'member' } do
4
- let(:lists) { Mailchimp.connect.lists }
5
- let(:list) { lists.first }
6
- let(:name) { 'Ann Example' }
7
- let(:member) { list.members.first_or_create name: name, email_address: 'ann@sayers.cc' }
8
-
9
- it 'is the expected class' do
10
- expect(member).to be_a Mailchimp::List::Member
11
- end
12
-
13
- it 'has a name' do
14
- expect(member.name).to eq name
15
- end
16
-
17
- it 'has a string repsentation' do
18
- expect(member.to_s).to eq 'Ann Example <ann@sayers.cc>'
19
- end
20
-
21
- it 'handles unexpected data' do
22
- expect { list.members.create(0) }.to raise_error(
23
- Mailchimp::Exception::BadRequest, 'Expecting a Hash, received a Integer: 0'
24
- )
25
- end
26
-
27
- it 'matches supplied comparison data' do
28
- expect(member.matches?(name: name, email_address: 'ann@sayers.cc')).to be_truthy
29
- end
30
-
31
- it "doesn't match mismatched comparison data" do
32
- expect(member.matches?(name: name, vip: true)).to be_falsey
33
- end
34
-
35
- context 'updates name fields correctly' do
36
- it 'uses friendly name fields' do
37
- updated_member = member.update name: 'Billy Bonkers'
38
- expect(updated_member).to be_a Mailchimp::List::Member
39
- expect(updated_member).to have_attributes name: 'Billy Bonkers'
40
-
41
- updated_member = updated_member.update first_name: 'William'
42
- expect(updated_member).to have_attributes name: 'William Bonkers'
43
- end
44
-
45
- it 'handles multiple definitions of the same field' do
46
- data = {
47
- name: 'Billy Bonkers',
48
- first_name: 'William',
49
- merge_fields: {
50
- FNAME: 'Ann',
51
- LNAME: 'Example'
52
- }
53
- }
54
-
55
- expect(member.update(data)).to have_attributes name: 'Ann Example'
56
- end
57
- end
58
- end
@@ -1,132 +0,0 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: true
3
- describe Mailchimp::List::Members do
4
- context 'paging', vcr: { cassette_name: 'members_paging', allow_playback_repeats: true } do
5
- let(:page_size) { 10 }
6
- let(:member_count) { 19 }
7
- let(:list) { Mailchimp.connect.lists 'API test list' }
8
- let(:members) { list.members 'page_size' => page_size }
9
-
10
- it 'is the expected class' do
11
- expect(members).to be_a Mailchimp::List::Members
12
- end
13
-
14
- it 'has a count' do
15
- expect(members.count).to eq member_count
16
- end
17
-
18
- it 'returns pages of members' do
19
- counts = []
20
- members.find_in_pages { |p| counts << p.count }
21
- expect(counts).to eq [page_size, 9]
22
- end
23
-
24
- it 'returns all members by paging' do
25
- count = 0
26
- members.find_each { |_| count += 1 }
27
- expect(count).to eq member_count
28
- end
29
-
30
- it 'has a Member for each item' do
31
- expect(members.sample).to be_a Mailchimp::List::Member
32
- end
33
- end
34
-
35
- context 'adding and deleting' do
36
- context '#create, #find_by, #delete, #first_or_create', vcr: { cassette_name: 'members' } do
37
- let(:list) { Mailchimp.connect.lists 'My first list' }
38
- let(:members) { list.members }
39
-
40
- it 'can add and delete a new instance' do
41
- name = 'Cat Sayers'
42
- data = { name: name, email_address: 'cat@sayers.cc', status: 'subscribed' }
43
-
44
- # #create
45
- expect { members.create data }.to change { list.members.count }.by(1)
46
- expect { members.create data }.to raise_error Mailchimp::Exception::Duplicate
47
-
48
- # #find_by
49
- member = list.members.find_by name: name
50
- expect(member).to be_a Mailchimp::List::Member
51
- expect(member.name).to eq name
52
-
53
- # #first_or_create finds the same instance
54
- member2 = list.members.first_or_create name: name
55
- expect(member.id).to eq(member2.id)
56
-
57
- # #delete
58
- expect { member.delete }.to change { list.members.count }.by(-1)
59
-
60
- # #first_or_create creates a new instance
61
- name = 'Dan Sayers'
62
- data = { name: name, email_address: 'dan@sayers.cc', status: 'subscribed' }
63
- member = members.first_or_create data
64
- expect(member.name).to eq name
65
- member.delete # Tidy up
66
- end
67
- end
68
-
69
- context '#first_or_create with interest categories', vcr: { cassette_name: 'members_with_interest_categories' } do
70
- let(:list) { Mailchimp.connect.lists 'My first list' }
71
- let(:members) { list.members }
72
- let(:interest_categories) { list.interest_categories }
73
-
74
- before do
75
- data = { 'title' => 'Days', 'type' => 'checkboxes' }
76
- interest_categories.create data
77
- end
78
-
79
- it 'can add and delete a new instance' do
80
- name = 'Cat Sayers'
81
- interests = { interest_categories.first.id => true }
82
- data = { name: name, email_address: 'cat@sayers.cc', status: 'subscribed', interests: interests }
83
-
84
- # #create
85
- expect { members.create data }.to change { list.members.count }.by(1)
86
- expect { members.create data }.to raise_error Mailchimp::Exception::Duplicate
87
-
88
- # #find_by
89
- member = list.members.find_by name: name
90
- expect(member).to be_a Mailchimp::List::Member
91
- expect(member.name).to eq name
92
-
93
- # #first_or_create finds the same instance
94
- member2 = list.members.first_or_create data
95
- expect(member.id).to eq(member2.id)
96
-
97
- # #delete
98
- expect { member.delete }.to change { list.members.count }.by(-1)
99
-
100
- # #first_or_create creates a new instance
101
- name = 'Dan Sayers'
102
- data = { name: name, email_address: 'dan@sayers.cc', status: 'subscribed' }
103
- member = members.first_or_create data
104
- expect(member.name).to eq name
105
- member.delete # Tidy up
106
- end
107
- end
108
-
109
- context '#create_or_update', vcr: { cassette_name: 'members_create_or_update' } do
110
- let(:list) { Mailchimp.connect.lists 'My first list' }
111
- let(:members) { list.members }
112
-
113
- it 'creates when no match is found, updates otherwise' do
114
- name = 'Cat Sayers'
115
- data = { name: name, email_address: 'cat@sayers.cc', status: 'subscribed' }
116
-
117
- # Create
118
- expect { members.create_or_update data }.to change { list.members.count }.by(1)
119
-
120
- # Update
121
- data = { first_name: 'Catherine', email_address: 'cat@sayers.cc', status: 'subscribed' }
122
- expect { members.create_or_update data }.not_to change { list.members.count }
123
- expect(members.create_or_update(data)).to have_attributes name: 'Catherine Sayers'
124
-
125
- # Unless we supply an id or equivalent, we won't end up updating anything
126
- data = { name: 'Catherine Sayers' }
127
- expect { members.create_or_update data }.not_to change { list.members.count }
128
- expect(members.create_or_update(data)).to have_attributes name: 'Catherine Sayers'
129
- end
130
- end
131
- end
132
- end