fortnox-api 0.5.2 → 0.6.0

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 (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