fortnox-api 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (192) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +9 -1104
  4. data/.travis.yml +22 -2
  5. data/Gemfile +3 -1
  6. data/Guardfile +4 -2
  7. data/README.md +2 -2
  8. data/Rakefile +3 -1
  9. data/bin/console +17 -3
  10. data/fortnox-api.gemspec +32 -27
  11. data/lib/fortnox/api.rb +17 -16
  12. data/lib/fortnox/api/circular_queue.rb +13 -7
  13. data/lib/fortnox/api/mappers.rb +29 -25
  14. data/lib/fortnox/api/mappers/article.rb +7 -6
  15. data/lib/fortnox/api/mappers/base.rb +18 -16
  16. data/lib/fortnox/api/mappers/base/from_json.rb +37 -30
  17. data/lib/fortnox/api/mappers/base/to_json.rb +39 -37
  18. data/lib/fortnox/api/mappers/customer.rb +7 -7
  19. data/lib/fortnox/api/mappers/default_delivery_types.rb +4 -2
  20. data/lib/fortnox/api/mappers/default_templates.rb +5 -4
  21. data/lib/fortnox/api/mappers/edi_information.rb +5 -4
  22. data/lib/fortnox/api/mappers/email_information.rb +5 -4
  23. data/lib/fortnox/api/mappers/invoice.rb +10 -8
  24. data/lib/fortnox/api/mappers/invoice_row.rb +12 -7
  25. data/lib/fortnox/api/mappers/order.rb +10 -7
  26. data/lib/fortnox/api/mappers/order_row.rb +13 -6
  27. data/lib/fortnox/api/mappers/project.rb +6 -4
  28. data/lib/fortnox/api/mappers/terms_of_payments.rb +17 -0
  29. data/lib/fortnox/api/mappers/unit.rb +17 -0
  30. data/lib/fortnox/api/models.rb +9 -5
  31. data/lib/fortnox/api/models/article.rb +68 -67
  32. data/lib/fortnox/api/models/base.rb +52 -36
  33. data/lib/fortnox/api/models/customer.rb +95 -94
  34. data/lib/fortnox/api/models/document.rb +186 -0
  35. data/lib/fortnox/api/models/invoice.rb +44 -44
  36. data/lib/fortnox/api/models/label.rb +5 -3
  37. data/lib/fortnox/api/models/order.rb +8 -8
  38. data/lib/fortnox/api/models/project.rb +10 -8
  39. data/lib/fortnox/api/models/terms_of_payments.rb +28 -0
  40. data/lib/fortnox/api/models/unit.rb +24 -0
  41. data/lib/fortnox/api/repositories.rb +9 -5
  42. data/lib/fortnox/api/repositories/article.rb +6 -4
  43. data/lib/fortnox/api/repositories/base.rb +49 -46
  44. data/lib/fortnox/api/repositories/base/loaders.rb +32 -36
  45. data/lib/fortnox/api/repositories/base/savers.rb +23 -21
  46. data/lib/fortnox/api/repositories/customer.rb +6 -4
  47. data/lib/fortnox/api/repositories/invoice.rb +6 -4
  48. data/lib/fortnox/api/repositories/order.rb +6 -4
  49. data/lib/fortnox/api/repositories/project.rb +6 -4
  50. data/lib/fortnox/api/repositories/terms_of_payments.rb +17 -0
  51. data/lib/fortnox/api/repositories/unit.rb +17 -0
  52. data/lib/fortnox/api/request_handling.rb +12 -12
  53. data/lib/fortnox/api/types.rb +62 -11
  54. data/lib/fortnox/api/types/default_delivery_types.rb +5 -3
  55. data/lib/fortnox/api/types/default_templates.rb +3 -1
  56. data/lib/fortnox/api/types/defaulted.rb +2 -2
  57. data/lib/fortnox/api/types/document_row.rb +41 -42
  58. data/lib/fortnox/api/types/edi_information.rb +10 -8
  59. data/lib/fortnox/api/types/email_information.rb +10 -8
  60. data/lib/fortnox/api/types/enums.rb +60 -47
  61. data/lib/fortnox/api/types/invoice_row.rb +8 -8
  62. data/lib/fortnox/api/types/model.rb +14 -10
  63. data/lib/fortnox/api/types/nullable.rb +7 -7
  64. data/lib/fortnox/api/types/order_row.rb +5 -5
  65. data/lib/fortnox/api/types/required.rb +5 -5
  66. data/lib/fortnox/api/types/sized.rb +14 -6
  67. data/lib/fortnox/api/version.rb +3 -1
  68. data/spec/fortnox/api/mappers/article_spec.rb +3 -1
  69. data/spec/fortnox/api/mappers/base/from_json_spec.rb +15 -13
  70. data/spec/fortnox/api/mappers/base/to_json_spec.rb +4 -3
  71. data/spec/fortnox/api/mappers/base_spec.rb +40 -35
  72. data/spec/fortnox/api/mappers/contexts/json_conversion.rb +12 -11
  73. data/spec/fortnox/api/mappers/customer_spec.rb +3 -1
  74. data/spec/fortnox/api/mappers/default_delivery_types_spec.rb +3 -1
  75. data/spec/fortnox/api/mappers/edi_information_spec.rb +4 -2
  76. data/spec/fortnox/api/mappers/email_information_spec.rb +4 -2
  77. data/spec/fortnox/api/mappers/examples/mapper.rb +17 -9
  78. data/spec/fortnox/api/mappers/invoice_row_spec.rb +8 -3
  79. data/spec/fortnox/api/mappers/invoice_spec.rb +4 -1
  80. data/spec/fortnox/api/mappers/order_row_spec.rb +9 -2
  81. data/spec/fortnox/api/mappers/order_spec.rb +4 -1
  82. data/spec/fortnox/api/mappers/project_spec.rb +3 -1
  83. data/spec/fortnox/api/mappers/terms_of_payments_spec.rb +16 -0
  84. data/spec/fortnox/api/mappers/unit_spec.rb +57 -0
  85. data/spec/fortnox/api/models/article_spec.rb +2 -0
  86. data/spec/fortnox/api/models/base_spec.rb +46 -38
  87. data/spec/fortnox/api/models/customer_spec.rb +2 -0
  88. data/spec/fortnox/api/models/examples/document_base.rb +5 -3
  89. data/spec/fortnox/api/models/examples/model.rb +12 -9
  90. data/spec/fortnox/api/models/invoice_spec.rb +2 -0
  91. data/spec/fortnox/api/models/order_spec.rb +2 -0
  92. data/spec/fortnox/api/models/project_spec.rb +2 -0
  93. data/spec/fortnox/api/models/terms_of_payments_spec.rb +9 -0
  94. data/spec/fortnox/api/models/unit_spec.rb +31 -0
  95. data/spec/fortnox/api/repositories/article_spec.rb +7 -5
  96. data/spec/fortnox/api/repositories/base_spec.rb +121 -100
  97. data/spec/fortnox/api/repositories/customer_spec.rb +7 -5
  98. data/spec/fortnox/api/repositories/examples/all.rb +5 -4
  99. data/spec/fortnox/api/repositories/examples/find.rb +50 -41
  100. data/spec/fortnox/api/repositories/examples/only.rb +14 -13
  101. data/spec/fortnox/api/repositories/examples/save.rb +23 -29
  102. data/spec/fortnox/api/repositories/examples/save_with_nested_model.rb +11 -11
  103. data/spec/fortnox/api/repositories/examples/save_with_specially_named_attribute.rb +11 -10
  104. data/spec/fortnox/api/repositories/examples/search.rb +15 -15
  105. data/spec/fortnox/api/repositories/invoice_spec.rb +8 -6
  106. data/spec/fortnox/api/repositories/order_spec.rb +8 -6
  107. data/spec/fortnox/api/repositories/project_spec.rb +7 -5
  108. data/spec/fortnox/api/repositories/terms_of_payments_spec.rb +30 -0
  109. data/spec/fortnox/api/repositories/unit_spec.rb +34 -0
  110. data/spec/fortnox/api/types/account_number_spec.rb +12 -9
  111. data/spec/fortnox/api/types/default_delivery_types_spec.rb +6 -4
  112. data/spec/fortnox/api/types/edi_information_spec.rb +9 -7
  113. data/spec/fortnox/api/types/email_information_spec.rb +8 -6
  114. data/spec/fortnox/api/types/email_spec.rb +27 -14
  115. data/spec/fortnox/api/types/enums_spec.rb +3 -1
  116. data/spec/fortnox/api/types/examples/document_row.rb +10 -8
  117. data/spec/fortnox/api/types/examples/enum.rb +29 -22
  118. data/spec/fortnox/api/types/examples/types.rb +8 -4
  119. data/spec/fortnox/api/types/housework_types_spec.rb +68 -0
  120. data/spec/fortnox/api/types/invoice_row_spec.rb +3 -1
  121. data/spec/fortnox/api/types/model_spec.rb +12 -9
  122. data/spec/fortnox/api/types/nullable_spec.rb +8 -6
  123. data/spec/fortnox/api/types/order_row_spec.rb +4 -2
  124. data/spec/fortnox/api/types/required_spec.rb +4 -2
  125. data/spec/fortnox/api/types/sized_spec.rb +18 -16
  126. data/spec/fortnox/api_spec.rb +45 -43
  127. data/spec/spec_helper.rb +9 -6
  128. data/spec/support/helpers.rb +3 -1
  129. data/spec/support/helpers/configuration_helper.rb +2 -0
  130. data/spec/support/helpers/dummy_class_helper.rb +7 -8
  131. data/spec/support/helpers/repository_helper.rb +2 -0
  132. data/spec/support/helpers/when_performing_helper.rb +3 -1
  133. data/spec/support/matchers.rb +2 -0
  134. data/spec/support/matchers/type.rb +3 -1
  135. data/spec/support/matchers/type/attribute_matcher.rb +15 -14
  136. data/spec/support/matchers/type/enum_matcher.rb +9 -7
  137. data/spec/support/matchers/type/have_account_number_matcher.rb +11 -9
  138. data/spec/support/matchers/type/have_country_code_matcher.rb +6 -4
  139. data/spec/support/matchers/type/have_currency_matcher.rb +4 -2
  140. data/spec/support/matchers/type/have_customer_type_matcher.rb +6 -4
  141. data/spec/support/matchers/type/have_default_delivery_type_matcher.rb +4 -2
  142. data/spec/support/matchers/type/have_discount_type_matcher.rb +4 -2
  143. data/spec/support/matchers/type/have_email_matcher.rb +11 -9
  144. data/spec/support/matchers/type/have_housework_type_matcher.rb +9 -0
  145. data/spec/support/matchers/type/have_nullable_date_matcher.rb +29 -29
  146. data/spec/support/matchers/type/have_nullable_matcher.rb +23 -21
  147. data/spec/support/matchers/type/have_nullable_string_matcher.rb +30 -32
  148. data/spec/support/matchers/type/have_sized_float_matcher.rb +4 -2
  149. data/spec/support/matchers/type/have_sized_integer_matcher.rb +4 -2
  150. data/spec/support/matchers/type/have_sized_string_matcher.rb +16 -15
  151. data/spec/support/matchers/type/have_vat_type_matcher.rb +4 -2
  152. data/spec/support/matchers/type/numeric_matcher.rb +25 -23
  153. data/spec/support/matchers/type/require_attribute_matcher.rb +36 -37
  154. data/spec/support/matchers/type/type_matcher.rb +18 -16
  155. data/spec/support/vcr_setup.rb +2 -0
  156. data/spec/vcr_cassettes/orders/{house_work_type_babysitting.yml → housework_type_babysitting.yml} +9 -10
  157. data/spec/vcr_cassettes/orders/{house_work_type_cleaning.yml → housework_type_cleaning.yml} +9 -10
  158. data/spec/vcr_cassettes/orders/{house_work_type_construction.yml → housework_type_construction.yml} +9 -10
  159. data/spec/vcr_cassettes/orders/{house_work_type_cooking.yml → housework_type_cooking.yml} +7 -7
  160. data/spec/vcr_cassettes/orders/{house_work_type_electricity.yml → housework_type_electricity.yml} +9 -10
  161. data/spec/vcr_cassettes/orders/{house_work_type_gardening.yml → housework_type_gardening.yml} +9 -10
  162. data/spec/vcr_cassettes/orders/{house_work_type_glassmetalwork.yml → housework_type_glassmetalwork.yml} +9 -10
  163. data/spec/vcr_cassettes/orders/{house_work_type_grounddrainagework.yml → housework_type_grounddrainagework.yml} +9 -10
  164. data/spec/vcr_cassettes/orders/{house_work_type_hvac.yml → housework_type_hvac.yml} +9 -10
  165. data/spec/vcr_cassettes/orders/{house_work_type_masonry.yml → housework_type_masonry.yml} +9 -10
  166. data/spec/vcr_cassettes/orders/{house_work_type_othercare.yml → housework_type_othercare.yml} +9 -10
  167. data/spec/vcr_cassettes/orders/{house_work_type_othercosts.yml → housework_type_othercosts.yml} +9 -10
  168. data/spec/vcr_cassettes/orders/{house_work_type_paintingwallpapering.yml → housework_type_paintingwallpapering.yml} +9 -10
  169. data/spec/vcr_cassettes/orders/{house_work_type_snowplowing.yml → housework_type_snowplowing.yml} +9 -10
  170. data/spec/vcr_cassettes/orders/{house_work_type_textileclothing.yml → housework_type_textileclothing.yml} +9 -10
  171. data/spec/vcr_cassettes/orders/{house_work_type_tutoring.yml → housework_type_tutoring.yml} +7 -7
  172. data/spec/vcr_cassettes/termsofpayments/all.yml +51 -0
  173. data/spec/vcr_cassettes/termsofpayments/find_failure.yml +45 -0
  174. data/spec/vcr_cassettes/termsofpayments/find_id_1.yml +46 -0
  175. data/spec/vcr_cassettes/termsofpayments/find_new.yml +46 -0
  176. data/spec/vcr_cassettes/termsofpayments/save_new.yml +45 -0
  177. data/spec/vcr_cassettes/termsofpayments/save_old.yml +46 -0
  178. data/spec/vcr_cassettes/units/all.yml +48 -0
  179. data/spec/vcr_cassettes/units/find_failure.yml +45 -0
  180. data/spec/vcr_cassettes/units/find_id_1.yml +46 -0
  181. data/spec/vcr_cassettes/units/find_new.yml +48 -0
  182. data/spec/vcr_cassettes/units/save_new.yml +47 -0
  183. data/spec/vcr_cassettes/units/save_old.yml +48 -0
  184. data/spec/vcr_cassettes/units/save_with_specially_named_attribute.yml +47 -0
  185. metadata +127 -88
  186. data/docs/account.rb +0 -59
  187. data/docs/extraction_script.js +0 -23
  188. data/docs/generation_script.rb +0 -43
  189. data/docs/json/account.json +0 -77
  190. data/lib/fortnox/api/models/document_base.rb +0 -189
  191. data/spec/fortnox/api/types/house_work_types_spec.rb +0 -64
  192. data/spec/support/matchers/type/have_house_work_type_matcher.rb +0 -7
