my_john_deere_api 1.3.2 → 1.3.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0027e1c7579f585d2e150514bb29a877b1d225e18849f630f144219a152a119
4
- data.tar.gz: 434abf7be18591164d3e485ad1a415aed151ed2cd5a946f1d9d9e2de7d02795f
3
+ metadata.gz: 4919eaf224090046a44f2ec4712dfddaebcbb7b5279dc9499cb09ab5b13f1445
4
+ data.tar.gz: 5b9d66230b2a3fc29f7111ddad1fc82ea3796935d1d87465238e4f8a70c66f18
5
5
  SHA512:
6
- metadata.gz: bc59c684cb03603aed6af5cc52b751b83fa0953494bbe4ccd4bcc84e9e9180aae5a7f11e0e7a2bcd8b5c3f4c572a7675183b7e669559b696bb6d73e5f2031dd3
7
- data.tar.gz: 44f0a503630cc44b020c10f9610a95892ccc3b2d5a5d70c250f1b0f6ea78ec8826fb308fd5e251ca653f2c0ec2202b4b92f290714be20121c0f9a67cb91f0f69
6
+ metadata.gz: 6d908341e42d6a225810c7463157dc453490c7dc5a5c93fea52c5445a91e3ec73d2860c3565918a0a70d9858fe61f7170dd5acdc1b9bb6b5cc0eb57f7d4597cc
7
+ data.tar.gz: 6f23310c0403f482d092026780c2280778f7e55ccf309dec23e993522a4d9c80aaf62a94cf045272e16b8563571cd8b00b2e092b775c304a5eed52ae4d27b4c3
@@ -10,6 +10,7 @@ module MyJohnDeereApi
10
10
  autoload :Request, 'my_john_deere_api/request'
11
11
  autoload :Model, 'my_john_deere_api/model'
12
12
  autoload :Helpers, 'my_john_deere_api/helpers'
13
+ autoload :Validators, 'my_john_deere_api/validators'
13
14
 
14
15
  require 'my_john_deere_api/errors'
15
16
  end
@@ -2,4 +2,5 @@ module MyJohnDeereApi::Request
2
2
  autoload :Collection, 'my_john_deere_api/request/collection'
3
3
  autoload :Create, 'my_john_deere_api/request/create'
4
4
  autoload :Individual, 'my_john_deere_api/request/individual'
5
+ autoload :Update, 'my_john_deere_api/request/update'
5
6
  end
@@ -2,26 +2,10 @@ require 'json'
2
2
 
3
3
  module MyJohnDeereApi
4
4
  class Request::Create::Asset < Request::Create::Base
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
- }
5
+ include Validators::Asset
15
6
 
16
7
  private
17
8
 
18
- ##
19
- # attributes that must be specified
20
-
21
- def required_attributes
22
- [:organization_id, :contribution_definition_id, :title]
23
- end
24
-
25
9
  ##
26
10
  # Retrieve newly created record
27
11
 
@@ -39,15 +23,6 @@ module MyJohnDeereApi
39
23
  Model::Asset
40
24
  end
41
25
 
42
- ##
43
- # Handle any custom validation for this model that may not apply to others
44
-
45
- def validate_attributes
46
- unless valid_categories?(attributes[:asset_category], attributes[:asset_type], attributes[:asset_sub_type])
47
- errors[:asset_category] = 'requires valid combination of category/type/subtype'
48
- end
49
- end
50
-
51
26
  ##
52
27
  # Path supplied to API
53
28
 
@@ -75,12 +50,5 @@ module MyJohnDeereApi
75
50
  ]
76
51
  }
77
52
  end
78
-
79
- ##
80
- # Returns boolean, true if this combination is valid
81
-
82
- def valid_categories?(category, type, subtype)
83
- VALID_CATEGORIES.dig(category, type).to_a.include?(subtype)
84
- end
85
53
  end
86
54
  end
@@ -6,16 +6,6 @@ module MyJohnDeereApi
6
6
 
7
7
  ##
8
8
  # Accepts a valid oAuth AccessToken, and a hash of attributes.
9
- #
10
- # Required attributes:
11
- # - organization_id
12
- # - contribution_definition_id
13
- # - title
14
- # - asset_category
15
- # - asset_type
16
- # - asset_sub_type
17
- #
18
- # category/type/subtype must be a recognized combination as defined above.
19
9
 
