Skip to content

Commit f8311d7

Browse files
authored
Add test for PUT&POST /v2/bot/audienceGroup/upload/byFile (#463)
About `PUT&POST /v2/bot/audienceGroup/upload/byFile`, the value for content-type header must be `multipart/form-data`, and content-type for the file within the http request's body must be `text/plain`. This change adds a test for that. It's somewhat rough, but I don't think this will cause a regression, so I believe this test is sufficient.
1 parent dff2538 commit f8311d7

2 files changed

Lines changed: 73 additions & 10 deletions

File tree

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
U0123456789abcdefghijklmnopqrstuv
1+
U4af4980627...
2+
U4af4980628...
3+
U4af4980629...

spec/line/bot/v2/misc_spec.rb

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,34 @@
66

77
describe 'Uploading' do
88
describe 'Uploading' do
9-
describe 'POST /v2/bot/audienceGroup/upload/byFile' do
9+
describe 'PUT /v2/bot/audienceGroup/upload/byFile' do
1010
let(:client) { Line::Bot::V2::ManageAudience::ApiBlobClient.new(channel_access_token: channel_access_token) }
1111
let(:file_path) { 'spec/fixtures/line/bot/v2/sample_user_ids.txt' }
1212
let(:file) { File.open(file_path) }
1313

1414
it 'uploads a file to the audience successfully' do
1515
stub_request(:put, "https://api-data.line.me/v2/bot/audienceGroup/upload/byFile")
16-
.with(
17-
headers: {
18-
'Authorization' => "Bearer #{channel_access_token}",
19-
'Content-Type' => %r{multipart/form-data} # webmock doesn't support multipart/form-data so we use regex
20-
}
21-
)
22-
.to_return(status: 202, body: '', headers: {})
16+
.with do |request|
17+
expect(request.headers['Authorization']).to eq("Bearer #{channel_access_token}")
18+
# Ensure it's multipart/form-data (with boundary)
19+
expect(request.headers['Content-Type']).to match(%r{\Amultipart/form-data; boundary=.+})
20+
21+
# Check if 'uploadDescription' part exists
22+
expect(request.body).to include('Content-Disposition: form-data; name="uploadDescription"')
23+
expect(request.body).to include('Test Audience')
24+
25+
# Check if 'audienceGroupId' part exists
26+
expect(request.body).to include('Content-Disposition: form-data; name="audienceGroupId"')
27+
expect(request.body).to include('1234')
28+
29+
# file part
30+
expect(request.body).to include('Content-Disposition: form-data; name="file"; filename="sample_user_ids.txt"')
31+
# body must contain content type text/plain
32+
expect(request.body).to include('Content-Type: text/plain')
33+
expect(request.body).to include('U4af4980627')
34+
expect(request.body).to include('U4af4980628')
35+
end
36+
.to_return(status: 202, body: '{}', headers: {})
2337

2438
response_body, status_code, headers = client.add_user_ids_to_audience_with_http_info(
2539
file: file,
@@ -28,7 +42,54 @@
2842
)
2943

3044
expect(status_code).to eq(202)
31-
expect(response_body).to be_empty
45+
expect(response_body).to eq("{}")
46+
end
47+
end
48+
49+
describe 'POST /v2/bot/audienceGroup/upload/byFile' do
50+
let(:client) { Line::Bot::V2::ManageAudience::ApiBlobClient.new(channel_access_token: channel_access_token) }
51+
let(:file_path) { 'spec/fixtures/line/bot/v2/sample_user_ids.txt' }
52+
let(:file) { File.open(file_path) }
53+
let(:response_body) do
54+
{
55+
"audienceGroupId": 1234567890123,
56+
"createRoute": "MESSAGING_API",
57+
"type": "UPLOAD",
58+
"description": "audienceGroupName_01",
59+
"created": 1613700237,
60+
"permission": "READ_WRITE",
61+
"expireTimestamp": 1629252237,
62+
"isIfaAudience": false
63+
}.to_json
64+
end
65+
66+
it 'uploads a file to the audience successfully' do
67+
stub_request(:post, "https://api-data.line.me/v2/bot/audienceGroup/upload/byFile")
68+
.with do |request|
69+
expect(request.headers['Authorization']).to eq("Bearer #{channel_access_token}")
70+
# Ensure it's multipart/form-data (with boundary)
71+
expect(request.headers['Content-Type']).to match(%r{\Amultipart/form-data; boundary=.+})
72+
73+
# Check if 'uploadDescription' part exists
74+
expect(request.body).to include('Content-Disposition: form-data; name="uploadDescription"')
75+
expect(request.body).to include('Test Audience')
76+
77+
# file part
78+
expect(request.body).to include('Content-Disposition: form-data; name="file"; filename="sample_user_ids.txt"')
79+
# body must contain content type text/plain
80+
expect(request.body).to include('Content-Type: text/plain')
81+
expect(request.body).to include('U4af4980627')
82+
expect(request.body).to include('U4af4980628')
83+
end
84+
.to_return(status: 202, body: response_body, headers: {})
85+
86+
body, status_code, headers = client.create_audience_for_uploading_user_ids_with_http_info(
87+
file: file,
88+
upload_description: 'Test Audience'
89+
)
90+
91+
expect(status_code).to eq(202)
92+
expect(body.audience_group_id).to eq(1234567890123)
3293
end
3394
end
3495

0 commit comments

Comments
 (0)