@@ -1,19 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  shared_examples_for 'a model' do |unique_id|
2
- let( :required_attributes ){ described_class::STUB.dup }
3
- let( :unique_id_attribute ){ described_class::UNIQUE_ID }
4
+ let(:required_attributes) { described_class::STUB.dup }
5
+ let(:unique_id_attribute) { described_class::UNIQUE_ID }
4
6
 
5
7
  it 'can be initialized' do
6
- expect{ described_class.new( required_attributes ) }.not_to raise_error
8
+ expect { described_class.new(required_attributes) }.not_to raise_error
7
9
  end
8
10
 
9
11
  describe '.unique_id' do
10
- subject{ model.unique_id }
11
-
12
- before{ expect(model.send(unique_id_attribute)).to eq unique_id }
12
+ subject { model.unique_id }
13
13
 
14
- let( :attributes ){ required_attributes.merge(unique_id_attribute => unique_id) }
15
- let( :model ){ described_class.new( attributes ) }
14
+ let(:model) do
15
+ described_class.new(
16
+ required_attributes.merge(unique_id_attribute => unique_id)
17
+ )
18
+ end
16
19
 
17
- it{ is_expected.to eq unique_id }
20
+ it { is_expected.to eq unique_id }
18
21
  end
19
22
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'fortnox/api/models/invoice'
3
5
  require 'fortnox/api/models/examples/document_base'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'fortnox/api/models/order'
