fortnox-api 0.4.0 → 0.5.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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +31 -29
  3. data/bin/console +8 -0
  4. data/fortnox-api.gemspec +1 -3
  5. data/lib/fortnox/api.rb +49 -14
  6. data/lib/fortnox/api/circular_queue.rb +33 -0
  7. data/lib/fortnox/api/mappers.rb +1 -1
  8. data/lib/fortnox/api/mappers/base.rb +3 -0
  9. data/lib/fortnox/api/models/article.rb +25 -25
  10. data/lib/fortnox/api/models/customer.rb +47 -47
  11. data/lib/fortnox/api/models/document_base.rb +4 -4
  12. data/lib/fortnox/api/repositories/article.rb +3 -4
  13. data/lib/fortnox/api/repositories/base.rb +77 -5
  14. data/lib/fortnox/api/repositories/base/savers.rb +2 -2
  15. data/lib/fortnox/api/repositories/customer.rb +3 -4
  16. data/lib/fortnox/api/repositories/invoice.rb +3 -4
  17. data/lib/fortnox/api/repositories/order.rb +3 -4
  18. data/lib/fortnox/api/repositories/project.rb +3 -3
  19. data/lib/fortnox/api/types/document_row.rb +3 -3
  20. data/lib/fortnox/api/types/model.rb +2 -6
  21. data/lib/fortnox/api/version.rb +1 -1
  22. data/spec/fortnox/api/mappers/base_spec.rb +6 -0
  23. data/spec/fortnox/api/repositories/article_spec.rb +4 -0
  24. data/spec/fortnox/api/repositories/base_spec.rb +348 -0
  25. data/spec/fortnox/api/repositories/customer_spec.rb +4 -0
  26. data/spec/fortnox/api/repositories/invoice_spec.rb +4 -0
  27. data/spec/fortnox/api/repositories/order_spec.rb +4 -0
  28. data/spec/fortnox/api/repositories/project_spec.rb +4 -0
  29. data/spec/fortnox/api/types/examples/document_row.rb +2 -2
  30. data/spec/fortnox/api/types/house_work_types_spec.rb +4 -0
  31. data/spec/fortnox/api_spec.rb +161 -31
  32. data/spec/spec_helper.rb +7 -2
  33. data/spec/support/helpers/configuration_helper.rb +10 -0
  34. metadata +10 -27
  35. data/lib/fortnox/api/base.rb +0 -47
  36. data/lib/fortnox/api/class_methods.rb +0 -30
  37. data/lib/fortnox/api/environment_validation.rb +0 -78
  38. data/spec/fortnox/api/base_spec.rb +0 -167
  39. data/spec/support/helpers/environment_helper.rb +0 -7
@@ -9,6 +9,10 @@ require 'fortnox/api/repositories/examples/save_with_specially_named_attribute'
9
9
  require 'fortnox/api/repositories/examples/search'
10
10
 
11
11
  describe Fortnox::API::Repository::Customer, order: :defined, integration: true do
12
+ include Helpers::Configuration
13
+
14
+ before{ set_api_test_configuration }
15
+
12
16
  subject(:repository){ described_class.new }
13
17
 
14
18
  include_examples '.save', :name
@@ -11,6 +11,10 @@ require 'fortnox/api/repositories/examples/save_with_specially_named_attribute'
11
11
  require 'fortnox/api/repositories/examples/only'
12
12
 
13
13
  describe Fortnox::API::Repository::Invoice, order: :defined, integration: true do
14
+ include Helpers::Configuration
15
+
16
+ before{ set_api_test_configuration }
17
+
14
18
  subject(:repository){ described_class.new }
15
19
 
16
20
  required_hash = { customer_number: '1' }
@@ -10,6 +10,10 @@ require 'fortnox/api/repositories/examples/save_with_nested_model'
10
10
  require 'fortnox/api/repositories/examples/search'
11
11
 
12
12
  describe Fortnox::API::Repository::Order, order: :defined, integration: true do
13
+ include Helpers::Configuration
14
+
15
+ before{ set_api_test_configuration }
16
+
13
17
  subject(:repository){ described_class.new }
14
18
 
15
19
  required_hash = { customer_number: '1' }
