marble_api_client 1.0.0.pre.alpha
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 +7 -0
- data/.editorconfig +8 -0
- data/.gitignore +6 -0
- data/.rubocop.yml +25 -0
- data/.ruby-version +1 -0
- data/.travis.yml +25 -0
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +5 -0
- data/Guardfile +16 -0
- data/LICENSE +7 -0
- data/README.md +137 -0
- data/Rakefile +17 -0
- data/bin/console +18 -0
- data/lib/marble_api_client/proxy.rb +68 -0
- data/lib/marble_api_client/requests/create.rb +27 -0
- data/lib/marble_api_client/requests/index.rb +31 -0
- data/lib/marble_api_client/requests.rb +4 -0
- data/lib/marble_api_client/responses/bad_request.rb +25 -0
- data/lib/marble_api_client/responses/client_error.rb +21 -0
- data/lib/marble_api_client/responses/forbidden.rb +29 -0
- data/lib/marble_api_client/responses/http_methods.rb +29 -0
- data/lib/marble_api_client/responses/list.rb +60 -0
- data/lib/marble_api_client/responses/not_found.rb +25 -0
- data/lib/marble_api_client/responses/not_implemented.rb +24 -0
- data/lib/marble_api_client/responses/record.rb +25 -0
- data/lib/marble_api_client/responses/server_error.rb +27 -0
- data/lib/marble_api_client/responses/success.rb +21 -0
- data/lib/marble_api_client/responses/unauthorized.rb +19 -0
- data/lib/marble_api_client/responses/unprocessable_entity.rb +40 -0
- data/lib/marble_api_client/responses.rb +92 -0
- data/lib/marble_api_client/version.rb +12 -0
- data/lib/marble_api_client.rb +18 -0
- data/marble_api_client.gemspec +32 -0
- data/spec/marble_api_client/proxy_spec.rb +89 -0
- data/spec/marble_api_client/requests/create_spec.rb +30 -0
- data/spec/marble_api_client/requests/index_spec.rb +34 -0
- data/spec/marble_api_client/responses/bad_request_spec.rb +24 -0
- data/spec/marble_api_client/responses/client_error_spec.rb +21 -0
- data/spec/marble_api_client/responses/forbidden_spec.rb +31 -0
- data/spec/marble_api_client/responses/list_spec.rb +77 -0
- data/spec/marble_api_client/responses/not_found_spec.rb +24 -0
- data/spec/marble_api_client/responses/not_implmented_spec.rb +24 -0
- data/spec/marble_api_client/responses/record_spec.rb +24 -0
- data/spec/marble_api_client/responses/responses_spec.rb +90 -0
- data/spec/marble_api_client/responses/server_error_spec.rb +24 -0
- data/spec/marble_api_client/responses/success_spec.rb +13 -0
- data/spec/marble_api_client/responses/unauthorized_spec.rb +13 -0
- data/spec/marble_api_client/responses/unprocessable_entity_spec.rb +49 -0
- data/spec/marble_api_client_spec.rb +16 -0
- data/spec/spec_helper.rb +23 -0
- metadata +223 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
module MarbleApiClient
|
11
|
+
VERSION = '1.0.0-alpha'
|
12
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'net/http'
|
11
|
+
|
12
|
+
require_relative 'marble_api_client/proxy'
|
13
|
+
require_relative 'marble_api_client/requests'
|
14
|
+
require_relative 'marble_api_client/responses'
|
15
|
+
|
16
|
+
# This class interacts with Blue Marble Payroll Webglobe API
|
17
|
+
module MarbleApiClient
|
18
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require './lib/marble_api_client/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = 'marble_api_client'
|
7
|
+
s.version = MarbleApiClient::VERSION
|
8
|
+
s.summary = 'Write a summary.'
|
9
|
+
|
10
|
+
s.description = <<-DESCRIPTION
|
11
|
+
Write a description.
|
12
|
+
DESCRIPTION
|
13
|
+
|
14
|
+
s.authors = ['Dan Dewar']
|
15
|
+
s.email = ['ddewar@bluemarblepayroll.com']
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
|
19
|
+
s.homepage = 'https://github.com/bluemarblepayroll/marble_api_client'
|
20
|
+
s.license = 'MIT'
|
21
|
+
|
22
|
+
s.required_ruby_version = '>= 2.3.8'
|
23
|
+
|
24
|
+
s.add_development_dependency('guard-rspec', '~>4.7')
|
25
|
+
s.add_development_dependency('pry', '~>0')
|
26
|
+
s.add_development_dependency('rake', '~> 12')
|
27
|
+
s.add_development_dependency('rspec')
|
28
|
+
s.add_development_dependency('rubocop', '~>0.74.0')
|
29
|
+
s.add_development_dependency('simplecov', '~>0.17.0')
|
30
|
+
s.add_development_dependency('simplecov-console', '~>0.5.0')
|
31
|
+
s.add_development_dependency('webmock')
|
32
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Proxy do
|
13
|
+
let(:proxy) do
|
14
|
+
MarbleApiClient::Proxy.new(
|
15
|
+
'http://www.example.com:3000',
|
16
|
+
headers: { 'Content-Type': 'application/json' }
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'requires a base_url' do
|
21
|
+
expect { MarbleApiClient::Proxy.new(nil) }
|
22
|
+
.to raise_error(ArgumentError, 'Base URL is not valid')
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'uses SSL for HTTPS requests' do
|
26
|
+
p = MarbleApiClient::Proxy.new(
|
27
|
+
'https://www.example.com:3000',
|
28
|
+
headers: { 'Content-Type': 'application/json' }
|
29
|
+
)
|
30
|
+
|
31
|
+
stub_request(:post, 'https://www.example.com:3000/custom/path/create')
|
32
|
+
p.create('custom/path')
|
33
|
+
expect(WebMock).to have_requested(:post, 'https://www.example.com:3000/custom/path/create')
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'create' do
|
37
|
+
it 'sends requests to path' do
|
38
|
+
stub_request(:post, 'http://www.example.com:3000/custom/path/create')
|
39
|
+
proxy.create('custom/path')
|
40
|
+
expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'sends requests to path ending in "/"' do
|
44
|
+
stub_request(:post, 'http://www.example.com:3000/custom/path/create')
|
45
|
+
proxy.create('custom/path/')
|
46
|
+
expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'sends correct headers' do
|
50
|
+
stub_request(:post, 'http://www.example.com:3000/custom/path/create')
|
51
|
+
proxy.create('custom/path', headers: { option: 'val' })
|
52
|
+
expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
|
53
|
+
.with(headers: { 'Content-Type': 'application/json',
|
54
|
+
option: 'val' })
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'sends the correct body' do
|
58
|
+
stub_request(:post, 'http://www.example.com:3000/custom/path/create')
|
59
|
+
proxy.create('custom/path',
|
60
|
+
create_request: MarbleApiClient::Requests::Create.new(record: { name: 'blue' }))
|
61
|
+
expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/create')
|
62
|
+
.with(body: { context: {}, record: { name: 'blue' } })
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context 'index' do
|
67
|
+
it 'sends to requested path' do
|
68
|
+
stub_request(:post, 'http://www.example.com:3000/custom/path/index')
|
69
|
+
proxy.index('custom/path')
|
70
|
+
expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/index')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'sends the correct headers' do
|
74
|
+
stub_request(:post, 'http://www.example.com:3000/custom/path/index')
|
75
|
+
proxy.index('custom/path', headers: { option: 'val' })
|
76
|
+
expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/index')
|
77
|
+
.with(headers: { 'Content-Type': 'application/json',
|
78
|
+
option: 'val' })
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'sends the correct body' do
|
82
|
+
stub_request(:post, 'http://www.example.com:3000/custom/path/index')
|
83
|
+
proxy.index('custom/path',
|
84
|
+
index_request: MarbleApiClient::Requests::Index.new(record: { name: 'blue' }))
|
85
|
+
expect(WebMock).to have_requested(:post, 'http://www.example.com:3000/custom/path/index')
|
86
|
+
.with(body: { context: {}, record: { name: 'blue' }, page: 1, page_size: 25 })
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Requests::Create do
|
13
|
+
it 'builds the body' do
|
14
|
+
request = MarbleApiClient::Requests::Create.new(
|
15
|
+
context: { red: 'blue' },
|
16
|
+
record: { green: 'yellow' }
|
17
|
+
)
|
18
|
+
|
19
|
+
expected = {
|
20
|
+
context: {
|
21
|
+
red: 'blue'
|
22
|
+
},
|
23
|
+
record: {
|
24
|
+
green: 'yellow'
|
25
|
+
}
|
26
|
+
}.to_json
|
27
|
+
|
28
|
+
expect(request.request_body).to eq(expected)
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Requests::Index do
|
13
|
+
it 'builds the body' do
|
14
|
+
request = MarbleApiClient::Requests::Index.new(
|
15
|
+
context: { red: 'blue' },
|
16
|
+
record: { green: 'yellow' },
|
17
|
+
page: 123,
|
18
|
+
page_size: 10
|
19
|
+
)
|
20
|
+
|
21
|
+
expected = {
|
22
|
+
context: {
|
23
|
+
red: 'blue'
|
24
|
+
},
|
25
|
+
record: {
|
26
|
+
green: 'yellow'
|
27
|
+
},
|
28
|
+
page: 123,
|
29
|
+
page_size: 10
|
30
|
+
}.to_json
|
31
|
+
|
32
|
+
expect(request.request_body).to eq(expected)
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Responses::BadRequest do
|
13
|
+
context 'provides' do
|
14
|
+
let(:error_hash) { { name: 'invalid' }.to_json }
|
15
|
+
let(:response) do
|
16
|
+
instance_double(Net::HTTPResponse, code: 400, body: { errors: error_hash }.to_json)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'errors' do
|
20
|
+
expect(described_class.new(response).errors)
|
21
|
+
.to eq(error_hash)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Responses::ClientError do
|
13
|
+
let(:error_hash) { { name: 'invalid' }.to_json }
|
14
|
+
let(:response) do
|
15
|
+
instance_double(Net::HTTPResponse, code: 400, body: { errors: error_hash }.to_json)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'has access to response code' do
|
19
|
+
expect(described_class.new(response).code).to eq(400)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Responses::Forbidden do
|
13
|
+
context 'provides' do
|
14
|
+
let(:response) do
|
15
|
+
instance_double(Net::HTTPResponse,
|
16
|
+
code: 400,
|
17
|
+
body: { statusCode: '403',
|
18
|
+
redirectUrl: 'www.example.com/hello' }.to_json)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'Status Code' do
|
22
|
+
expect(described_class.new(response).status_code)
|
23
|
+
.to eq('403')
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'Redirect URL' do
|
27
|
+
expect(described_class.new(response).redirect_url)
|
28
|
+
.to eq('www.example.com/hello')
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Responses::List do
|
13
|
+
context 'provides' do
|
14
|
+
let(:page) { '7' }
|
15
|
+
let(:page_size) { '12' }
|
16
|
+
let(:meta) { { grid_color: 'blue' }.to_json }
|
17
|
+
let(:records) { [{ name: 'record_1' }, { name: 'record_2' }].to_json }
|
18
|
+
let(:sort_direction) { 'ASC' }
|
19
|
+
let(:sort_column_index) { '3' }
|
20
|
+
let(:total) { '120' }
|
21
|
+
let(:total_pages) { '10' }
|
22
|
+
let(:response) do
|
23
|
+
instance_double(Net::HTTPResponse,
|
24
|
+
code: 400,
|
25
|
+
body: {
|
26
|
+
page: page,
|
27
|
+
pageSize: page_size,
|
28
|
+
meta: meta,
|
29
|
+
records: records,
|
30
|
+
sortDirection: sort_direction,
|
31
|
+
sortColumnIndex: sort_column_index,
|
32
|
+
total: total,
|
33
|
+
totalPages: total_pages
|
34
|
+
}.to_json)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'page' do
|
38
|
+
expect(described_class.new(response).page)
|
39
|
+
.to eq(page)
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'page_size' do
|
43
|
+
expect(described_class.new(response).page_size)
|
44
|
+
.to eq(page_size)
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'meta' do
|
48
|
+
expect(described_class.new(response).meta)
|
49
|
+
.to eq(meta)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'records' do
|
53
|
+
expect(described_class.new(response).records)
|
54
|
+
.to eq(records)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'sort driection' do
|
58
|
+
expect(described_class.new(response).sort_direction)
|
59
|
+
.to eq(sort_direction)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'sort column index' do
|
63
|
+
expect(described_class.new(response).sort_column_index)
|
64
|
+
.to eq(sort_column_index)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'total' do
|
68
|
+
expect(described_class.new(response).total)
|
69
|
+
.to eq(total)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'total pages' do
|
73
|
+
expect(described_class.new(response).total_pages)
|
74
|
+
.to eq(total_pages)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Responses::NotFound do
|
13
|
+
context 'provides' do
|
14
|
+
let(:error_hash) { { name: 'invalid' }.to_json }
|
15
|
+
let(:response) do
|
16
|
+
instance_double(Net::HTTPResponse, code: 400, body: { errors: error_hash }.to_json)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'errors' do
|
20
|
+
expect(described_class.new(response).errors)
|
21
|
+
.to eq(error_hash)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Responses::NotImplemented do
|
13
|
+
context 'provides' do
|
14
|
+
let(:error_hash) { { name: 'invalid' }.to_json }
|
15
|
+
let(:response) do
|
16
|
+
instance_double(Net::HTTPResponse, code: 400, body: { errors: error_hash }.to_json)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'errors' do
|
20
|
+
expect(described_class.new(response).errors)
|
21
|
+
.to eq(error_hash)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#
|
4
|
+
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
|
5
|
+
#
|
6
|
+
# This source code is licensed under the MIT license found in the
|
7
|
+
# LICENSE file in the root directory of this source tree.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'spec_helper'
|
11
|
+
|
12
|
+
RSpec.describe MarbleApiClient::Responses::Record do
|
13
|
+
context 'provides' do
|
14
|
+
let(:record) { { name: 'record_1' }.to_json }
|
15
|
+
let(:response) do
|
16
|
+
instance_double(Net::HTTPResponse, code: 400, body: { record: record }.to_json)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'errors' do
|
20
|
+
expect(described_class.new(response).record)
|
21
|
+
.to eq(record)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|