3
5
  require 'fortnox/api/models/examples/document_base'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'fortnox/api/models/project'
3
5
  require 'fortnox/api/models/examples/model'
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'fortnox/api/models/terms_of_payments'
5
+ require 'fortnox/api/models/examples/model'
6
+
7
+ describe Fortnox::API::Model::TermsOfPayments, type: :model do
8
+ it_behaves_like 'a model', '1'
9
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'fortnox/api/models/unit'
5
+
6
+ module Fortnox
7
+ module API
8
+ # Shhh Rubocop, we don't need a comment here ... Really
9
+ module Model
10
+ describe Unit, type: :model do
11
+ context 'when created from empty hash' do
12
+ subject { -> { described_class.new } }
13
+
14
+ it { is_expected.to raise_error(Fortnox::API::MissingAttributeError, /Missing attribute.*:code/) }
15
+ end
16
+
17
+ context 'when created from stub' do
18
+ subject { described_class.stub }
19
+
20
+ it { is_expected.to have_attributes(code: '', description: nil) }
21
+ end
22
+
23
+ context 'when created with all attributes' do
24
+ subject { described_class.new(code: 'lbs', description: 'Pounds') }
25
+
26
+ it { is_expected.to have_attributes(code: 'lbs', description: 'Pounds') }
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'fortnox/api'
3
5
  require 'fortnox/api/mappers'
