my_john_deere_api 2.4.1
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/README.md +813 -0
- data/Rakefile +9 -0
- data/lib/my_john_deere_api.rb +17 -0
- data/lib/my_john_deere_api/authorize.rb +69 -0
- data/lib/my_john_deere_api/client.rb +151 -0
- data/lib/my_john_deere_api/consumer.rb +90 -0
- data/lib/my_john_deere_api/errors.rb +7 -0
- data/lib/my_john_deere_api/errors/invalid_record_error.rb +29 -0
- data/lib/my_john_deere_api/errors/missing_contribution_definition_id_error.rb +12 -0
- data/lib/my_john_deere_api/errors/not_yet_implemented_error.rb +12 -0
- data/lib/my_john_deere_api/errors/type_mismatch_error.rb +12 -0
- data/lib/my_john_deere_api/errors/unsupported_environment_error.rb +18 -0
- data/lib/my_john_deere_api/helpers.rb +6 -0
- data/lib/my_john_deere_api/helpers/case_conversion.rb +37 -0
- data/lib/my_john_deere_api/helpers/environment_helper.rb +25 -0
- data/lib/my_john_deere_api/helpers/uri_helpers.rb +19 -0
- data/lib/my_john_deere_api/helpers/validate_contribution_definition.rb +18 -0
- data/lib/my_john_deere_api/model.rb +10 -0
- data/lib/my_john_deere_api/model/asset.rb +69 -0
- data/lib/my_john_deere_api/model/asset_location.rb +19 -0
- data/lib/my_john_deere_api/model/base.rb +97 -0
- data/lib/my_john_deere_api/model/contribution_definition.rb +15 -0
- data/lib/my_john_deere_api/model/contribution_product.rb +33 -0
- data/lib/my_john_deere_api/model/field.rb +40 -0
- data/lib/my_john_deere_api/model/flag.rb +36 -0
- data/lib/my_john_deere_api/model/organization.rb +43 -0
- data/lib/my_john_deere_api/net_http_retry.rb +2 -0
- data/lib/my_john_deere_api/net_http_retry/decorator.rb +53 -0
- data/lib/my_john_deere_api/net_http_retry/max_retries_exceeded_error.rb +20 -0
- data/lib/my_john_deere_api/request.rb +6 -0
- data/lib/my_john_deere_api/request/collection.rb +10 -0
- data/lib/my_john_deere_api/request/collection/asset_locations.rb +27 -0
- data/lib/my_john_deere_api/request/collection/assets.rb +34 -0
- data/lib/my_john_deere_api/request/collection/base.rb +91 -0
- data/lib/my_john_deere_api/request/collection/contribution_definitions.rb +26 -0
- data/lib/my_john_deere_api/request/collection/contribution_products.rb +26 -0
- data/lib/my_john_deere_api/request/collection/fields.rb +26 -0
- data/lib/my_john_deere_api/request/collection/flags.rb +33 -0
- data/lib/my_john_deere_api/request/collection/organizations.rb +26 -0
- data/lib/my_john_deere_api/request/create.rb +5 -0
- data/lib/my_john_deere_api/request/create/asset.rb +57 -0
- data/lib/my_john_deere_api/request/create/asset_location.rb +110 -0
- data/lib/my_john_deere_api/request/create/base.rb +67 -0
- data/lib/my_john_deere_api/request/individual.rb +8 -0
- data/lib/my_john_deere_api/request/individual/asset.rb +19 -0
- data/lib/my_john_deere_api/request/individual/base.rb +52 -0
- data/lib/my_john_deere_api/request/individual/contribution_definition.rb +19 -0
- data/lib/my_john_deere_api/request/individual/contribution_product.rb +19 -0
- data/lib/my_john_deere_api/request/individual/field.rb +19 -0
- data/lib/my_john_deere_api/request/individual/organization.rb +19 -0
- data/lib/my_john_deere_api/request/update.rb +4 -0
- data/lib/my_john_deere_api/request/update/asset.rb +40 -0
- data/lib/my_john_deere_api/request/update/base.rb +67 -0
- data/lib/my_john_deere_api/validators.rb +5 -0
- data/lib/my_john_deere_api/validators/asset.rb +35 -0
- data/lib/my_john_deere_api/validators/asset_location.rb +34 -0
- data/lib/my_john_deere_api/validators/base.rb +67 -0
- data/lib/my_john_deere_api/version.rb +3 -0
- data/test/lib/my_john_deere_api/authorize_test.rb +81 -0
- data/test/lib/my_john_deere_api/client_test.rb +225 -0
- data/test/lib/my_john_deere_api/consumer_test.rb +58 -0
- data/test/lib/my_john_deere_api/errors/invalid_record_error_test.rb +26 -0
- data/test/lib/my_john_deere_api/errors/max_retries_exceeded_error_test.rb +13 -0
- data/test/lib/my_john_deere_api/errors/missing_contribution_definition_id_error_test.rb +14 -0
- data/test/lib/my_john_deere_api/errors/not_yet_implemented_error_test.rb +13 -0
- data/test/lib/my_john_deere_api/errors/type_mismatch_error_test.rb +13 -0
- data/test/lib/my_john_deere_api/errors/unsupported_environment_error_test.rb +18 -0
- data/test/lib/my_john_deere_api/errors_test.rb +25 -0
- data/test/lib/my_john_deere_api/helpers/case_conversion_test.rb +100 -0
- data/test/lib/my_john_deere_api/helpers/environment_helper_test.rb +67 -0
- data/test/lib/my_john_deere_api/helpers/uri_helpers_test.rb +58 -0
- data/test/lib/my_john_deere_api/helpers/validate_contribution_definition_test.rb +74 -0
- data/test/lib/my_john_deere_api/helpers_test.rb +21 -0
- data/test/lib/my_john_deere_api/model/asset_location_test.rb +38 -0
- data/test/lib/my_john_deere_api/model/asset_test.rb +133 -0
- data/test/lib/my_john_deere_api/model/base_test.rb +76 -0
- data/test/lib/my_john_deere_api/model/contribution_definition_test.rb +52 -0
- data/test/lib/my_john_deere_api/model/contribution_product_test.rb +82 -0
- data/test/lib/my_john_deere_api/model/field_test.rb +65 -0
- data/test/lib/my_john_deere_api/model/flag_test.rb +48 -0
- data/test/lib/my_john_deere_api/model/organization_test.rb +84 -0
- data/test/lib/my_john_deere_api/model_test.rb +37 -0
- data/test/lib/my_john_deere_api/net_http_retry/decorator_test.rb +163 -0
- data/test/lib/my_john_deere_api/request/collection/asset_locations_test.rb +102 -0
- data/test/lib/my_john_deere_api/request/collection/assets_test.rb +99 -0
- data/test/lib/my_john_deere_api/request/collection/base_test.rb +27 -0
- data/test/lib/my_john_deere_api/request/collection/contribution_definitions_test.rb +88 -0
- data/test/lib/my_john_deere_api/request/collection/contribution_products_test.rb +88 -0
- data/test/lib/my_john_deere_api/request/collection/fields_test.rb +86 -0
- data/test/lib/my_john_deere_api/request/collection/flags_test.rb +92 -0
- data/test/lib/my_john_deere_api/request/collection/organizations_test.rb +87 -0
- data/test/lib/my_john_deere_api/request/collection_test.rb +37 -0
- data/test/lib/my_john_deere_api/request/create/asset_location_test.rb +163 -0
- data/test/lib/my_john_deere_api/request/create/asset_test.rb +182 -0
- data/test/lib/my_john_deere_api/request/create/base_test.rb +29 -0
- data/test/lib/my_john_deere_api/request/create_test.rb +17 -0
- data/test/lib/my_john_deere_api/request/individual/asset_test.rb +33 -0
- data/test/lib/my_john_deere_api/request/individual/base_test.rb +18 -0
- data/test/lib/my_john_deere_api/request/individual/contribution_definition_test.rb +33 -0
- data/test/lib/my_john_deere_api/request/individual/contribution_product_test.rb +33 -0
- data/test/lib/my_john_deere_api/request/individual/field_test.rb +37 -0
- data/test/lib/my_john_deere_api/request/individual/organization_test.rb +33 -0
- data/test/lib/my_john_deere_api/request/individual_test.rb +29 -0
- data/test/lib/my_john_deere_api/request/update/asset_test.rb +99 -0
- data/test/lib/my_john_deere_api/request/update/base_test.rb +60 -0
- data/test/lib/my_john_deere_api/request/update_test.rb +13 -0
- data/test/lib/my_john_deere_api/request_test.rb +21 -0
- data/test/lib/my_john_deere_api/validators/asset_location_test.rb +61 -0
- data/test/lib/my_john_deere_api/validators/asset_test.rb +93 -0
- data/test/lib/my_john_deere_api/validators/base_test.rb +92 -0
- data/test/lib/my_john_deere_api/validators_test.rb +17 -0
- data/test/lib/my_john_deere_api/version_test.rb +9 -0
- data/test/my_john_deere_api_test.rb +37 -0
- data/test/support/helper.rb +97 -0
- data/test/support/vcr/accessor/delete_failed.yml +327 -0
- data/test/support/vcr/accessor/delete_max_failed.yml +615 -0
- data/test/support/vcr/accessor/delete_retry.yml +191 -0
- data/test/support/vcr/accessor/delete_retry_too_soon.yml +191 -0
- data/test/support/vcr/accessor/get_failed.yml +390 -0
- data/test/support/vcr/accessor/get_max_failed.yml +734 -0
- data/test/support/vcr/accessor/get_retry.yml +226 -0
- data/test/support/vcr/accessor/get_retry_too_soon.yml +226 -0
- data/test/support/vcr/accessor/post_failed.yml +417 -0
- data/test/support/vcr/accessor/post_max_failed.yml +785 -0
- data/test/support/vcr/accessor/post_retry.yml +241 -0
- data/test/support/vcr/accessor/post_retry_too_soon.yml +241 -0
- data/test/support/vcr/accessor/put_failed.yml +372 -0
- data/test/support/vcr/accessor/put_max_failed.yml +700 -0
- data/test/support/vcr/accessor/put_retry.yml +216 -0
- data/test/support/vcr/accessor/put_retry_too_soon.yml +216 -0
- data/test/support/vcr/catalog.yml +89 -0
- data/test/support/vcr/delete_asset.yml +82 -0
- data/test/support/vcr/get_access_token.yml +41 -0
- data/test/support/vcr/get_asset.yml +144 -0
- data/test/support/vcr/get_asset_locations.yml +196 -0
- data/test/support/vcr/get_assets.yml +152 -0
- data/test/support/vcr/get_contribution_definition.yml +90 -0
- data/test/support/vcr/get_contribution_definitions.yml +91 -0
- data/test/support/vcr/get_contribution_product.yml +91 -0
- data/test/support/vcr/get_contribution_products.yml +91 -0
- data/test/support/vcr/get_field.yml +144 -0
- data/test/support/vcr/get_fields.yml +146 -0
- data/test/support/vcr/get_flags.yml +47 -0
- data/test/support/vcr/get_organization.yml +90 -0
- data/test/support/vcr/get_organizations.yml +149 -0
- data/test/support/vcr/get_request_token.yml +83 -0
- data/test/support/vcr/post_asset_locations.yml +244 -0
- data/test/support/vcr/post_assets.yml +192 -0
- data/test/support/vcr/put_asset.yml +87 -0
- data/test/support/vcr/warning.txt +28 -0
- data/test/support/vcr_setup.rb +488 -0
- metadata +277 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
module MyJohnDeereApi::Validators
|
2
|
+
module Asset
|
3
|
+
include Base
|
4
|
+
|
5
|
+
VALID_CATEGORIES = {
|
6
|
+
'DEVICE' => {
|
7
|
+
'SENSOR' => ['GRAIN_BIN', 'ENVIRONMENTAL', 'IRRIGATION_PIVOT', 'OTHER']
|
8
|
+
},
|
9
|
+
|
10
|
+
'EQUIPMENT' => {
|
11
|
+
'MACHINE' => ['PICKUP_TRUCK', 'UTILITY_VEHICLE'],
|
12
|
+
'OTHER' => ['ANHYDROUS_AMMONIA_TANK', 'NURSE_TRUCK', 'NURSE_WAGON', 'TECHNICIAN_TRUCK']
|
13
|
+
},
|
14
|
+
}
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def required_attributes
|
19
|
+
[:organization_id, :title]
|
20
|
+
end
|
21
|
+
|
22
|
+
def validate_attributes
|
23
|
+
unless valid_categories?(attributes[:asset_category], attributes[:asset_type], attributes[:asset_sub_type])
|
24
|
+
errors[:asset_category] = 'requires valid combination of category/type/subtype'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Returns boolean, true if this combination is valid
|
30
|
+
|
31
|
+
def valid_categories?(category, type, subtype)
|
32
|
+
VALID_CATEGORIES.dig(category, type).to_a.include?(subtype)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module MyJohnDeereApi::Validators
|
2
|
+
module AssetLocation
|
3
|
+
include Base
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def required_attributes
|
8
|
+
[:asset_id, :timestamp, :geometry, :measurement_data]
|
9
|
+
end
|
10
|
+
|
11
|
+
##
|
12
|
+
# Custom validations for this class
|
13
|
+
|
14
|
+
def validate_attributes
|
15
|
+
validate_measurement_data
|
16
|
+
end
|
17
|
+
|
18
|
+
def validate_measurement_data
|
19
|
+
unless attributes[:measurement_data].is_a?(Array)
|
20
|
+
errors[:measurement_data] ||= 'must be an array'
|
21
|
+
return
|
22
|
+
end
|
23
|
+
|
24
|
+
attributes[:measurement_data].each do |measurement|
|
25
|
+
[:name, :value, :unit].each do |attr|
|
26
|
+
unless measurement.has_key?(attr)
|
27
|
+
errors[:measurement_data] ||= "must include #{attr}"
|
28
|
+
return
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module MyJohnDeereApi
|
2
|
+
##
|
3
|
+
# This is a mix-in for Create/Update Reqest classes. It assumes that
|
4
|
+
# the class in question has a hash of attributes that will be passed
|
5
|
+
# to the request.
|
6
|
+
#
|
7
|
+
# This module creates the errors hash as a reader. The key of the hash
|
8
|
+
# is the attribute name, and the value is an array of error messages
|
9
|
+
# for that attribute. Follow this format when defining custom
|
10
|
+
# validations in the `validate_attributes` method.
|
11
|
+
|
12
|
+
module Validators::Base
|
13
|
+
attr_reader :errors
|
14
|
+
|
15
|
+
##
|
16
|
+
# Raises an error if the record is invalid. Passes the errors hash
|
17
|
+
# to the error, in order to build a useful message string.
|
18
|
+
|
19
|
+
def validate!
|
20
|
+
raise(InvalidRecordError, errors) unless valid?
|
21
|
+
true
|
22
|
+
end
|
23
|
+
##
|
24
|
+
|
25
|
+
# Runs validations, adding to the errors hash as needed. Returns true
|
26
|
+
# if the errors hash is still empty after all validations have been run.
|
27
|
+
|
28
|
+
def valid?
|
29
|
+
return @is_valid if defined?(@is_valid)
|
30
|
+
|
31
|
+
@errors = {}
|
32
|
+
validate_required
|
33
|
+
validate_attributes
|
34
|
+
|
35
|
+
@is_valid = errors.empty?
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
##
|
41
|
+
# Validates required attributes
|
42
|
+
|
43
|
+
def validate_required
|
44
|
+
required_attributes.each do |attr|
|
45
|
+
errors[attr] = 'is required' unless attributes[attr]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# Attributes that must be specified, override in child module if needed
|
51
|
+
|
52
|
+
def required_attributes
|
53
|
+
[]
|
54
|
+
end
|
55
|
+
|
56
|
+
##
|
57
|
+
# Handle any custom validation for this class, override in child module if needed.
|
58
|
+
#
|
59
|
+
# Add messages to errors hash with the attribute name as the key, and an array
|
60
|
+
# of error messages as the value.
|
61
|
+
|
62
|
+
def validate_attributes
|
63
|
+
# Example:
|
64
|
+
# errors[:name] = "can't be blank" if errors[:name].size == 0
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'cgi'
|
3
|
+
require 'support/helper'
|
4
|
+
|
5
|
+
def contains_parameters?(uri)
|
6
|
+
!URI.parse(uri).query.nil?
|
7
|
+
end
|
8
|
+
|
9
|
+
def create_authorize
|
10
|
+
VCR.use_cassette('catalog'){ JD::Authorize.new(api_key, api_secret, environment: :sandbox) }
|
11
|
+
end
|
12
|
+
|
13
|
+
def fancy_url
|
14
|
+
'https://example.com/turtles'
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'MyJohnDeereApi::Authorize' do
|
18
|
+
describe 'initialization' do
|
19
|
+
it 'sets the api key/secret' do
|
20
|
+
authorize = VCR.use_cassette('catalog') { JD::Authorize.new(api_key, api_secret) }
|
21
|
+
|
22
|
+
assert_equal api_key, authorize.api_key
|
23
|
+
assert_equal api_secret, authorize.api_secret
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'accepts the environment' do
|
27
|
+
environment = :sandbox
|
28
|
+
|
29
|
+
authorize = VCR.use_cassette('catalog') { JD::Authorize.new(api_key, api_secret, environment: environment) }
|
30
|
+
assert_equal environment, authorize.environment
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#consumer' do
|
35
|
+
it "returns a non-user-specific consumer configured for GET requests" do
|
36
|
+
authorize = create_authorize
|
37
|
+
consumer = VCR.use_cassette('catalog') { authorize.consumer }
|
38
|
+
|
39
|
+
assert_kind_of OAuth::Consumer, consumer
|
40
|
+
assert_equal :get, consumer.http_method
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#authorize_url' do
|
45
|
+
it 'retrieves a request url' do
|
46
|
+
authorize = create_authorize
|
47
|
+
|
48
|
+
url = VCR.use_cassette('get_request_token') { authorize.authorize_url }
|
49
|
+
links = VCR.use_cassette('catalog') { JD::Consumer.new(api_key, api_secret, environment: :sandbox).send(:links) }
|
50
|
+
|
51
|
+
assert_includes url, links[:authorize_request_token]
|
52
|
+
|
53
|
+
query = URI.parse(url).query
|
54
|
+
params = CGI::parse(query)
|
55
|
+
|
56
|
+
assert_match(TOKEN_PATTERN, params['oauth_token'].first)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'sets the request token/secret' do
|
60
|
+
authorize = create_authorize
|
61
|
+
|
62
|
+
VCR.use_cassette('get_request_token') { authorize.authorize_url }
|
63
|
+
|
64
|
+
assert_match TOKEN_PATTERN, authorize.request_token
|
65
|
+
assert_match SECRET_PATTERN, authorize.request_secret
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#verify(code, token, secret)' do
|
70
|
+
it 'sets the access token/secret' do
|
71
|
+
authorize = create_authorize
|
72
|
+
code = 'VERIFY'
|
73
|
+
|
74
|
+
VCR.use_cassette('get_request_token') { authorize.authorize_url }
|
75
|
+
VCR.use_cassette('get_access_token') { authorize.verify(code) }
|
76
|
+
|
77
|
+
assert_match TOKEN_PATTERN, authorize.access_token
|
78
|
+
assert_match SECRET_PATTERN, authorize.access_secret
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
require 'support/helper'
|
2
|
+
|
3
|
+
describe 'MyJohnDeereApi::Client' do
|
4
|
+
it 'includes the CaseConversion helper' do
|
5
|
+
client = JD::Client.new(api_key, api_secret)
|
6
|
+
assert_equal 'thisIsATest', client.send(:camelize, :this_is_a_test)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#initialize(api_key, api_secret, options={})' do
|
10
|
+
it 'sets the api key/secret' do
|
11
|
+
client = JD::Client.new(api_key, api_secret)
|
12
|
+
|
13
|
+
assert_equal api_key, client.api_key
|
14
|
+
assert_equal api_secret, client.api_secret
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'accepts access token/secret' do
|
18
|
+
access_token = 'token'
|
19
|
+
access_secret = 'secret'
|
20
|
+
|
21
|
+
client = JD::Client.new(api_key, api_secret, access: [access_token, access_secret])
|
22
|
+
|
23
|
+
assert_equal access_token, client.access_token
|
24
|
+
assert_equal access_secret, client.access_secret
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'accepts the environment' do
|
28
|
+
environment = :sandbox
|
29
|
+
|
30
|
+
client = JD::Client.new(api_key, api_secret, environment: environment)
|
31
|
+
assert_equal environment, client.environment
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'accepts a contribution_definition_id' do
|
35
|
+
client = JD::Client.new(api_key, api_secret, contribution_definition_id: contribution_definition_id)
|
36
|
+
assert_equal contribution_definition_id, client.contribution_definition_id
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'accepts a list of parameters for NetHttpRetry' do
|
40
|
+
custom_retries = JD::NetHttpRetry::Decorator::DEFAULTS[:max_retries] + 10
|
41
|
+
|
42
|
+
VCR.use_cassette('catalog') do
|
43
|
+
new_client = JD::Client.new(
|
44
|
+
api_key,
|
45
|
+
api_secret,
|
46
|
+
contribution_definition_id: contribution_definition_id,
|
47
|
+
environment: :sandbox,
|
48
|
+
access: [access_token, access_secret],
|
49
|
+
http_retry: {max_retries: custom_retries}
|
50
|
+
)
|
51
|
+
|
52
|
+
assert_equal custom_retries, new_client.accessor.max_retries
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe '#contribution_definition_id' do
|
58
|
+
it 'can be set after instantiation' do
|
59
|
+
client = JD::Client.new(api_key, api_secret)
|
60
|
+
assert_nil client.contribution_definition_id
|
61
|
+
|
62
|
+
client.contribution_definition_id = '123'
|
63
|
+
assert_equal '123', client.contribution_definition_id
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe '#get' do
|
68
|
+
it 'returns the response as a Hash' do
|
69
|
+
response = VCR.use_cassette('get_organizations') { client.get('/organizations') }
|
70
|
+
|
71
|
+
assert_kind_of Hash, response
|
72
|
+
assert_kind_of Integer, response['total']
|
73
|
+
assert response['values'].all?{|value| value['@type'] == 'Organization'}
|
74
|
+
assert response['values'].all?{|value| value.has_key?('links')}
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'prepends the leading slash if needed' do
|
78
|
+
response = VCR.use_cassette('get_organizations') { client.get('organizations') }
|
79
|
+
|
80
|
+
assert_kind_of Hash, response
|
81
|
+
assert_kind_of Integer, response['total']
|
82
|
+
assert response['values'].all?{|value| value['@type'] == 'Organization'}
|
83
|
+
assert response['values'].all?{|value| value.has_key?('links')}
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'allows symbols for simple resources' do
|
87
|
+
response = VCR.use_cassette('get_organizations') { client.get(:organizations) }
|
88
|
+
|
89
|
+
assert_kind_of Hash, response
|
90
|
+
assert_kind_of Integer, response['total']
|
91
|
+
assert response['values'].all?{|value| value['@type'] == 'Organization'}
|
92
|
+
assert response['values'].all?{|value| value.has_key?('links')}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe '#post' do
|
97
|
+
let(:attributes) do
|
98
|
+
CONFIG.asset_attributes.merge(
|
99
|
+
links: [
|
100
|
+
{
|
101
|
+
'@type' => 'Link',
|
102
|
+
'rel' => 'contributionDefinition',
|
103
|
+
'uri' => "#{CONFIG.url}/contributionDefinitions/#{contribution_definition_id}"
|
104
|
+
}
|
105
|
+
]
|
106
|
+
)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'returns the response as a Hash' do
|
110
|
+
response = VCR.use_cassette('post_assets') do
|
111
|
+
client.post("/organizations/#{organization_id}/assets", attributes)
|
112
|
+
end
|
113
|
+
|
114
|
+
assert_equal '201', response.code
|
115
|
+
assert_equal 'Created', response.message
|
116
|
+
assert_equal "#{base_url}/assets/#{asset_id}", response['Location']
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'prepends the leading slash if needed' do
|
120
|
+
response = VCR.use_cassette('post_assets') do
|
121
|
+
client.post("organizations/#{organization_id}/assets", attributes)
|
122
|
+
end
|
123
|
+
|
124
|
+
assert_equal '201', response.code
|
125
|
+
assert_equal 'Created', response.message
|
126
|
+
assert_equal "#{base_url}/assets/#{asset_id}", response['Location']
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe '#put' do
|
131
|
+
let(:new_title) { 'i REALLY like turtles!' }
|
132
|
+
|
133
|
+
let(:attributes) do
|
134
|
+
CONFIG.asset_attributes.slice(
|
135
|
+
:asset_category, :asset_type, :asset_sub_type, :links
|
136
|
+
).merge(
|
137
|
+
title: new_title,
|
138
|
+
links: [
|
139
|
+
{
|
140
|
+
'@type' => 'Link',
|
141
|
+
'rel' => 'contributionDefinition',
|
142
|
+
'uri' => "#{CONFIG.url}/contributionDefinitions/#{contribution_definition_id}"
|
143
|
+
}
|
144
|
+
]
|
145
|
+
)
|
146
|
+
end
|
147
|
+
|
148
|
+
it 'sends the request' do
|
149
|
+
response = VCR.use_cassette('put_asset') { client.put("/assets/#{asset_id}", attributes) }
|
150
|
+
|
151
|
+
assert_equal '204', response.code
|
152
|
+
assert_equal 'No Content', response.message
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'prepends the leading slash if needed' do
|
156
|
+
response = VCR.use_cassette('put_asset') { client.put("assets/#{asset_id}", attributes) }
|
157
|
+
|
158
|
+
assert_equal '204', response.code
|
159
|
+
assert_equal 'No Content', response.message
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe '#delete' do
|
164
|
+
it 'sends the request' do
|
165
|
+
response = VCR.use_cassette('delete_asset') { client.delete("/assets/#{asset_id}") }
|
166
|
+
|
167
|
+
assert_equal '204', response.code
|
168
|
+
assert_equal 'No Content', response.message
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'prepends the leading slash if needed' do
|
172
|
+
response = VCR.use_cassette('delete_asset') { client.delete("assets/#{asset_id}") }
|
173
|
+
|
174
|
+
assert_equal '204', response.code
|
175
|
+
assert_equal 'No Content', response.message
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe '#organizations' do
|
180
|
+
it 'returns a collection of organizations for this account' do
|
181
|
+
organizations = VCR.use_cassette('get_organizations') { client.organizations.all; client.organizations }
|
182
|
+
|
183
|
+
assert_kind_of JD::Request::Collection::Organizations, organizations
|
184
|
+
|
185
|
+
organizations.each do |organization|
|
186
|
+
assert_kind_of JD::Model::Organization, organization
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
describe '#contribution_products' do
|
192
|
+
it 'returns a collection of contribution products for this account' do
|
193
|
+
contribution_products = VCR.use_cassette('get_contribution_products') { client.contribution_products.all; client.contribution_products }
|
194
|
+
|
195
|
+
assert_kind_of JD::Request::Collection::ContributionProducts, contribution_products
|
196
|
+
|
197
|
+
contribution_products.each do |contribution_product|
|
198
|
+
assert_kind_of JD::Model::ContributionProduct, contribution_product
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe '#consumer' do
|
204
|
+
it 'receives the api key/secret and environment of the client' do
|
205
|
+
environment = :sandbox
|
206
|
+
|
207
|
+
client = JD::Client.new(api_key, api_secret, environment: environment)
|
208
|
+
consumer = client.send :consumer
|
209
|
+
|
210
|
+
assert_kind_of JD::Consumer, consumer
|
211
|
+
assert_equal api_key, consumer.api_key
|
212
|
+
assert_equal api_secret, consumer.api_secret
|
213
|
+
assert_equal environment, consumer.environment
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
describe '#accessor' do
|
218
|
+
it 'returns an object that can make user-specific requests' do
|
219
|
+
assert_kind_of JD::NetHttpRetry::Decorator, accessor
|
220
|
+
assert_kind_of OAuth::Consumer, accessor.consumer
|
221
|
+
assert_equal access_token, accessor.token
|
222
|
+
assert_equal access_secret, accessor.secret
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|