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.
- checksums.yaml +4 -4
- data/.rubocop.yml +7 -0
- data/.travis.yml +9 -2
- data/Gemfile +5 -1
- data/Guardfile +1 -0
- data/README.md +1 -1
- data/Rakefile +9 -0
- data/lib/mailchimp_api_v3.rb +9 -0
- data/lib/mailchimp_api_v3/account.rb +1 -0
- data/lib/mailchimp_api_v3/client.rb +2 -7
- data/lib/mailchimp_api_v3/client/remote.rb +1 -0
- data/lib/mailchimp_api_v3/collection.rb +1 -0
- data/lib/mailchimp_api_v3/collection/paging.rb +1 -0
- data/lib/mailchimp_api_v3/exception.rb +1 -0
- data/lib/mailchimp_api_v3/instance.rb +1 -0
- data/lib/mailchimp_api_v3/interest.rb +1 -0
- data/lib/mailchimp_api_v3/interest_category.rb +1 -0
- data/lib/mailchimp_api_v3/list.rb +1 -0
- data/lib/mailchimp_api_v3/member.rb +1 -0
- data/lib/mailchimp_api_v3/version.rb +2 -1
- data/mailchimp_api_v3.gemspec +3 -2
- metadata +14 -73
- data/spec/fixtures/cassettes/account.yml +0 -96
- data/spec/fixtures/cassettes/client.yml +0 -301
- data/spec/fixtures/cassettes/exception.yml +0 -189
- data/spec/fixtures/cassettes/interest.yml +0 -431
- data/spec/fixtures/cassettes/interest_categories.yml +0 -660
- data/spec/fixtures/cassettes/interest_category.yml +0 -436
- data/spec/fixtures/cassettes/interests.yml +0 -799
- data/spec/fixtures/cassettes/list.yml +0 -246
- data/spec/fixtures/cassettes/lists.yml +0 -158
- data/spec/fixtures/cassettes/mailchimp.yml +0 -96
- data/spec/fixtures/cassettes/member.yml +0 -298
- data/spec/fixtures/cassettes/members.yml +0 -808
- data/spec/fixtures/cassettes/members_create_or_update.yml +0 -817
- data/spec/fixtures/cassettes/members_paging.yml +0 -264
- data/spec/fixtures/cassettes/members_with_interest_categories.yml +0 -902
- data/spec/mailchimp_api_v3/account_spec.rb +0 -15
- data/spec/mailchimp_api_v3/client_spec.rb +0 -77
- data/spec/mailchimp_api_v3/exception_spec.rb +0 -55
- data/spec/mailchimp_api_v3/interest_categories_spec.rb +0 -41
- data/spec/mailchimp_api_v3/interest_category_spec.rb +0 -25
- data/spec/mailchimp_api_v3/interest_spec.rb +0 -23
- data/spec/mailchimp_api_v3/interests_spec.rb +0 -43
- data/spec/mailchimp_api_v3/list_spec.rb +0 -65
- data/spec/mailchimp_api_v3/lists_spec.rb +0 -21
- data/spec/mailchimp_api_v3/member_spec.rb +0 -58
- data/spec/mailchimp_api_v3/members_spec.rb +0 -132
- data/spec/mailchimp_spec.rb +0 -14
- data/spec/spec_helper.rb +0 -24
- data/spec/support/api_key.rb +0 -12
- 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
|