@@ -11,9 +13,9 @@ require 'fortnox/api/repositories/examples/search'
11
13
  describe Fortnox::API::Repository::Article, order: :defined, integration: true do
12
14
  include Helpers::Configuration
13
15
 
14
- before{ set_api_test_configuration }
16
+ before { set_api_test_configuration }
15
17
 
16
- subject(:repository){ described_class.new }
18
+ subject(:repository) { described_class.new }
17
19
 
18
20
  include_examples '.save',
19
21
  :description,
@@ -27,10 +29,10 @@ describe Fortnox::API::Repository::Article, order: :defined, integration: true d
27
29
  include_examples '.all', 12
28
30
 
29
31
  include_examples '.find', '1' do
30
- let( :find_by_hash_failure ){ { description: 'Not Found' } }
31
- let( :single_param_find_by_hash ){ { find_hash: { articlenumber: 1 }, matches: 3 } }
32
+ let(:find_by_hash_failure) { { description: 'Not Found' } }
33
+ let(:single_param_find_by_hash) { { find_hash: { articlenumber: 1 }, matches: 3 } }
32
34
 
33
- let( :multi_param_find_by_hash ) do
35
+ let(:multi_param_find_by_hash) do
34
36
  { find_hash: { articlenumber: 1, description: 'Cykelpump' }, matches: 1 }
35
37
  end
36
38
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'fortnox/api'
3
5
 
@@ -15,79 +17,85 @@ describe Fortnox::API::Repository::Base do
15
17
 