@@ -7,6 +7,10 @@ require 'fortnox/api/repositories/examples/find'
7
7
  require 'fortnox/api/repositories/examples/save'
8
8
 
9
9
  describe Fortnox::API::Repository::Project, order: :defined, integration: true do
10
+ include Helpers::Configuration
11
+
12
+ before{ set_api_test_configuration }
13
+
10
14
  subject( :repository ){ described_class.new }
11
15
 
12
16
  include_examples '.save',
@@ -4,8 +4,8 @@ shared_examples_for 'DocumentRow' do |valid_hash|
4
4
  it{ is_expected.to have_sized_string( :article_number, 50, valid_hash ) }
5
5
  it{ is_expected.to have_sized_string( :description, 50, valid_hash ) }
6
6
 
7
- it{ is_expected.to have_sized_float( :delivered_quantity, 0.0, 9_999_999_999_999.0, valid_hash ) }
8
- it{ is_expected.to have_sized_float( :price, 0.0, 99_999_999_999.0, valid_hash ) }
7
+ it{ is_expected.to have_sized_float( :delivered_quantity, 0.0, 9_999_999_999_999.9, valid_hash ) }
8
+ it{ is_expected.to have_sized_float( :price, 0.0, 99_999_999_999.9, valid_hash ) }
9
9
 
10
10
  it{ is_expected.to have_discount_type( :discount_type, valid_hash ) }
11
11
 
@@ -7,6 +7,10 @@ require 'fortnox/api/types/order_row'
7
7
 
8
8
  # rubocop:disable RSpec/DescribeClass
9
9
  describe 'HouseWorkTypes', integration: true do
10
+ include Helpers::Configuration
11
+
12
+ before{ set_api_test_configuration }
13
+
10
14
  let(:repository){ Fortnox::API::Repository::Order.new }
11
15
  let(:valid_model) do
12
16
  Fortnox::API::Model::Order.new(customer_number: '1', order_rows: [order_row])
@@ -2,36 +2,166 @@ require 'spec_helper'
2
2
  require 'fortnox/api'
3
3
 
4
4
  describe Fortnox::API do
