ooor 2.1.0 → 2.2.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/lib/ooor/errors.rb +2 -2
- data/lib/ooor/field_methods.rb +7 -8
- data/lib/ooor/persistence.rb +15 -0
- data/lib/ooor/reflection_ooor.rb +4 -0
- data/lib/ooor/services.rb +21 -7
- data/lib/ooor/transport.rb +4 -4
- data/lib/ooor/version.rb +1 -1
- data/spec/ooor_spec.rb +191 -155
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d891fa43f53c6874d616400d37c2805cea7ddc1a
|
4
|
+
data.tar.gz: 1d8d0f527525a111762c53328307bc5a340dabe4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf0f99297dfdc754b059be24b48c2292e7520b43c789c97ec4cf4415826e3a56de0c06ef54777c03c1b8eb8422a060bb3134f96fc2bee781ddd1caf9995b78d3
|
7
|
+
data.tar.gz: cc6e0c73cf713dc4ea8d01c6abfaf1c07168d6ec022ffe851443c079c183b1f72a1653e70ebc5197adaa52a3ea04b8dc33811d709abd176ace16abe5b10224f4
|
data/lib/ooor/errors.rb
CHANGED
@@ -25,7 +25,7 @@ module Ooor
|
|
25
25
|
return ValueError.new(method, faultCode, faultString, *args)
|
26
26
|
elsif faultCode =~ /ValidateError/
|
27
27
|
return ValidationError.new(method, faultCode, faultString, *args)
|
28
|
-
elsif faultCode =~ /AccessDenied/ || faultCode =~ /Access Denied/
|
28
|
+
elsif faultCode =~ /AccessDenied/ || faultCode =~ /Access Denied/ || faultCode =~ /AccessError/
|
29
29
|
return UnAuthorizedError.new(method, faultCode, faultString, *args)
|
30
30
|
elsif faultCode =~ /AuthenticationError: Credentials not provided/
|
31
31
|
return InvalidSessionError.new(method, faultCode, faultString, *args)
|
@@ -45,7 +45,7 @@ module Ooor
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def filter_password(args)
|
48
|
-
if args[0].is_a?(String) && (args[1].is_a?(Integer) || args[1].to_i != 0)
|
48
|
+
if args[0].is_a?(String) && args[2].is_a?(String) && (args[1].is_a?(Integer) || args[1].to_i != 0)
|
49
49
|
args[2] = "####"
|
50
50
|
end
|
51
51
|
args.map! do |arg|
|
data/lib/ooor/field_methods.rb
CHANGED
@@ -119,21 +119,20 @@ module Ooor
|
|
119
119
|
|
120
120
|
def lazy_load(meth, *args)
|
121
121
|
@lazy = false
|
122
|
-
|
122
|
+
fields = (self.class.fast_fields + [meth]).uniq
|
123
|
+
load(rpc_execute('read', [@attributes["id"]], fields, *args || context)[0]).tap do
|
123
124
|
@lazy = false
|
124
125
|
end
|
125
126
|
end
|
126
127
|
|
127
128
|
def get_attribute(meth, *args)
|
128
|
-
lazy_load(meth, *args) if @lazy
|
129
|
+
lazy_load(meth, *args) if @lazy && @attributes["id"]
|
129
130
|
if @attributes.has_key?(meth)
|
130
131
|
@attributes[meth]
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
nil
|
136
|
-
end
|
132
|
+
elsif @attributes["id"] # if field is computed for instance
|
133
|
+
@attributes[meth] = rpc_execute('read', [@attributes["id"]], [meth], *args || context)[0][meth]
|
134
|
+
else
|
135
|
+
nil
|
137
136
|
end
|
138
137
|
end
|
139
138
|
|
data/lib/ooor/persistence.rb
CHANGED
@@ -314,6 +314,21 @@ module Ooor
|
|
314
314
|
|
315
315
|
def load_with_defaults(attributes, default_get_list)
|
316
316
|
defaults = rpc_execute("default_get", default_get_list || self.class.fields.keys + self.class.associations_keys, context)
|
317
|
+
self.class.associations_keys.each do |k|
|
318
|
+
# m2m with existing records:
|
319
|
+
if defaults[k].is_a?(Array) && defaults[k][0].is_a?(Array) && defaults[k][0][2].is_a?(Array)
|
320
|
+
defaults[k] = defaults[k][0][2]
|
321
|
+
# m2m with records to create:
|
322
|
+
elsif defaults[k].is_a?(Array) && defaults[k][0].is_a?(Array) && defaults[k][0][2].is_a?(Hash) # TODO make more robust
|
323
|
+
defaults[k] = defaults[k].map { |item| self.class.all_fields[k]['relation'].new(item[2]) }
|
324
|
+
# strange case with default product taxes on v9
|
325
|
+
elsif defaults[k].is_a?(Array) && defaults[k][0] == [5] && defaults[k][1].is_a?(Array)
|
326
|
+
defaults[k] = [defaults[k][1].last] # TODO may e more subtle
|
327
|
+
# default ResPartners category_id on v9; know why...
|
328
|
+
elsif defaults[k].is_a?(Array) && defaults[k][0].is_a?(Array)
|
329
|
+
defaults[k] = defaults[k][0]
|
330
|
+
end
|
331
|
+
end
|
317
332
|
attributes = HashWithIndifferentAccess.new(defaults.merge(attributes.reject {|k, v| v.blank? }))
|
318
333
|
load(attributes)
|
319
334
|
end
|
data/lib/ooor/reflection_ooor.rb
CHANGED
data/lib/ooor/services.rb
CHANGED
@@ -12,7 +12,7 @@ module Ooor
|
|
12
12
|
def initialize(session)
|
13
13
|
@session = session
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
16
|
def self.define_service(service, methods)
|
17
17
|
methods.each do |meth|
|
18
18
|
self.instance_eval do
|
@@ -37,17 +37,20 @@ module Ooor
|
|
37
37
|
else
|
38
38
|
conn = @session.get_client(:json, "#{@session.base_jsonrpc2_url}")
|
39
39
|
response = conn.post do |req|
|
40
|
-
req.url '/web/session/authenticate'
|
40
|
+
req.url '/web/session/authenticate'
|
41
41
|
req.headers['Content-Type'] = 'application/json'
|
42
42
|
req.body = {method: 'call', params: { db: db, login: username, password: password}}.to_json
|
43
43
|
end
|
44
44
|
@session.web_session[:cookie] = response.headers["set-cookie"]
|
45
|
+
json_response = JSON.parse(response.body)
|
46
|
+
validate_response(json_response)
|
47
|
+
|
45
48
|
if response.status == 200
|
46
49
|
sid_part1 = @session.web_session[:cookie].split("sid=")[1]
|
47
50
|
if sid_part1
|
48
51
|
@session.web_session[:sid] = @session.web_session[:cookie].split("sid=")[1].split(";")[0] # NOTE side is required on v7 but not on v8, this enables to sniff if we are on v7
|
49
52
|
end
|
50
|
-
|
53
|
+
|
51
54
|
@session.web_session[:session_id] = json_response['result']['session_id']
|
52
55
|
user_id = json_response['result']['uid']
|
53
56
|
@session.config[:user_id] = user_id
|
@@ -58,6 +61,17 @@ module Ooor
|
|
58
61
|
end
|
59
62
|
end
|
60
63
|
end
|
64
|
+
|
65
|
+
private
|
66
|
+
# Function to validate json response with useful messages
|
67
|
+
# Eg: For Database database "<DB NAME>" does not exist errors from open erb.
|
68
|
+
def validate_response(json_response)
|
69
|
+
error = json_response["error"]
|
70
|
+
|
71
|
+
if error && (error["data"]["type"] == "server_exception" || error['message'] == "Odoo Server Error")
|
72
|
+
raise "#{error["message"]} ------- #{error["data"]["debug"]}"
|
73
|
+
end
|
74
|
+
end
|
61
75
|
end
|
62
76
|
|
63
77
|
|
@@ -68,7 +82,7 @@ module Ooor
|
|
68
82
|
@session.logger.info "creating database #{db_name} this may take a while..."
|
69
83
|
process_id = @session.get_client(:xml, @session.base_url + "/db").call("create_database", password, db_name, demo, lang, user_password)
|
70
84
|
sleep(2)
|
71
|
-
while get_progress(password, process_id)[0] != 1
|
85
|
+
while process_id.is_a?(Integer) && get_progress(password, process_id)[0] != 1
|
72
86
|
@session.logger.info "..."
|
73
87
|
sleep(0.5)
|
74
88
|
end
|
@@ -79,7 +93,7 @@ module Ooor
|
|
79
93
|
|
80
94
|
class ObjectService < Service
|
81
95
|
define_service(:object, %w[execute exec_workflow])
|
82
|
-
|
96
|
+
|
83
97
|
def object_service(service, obj, method, *args)
|
84
98
|
unless @session.config[:user_id]
|
85
99
|
@session.common.login(@session.config[:database], @session.config[:username], @session.config[:password])
|
@@ -108,7 +122,7 @@ module Ooor
|
|
108
122
|
end
|
109
123
|
|
110
124
|
def inject_session_context(service, method, *args)
|
111
|
-
if service == :object && (i = Ooor.irregular_context_position(method)) && args.size >= i
|
125
|
+
if service == :object && (i = Ooor.irregular_context_position(method)) && args.size >= i
|
112
126
|
c = HashWithIndifferentAccess.new(args[i])
|
113
127
|
args[i] = @session.session_context(c)
|
114
128
|
elsif args[-1].is_a? Hash #context
|
@@ -122,7 +136,7 @@ module Ooor
|
|
122
136
|
end
|
123
137
|
args
|
124
138
|
end
|
125
|
-
|
139
|
+
|
126
140
|
end
|
127
141
|
|
128
142
|
|
data/lib/ooor/transport.rb
CHANGED
@@ -14,11 +14,11 @@ module Ooor
|
|
14
14
|
def get_client(type, url)
|
15
15
|
case type
|
16
16
|
when :json
|
17
|
-
|
18
|
-
|
17
|
+
Thread.current[:json_clients] ||= {}
|
18
|
+
Thread.current[:json_clients][url] ||= JsonClient.new(url, :request => { timeout: config[:rpc_timeout] || 900 })
|
19
19
|
when :xml
|
20
|
-
|
21
|
-
|
20
|
+
Thread.current[:xml_clients] ||= {}
|
21
|
+
Thread.current[:xml_clients][url] ||= XmlRpcClient.new2(url, nil, config[:rpc_timeout] || 900)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
data/lib/ooor/version.rb
CHANGED
data/spec/ooor_spec.rb
CHANGED
@@ -9,42 +9,44 @@ if ENV["CI"]
|
|
9
9
|
end
|
10
10
|
require File.dirname(__FILE__) + '/../lib/ooor'
|
11
11
|
|
12
|
+
OOOR_URL = ENV['OOOR_URL'] || 'http://localhost:8069/xmlrpc'
|
13
|
+
OOOR_DB_PASSWORD = ENV['OOOR_DB_PASSWORD'] || 'admin'
|
14
|
+
OOOR_USERNAME = ENV['OOOR_USERNAME'] || 'admin'
|
15
|
+
OOOR_PASSWORD = ENV['OOOR_PASSWORD'] || 'admin'
|
16
|
+
OOOR_DATABASE = ENV['OOOR_DATABASE'] || 'ooor_test'
|
17
|
+
OOOR_ODOO_VERSION = ENV['VERSION'] || '9.0'
|
18
|
+
|
12
19
|
#RSpec executable specification; see http://rspec.info/ for more information.
|
13
20
|
#Run the file with the rspec command from the rspec gem
|
14
21
|
describe Ooor do
|
15
22
|
before(:all) do
|
16
|
-
@
|
17
|
-
@db_password = 'admin'
|
18
|
-
@username = 'admin'
|
19
|
-
@password = 'admin'
|
20
|
-
@database = 'ooor_test'
|
21
|
-
@ooor = Ooor.new(:url => @url, :username => @username, :password => @password)
|
23
|
+
@ooor = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD)
|
22
24
|
end
|
23
25
|
|
24
26
|
it "should keep quiet if no database is mentioned" do
|
25
|
-
@ooor.models.
|
27
|
+
expect(@ooor.models).to be_empty
|
26
28
|
end
|
27
29
|
|
28
30
|
it "should be able to list databases" do
|
29
|
-
@ooor.db.list.
|
31
|
+
expect(@ooor.db.list).to be_kind_of(Array)
|
30
32
|
end
|
31
33
|
|
32
34
|
it "should be able to create a new database with demo data" do
|
33
|
-
unless @ooor.db.list.index(
|
34
|
-
@ooor.db.create(
|
35
|
+
unless @ooor.db.list.index(OOOR_DB_PASSWORD)
|
36
|
+
@ooor.db.create(OOOR_DB_PASSWORD, OOOR_DATABASE)
|
35
37
|
end
|
36
|
-
@ooor.db.list.index(
|
38
|
+
expect(@ooor.db.list.index(OOOR_DATABASE)).not_to be_nil
|
37
39
|
end
|
38
40
|
|
39
41
|
describe "Configure existing database" do
|
40
42
|
before(:all) do
|
41
|
-
@ooor = Ooor.new(:
|
43
|
+
@ooor = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE)
|
42
44
|
end
|
43
45
|
|
44
46
|
it "should be able to load a profile" do
|
45
47
|
IrModuleModule.install_modules(['sale', 'account_voucher'])
|
46
48
|
@ooor.load_models
|
47
|
-
@ooor.models.keys.
|
49
|
+
expect(@ooor.models.keys).not_to be_empty
|
48
50
|
end
|
49
51
|
|
50
52
|
it "should be able to configure the database" do
|
@@ -59,8 +61,8 @@ describe Ooor do
|
|
59
61
|
|
60
62
|
describe "Do operations on configured database" do
|
61
63
|
before(:all) do
|
62
|
-
@ooor = Ooor.new(:
|
63
|
-
:
|
64
|
+
@ooor = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE,
|
65
|
+
models: ['res.user', 'res.partner', 'product.product', 'sale.order', 'account.invoice', 'product.category', 'ir.cron', 'ir.ui.menu', 'ir.module.module'])
|
64
66
|
end
|
65
67
|
|
66
68
|
describe "Finders operations" do
|
@@ -68,42 +70,42 @@ describe Ooor do
|
|
68
70
|
first_product_id = ProductProduct.search([], 0, 1).first
|
69
71
|
product1 = ProductProduct.find(first_product_id)
|
70
72
|
expect(product1).not_to be_nil
|
71
|
-
product1.attributes.
|
73
|
+
expect(product1.attributes).to be_kind_of(Hash)
|
72
74
|
end
|
73
75
|
|
74
76
|
it "fetches data given an array of ids" do
|
75
77
|
products = ProductProduct.find([1,2])
|
76
|
-
products.size.
|
78
|
+
expect(products.size).to eq(2)
|
77
79
|
end
|
78
80
|
|
79
81
|
it "should fetches data given an implicit array of ids" do
|
80
82
|
products = ProductProduct.find(1, 2)
|
81
|
-
products.size.
|
83
|
+
expect(products.size).to eq(2)
|
82
84
|
end
|
83
85
|
|
84
86
|
it "should fetches data even if an id is passed as a string (web usage)" do
|
85
87
|
product = ProductProduct.find("1")
|
86
|
-
product.
|
88
|
+
expect(product).to be_kind_of(ProductProduct)
|
87
89
|
end
|
88
90
|
|
89
91
|
it "should fetches data even with array containing string" do
|
90
92
|
products = ProductProduct.find(["1", 2])
|
91
|
-
products.size.
|
93
|
+
expect(products.size).to eq(2)
|
92
94
|
end
|
93
95
|
|
94
96
|
it "should fetches data even with an implicit array containing string" do
|
95
97
|
products = ProductProduct.find("1", 2)
|
96
|
-
products.size.
|
98
|
+
expect(products.size).to eq(2)
|
97
99
|
end
|
98
100
|
|
99
101
|
it "should accept hash domain in find" do
|
100
102
|
products = ProductProduct.find(active: true)
|
101
|
-
products.
|
103
|
+
expect(products).to be_kind_of(Array)
|
102
104
|
end
|
103
105
|
|
104
106
|
it "should accept array domain in find" do
|
105
107
|
products = ProductProduct.find(['active', '=', true])
|
106
|
-
products.
|
108
|
+
expect(products).to be_kind_of(Array)
|
107
109
|
end
|
108
110
|
|
109
111
|
it "fetches last data created last" do
|
@@ -112,36 +114,36 @@ describe Ooor do
|
|
112
114
|
end
|
113
115
|
|
114
116
|
it "should load required models on the fly" do
|
115
|
-
|
117
|
+
expect(ProductProduct.find(:first).categ_id).to be_kind_of(ProductCategory)
|
116
118
|
end
|
117
119
|
|
118
120
|
it "should be able to specify the fields to read" do
|
119
121
|
p = ProductProduct.find(1, :fields=>["state", "id"])
|
120
|
-
p.
|
122
|
+
expect(p).not_to be_nil
|
121
123
|
end
|
122
124
|
|
123
125
|
it "should be able to find using ir.model.data absolute ids" do
|
124
126
|
p = ResPartner.find('res_partner_1')
|
125
|
-
p.
|
127
|
+
expect(p).not_to be_nil
|
126
128
|
p = ResPartner.find('base.res_partner_1')#module scoping is optionnal
|
127
|
-
p.
|
129
|
+
expect(p).not_to be_nil
|
128
130
|
end
|
129
131
|
|
130
132
|
it "should be able to use OpenERP domains" do
|
131
133
|
partners = ResPartner.find(:all, :domain=>[['supplier', '=', 1],['active','=',1]], :fields=>["id", "name"])
|
132
|
-
partners.
|
134
|
+
expect(partners).not_to be_empty
|
133
135
|
products = ProductProduct.find(:all, :domain=>[['categ_id','=',1],'|',['name', '=', 'PC1'],['name','=','PC2']])
|
134
|
-
products.
|
136
|
+
expect(products).to be_kind_of(Array)
|
135
137
|
end
|
136
138
|
|
137
139
|
it "should mimic ActiveResource scoping" do
|
138
140
|
partners = ResPartner.find(:all, :params => {:supplier => true})
|
139
|
-
partners.
|
141
|
+
expect(partners).not_to be_empty
|
140
142
|
end
|
141
143
|
|
142
144
|
it "should mimic ActiveResource scopinging with first" do
|
143
145
|
partner = ResPartner.find(:first, :params => {:customer => true})
|
144
|
-
partner.
|
146
|
+
expect(partner).to be_kind_of ResPartner
|
145
147
|
end
|
146
148
|
|
147
149
|
# NOTE: in Ooor 2.1 we don't support this anymore, use session.with_context(context) {} instead
|
@@ -161,55 +163,57 @@ describe Ooor do
|
|
161
163
|
|
162
164
|
it "should support OpenERP search method" do
|
163
165
|
partners = ResPartner.search([['name', 'ilike', 'a']], 0, 2)
|
164
|
-
partners.
|
166
|
+
expect(partners).not_to be_empty
|
165
167
|
end
|
166
168
|
|
167
169
|
it "should cast dates properly from OpenERP to Ruby" do
|
168
170
|
o = SaleOrder.find(1)
|
169
|
-
o.date_order.
|
171
|
+
expect(o.date_order).to be_kind_of(Date)
|
170
172
|
c = IrCron.find(1)
|
171
|
-
c.nextcall.
|
173
|
+
expect(c.nextcall).to be_kind_of(DateTime)
|
172
174
|
end
|
173
175
|
|
174
176
|
it "should not load false values in empty strings (for HTML forms)" do
|
175
|
-
ResPartner.first.mobile.
|
177
|
+
expect(ResPartner.first.mobile).to be_nil
|
176
178
|
end
|
177
179
|
|
178
180
|
it "should map OpenERP types to Rails types" do
|
179
|
-
(%w[char binary many2one one2many many2many]).each { |t| Ooor::Base.to_rails_type(t).
|
181
|
+
(%w[char binary many2one one2many many2many]).each { |t| expect(Ooor::Base.to_rails_type(t)).to be_kind_of(Symbol) }
|
180
182
|
end
|
181
183
|
|
182
184
|
it "should be able to call any Class method" do
|
183
|
-
ResPartner.name_search('ax', [], 'ilike', {}).
|
185
|
+
expect(ResPartner.name_search('ax', [], 'ilike', {})).not_to be_nil
|
184
186
|
end
|
185
187
|
end
|
186
188
|
|
187
189
|
describe "Relations reading" do
|
188
190
|
it "should read many2one relations" do
|
189
191
|
o = SaleOrder.find(:first)
|
190
|
-
o.partner_id.
|
192
|
+
expect(o.partner_id).to be_kind_of(ResPartner)
|
191
193
|
p = ProductProduct.find(1) #inherited via product template
|
192
|
-
p.categ_id.
|
194
|
+
expect(p.categ_id).to be_kind_of(ProductCategory)
|
193
195
|
end
|
194
196
|
|
195
197
|
it "should read one2many relations" do
|
196
198
|
o = SaleOrder.find(:first)
|
197
199
|
o.order_line.each do |line|
|
198
|
-
line.
|
200
|
+
expect(line).to be_kind_of(SaleOrderLine)
|
199
201
|
end
|
200
202
|
end
|
201
203
|
|
204
|
+
if OOOR_ODOO_VERSION != '9.0'
|
202
205
|
it "should read many2many relations" do
|
203
206
|
s = SaleOrder.find(:first)
|
204
207
|
s.order_policy = 'manual'
|
205
208
|
s.save
|
206
209
|
s.wkf_action('order_confirm')
|
207
210
|
s.wkf_action('manual_invoice')
|
208
|
-
SaleOrder.find(:first).order_line[1].invoice_lines.
|
211
|
+
expect(SaleOrder.find(:first).order_line[1].invoice_lines).to be_kind_of(Array)
|
212
|
+
end
|
209
213
|
end
|
210
214
|
|
211
215
|
it "should read polymorphic references" do
|
212
|
-
IrUiMenu.find(:first, :domain => [['name', '=', 'Customers'], ['parent_id', '!=', false]]).action.
|
216
|
+
expect(IrUiMenu.find(:first, :domain => [['name', '=', 'Customers'], ['parent_id', '!=', false]]).action).to be_kind_of(IrActionsAct_window)
|
213
217
|
end
|
214
218
|
end
|
215
219
|
|
@@ -217,49 +221,54 @@ describe Ooor do
|
|
217
221
|
it "should be able to assign a value to an unloaded field" do
|
218
222
|
p = ProductProduct.new
|
219
223
|
p.name = "testProduct1"
|
220
|
-
p.name.
|
224
|
+
expect(p.name).to eq("testProduct1")
|
221
225
|
end
|
222
226
|
|
227
|
+
if OOOR_ODOO_VERSION != '9.0'
|
223
228
|
it "should properly change value when m2o is set" do
|
224
229
|
p = ProductProduct.find(:first)
|
225
230
|
p.categ_id = 7
|
226
|
-
p.categ_id.id.
|
231
|
+
expect(p.categ_id.id).to eq(7)
|
232
|
+
end
|
227
233
|
end
|
228
234
|
|
229
235
|
it "should be able to create a product" do
|
230
236
|
p = ProductProduct.create(:name => "testProduct1", :categ_id => 1)
|
231
|
-
ProductProduct.find(p.id).categ_id.id.
|
237
|
+
expect(ProductProduct.find(p.id).categ_id.id).to eq(1)
|
232
238
|
p = ProductProduct.new(:name => "testProduct1")
|
233
239
|
p.categ_id = 1
|
234
240
|
p.save
|
235
|
-
p.categ_id.id.
|
241
|
+
expect(p.categ_id.id).to eq(1)
|
236
242
|
end
|
237
243
|
|
238
244
|
it "should support read on new objects" do
|
239
245
|
u = ResUsers.new({name: "joe", login: "joe"})
|
240
|
-
u.id.
|
241
|
-
u.name.
|
242
|
-
u.email.
|
246
|
+
expect(u.id).to be_nil
|
247
|
+
expect(u.name).to eq("joe")
|
248
|
+
expect(u.email).to eq(nil)
|
243
249
|
u.save
|
244
|
-
u.id.
|
245
|
-
u.name.
|
246
|
-
u.destroy.
|
250
|
+
expect(u.id).not_to be_nil
|
251
|
+
expect(u.name).to eq("joe")
|
252
|
+
expect(u.destroy).to be_kind_of(ResUsers)
|
247
253
|
end
|
248
254
|
|
249
255
|
it "should be able to create an order" do
|
250
256
|
p_id = ResPartner.search([['name', 'ilike', 'Agrolait']])[0]
|
251
257
|
o = SaleOrder.create(partner_id: p_id, partner_invoice_id: p_id, partner_shipping_id: p_id, pricelist_id: 1)
|
252
|
-
o.id.
|
258
|
+
expect(o.id).to be_kind_of(Integer)
|
253
259
|
end
|
254
260
|
|
261
|
+
if OOOR_ODOO_VERSION != '9.0'
|
255
262
|
it "should be able to to create an invoice" do
|
256
263
|
i = AccountInvoice.new(:origin => 'ooor_test')
|
257
264
|
partner_id = ResPartner.search([['name', 'ilike', 'Agrolait']])[0]
|
258
265
|
i.on_change('onchange_partner_id', :partner_id, partner_id, 'out_invoice', partner_id, false, false)
|
259
266
|
i.save
|
260
|
-
i.id.
|
267
|
+
expect(i.id).to be_kind_of(Integer)
|
268
|
+
end
|
261
269
|
end
|
262
270
|
|
271
|
+
if OOOR_ODOO_VERSION == '7.0'
|
263
272
|
it "should be able to call on_change" do
|
264
273
|
o = SaleOrder.new
|
265
274
|
partner_id = ResPartner.search([['name', 'ilike', 'Agrolait']])[0]
|
@@ -271,17 +280,18 @@ describe Ooor do
|
|
271
280
|
product_uom_qty = 1
|
272
281
|
line.on_change('product_id_change', :product_id, product_id, pricelist_id, product_id, product_uom_qty, false, 1, false, false, o.partner_id.id, 'en_US', true, false, false, false)
|
273
282
|
line.save
|
274
|
-
SaleOrder.find(o.id).order_line.size.
|
283
|
+
expect(SaleOrder.find(o.id).order_line.size).to eq(1)
|
284
|
+
end
|
275
285
|
end
|
276
286
|
|
277
287
|
it "should use default fields on creation" do
|
278
288
|
p = ProductProduct.new
|
279
|
-
p.categ_id.
|
289
|
+
expect(p.categ_id).to be_kind_of(ProductCategory)
|
280
290
|
end
|
281
291
|
|
282
292
|
it "should skipped inherited default fields properly, for instance at product variant creation" do
|
283
293
|
#note that we force [] here for the default_get_fields otherwise OpenERP will blows up while trying to write in the product template!
|
284
|
-
ProductProduct.create({:product_tmpl_id => 25, :code => 'OOOR variant'}, []).
|
294
|
+
expect(ProductProduct.create({:product_tmpl_id => 25, :code => 'OOOR variant'}, [])).to be_kind_of(ProductProduct)
|
285
295
|
end
|
286
296
|
end
|
287
297
|
|
@@ -294,7 +304,7 @@ describe Ooor do
|
|
294
304
|
|
295
305
|
it "should be able to reload resource" do
|
296
306
|
s = SaleOrder.find(:first)
|
297
|
-
s.reload.
|
307
|
+
expect(s.reload).to be_kind_of(SaleOrder)
|
298
308
|
end
|
299
309
|
end
|
300
310
|
|
@@ -302,24 +312,28 @@ describe Ooor do
|
|
302
312
|
it "should be able to assign many2one relations on new" do
|
303
313
|
new_partner_id = ResPartner.search()[0]
|
304
314
|
s = SaleOrder.new(:partner_id => new_partner_id)
|
305
|
-
s.partner_id.id.
|
315
|
+
expect(s.partner_id.id).to eq(new_partner_id)
|
306
316
|
end
|
307
317
|
|
318
|
+
if OOOR_ODOO_VERSION != '9.0'
|
308
319
|
it "should be able to do product.taxes_id = [id1, id2]" do
|
309
320
|
p = ProductProduct.find(1)
|
310
321
|
p.taxes_id = AccountTax.search([['type_tax_use','=','sale']])[0..1]
|
311
322
|
p.save
|
312
|
-
p.taxes_id[0].
|
313
|
-
p.taxes_id[1].
|
323
|
+
expect(p.taxes_id[0]).to be_kind_of(AccountTax)
|
324
|
+
expect(p.taxes_id[1]).to be_kind_of(AccountTax)
|
325
|
+
end
|
314
326
|
end
|
315
327
|
|
328
|
+
if OOOR_ODOO_VERSION == '7.0'
|
316
329
|
it "should be able to create one2many relations on the fly" do
|
317
330
|
so = SaleOrder.new
|
318
331
|
partner_id = ResPartner.search([['name', 'ilike', 'Agrolait']])[0]
|
319
332
|
so.on_change('onchange_partner_id', :partner_id, partner_id, partner_id) #auto-complete the address and other data based on the partner
|
320
333
|
so.order_line = [SaleOrderLine.new(:name => 'sl1', :product_id => 1, :price_unit => 21, :product_uom => 1), SaleOrderLine.new(:name => 'sl2', :product_id => 1, :price_unit => 21, :product_uom => 1)] #create one order line
|
321
334
|
so.save
|
322
|
-
so.amount_total.
|
335
|
+
expect(so.amount_total).to eq(42.0)
|
336
|
+
end
|
323
337
|
end
|
324
338
|
|
325
339
|
it "should be able to assign a polymorphic relation" do
|
@@ -330,24 +344,25 @@ describe Ooor do
|
|
330
344
|
describe "Rails associations methods" do
|
331
345
|
it "should read m2o id with an extra _id suffix" do
|
332
346
|
p = ProductProduct.find(1)
|
333
|
-
p.categ_id_id.
|
347
|
+
expect(p.categ_id_id).to be_kind_of(Integer)
|
334
348
|
end
|
335
349
|
|
336
350
|
it "should read o2m with an extra _ids suffix" do
|
337
351
|
so = SaleOrder.find :first
|
338
|
-
so.order_line_ids.
|
352
|
+
expect(so.order_line_ids).to be_kind_of(Array)
|
339
353
|
end
|
340
354
|
|
341
355
|
it "should read m2m with an extra _ids suffix" do
|
342
356
|
p = ProductProduct.find(1)
|
343
|
-
p.taxes_id_ids.
|
357
|
+
expect(p.taxes_id_ids).to be_kind_of(Array)
|
344
358
|
end
|
345
359
|
|
346
360
|
it "should support Rails nested attributes methods" do
|
347
361
|
so = SaleOrder.find :first
|
348
|
-
so.respond_to?(:order_line_attributes=).
|
362
|
+
expect(so.respond_to?(:order_line_attributes=)).to eq(true)
|
349
363
|
end
|
350
364
|
|
365
|
+
if OOOR_ODOO_VERSION == '7.0'
|
351
366
|
it "should support CRUD on o2m via nested attributes" do
|
352
367
|
p = ProductProduct.create(name:'Ooor product with packages')
|
353
368
|
p.packaging_attributes = {'1' => {name: 'pack1'}, '2' => {name: 'pack2'}}
|
@@ -355,39 +370,44 @@ describe Ooor do
|
|
355
370
|
p = ProductProduct.find p.id
|
356
371
|
pack1 = p.packaging[0]
|
357
372
|
pack2 = p.packaging[1]
|
358
|
-
pack2.name.index('pack').
|
373
|
+
expect(pack2.name.index('pack')).to eq(0)
|
359
374
|
p.packaging_attributes = {'1' => {name: 'pack1', '_destroy'=> true, id: pack1.id}, '2' => {name: 'pack2_modified', id: pack2.id}}
|
360
375
|
p.save
|
361
|
-
p.packaging.size.
|
362
|
-
p.packaging[0].name.
|
376
|
+
expect(p.packaging.size).to eq(1)
|
377
|
+
expect(p.packaging[0].name).to eq('pack2_modified')
|
378
|
+
end
|
363
379
|
end
|
364
380
|
|
365
381
|
it "should be able to call build upon a o2m association" do
|
366
382
|
so = SaleOrder.find :first
|
367
|
-
so.order_line.build().
|
383
|
+
expect(so.order_line.build()).to be_kind_of(SaleOrderLine)
|
368
384
|
end
|
369
385
|
|
386
|
+
if OOOR_ODOO_VERSION != '9.0'
|
370
387
|
it "should recast string m2o string id to an integer (it happens in forms)" do
|
371
388
|
uom_id = @ooor.const_get('product.uom').search()[0]
|
372
389
|
p = ProductProduct.new(name: "z recast id", uom_id: uom_id.to_s)
|
373
390
|
p.save
|
374
|
-
p.uom_id.id.
|
391
|
+
expect(p.uom_id.id).to eq(uom_id)
|
392
|
+
end
|
375
393
|
end
|
376
394
|
|
377
395
|
it "should recast string m2m string ids to an array of integer (it happens in forms)" do
|
378
396
|
categ_ids = @ooor.const_get('res.partner.category').search()[0..1]
|
379
397
|
p = ResPartner.new(name: "z recast ids", category_id: categ_ids.join(','))
|
380
398
|
p.save
|
381
|
-
p.category_id.map{|c| c.id}.
|
399
|
+
expect(p.category_id.map{|c| c.id}).to eq(categ_ids)
|
382
400
|
end
|
383
401
|
end
|
384
402
|
|
385
403
|
describe "Fields validations" do
|
404
|
+
if OOOR_ODOO_VERSION == '7.0'
|
386
405
|
it "should point to invalid fields" do
|
387
406
|
p = ProductProduct.find :first
|
388
407
|
p.ean13 = 'invalid_ean'
|
389
|
-
p.save.
|
390
|
-
p.errors.messages[:ean13].
|
408
|
+
expect(p.save).to eq(false)
|
409
|
+
expect(p.errors.messages[:ean13]).not_to be_nil
|
410
|
+
end
|
391
411
|
end
|
392
412
|
|
393
413
|
it "should list all available fields when you call an invalid field" do
|
@@ -409,10 +429,11 @@ describe Ooor do
|
|
409
429
|
with_ooor_session username: 'admin', password: 'admin' do |session|
|
410
430
|
menu = session['ir.ui.menu'].first
|
411
431
|
menu.save
|
412
|
-
probe.
|
432
|
+
expect(probe).to eq(menu.name)
|
413
433
|
end
|
414
434
|
end
|
415
435
|
|
436
|
+
if OOOR_ODOO_VERSION == '7.0'
|
416
437
|
it "should call customized before_save callback on nested o2m" do
|
417
438
|
with_ooor_session({username: 'admin', password: 'admin'}, 'noshare1') do |session|
|
418
439
|
# we purposely make reflections happen to ensure they won't be reused in next session
|
@@ -428,71 +449,81 @@ describe Ooor do
|
|
428
449
|
|
429
450
|
with_ooor_session({username: 'admin', password: 'admin'}, 'noshare2') do |session|
|
430
451
|
p = session['product.product'].create name: 'nested callback test', packaging_attributes: {'1' => {name: 'pack'}, '2' => {name: 'pack'}}
|
431
|
-
probe.
|
452
|
+
expect(probe).to eq('pack')
|
432
453
|
end
|
433
454
|
end
|
455
|
+
end
|
434
456
|
|
435
457
|
end
|
436
458
|
|
437
459
|
describe "ARel emulation" do
|
438
460
|
it "should have an 'all' method" do
|
439
|
-
ResUsers.all.
|
461
|
+
expect(ResUsers.all).to be_kind_of(Array)
|
440
462
|
end
|
441
463
|
|
442
464
|
it "should have a 'first' method" do
|
443
|
-
ResUsers.first.id.
|
465
|
+
expect(ResUsers.first.id).to eq(1)
|
444
466
|
end
|
445
467
|
|
446
468
|
it "should have a 'last' method" do
|
447
|
-
ResUsers.last.id.
|
469
|
+
expect(ResUsers.last.id).to eq(ResUsers.find(:last).id)
|
448
470
|
end
|
449
471
|
|
450
472
|
it "should be ready for Kaminari pagination via ARel scoping" do
|
451
473
|
num = 2
|
452
474
|
default_per_page = 5
|
453
475
|
collection = ProductProduct.where(active: true).limit(default_per_page).offset(default_per_page * ([num.to_i, 1].max - 1)).order("categ_id")
|
454
|
-
collection.all(fields:['name']).
|
455
|
-
collection.all.size.
|
476
|
+
expect(collection.all(fields:['name'])).to be_kind_of(Array)
|
477
|
+
expect(collection.all.size).to eq(5)
|
456
478
|
end
|
457
479
|
|
480
|
+
if OOOR_ODOO_VERSION != '9.0'
|
458
481
|
it "should support name_search in ARel (used in association widgets with Ooorest)" do
|
459
|
-
|
482
|
+
if OOOR_ODOO_VERSION == '7.0'
|
483
|
+
expected = "All products / Saleable / Components"
|
484
|
+
else
|
485
|
+
expected = "All / Saleable / Components"
|
486
|
+
end
|
487
|
+
expect(Ooor.default_session.const_get('product.category').all(name_search: 'Com')[0].name).to eq(expected)
|
488
|
+
end
|
460
489
|
end
|
461
490
|
|
462
491
|
it "should be possible to invoke batch methods on relations" do
|
463
|
-
Ooor.default_session.const_get('product.product').where(type: 'service').write(type: 'service').
|
492
|
+
expect(Ooor.default_session.const_get('product.product').where(type: 'service').write(type: 'service')).to eq(true)
|
464
493
|
end
|
465
494
|
|
466
495
|
it "should forward Array methods to the Array" do
|
467
|
-
Ooor.default_session.const_get('product.product').where(type: 'service').size.
|
496
|
+
expect(Ooor.default_session.const_get('product.product').where(type: 'service').size).to be_kind_of(Integer)
|
468
497
|
end
|
469
498
|
|
470
499
|
it "should support reloading relation" do
|
471
|
-
Ooor.default_session.const_get('product.product').where(type: 'service').reload.all.
|
500
|
+
expect(Ooor.default_session.const_get('product.product').where(type: 'service').reload.all).to be_kind_of(Array)
|
472
501
|
end
|
473
502
|
end
|
474
503
|
|
475
504
|
describe "report support" do
|
476
|
-
|
505
|
+
if OOOR_ODOO_VERSION == '7.0'
|
506
|
+
it "should print reports" do # TODO make work in v8
|
477
507
|
base_id = IrModuleModule.search(name:'base')[0]
|
478
|
-
IrModuleModule.get_report_data("ir.module.reference", [base_id], 'pdf', {}).
|
508
|
+
expect(IrModuleModule.get_report_data("ir.module.reference", [base_id], 'pdf', {})).to be_kind_of(Array)
|
509
|
+
end
|
479
510
|
end
|
480
511
|
end
|
481
512
|
|
482
513
|
describe "wizard management" do
|
514
|
+
if OOOR_ODOO_VERSION != '9.0'
|
483
515
|
it "should be possible to pay an invoice in one step" do
|
484
516
|
inv = AccountInvoice.find(:first).copy() # creates a draft invoice
|
485
|
-
inv.state.
|
517
|
+
expect(inv.state).to eq("draft")
|
486
518
|
inv.wkf_action('invoice_open')
|
487
|
-
inv.state.
|
519
|
+
expect(inv.state).to eq("open")
|
488
520
|
voucher = @ooor.const_get('account.voucher').new({:amount=>inv.amount_total, :type=>"receipt", :partner_id => inv.partner_id.id}, {"default_amount"=>inv.amount_total, "invoice_id"=>inv.id})
|
489
521
|
voucher.on_change("onchange_partner_id", [], :partner_id, inv.partner_id.id, @ooor.const_get('account.journal').find('account.bank_journal').id, 0.0, 1, 'receipt', false)
|
490
522
|
voucher.save
|
491
|
-
|
492
|
-
|
493
|
-
# inv.reload
|
523
|
+
end
|
494
524
|
end
|
495
525
|
|
526
|
+
if OOOR_ODOO_VERSION != '9.0'
|
496
527
|
it "should be possible to call resource actions and workflow actions" do
|
497
528
|
s = SaleOrder.find(:first).copy()
|
498
529
|
s.wkf_action('order_confirm')
|
@@ -503,7 +534,8 @@ describe Ooor do
|
|
503
534
|
i.wkf_action('invoice_open')
|
504
535
|
i.wkf_action('invoice_cancel')
|
505
536
|
i.action_cancel_draft
|
506
|
-
s.reload.state.
|
537
|
+
expect(s.reload.state).to eq("invoice_except")
|
538
|
+
end
|
507
539
|
end
|
508
540
|
end
|
509
541
|
|
@@ -526,7 +558,7 @@ describe Ooor do
|
|
526
558
|
|
527
559
|
describe "Object context abilities" do
|
528
560
|
before(:all) do
|
529
|
-
@ooor = Ooor.new(:
|
561
|
+
@ooor = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE)
|
530
562
|
end
|
531
563
|
|
532
564
|
it "should support context when instanciating collections" do
|
@@ -543,126 +575,130 @@ describe Ooor do
|
|
543
575
|
include Ooor
|
544
576
|
|
545
577
|
it "should support ActiveModel::Naming" do
|
546
|
-
with_ooor_session(:
|
547
|
-
session['product.product'].name.
|
548
|
-
session['product.product'].model_name.route_key.
|
549
|
-
session['product.product'].model_name.param_key.
|
578
|
+
with_ooor_session(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE) do |session|
|
579
|
+
expect(session['product.product'].name).to eq("ProductProduct")
|
580
|
+
expect(session['product.product'].model_name.route_key).to eq("product-product")
|
581
|
+
expect(session['product.product'].model_name.param_key).to eq("product_product") #TODO add more expectations
|
550
582
|
end
|
551
583
|
end
|
552
584
|
|
553
585
|
it "should support model aliases" do
|
554
586
|
Ooor.session_handler.reset!() # alias isn't part of the connection spec, we don't want connectio reuse here
|
555
|
-
with_ooor_session(:
|
556
|
-
session['products'].search().
|
557
|
-
session['product.product'].alias.
|
587
|
+
with_ooor_session(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE, :aliases => {en_US: {products: 'product.product'}}, :param_keys => {'product.product' => 'name'}) do |session|
|
588
|
+
expect(session['products'].search()).to be_kind_of(Array)
|
589
|
+
expect(session['product.product'].alias).to eq('products')
|
558
590
|
end
|
559
591
|
end
|
560
592
|
|
561
593
|
it "should have a to_param method" do
|
562
594
|
Ooor.session_handler.reset!() # alias isn't part of the connection spec, we don't want connectio reuse here
|
563
|
-
with_ooor_session(:
|
564
|
-
session['product.product'].find(:first).to_param.
|
595
|
+
with_ooor_session(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE, :aliases => {en_US: {products: 'product.product'}}, :param_keys => {'product.product' => 'name'}) do |session|
|
596
|
+
expect(session['product.product'].find(:first).to_param).to be_kind_of(String)
|
565
597
|
end
|
566
598
|
end
|
567
599
|
|
600
|
+
if OOOR_ODOO_VERSION != '9.0' # TODO make it work on 9
|
568
601
|
it "should find by permalink" do
|
569
602
|
Ooor.session_handler.reset!() # alias isn't part of the connection spec, we don't want connection reuse here
|
570
|
-
with_ooor_session(:
|
603
|
+
with_ooor_session(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE, :aliases => {en_US: {products: 'product.product'}}, :param_keys => {'product.product' => 'name'}) do |session|
|
571
604
|
lang = Ooor::Locale.to_erp_locale('en')
|
572
|
-
session['products'].find_by_permalink('Service', context: {'lang' => lang}, fields: ['name']).
|
605
|
+
expect(session['products'].find_by_permalink('Service', context: {'lang' => lang}, fields: ['name'])).to be_kind_of(Ooor::Base)
|
573
606
|
end
|
574
607
|
end
|
608
|
+
end
|
575
609
|
end
|
576
610
|
|
577
611
|
describe "Ative-Record like Reflections" do
|
578
612
|
before(:all) do
|
579
|
-
@ooor = Ooor.new(:
|
613
|
+
@ooor = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE, :models => ['product.product', 'product.category'], :reload => true)
|
580
614
|
end
|
581
615
|
|
582
616
|
it "should test correct class attributes of ActiveRecord Reflection" do
|
583
617
|
object = Ooor::Reflection::AssociationReflection.new(:test, :people, {}, nil)
|
584
|
-
object.name.
|
585
|
-
object.macro.
|
586
|
-
object.options.
|
618
|
+
expect(object.name).to eq(:people)
|
619
|
+
expect(object.macro).to eq(:test)
|
620
|
+
expect(object.options).to eq({})
|
587
621
|
end
|
588
622
|
|
589
623
|
it "should test correct class name matching with class name" do
|
590
624
|
object = Ooor::Reflection::AssociationReflection.new(:test, 'product_product', {class_name: 'product.product'}, nil)
|
591
625
|
object.session = @ooor
|
592
|
-
object.klass.
|
626
|
+
expect(object.klass).to eq(ProductProduct)
|
593
627
|
end
|
594
628
|
|
595
629
|
it "should reflect on m2o association (used in simple_form, cocoon...)" do
|
596
630
|
reflection = ProductProduct.reflect_on_association(:categ_id)
|
597
|
-
reflection.
|
598
|
-
reflection.klass.
|
631
|
+
expect(reflection).to be_kind_of(Ooor::Reflection::AssociationReflection)
|
632
|
+
expect(reflection.klass).to eq(ProductCategory)
|
599
633
|
end
|
600
634
|
|
635
|
+
if OOOR_ODOO_VERSION == '7.0'
|
601
636
|
it "should reflect on o2m association (used in simple_form, cocoon...)" do
|
602
637
|
reflection = ProductProduct.reflect_on_association(:packaging)
|
603
|
-
reflection.
|
638
|
+
expect(reflection).to be_kind_of(Ooor::Reflection::AssociationReflection)
|
604
639
|
reflection.klass.openerp_model == 'product.packaging'
|
605
640
|
end
|
641
|
+
end
|
606
642
|
|
607
643
|
it "should reflect on m2m association (used in simple_form, cocoon...)" do
|
608
644
|
reflection = ResPartner.reflect_on_association(:category_id)
|
609
|
-
reflection.
|
610
|
-
reflection.klass.
|
645
|
+
expect(reflection).to be_kind_of(Ooor::Reflection::AssociationReflection)
|
646
|
+
expect(reflection.klass).to eq(ResPartnerCategory)
|
611
647
|
end
|
612
648
|
|
613
649
|
it "should support column_for_attribute (used by simple_form)" do
|
614
|
-
@ooor.const_get('ir.cron').find(:first).column_for_attribute('name')[:type].
|
650
|
+
expect(@ooor.const_get('ir.cron').find(:first).column_for_attribute('name')[:type]).to eq(:string)
|
615
651
|
end
|
616
652
|
end
|
617
653
|
|
618
654
|
describe "Multi-instance and class name scoping" do
|
619
655
|
before(:all) do
|
620
|
-
@ooor1 = Ooor.new(:
|
621
|
-
@ooor2 = Ooor.new(:
|
656
|
+
@ooor1 = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE, :scope_prefix => 'OE1', :models => ['res.partner', 'product.product'], :reload => true)
|
657
|
+
@ooor2 = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE, :scope_prefix => 'OE2', :models => ['res.partner', 'product.product'], :reload => true)
|
622
658
|
end
|
623
659
|
|
624
660
|
it "should still be possible to find a ressource using an absolute id" do
|
625
|
-
OE1::ResPartner.find('res_partner_1').
|
661
|
+
expect(OE1::ResPartner.find('res_partner_1')).to be_kind_of(OE1::ResPartner)
|
626
662
|
end
|
627
663
|
|
628
664
|
it "should be able to read in one instance and write in an other" do
|
629
665
|
p1 = OE1::ProductProduct.find(1)
|
630
666
|
p2 = OE2::ProductProduct.create(:name => p1.name, :categ_id => p1.categ_id.id)
|
631
|
-
p2.
|
667
|
+
expect(p2).to be_kind_of(OE2::ProductProduct)
|
632
668
|
end
|
633
669
|
end
|
634
670
|
|
635
671
|
describe "Multi-sessions mode" do
|
636
672
|
include Ooor
|
637
673
|
it "should allow with_session" do
|
638
|
-
with_ooor_session(:
|
639
|
-
session['res.users'].search().
|
674
|
+
with_ooor_session(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE) do |session|
|
675
|
+
expect(session['res.users'].search()).to be_kind_of(Array)
|
640
676
|
new_user = session['res.users'].create(name: 'User created by OOOR as admin', login: 'ooor1')
|
641
677
|
new_user.destroy
|
642
678
|
end
|
643
679
|
|
644
|
-
with_ooor_session(:
|
680
|
+
with_ooor_session(url: OOOR_URL, username: 'demo', password: 'demo', database: OOOR_DATABASE) do |session|
|
645
681
|
h = session['res.users'].read([1], ["password"])
|
646
|
-
h[0]['password'].
|
682
|
+
expect(h[0]['password']).to eq("********")
|
647
683
|
end
|
648
684
|
|
649
|
-
with_ooor_default_session(:
|
650
|
-
session['res.users'].search().
|
685
|
+
with_ooor_default_session(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE) do |session|
|
686
|
+
expect(session['res.users'].search()).to be_kind_of(Array)
|
651
687
|
end
|
652
688
|
end
|
653
689
|
|
654
690
|
it "should recover from expired sessions" do
|
655
|
-
with_ooor_session(:
|
691
|
+
with_ooor_session(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE) do |session|
|
656
692
|
user_obj = session['res.users']
|
657
|
-
user_obj.search().
|
693
|
+
expect(user_obj.search()).to be_kind_of(Array)
|
658
694
|
session.web_session[:session_id] = 'invalid'
|
659
|
-
user_obj.search().
|
695
|
+
expect(user_obj.search()).to be_kind_of(Array)
|
660
696
|
end
|
661
697
|
end
|
662
698
|
|
663
699
|
it "should raise AccessDenied/UnAuthorizedError errors" do
|
664
700
|
expect do
|
665
|
-
with_ooor_session(:
|
701
|
+
with_ooor_session(url: OOOR_URL, username: 'demo', password: 'demo', database: OOOR_DATABASE) do |session|
|
666
702
|
session['ir.ui.menu'].first.save
|
667
703
|
end
|
668
704
|
end.to raise_error(Ooor::UnAuthorizedError)
|
@@ -670,13 +706,13 @@ describe Ooor do
|
|
670
706
|
|
671
707
|
it "should assign a secure web session_id to a new web session" do
|
672
708
|
session = Ooor.session_handler.retrieve_session({}, nil, {})
|
673
|
-
session.id.
|
674
|
-
session.id.size.
|
709
|
+
expect(session.id).to be_kind_of String
|
710
|
+
expect(session.id.size).to eq(32)
|
675
711
|
end
|
676
712
|
|
677
713
|
it "should keep existing web session_id" do
|
678
714
|
session = Ooor.session_handler.retrieve_session({}, "12345678912345", {})
|
679
|
-
session.id.
|
715
|
+
expect(session.id).to eq("12345678912345")
|
680
716
|
end
|
681
717
|
|
682
718
|
it "should reuse the same session and proxies with session with same spec" do
|
@@ -684,16 +720,16 @@ describe Ooor do
|
|
684
720
|
obj2 = 2
|
685
721
|
s1 = 1
|
686
722
|
s2 = 2
|
687
|
-
with_ooor_session(:
|
723
|
+
with_ooor_session(url: OOOR_URL, username: 'demo', password: 'demo', database: OOOR_DATABASE) do |session1|
|
688
724
|
s1 = session1
|
689
725
|
obj1 = session1['ir.ui.menu']
|
690
726
|
end
|
691
|
-
with_ooor_session(:
|
727
|
+
with_ooor_session(url: OOOR_URL, username: 'demo', password: 'demo', database: OOOR_DATABASE) do |session2|
|
692
728
|
s2 = session2
|
693
729
|
obj2 = session2['ir.ui.menu']
|
694
730
|
end
|
695
|
-
s1.object_id.
|
696
|
-
obj1.object_id.
|
731
|
+
expect(s1.object_id).to eq(s2.object_id)
|
732
|
+
expect(obj1.object_id).to eq(obj2.object_id)
|
697
733
|
end
|
698
734
|
|
699
735
|
it "should not reuse the same session and proxies with session with different spec" do
|
@@ -701,18 +737,18 @@ describe Ooor do
|
|
701
737
|
obj2 = 2
|
702
738
|
s1 = 1
|
703
739
|
s2 = 2
|
704
|
-
with_ooor_session(:
|
740
|
+
with_ooor_session(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE) do |session1|
|
705
741
|
s1 = session1
|
706
742
|
obj1 = session1['ir.ui.menu']
|
707
743
|
end
|
708
744
|
|
709
|
-
with_ooor_session(:
|
745
|
+
with_ooor_session(url: OOOR_URL, username: 'demo', password: 'demo', database: OOOR_DATABASE) do |session2|
|
710
746
|
s2 = session2
|
711
747
|
obj2 = session2['ir.ui.menu']
|
712
748
|
end
|
713
749
|
|
714
|
-
s1.object_id.
|
715
|
-
obj1.object_id.
|
750
|
+
expect(s1.object_id).not_to eq(s2.object_id)
|
751
|
+
expect(obj1.object_id).not_to eq(obj2.object_id)
|
716
752
|
end
|
717
753
|
|
718
754
|
it "when using different web sessions, it should still share model schemas" do
|
@@ -720,18 +756,18 @@ describe Ooor do
|
|
720
756
|
obj2 = 2
|
721
757
|
s1 = 1
|
722
758
|
s2 = 2
|
723
|
-
with_ooor_session({:
|
759
|
+
with_ooor_session({url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE}, 111) do |session1|
|
724
760
|
s1 = session1
|
725
761
|
obj1 = Ooor.model_registry.get_template(session1.config, 'ir.ui.menu')
|
726
762
|
end
|
727
763
|
|
728
|
-
with_ooor_session({:
|
764
|
+
with_ooor_session({url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE}, 123) do |session2|
|
729
765
|
s2 = session2
|
730
766
|
obj2 = Ooor.model_registry.get_template(session2.config, 'ir.ui.menu')
|
731
767
|
end
|
732
768
|
|
733
|
-
s1.object_id.
|
734
|
-
obj1.
|
769
|
+
expect(s1.object_id).not_to eq(s2.object_id)
|
770
|
+
expect(obj1).to eq(obj2) unless ActiveModel::VERSION::STRING.start_with? "3.2" #for some reason this doesn't work with Rails 3.2
|
735
771
|
end
|
736
772
|
|
737
773
|
|
@@ -739,30 +775,30 @@ describe Ooor do
|
|
739
775
|
s1 = 1
|
740
776
|
s2 = 2
|
741
777
|
|
742
|
-
with_ooor_session({:
|
778
|
+
with_ooor_session({url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE}, 123) do |session1|
|
743
779
|
s1 = session1
|
744
780
|
end
|
745
781
|
|
746
|
-
with_ooor_session({:
|
782
|
+
with_ooor_session({url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE}, 123) do |session1|
|
747
783
|
s2 = session1
|
748
784
|
end
|
749
785
|
|
750
|
-
s1.object_id.
|
786
|
+
expect(s1.object_id).to eq(s2.object_id)
|
751
787
|
end
|
752
788
|
|
753
789
|
it "should not use the same session when session spec matches but session_id is different (web)" do
|
754
790
|
s1 = 1
|
755
791
|
s2 = 2
|
756
792
|
|
757
|
-
with_ooor_session({:
|
793
|
+
with_ooor_session({url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE}, 111) do |session1|
|
758
794
|
s1 = session1
|
759
795
|
end
|
760
796
|
|
761
|
-
with_ooor_session({:
|
797
|
+
with_ooor_session({url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE}, 123) do |session1|
|
762
798
|
s2 = session1
|
763
799
|
end
|
764
800
|
|
765
|
-
s1.object_id.
|
801
|
+
expect(s1.object_id).not_to eq(s2.object_id)
|
766
802
|
end
|
767
803
|
|
768
804
|
end
|
@@ -770,7 +806,7 @@ describe Ooor do
|
|
770
806
|
|
771
807
|
describe "Multi-format serialization" do
|
772
808
|
before(:all) do
|
773
|
-
@ooor = Ooor.new(:
|
809
|
+
@ooor = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE)
|
774
810
|
end
|
775
811
|
|
776
812
|
it "should serialize in json" do
|
@@ -783,7 +819,7 @@ describe Ooor do
|
|
783
819
|
|
784
820
|
describe "Ruby OpenERP extensions" do
|
785
821
|
before(:all) do
|
786
|
-
@ooor = Ooor.new(:
|
822
|
+
@ooor = Ooor.new(url: OOOR_URL, username: OOOR_USERNAME, password: OOOR_PASSWORD, database: OOOR_DATABASE, :helper_paths => [File.dirname(__FILE__) + '/helpers/*'], :reload => true)
|
787
823
|
end
|
788
824
|
|
789
825
|
it "should have default core helpers loaded" do
|
@@ -792,9 +828,9 @@ describe Ooor do
|
|
792
828
|
end
|
793
829
|
|
794
830
|
it "should load custom helper paths" do
|
795
|
-
IrModuleModule.say_hello.
|
831
|
+
expect(IrModuleModule.say_hello).to eq("Hello")
|
796
832
|
mod = IrModuleModule.find(:first, :domain=>['name', '=', 'sale'])
|
797
|
-
mod.say_name.
|
833
|
+
expect(mod.say_name).to eq("sale")
|
798
834
|
end
|
799
835
|
|
800
836
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ooor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Raphael Valyi - www.akretion.com
|
@@ -104,10 +104,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
104
|
version: '0'
|
105
105
|
requirements: []
|
106
106
|
rubyforge_project:
|
107
|
-
rubygems_version: 2.
|
107
|
+
rubygems_version: 2.4.5.1
|
108
108
|
signing_key:
|
109
109
|
specification_version: 4
|
110
110
|
summary: OOOR - OpenObject On Ruby
|
111
111
|
test_files:
|
112
|
-
- spec/ooor_spec.rb
|
113
112
|
- spec/helpers/test_helper.rb
|
113
|
+
- spec/ooor_spec.rb
|