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.
- checksums.yaml +4 -4
- data/README.md +31 -29
- data/bin/console +8 -0
- data/fortnox-api.gemspec +1 -3
- data/lib/fortnox/api.rb +49 -14
- data/lib/fortnox/api/circular_queue.rb +33 -0
- data/lib/fortnox/api/mappers.rb +1 -1
- data/lib/fortnox/api/mappers/base.rb +3 -0
- data/lib/fortnox/api/models/article.rb +25 -25
- data/lib/fortnox/api/models/customer.rb +47 -47
- data/lib/fortnox/api/models/document_base.rb +4 -4
- data/lib/fortnox/api/repositories/article.rb +3 -4
- data/lib/fortnox/api/repositories/base.rb +77 -5
- data/lib/fortnox/api/repositories/base/savers.rb +2 -2
- data/lib/fortnox/api/repositories/customer.rb +3 -4
- data/lib/fortnox/api/repositories/invoice.rb +3 -4
- data/lib/fortnox/api/repositories/order.rb +3 -4
- data/lib/fortnox/api/repositories/project.rb +3 -3
- data/lib/fortnox/api/types/document_row.rb +3 -3
- data/lib/fortnox/api/types/model.rb +2 -6
- data/lib/fortnox/api/version.rb +1 -1
- data/spec/fortnox/api/mappers/base_spec.rb +6 -0
- data/spec/fortnox/api/repositories/article_spec.rb +4 -0
- data/spec/fortnox/api/repositories/base_spec.rb +348 -0
- data/spec/fortnox/api/repositories/customer_spec.rb +4 -0
- data/spec/fortnox/api/repositories/invoice_spec.rb +4 -0
- data/spec/fortnox/api/repositories/order_spec.rb +4 -0
- data/spec/fortnox/api/repositories/project_spec.rb +4 -0
- data/spec/fortnox/api/types/examples/document_row.rb +2 -2
- data/spec/fortnox/api/types/house_work_types_spec.rb +4 -0
- data/spec/fortnox/api_spec.rb +161 -31
- data/spec/spec_helper.rb +7 -2
- data/spec/support/helpers/configuration_helper.rb +10 -0
- metadata +10 -27
- data/lib/fortnox/api/base.rb +0 -47
- data/lib/fortnox/api/class_methods.rb +0 -30
- data/lib/fortnox/api/environment_validation.rb +0 -78
- data/spec/fortnox/api/base_spec.rb +0 -167
- data/spec/support/helpers/environment_helper.rb +0 -7
@@ -1,30 +0,0 @@
|
|
1
|
-
require 'fortnox/api/environment_validation'
|
2
|
-
|
3
|
-
module Fortnox
|
4
|
-
module API
|
5
|
-
module ClassMethods
|
6
|
-
|
7
|
-
include Fortnox::API::EnvironmentValidation
|
8
|
-
|
9
|
-
def get_access_token
|
10
|
-
repository = self.new
|
11
|
-
|
12
|
-
repository.headers = {
|
13
|
-
'Content-Type' => 'application/json',
|
14
|
-
'Accept' => 'application/json',
|
15
|
-
'Authorization-Code' => get_authorization_code,
|
16
|
-
'Client-Secret' => get_client_secret,
|
17
|
-
}
|
18
|
-
|
19
|
-
response = repository.get('/')
|
20
|
-
|
21
|
-
response[ 'Authorisation' ][ 'AccessToken' ]
|
22
|
-
end
|
23
|
-
|
24
|
-
def set_headers( headers = {} )
|
25
|
-
self.headers.merge!( headers )
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
|
-
module Fortnox
|
4
|
-
module API
|
5
|
-
module EnvironmentValidation
|
6
|
-
|
7
|
-
class MissingEnvironmentVariable < ArgumentError
|
8
|
-
end
|
9
|
-
|
10
|
-
class CircularQueue
|
11
|
-
extend Forwardable
|
12
|
-
|
13
|
-
def initialize *items
|
14
|
-
@queue = [ *items ]
|
15
|
-
@@next_index = random_start_index
|
16
|
-
end
|
17
|
-
|
18
|
-
# support some general Array methods that fit Queues well
|
19
|
-
def_delegators :@queue, :new, :[], :size
|
20
|
-
|
21
|
-
def next
|
22
|
-
value = @queue[ @@next_index ]
|
23
|
-
if @@next_index == size - 1
|
24
|
-
@@next_index = 0
|
25
|
-
else
|
26
|
-
@@next_index += 1
|
27
|
-
end
|
28
|
-
return value
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def random_start_index
|
34
|
-
Random.rand(@queue.size)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def get_base_url
|
41
|
-
base_url = ENV['FORTNOX_API_BASE_URL']
|
42
|
-
fail MissingEnvironmentVariable, 'You have to provide a base url.' unless base_url
|
43
|
-
base_url
|
44
|
-
end
|
45
|
-
|
46
|
-
def get_client_secret
|
47
|
-
client_secret = ENV['FORTNOX_API_CLIENT_SECRET']
|
48
|
-
fail MissingEnvironmentVariable, 'You have to provide your client secret.' unless client_secret
|
49
|
-
client_secret
|
50
|
-
end
|
51
|
-
|
52
|
-
def get_access_token
|
53
|
-
@access_tokens ||= load_access_tokens
|
54
|
-
@access_tokens.next
|
55
|
-
end
|
56
|
-
|
57
|
-
def get_authorization_code
|
58
|
-
authorization_code = ENV['FORTNOX_API_AUTHORIZATION_CODE']
|
59
|
-
fail MissingEnvironmentVariable, 'You have to provide your authorization code.' unless authorization_code
|
60
|
-
authorization_code
|
61
|
-
end
|
62
|
-
|
63
|
-
def load_access_tokens
|
64
|
-
check_access_tokens!
|
65
|
-
access_token_string = ENV['FORTNOX_API_ACCESS_TOKEN']
|
66
|
-
access_tokens = access_token_string.split(",").map(&:strip)
|
67
|
-
CircularQueue.new( *access_tokens )
|
68
|
-
end
|
69
|
-
|
70
|
-
def check_access_tokens!
|
71
|
-
unless ENV['FORTNOX_API_ACCESS_TOKEN']
|
72
|
-
fail MissingEnvironmentVariable, 'You have to provide your access token.'
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
@@ -1,167 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'fortnox/api'
|
3
|
-
|
4
|
-
describe Fortnox::API::Base do
|
5
|
-
include Helpers::Environment
|
6
|
-
|
7
|
-
describe 'creation' do
|
8
|
-
before do
|
9
|
-
stub_environment('FORTNOX_API_BASE_URL' => nil,
|
10
|
-
'FORTNOX_API_CLIENT_SECRET' => nil,
|
11
|
-
'FORTNOX_API_ACCESS_TOKEN' => nil)
|
12
|
-
end
|
13
|
-
|
14
|
-
subject{ ->{ described_class.new() } }
|
15
|
-
|
16
|
-
context 'without FORTNOX_API_BASE_URL' do
|
17
|
-
before do
|
18
|
-
stub_environment('FORTNOX_API_BASE_URL' => nil)
|
19
|
-
end
|
20
|
-
|
21
|
-
it{ is_expected.to raise_error( ArgumentError, /base url/ ) }
|
22
|
-
end
|
23
|
-
|
24
|
-
context 'without FORTNOX_API_CLIENT_SECRET' do
|
25
|
-
before do
|
26
|
-
stub_environment('FORTNOX_API_BASE_URL' => 'xxx')
|
27
|
-
end
|
28
|
-
|
29
|
-
it{ is_expected.to raise_error( ArgumentError, /client secret/ ) }
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'without FORTNOX_API_ACCESS_TOKEN' do
|
33
|
-
before do
|
34
|
-
stub_environment('FORTNOX_API_BASE_URL' => 'xxx',
|
35
|
-
'FORTNOX_API_CLIENT_SECRET' => 'xxx')
|
36
|
-
end
|
37
|
-
|
38
|
-
it{ is_expected.to raise_error( ArgumentError, /access token/ ) }
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
context 'making a request including the proper headers' do
|
44
|
-
before do
|
45
|
-
stub_environment(
|
46
|
-
'FORTNOX_API_BASE_URL' => 'http://api.fortnox.se/3',
|
47
|
-
'FORTNOX_API_CLIENT_SECRET' => 'P5K5vE3Kun',
|
48
|
-
'FORTNOX_API_ACCESS_TOKEN' => '3f08d038-f380-4893-94a0-a08f6e60e67a'
|
49
|
-
)
|
50
|
-
|
51
|
-
stub_request(
|
52
|
-
:get,
|
53
|
-
'http://api.fortnox.se/3/test',
|
54
|
-
).with(
|
55
|
-
headers: {
|
56
|
-
'Access-Token' => '3f08d038-f380-4893-94a0-a08f6e60e67a',
|
57
|
-
'Client-Secret' => 'P5K5vE3Kun',
|
58
|
-
'Content-Type' => 'application/json',
|
59
|
-
'Accept' => 'application/json',
|
60
|
-
}
|
61
|
-
).to_return(
|
62
|
-
status: 200
|
63
|
-
)
|
64
|
-
end
|
65
|
-
|
66
|
-
subject{ described_class.new.get( '/test', { body: '' }) }
|
67
|
-
|
68
|
-
it{ is_expected.to be_nil }
|
69
|
-
end
|
70
|
-
|
71
|
-
describe 'making requests with multiple access tokens' do
|
72
|
-
|
73
|
-
before do
|
74
|
-
stub_environment(
|
75
|
-
'FORTNOX_API_BASE_URL' => 'http://api.fortnox.se/3',
|
76
|
-
'FORTNOX_API_CLIENT_SECRET' => 'P5K5vE3Kun',
|
77
|
-
'FORTNOX_API_ACCESS_TOKEN' => '3f08d038-f380-4893-94a0-a08f6e60e67a,aaee8217-0bbd-2e16-441f-668931d582cd'
|
78
|
-
)
|
79
|
-
|
80
|
-
stub_request(
|
81
|
-
:get,
|
82
|
-
'http://api.fortnox.se/3/test',
|
83
|
-
).with(
|
84
|
-
headers: {
|
85
|
-
'Access-Token' => '3f08d038-f380-4893-94a0-a08f6e60e67a',
|
86
|
-
'Client-Secret' => 'P5K5vE3Kun',
|
87
|
-
'Content-Type' => 'application/json',
|
88
|
-
'Accept' => 'application/json',
|
89
|
-
}
|
90
|
-
).to_return(
|
91
|
-
status: 200,
|
92
|
-
body: '1'
|
93
|
-
)
|
94
|
-
|
95
|
-
stub_request(
|
96
|
-
:get,
|
97
|
-
'http://api.fortnox.se/3/test',
|
98
|
-
).with(
|
99
|
-
headers: {
|
100
|
-
'Access-Token' => 'aaee8217-0bbd-2e16-441f-668931d582cd',
|
101
|
-
'Client-Secret' => 'P5K5vE3Kun',
|
102
|
-
'Content-Type' => 'application/json',
|
103
|
-
'Accept' => 'application/json',
|
104
|
-
}
|
105
|
-
).to_return(
|
106
|
-
status: 200,
|
107
|
-
body: '2'
|
108
|
-
)
|
109
|
-
end
|
110
|
-
|
111
|
-
context 'with subsequent requests on same object' do
|
112
|
-
let!(:response1){ api.get( '/test', body: '' ) }
|
113
|
-
let!(:response2){ api.get( '/test', body: '' ) }
|
114
|
-
let!(:response3){ api.get( '/test', body: '' ) }
|
115
|
-
|
116
|
-
let(:api){ described_class.new }
|
117
|
-
|
118
|
-
# rubocop:disable RSpec/MultipleExpectations
|
119
|
-
# All these checks must be run in same it-statement because
|
120
|
-
# of the random starting index.
|
121
|
-
it 'works' do
|
122
|
-
expect(response1).not_to eq( response2 )
|
123
|
-
expect(response1).to eq( response3 )
|
124
|
-
expect(response3).not_to eq( response2 )
|
125
|
-
end
|
126
|
-
# rubocop:enable RSpec/MultipleExpectations
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
context 'raising error from remote server' do
|
131
|
-
|
132
|
-
before do
|
133
|
-
stub_environment(
|
134
|
-
'FORTNOX_API_BASE_URL' => 'http://api.fortnox.se/3',
|
135
|
-
'FORTNOX_API_CLIENT_SECRET' => 'P5K5vE3Kun',
|
136
|
-
'FORTNOX_API_ACCESS_TOKEN' => '3f08d038-f380-4893-94a0-a08f6e60e67a'
|
137
|
-
)
|
138
|
-
|
139
|
-
stub_request(
|
140
|
-
:post,
|
141
|
-
'http://api.fortnox.se/3/test',
|
142
|
-
).to_return(
|
143
|
-
status: 500,
|
144
|
-
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,
|
145
|
-
headers: { 'Content-Type' => 'application/json' },
|
146
|
-
)
|
147
|
-
end
|
148
|
-
|
149
|
-
subject{ ->{ described_class.new.post( '/test', { body: '' }) } }
|
150
|
-
|
151
|
-
it{ is_expected.to raise_error( Fortnox::API::RemoteServerError ) }
|
152
|
-
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' ) }
|
153
|
-
|
154
|
-
context 'with debugging enabled' do
|
155
|
-
|
156
|
-
around do |example|
|
157
|
-
Fortnox::API.debugging = true
|
158
|
-
example.run
|
159
|
-
Fortnox::API.debugging = false
|
160
|
-
end
|
161
|
-
|
162
|
-
it{ is_expected.to raise_error( /\<HTTParty\:\:Request\:0x/ ) }
|
163
|
-
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
end
|