20
10
  def initialize(accessor, attributes)
21
11
  @accessor = accessor
@@ -0,0 +1,4 @@
1
+ module MyJohnDeereApi::Request::Update
2
+ autoload :Base, 'my_john_deere_api/request/update/base'
3
+ autoload :Asset, 'my_john_deere_api/request/update/asset'
4
+ end
@@ -0,0 +1,89 @@
1
+ require 'json'
2
+
3
+ module MyJohnDeereApi::Request
4
+ module Update::Asset
5
+ # ##
6
+ # # Make the request, if the instance is valid
7
+ #
8
+ # # def request
9
+ # # validate!
10
+ # #
11
+ # # @response = accessor.post(resource, request_body.to_json, headers)
12
+ # # end
13
+ #
14
+ # ##
15
+ # # Object created by request
16
+ #
17
+ # # def object
18
+ # # return @object if defined?(@object)
19
+ # #
20
+ # # request unless response
21
+ # #
22
+ # # @object = model.new(fetch_record, accessor)
23
+ # # end
24
+ #
25
+ # ##
26
+ # # Runs validations, adding to the errors hash as needed. Returns true
27
+ # # if the errors hash is still empty after all validations have been run.
28
+ #
29
+ # # def valid?
30
+ # # return @is_valid if defined?(@is_valid)
31
+ # #
32
+ # # validate_required
33
+ # # validate_attributes
34
+ # #
35
+ # # @is_valid = errors.empty?
36
+ # # end
37
+ #
38
+ # ##
39
+ # # Raises an error if the record is invalid. Passes the errors hash
40
+ # # to the error, in order to build a useful message string.
41
+ #
42
+ # # def validate!
43
+ # # raise(InvalidRecordError, errors) unless valid?
44
+ # # end
45
+ #
46
+ # private
47
+ #
48
+ # ##
49
+ # # Run validations unique to a given model. This should be overridden
50
+ # # by children where needed.
51
+ #
52
+ # # def validate_attributes
53
+ # # end
54
+ #
55
+ # ##
56
+ # # Convert inputs into working attributes. This allows us to auto-create
57
+ # # some attributes from others, or set defaults, on a class-by-class basis.
58
+ # # See Request::Create::AssetLocation for an example.
59
+ #
60
+ # def process_attributes
61
+ # end
62
+ #
63
+ # ##
64
+ # # Attributes that must be specified, override in child class
65
+ #
66
+ # def required_attributes
67
+ # []
68
+ # end
69
+ #
70
+ # ##
71
+ # # Validates required attributes
72
+ #
73
+ # def validate_required
74
+ # required_attributes.each do |attr|
75
+ # errors[attr] = 'is required' unless attributes[attr]
76
+ # end
77
+ # end
78
+ #
79
+ # ##
80
+ # # Headers for PUT request
81
+ #
82
+ # def headers
83
+ # @headers ||= {
84
+ # 'Accept' => 'application/vnd.deere.axiom.v3+json',
85
+ # 'Content-Type' => 'application/vnd.deere.axiom.v3+json'
86
+ # }
87
+ # end
88
+ end
89
+ end
@@ -0,0 +1,107 @@
1
+ require 'json'
2
+
3
+ module MyJohnDeereApi::Request
4
+ class Update::Base
5
+ attr_reader :accessor, :item, :attributes, :errors, :response
6
+
7
+ ##
8
+ # Accepts a valid oAuth AccessToken, the item to be updated,
9
+ # and a hash of attributes.
10
+ #
11
+ # category/type/subtype must be a recognized combination as defined above.
12
+
13
+ def initialize(accessor, item, attributes)
14
+ @accessor = accessor
15
+ @item = item
16
+ @attributes = attributes
17
+
18
+ process_attributes
19
+
20
+ @errors = {}
21
+ end
22
+
23
+ ##
24
+ # Make the request, if the instance is valid
25
+
26
+ # def request
27
+ # validate!
28
+ #
29
+ # @response = accessor.post(resource, request_body.to_json, headers)
30
+ # end
31
+
32
+ ##
33
+ # Object created by request
34
+
35
+ # def object
36
+ # return @object if defined?(@object)
37
+ #
38
+ # request unless response
39
+ #
40
+ # @object = model.new(fetch_record, accessor)
41
+ # end
42
+
43
+ ##
44
+ # Runs validations, adding to the errors hash as needed. Returns true
45
+ # if the errors hash is still empty after all validations have been run.
46
+
47
+ # def valid?
48
+ # return @is_valid if defined?(@is_valid)
49
+ #
50
+ # validate_required
51
+ # validate_attributes
52
+ #
53
+ # @is_valid = errors.empty?
54
+ # end
55
+
56
+ ##
57
+ # Raises an error if the record is invalid. Passes the errors hash
58
+ # to the error, in order to build a useful message string.
59
+
60
+ # def validate!
61
+ # raise(InvalidRecordError, errors) unless valid?
62
+ # end
63
+
64
+ private
65
+
66
+ ##
67
+ # Run validations unique to a given model. This should be overridden
68
+ # by children where needed.
69
+
70
+ # def validate_attributes
71
+ # end
72
+
73
+ ##
74
+ # Convert inputs into working attributes. This allows us to auto-create
75
+ # some attributes from others, or set defaults, on a class-by-class basis.
76
+ # See Request::Create::AssetLocation for an example.
77
+
78
+ def process_attributes
79
+ end
80
+
81
+ ##
82
+ # Attributes that must be specified, override in child class
83
+
84
+ def required_attributes
85
+ []
86
+ end
87
+
88
+ ##
89
+ # Validates required attributes
90
+
91
+ def validate_required
92
+ required_attributes.each do |attr|
93
+ errors[attr] = 'is required' unless attributes[attr]
94
+ end
95
+ end
96
+
97
+ ##
98
+ # Headers for PUT request
99
+
100
+ def headers
101
+ @headers ||= {
102
+ 'Accept' => 'application/vnd.deere.axiom.v3+json',
103
+ 'Content-Type' => 'application/vnd.deere.axiom.v3+json'
104
+ }
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,4 @@
1
+ module MyJohnDeereApi::Validators
2
+ autoload :Base, 'my_john_deere_api/validators/base'
3
+ autoload :Asset, 'my_john_deere_api/validators/asset'
4
+ end
@@ -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, :contribution_definition_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,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
@@ -1,3 +1,3 @@
1
1
  module MyJohnDeereApi