16
18
  require 'dry/container/stub'
17
19
  Fortnox::API::Registry.enable_stubs!
18
- Fortnox::API::Registry.stub( :test, Model::Test )
20
+ Fortnox::API::Registry.stub(:test, Model::Test)
19
21
  end
20
22
 
21
- let(:access_token){ '3f08d038-f380-4893-94a0-a08f6e60e67a' }
22
- let(:access_token2){ '89feajou-sif8-8f8u-29ja-xdfniokeniod' }
23
- let(:client_secret){ 'P5K5vE3Kun' }
24
- let(:repository){ Repository::Test.new }
25
- let(:application_json){}
23
+ let(:access_token) { '3f08d038-f380-4893-94a0-a08f6e60e67a' }
24
+ let(:access_token2) { '89feajou-sif8-8f8u-29ja-xdfniokeniod' }
25
+ let(:client_secret) { 'P5K5vE3Kun' }
26
+ let(:repository) { Repository::Test.new }
27
+ let(:application_json) {}
26
28
  let(:headers) do
27
29
  {
28
30
  'Access-Token' => access_token,
29
31
  'Client-Secret' => client_secret,
30
32
  'Content-Type' => 'application/json',
31
- 'Accept' => 'application/json',
33
+ 'Accept' => 'application/json'
32
34
  }
33
35
  end
34
36
 
35
37
  describe 'creation' do
36
38
  shared_examples_for 'missing configuration' do
37
- subject{ ->{ repository } }
39
+ subject { -> { repository } }
38
40
 
39
- let(:error){ Fortnox::API::MissingConfiguration }
41
+ let(:error) { Fortnox::API::MissingConfiguration }
40
42
 
