Skip to content

Commit 600c0de

Browse files
author
Nicolas Rodriguez
committed
Test with Oracle
1 parent 827dce6 commit 600c0de

17 files changed

+139
-30
lines changed

.travis.yml

+17-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,15 @@ matrix:
3131
- rvm: 2.4.1
3232
gemfile: gemfiles/rails_5.1.1.gemfile
3333
env: DB_ADAPTER=mysql2
34+
- rvm: 2.4.1
35+
gemfile: gemfiles/rails_4.2.8.gemfile
36+
env: DB_ADAPTER=oracle_enhanced
37+
- rvm: 2.4.1
38+
gemfile: gemfiles/rails_5.0.3.gemfile
39+
env: DB_ADAPTER=oracle_enhanced
40+
- rvm: 2.4.1
41+
gemfile: gemfiles/rails_5.1.1.gemfile
42+
env: DB_ADAPTER=oracle_enhanced
3443
after_success:
3544
- bundle exec codeclimate-test-reporter
3645
services:
@@ -43,10 +52,17 @@ addons:
4352
- mysql-server-5.6
4453
- mysql-client-core-5.6
4554
- mysql-client-5.6
46-
before_script:
55+
before_install:
4756
- sh -c "if [ '$DB_ADAPTER' = 'mysql2' ]; then mysql -e 'create database ajax_datatables_rails;'; fi"
4857
- sh -c "if [ '$DB_ADAPTER' = 'postgresql' ]; then psql -c 'create database ajax_datatables_rails;' -U postgres; fi"
58+
- sh -c "if [ '$DB_ADAPTER' = 'oracle_enhanced' ]; then ./spec/install_oracle.sh; fi"
4959
env:
60+
global:
61+
- ORACLE_COOKIE=sqldev
62+
- ORACLE_FILE=oracle11g/xe/oracle-xe-11.2.0-1.0.x86_64.rpm.zip
63+
- ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe
64+
- ORACLE_SID=XE
5065
matrix:
5166
- DB_ADAPTER=postgresql
5267
- DB_ADAPTER=mysql2
68+
- DB_ADAPTER=oracle_enhanced

Appraisals

+29-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,34 @@
1-
RAILS_VERSIONS = %w(
2-
4.0.13
3-
4.1.15
4-
4.2.8
5-
5.0.3
6-
5.1.1
7-
)
1+
RAILS_VERSIONS = {
2+
'4.0.13' => {
3+
'mysql2' => '~> 0.3.18',
4+
'activerecord-oracle_enhanced-adapter' => '~> 1.5.0'
5+
},
6+
'4.1.15' => {
7+
'mysql2' => '~> 0.3.18',
8+
'activerecord-oracle_enhanced-adapter' => '~> 1.5.0'
9+
},
10+
'4.2.8' => {
11+
'activerecord-oracle_enhanced-adapter' => '~> 1.6.0'
12+
},
13+
'5.0.3' => {
14+
'activerecord-oracle_enhanced-adapter' => '~> 1.7.0',
15+
'ruby-oci8' => ''
16+
},
17+
'5.1.1' => {
18+
'activerecord-oracle_enhanced-adapter' => '~> 1.8.0',
19+
'ruby-oci8' => ''
20+
}
21+
}
822