2
- VERSION='1.3.2'
2
+ VERSION='1.3.3'
3
3
  end
@@ -5,21 +5,21 @@ describe 'MyJohnDeereApi::Request::Create::Base' do
5
5
 
6
6
  describe '#initialize(access_token, attributes)' do
7
7
  it 'accepts an accessor and attributes' do
8
- object = JD::Request::Create::AssetLocation.new(accessor, attributes)
8
+ object = JD::Request::Create::Base.new(accessor, attributes)
9
9
 
10
10
  assert_equal accessor, object.accessor
11
11
  assert_equal attributes, object.attributes
12
12
  end
13
13
 
14
14
  it 'creates an empty error hash' do
15
- object = JD::Request::Create::AssetLocation.new(accessor, {})
15
+ object = JD::Request::Create::Base.new(accessor, {})
16
16
  assert_equal({}, object.errors)
17
17
  end
18
18
  end
19
19
 
20
20
  describe '#headers' do
21
21
  it 'sets the accept and content-type headers' do
22
- object = JD::Request::Create::Asset.new(accessor, attributes)
22
+ object = JD::Request::Create::Base.new(accessor, attributes)
23
23
  headers = object.send(:headers)
24
24
 
25
25
  expected = 'application/vnd.deere.axiom.v3+json'