41
- it{ is_expected.to raise_error( error, /#{message}/ ) }
43
+ it { is_expected.to raise_error(error, /#{message}/) }
42
44
  end
43
45
 
44
46
  context 'without base url' do
45
47
  include_examples 'missing configuration' do
46
- before{ Fortnox::API.configure{ |conf| conf.base_url = nil } }
47
- let(:message){ 'have to provide a base url' }
48
+ before { Fortnox::API.configure { |conf| conf.base_url = nil } }
49
+ let(:message) { 'have to provide a base url' }
48
50
  end
49
51
  end
50
52
 
51
53
  context 'without client secret' do
52
54
  include_examples 'missing configuration' do
53
- before{ Fortnox::API.configure{ |conf| conf.client_secret = nil } }
54
- let(:message){ 'have to provide your client secret' }
55
+ before { Fortnox::API.configure { |conf| conf.client_secret = nil } }
56
+ let(:message) { 'have to provide your client secret' }
55
57
  end
56
58
  end
57
59
  end
58
60
 
59
61
  describe '#next_access_token' do
60
- before{ Fortnox::API.configure{ |conf| conf.client_secret = client_secret } }
62
+ before { Fortnox::API.configure { |conf| conf.client_secret = client_secret } }
61
63
 
62
64
  context 'with default token store' do
63
65
  context 'with one access token' do
64
- subject{ repository.next_access_token }
66
+ subject { repository.next_access_token }
67
+
68
+ before { Fortnox::API.configure { |conf| conf.access_token = access_token } }
65
69
 
66
- before{ Fortnox::API.configure{ |conf| conf.access_token = access_token } }
67
- it{ is_expected.to eql( access_token ) }
70
+ it { is_expected.to eql(access_token) }
71
+ end
68
72
 
69
- describe 'next request' do
70
- before{ repository.next_access_token }
73
+ context 'with one access token and two subsequent requests' do
74
+ subject { repository.next_access_token }
75
+
76
+ before do
77
+ Fortnox::API.configure { |conf| conf.access_token = access_token }
78
+ repository.next_access_token
79
+ end
71
80
 
72
- it 'still uses the same token' do
73
- is_expected.to eql( access_token )
74
- end
81
+ it 'still uses the same token' do
82
+ is_expected.to eql(access_token)
75
83
  end
76
84
  end
77
85
 
78
86
  context 'with multiple access tokens' do
79
- subject{ access_tokens }
87
+ subject { access_tokens }
80
88
 
81
- before{ Fortnox::API.configure{ |conf| conf.access_tokens = access_tokens } }
82
- let( :access_tokens ){ [access_token, access_token2] }
89
+ before { Fortnox::API.configure { |conf| conf.access_tokens = access_tokens } }
90
+ let(:access_tokens) { [access_token, access_token2] }
83
91
 
84
- it{ is_expected.to include( repository.next_access_token ) }
92
+ it { is_expected.to include(repository.next_access_token) }
85
93
 
86
94
  it 'changes token on next request' do
87
95
  token1 = repository.next_access_token
88
96
  token2 = repository.next_access_token
89
97
 
90
- expect( token1 ).not_to eql( token2 )
98
+ expect(token1).not_to eql(token2)
91
99
  end
92
100
 
93
101
  it 'circulates tokens' do
@@ -95,78 +103,83 @@ describe Fortnox::API::Repository::Base do
95
103
  repository.next_access_token
96
104
  token3 = repository.next_access_token
97
105
 
98
- expect( token1 ).to eql( token3 )
106
+ expect(token1).to eql(token3)
99
107
  end
100
108
  end
101
109
  end
102
110
 
103
111
  context 'with multiple stores' do
104
- subject{ repository.next_access_token }
112
+ subject { repository.next_access_token }
105
113
 
106
- before do
114
+ before do
107
115
  Fortnox::API.configure do |config|
108
116
  config.access_tokens = { store1: access_token, store2: access_token2 }
109
117
  end
110
118
  end
111
119
 
112
120
  describe 'first token store' do
113
- let( :repository ){ Repository::Test.new( token_store: :store1) }
121
+ let(:repository) { Repository::Test.new(token_store: :store1) }
114
122
 
115
- it{ is_expected.to eql access_token }
123
+ it { is_expected.to eql access_token }
116
124
  end
117
125
 
118
126
  describe 'second token store' do
119
- let( :repository ){ Repository::Test.new( token_store: :store2 ) }
127
+ let(:repository) { Repository::Test.new(token_store: :store2) }
120
128
 
121
- it{ is_expected.to eql access_token2 }
129
+ it { is_expected.to eql access_token2 }
122
130
  end
123
131
  end
124
132
  end
125
133
 
126
- describe '#get_access_tokens' do
127
- subject( :get_access_tokens ){ repository.get_access_tokens }
134
+ describe '#access_tokens' do
135
+ subject(:access_tokens) { repository.access_tokens }
128
136
 
129
- before{ Fortnox::API.configure{ |conf| conf.client_secret = client_secret } }
137
+ before { Fortnox::API.configure { |conf| conf.client_secret = client_secret } }
130
138
 
131
- let( :token_store_not_present ){ "no token store named #{ token_store.inspect }." }
132
- let( :error ){ Fortnox::API::MissingConfiguration }
139
+ let(:token_store_not_present) do
140
+ "There is no token store named #{token_store.inspect}. Available stores are #{available_stores}."
141
+ end
142
+
143
+ let(:error) { Fortnox::API::MissingConfiguration }
133
144
 
134
145
  context 'with non existing token store' do
135
- subject{ ->{ get_access_tokens } }
146
+ subject { -> { access_tokens } }
136
147
 
137
148
  before do
138
- Fortnox::API.configure{ |conf| conf.access_tokens = { some_store: [access_token] } }
149
+ Fortnox::API.configure { |conf| conf.access_tokens = { some_store: [access_token] } }
139
150
  end
140
151
 
141
- let( :repository ){ Repository::Test.new( token_store: token_store ) }
142
- let( :token_store ){ :non_existing_store }
152
+ let(:repository) { Repository::Test.new(token_store: token_store) }
153
+ let(:token_store) { :non_existing_store }
154
+ let(:available_stores) { [:some_store] }
143
155
 
144
- it{ is_expected.to raise_error( error, /#{token_store_not_present}/ ) }
156
+ it { is_expected.to raise_error(error, token_store_not_present) }
145
157
  end
146
158
 
147
159
  context 'with no tokens set' do
148
- subject{ ->{ get_access_tokens } }
160
+ subject { -> { access_tokens } }
149
161
 
150
- before{ Fortnox::API.configure{ |conf| conf.access_tokens = {} } }
151
- let( :token_store ){ :default }
162
+ before { Fortnox::API.configure { |conf| conf.access_tokens = {} } }
163
+ let(:token_store) { :default }
164
+ let(:available_stores) { [] }
152
165
 
153
- it{ is_expected.to raise_error( error, /#{token_store_not_present}/) }
166
+ it { is_expected.to raise_error(error, token_store_not_present) }
154
167
  end
155
168
 
156
169
  context 'with one access token in token store' do
157
- before{ Fortnox::API.configure{ |conf| conf.access_token = access_token } }
158
- let( :token_store ){ :default }
170
+ before { Fortnox::API.configure { |conf| conf.access_token = access_token } }
171
+ let(:token_store) { :default }
159
172
 
160
- it{ is_expected.to eql( access_token ) }
173
+ it { is_expected.to eql(access_token) }
161
174
  end
162
175
 
163
176
  context 'with multiple access tokens' do
164
177
  before do
165
- Fortnox::API.configure{ |conf| conf.access_tokens = [access_token, access_token2] }
178
+ Fortnox::API.configure { |conf| conf.access_tokens = [access_token, access_token2] }
166
179
  end
167
- let( :token_store ){ :default }
180
+ let(:token_store) { :default }
168
181
 
169
- it{ is_expected.to eql( [access_token, access_token2] ) }
182
+ it { is_expected.to eql([access_token, access_token2]) }
170
183
  end
171
184
 
172
185
  context 'with multiple token stores' do
@@ -175,64 +188,64 @@ describe Fortnox::API::Repository::Base do
175
188
  conf.access_tokens = { store_a: store_a_tokens, store_b: store_b_token }
176
189
  end
177
190
  end
178
- let( :store_a_tokens ){ ['token_a1', 'token_a2'] }
179
- let( :store_b_token ){ 'token_b1' }
191
+ let(:store_a_tokens) { %w[token_a1 token_a2] }
192
+ let(:store_b_token) { 'token_b1' }
180
193
 
181
194
  context 'with valid store name' do
182
- let( :repository ){ Repository::Test.new( token_store: :store_a ) }
195
+ let(:repository) { Repository::Test.new(token_store: :store_a) }
183
196
 
184
- it{ is_expected.to eql( store_a_tokens ) }
197
+ it { is_expected.to eql(store_a_tokens) }
185
198
  end
186
199
 
187
200
  context 'with non collection' do
188
- let( :repository ){ Repository::Test.new( token_store: :store_b ) }
201
+ let(:repository) { Repository::Test.new(token_store: :store_b) }
189
202
 
190
- it{ is_expected.to eql( store_b_token ) }
203
+ it { is_expected.to eql(store_b_token) }
191
204
  end
192
205
 
193
206
  context 'with invalid store name' do
194
- subject{ ->{ get_access_tokens } }
207
+ subject { -> { access_tokens } }
195
208
 
196
- let( :repository ){ Repository::Test.new( token_store: :nonsence_store ) }
209
+ let(:repository) { Repository::Test.new(token_store: :nonsence_store) }
197
210
 
198
- it{ is_expected.to raise_error( error ) }
211
+ it { is_expected.to raise_error(error) }
199
212
  end
200
213
  end
201
214
  end
202
215
 
203
216
  describe '#check_access_tokens!' do
204
- subject{ ->{ repository.check_access_tokens!(tokens) } }
217
+ subject { -> { repository.check_access_tokens!(tokens) } }
205
218
 
206
- before{ Fortnox::API.configure{ |conf| conf.client_secret = client_secret } }
207
- let( :error ){ Fortnox::API::MissingConfiguration }
208
- let( :message ){ "not provided any access tokens in token store #{ token_store.inspect }" }
209
- let( :token_store ){ :default }
219
+ before { Fortnox::API.configure { |conf| conf.client_secret = client_secret } }
220
+ let(:error) { Fortnox::API::MissingConfiguration }
221
+ let(:message) { "not provided any access tokens in token store #{token_store.inspect}" }
222
+ let(:token_store) { :default }
210
223
 
211
224
  context 'with nil' do
212
- let( :tokens ){ nil }
225
+ let(:tokens) { nil }
213
226
 
214
- it{ is_expected.to raise_error( error, /#{message}/ ) }
227
+ it { is_expected.to raise_error(error, /#{message}/) }
215
228
  end
216
229
 
217
230
  context 'with empty array' do
218
- let( :tokens ){ [] }
231
+ let(:tokens) { [] }
219
232
 
220
- it{ is_expected.to raise_error( error, /#{message}/ ) }
233
+ it { is_expected.to raise_error(error, /#{message}/) }
221
234
  end
222
235
 
223
236
  context 'with an empty, non default, token store' do
224
- before{ Fortnox::API.configure{ |conf| conf.access_tokens = { token_store => tokens } } }
225
- let( :repository ){ Repository::Test.new( token_store: token_store ) }
226
- let( :tokens ){ [] }
227
- let( :token_store ){ :store1 }
237
+ before { Fortnox::API.configure { |conf| conf.access_tokens = { token_store => tokens } } }
238
+ let(:repository) { Repository::Test.new(token_store: token_store) }
239
+ let(:tokens) { [] }
240
+ let(:token_store) { :store1 }
228
241
 
229
- it{ is_expected.to raise_error( error, /#{message}/ ) }
242
+ it { is_expected.to raise_error(error, /#{message}/) }
230
243
  end
231
244
 
232
245
  context 'with valid tokens' do
233
- let( :tokens ){ ['12345', 'abcde'] }
246
+ let(:tokens) { %w[12345 abcde] }
234
247
 
235
- it{ is_expected.not_to raise_error }
248
+ it { is_expected.not_to raise_error }
236
249
  end
237
250
  end
238
251
 
@@ -245,7 +258,7 @@ describe Fortnox::API::Repository::Base do
245
258
 
246
259
  stub_request(
247
260
  :get,
248
- 'https://api.fortnox.se/3/test',
261
+ 'https://api.fortnox.se/3/test'
249
262
  ).with(
250
263
  headers: headers
251
264
  ).to_return(
@@ -253,9 +266,9 @@ describe Fortnox::API::Repository::Base do
253
266
  )
254
267
  end
255
268
 
256
- subject{ repository.get( '/test', { body: '' } ) }
269
+ subject { repository.get('/test', body: '') }
257
270
 
258
- it{ is_expected.to be_nil }
271
+ it { is_expected.to be_nil }
259
272
  end
260
273
 
261
274
  describe 'making requests with multiple access tokens' do
@@ -267,13 +280,13 @@ describe Fortnox::API::Repository::Base do
267
280
 
268
281
  stub_request(
269
282
  :get,
270
- 'https://api.fortnox.se/3/test',
283
+ 'https://api.fortnox.se/3/test'
271
284
  ).with(
272
285
  headers: {
273
286
  'Access-Token' => access_token,
274
287
  'Client-Secret' => client_secret,
275
288
  'Content-Type' => 'application/json',
276
- 'Accept' => 'application/json',
289
+ 'Accept' => 'application/json'
277
290
  }
278
291
  ).to_return(
279
292
  status: 200,
@@ -282,13 +295,13 @@ describe Fortnox::API::Repository::Base do
282
295
 
283
296
  stub_request(
284
297
  :get,
285
- 'https://api.fortnox.se/3/test',
298
+ 'https://api.fortnox.se/3/test'
286
299
  ).with(
287
300
  headers: {
288
301
  'Access-Token' => access_token2,
289
302
  'Client-Secret' => client_secret,
290
303
  'Content-Type' => 'application/json',
291
- 'Accept' => 'application/json',
304
+ 'Accept' => 'application/json'
292
305
  }
293
306
  ).to_return(
294
307
  status: 200,
@@ -297,23 +310,26 @@ describe Fortnox::API::Repository::Base do
297
310
  end
298
311
 
299
312
  context 'with subsequent requests on same object' do
300
- let!(:response1){ repository.get( '/test', { body: '' } ) }
301
- let!(:response2){ repository.get( '/test', { body: '' } ) }
302
- let!(:response3){ repository.get( '/test', { body: '' } ) }
313
+ let!(:response1) { repository.get('/test', body: '') }
314
+ let!(:response2) { repository.get('/test', body: '') }
315
+ let!(:response3) { repository.get('/test', body: '') }
303
316
 
304
317
  # rubocop:disable RSpec/MultipleExpectations
305
318
  # All these checks must be run in same it-statement because
306
319
  # of the random starting index.
307
320
  it 'works' do
308
- expect(response1).not_to eq( response2 )
309
- expect(response1).to eq( response3 )
310
- expect(response3).not_to eq( response2 )
321
+ expect(response1).not_to eq(response2)
322
+ expect(response1).to eq(response3)
323
+ expect(response3).not_to eq(response2)
311
324
  end
312
325
  # rubocop:enable RSpec/MultipleExpectations
313
326
  end
314
327
  end
315
328
 
316
329
  context 'when raising error from remote server' do
330
+ error_message = 'Räkenskapsår finns inte upplagt. '\
331
+ 'För att kunna skapa en faktura krävs det att det finns ett räkenskapsår'
332
+
317
333
  before do
318
334
  Fortnox::API.configure do |conf|
319
335
  conf.client_secret = client_secret
@@ -322,18 +338,23 @@ describe Fortnox::API::Repository::Base do
322
338
 
323
339
  stub_request(
324
340
  :post,
325
- 'https://api.fortnox.se/3/test',
341
+ 'https://api.fortnox.se/3/test'
326
342
  ).to_return(
327
343
  status: 500,
328
- body: { 'ErrorInformation' => { 'error' => 1, 'message' => 'Räkenskapsår finns inte upplagt. För att kunna skapa en faktura krävs det att det finns ett räkenskapsår' } }.to_json,
329
- headers: { 'Content-Type' => 'application/json' },
344
+ body: {
345
+ 'ErrorInformation' => {
346
+ 'error' => 1,
347
+ 'message' => error_message
348
+ }
349
+ }.to_json,
350
+ headers: { 'Content-Type' => 'application/json' }
330
351
  )
331
352
  end
332
353
 
333
- subject{ ->{ repository.post( '/test', { body: '' } ) } }
354
+ subject { -> { repository.post('/test', body: '') } }
334
355
 
335
- it{ is_expected.to raise_error( Fortnox::API::RemoteServerError ) }
336
- it{ is_expected.to raise_error( 'Räkenskapsår finns inte upplagt. För att kunna skapa en faktura krävs det att det finns ett räkenskapsår' ) }
356
+ it { is_expected.to raise_error(Fortnox::API::RemoteServerError) }
357
+ it { is_expected.to raise_error(error_message) }
337
358
 
338
359
  context 'with debugging enabled' do
339
360
  around do |example|
@@ -342,7 +363,7 @@ describe Fortnox::API::Repository::Base do
342
363
  Fortnox::API.config.debugging = false
343
364
  end
344
365
 
345
- it{ is_expected.to raise_error( /\<HTTParty\:\:Request\:0x/ ) }
366
+ it { is_expected.to raise_error(/\<HTTParty\:\:Request\:0x/) }
346
367
  end
347
368
  end
348
369
  end