5
- include Helpers::Environment
6
-
7
- context 'get access token' do
8
- before do
9
- stub_environment(
10
- 'FORTNOX_API_BASE_URL' => 'http://api.fortnox.se/3/',
11
- 'FORTNOX_API_CLIENT_SECRET' => 'P5K5vE3Kun',
12
- 'FORTNOX_API_ACCESS_TOKEN' => '3f08d038-f380-4893-94a0-a08f6e60e67a',
13
- 'FORTNOX_API_AUTHORIZATION_CODE' => 'ea3862b0-189c-464b-8e23-1b9702365ea1'
14
- )
15
-
16
- stub_request(
17
- :get,
18
- 'http://api.fortnox.se/3/',
19
- ).with(
20
- headers: {
21
- 'Authorization-Code' => 'ea3862b0-189c-464b-8e23-1b9702365ea1',
22
- 'Client-Secret' => 'P5K5vE3Kun',
23
- 'Accept' => 'application/json',
24
- }
25
- ).to_return(
26
- status: 200,
27
- body: { 'Authorisation' => { 'AccessToken' => '3f08d038-f380-4893-94a0-a08f6e60e67a' } }.to_json,
28
- headers: { 'Content-Type' => 'application/json' },
29
- )
30
- end
31
-
32
-
33
- subject{ described_class.get_access_token }
34
-
35
- it{ is_expected.to eql( "3f08d038-f380-4893-94a0-a08f6e60e67a" ) }
5
+ before do
6
+ module Fortnox
7
+ module API
8
+ class TestBase
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ describe 'configuration defaults' do
15
+ subject(:config_value){ described_class.config[config_key] }
16
+
17
+ before{ Fortnox::API::TestBase.new }
18
+
19
+ describe 'base_url' do
20
+ let( :config_key ){ :base_url }
21
+
22
+ it{ is_expected.to eql 'https://api.fortnox.se/3/' }
23
+ end
24
+
25
+ describe 'client_secret' do
26
+ let( :config_key ){ :client_secret }
27
+
28
+ it{ is_expected.to be_nil }
29
+ end
30
+
31
+ describe 'access_token' do
32
+ let( :config_key ){ :access_token }
33
+
34
+ it{ is_expected.to be_nil }
35
+ end
36
+
37
+ describe 'access_tokens' do
38
+ let( :config_key ){ :access_tokens }
39
+
40
+ it{ is_expected.to be_nil }
41
+ end
42
+
43
+ describe 'token_store' do
44
+ let( :config_key ){ :token_store }
45
+
46
+ it{ is_expected.to eql( {} ) }
47
+ end
48
+
49
+ describe 'debugging' do
50
+ let( :config_key ){ :debugging }
51
+
52
+ it{ is_expected.to be false }
53
+ end
54
+
55
+ describe 'logger' do
56
+ let( :config_key ){ :logger }
57
+
58
+ it{ is_expected.to be_a Logger }
59
+
60
+ describe 'level' do
61
+ subject{ config_value.level }
62
+
63
+ it{ is_expected.to be Logger::WARN }
64
+ end
65
+ end
66
+ end
67
+
68
+ describe 'access_token' do
69
+ context 'when set to a String' do
70
+ subject{ described_class.config.access_token }
71
+
72
+ before{ described_class.configure{ |config| config.access_token = value } }
73
+ let( :value ){ '12345' }
74
+
75
+ it{ is_expected.to eql value }
76
+ end
77
+
78
+ shared_examples_for 'invalid argument' do
79
+ subject{ ->{ described_class.configure{ |config| config.access_token = value } } }
80
+
81
+ it{ is_expected.to raise_error(ArgumentError, /expected a String/) }
82
+ end
83
+
84
+ context 'when set to a Hash' do
85
+ include_examples 'invalid argument' do
86
+ let( :value ){ { a: '123' } }
87
+ end
88
+ end
89
+
90
+ context 'when set to an Array' do
91
+ include_examples 'invalid argument' do
92
+ let( :value ){ ['123', '456'] }
93
+ end
94
+ end
95
+ end
96
+
97
+ describe 'access_tokens' do
98
+ context 'when set to a String' do
99
+ subject{ ->{ described_class.configure{ |config| config.access_tokens = '12345' } } }
100
+
101
+ it{ is_expected.to raise_error(ArgumentError, /expected a Hash or an Array/) }
102
+ end
103
+
104
+ shared_examples_for 'valid argument' do
105
+ subject{ described_class.configure{ |config| config.access_tokens = value } }
106
+
107
+ it{ is_expected.to eql( value ) }
108
+ end
109
+
110
+ context 'when set to a Hash' do
111
+ include_examples 'valid argument' do
112
+ let( :value ){ { a: '123', b: '456' } }
113
+ end
114
+ end
115
+
116
+ context 'when set to an Array' do
117
+ include_examples 'valid argument' do
118
+ let( :value ){ ['123', '456'] }
119
+ end
120
+ end
121
+ end
122
+
123
+ describe 'token_store' do
124
+ subject{ described_class.config[:token_store] }
125
+
126
+ context 'when access_token set' do
127
+ before{ described_class.configure{ |config| config.access_token = access_token } }
128
+ let( :access_token ){ '12345' }
129
+
130
+ it{ is_expected.to eql(default: access_token) }
131
+ end
132
+
133
+ context 'when access_tokens is' do
134
+ before{ described_class.configure{ |config| config.access_tokens = access_tokens } }
135
+
136
+ describe 'a Hash' do
137
+ let( :access_tokens ){ { a: '123', b: '456' } }
138
+
139
+ it{ is_expected.to eql( access_tokens ) }
140
+ end
141
+
142
+ describe 'an Array' do
143
+ let( :access_tokens ){ ['123', '456'] }
144
+
145
+ it{ is_expected.to eql( default: access_tokens ) }
146
+ end
147
+ end
148
+ end
149
+
150
+ describe 'readers for' do
151
+ describe 'debugging' do
152
+ subject{ described_class.debugging }
153
+
154
+ it 'is available' do
155
+ is_expected.to be false
156
+ end
157
+ end
158
+
159
+ describe 'logger' do
160
+ subject{ described_class.logger }
161
+
162
+ it 'is available' do
163
+ is_expected.to be_a Logger
164
+ end
165
+ end
36
166
  end