@@ -0,0 +1,35 @@
1
+ require 'support/helper'
2
+
3
+ describe 'MyJohnDeereApi::Request::Update::Asset' do
4
+ # let(:object) { JD::Request::Update::Base.new(accessor, item, attributes) }
5
+ # let(:item) { 'item' }
6
+ # let(:attributes) { {} }
7
+ #
8
+ # describe '#initialize(access_token, item, attributes)' do
9
+ # it 'accepts an accessor, item and attributes' do
10
+ # object = JD::Request::Update::Base.new(accessor, item, attributes)
11
+ #
12
+ # assert_equal accessor, object.accessor
13
+ # assert_equal item, object.item
14
+ # assert_equal attributes, object.attributes
15
+ # end
16
+ #
17
+ # it 'creates an empty error hash' do
18
+ # object = JD::Request::Update::Base.new(accessor, item, {})
19
+ # assert_equal({}, object.errors)
20
+ # end
21
+ # end
22
+ #
23
+ # describe '#headers' do
24
+ # it 'sets the accept and content-type headers' do
25
+ # object = JD::Request::Update::Base.new(accessor, item, attributes)
26
+ # headers = object.send(:headers)
27
+ #
28
+ # expected = 'application/vnd.deere.axiom.v3+json'
29
+ #
30
+ # assert_kind_of Hash, headers
31
+ # assert_equal expected, headers['Accept']
32
+ # assert_equal expected, headers['Content-Type']
33
+ # end
34
+ # end
35
+ end
@@ -0,0 +1,37 @@
1
+ require 'support/helper'
2
+ require 'yaml'
3
+ require 'json'
4
+
5
+ describe 'MyJohnDeereApi::Request::Update::Base' do
6
+ let(:object) { JD::Request::Update::Base.new(accessor, item, attributes) }
7
+ let(:item) { 'item' }
8
+ let(:attributes) { {} }
9
+
10
+ describe '#initialize(access_token, item, attributes)' do
11
+ it 'accepts an accessor, item and attributes' do
12
+ object = JD::Request::Update::Base.new(accessor, item, attributes)
13
+
14
+ assert_equal accessor, object.accessor
15
+ assert_equal item, object.item
16
+ assert_equal attributes, object.attributes
17
+ end
18
+
19
+ it 'creates an empty error hash' do
20
+ object = JD::Request::Update::Base.new(accessor, item, {})
21
+ assert_equal({}, object.errors)
22
+ end
23
+ end
24
+
25
+ describe '#headers' do
26
+ it 'sets the accept and content-type headers' do
27
+ object = JD::Request::Update::Base.new(accessor, item, attributes)
28
+ headers = object.send(:headers)
29
+
30
+ expected = 'application/vnd.deere.axiom.v3+json'
31
+
32
+ assert_kind_of Hash, headers
33
+ assert_equal expected, headers['Accept']
34
+ assert_equal expected, headers['Content-Type']
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,13 @@
1
+ require 'support/helper'
2
+
3
+ describe 'MyJohnDeereApi::Request::Update' do
4
+ describe 'loading dependencies' do
5
+ it 'loads Request::Update::Base' do
6
+ assert JD::Request::Update::Base
7
+ end
8
+
9
+ it 'loads Request::Update::Asset' do
10
+ assert JD::Request::Update::Asset
11
+ end
12
+ end
13
+ end
@@ -13,5 +13,9 @@ describe 'MyJohnDeereApi::Request' do
13
13
  it 'loads Request::Individuaal' do
14
14
  assert JD::Request::Individual
15
15
  end
16
+
17
+ it 'loads Request::Update' do
18
+ assert JD::Request::Update
19
+ end
16
20
  end
17
21
  end
