my_john_deere_api 1.3.2 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
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