soapy_cake 0.3.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/api_versions.yml +110 -110
- data/lib/soapy_cake.rb +10 -2
- data/lib/soapy_cake/admin.rb +34 -46
- data/lib/soapy_cake/affiliate.rb +5 -17
- data/lib/soapy_cake/client.rb +33 -3
- data/lib/soapy_cake/error.rb +4 -0
- data/lib/soapy_cake/helper.rb +16 -0
- data/lib/soapy_cake/request.rb +61 -0
- data/lib/soapy_cake/response.rb +48 -0
- data/lib/soapy_cake/version.rb +1 -1
- data/soapy_cake.gemspec +4 -4
- data/spec/fixtures/vcr_cassettes/Integration_test/raises_if_there_is_an_error.yml +50 -0
- data/spec/fixtures/vcr_cassettes/Integration_test/returns_an_affiliate_with_correct_data_types.yml +114 -0
- data/spec/lib/soapy_cake/admin_spec.rb +87 -199
- data/spec/lib/soapy_cake/affiliate_spec.rb +19 -39
- data/spec/lib/soapy_cake/integration_spec.rb +25 -0
- data/spec/spec_helper.rb +2 -0
- metadata +14 -55
- data/lib/soapy_cake/advertiser.rb +0 -21
- data/lib/soapy_cake/client/cake_client.rb +0 -157
- data/lib/soapy_cake/client/http_client.rb +0 -14
- data/spec/fixtures/vcr_cassettes/client_new_account_statuses.yml +0 -1200
- data/spec/fixtures/vcr_cassettes/client_new_advertisers.yml +0 -1202
- data/spec/fixtures/vcr_cassettes/client_new_affiliate_tags.yml +0 -1200
- data/spec/fixtures/vcr_cassettes/client_new_affiliate_tiers.yml +0 -1201
- data/spec/fixtures/vcr_cassettes/client_new_billing_cycles.yml +0 -1200
- data/spec/fixtures/vcr_cassettes/client_new_cap_intervals.yml +0 -1201
- data/spec/fixtures/vcr_cassettes/client_new_cap_types.yml +0 -1199
- data/spec/fixtures/vcr_cassettes/client_new_countries.yml +0 -1515
- data/spec/fixtures/vcr_cassettes/client_new_currencies.yml +0 -1199
- data/spec/fixtures/vcr_cassettes/client_new_empty_response.yml +0 -1200
- data/spec/fixtures/vcr_cassettes/client_new_empty_response_offer_summary.yml +0 -865
- data/spec/fixtures/vcr_cassettes/client_new_languages.yml +0 -1199
- data/spec/fixtures/vcr_cassettes/client_new_media_types.yml +0 -1215
- data/spec/fixtures/vcr_cassettes/client_new_offer_statuses.yml +0 -1202
- data/spec/fixtures/vcr_cassettes/client_new_offer_types.yml +0 -1201
- data/spec/fixtures/vcr_cassettes/client_new_payment_settings.yml +0 -1203
- data/spec/fixtures/vcr_cassettes/client_new_payment_types.yml +0 -1204
- data/spec/fixtures/vcr_cassettes/client_new_price_formats.yml +0 -1202
- data/spec/fixtures/vcr_cassettes/client_new_roles.yml +0 -1203
- data/spec/fixtures/vcr_cassettes/client_new_verticals.yml +0 -1197
- data/spec/fixtures/vcr_cassettes/client_new_with_username_and_password.yml +0 -1198
- data/spec/fixtures/vcr_cassettes/client_sekken_client_caches_results.yml +0 -1261
- data/spec/lib/soapy_cake/advertiser_spec.rb +0 -14
- data/spec/lib/soapy_cake/client/cake_client_spec.rb +0 -197
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
RSpec.describe SoapyCake::Advertiser do
|
4
|
-
subject { described_class.new(api_key: 'abc', advertiser_id: 1) }
|
5
|
-
|
6
|
-
describe '.bills' do
|
7
|
-
it 'returns bills for an advertiser' do
|
8
|
-
expect_any_instance_of(SoapyCake::Client::CakeClient).to receive(:bills)
|
9
|
-
.with(advertiser_id: 1, api_key: 'abc')
|
10
|
-
|
11
|
-
subject.bills
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,197 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
RSpec.describe SoapyCake::Client::CakeClient do
|
6
|
-
before do
|
7
|
-
described_class.instance_variable_set(:@sekken_clients, nil)
|
8
|
-
end
|
9
|
-
|
10
|
-
subject(:client) { described_class.new(:get, opts) }
|
11
|
-
let(:opts) { {} }
|
12
|
-
|
13
|
-
describe '.new' do
|
14
|
-
context 'when passed api key' do
|
15
|
-
let(:opts) { { api_key: 'api-key' } }
|
16
|
-
|
17
|
-
around { |example| VCR.use_cassette(:client_new_with_api_key, &example) }
|
18
|
-
|
19
|
-
describe '#api_key' do
|
20
|
-
subject { super().api_key }
|
21
|
-
it { is_expected.to eq('api-key') }
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'when passed username and password' do
|
26
|
-
let(:opts) { { username: 'username', password: 'password' } }
|
27
|
-
|
28
|
-
around do |example|
|
29
|
-
VCR.use_cassette(:client_new_with_username_and_password, &example)
|
30
|
-
end
|
31
|
-
|
32
|
-
describe '#api_key' do
|
33
|
-
subject { super().api_key }
|
34
|
-
it { is_expected.to eq('api-key') }
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
{
|
40
|
-
account_statuses: { id: '1', name: 'Active' },
|
41
|
-
advertisers: { id: '1', name: 'ad2games GmbH' },
|
42
|
-
affiliate_tags: { id: '1', name: 'Suspicious' },
|
43
|
-
affiliate_tiers: { id: '1', name: 'Tier 1' },
|
44
|
-
billing_cycles: { id: '1', name: 'Weekly' },
|
45
|
-
cap_intervals: { id: '1', name: 'Daily' },
|
46
|
-
cap_types: { id: '1', name: 'Click' },
|
47
|
-
countries: { code: 'DE', name: 'Germany' },
|
48
|
-
currencies: { id: '1', symbol: '€', name: 'Euro', abbr: 'EUR' },
|
49
|
-
# TODO: Let's test this when there is data.
|
50
|
-
# departments: [],
|
51
|
-
# TODO: We don't get any exchange rates from the test API. Fill in when we
|
52
|
-
# have real API access.
|
53
|
-
# exchange_rates: {},
|
54
|
-
languages: { id: '1', name: 'ENGLISH', abbr: 'en' },
|
55
|
-
offer_statuses: { id: '3', name: 'Apply To Run' },
|
56
|
-
offer_types: { id: '3', name: '3rd Party' },
|
57
|
-
payment_settings: { id: '1', name: 'Pay affiliate in system default currency' },
|
58
|
-
payment_types: { id: '1', name: 'Check' },
|
59
|
-
price_formats: { id: '1', name: 'CPA' },
|
60
|
-
roles: { id: '3', name: 'Account Manager', entity_type_id: nil, entity_type_name: 'Employee' },
|
61
|
-
verticals: { id: '-1', name: 'Global' },
|
62
|
-
}.each do |name, exp_sample|
|
63
|
-
describe "##{name}" do
|
64
|
-
subject { client.public_send(name) }
|
65
|
-
|
66
|
-
around do |example|
|
67
|
-
VCR.use_cassette(:"client_new_#{name}", &example)
|
68
|
-
end
|
69
|
-
|
70
|
-
it { is_expected.to include(exp_sample) }
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
describe 'an empty response' do
|
75
|
-
context 'for exchange rates' do
|
76
|
-
subject do
|
77
|
-
client.exchange_rates(
|
78
|
-
start_date: Time.parse('2013-01-01 00:00:00 +0000)'),
|
79
|
-
end_date: Date.parse('2013-01-31')
|
80
|
-
)
|
81
|
-
end
|
82
|
-
|
83
|
-
around do |example|
|
84
|
-
VCR.use_cassette(:client_new_empty_response, &example)
|
85
|
-
end
|
86
|
-
|
87
|
-
it { is_expected.to eq([]) }
|
88
|
-
end
|
89
|
-
|
90
|
-
context 'for offer summary' do
|
91
|
-
subject do
|
92
|
-
described_class.new(:reports, opts).offer_summary(
|
93
|
-
start_date: Time.utc(2013, 1, 1),
|
94
|
-
end_date: Time.utc(2013, 1, 2)
|
95
|
-
)
|
96
|
-
end
|
97
|
-
|
98
|
-
around do |example|
|
99
|
-
VCR.use_cassette(:client_new_empty_response_offer_summary, &example)
|
100
|
-
end
|
101
|
-
|
102
|
-
it { is_expected.to eq([]) }
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
describe '#remove_prefixes' do
|
107
|
-
it 'removes prefix from hash keys' do
|
108
|
-
expect(
|
109
|
-
client.send(:remove_prefix, 'foo', foo_id: 'bar', foo_name: 'baz')
|
110
|
-
).to eq(id: 'bar', name: 'baz')
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
describe '#sekken_client' do
|
115
|
-
around do |example|
|
116
|
-
VCR.use_cassette(:"client_sekken_client_caches_results", &example)
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'results are cached' do
|
120
|
-
expect(client.sekken_client('roles')).to equal(client.sekken_client('roles'))
|
121
|
-
end
|
122
|
-
|
123
|
-
context 'for different methods with the same wsdl url' do
|
124
|
-
it 'results are cached' do
|
125
|
-
expect(client.sekken_client('roles')).to equal(client.sekken_client('advertisers'))
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
describe '#not_a_valid_method' do
|
131
|
-
subject { -> { client.send('not_a_valid_method') } }
|
132
|
-
|
133
|
-
context 'when an unsupported method is called' do
|
134
|
-
it { is_expected.to raise_error }
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
describe '#process_response' do
|
139
|
-
let(:response) do
|
140
|
-
{
|
141
|
-
affiliate_response: {
|
142
|
-
affiliate_result: {
|
143
|
-
success: true,
|
144
|
-
message: 'Affiliate Added Successfully',
|
145
|
-
affiliate_id: '16103',
|
146
|
-
tipalti_iframe_expiration_date: nil,
|
147
|
-
}
|
148
|
-
}
|
149
|
-
}
|
150
|
-
end
|
151
|
-
|
152
|
-
let(:get_response) do
|
153
|
-
{
|
154
|
-
get_campaign_response: {
|
155
|
-
get_campaign_result: {
|
156
|
-
success: true,
|
157
|
-
campaign: {
|
158
|
-
offer_id: '5129'
|
159
|
-
}
|
160
|
-
}
|
161
|
-
}
|
162
|
-
}
|
163
|
-
end
|
164
|
-
|
165
|
-
it 'handles responses with a message field as not having a collection' do
|
166
|
-
expect(client.send(:process_response, :affiliate, response)).to eq(
|
167
|
-
response[:affiliate_response][:affiliate_result])
|
168
|
-
end
|
169
|
-
|
170
|
-
it 'handles get API responses as having no collection' do
|
171
|
-
expect(client.send(:process_response, :get_campaign, get_response)).to eq(
|
172
|
-
get_response[:get_campaign_response][:get_campaign_result])
|
173
|
-
end
|
174
|
-
|
175
|
-
it 'raises RequestUnsuccessful if response contains success: false' do
|
176
|
-
expect do
|
177
|
-
client.send(:process_response, :affiliate, affiliate_response: {
|
178
|
-
affiliate_result: { message: 'FAIL!', success: false }
|
179
|
-
})
|
180
|
-
end.to raise_error(described_class::RequestUnsuccessful, 'FAIL!')
|
181
|
-
end
|
182
|
-
|
183
|
-
it 'raises RequestUnsuccessful if response contains `:fault` key' do
|
184
|
-
expect do
|
185
|
-
client.send(:process_response, :affiliate,
|
186
|
-
fault: { reason: { text: 'FAIL!' } })
|
187
|
-
end.to raise_error(described_class::RequestUnsuccessful, 'FAIL!')
|
188
|
-
end
|
189
|
-
end
|
190
|
-
|
191
|
-
describe 'instantiating through class method' do
|
192
|
-
it 'creates an instance with the service set according to the method name used' do
|
193
|
-
instance = described_class.get
|
194
|
-
expect(instance.service).to eq(:get)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end
|