@@ -0,0 +1,99 @@
1
+ require 'support/helper'
2
+
3
+ module AssetValidatorTest
4
+ class Base
5
+ include JD::Validators::Asset
6
+
7
+ attr_reader :attributes
8
+
9
+ def initialize(attributes)
10
+ @attributes = attributes
11
+ end
12
+ end
13
+
14
+ class Vanilla < Base
15
+ end
16
+ end
17
+
18
+ describe 'MyJohnDeereApi::Validators::Asset' do
19
+ let(:klass) { AssetValidatorTest::Base }
20
+ let(:object) { klass.new(attributes) }
21
+ let(:attributes) { valid_attributes }
22
+
23
+ let(:valid_attributes) do
24
+ {
25
+ organization_id: '000000',
26
+ contribution_definition_id: '00000000-0000-0000-0000-000000000000',
27
+ title: "Bob's Stuff"
28
+ }
29
+ end
30
+
31
+ it 'exists' do
32
+ assert JD::Validators::Asset
33
+ end
34
+
35
+ it 'inherits from MyJohnDeereApi::Validators::Base' do
36
+ [:validate!, :valid?].each{ |method_name| assert object.respond_to?(method_name) }
37
+ end
38
+
39
+ it 'requires several attributes' do
40
+ [:organization_id, :contribution_definition_id, :title].each do |attr|
41
+ object = klass.new(valid_attributes.merge(attr => nil))
42
+
43
+ refute object.valid?
44
+ exception = assert_raises(JD::InvalidRecordError) { object.validate! }
45
+
46
+ assert_includes exception.message, "#{attr} is required"
47
+ assert_includes object.errors[attr], 'is required'
48
+ end
49
+ end
50
+
51
+ it 'requires a valid combination of category/type/subtype' do
52
+ valid_combos = [
53
+ ['DEVICE', 'SENSOR', 'ENVIRONMENTAL'],
54
+ ['DEVICE', 'SENSOR', 'GRAIN_BIN'],
55
+ ['DEVICE', 'SENSOR', 'IRRIGATION_PIVOT'],
56
+ ['DEVICE', 'SENSOR', 'OTHER'],
57
+ ['EQUIPMENT', 'MACHINE', 'PICKUP_TRUCK'],
58
+ ['EQUIPMENT', 'MACHINE', 'UTILITY_VEHICLE'],
59
+ ['EQUIPMENT', 'OTHER', 'ANHYDROUS_AMMONIA_TANK'],
60
+ ['EQUIPMENT', 'OTHER', 'NURSE_TRUCK'],
61
+ ['EQUIPMENT', 'OTHER', 'NURSE_WAGON'],
62
+ ['EQUIPMENT', 'OTHER', 'TECHNICIAN_TRUCK']
63
+ ]
64
+
65
+ error_message = 'requires valid combination of category/type/subtype'
66
+
67
+ # cycle through all possible permutations, only proving valid if
68
+ # listed above
69
+
70
+ ['DEVICE', 'EQUIPMENT', 'RANDOM_INVALID'].each do |category|
71
+ ['MACHINE', 'OTHER', 'SENSOR', 'RANDOM_INVALID'].each do |type|
72
+ [
73
+ 'ANHYDROUS_AMMONIA_TANK', 'ENVIRONMENTAL', 'GRAIN_BIN',
74
+ 'IRRIGATION_PIVOT', 'NURSE_TRUCK', 'NURSE_WAGON',
75
+ 'OTHER', 'PICKUP_TRUCK', 'TECHNICIAN_TRUCK',
76
+ 'UTILITY_VEHICLE', 'RANDOM_INVALID'
77
+ ].each do |subtype|
78
+ categories = {
79
+ asset_category: category,
80
+ asset_type: type,
81
+ asset_sub_type: subtype
82
+ }
83
+
84
+ object = klass.new(valid_attributes.merge(categories))
85
+
86
+ if valid_combos.include?([category, type, subtype])
87
+ assert object.valid?
88
+ else
89
+ refute object.valid?
90
+ exception = assert_raises(JD::InvalidRecordError) { object.validate! }
91
+
92
+ assert_includes exception.message, "asset_category #{error_message}"
93
+ assert_includes object.errors[:asset_category], error_message
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,92 @@
1
+ require 'support/helper'
2
+
3
+ module BaseValidatorTest
4
+ class Base
5
+ include JD::Validators::Base
6
+
7
+ attr_reader :attributes
8
+
9
+ def initialize(attributes)
10
+ @attributes = attributes
11
+ end
12
+ end
13
+
14
+ class Vanilla < Base
15
+ end
16
+
17
+ class WithRequiredAttributes < Base
18
+ def required_attributes
19
+ [:name]
20
+ end
21
+ end
22
+
23
+ class WithCustomValidations < Base
24
+ def validate_attributes
25
+ errors[:name] = 'is not Bob' unless attributes[:name] == 'Bob'
26
+ end
27
+ end
28
+ end
29
+
30
+ describe 'MyJohnDeereApi::Validators::Base' do
31
+ let(:klass) { BaseValidatorTest::Vanilla }
32
+ let(:object) { klass.new(attributes) }
33
+ let(:valid_attributes) { {name: 'Bob'} }
34
+ let(:attributes) { valid_attributes }
35
+
36
+ it 'exists' do
37
+ assert klass
38
+ end
39
+
40
+ describe '#validate!' do
41
+ it 'returns true when valid' do
42
+ assert object.validate!
43
+ end
44
+ end
45
+
46
+ describe 'with required attributes' do
47
+ let(:klass) { BaseValidatorTest::WithRequiredAttributes }
48
+
49
+ it 'returns true when valid' do
50
+ assert object.validate!
51
+ end
52
+
53
+ describe 'without required attribute' do
54
+ let(:attributes) { {} }
55
+
56
+ it 'raises an error' do
57
+ exception = assert_raises(JD::InvalidRecordError) { object.validate! }
58
+
59
+ assert_includes exception.message, 'name is required'
60
+ assert_includes object.errors[:name], 'is required'
61
+ end
62
+
63
+ describe 'with unrequired attributes' do
64
+ let(:attributes) { valid_attributes.merge(age: 101) }
65
+
66
+ it 'returns true' do
67
+ assert object.validate!
68
+ end
69
+ end
70
+ end
71
+ end
72
+
73
+ describe 'custom validations' do
74
+ let(:klass) { BaseValidatorTest::WithCustomValidations }
75
+ let(:attributes) { valid_attributes.merge(name: 'Bob') }
76
+
77
+ it 'returns true when valid' do
78
+ assert object.validate!
79
+ end
80
+
81
+ describe 'when custom validation fails' do
82
+ let(:attributes) { valid_attributes.merge(name: 'Turtles') }
83
+
84
+ it 'raises an error' do
85
+ exception = assert_raises(JD::InvalidRecordError) { object.validate! }
86
+
87
+ assert_includes exception.message, 'name is not Bob'
88
+ assert_includes object.errors[:name], 'is not Bob'
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,13 @@
1
+ require 'support/helper'
2
+
3
+ describe 'MyJohnDeereApi::Validators' do
4
+ describe 'loading dependencies' do
5
+ it 'loads Validators::Base' do
6
+ assert JD::Validators::Base
7
+ end
8
+
9
+ it 'loads Validators::Asset' do
10
+ assert JD::Validators::Asset
11
+ end
12
+ end
13
+ end
@@ -29,5 +29,9 @@ class MyJohnDeereApiTest < MiniTest::Test
29
29
  it 'loads Helpers' do