9-
RAILS_VERSIONS.each do |version|
23+
RAILS_VERSIONS.each do |version, gems|
1024
appraise "rails_#{version}" do
1125
gem 'rails', version
12-
gem 'mysql2', '~> 0.3.18' if version == '4.1.15' || version == '4.0.13'
26+
gems.each do |name, version|
27+
if version.empty?
28+
gem name
29+
else
30+
gem name, version
31+
end
32+
end
1333
end
1434
end

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
> * Ruby 2.2.7 / 2.3.4 / 2.4.1
1818
> * Postgresql
1919
> * MySQL
20+
> * Oracle XE 11.2 (thanks to [travis-oracle](https://github.com/cbandy/travis-oracle))
2021
2122
## Description
2223

ajax-datatables-rails.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
2020
s.add_development_dependency 'pg'
2121
s.add_development_dependency 'mysql2'
2222
s.add_development_dependency 'sqlite3'
23+
s.add_development_dependency 'activerecord-oracle_enhanced-adapter'
2324
s.add_development_dependency 'rspec'
2425
s.add_development_dependency 'generator_spec'
2526
s.add_development_dependency 'pry'

gemfiles/rails_4.0.13.gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ source "https://rubygems.org"
44

55
gem "rails", "4.0.13"
66
gem "mysql2", "~> 0.3.18"
7+
gem "activerecord-oracle_enhanced-adapter", "~> 1.5.0"
8+
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
79

810
group :test do
911
gem "codeclimate-test-reporter", "~> 1.0.0"

gemfiles/rails_4.1.15.gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ source "https://rubygems.org"
44

55
gem "rails", "4.1.15"
66
gem "mysql2", "~> 0.3.18"
7+
gem "activerecord-oracle_enhanced-adapter", "~> 1.5.0"
8+
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
79

810
group :test do
911
gem "codeclimate-test-reporter", "~> 1.0.0"

gemfiles/rails_4.2.8.gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
source "https://rubygems.org"
44

55
gem "rails", "4.2.8"
6+
gem "activerecord-oracle_enhanced-adapter", "~> 1.6.0"
7+
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
68

79
group :test do
810
gem "codeclimate-test-reporter", "~> 1.0.0"

gemfiles/rails_5.0.3.gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
source "https://rubygems.org"
44

55
gem "rails", "5.0.3"
6+
gem "activerecord-oracle_enhanced-adapter", "~> 1.7.0"
7+
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
68

79
group :test do
810
gem "codeclimate-test-reporter", "~> 1.0.0"

gemfiles/rails_5.1.1.gemfile

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
source "https://rubygems.org"
44

55
gem "rails", "5.1.1"
6+
gem "activerecord-oracle_enhanced-adapter", "~> 1.8.0"
7+
gem "ruby-oci8" if ENV["DB_ADAPTER"] == "oracle_enhanced"
68

79
group :test do
810
gem "codeclimate-test-reporter", "~> 1.0.0"

lib/ajax-datatables-rails/base.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def records_total_count
9595
end
9696

9797
def records_filtered_count
98-
get_raw_records.model.from("(#{filter_records(get_raw_records).except(:limit, :offset, :order).to_sql}) AS foo").count
98+
filter_records(get_raw_records).count(:all)
9999
end
100100

101101
# Private helper methods

lib/ajax-datatables-rails/datatable/column.rb

+1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def non_regex_search
136136

137137
def typecast
138138
case config.db_adapter
139+
when :oracle, :oracleenhanced then 'VARCHAR2(4000)'
139140
when :mysql, :mysql2 then 'CHAR'
140141
when :sqlite, :sqlite3 then 'TEXT'
141142
else

spec/ajax-datatables-rails/extended_spec.rb

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66

77
describe 'it can transform search value before asking the database' do
88
before(:each) do
9-
create(:user, username: 'johndoe', email: '[email protected]', last_name: 'Doe')
10-
create(:user, username: 'msmith', email: '[email protected]', last_name: 'Smith')
11-
datatable.params[:columns]['3'][:search][:value] = 'DOE'
9+
create(:user, username: 'johndoe', email: '[email protected]', last_name: 'DOE')
10+
create(:user, username: 'msmith', email: '[email protected]', last_name: 'SMITH')
11+
datatable.params[:columns]['3'][:search][:value] = 'doe'
1212
end
1313

1414
it 'should filter records' do
1515
expect(datatable.data.size).to eq 1
1616
item = datatable.data.first
17-
expect(item[:last_name]).to eq 'Doe'
17+
expect(item[:last_name]).to eq 'DOE'
1818
end
1919
end
2020
end

spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb

+28-6
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656

5757
context 'with search query' do
5858
before(:each) do
59-
datatable.params[:search] = { value: "John", regex: "false" }
59+
datatable.params[:search] = { value: "john", regex: "false" }
6060
end
6161

6262
it 'returns a filtering query' do
@@ -97,6 +97,18 @@
9797
end
9898
end
9999

100+
if AjaxDatatablesRails.config.db_adapter.in? %i[oracle oracleenhanced]
101+
context 'when db_adapter is oracle' do
102+
it 'can call #to_sql on returned object' do
103+
result = datatable.send(:build_conditions_for_selected_columns)
104+
expect(result).to respond_to(:to_sql)
105+
expect(result.to_sql).to eq(
106+
"CAST(\"USERS\".\"USERNAME\" AS VARCHAR2(4000)) LIKE '%doe%' AND CAST(\"USERS\".\"EMAIL\" AS VARCHAR2(4000)) LIKE '%example%'"
107+
)
108+
end
109+
end
110+
end
111+
100112
if AjaxDatatablesRails.config.db_adapter.in? %i[mysql2 sqlite3]
101113
context 'when db_adapter is mysql2' do
102114
it 'can call #to_sql on returned object' do
@@ -143,11 +155,21 @@
143155
expect(column.send(:typecast)).to eq('VARCHAR')
144156
end
145157

146-
it 'returns VARCHAR if :db_adapter is :postgre' do
158+
it 'returns VARCHAR if :db_adapter is :postgresql' do
147159
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :postgresql }
148160
expect(column.send(:typecast)).to eq('VARCHAR')
149161
end
150162

163+
it 'returns VARCHAR if :db_adapter is :oracle' do
164+
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :oracle }
165+
expect(column.send(:typecast)).to eq('VARCHAR2(4000)')
166+
end
167+
168+
it 'returns VARCHAR if :db_adapter is :oracleenhanced' do
169+
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :oracleenhanced }
170+
expect(column.send(:typecast)).to eq('VARCHAR2(4000)')
171+
end
172+
151173
it 'returns CHAR if :db_adapter is :mysql2' do
152174
allow_any_instance_of(AjaxDatatablesRails::Configuration).to receive(:db_adapter) { :mysql2 }
153175
expect(column.send(:typecast)).to eq('CHAR')
@@ -260,7 +282,7 @@
260282
end
261283