37
167
  end
@@ -7,10 +7,8 @@ require "codeclimate-test-reporter"
7
7
  require 'support/matchers'
8
8
  require 'support/helpers'
9
9
  require 'support/vcr_setup'
10
- require 'dotenv'
11
10
 
12
11
  CodeClimate::TestReporter.start
13
- Dotenv.load('.env.test')
14
12
 
15
13
  RSpec.configure do |config|
16
14
  config.run_all_when_everything_filtered = true
@@ -38,4 +36,11 @@ RSpec.configure do |config|
38
36
  config.after do
39
37
  Object.send(:remove_const, Test.remove_constants.name)
40
38
  end
39
+
40
+ # Reset configuration after each test run
41
+ config.after do
42
+ Fortnox::API::DEFAULT_CONFIGURATION.each do |key, value|
43
+ Fortnox::API.config.send("#{ key }=", value)
44
+ end
45
+ end
41
46
  end
@@ -0,0 +1,10 @@
1
+ module Helpers
2
+ module Configuration
3
+ def set_api_test_configuration
4
+ Fortnox::API.configure do |config|
5
+ config.client_secret = '9aBA8ZgsvR'
6
+ config.access_tokens = ['ccaef817-d5d8-4b1c-a316-54f3e55c5c54']
7
+ end
8
+ end
9
+ end
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fortnox-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonas Schubert Erlandsson
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-10-11 00:00:00.000000000 Z
13
+ date: 2017-12-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -26,20 +26,6 @@ dependencies:
26
26
  - - "~>"
27
27
  - !ruby/object:Gem::Version
28
28
  version: 0.14.0
29
- - !ruby/object:Gem::Dependency
30
- name: dotenv
31
- requirement: !ruby/object:Gem::Requirement
32
- requirements:
33
- - - "~>"
34
- - !ruby/object:Gem::Version
35
- version: '2.0'
36
- type: :runtime
37
- prerelease: false
38
- version_requirements: !ruby/object:Gem::Requirement
39
- requirements:
40
- - - "~>"
41
- - !ruby/object:Gem::Version
42
- version: '2.0'
43
29
  - !ruby/object:Gem::Dependency
44
30
  name: dry-struct
45
31
  requirement: !ruby/object:Gem::Requirement
@@ -243,7 +229,8 @@ description: This gem uses the HTTParty library to abstract away the REST calls.
243
229
  method.
244
230
  email:
245
231
  - jonas.schubert.erlandsson@my-codeworks.com
246
- executables: []
232
+ executables:
233
+ - console
247
234
  extensions: []
248
235
  extra_rdoc_files: []
249
236
  files:
@@ -259,15 +246,14 @@ files:
259
246
  - LICENSE.txt
260
247
  - README.md
261
248
  - Rakefile
249
+ - bin/console
262
250
  - docs/account.rb
263
251
  - docs/extraction_script.js
264
252
  - docs/generation_script.rb
265
253
  - docs/json/account.json
266
254
  - fortnox-api.gemspec
267
255
  - lib/fortnox/api.rb
268
- - lib/fortnox/api/base.rb
269
- - lib/fortnox/api/class_methods.rb
270
- - lib/fortnox/api/environment_validation.rb
256
+ - lib/fortnox/api/circular_queue.rb
271
257
  - lib/fortnox/api/mappers.rb
272
258
  - lib/fortnox/api/mappers/article.rb
273
259
  - lib/fortnox/api/mappers/base.rb
@@ -317,7 +303,6 @@ files:
317
303
  - lib/fortnox/api/types/required.rb
318
304
  - lib/fortnox/api/types/sized.rb
319
305
  - lib/fortnox/api/version.rb
320
- - spec/fortnox/api/base_spec.rb
321
306
  - spec/fortnox/api/mappers/article_spec.rb
322
307
  - spec/fortnox/api/mappers/base/from_json_spec.rb
323
308
  - spec/fortnox/api/mappers/base/to_json_spec.rb
@@ -342,6 +327,7 @@ files:
342
327
  - spec/fortnox/api/models/order_spec.rb
343
328
  - spec/fortnox/api/models/project_spec.rb
344
329
  - spec/fortnox/api/repositories/article_spec.rb