30
30
  assert JD::Helpers
31
31
  end
32
+
33
+ it 'loads Validators' do
34
+ assert JD::Validators
35
+ end
32
36
  end
33
37
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: my_john_deere_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jaime Bellmyer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-02-10 00:00:00.000000000 Z
12
+ date: 2020-02-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: vcr
@@ -146,6 +146,12 @@ files:
146
146
  - lib/my_john_deere_api/request/individual/contribution_product.rb
147
147
  - lib/my_john_deere_api/request/individual/field.rb
148
148
  - lib/my_john_deere_api/request/individual/organization.rb
149
+ - lib/my_john_deere_api/request/update.rb
150
+ - lib/my_john_deere_api/request/update/asset.rb
151
+ - lib/my_john_deere_api/request/update/base.rb
152
+ - lib/my_john_deere_api/validators.rb
153
+ - lib/my_john_deere_api/validators/asset.rb
154
+ - lib/my_john_deere_api/validators/base.rb
149
155
  - lib/my_john_deere_api/version.rb
150
156
  - test/lib/my_john_deere_api/authorize_test.rb
151
157
  - test/lib/my_john_deere_api/client_test.rb
@@ -189,7 +195,13 @@ files:
189
195
  - test/lib/my_john_deere_api/request/individual/field_test.rb
190
196
  - test/lib/my_john_deere_api/request/individual/organization_test.rb
191
197
  - test/lib/my_john_deere_api/request/individual_test.rb
198
+ - test/lib/my_john_deere_api/request/update/asset_test.rb
199
+ - test/lib/my_john_deere_api/request/update/base_test.rb
200
+ - test/lib/my_john_deere_api/request/update_test.rb
192
201
  - test/lib/my_john_deere_api/request_test.rb
202
+ - test/lib/my_john_deere_api/validators/asset_test.rb
203
+ - test/lib/my_john_deere_api/validators/base_test.rb
204
+ - test/lib/my_john_deere_api/validators_test.rb
193
205
  - test/lib/my_john_deere_api/version_test.rb
194
206
  - test/my_john_deere_api_test.rb
195
207
  - test/support/helper.rb