262284
it 'should filter records matching' do
263-
datatable.params[:columns]['2'][:search][:value] = 'jo'
285+
datatable.params[:columns]['2'][:search][:value] = 'Jo'
264286
expect(datatable.data.size).to eq 1
265287
item = datatable.data.first
266288
expect(item[:first_name]).to eq 'John'
@@ -269,15 +291,15 @@
269291

270292
describe 'it can filter records with condition :end_with' do
271293
before(:each) do
272-
create(:user, last_name: 'John')
273-
create(:user, last_name: 'Mary')
294+
create(:user, last_name: 'JOHN')
295+
create(:user, last_name: 'MARY')
274296
end
275297

276298
it 'should filter records matching' do
277299
datatable.params[:columns]['3'][:search][:value] = 'ry'
278300
expect(datatable.data.size).to eq 1
279301
item = datatable.data.first
280-
expect(item[:last_name]).to eq 'Mary'
302+
expect(item[:last_name]).to eq 'MARY'
281303
end
282304
end
283305

spec/ajax-datatables-rails/orm/active_record_paginate_records_spec.rb

+30-6
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,39 @@
1717
end
1818

1919
it 'paginates records properly' do
20-
expect(datatable.paginate_records(records).to_sql).to include(
21-
'LIMIT 10 OFFSET 0'
22-
)
20+
if AjaxDatatablesRails.config.db_adapter.in? %i[oracle oracleenhanced]
21+
if Rails.version.in? %w[4.0.13 4.1.15 4.2.8]
22+
expect(datatable.paginate_records(records).to_sql).to include(
23+
'rownum <= 10'
24+
)
25+
else
26+
expect(datatable.paginate_records(records).to_sql).to include(
27+
'rownum <= (0 + 10)'
28+
)
29+
end
30+
else
31+
expect(datatable.paginate_records(records).to_sql).to include(
32+
'LIMIT 10 OFFSET 0'
33+
)
34+
end
2335

2436
datatable.params[:start] = '26'
2537
datatable.params[:length] = '25'
26-
expect(datatable.paginate_records(records).to_sql).to include(
27-
'LIMIT 25 OFFSET 25'
28-
)
38+
if AjaxDatatablesRails.config.db_adapter.in? %i[oracle oracleenhanced]
39+
if Rails.version.in? %w[4.0.13 4.1.15 4.2.8]
40+
expect(datatable.paginate_records(records).to_sql).to include(
41+
'rownum <= 50'
42+
)
43+
else
44+
expect(datatable.paginate_records(records).to_sql).to include(
45+
'rownum <= (25 + 25)'
46+
)
47+
end
48+
else
49+
expect(datatable.paginate_records(records).to_sql).to include(
50+
'LIMIT 25 OFFSET 25'
51+
)
52+
end
2953
end
3054

3155
it 'depends on the value of #offset' do

spec/install_oracle.sh

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#!/bin/bash
2+
3+
wget 'https://github.com/cbandy/travis-oracle/archive/v2.0.2.tar.gz'
4+
mkdir -p ~/.travis/oracle
5+
tar xz --strip-components 1 -C ~/.travis/oracle -f v2.0.2.tar.gz
6+
7+
~/.travis/oracle/download.sh
8+
~/.travis/oracle/install.sh
9+
10+
"$ORACLE_HOME/bin/sqlplus" -L -S / AS SYSDBA <<SQL
11+
ALTER USER $USER IDENTIFIED BY $USER;
12+
SQL

spec/spec_helper.rb

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
}
6767

6868
options = options.merge(username: 'root') if adapter == 'mysql2'
69+
options = options.merge(username: ENV['USER'], password: ENV['USER'], database: 'xe', host: '127.0.0.1/xe') if adapter == 'oracle_enhanced'
6970
options = options.merge(database: ':memory:') if adapter == 'sqlite3'
7071

7172
ActiveRecord::Base.establish_connection(options)

spec/support/test_helpers.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,7 @@ def view_columns
7676
last_name: { source: 'User.last_name', formater: -> (o) { o.upcase } },
7777
}
7878
end
79-
end
8079

81-
class ComplexDatatableHash < ComplexDatatable
8280
def data
8381
records.map do |record|
8482
{
@@ -91,6 +89,9 @@ def data
9189
end
9290
end
9391

92+
class ComplexDatatableHash < ComplexDatatable
93+
end
94+
9495
class ComplexDatatableArray < ComplexDatatable
9596
def data
9697
records.map do |record|
@@ -110,7 +111,7 @@ def view_columns
110111
username: { source: 'User.username' },
111112
email: { source: 'User.email', cond: :null_value },
112113
first_name: { source: 'User.first_name', cond: :start_with },
113-
last_name: { source: 'User.last_name', cond: :end_with, formater: -> (o) { o.downcase } },
114+
last_name: { source: 'User.last_name', cond: :end_with, formater: -> (o) { o.upcase } },
114115
post_id: { source: 'User.post_id' },
115116
created_at: { source: 'User.created_at', cond: :date_range },
116117
}

0 commit comments

Comments
 (0)