330
+ - spec/fortnox/api/repositories/base_spec.rb
345
331
  - spec/fortnox/api/repositories/customer_spec.rb
346
332
  - spec/fortnox/api/repositories/examples/all.rb
347
333
  - spec/fortnox/api/repositories/examples/find.rb
@@ -372,8 +358,8 @@ files:
372
358
  - spec/fortnox/api_spec.rb
373
359
  - spec/spec_helper.rb
374
360
  - spec/support/helpers.rb
361
+ - spec/support/helpers/configuration_helper.rb
375
362
  - spec/support/helpers/dummy_class_helper.rb
376
- - spec/support/helpers/environment_helper.rb
377
363
  - spec/support/helpers/repository_helper.rb
378
364
  - spec/support/helpers/when_performing_helper.rb
379
365
  - spec/support/matchers.rb
@@ -494,9 +480,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
494
480
  - - ">"
495
481
  - !ruby/object:Gem::Version
496
482
  version: '2.2'
497
- - - "<"
498
- - !ruby/object:Gem::Version
499
- version: '2.4'
500
483
  required_rubygems_version: !ruby/object:Gem::Requirement
501
484
  requirements:
502
485
  - - ">="
@@ -509,7 +492,6 @@ signing_key:
509
492
  specification_version: 4
510
493
  summary: Gem to use Fortnox REST API in Ruby.
511
494
  test_files:
512
- - spec/fortnox/api/base_spec.rb
513
495
  - spec/fortnox/api/mappers/article_spec.rb
514
496
  - spec/fortnox/api/mappers/base/from_json_spec.rb
515
497
  - spec/fortnox/api/mappers/base/to_json_spec.rb
@@ -534,6 +516,7 @@ test_files:
534
516
  - spec/fortnox/api/models/order_spec.rb
535
517
  - spec/fortnox/api/models/project_spec.rb
536
518
  - spec/fortnox/api/repositories/article_spec.rb
519
+ - spec/fortnox/api/repositories/base_spec.rb
537
520
  - spec/fortnox/api/repositories/customer_spec.rb
538
521
  - spec/fortnox/api/repositories/examples/all.rb
539
522
  - spec/fortnox/api/repositories/examples/find.rb
@@ -564,8 +547,8 @@ test_files:
564
547
  - spec/fortnox/api_spec.rb
565
548
  - spec/spec_helper.rb
566
549
  - spec/support/helpers.rb
550
+ - spec/support/helpers/configuration_helper.rb
567
551
  - spec/support/helpers/dummy_class_helper.rb
568
- - spec/support/helpers/environment_helper.rb
569
552
  - spec/support/helpers/repository_helper.rb
570
553
  - spec/support/helpers/when_performing_helper.rb
571
554
  - spec/support/matchers.rb
@@ -1,47 +0,0 @@
1
- require 'fortnox/api/class_methods'
2
- require 'fortnox/api/environment_validation'
3
- require 'fortnox/api/request_handling'
4
- require 'httparty'
5
-
6
- module Fortnox
7
- module API
8
- class Base
9
-
10
- include HTTParty
11
- extend Fortnox::API::ClassMethods
12
- include Fortnox::API::EnvironmentValidation
13
- include Fortnox::API::RequestHandling
14
-
15
- HTTParty::Parser::SupportedFormats[ "text/html" ] = :json
16
-
17
- DEFAULT_HEADERS = {
18
- 'Content-Type' => 'application/json',
19
- 'Accept' => 'application/json',
20
- }.freeze
21
-
22
- HTTP_METHODS = [ :get, :put, :post, :delete ].freeze
23
-
24
- attr_accessor :headers
25
-
26
- def initialize
27
- self.class.base_uri( get_base_url )
28
-
29
- self.headers = DEFAULT_HEADERS.merge({
30
- 'Client-Secret' => get_client_secret,
31
- })
32
-
33
- check_access_tokens!
34
- end
35
-
36
- HTTP_METHODS.each do |method|
37
- define_method method do |*args|
38
- self.headers['Access-Token'] = get_access_token
39
- execute do |remote|
40
- remote.send( method, *args )
41
- end
42
- end
43
- end
44
-
45
- end
46
- end
47
- end