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.
Files changed (153) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +813 -0
  3. data/Rakefile +9 -0
  4. data/lib/my_john_deere_api.rb +17 -0
  5. data/lib/my_john_deere_api/authorize.rb +69 -0
  6. data/lib/my_john_deere_api/client.rb +151 -0
  7. data/lib/my_john_deere_api/consumer.rb +90 -0
  8. data/lib/my_john_deere_api/errors.rb +7 -0
  9. data/lib/my_john_deere_api/errors/invalid_record_error.rb +29 -0
  10. data/lib/my_john_deere_api/errors/missing_contribution_definition_id_error.rb +12 -0
  11. data/lib/my_john_deere_api/errors/not_yet_implemented_error.rb +12 -0
  12. data/lib/my_john_deere_api/errors/type_mismatch_error.rb +12 -0
  13. data/lib/my_john_deere_api/errors/unsupported_environment_error.rb +18 -0
  14. data/lib/my_john_deere_api/helpers.rb +6 -0
  15. data/lib/my_john_deere_api/helpers/case_conversion.rb +37 -0
  16. data/lib/my_john_deere_api/helpers/environment_helper.rb +25 -0
  17. data/lib/my_john_deere_api/helpers/uri_helpers.rb +19 -0
  18. data/lib/my_john_deere_api/helpers/validate_contribution_definition.rb +18 -0
  19. data/lib/my_john_deere_api/model.rb +10 -0
  20. data/lib/my_john_deere_api/model/asset.rb +69 -0
  21. data/lib/my_john_deere_api/model/asset_location.rb +19 -0
  22. data/lib/my_john_deere_api/model/base.rb +97 -0
  23. data/lib/my_john_deere_api/model/contribution_definition.rb +15 -0
  24. data/lib/my_john_deere_api/model/contribution_product.rb +33 -0
  25. data/lib/my_john_deere_api/model/field.rb +40 -0
  26. data/lib/my_john_deere_api/model/flag.rb +36 -0
  27. data/lib/my_john_deere_api/model/organization.rb +43 -0
  28. data/lib/my_john_deere_api/net_http_retry.rb +2 -0
  29. data/lib/my_john_deere_api/net_http_retry/decorator.rb +53 -0
  30. data/lib/my_john_deere_api/net_http_retry/max_retries_exceeded_error.rb +20 -0
  31. data/lib/my_john_deere_api/request.rb +6 -0
  32. data/lib/my_john_deere_api/request/collection.rb +10 -0
  33. data/lib/my_john_deere_api/request/collection/asset_locations.rb +27 -0
  34. data/lib/my_john_deere_api/request/collection/assets.rb +34 -0
  35. data/lib/my_john_deere_api/request/collection/base.rb +91 -0
  36. data/lib/my_john_deere_api/request/collection/contribution_definitions.rb +26 -0
  37. data/lib/my_john_deere_api/request/collection/contribution_products.rb +26 -0
  38. data/lib/my_john_deere_api/request/collection/fields.rb +26 -0
  39. data/lib/my_john_deere_api/request/collection/flags.rb +33 -0
  40. data/lib/my_john_deere_api/request/collection/organizations.rb +26 -0
  41. data/lib/my_john_deere_api/request/create.rb +5 -0
  42. data/lib/my_john_deere_api/request/create/asset.rb +57 -0
  43. data/lib/my_john_deere_api/request/create/asset_location.rb +110 -0
  44. data/lib/my_john_deere_api/request/create/base.rb +67 -0
  45. data/lib/my_john_deere_api/request/individual.rb +8 -0
  46. data/lib/my_john_deere_api/request/individual/asset.rb +19 -0
  47. data/lib/my_john_deere_api/request/individual/base.rb +52 -0
  48. data/lib/my_john_deere_api/request/individual/contribution_definition.rb +19 -0
  49. data/lib/my_john_deere_api/request/individual/contribution_product.rb +19 -0
  50. data/lib/my_john_deere_api/request/individual/field.rb +19 -0
  51. data/lib/my_john_deere_api/request/individual/organization.rb +19 -0
  52. data/lib/my_john_deere_api/request/update.rb +4 -0
  53. data/lib/my_john_deere_api/request/update/asset.rb +40 -0
  54. data/lib/my_john_deere_api/request/update/base.rb +67 -0
  55. data/lib/my_john_deere_api/validators.rb +5 -0
  56. data/lib/my_john_deere_api/validators/asset.rb +35 -0
  57. data/lib/my_john_deere_api/validators/asset_location.rb +34 -0
  58. data/lib/my_john_deere_api/validators/base.rb +67 -0
  59. data/lib/my_john_deere_api/version.rb +3 -0
  60. data/test/lib/my_john_deere_api/authorize_test.rb +81 -0
  61. data/test/lib/my_john_deere_api/client_test.rb +225 -0
  62. data/test/lib/my_john_deere_api/consumer_test.rb +58 -0
  63. data/test/lib/my_john_deere_api/errors/invalid_record_error_test.rb +26 -0
  64. data/test/lib/my_john_deere_api/errors/max_retries_exceeded_error_test.rb +13 -0
  65. data/test/lib/my_john_deere_api/errors/missing_contribution_definition_id_error_test.rb +14 -0
  66. data/test/lib/my_john_deere_api/errors/not_yet_implemented_error_test.rb +13 -0
  67. data/test/lib/my_john_deere_api/errors/type_mismatch_error_test.rb +13 -0
  68. data/test/lib/my_john_deere_api/errors/unsupported_environment_error_test.rb +18 -0
  69. data/test/lib/my_john_deere_api/errors_test.rb +25 -0
  70. data/test/lib/my_john_deere_api/helpers/case_conversion_test.rb +100 -0
  71. data/test/lib/my_john_deere_api/helpers/environment_helper_test.rb +67 -0
  72. data/test/lib/my_john_deere_api/helpers/uri_helpers_test.rb +58 -0
  73. data/test/lib/my_john_deere_api/helpers/validate_contribution_definition_test.rb +74 -0
  74. data/test/lib/my_john_deere_api/helpers_test.rb +21 -0
  75. data/test/lib/my_john_deere_api/model/asset_location_test.rb +38 -0
  76. data/test/lib/my_john_deere_api/model/asset_test.rb +133 -0
  77. data/test/lib/my_john_deere_api/model/base_test.rb +76 -0
  78. data/test/lib/my_john_deere_api/model/contribution_definition_test.rb +52 -0
  79. data/test/lib/my_john_deere_api/model/contribution_product_test.rb +82 -0
  80. data/test/lib/my_john_deere_api/model/field_test.rb +65 -0
  81. data/test/lib/my_john_deere_api/model/flag_test.rb +48 -0
  82. data/test/lib/my_john_deere_api/model/organization_test.rb +84 -0
  83. data/test/lib/my_john_deere_api/model_test.rb +37 -0
  84. data/test/lib/my_john_deere_api/net_http_retry/decorator_test.rb +163 -0
  85. data/test/lib/my_john_deere_api/request/collection/asset_locations_test.rb +102 -0
  86. data/test/lib/my_john_deere_api/request/collection/assets_test.rb +99 -0
  87. data/test/lib/my_john_deere_api/request/collection/base_test.rb +27 -0
  88. data/test/lib/my_john_deere_api/request/collection/contribution_definitions_test.rb +88 -0
  89. data/test/lib/my_john_deere_api/request/collection/contribution_products_test.rb +88 -0
  90. data/test/lib/my_john_deere_api/request/collection/fields_test.rb +86 -0
  91. data/test/lib/my_john_deere_api/request/collection/flags_test.rb +92 -0
  92. data/test/lib/my_john_deere_api/request/collection/organizations_test.rb +87 -0
  93. data/test/lib/my_john_deere_api/request/collection_test.rb +37 -0
  94. data/test/lib/my_john_deere_api/request/create/asset_location_test.rb +163 -0
  95. data/test/lib/my_john_deere_api/request/create/asset_test.rb +182 -0
  96. data/test/lib/my_john_deere_api/request/create/base_test.rb +29 -0
  97. data/test/lib/my_john_deere_api/request/create_test.rb +17 -0
  98. data/test/lib/my_john_deere_api/request/individual/asset_test.rb +33 -0
  99. data/test/lib/my_john_deere_api/request/individual/base_test.rb +18 -0
  100. data/test/lib/my_john_deere_api/request/individual/contribution_definition_test.rb +33 -0
  101. data/test/lib/my_john_deere_api/request/individual/contribution_product_test.rb +33 -0
  102. data/test/lib/my_john_deere_api/request/individual/field_test.rb +37 -0
  103. data/test/lib/my_john_deere_api/request/individual/organization_test.rb +33 -0
  104. data/test/lib/my_john_deere_api/request/individual_test.rb +29 -0
  105. data/test/lib/my_john_deere_api/request/update/asset_test.rb +99 -0
  106. data/test/lib/my_john_deere_api/request/update/base_test.rb +60 -0
  107. data/test/lib/my_john_deere_api/request/update_test.rb +13 -0
  108. data/test/lib/my_john_deere_api/request_test.rb +21 -0
  109. data/test/lib/my_john_deere_api/validators/asset_location_test.rb +61 -0
  110. data/test/lib/my_john_deere_api/validators/asset_test.rb +93 -0
  111. data/test/lib/my_john_deere_api/validators/base_test.rb +92 -0
  112. data/test/lib/my_john_deere_api/validators_test.rb +17 -0
  113. data/test/lib/my_john_deere_api/version_test.rb +9 -0
  114. data/test/my_john_deere_api_test.rb +37 -0
  115. data/test/support/helper.rb +97 -0
  116. data/test/support/vcr/accessor/delete_failed.yml +327 -0
  117. data/test/support/vcr/accessor/delete_max_failed.yml +615 -0
  118. data/test/support/vcr/accessor/delete_retry.yml +191 -0
  119. data/test/support/vcr/accessor/delete_retry_too_soon.yml +191 -0
  120. data/test/support/vcr/accessor/get_failed.yml +390 -0
  121. data/test/support/vcr/accessor/get_max_failed.yml +734 -0
  122. data/test/support/vcr/accessor/get_retry.yml +226 -0
  123. data/test/support/vcr/accessor/get_retry_too_soon.yml +226 -0
  124. data/test/support/vcr/accessor/post_failed.yml +417 -0
  125. data/test/support/vcr/accessor/post_max_failed.yml +785 -0
  126. data/test/support/vcr/accessor/post_retry.yml +241 -0
  127. data/test/support/vcr/accessor/post_retry_too_soon.yml +241 -0
  128. data/test/support/vcr/accessor/put_failed.yml +372 -0
  129. data/test/support/vcr/accessor/put_max_failed.yml +700 -0
  130. data/test/support/vcr/accessor/put_retry.yml +216 -0
  131. data/test/support/vcr/accessor/put_retry_too_soon.yml +216 -0
  132. data/test/support/vcr/catalog.yml +89 -0
  133. data/test/support/vcr/delete_asset.yml +82 -0
  134. data/test/support/vcr/get_access_token.yml +41 -0
  135. data/test/support/vcr/get_asset.yml +144 -0
  136. data/test/support/vcr/get_asset_locations.yml +196 -0
  137. data/test/support/vcr/get_assets.yml +152 -0
  138. data/test/support/vcr/get_contribution_definition.yml +90 -0
  139. data/test/support/vcr/get_contribution_definitions.yml +91 -0
  140. data/test/support/vcr/get_contribution_product.yml +91 -0
  141. data/test/support/vcr/get_contribution_products.yml +91 -0
  142. data/test/support/vcr/get_field.yml +144 -0
  143. data/test/support/vcr/get_fields.yml +146 -0
  144. data/test/support/vcr/get_flags.yml +47 -0
  145. data/test/support/vcr/get_organization.yml +90 -0
  146. data/test/support/vcr/get_organizations.yml +149 -0
  147. data/test/support/vcr/get_request_token.yml +83 -0
  148. data/test/support/vcr/post_asset_locations.yml +244 -0
  149. data/test/support/vcr/post_assets.yml +192 -0
  150. data/test/support/vcr/put_asset.yml +87 -0
  151. data/test/support/vcr/warning.txt +28 -0
  152. data/test/support/vcr_setup.rb +488 -0
  153. metadata +277 -0
