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