rsim-activerecord-oracle_enhanced-adapter 1.1.9.90

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.
@@ -0,0 +1,82 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ if ActiveRecord::Base.instance_methods.include?('changed?')
4
+
5
+ describe "OracleEnhancedAdapter dirty object tracking" do
6
+
7
+ before(:all) do
8
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
9
+ @conn = ActiveRecord::Base.connection
10
+ @conn.execute <<-SQL
11
+ CREATE TABLE test_employees (
12
+ id NUMBER,
13
+ first_name VARCHAR2(20),
14
+ last_name VARCHAR2(25),
15
+ job_id NUMBER(6,0),
16
+ salary NUMBER(8,2),
17
+ comments CLOB,
18
+ hire_date DATE
19
+ )
20
+ SQL
21
+ @conn.execute <<-SQL
22
+ CREATE SEQUENCE test_employees_seq MINVALUE 1
23
+ INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE
24
+ SQL
25
+ class TestEmployee < ActiveRecord::Base
26
+ end
27
+ end
28
+
29
+ after(:all) do
30
+ Object.send(:remove_const, "TestEmployee")
31
+ @conn.execute "DROP TABLE test_employees"
32
+ @conn.execute "DROP SEQUENCE test_employees_seq"
33
+ end
34
+
35
+ it "should not mark empty string (stored as NULL) as changed when reassigning it" do
36
+ @employee = TestEmployee.create!(:first_name => '')
37
+ @employee.first_name = ''
38
+ @employee.should_not be_changed
39
+ @employee.reload
40
+ @employee.first_name = ''
41
+ @employee.should_not be_changed
42
+ end
43
+
44
+ it "should not mark empty integer (stored as NULL) as changed when reassigning it" do
45
+ @employee = TestEmployee.create!(:job_id => '')
46
+ @employee.job_id = ''
47
+ @employee.should_not be_changed
48
+ @employee.reload
49
+ @employee.job_id = ''
50
+ @employee.should_not be_changed
51
+ end
52
+
53
+ it "should not mark empty decimal (stored as NULL) as changed when reassigning it" do
54
+ @employee = TestEmployee.create!(:salary => '')
55
+ @employee.salary = ''
56
+ @employee.should_not be_changed
57
+ @employee.reload
58
+ @employee.salary = ''
59
+ @employee.should_not be_changed
60
+ end
61
+
62
+ it "should not mark empty text (stored as NULL) as changed when reassigning it" do
63
+ @employee = TestEmployee.create!(:comments => '')
64
+ @employee.comments = ''
65
+ @employee.should_not be_changed
66
+ @employee.reload
67
+ @employee.comments = ''
68
+ @employee.should_not be_changed
69
+ end
70
+
71
+ it "should not mark empty date (stored as NULL) as changed when reassigning it" do
72
+ @employee = TestEmployee.create!(:hire_date => '')
73
+ @employee.hire_date = ''
74
+ @employee.should_not be_changed
75
+ @employee.reload
76
+ @employee.hire_date = ''
77
+ @employee.should_not be_changed
78
+ end
79
+
80
+ end
81
+
82
+ end
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+
4
+
5
+ describe "OracleEnhancedAdapter emulate OracleAdapter" do
6
+
7
+ before(:all) do
8
+ if defined?(ActiveRecord::ConnectionAdapters::OracleAdapter)
9
+ ActiveRecord::ConnectionAdapters.send(:remove_const, :OracleAdapter)
10
+ end
11
+ end
12
+
13
+ it "should be an OracleAdapter" do
14
+ @conn = ActiveRecord::Base.establish_connection(CONNECTION_PARAMS.merge(:emulate_oracle_adapter => true))
15
+ ActiveRecord::Base.connection.should_not be_nil
16
+ ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters::OracleAdapter).should be_true
17
+ end
18
+
19
+ after(:all) do
20
+ if defined?(ActiveRecord::ConnectionAdapters::OracleAdapter)
21
+ ActiveRecord::ConnectionAdapters.send(:remove_const, :OracleAdapter)
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,276 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ describe "OracleEnhancedAdapter custom methods for create, update and destroy" do
4
+ include LoggerSpecHelper
5
+
6
+ before(:all) do
7
+ ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
8
+ @conn = ActiveRecord::Base.connection
9
+ plsql.connection = ActiveRecord::Base.connection.raw_connection
10
+ @conn.execute("DROP TABLE test_employees") rescue nil
11
+ @conn.execute <<-SQL
12
+ CREATE TABLE test_employees (
13
+ employee_id NUMBER(6,0),
14
+ first_name VARCHAR2(20),
15
+ last_name VARCHAR2(25),
16
+ hire_date DATE,
17
+ salary NUMBER(8,2),
18
+ description CLOB,
19
+ version NUMBER(15,0),
20
+ create_time DATE,
21
+ update_time DATE
22
+ )
23
+ SQL
24
+ @conn.execute("DROP SEQUENCE test_employees_s") rescue nil
25
+ @conn.execute <<-SQL
26
+ CREATE SEQUENCE test_employees_s MINVALUE 1
27
+ INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE
28
+ SQL
29
+ @conn.execute <<-SQL
30
+ CREATE OR REPLACE PACKAGE test_employees_pkg IS
31
+ PROCEDURE create_employee(
32
+ p_first_name VARCHAR2,
33
+ p_last_name VARCHAR2,
34
+ p_hire_date DATE,
35
+ p_salary NUMBER,
36
+ p_description VARCHAR2,
37
+ p_employee_id OUT NUMBER);
38
+ PROCEDURE update_employee(
39
+ p_employee_id NUMBER,
40
+ p_first_name VARCHAR2,
41
+ p_last_name VARCHAR2,
42
+ p_hire_date DATE,
43
+ p_salary NUMBER,
44
+ p_description VARCHAR2);
45
+ PROCEDURE delete_employee(
46
+ p_employee_id NUMBER);
47
+ END;
48
+ SQL
49
+ @conn.execute <<-SQL
50
+ CREATE OR REPLACE PACKAGE BODY test_employees_pkg IS
51
+ PROCEDURE create_employee(
52
+ p_first_name VARCHAR2,
53
+ p_last_name VARCHAR2,
54
+ p_hire_date DATE,
55
+ p_salary NUMBER,
56
+ p_description VARCHAR2,
57
+ p_employee_id OUT NUMBER)
58
+ IS
59
+ BEGIN
60
+ SELECT test_employees_s.NEXTVAL INTO p_employee_id FROM dual;
61
+ INSERT INTO test_employees (employee_id, first_name, last_name, hire_date, salary, description,
62
+ version, create_time, update_time)
63
+ VALUES (p_employee_id, p_first_name, p_last_name, p_hire_date, p_salary, p_description,
64
+ 1, SYSDATE, SYSDATE);
65
+ END create_employee;
66
+
67
+ PROCEDURE update_employee(
68
+ p_employee_id NUMBER,
69
+ p_first_name VARCHAR2,
70
+ p_last_name VARCHAR2,
71
+ p_hire_date DATE,
72
+ p_salary NUMBER,
73
+ p_description VARCHAR2)
74
+ IS
75
+ v_version NUMBER;
76
+ BEGIN
77
+ SELECT version INTO v_version FROM test_employees WHERE employee_id = p_employee_id FOR UPDATE;
78
+ UPDATE test_employees
79
+ SET employee_id = p_employee_id, first_name = p_first_name, last_name = p_last_name,
80
+ hire_date = p_hire_date, salary = p_salary, description = p_description,
81
+ version = v_version + 1, update_time = SYSDATE;
82
+ END update_employee;
83
+
84
+ PROCEDURE delete_employee(
85
+ p_employee_id NUMBER)
86
+ IS
87
+ BEGIN
88
+ DELETE FROM test_employees WHERE employee_id = p_employee_id;
89
+ END delete_employee;
90
+ END;
91
+ SQL
92
+
93
+ ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true
94
+
95
+ class TestEmployee < ActiveRecord::Base
96
+ set_primary_key :employee_id
97
+
98
+ validates_presence_of :first_name, :last_name, :hire_date
99
+
100
+ # should return ID of new record
101
+ set_create_method do
102
+ plsql.test_employees_pkg.create_employee(
103
+ :p_first_name => first_name,
104
+ :p_last_name => last_name,
105
+ :p_hire_date => hire_date,
106
+ :p_salary => salary,
107
+ :p_description => "#{first_name} #{last_name}",
108
+ :p_employee_id => nil
109
+ )[:p_employee_id]
110
+ end
111
+
112
+ # return value is ignored
113
+ set_update_method do
114
+ plsql.test_employees_pkg.update_employee(
115
+ :p_employee_id => id,
116
+ :p_first_name => first_name,
117
+ :p_last_name => last_name,
118
+ :p_hire_date => hire_date,
119
+ :p_salary => salary,
120
+ :p_description => "#{first_name} #{last_name}"
121
+ )
122
+ end
123
+
124
+ # return value is ignored
125
+ set_delete_method do
126
+ plsql.test_employees_pkg.delete_employee(
127
+ :p_employee_id => id
128
+ )
129
+ end
130
+
131
+ end
132
+ end
133
+
134
+ after(:all) do
135
+ Object.send(:remove_const, "TestEmployee")
136
+ @conn = ActiveRecord::Base.connection
137
+ @conn.execute "DROP TABLE test_employees"
138
+ @conn.execute "DROP SEQUENCE test_employees_s"
139
+ @conn.execute "DROP PACKAGE test_employees_pkg"
140
+ end
141
+
142
+ before(:each) do
143
+ @today = Date.new(2008,6,28)
144
+ @buffer = StringIO.new
145
+ end
146
+
147
+ it "should create record" do
148
+ @employee = TestEmployee.create(
149
+ :first_name => "First",
150
+ :last_name => "Last",
151
+ :hire_date => @today
152
+ )
153
+ @employee.reload
154
+ @employee.first_name.should == "First"
155
+ @employee.last_name.should == "Last"
156
+ @employee.hire_date.should == @today
157
+ @employee.description.should == "First Last"
158
+ @employee.create_time.should_not be_nil
159
+ @employee.update_time.should_not be_nil
160
+ end
161
+
162
+ it "should update record" do
163
+ @employee = TestEmployee.create(
164
+ :first_name => "First",
165
+ :last_name => "Last",
166
+ :hire_date => @today,
167
+ :description => "description"
168
+ )
169
+ @employee.reload
170
+ @employee.first_name = "Second"
171
+ @employee.save!
172
+ @employee.reload
173
+ @employee.description.should == "Second Last"
174
+ end
175
+
176
+ it "should not update record if nothing is changed and partial updates are enabled" do
177
+ return pending("Not in this ActiveRecord version") unless TestEmployee.respond_to?(:partial_updates=)
178
+ TestEmployee.partial_updates = true
179
+ @employee = TestEmployee.create(
180
+ :first_name => "First",
181
+ :last_name => "Last",
182
+ :hire_date => @today
183
+ )
184
+ @employee.reload
185
+ @employee.save!
186
+ @employee.reload
187
+ @employee.version.should == 1
188
+ end
189
+
190
+ it "should update record if nothing is changed and partial updates are disabled" do
191
+ return pending("Not in this ActiveRecord version") unless TestEmployee.respond_to?(:partial_updates=)
192
+ TestEmployee.partial_updates = false
193
+ @employee = TestEmployee.create(
194
+ :first_name => "First",
195
+ :last_name => "Last",
196
+ :hire_date => @today
197
+ )
198
+ @employee.reload
199
+ @employee.save!
200
+ @employee.reload
201
+ @employee.version.should == 2
202
+ end
203
+
204
+ it "should delete record" do
205
+ @employee = TestEmployee.create(
206
+ :first_name => "First",
207
+ :last_name => "Last",
208
+ :hire_date => @today
209
+ )
210
+ @employee.reload
211
+ empl_id = @employee.id
212
+ @employee.destroy
213
+ @employee.should be_frozen
214
+ TestEmployee.find_by_employee_id(empl_id).should be_nil
215
+ end
216
+
217
+ it "should log create record" do
218
+ log_to @buffer
219
+ # reestablish plsql.connection as log_to might reset existing connection
220
+ plsql.connection = ActiveRecord::Base.connection.raw_connection
221
+ @employee = TestEmployee.create(
222
+ :first_name => "First",
223
+ :last_name => "Last",
224
+ :hire_date => @today
225
+ )
226
+ @buffer.string.should match(/^TestEmployee Create \(\d+\.\d+(ms)?\) custom create method$/)
227
+ end
228
+
229
+ it "should log update record" do
230
+ (TestEmployee.partial_updates = false) rescue nil
231
+ @employee = TestEmployee.create(
232
+ :first_name => "First",
233
+ :last_name => "Last",
234
+ :hire_date => @today
235
+ )
236
+ log_to @buffer
237
+ # reestablish plsql.connection as log_to might reset existing connection
238
+ plsql.connection = ActiveRecord::Base.connection.raw_connection
239
+ @employee.save!
240
+ @buffer.string.should match(/^TestEmployee Update \(\d+\.\d+(ms)?\) custom update method with employee_id=#{@employee.id}$/)
241
+ end
242
+
243
+ it "should log delete record" do
244
+ @employee = TestEmployee.create(
245
+ :first_name => "First",
246
+ :last_name => "Last",
247
+ :hire_date => @today
248
+ )
249
+ log_to @buffer
250
+ # reestablish plsql.connection as log_to might reset existing connection
251
+ plsql.connection = ActiveRecord::Base.connection.raw_connection
252
+ @employee.destroy
253
+ @buffer.string.should match(/^TestEmployee Destroy \(\d+\.\d+(ms)?\) custom delete method with employee_id=#{@employee.id}$/)
254
+ end
255
+
256
+ it "should validate new record before creation" do
257
+ @employee = TestEmployee.new(
258
+ :last_name => "Last",
259
+ :hire_date => @today
260
+ )
261
+ @employee.save.should be_false
262
+ @employee.errors.on(:first_name).should_not be_nil
263
+ end
264
+
265
+ it "should validate existing record before update" do
266
+ @employee = TestEmployee.create(
267
+ :first_name => "First",
268
+ :last_name => "Last",
269
+ :hire_date => @today
270
+ )
271
+ @employee.first_name = nil
272
+ @employee.save.should be_false
273
+ @employee.errors.on(:first_name).should_not be_nil
274
+ end
275
+
276
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
6
+ --reverse
@@ -0,0 +1,73 @@
1
+ require 'rubygems'
2
+ gem 'rspec'
3
+ require 'spec'
4
+
5
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
6
+
7
+ if ENV['RAILS_GEM_VERSION'] =~ /^2.0/
8
+ gem 'activerecord', '=2.0.2'
9
+ gem 'actionpack', '=2.0.2'
10
+ gem 'activesupport', '=2.0.2'
11
+ gem 'composite_primary_keys', '=0.9.93'
12
+ elsif ENV['RAILS_GEM_VERSION'] =~ /^2.1/
13
+ gem 'activerecord', '=2.1.2'
14
+ gem 'actionpack', '=2.1.2'
15
+ gem 'activesupport', '=2.1.2'
16
+ gem 'composite_primary_keys', '=1.0.8'
17
+ else
18
+ gem 'activerecord', '=2.2.2'
19
+ gem 'actionpack', '=2.2.2'
20
+ gem 'activesupport', '=2.2.2'
21
+ gem 'composite_primary_keys', '=2.2.0'
22
+ end
23
+
24
+ require 'activerecord'
25
+ require 'actionpack'
26
+ require 'action_controller/session/active_record_store'
27
+ if !defined?(RUBY_ENGINE)
28
+ gem "activerecord-oracle-adapter"
29
+ require 'active_record/connection_adapters/oracle_adapter'
30
+ elsif RUBY_ENGINE == 'jruby'
31
+ gem "activerecord-jdbc-adapter"
32
+ require 'active_record/connection_adapters/jdbc_adapter'
33
+ end
34
+
35
+ require 'active_record/connection_adapters/oracle_enhanced_adapter'
36
+
37
+ module LoggerSpecHelper
38
+ def log_to(stream)
39
+ ActiveRecord::Base.logger = Logger.new(stream)
40
+ if ActiveRecord::Base.respond_to?(:connection_pool)
41
+ ActiveRecord::Base.connection_pool.clear_reloadable_connections!
42
+ else
43
+ ActiveRecord::Base.clear_active_connections!
44
+ end
45
+ ActiveRecord::Base.colorize_logging = false
46
+ ActiveRecord::Base.logger.level = Logger::DEBUG
47
+ end
48
+ end
49
+
50
+ CONNECTION_PARAMS = {
51
+ :adapter => "oracle_enhanced",
52
+ :database => "xe",
53
+ :host => "ubuntu810",
54
+ :username => "hr",
55
+ :password => "hr"
56
+ }
57
+
58
+ JDBC_CONNECTION_PARAMS = {
59
+ :adapter => "jdbc",
60
+ :driver => "oracle.jdbc.driver.OracleDriver",
61
+ :url => "jdbc:oracle:thin:@ubuntu810:1521:XE",
62
+ :username => "hr",
63
+ :password => "hr"
64
+ }
65
+
66
+ SYS_CONNECTION_PARAMS = {
67
+ :adapter => "oracle_enhanced",
68
+ :database => "xe",
69
+ :host => "ubuntu810",
70
+ :username => "sys",
71
+ :password => "manager",
72
+ :privilege => "SYSDBA"
73
+ }