sk_sdk 0.0.8 → 0.1.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.
- data/README.rdoc +20 -15
- data/VERSION +1 -1
- data/ci/Gemfile_ar2.lock +34 -0
- data/lib/sk_sdk/{README_Base.rdoc → README.rdoc} +126 -11
- data/lib/sk_sdk/ar_patches/ar3/base.rb +6 -4
- data/lib/sk_sdk/base.rb +10 -3
- data/lib/sk_sdk/omni_auth/README.rdoc +1 -1
- data/sk_sdk.gemspec +5 -4
- data/spec/resources_spec_helper.rb +10 -9
- data/spec/settings.yml.default +14 -0
- data/spec/sk_sdk/base_spec.rb +11 -1
- data/spec/sk_sdk/oauth_spec.rb +1 -1
- data/spec/sk_sdk/resources/clients_spec.rb +0 -1
- data/spec/sk_sdk/resources/credit_note_spec.rb +42 -3
- data/spec/sk_sdk/resources/invoice_spec.rb +18 -7
- data/spec/sk_sdk/resources/product_spec.rb +5 -2
- data/spec/sk_sdk/signed_request_spec.rb +1 -1
- data/spec/sk_sdk/sync_field_spec.rb +1 -1
- data/spec/sk_sdk/sync_spec.rb +1 -2
- data/spec/spec_helper.rb +14 -2
- metadata +7 -6
- data/spec/settings.yml +0 -7
data/README.rdoc
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
= SalesKing SDK
|
2
2
|
|
3
|
-
|
4
|
-
and
|
3
|
+
Automate your workflow's by integrating and connecting your business with SalesKing.
|
4
|
+
This Ruby Software-Development-Kit provides solid and handy tools for building
|
5
|
+
SalesKing App's(using oAuth2) and API clients.
|
5
6
|
|
6
7
|
|
7
8
|
== Install
|
@@ -11,7 +12,7 @@ and the API.
|
|
11
12
|
Dependencies (gem's):
|
12
13
|
|
13
14
|
* activesupport
|
14
|
-
* activeresource
|
15
|
+
* activeresource v2.3.x, v3.1 (v3.0.10 until sk_sdk v0.0.8)
|
15
16
|
* curb
|
16
17
|
* sk_api_schema
|
17
18
|
|
@@ -22,26 +23,27 @@ All classes must be explicitly required so each can be used on their own.
|
|
22
23
|
require 'sk_sdk/signed_request'
|
23
24
|
require 'sk_sdk/oauth'
|
24
25
|
require 'sk_sdk/base'
|
26
|
+
require 'sk_sdk/sync'
|
25
27
|
|
26
|
-
=== API client
|
28
|
+
=== API client
|
27
29
|
|
28
|
-
Uses ActiveResource to CRUD SalesKing object's {see usage in README}[https://github.com/salesking/sk_sdk/blob/master/lib/sk_sdk/
|
30
|
+
Uses ActiveResource to CRUD SalesKing object's {see usage in README}[https://github.com/salesking/sk_sdk/blob/master/lib/sk_sdk/]
|
29
31
|
|
30
|
-
=== oAuth
|
32
|
+
=== {oAuth}[https://github.com/salesking/sk_sdk/blob/master/lib/sk_sdk/oauth.rb]
|
31
33
|
|
32
|
-
|
33
|
-
There also is an omniAuth strategy
|
34
|
+
Get an oAuth2 access token and create oAuth related URL's.
|
35
|
+
There also is an {omniAuth strategy}[https://github.com/salesking/sk_sdk/blob/master/lib/sk_sdk/omni_auth].
|
34
36
|
|
35
|
-
=== SignedRequest
|
37
|
+
=== {SignedRequest}[https://github.com/salesking/sk_sdk/blob/master/lib/sk_sdk/signed_request.rb]
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
+
De/encoding of signed_request parameter on canvas pages and PubSub/Webhook
|
40
|
+
callbacks.
|
39
41
|
|
40
|
-
=== Sync
|
42
|
+
=== {Sync}[https://github.com/salesking/sk_sdk/blob/master/lib/sk_sdk/sync.rb]
|
41
43
|
|
42
|
-
Synchronize a local with an remote object. Tackles the problem
|
43
|
-
objects to match internal data structures. Synchronization is
|
44
|
-
field-mapping
|
44
|
+
Map & Synchronize fields of a local with an remote object. Tackles the problem
|
45
|
+
of normalizing objects to match internal data structures. Synchronization is
|
46
|
+
done by a field-mapping and also sports transition methods for each way.
|
45
47
|
|
46
48
|
== Usage
|
47
49
|
|
@@ -53,6 +55,9 @@ Before you run the tests use bundler to install all required gems:
|
|
53
55
|
# git clone
|
54
56
|
# cd into dir
|
55
57
|
BUNDLE_GEMFILE=ci/Gemfile bundle install
|
58
|
+
|
59
|
+
# create /spec/settingsyml from default
|
60
|
+
# run specs with most recent version of activeresource
|
56
61
|
BUNDLE_GEMFILE=ci/Gemfile bundle exec rake spec
|
57
62
|
|
58
63
|
Copyright (c) 2011 Georg Leciejewski, released under the MIT license
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
data/ci/Gemfile_ar2.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activeresource (2.3.14)
|
5
|
+
activesupport (= 2.3.14)
|
6
|
+
activesupport (2.3.14)
|
7
|
+
curb (0.7.15)
|
8
|
+
diff-lcs (1.1.3)
|
9
|
+
rake (0.9.2)
|
10
|
+
rcov (0.9.10)
|
11
|
+
rdoc (3.9.4)
|
12
|
+
rspec (2.6.0)
|
13
|
+
rspec-core (~> 2.6.0)
|
14
|
+
rspec-expectations (~> 2.6.0)
|
15
|
+
rspec-mocks (~> 2.6.0)
|
16
|
+
rspec-core (2.6.4)
|
17
|
+
rspec-expectations (2.6.0)
|
18
|
+
diff-lcs (~> 1.1.2)
|
19
|
+
rspec-mocks (2.6.0)
|
20
|
+
sk_api_schema (0.2.4)
|
21
|
+
activesupport
|
22
|
+
|
23
|
+
PLATFORMS
|
24
|
+
ruby
|
25
|
+
|
26
|
+
DEPENDENCIES
|
27
|
+
activeresource (= 2.3.14)
|
28
|
+
activesupport (= 2.3.14)
|
29
|
+
curb
|
30
|
+
rake
|
31
|
+
rcov
|
32
|
+
rdoc
|
33
|
+
rspec
|
34
|
+
sk_api_schema
|
@@ -1,4 +1,4 @@
|
|
1
|
-
= SalesKing API Client
|
1
|
+
= SalesKing API Client - SK::SDK::Base
|
2
2
|
|
3
3
|
Easily access SalesKing resources in a RESTfull way with this ActiveResource
|
4
4
|
based SalesKing API client.
|
@@ -33,9 +33,12 @@ per api client and restrict his rights with our role-system!
|
|
33
33
|
Getting an access_token or checking is validity is not the scope of this
|
34
34
|
library, it merely sets an AUTHORIZATION header if you added a token in the
|
35
35
|
connection settings.
|
36
|
+
|
36
37
|
AUTHORIZATION: Bearer YourAccessToken
|
37
|
-
|
38
|
-
|
38
|
+
|
39
|
+
More on oAuth here:
|
40
|
+
* {oAuth helper class}[https://github.com/salesking/sk_sdk/blob/master/lib/sk_sdk/oauth.rb]
|
41
|
+
* {oAuth docs}[http://dev.blog.salesking.eu/docs/authentication/].
|
39
42
|
|
40
43
|
== Usage
|
41
44
|
|
@@ -43,14 +46,23 @@ SalesKing's api interface is RESTful(mostly) and returns & accepts JSON data.
|
|
43
46
|
All resources such as clients, invoices, products can be accessed via URL's
|
44
47
|
through standard HTTP methods GET, POST, PUT and DELETE.
|
45
48
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
+
== Available resources, properties and links
|
50
|
+
|
51
|
+
All objects and their endpoints are described in a json schema. You should read
|
52
|
+
it and especially take a look at the schema's link section, where you can find
|
53
|
+
available endpoints(urls), their nesting and parameters.
|
54
|
+
|
55
|
+
* {JSON-Schema }[https://github.com/salesking/sk_api_schema/tree/master/json]
|
56
|
+
* {API Browser visualized JSON Schema}[http://sk-api-browser.heroku.com/]
|
49
57
|
|
50
|
-
|
58
|
+
== Class creation
|
59
|
+
|
60
|
+
Your classes simply descend from SK::SDK::Base and you need to add connection settings(site URL+user+passwd).
|
51
61
|
You MUST provide the full URL using the right protocol in the connection and
|
52
|
-
remember
|
62
|
+
remember we only support HTTPS:
|
53
63
|
https + SUBDomain + salesking url + /api
|
64
|
+
=>
|
65
|
+
https://my_company.salesking.eu/api
|
54
66
|
|
55
67
|
Create a single class
|
56
68
|
|
@@ -59,7 +71,7 @@ Create a single class
|
|
59
71
|
class Client < SK::SDK::Base;end
|
60
72
|
|
61
73
|
# connection using BasicAuth
|
62
|
-
Client.set_connection {:site => 'https://my_sub.salesking.eu/api',
|
74
|
+
Client.set_connection( {:site => 'https://my_sub.salesking.eu/api',
|
63
75
|
:user => 'my-users@login-email.com',
|
64
76
|
:password => 'password' })
|
65
77
|
|
@@ -67,7 +79,6 @@ Create a single class
|
|
67
79
|
client.first_name = "Bill"
|
68
80
|
client.save
|
69
81
|
|
70
|
-
|
71
82
|
Create multiple classes at once
|
72
83
|
|
73
84
|
require 'sk_sdk/base'
|
@@ -77,7 +88,7 @@ Create multiple classes at once
|
|
77
88
|
end
|
78
89
|
|
79
90
|
# connection using oAuth access token
|
80
|
-
SK::SDK::Base.set_connection {:site => 'https://my_sub.salesking.eu/api',
|
91
|
+
SK::SDK::Base.set_connection( {:site => 'https://my_sub.salesking.eu/api',
|
81
92
|
:token => 'someAccessToken'})
|
82
93
|
|
83
94
|
invoice = Invoice.new
|
@@ -90,16 +101,120 @@ Create multiple classes at once
|
|
90
101
|
invoice.save
|
91
102
|
|
92
103
|
|
104
|
+
== Quick start - Basic's
|
105
|
+
|
106
|
+
To give it quick shot, point your browser to my-account.salesking.eu/api/clients.json
|
107
|
+
(while beeing logged in) and you will see the JSON in the response.
|
108
|
+
This is an example of a GET-request issued by your browser.
|
109
|
+
|
110
|
+
Or use CURL, if you prefer the command line:
|
111
|
+
|
112
|
+
curl -u your@login-mail.com:password \
|
113
|
+
https://demo.salesking.eu/clients
|
114
|
+
|
115
|
+
Request Method overview:
|
116
|
+
GET => read
|
117
|
+
POST => create new data
|
118
|
+
PUT => update data
|
119
|
+
DELETE => delete data
|
120
|
+
|
93
121
|
Want to know more about REST style webservices?
|
94
122
|
* http://en.wikipedia.org/wiki/Representational_State_Transfer
|
95
123
|
* http://www.google.com/search?q=REST+site%3Awww.infoq.com
|
96
124
|
|
125
|
+
=== GET / Show
|
126
|
+
|
127
|
+
A list of resources:
|
128
|
+
GET xy.salesking.eu/api/invoices
|
129
|
+
|
130
|
+
A single resource
|
131
|
+
GET xy.salesking.eu/invoices/:id
|
132
|
+
|
133
|
+
Returned JSON data for a listings, abbreviated:
|
134
|
+
{
|
135
|
+
"clients": [ # array of resources => clients
|
136
|
+
{ "client": { # a single resource
|
137
|
+
"number": "0800013", ..
|
138
|
+
"links":{} #links for the resource
|
139
|
+
}, ...
|
140
|
+
],
|
141
|
+
collection": { # info on index pages
|
142
|
+
"total_pages": 1,
|
143
|
+
"total_entries": 3,
|
144
|
+
"current_page": 1,
|
145
|
+
"per_page": 30
|
146
|
+
},
|
147
|
+
"links": { # links for the collection
|
148
|
+
"prev": "/api/clients?page=0",
|
149
|
+
"next": "/api/clients?page=2",
|
150
|
+
"self": "/api/clients?page=1"
|
151
|
+
},
|
152
|
+
}
|
153
|
+
|
154
|
+
=== Filtering
|
155
|
+
|
156
|
+
Filtering is achieved by using the url filter[xy] param. Following some examples.
|
157
|
+
Available filters are defined in each json-schema's instances link ({see invoices}[https://github.com/salesking/sk_api_schema/blob/master/json/v1.0/invoice.json#L156])
|
158
|
+
|
159
|
+
#Find objects by tags
|
160
|
+
GET xy.salesking.eu/api/invoices?filter[tags]=Agentur
|
161
|
+
|
162
|
+
# find all objects without tags
|
163
|
+
GET xy.salesking.eu/api/invoices?filter[exclude_tags]=Agentur Grafik
|
164
|
+
|
165
|
+
# q-wildcard search in several fields
|
166
|
+
GET xy.salesking.eu/api/invoices?filter[q]=0815&per_page=40
|
167
|
+
|
168
|
+
# find all documents for one or more client
|
169
|
+
GET xy.salesking.eu/api/documents?filter[client_ids]=:id,:id
|
170
|
+
|
171
|
+
=== POST / Create
|
172
|
+
|
173
|
+
To create a resource make a POST request containing the json for a single resource.
|
174
|
+
|
175
|
+
Header: content-type application/json
|
176
|
+
POST https://my-sub.salesking.eu/invoices.json
|
177
|
+
|
178
|
+
{"invoice": {
|
179
|
+
"title": "Your service subscription 2011",
|
180
|
+
"line_items": [ {
|
181
|
+
"line_item": {
|
182
|
+
"quantity_unit": "Month",
|
183
|
+
"tax": 19,
|
184
|
+
"price_single": 10.23,
|
185
|
+
"position": 1,
|
186
|
+
"quantity": 12,
|
187
|
+
"name": "SalesKing Bronze Account"
|
188
|
+
}
|
189
|
+
} ]
|
190
|
+
}}
|
191
|
+
|
192
|
+
=== PUT / Update
|
193
|
+
|
194
|
+
Header: content-type application/json
|
195
|
+
PUT /api/clients/:id
|
196
|
+
{
|
197
|
+
'client':
|
198
|
+
{
|
199
|
+
'gender':'male',
|
200
|
+
'first_name': "Andrew"
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
=== DELETE
|
205
|
+
|
206
|
+
A DELETE request to a resource url deletes and returns the deleted object:
|
207
|
+
|
208
|
+
DELETE https://demo.salesking.eu/clients/:id
|
209
|
+
|
97
210
|
== Hints on ActiveResource
|
98
211
|
|
99
212
|
* Most of the magic is coming from ActiveResource so you should read {its README and code}[https://github.com/rails/rails/tree/master/activeresource]
|
100
213
|
* This client does NOT rely on parsing the JSON Schema, since ActiveResource(AR) creates the Getter/Setter methods.
|
101
214
|
* We added some patches for AR to fix JSON parsing issues, due to our nesting.
|
102
215
|
* non-restful routes can be accessed by custom methods {see examples in AR}[https://github.com/rails/rails/blob/master/activeresource/lib/active_resource/custom_methods.rb]
|
216
|
+
|
217
|
+
E.g calling the print method a a document:
|
103
218
|
Invoice.find('uuid').post(:print, :template_id => 'pdf-template-uuid')
|
104
219
|
|
105
220
|
== Tutorials & Tools
|
@@ -1,19 +1,21 @@
|
|
1
1
|
module ActiveResource
|
2
|
-
# Overridden methods to suit SalesKing
|
3
|
-
#
|
2
|
+
# Overridden methods to suit SalesKing's nested json format
|
3
|
+
# only valid for AR 3.1
|
4
|
+
# In the future might add a custom format class, see base.format
|
4
5
|
class Base
|
5
6
|
|
6
7
|
# override ARes method to parse only the client part
|
7
8
|
def load_attributes_from_response(response)
|
8
|
-
if response['Content-Length'] != "0" && response.body.strip.size > 0
|
9
|
+
if !response['Content-Length'].blank? && response['Content-Length'] != "0" && !response.body.nil? && response.body.strip.size > 0
|
9
10
|
load( self.class.format.decode(response.body)[self.class.element_name] )
|
11
|
+
@persisted = true
|
10
12
|
end
|
11
13
|
end
|
12
14
|
|
13
15
|
# Overridden to grab the data(= clients-collection) from json:
|
14
16
|
# { 'collection'=> will_paginate infos,
|
15
17
|
# 'links' => prev/next links
|
16
|
-
# 'clients'=> [data],
|
18
|
+
# 'clients'=> [data], << what we need
|
17
19
|
# }
|
18
20
|
def self.instantiate_collection(collection, prefix_options = {})
|
19
21
|
collection = collection[ self.element_name.pluralize ] if collection.is_a?(Hash)
|
data/lib/sk_sdk/base.rb
CHANGED
@@ -15,9 +15,16 @@ class SK::SDK::Base < ActiveResource::Base
|
|
15
15
|
self.format = :json
|
16
16
|
# hook before init in activeresource base because json comes in nested:
|
17
17
|
# {client={data}
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
if ActiveResource::VERSION::MAJOR == 3 #TODO Damn this is dirty .. we really need to get rid of backwards compat
|
19
|
+
def initialize(attributes = {}, *args)
|
20
|
+
attr = attributes[self.class.element_name] || attributes
|
21
|
+
super(attr, *args)
|
22
|
+
end
|
23
|
+
else
|
24
|
+
def initialize(attributes = {})
|
25
|
+
attr = attributes[self.class.element_name] || attributes
|
26
|
+
super(attr)
|
27
|
+
end
|
21
28
|
end
|
22
29
|
|
23
30
|
def save; save_with_validation; end
|
@@ -21,7 +21,7 @@ If you are using bundler add to Gemfile
|
|
21
21
|
|
22
22
|
== Usage
|
23
23
|
|
24
|
-
An initializers/omniauth.rb might look
|
24
|
+
An initializers/omniauth.rb might look something like this:
|
25
25
|
# if you copied the file into your lib/
|
26
26
|
require File.expand_path('../../../lib/sk_auth', __FILE__)
|
27
27
|
# or from gem
|
data/sk_sdk.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{sk_sdk}
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Georg Leciejewski"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-10-03}
|
13
13
|
s.description = %q{Connect your business world with SalesKing. This gem gives ruby developers a jump-start for building SalesKing Business Apps. It provides classes to handle oAuth, make RESTfull API requests and parses JSON Schema }
|
14
14
|
s.email = %q{gl@salesking.eu}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -21,8 +21,9 @@ Gem::Specification.new do |s|
|
|
21
21
|
"Rakefile",
|
22
22
|
"VERSION",
|
23
23
|
"ci/Gemfile",
|
24
|
+
"ci/Gemfile_ar2.lock",
|
24
25
|
"lib/sk_sdk.rb",
|
25
|
-
"lib/sk_sdk/
|
26
|
+
"lib/sk_sdk/README.rdoc",
|
26
27
|
"lib/sk_sdk/ar_patches/ar2/base.rb",
|
27
28
|
"lib/sk_sdk/ar_patches/ar2/validations.rb",
|
28
29
|
"lib/sk_sdk/ar_patches/ar3/base.rb",
|
@@ -35,7 +36,7 @@ Gem::Specification.new do |s|
|
|
35
36
|
"lib/sk_sdk/sync.rb",
|
36
37
|
"sk_sdk.gemspec",
|
37
38
|
"spec/resources_spec_helper.rb",
|
38
|
-
"spec/settings.yml",
|
39
|
+
"spec/settings.yml.default",
|
39
40
|
"spec/sk_sdk/base_spec.rb",
|
40
41
|
"spec/sk_sdk/oauth_spec.rb",
|
41
42
|
"spec/sk_sdk/resources/README.rdoc",
|
@@ -1,16 +1,9 @@
|
|
1
|
-
|
2
|
-
:site => "https://demo.dev.salesking.eu/api/",
|
3
|
-
:password => "demouser",
|
4
|
-
# :site => "http://demo.salesking.local:3000/api/",
|
5
|
-
# :password => "demo",
|
6
|
-
:user => "demo@salesking.eu"
|
7
|
-
} unless defined?(CONNECTION)
|
8
|
-
|
1
|
+
require 'spec_helper'
|
9
2
|
# create all classes and set their connection
|
10
3
|
%w[Client Address CreditNote Invoice Product LineItem User].each do |model|
|
11
4
|
eval "class #{model} < SK::SDK::Base;end" unless Object.const_defined?(model)
|
12
5
|
end
|
13
|
-
SK::SDK::Base.set_connection
|
6
|
+
SK::SDK::Base.set_connection basic_auth_settings
|
14
7
|
|
15
8
|
# check if a SalesKing instance is available by calling /users/current.json
|
16
9
|
def sk_available?
|
@@ -22,6 +15,14 @@ def sk_available?
|
|
22
15
|
|
23
16
|
end
|
24
17
|
|
18
|
+
# Params
|
19
|
+
# obj<Class>:: class name
|
20
|
+
# number<String>:: the document number the kick
|
21
|
+
def kick_existing(obj, number)
|
22
|
+
if existing = obj.find(:first, :params =>{ :filter=>{ :number => number } })
|
23
|
+
existing.destroy
|
24
|
+
end
|
25
|
+
end
|
25
26
|
|
26
27
|
def delete_test_data(doc, client)
|
27
28
|
doc.destroy
|
@@ -0,0 +1,14 @@
|
|
1
|
+
oauth:
|
2
|
+
sk_url: http://*.horsts-lokal.local
|
3
|
+
canvas_slug: canvas-page
|
4
|
+
id: 2d83d570635ee19c
|
5
|
+
secret: eb4005858e4947e4228a12a6b7306ee0
|
6
|
+
redirect_url: http://localhorst:4567
|
7
|
+
scope: "api/payments:read api/invoices:read"
|
8
|
+
session_secret: very_long_random_to_encode_the_session
|
9
|
+
|
10
|
+
# used in resources spec
|
11
|
+
basic_auth:
|
12
|
+
site: "https://SUBDOMAIN.dev.salesking.eu/api/"
|
13
|
+
password: "your password"
|
14
|
+
user: "your login email address"
|
data/spec/sk_sdk/base_spec.rb
CHANGED
@@ -35,4 +35,14 @@ describe SK::SDK::Base, "make new class" do
|
|
35
35
|
p.new_record?.should be_true
|
36
36
|
end
|
37
37
|
|
38
|
-
|
38
|
+
it "should allow multiple parameters in initializer" do
|
39
|
+
expect {
|
40
|
+
if ActiveResource::VERSION::MAJOR == 3
|
41
|
+
Client.new({ :first_name => 'herbert' }, true)
|
42
|
+
else
|
43
|
+
Client.new({ :first_name => 'herbert' })
|
44
|
+
end
|
45
|
+
}.should_not raise_error(ArgumentError)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/spec/sk_sdk/oauth_spec.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'spec_helper'
|
2
1
|
require 'resources_spec_helper'
|
3
2
|
|
4
3
|
unless sk_available?
|
@@ -37,12 +36,17 @@ else
|
|
37
36
|
end
|
38
37
|
|
39
38
|
it "should fail create a doc without unique number" do
|
39
|
+
kick_existing(CreditNote, '001')
|
40
40
|
doc = CreditNote.new(:number=>'001')
|
41
41
|
doc.save.should == true
|
42
42
|
doc2 = CreditNote.new(:number=>'001')
|
43
43
|
doc2.save.should == false
|
44
44
|
doc2.errors.count.should == 2
|
45
|
-
doc2.errors.on
|
45
|
+
if doc2.errors.respond_to? :on # TODO kick with AR 2.3
|
46
|
+
doc2.errors.on(:number).should == "has already been taken"
|
47
|
+
else
|
48
|
+
doc2.errors[:number].should == ["has already been taken"]
|
49
|
+
end
|
46
50
|
doc.destroy
|
47
51
|
end
|
48
52
|
|
@@ -62,12 +66,17 @@ else
|
|
62
66
|
end
|
63
67
|
|
64
68
|
it "should fail edit with wrong number" do
|
69
|
+
kick_existing(CreditNote, '002')
|
65
70
|
doc1 = CreditNote.new(:number=>'002')
|
66
71
|
doc1.save.should == true
|
67
72
|
@doc.number = '002'
|
68
73
|
@doc.save.should == false
|
69
74
|
@doc.errors.count.should == 2
|
70
|
-
@doc.errors.on
|
75
|
+
if @doc.errors.respond_to? :on # TODO kick with AR 2.3
|
76
|
+
@doc.errors.on(:number).should == "has already been taken"
|
77
|
+
else
|
78
|
+
@doc.errors[:number].should == ["has already been taken"]
|
79
|
+
end
|
71
80
|
doc1.destroy
|
72
81
|
end
|
73
82
|
end
|
@@ -116,4 +125,34 @@ else
|
|
116
125
|
# @doc.line_items.[1].zip.should == '40001'
|
117
126
|
end
|
118
127
|
end
|
128
|
+
|
129
|
+
describe CreditNote, "with status change" do
|
130
|
+
|
131
|
+
before :all do
|
132
|
+
@doc = CreditNote.new :title => 'Status test'
|
133
|
+
end
|
134
|
+
|
135
|
+
after :all do
|
136
|
+
# @doc.destroy
|
137
|
+
# lambda {
|
138
|
+
# doc = CreditNote.find(@doc.id)
|
139
|
+
# }.should raise_error(ActiveResource::ResourceNotFound)
|
140
|
+
end
|
141
|
+
|
142
|
+
it "should update from draft to open and set number with date" do
|
143
|
+
@doc.save.should be_true
|
144
|
+
@doc.status.should == 'draft'
|
145
|
+
|
146
|
+
@doc.status = 'open'
|
147
|
+
@doc.save
|
148
|
+
@doc.status.should == 'open'
|
149
|
+
@doc.number.should_not be_empty
|
150
|
+
@doc.date.to_s.should_not be_empty
|
151
|
+
# make draft to be deleted
|
152
|
+
@doc.status = 'draft'
|
153
|
+
@doc.save
|
154
|
+
@doc.destroy
|
155
|
+
end
|
156
|
+
|
157
|
+
end
|
119
158
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'spec_helper'
|
1
|
+
#require 'spec_helper'
|
2
2
|
require 'resources_spec_helper'
|
3
3
|
|
4
4
|
unless sk_available?
|
@@ -37,12 +37,12 @@ describe Invoice, "a new invoice" do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it "should create a doc" do
|
40
|
-
doc = Invoice.new
|
40
|
+
doc = Invoice.new
|
41
41
|
doc.title = 'A Document from the API'
|
42
42
|
doc.notes_before = 'Your shiny new invoice [number]'
|
43
43
|
doc.notes_after = 'Please pay me'
|
44
44
|
doc.client_id = @client.id
|
45
|
-
doc.save
|
45
|
+
doc.save.should be_true
|
46
46
|
doc.errors.should be_empty
|
47
47
|
doc.new?.should be_false
|
48
48
|
doc.notes_before.should == 'Your shiny new invoice [number]'
|
@@ -50,7 +50,7 @@ describe Invoice, "a new invoice" do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should create a doc with default before after texts" do
|
53
|
-
doc = Invoice.new
|
53
|
+
doc = Invoice.new
|
54
54
|
doc.title = 'A Document from the API'
|
55
55
|
doc.client_id = @client.id
|
56
56
|
doc.save
|
@@ -61,12 +61,18 @@ describe Invoice, "a new invoice" do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should fail create a doc without unique number" do
|
64
|
+
# if a test failed this invoice might still be present so try to delete
|
65
|
+
kick_existing(Invoice, '001')
|
64
66
|
doc = Invoice.new(:number=>'001')
|
65
67
|
doc.save.should == true
|
66
68
|
doc2 = Invoice.new(:number=>'001')
|
67
69
|
doc2.save.should == false
|
68
70
|
doc2.errors.count.should == 2
|
69
|
-
doc2.errors.on
|
71
|
+
if doc2.errors.respond_to? :on
|
72
|
+
doc2.errors.on(:number).should == "has already been taken"
|
73
|
+
else
|
74
|
+
doc2.errors[:number].should == ["has already been taken"]
|
75
|
+
end
|
70
76
|
doc.destroy
|
71
77
|
end
|
72
78
|
|
@@ -79,7 +85,7 @@ describe Invoice, "Edit an invoice" do
|
|
79
85
|
# create client
|
80
86
|
@client = Client.new(:organisation=>'Invoice API-Tester')
|
81
87
|
@client.save.should be_true
|
82
|
-
@doc = Invoice.new
|
88
|
+
@doc = Invoice.new
|
83
89
|
@doc.title = 'A Document from the API'
|
84
90
|
@doc.notes_before = 'Your invoice [number]'
|
85
91
|
@doc.client_id = @client.id
|
@@ -103,12 +109,17 @@ describe Invoice, "Edit an invoice" do
|
|
103
109
|
end
|
104
110
|
|
105
111
|
it "should fail edit with wrong number" do
|
112
|
+
kick_existing(Invoice, '002')
|
106
113
|
doc1 = Invoice.new(:number=>'002')
|
107
114
|
doc1.save.should == true
|
108
115
|
@doc.number = '002'
|
109
116
|
@doc.save.should == false
|
110
117
|
@doc.errors.count.should == 2
|
111
|
-
@doc.errors.on
|
118
|
+
if @doc.errors.respond_to? :on # TODO kick with AR 2.3
|
119
|
+
@doc.errors.on(:number).should == "has already been taken"
|
120
|
+
else
|
121
|
+
@doc.errors[:number].should == ["has already been taken"]
|
122
|
+
end
|
112
123
|
doc1.destroy
|
113
124
|
end
|
114
125
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'spec_helper'
|
2
1
|
require 'resources_spec_helper'
|
3
2
|
|
4
3
|
unless sk_available?
|
@@ -56,7 +55,11 @@ else
|
|
56
55
|
@product.name = ''
|
57
56
|
@product.save.should == false
|
58
57
|
@product.errors.count.should == 1
|
59
|
-
@product.errors.on
|
58
|
+
if @product.errors.respond_to? :on # TODO kick with AR 2.3
|
59
|
+
@product.errors.on(:name).should == "can't be blank"
|
60
|
+
else
|
61
|
+
@product.errors[:name].should == ["can't be blank"]
|
62
|
+
end
|
60
63
|
end
|
61
64
|
|
62
65
|
end
|
@@ -4,7 +4,7 @@ describe SK::SDK::SignedRequest, "in general" do
|
|
4
4
|
|
5
5
|
before :each do
|
6
6
|
#setup test oAuth-data to work with
|
7
|
-
|
7
|
+
@set = oauth_settings
|
8
8
|
# fake request
|
9
9
|
@param_hash = {'hello' =>'coder', 'algorithm' => 'HMAC-SHA256'}
|
10
10
|
@param = SK::SDK::SignedRequest.signed_param( ActiveSupport::JSON.encode(@param_hash), @set['secret'] )
|
data/spec/sk_sdk/sync_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -13,6 +13,18 @@ require "#{File.dirname(__FILE__)}/../lib/sk_sdk/signed_request"
|
|
13
13
|
puts "Testing with ActiveResource v: #{ActiveResource::VERSION::STRING}"
|
14
14
|
|
15
15
|
|
16
|
-
def
|
17
|
-
|
16
|
+
def basic_auth_settings
|
17
|
+
get_settings['basic_auth'].symbolize_keys
|
18
|
+
end
|
19
|
+
|
20
|
+
def oauth_settings
|
21
|
+
get_settings['oauth']
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_settings
|
25
|
+
@settings ||= begin
|
26
|
+
YAML.load_file(File.join(File.dirname(__FILE__), 'settings.yml'))
|
27
|
+
rescue => e
|
28
|
+
puts "Missing settings.yml in rails_root/spec/settings.yml"
|
29
|
+
end
|
18
30
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sk_sdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.8
|
10
|
+
version: 0.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Georg Leciejewski
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-10-03 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -116,8 +116,9 @@ files:
|
|
116
116
|
- Rakefile
|
117
117
|
- VERSION
|
118
118
|
- ci/Gemfile
|
119
|
+
- ci/Gemfile_ar2.lock
|
119
120
|
- lib/sk_sdk.rb
|
120
|
-
- lib/sk_sdk/
|
121
|
+
- lib/sk_sdk/README.rdoc
|
121
122
|
- lib/sk_sdk/ar_patches/ar2/base.rb
|
122
123
|
- lib/sk_sdk/ar_patches/ar2/validations.rb
|
123
124
|
- lib/sk_sdk/ar_patches/ar3/base.rb
|
@@ -130,7 +131,7 @@ files:
|
|
130
131
|
- lib/sk_sdk/sync.rb
|
131
132
|
- sk_sdk.gemspec
|
132
133
|
- spec/resources_spec_helper.rb
|
133
|
-
- spec/settings.yml
|
134
|
+
- spec/settings.yml.default
|
134
135
|
- spec/sk_sdk/base_spec.rb
|
135
136
|
- spec/sk_sdk/oauth_spec.rb
|
136
137
|
- spec/sk_sdk/resources/README.rdoc
|
data/spec/settings.yml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
sk_url: http://*.horsts-lokal.local
|
2
|
-
canvas_slug: canvas-page
|
3
|
-
id: 2d83d570635ee19c
|
4
|
-
secret: eb4005858e4947e4228a12a6b7306ee0
|
5
|
-
redirect_url: http://localhorst:4567
|
6
|
-
scope: "api/payments:read api/invoices:read"
|
7
|
-
session_secret: very_long_random_to_encode_the_session
|