Skip to content

Commit 3d99351

Browse files
committed
KRED-2534 Add get merchant
1 parent 099adcb commit 3d99351

3 files changed

Lines changed: 299 additions & 0 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# frozen_string_literal: true
2+
3+
module MidtransApi
4+
module Api
5+
module Merchant
6+
class Get < MidtransApi::Api::Base
7+
PATH = 'merchants'
8+
9+
def get(params, partner_id)
10+
response = client.get(PATH, params, {
11+
'X-PARTNER-ID': partner_id
12+
})
13+
14+
MidtransApi::Model::Merchant::Get.new(response)
15+
end
16+
end
17+
end
18+
end
19+
end
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# frozen_string_literal: true
2+
3+
module MidtransApi
4+
module Model
5+
module Merchant
6+
class Get < MidtransApi::Model::Base
7+
resource_attributes :merchants
8+
9+
def resolve_params_attr(attr)
10+
attr.to_s
11+
end
12+
13+
def merchant_list
14+
return [] unless merchants
15+
16+
merchants.map do |merchant_data|
17+
MerchantItem.new(merchant_data)
18+
end
19+
end
20+
21+
# Inner class to represent individual merchant items
22+
class MerchantItem
23+
attr_reader :merchant_id, :merchant_name, :merchant_phone_number, :email
24+
25+
def initialize(merchant_data)
26+
@merchant_id = merchant_data['merchant_id']
27+
@merchant_name = merchant_data['merchant_name']
28+
@merchant_phone_number = merchant_data['merchant_phone_number']
29+
@email = merchant_data['email']
30+
end
31+
32+
def to_h
33+
{
34+
merchant_id: merchant_id,
35+
merchant_name: merchant_name,
36+
merchant_phone_number: merchant_phone_number,
37+
email: email
38+
}
39+
end
40+
end
41+
end
42+
end
43+
end
44+
end
Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
# frozen_string_literal: true
2+
3+
require 'spec_helper'
4+
5+
describe MidtransApi::Api::Merchant::Get do
6+
let(:client) do
7+
MidtransApi::Client.new(
8+
client_key: 'secret_key',
9+
server_key: 'secret_key',
10+
sandbox: true,
11+
api_version: :v1
12+
)
13+
end
14+
15+
let(:success_response) do
16+
{
17+
"status_code": "200",
18+
"status_message": "Merchants have been successfully retrieved.",
19+
"merchants": [
20+
{
21+
"merchant_id": "G221991147",
22+
"merchant_name": "MSN KAP Agus Ubaidillah dan Rekan01",
23+
"merchant_phone_number": "+621000000000",
24+
"email": "dhany+39457_79@mekari.com"
25+
},
26+
{
27+
"merchant_id": "G539217527",
28+
"merchant_name": "MSN KAP Agus Ubaidillah dan Rekan01",
29+
"merchant_phone_number": "+621000000000",
30+
"email": "dhany+39457_80@mekari.com"
31+
}
32+
]
33+
}
34+
end
35+
36+
let(:empty_merchants_response) do
37+
{
38+
"status_code": "200",
39+
"status_message": "No merchants found.",
40+
"merchants": []
41+
}
42+
end
43+
44+
let(:missing_merchants_response) do
45+
{
46+
"status_code": "200",
47+
"status_message": "No merchants found."
48+
}
49+
end
50+
51+
let(:merchants_with_empty_fields_response) do
52+
{
53+
"status_code": "200",
54+
"status_message": "Merchants have been successfully retrieved.",
55+
"merchants": [
56+
{
57+
"merchant_id": "G221991147",
58+
"merchant_name": "",
59+
"merchant_phone_number": nil,
60+
"email": "dhany+39457_79@mekari.com"
61+
},
62+
{
63+
"merchant_id": "",
64+
"merchant_name": "Test Merchant",
65+
"merchant_phone_number": "+621000000000",
66+
"email": ""
67+
}
68+
]
69+
}
70+
end
71+
72+
let(:merchants_with_missing_fields_response) do
73+
{
74+
"status_code": "200",
75+
"status_message": "Merchants have been successfully retrieved.",
76+
"merchants": [
77+
{
78+
"merchant_id": "G221991147",
79+
"email": "dhany+39457_79@mekari.com"
80+
},
81+
{
82+
"merchant_name": "Test Merchant",
83+
"merchant_phone_number": "+621000000000"
84+
}
85+
]
86+
}
87+
end
88+
89+
describe '#get' do
90+
context 'with keyword parameter' do
91+
it 'returns expected response' do
92+
partner_id = '739'
93+
params = { keyword: 'MSN KAP Agus Ubaidillah dan Rekan01' }
94+
95+
stub_request(:get, "#{client.config.api_url}/#{client.config.api_version}/merchants")
96+
.with(query: params)
97+
.to_return(status: 200, body: success_response.to_json)
98+
99+
merchant_api = described_class.new(client)
100+
response = merchant_api.get(params, partner_id)
101+
102+
expect(response).to be_instance_of MidtransApi::Model::Merchant::Get
103+
expect(response.merchants).to be_an(Array)
104+
expect(response.merchants.length).to eq(2)
105+
106+
# Test merchant_list method
107+
merchant_list = response.merchant_list
108+
expect(merchant_list).to be_an(Array)
109+
expect(merchant_list.length).to eq(2)
110+
111+
first_merchant = merchant_list.first
112+
expect(first_merchant.merchant_id).to eq('G221991147')
113+
expect(first_merchant.merchant_name).to eq('MSN KAP Agus Ubaidillah dan Rekan01')
114+
expect(first_merchant.merchant_phone_number).to eq('+621000000000')
115+
expect(first_merchant.email).to eq('dhany+39457_79@mekari.com')
116+
end
117+
end
118+
119+
context 'without keyword parameter' do
120+
it 'returns expected response' do
121+
partner_id = '739'
122+
params = {}
123+
124+
stub_request(:get, "#{client.config.api_url}/#{client.config.api_version}/merchants")
125+
.to_return(status: 200, body: success_response.to_json)
126+
127+
merchant_api = described_class.new(client)
128+
response = merchant_api.get(params, partner_id)
129+
130+
expect(response).to be_instance_of MidtransApi::Model::Merchant::Get
131+
expect(response.merchants).to be_an(Array)
132+
end
133+
end
134+
135+
context 'when merchants array is empty' do
136+
it 'returns empty merchant list' do
137+
partner_id = '739'
138+
params = {}
139+
140+
stub_request(:get, "#{client.config.api_url}/#{client.config.api_version}/merchants")
141+
.to_return(status: 200, body: empty_merchants_response.to_json)
142+
143+
merchant_api = described_class.new(client)
144+
response = merchant_api.get(params, partner_id)
145+
146+
expect(response).to be_instance_of MidtransApi::Model::Merchant::Get
147+
expect(response.merchants).to be_an(Array)
148+
expect(response.merchants).to be_empty
149+
expect(response.merchant_list).to be_an(Array)
150+
expect(response.merchant_list).to be_empty
151+
end
152+
end
153+
154+
context 'when merchants field is missing from response' do
155+
it 'handles missing merchants field gracefully' do
156+
partner_id = '739'
157+
params = {}
158+
159+
stub_request(:get, "#{client.config.api_url}/#{client.config.api_version}/merchants")
160+
.to_return(status: 200, body: missing_merchants_response.to_json)
161+
162+
merchant_api = described_class.new(client)
163+
response = merchant_api.get(params, partner_id)
164+
165+
expect(response).to be_instance_of MidtransApi::Model::Merchant::Get
166+
expect(response.merchants).to be_nil
167+
expect(response.merchant_list).to be_an(Array)
168+
expect(response.merchant_list).to be_empty
169+
end
170+
end
171+
172+
context 'when merchant fields are empty or nil' do
173+
it 'handles empty and nil field values gracefully' do
174+
partner_id = '739'
175+
params = {}
176+
177+
stub_request(:get, "#{client.config.api_url}/#{client.config.api_version}/merchants")
178+
.to_return(status: 200, body: merchants_with_empty_fields_response.to_json)
179+
180+
merchant_api = described_class.new(client)
181+
response = merchant_api.get(params, partner_id)
182+
183+
expect(response).to be_instance_of MidtransApi::Model::Merchant::Get
184+
expect(response.merchants).to be_an(Array)
185+
expect(response.merchants.length).to eq(2)
186+
187+
merchant_list = response.merchant_list
188+
expect(merchant_list.length).to eq(2)
189+
190+
first_merchant = merchant_list.first
191+
expect(first_merchant.merchant_id).to eq('G221991147')
192+
expect(first_merchant.merchant_name).to eq('')
193+
expect(first_merchant.merchant_phone_number).to be_nil
194+
expect(first_merchant.email).to eq('dhany+39457_79@mekari.com')
195+
196+
second_merchant = merchant_list.last
197+
expect(second_merchant.merchant_id).to eq('')
198+
expect(second_merchant.merchant_name).to eq('Test Merchant')
199+
expect(second_merchant.merchant_phone_number).to eq('+621000000000')
200+
expect(second_merchant.email).to eq('')
201+
end
202+
end
203+
204+
context 'when merchant fields are missing' do
205+
it 'handles missing field values gracefully' do
206+
partner_id = '739'
207+
params = {}
208+
209+
stub_request(:get, "#{client.config.api_url}/#{client.config.api_version}/merchants")
210+
.to_return(status: 200, body: merchants_with_missing_fields_response.to_json)
211+
212+
merchant_api = described_class.new(client)
213+
response = merchant_api.get(params, partner_id)
214+
215+
expect(response).to be_instance_of MidtransApi::Model::Merchant::Get
216+
expect(response.merchants).to be_an(Array)
217+
expect(response.merchants.length).to eq(2)
218+
219+
merchant_list = response.merchant_list
220+
expect(merchant_list.length).to eq(2)
221+
222+
first_merchant = merchant_list.first
223+
expect(first_merchant.merchant_id).to eq('G221991147')
224+
expect(first_merchant.merchant_name).to be_nil
225+
expect(first_merchant.merchant_phone_number).to be_nil
226+
expect(first_merchant.email).to eq('dhany+39457_79@mekari.com')
227+
228+
second_merchant = merchant_list.last
229+
expect(second_merchant.merchant_id).to be_nil
230+
expect(second_merchant.merchant_name).to eq('Test Merchant')
231+
expect(second_merchant.merchant_phone_number).to eq('+621000000000')
232+
expect(second_merchant.email).to be_nil
233+
end
234+
end
235+
end
236+
end

0 commit comments

Comments
 (0)