@@ -0,0 +1,37 @@
1
+ require 'support/helper'
2
+
3
+ describe 'MyJohnDeereApi::Request::Collection' do
4
+ describe 'loading dependencies' do
5
+ it 'loads Request::Collection::Base' do
6
+ assert JD::Request::Collection::Base
7
+ end
8
+
9
+ it 'loads Request::Collection::Assets' do
10
+ assert JD::Request::Collection::Assets
11
+ end
12
+
13
+ it 'loads Request::Collection::AssetLocations' do
14
+ assert JD::Request::Collection::AssetLocations
15
+ end
16
+
17
+ it 'loads Request::Collection::ContributionProducts' do
18
+ assert JD::Request::Collection::ContributionProducts
19
+ end
20
+
21
+ it 'loads Request::Collection::ContributionDefinitions' do
22
+ assert JD::Request::Collection::ContributionDefinitions
23
+ end
24
+
25
+ it 'loads Request::Collection::Organizations' do
26
+ assert JD::Request::Collection::Organizations
27
+ end
28
+
29
+ it 'loads Request::Collection::Fields' do
30
+ assert JD::Request::Collection::Fields
31
+ end
32
+
33
+ it 'loads Request::Collection::Flags' do
34
+ assert JD::Request::Collection::Flags
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,163 @@
1
+ require 'support/helper'
2
+ require 'date'
3
+
4
+ describe 'MyJohnDeereApi::Request::Create::AssetLocation' do
5
+ def attributes_without(*keys)
6
+ keys = keys.to_a
7
+ attributes.reject{|k,v| keys.include?(k)}
8
+ end
9
+
10
+ let(:valid_attributes) do
11
+ CONFIG.asset_location_attributes.merge(
12
+ asset_id: asset_id
13
+ )
14
+ end
15
+
16
+ let(:attributes) { valid_attributes }
17
+
18
+ let(:klass) { JD::Request::Create::AssetLocation }
19
+ let(:object) { klass.new(client, attributes) }
20
+
21
+ inherits_from MyJohnDeereApi::Request::Create::Base
22
+
23
+ describe '#initialize(client, attributes)' do
24
+ it 'accepts a client and attributes' do
25
+ assert_equal client, object.client
26
+ assert_equal accessor, object.accessor
27
+ assert_equal attributes, object.attributes
28
+ end
29
+
30
+ it 'accepts simple coordinates and generates the geometry' do
31
+ attributes = {
32
+ asset_id: asset_id,
33
+ timestamp: valid_attributes[:timestamp],
34
+ coordinates: CONFIG.coordinates,
35
+ measurement_data: valid_attributes[:measurement_data]
36
+ }
37
+
38
+ object = klass.new(client, attributes)
39
+ assert_equal valid_attributes[:geometry].to_json, object.attributes[:geometry]
40
+ end
41
+
42
+ it 'defaults timestamp to current time' do
43
+ attributes = valid_attributes.slice(:asset_id, :geometry, :measurement_data)
44
+ object = klass.new(client, attributes)
45
+
46
+ expected_stamp = Time.now.utc.to_i
47
+ actual_stamp = DateTime.parse(object.attributes[:timestamp]).to_time.to_i
48
+
49
+ assert_in_delta expected_stamp, actual_stamp, 1
50
+ end
51
+ end
52
+
53
+ describe '#valid?' do
54
+ it 'returns true when all required attributes are present' do
55
+ assert object.valid?
56
+ assert_empty object.errors
57
+ end
58
+
59
+ it 'requires asset_id' do
60
+ object = klass.new(client, attributes_without(:asset_id))
61
+
62
+ refute object.valid?
63
+ assert_equal 'is required', object.errors[:asset_id]
64
+ end
65
+
66
+ it 'requires geometry' do
67
+ object = klass.new(client, attributes_without(:geometry))
68
+
69
+ refute object.valid?
70
+ assert_equal 'is required', object.errors[:geometry]
71
+ end
72
+
73
+ it 'requires measurement_data' do
74
+ object = klass.new(client, attributes_without(:measurement_data))
75
+
76
+ refute object.valid?
77
+ assert_equal 'is required', object.errors[:measurement_data]
78
+ end
79
+
80
+ describe 'validating measurement_data' do
81
+ it 'must be an array' do
82
+ object = klass.new(client, attributes.merge(measurement_data: 'something'))
83
+
84
+ refute object.valid?
85
+ assert_equal 'must be an array', object.errors[:measurement_data]
86
+ end
87
+
88
+ it 'must include a name' do
89
+ without_attr = [attributes[:measurement_data].first.reject{|k,v| k == :name}]
90
+ object = klass.new(client, attributes.merge(measurement_data: without_attr))
91
+
92
+ refute object.valid?
93
+ assert_equal 'must include name', object.errors[:measurement_data]
94
+ end
95
+
96
+ it 'must include a value' do
97
+ without_attr = [attributes[:measurement_data].first.reject{|k,v| k == :value}]
98
+ object = klass.new(client, attributes.merge(measurement_data: without_attr))
99
+
100
+ refute object.valid?
101
+ assert_equal 'must include value', object.errors[:measurement_data]
102
+ end
103
+
104
+ it 'must include a unit' do
105
+ without_attr = [attributes[:measurement_data].first.reject{|k,v| k == :unit}]
106
+ object = klass.new(client, attributes.merge(measurement_data: without_attr))
107
+
108
+ refute object.valid?
109
+ assert_equal 'must include unit', object.errors[:measurement_data]
110
+ end
111
+ end
112
+ end
113
+
114
+ describe '#validate!' do
115
+ it 'raises an error when invalid' do
116
+ object = klass.new(client, attributes_without(:asset_id))
117
+
118
+ exception = assert_raises(JD::InvalidRecordError) { object.validate! }
119
+ assert_includes exception.message, 'Record is invalid'
120
+ assert_includes exception.message, 'asset_id is required'
121
+ end
122
+ end
123
+
124
+ describe '#request_body' do
125
+ it 'properly forms the request body' do
126
+ body = object.send(:request_body)
127
+
128
+ expected_stamp = DateTime.parse(attributes[:timestamp]).strftime('%Y-%m-%dT%H:%M:%S.000Z')
129
+
130
+ assert_kind_of Array, body
131
+ assert_equal expected_stamp, body.first[:timestamp]
132
+ assert_equal attributes[:geometry], body.first[:geometry]
133
+ assert_equal attributes[:measurement_data], body.first[:measurementData]
134
+ end
135
+ end
136
+
137
+ describe '#request' do
138
+ it 'makes the request' do
139
+ VCR.use_cassette('post_asset_locations') { object.request }
140
+
141
+ assert_kind_of Net::HTTPCreated, object.response
142
+ end
143
+ end
144
+
145
+ describe '#object' do
146
+ it 'returns the asset location model instance' do
147
+ result = VCR.use_cassette('post_asset_locations') { object.object }
148
+
149
+ assert_kind_of JD::Model::AssetLocation, result
150
+
151
+ # API returns seconds with decimals, even though they're always zero
152
+ integer_stamp = DateTime.parse(result.timestamp).strftime('%Y-%m-%dT%H:%M:%SZ')
153
+ expected_stamp = DateTime.parse(attributes[:timestamp]).strftime('%Y-%m-%dT%H:%M:%SZ')
154
+
155
+ # API returns string keys and an extra '@type' key
156
+ result_measurement_data = result.measurement_data.first.transform_keys{|k| k.to_sym}.slice(:name, :value, :unit)
157
+
158
+ assert_equal expected_stamp, integer_stamp
159
+ assert_equal attributes[:geometry], result.geometry.to_json
160
+ assert_equal attributes[:measurement_data].first, result_measurement_data
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,182 @@
1
+ require 'support/helper'
2
+
3
+ describe 'MyJohnDeereApi::Request::Create::Asset' do
4
+ def attributes_without(*keys)
5
+ keys = keys.to_a
6
+ attributes.reject{|k,v| keys.include?(k)}
7
+ end
8
+
9
+ let(:valid_attributes) do
10
+ CONFIG.asset_attributes.merge(
11
+ organization_id: organization_id,
12
+ )
13
+ end
14
+
15
+ let(:klass) { JD::Request::Create::Asset }
16
+ let(:object) { klass.new(client, attributes) }
17
+
18
+ let(:attributes) { valid_attributes }
19
+
20
+ inherits_from MyJohnDeereApi::Request::Create::Base
21
+
22
+ describe '#initialize(client, attributes)' do
23
+ it 'accepts a client and attributes' do
24
+ assert_equal client, object.client
25
+ assert_equal accessor, object.accessor
26
+ assert_equal attributes, object.attributes
27
+ end
28
+ end
29
+
30
+ describe '#valid?' do
31
+ it 'returns true when all required attributes are present' do
32
+ assert object.valid?
33
+ assert_empty object.errors
34
+ end
35
+
36
+ it 'requires organization_id' do
37
+ object = klass.new(client, attributes_without(:organization_id))
38
+
39
+ refute object.valid?
40
+ assert_equal 'is required', object.errors[:organization_id]
41
+ end
42
+
43
+ it 'requires title' do
44
+ object = klass.new(client, attributes_without(:title))
45
+
46
+ refute object.valid?
47
+ assert_equal 'is required', object.errors[:title]
48
+ end
49
+
50
+ it 'requires a valid category' do
51
+ object = klass.new(client, attributes.merge(asset_category: 'TURTLES'))
52
+
53
+ refute object.valid?
54
+ assert_equal 'requires valid combination of category/type/subtype', object.errors[:asset_category]
55
+ end
56
+
57
+ it 'requires a valid type' do
58
+ object = klass.new(client, attributes.merge(asset_type: 'TURTLES'))
59
+
60
+ refute object.valid?
61
+ assert_equal 'requires valid combination of category/type/subtype', object.errors[:asset_category]
62
+ end
63
+
64
+ it 'requires a valid subtype' do
65
+ object = klass.new(client, attributes.merge(asset_sub_type: 'TURTLES'))
66
+
67
+ refute object.valid?
68
+ assert_equal 'requires valid combination of category/type/subtype', object.errors[:asset_category]
69
+ end
70
+ end
71
+
72
+ describe '#validate!' do
73
+ it 'raises an error when invalid' do
74
+ object = klass.new(client, attributes_without(:organization_id))
75
+
76
+ exception = assert_raises(JD::InvalidRecordError) { object.validate! }
77
+ assert_includes exception.message, 'Record is invalid'
78
+ assert_includes exception.message, 'organization_id is required'
79
+ end
80
+ end
81
+
82
+ describe '#valid_categories?(category, type, subtype)' do
83
+ it 'only allows pre-defined combinations' do
84
+ object = klass.new(client, {})
85
+
86
+ valid_combos = [
87
+ ['DEVICE', 'SENSOR', 'ENVIRONMENTAL'],
88
+ ['DEVICE', 'SENSOR', 'GRAIN_BIN'],
89
+ ['DEVICE', 'SENSOR', 'IRRIGATION_PIVOT'],
90
+ ['DEVICE', 'SENSOR', 'OTHER'],
91
+ ['EQUIPMENT', 'MACHINE', 'PICKUP_TRUCK'],
92
+ ['EQUIPMENT', 'MACHINE', 'UTILITY_VEHICLE'],
93
+ ['EQUIPMENT', 'OTHER', 'ANHYDROUS_AMMONIA_TANK'],
94
+ ['EQUIPMENT', 'OTHER', 'NURSE_TRUCK'],
95
+ ['EQUIPMENT', 'OTHER', 'NURSE_WAGON'],
96
+ ['EQUIPMENT', 'OTHER', 'TECHNICIAN_TRUCK']
97
+ ]
98
+
99
+ # cycle through all possible permutations, only proving valid if
100
+ # listed above
101
+
102
+ ['DEVICE', 'EQUIPMENT', 'RANDOM_INVALID'].each do |category|
103
+ ['MACHINE', 'OTHER', 'SENSOR', 'RANDOM_INVALID'].each do |type|
104
+ [
105
+ 'ANHYDROUS_AMMONIA_TANK', 'ENVIRONMENTAL', 'GRAIN_BIN',
106
+ 'IRRIGATION_PIVOT', 'NURSE_TRUCK', 'NURSE_WAGON',
107
+ 'OTHER', 'PICKUP_TRUCK', 'TECHNICIAN_TRUCK',
108
+ 'UTILITY_VEHICLE', 'RANDOM_INVALID'
109
+ ].each do |subtype|
110
+ if valid_combos.include?([category, type, subtype])
111
+ assert object.send(:valid_categories?, category, type, subtype)
112
+ else
113
+ refute object.send(:valid_categories?, category, type, subtype)
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ describe '#resource' do
122
+ it 'is built from the organization id' do
123
+ object = klass.new(client, attributes)
124
+ assert_equal "/organizations/#{organization_id}/assets", object.send(:resource)
125
+ end
126
+ end
127
+
128
+ describe '#request_body' do
129
+ it 'properly forms the request body' do
130
+ object = klass.new(client, attributes)
131
+ body = object.send(:request_body)
132
+
133
+ assert_equal attributes[:title], body[:title]
134
+ assert_equal attributes[:asset_category], body[:assetCategory]
135
+ assert_equal attributes[:asset_type], body[:assetType]
136
+ assert_equal attributes[:asset_sub_type], body[:assetSubType]
137
+
138
+ assert_kind_of Array, body[:links]
139
+ assert_equal 1, body[:links].size
140
+
141
+ assert_kind_of Hash, body[:links].first
142
+ assert_equal 'Link', body[:links].first['@type']
143
+ assert_equal 'contributionDefinition', body[:links].first['rel']
144
+ assert_equal "#{base_url}/contributionDefinitions/#{contribution_definition_id}",
145
+ body[:links].first['uri']
146
+ end
147
+
148
+ it 'raises an exception when contribution_definition_id is not set' do
149
+ client.contribution_definition_id = nil
150
+ object = klass.new(client, attributes)
151
+
152
+ assert_raises(JD::MissingContributionDefinitionIdError) do
153
+ object.send(:request_body)
154
+ end
155
+ end
156
+ end
157
+
158
+ describe '#request' do
159
+ it 'makes the request' do
160
+ VCR.use_cassette('post_assets') { object.request }
161
+
162
+ assert_kind_of Net::HTTPCreated, object.response
163
+ end
164
+ end
165
+
166
+ describe '#object' do
167
+ it 'returns the asset model instance' do
168
+ object = klass.new(client, attributes)
169
+ result = VCR.use_cassette('post_assets') { object.object }
170
+
171
+ assert_kind_of JD::Model::Asset, result
172
+
173
+ expected_id = object.response['location'].split('/').last
174
+
175
+ assert_equal expected_id, result.id
176
+ assert_equal attributes[:title], result.title
177
+ assert_equal attributes[:asset_category], result.asset_category
178
+ assert_equal attributes[:asset_type], result.asset_type
179
+ assert_equal attributes[:asset_sub_type], result.asset_sub_type
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,29 @@
1
+ require 'support/helper'
2
+
3
+ describe 'MyJohnDeereApi::Request::Create::Base' do
4
+ let(:klass) { JD::Request::Create::Base }
5
+ let(:attributes) { {} }
6
+
7
+ describe '#initialize(client, attributes)' do
8
+ it 'accepts a client and attributes' do
9
+ object = klass.new(client, attributes)
10
+
11
+ assert_equal client, object.client
12
+ assert_equal accessor, object.accessor
13
+ assert_equal attributes, object.attributes
14
+ end
15
+ end
16
+
17
+ describe '#headers' do
18
+ it 'sets the accept and content-type headers' do
19
+ object = klass.new(client, attributes)
20
+ headers = object.send(:headers)
21
+
22
+ expected = 'application/vnd.deere.axiom.v3+json'
23
+
24
+ assert_kind_of Hash, headers
25
+ assert_equal expected, headers['Accept']
26
+ assert_equal expected, headers['Content-Type']
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ require 'support/helper'
2
+
3
+ describe 'MyJohnDeereApi::Request::Create' do
4
+ describe 'loading dependencies' do
5
+ it 'loads Request::Create::Base' do
6
+ assert JD::Request::Create::Base
7
+ end
8
+
9
+ it 'loads Request::Create::Asset' do
10
+ assert JD::Request::Create::Asset
11
+ end
12
+
13
+ it 'loads Request::Create::AssetLocation' do
14
+ assert JD::Request::Create::AssetLocation
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,33 @@
1
+ require 'support/helper'
2
+ require 'yaml'
3
+ require 'json'
4
+
5
+ describe 'MyJohnDeereApi::Request::Individual::Asset' do
6
+ let(:object) { JD::Request::Individual::Asset.new(client, asset_id) }
7
+
8
+ inherits_from JD::Request::Individual::Base
9
+
10
+ describe '#initialize(client, asset_id)' do
11
+ it 'accepts a client' do
12
+ assert_equal client, object.client
13
+ assert_equal accessor, object.accessor
14
+ end
15
+
16
+ it 'accepts asset_id as id' do
17
+ assert_equal asset_id, object.id
18
+ end
19
+ end
20
+
21
+ describe '#resource' do
22
+ it 'returns /assets/<asset_id>' do
23
+ assert_equal "/assets/#{asset_id}", object.resource
24
+ end
25
+ end
26
+
27
+ describe '#object' do
28
+ it 'returns all records' do
29
+ asset = VCR.use_cassette('get_asset') { object.object }
30
+ assert_kind_of JD::Model::Asset, asset
31
+ end
32
+ end
33
+ end