rom-sql 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile +1 -0
  4. data/lib/rom/sql/attribute.rb +1 -1
  5. data/lib/rom/sql/projection_dsl.rb +6 -0
  6. data/lib/rom/sql/version.rb +1 -1
  7. data/rom-sql.gemspec +1 -1
  8. data/spec/integration/association/many_to_many/custom_fks_spec.rb +9 -13
  9. data/spec/integration/association/many_to_many/from_view_spec.rb +9 -8
  10. data/spec/integration/association/many_to_many_spec.rb +103 -102
  11. data/spec/integration/association/many_to_one/custom_fks_spec.rb +6 -7
  12. data/spec/integration/association/many_to_one/from_view_spec.rb +8 -4
  13. data/spec/integration/association/many_to_one_spec.rb +61 -54
  14. data/spec/integration/association/one_to_many/custom_fks_spec.rb +7 -6
  15. data/spec/integration/association/one_to_many/from_view_spec.rb +7 -10
  16. data/spec/integration/association/one_to_many/self_ref_spec.rb +6 -6
  17. data/spec/integration/association/one_to_many_spec.rb +0 -3
  18. data/spec/integration/association/one_to_one_spec.rb +17 -11
  19. data/spec/integration/association/one_to_one_through_spec.rb +3 -5
  20. data/spec/integration/commands/create_spec.rb +33 -22
  21. data/spec/integration/commands/update_spec.rb +3 -3
  22. data/spec/integration/commands/upsert_spec.rb +1 -1
  23. data/spec/integration/gateway_spec.rb +12 -8
  24. data/spec/integration/migration_spec.rb +4 -3
  25. data/spec/integration/plugins/associates/many_to_many_spec.rb +2 -2
  26. data/spec/integration/plugins/associates_spec.rb +1 -1
  27. data/spec/integration/relation_schema_spec.rb +4 -5
  28. data/spec/integration/schema/call_spec.rb +1 -1
  29. data/spec/integration/schema/inferrer/mysql_spec.rb +22 -23
  30. data/spec/integration/schema/inferrer/postgres_spec.rb +83 -82
  31. data/spec/integration/schema/inferrer/sqlite_spec.rb +18 -19
  32. data/spec/integration/schema/inferrer_spec.rb +54 -33
  33. data/spec/integration/schema/prefix_spec.rb +9 -11
  34. data/spec/integration/schema/qualified_spec.rb +9 -11
  35. data/spec/integration/schema/rename_spec.rb +13 -15
  36. data/spec/integration/schema/view_spec.rb +2 -2
  37. data/spec/integration/sequel_api_spec.rb +1 -1
  38. data/spec/integration/setup_spec.rb +5 -5
  39. data/spec/integration/support/active_support_notifications_spec.rb +2 -2
  40. data/spec/integration/support/rails_log_subscriber_spec.rb +2 -2
  41. data/spec/shared/accounts.rb +44 -0
  42. data/spec/shared/database_setup.rb +42 -81
  43. data/spec/shared/notes.rb +21 -0
  44. data/spec/shared/posts.rb +32 -0
  45. data/spec/shared/puppies.rb +13 -0
  46. data/spec/shared/relations.rb +1 -1
  47. data/spec/shared/users.rb +29 -0
  48. data/spec/shared/users_and_tasks.rb +32 -18
  49. data/spec/spec_helper.rb +18 -30
  50. data/spec/support/env_helper.rb +25 -0
  51. data/spec/support/oracle/create_users.sql +7 -0
  52. data/spec/support/oracle/set_sys_passwords.sql +2 -0
  53. data/spec/unit/plugin/pagination_spec.rb +2 -2
  54. data/spec/unit/plugin/timestamp_spec.rb +1 -1
  55. data/spec/unit/projection_dsl_spec.rb +8 -0
  56. data/spec/unit/relation/group_spec.rb +5 -3
  57. data/spec/unit/relation/max_spec.rb +1 -1
  58. data/spec/unit/relation/select_spec.rb +7 -0
  59. metadata +33 -5
  60. data/spec/shared/users_and_accounts.rb +0 -10
@@ -1,11 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe ROM::SQL::Association::ManyToOne, '#call' do
4
+ include_context 'database setup'
5
+
6
+ before do
7
+ inferrable_relations.concat %i(destinations flights)
8
+ end
9
+
4
10
  let(:assoc_inter) { relations[:flights].associations[:inter_destination] }
5
11
  let(:assoc_final) { relations[:flights].associations[:final_destination] }
6
12
 
7
- include_context 'database setup'
8
-
9
13
  with_adapters do
10
14
  before do
11
15
  conn.create_table(:destinations) do
@@ -59,7 +63,7 @@ RSpec.describe ROM::SQL::Association::ManyToOne, '#call' do
59
63
  expect(relation.schema.map(&:to_sym)).
60
64
  to eql(%i(destinations__id destinations__name destinations__intermediate flights__id___flight_id))
61
65
 
62
- expect(relation.first).to eql(id: 2, intermediate: true, name: 'Intermediate', flight_id: 1)
66
+ expect(relation.first).to eql(id: 2, intermediate: db_true, name: 'Intermediate', flight_id: 1)
63
67
  expect(relation.count).to be(1)
64
68
 
65
69
  relation = assoc_final.call(relations)
@@ -67,7 +71,7 @@ RSpec.describe ROM::SQL::Association::ManyToOne, '#call' do
67
71
  expect(relation.schema.map(&:to_sym)).
68
72
  to eql(%i(destinations__id destinations__name destinations__intermediate flights__id___flight_id))
69
73
 
70
- expect(relation.first).to eql(id: 1, intermediate: false, name: 'Final', flight_id: 2)
74
+ expect(relation.first).to eql(id: 1, intermediate: db_false, name: 'Final', flight_id: 2)
71
75
  expect(relation.count).to be(1)
72
76
  end
73
77
  end
@@ -1,86 +1,93 @@
1
1
  RSpec.describe ROM::SQL::Association::ManyToOne, helpers: true do
2
- subject(:assoc) {
3
- ROM::SQL::Association::ManyToOne.new(:tasks, :users)
4
- }
5
-
6
- include_context 'users and tasks'
7
-
8
2
  let(:users) { container.relations[:users] }
9
3
  let(:tasks) { container.relations[:tasks] }
10
- let(:articles) { container.relations[:articles] }
11
4
 
12
5
  with_adapters do
13
- before do
14
- conf.relation(:tasks) do
15
- schema do
16
- attribute :id, ROM::SQL::Types::Serial
17
- attribute :user_id, ROM::SQL::Types::ForeignKey(:users)
18
- attribute :title, ROM::SQL::Types::String
6
+ context 'common name conventions' do
7
+ include_context 'users and tasks'
8
+ include_context 'accounts'
9
+
10
+ subject(:assoc) {
11
+ ROM::SQL::Association::ManyToOne.new(:tasks, :users)
12
+ }
13
+
14
+ before do
15
+ conf.relation(:tasks) do
16
+ schema do
17
+ attribute :id, ROM::SQL::Types::Serial
18
+ attribute :user_id, ROM::SQL::Types::ForeignKey(:users)
19
+ attribute :title, ROM::SQL::Types::String
20
+ end
19
21
  end
20
22
  end
21
- end
22
23
 
23
- describe '#result' do
24
- specify { expect(ROM::SQL::Association::ManyToOne.result).to be(:one) }
25
- end
24
+ describe '#result' do
25
+ specify { expect(ROM::SQL::Association::ManyToOne.result).to be(:one) }
26
+ end
26
27
 
27
- describe '#name' do
28
- it 'uses target by default' do
29
- expect(assoc.name).to be(:users)
28
+ describe '#name' do
29
+ it 'uses target by default' do
30
+ expect(assoc.name).to be(:users)
31
+ end
30
32
  end
31
- end
32
33
 
33
- describe '#target' do
34
- it 'builds full relation name' do
35
- assoc = ROM::SQL::Association::ManyToOne.new(:users, :tasks, relation: :foo)
34
+ describe '#target' do
35
+ it 'builds full relation name' do
36
+ assoc = ROM::SQL::Association::ManyToOne.new(:users, :tasks, relation: :foo)
36
37
 
37
- expect(assoc.name).to be(:tasks)
38
- expect(assoc.target).to eql(ROM::SQL::Association::Name[:foo, :tasks])
38
+ expect(assoc.name).to be(:tasks)
39
+ expect(assoc.target).to eql(ROM::SQL::Association::Name[:foo, :tasks])
40
+ end
39
41
  end
40
- end
41
42
 
42
- describe '#call' do
43
- it 'prepares joined relations' do
44
- relation = assoc.call(container.relations)
43
+ describe '#call' do
44
+ it 'prepares joined relations' do
45
+ relation = assoc.call(container.relations)
45
46
 
46
- expect(relation.schema.map(&:to_sym))
47
- .to eql(%i[users__id users__name tasks__id___task_id])
47
+ expect(relation.schema.map(&:to_sym))
48
+ .to eql(%i[users__id users__name tasks__id___task_id])
48
49
 
49
- expect(relation.where(user_id: 1).one).to eql(id: 1, task_id: 2, name: 'Jane')
50
+ expect(relation.where(user_id: 1).one).to eql(id: 1, task_id: 2, name: 'Jane')
50
51
 
51
- expect(relation.where(user_id: 2).one).to eql(id: 2, task_id: 1, name: 'Joe')
52
+ expect(relation.where(user_id: 2).one).to eql(id: 2, task_id: 1, name: 'Joe')
52
53
 
53
- expect(relation.to_a).to eql([
54
- { id: 2, task_id: 1, name: 'Joe' },
55
- { id: 1, task_id: 2, name: 'Jane' }
56
- ])
54
+ expect(relation.to_a).
55
+ to eql([{ id: 2, task_id: 1, name: 'Joe' },
56
+ { id: 1, task_id: 2, name: 'Jane' }])
57
+ end
57
58
  end
58
- end
59
59
 
60
- describe ROM::Plugins::Relation::SQL::AutoCombine, '#for_combine' do
61
- it 'preloads relation based on association' do
62
- relation = users.for_combine(assoc).call(tasks.call)
60
+ describe ROM::Plugins::Relation::SQL::AutoCombine, '#for_combine' do
61
+ it 'preloads relation based on association' do
62
+ relation = users.for_combine(assoc).call(tasks.call)
63
63
 
64
- expect(relation.to_a).to eql([
65
- { id: 2, task_id: 1, name: 'Joe' },
66
- { id: 1, task_id: 2, name: 'Jane' }
67
- ])
68
- end
64
+ expect(relation.to_a).
65
+ to eql([{ id: 2, task_id: 1, name: 'Joe' },
66
+ { id: 1, task_id: 2, name: 'Jane' }])
67
+ end
69
68
 
70
- it 'maintains original relation' do
71
- users.accounts.insert(user_id: 2, number: 'a1', balance: 0)
69
+ it 'maintains original relation' do
70
+ users.accounts.insert(user_id: 2, number: 'a1', balance: 0)
72
71
 
73
- relation = users.
74
- join(:accounts, user_id: :id).
75
- select_append(users.accounts[:number].as(:account_num)).
76
- for_combine(assoc).call(tasks.call)
72
+ relation = users.
73
+ join(:accounts, user_id: :id).
74
+ select_append(users.accounts[:number].as(:account_num)).
75
+ order(:account_num).
76
+ for_combine(assoc).call(tasks.call)
77
77
 
78
- expect(relation.to_a).to eql([{ id: 2, task_id: 1, name: 'Joe', account_num: 'a1' }])
78
+ expect(relation.to_a).
79
+ to eql([{ id: 2, task_id: 1, name: 'Joe', account_num: 'a1' },
80
+ { id: 1, task_id: 2, name: 'Jane', account_num: '42' }])
81
+ end
79
82
  end
80
83
  end
81
84
 
82
85
  context 'arbitrary name conventions' do
86
+ include_context 'users'
87
+ include_context 'posts'
88
+
83
89
  let(:articles_name) { ROM::Relation::Name[:articles, :posts] }
90
+ let(:articles) { container.relations[:articles] }
84
91
 
85
92
  subject(:assoc) do
86
93
  ROM::SQL::Association::ManyToOne.new(articles_name, :users)
@@ -1,12 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe ROM::SQL::Association::OneToMany, '#call' do
4
+ include_context 'users'
5
+
6
+ before do
7
+ inferrable_relations.concat %i(puzzles)
8
+ end
9
+
4
10
  subject(:assoc) do
5
11
  relations[:users].associations[:solved_puzzles]
6
12
  end
7
13
 
8
- include_context 'database setup'
9
-
10
14
  with_adapters do
11
15
  before do
12
16
  conn.create_table(:puzzles) do
@@ -25,9 +29,6 @@ RSpec.describe ROM::SQL::Association::OneToMany, '#call' do
25
29
  end
26
30
  end
27
31
 
28
- joe_id = relations[:users].insert(name: 'Joe')
29
- jane_id = relations[:users].insert(name: 'Jane')
30
-
31
32
  relations[:puzzles].insert(author_id: joe_id, text: 'P1')
32
33
  relations[:puzzles].insert(author_id: joe_id, solver_id: jane_id, text: 'P2')
33
34
  end
@@ -42,7 +43,7 @@ RSpec.describe ROM::SQL::Association::OneToMany, '#call' do
42
43
  expect(relation.schema.map(&:to_sym)).
43
44
  to eql(%i[puzzles__id puzzles__author_id puzzles__solver_id puzzles__text])
44
45
 
45
- expect(relation.first).to eql(id: 2, author_id: 1, solver_id: 2, text: 'P2')
46
+ expect(relation.first).to eql(id: 2, author_id: 2, solver_id: 1, text: 'P2')
46
47
  end
47
48
  end
48
49
  end
@@ -1,12 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe ROM::SQL::Association::OneToMany, '#call' do
4
+ include_context 'users'
5
+
6
+ before do
7
+ inferrable_relations.concat %i(puzzles)
8
+ end
9
+
4
10
  subject(:assoc) do
5
11
  relations[:users].associations[:solved_puzzles]
6
12
  end
7
13
 
8
- include_context 'database setup'
9
-
10
14
  with_adapters do
11
15
  before do
12
16
  conn.create_table(:puzzles) do
@@ -33,17 +37,10 @@ RSpec.describe ROM::SQL::Association::OneToMany, '#call' do
33
37
  end
34
38
  end
35
39
 
36
- joe_id = relations[:users].insert(name: 'Joe')
37
- jane_id = relations[:users].insert(name: 'Jane')
38
-
39
40
  relations[:puzzles].insert(user_id: joe_id, text: 'P1')
40
41
  relations[:puzzles].insert(user_id: joe_id, solved: true, text: 'P2')
41
42
  end
42
43
 
43
- after do
44
- conn.drop_table(:puzzles)
45
- end
46
-
47
44
  it 'prepares joined relations using custom view' do
48
45
  relation = assoc.call(relations)
49
46
 
@@ -51,7 +48,7 @@ RSpec.describe ROM::SQL::Association::OneToMany, '#call' do
51
48
  to eql(%i[puzzles__id puzzles__user_id puzzles__text puzzles__solved])
52
49
 
53
50
  expect(relation.count).to be(1)
54
- expect(relation.first).to eql(id: 2, user_id: 1, solved: true, text: 'P2')
51
+ expect(relation.first).to eql(id: 2, user_id: 2, solved: db_true, text: 'P2')
55
52
  end
56
53
  end
57
54
  end
@@ -1,12 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe ROM::SQL::Association::OneToMany, '#call' do
4
+ include_context 'database setup'
5
+
6
+ before do
7
+ inferrable_relations.concat %i(categories)
8
+ end
9
+
4
10
  subject(:assoc) do
5
11
  relations[:categories].associations[:children]
6
12
  end
7
13
 
8
- include_context 'database setup'
9
-
10
14
  with_adapters do
11
15
  before do
12
16
  conn.create_table(:categories) do
@@ -31,10 +35,6 @@ RSpec.describe ROM::SQL::Association::OneToMany, '#call' do
31
35
  c3_id = relations[:categories].insert(name: 'C5', parent_id: p1_id)
32
36
  end
33
37
 
34
- after do
35
- conn.drop_table(:categories)
36
- end
37
-
38
38
  it 'prepares joined relations using custom FK for a self-ref association' do
39
39
  relation = assoc.call(relations)
40
40
 
@@ -5,9 +5,6 @@ RSpec.describe ROM::SQL::Association::OneToMany do
5
5
 
6
6
  include_context 'users and tasks'
7
7
 
8
- let(:users) { container.relations[:users] }
9
- let(:tasks) { container.relations[:tasks] }
10
-
11
8
  with_adapters do
12
9
  before do
13
10
  conf.relation(:tasks) do
@@ -1,15 +1,15 @@
1
1
  RSpec.describe ROM::SQL::Association::OneToOne do
2
+ include_context 'users'
3
+ include_context 'accounts'
4
+
2
5
  subject(:assoc) {
3
6
  ROM::SQL::Association::OneToOne.new(:users, :accounts)
4
7
  }
5
8
 
6
- include_context 'users and accounts'
7
-
8
- let(:users) { container.relations[:users] }
9
- let(:accounts) { container.relations[:accounts] }
10
-
11
9
  with_adapters do
12
10
  before do
11
+ conn[:accounts].insert user_id: 1, number: '43', balance: -273.15.to_d
12
+
13
13
  conf.relation(:accounts) do
14
14
  schema do
15
15
  attribute :id, ROM::SQL::Types::Serial
@@ -33,10 +33,13 @@ RSpec.describe ROM::SQL::Association::OneToOne do
33
33
  # TODO: this if caluse should be removed when (and if) https://github.com/xerial/sqlite-jdbc/issues/112
34
34
  # will be resolved. See https://github.com/rom-rb/rom-sql/issues/49 for details
35
35
  if jruby? && sqlite?(example)
36
- expect(relation.to_a).to eql([id: 1, user_id: 1, number: '42', balance: 10_000])
36
+ expect(relation.to_a).
37
+ to eql([{ id: 1, user_id: 1, number: '42', balance: 10_000 },
38
+ { id: 2, user_id: 1, number: '43', balance: -273.15 }])
37
39
  else
38
- pending 'find out why mysql returns integer here' if !jruby? && mysql?(example)
39
- expect(relation.to_a).to eql([id: 1, user_id: 1, number: '42', balance: 10_000.to_d])
40
+ expect(relation.to_a).
41
+ to eql([{ id: 1, user_id: 1, number: '42', balance: 10_000.to_d },
42
+ { id: 2, user_id: 1, number: '43', balance: -273.15.to_d }])
40
43
  end
41
44
  end
42
45
  end
@@ -48,10 +51,13 @@ RSpec.describe ROM::SQL::Association::OneToOne do
48
51
  # TODO: this if caluse should be removed when (and if) https://github.com/xerial/sqlite-jdbc/issues/112
49
52
  # will be resolved. See https://github.com/rom-rb/rom-sql/issues/49 for details
50
53
  if jruby? && sqlite?(example)
51
- expect(relation.to_a).to eql([id: 1, user_id: 1, number: '42', balance: 10_000])
54
+ expect(relation.to_a).
55
+ to eql([{ id: 1, user_id: 1, number: '42', balance: 10_000 },
56
+ { id: 2, user_id: 1, number: '43', balance: -273.15 }])
52
57
  else
53
- pending 'find out why mysql returns integer here' if !jruby? && mysql?(example)
54
- expect(relation.to_a).to eql([id: 1, user_id: 1, number: '42', balance: 10_000.to_d])
58
+ expect(relation.to_a).
59
+ to eql([{ id: 1, user_id: 1, number: '42', balance: 10_000.to_d },
60
+ { id: 2, user_id: 1, number: '43', balance: -273.15.to_d }])
55
61
  end
56
62
  end
57
63
  end
@@ -1,13 +1,11 @@
1
1
  RSpec.describe ROM::SQL::Association::OneToOneThrough do
2
+ include_context 'users'
3
+ include_context 'accounts'
4
+
2
5
  subject(:assoc) {
3
6
  ROM::SQL::Association::OneToOneThrough.new(:users, :cards, through: :accounts)
4
7
  }
5
8
 
6
- include_context 'users and accounts'
7
-
8
- let(:users) { container.relations[:users] }
9
- let(:cards) { container.relations[:cards] }
10
-
11
9
  with_adapters do
12
10
  before do
13
11
  conf.relation(:accounts) do
@@ -1,6 +1,6 @@
1
1
  require 'dry-struct'
2
2
 
3
- RSpec.describe 'Commands / Create', :postgres do
3
+ RSpec.describe 'Commands / Create', :postgres, seeds: false do
4
4
  include_context 'relations'
5
5
 
6
6
  let(:users) { commands[:users] }
@@ -19,10 +19,6 @@ RSpec.describe 'Commands / Create', :postgres do
19
19
 
20
20
  conn.add_index :users, :name, unique: true
21
21
 
22
- conf.relation(:puppies) do
23
- schema(infer: true)
24
- end
25
-
26
22
  conf.commands(:users) do
27
23
  define(:create) do
28
24
  input Test::Params
@@ -38,10 +34,6 @@ RSpec.describe 'Commands / Create', :postgres do
38
34
  conf.commands(:tasks) do
39
35
  define(:create)
40
36
  end
41
-
42
- conf.commands(:puppies) do
43
- define(:create)
44
- end
45
37
  end
46
38
 
47
39
  with_adapters do
@@ -51,7 +43,7 @@ RSpec.describe 'Commands / Create', :postgres do
51
43
  users.create.call(name: 'Jane')
52
44
  }
53
45
 
54
- expect(result.value).to eq(id: 1, name: 'Jane')
46
+ expect(result.value).to eql(id: 1, name: 'Jane')
55
47
  end
56
48
 
57
49
  it 'creates multiple records if nothing was raised' do
@@ -71,7 +63,7 @@ RSpec.describe 'Commands / Create', :postgres do
71
63
  }
72
64
  }
73
65
 
74
- expect(result.value).to eq(id: 1, name: 'Jane')
66
+ expect(result.value).to eql(id: 1, name: 'Jane')
75
67
  end
76
68
 
77
69
  it 'creates nothing if command error was raised' do
@@ -182,12 +174,30 @@ RSpec.describe 'Commands / Create', :postgres do
182
174
  }.to raise_error(ROM::SQL::NotNullConstraintError)
183
175
  end
184
176
 
185
- it 're-raises not-null constraint violation error with nil boolean' do
186
- puppies = commands[:puppies]
177
+ # Because Oracle doesn't have boolean in SQL
178
+ if !metadata[:oracle]
179
+ context 'with puppies' do
180
+ include_context 'puppies'
187
181
 
188
- expect {
189
- puppies.try { puppies.create.call(name: 'Charlie', cute: nil) }
190
- }.to raise_error(ROM::SQL::NotNullConstraintError)
182
+ before do
183
+ conf.relation(:puppies) do
184
+ schema(infer: true)
185
+ end
186
+
187
+
188
+ conf.commands(:puppies) do
189
+ define(:create)
190
+ end
191
+ end
192
+
193
+ it 're-raises not-null constraint violation error with nil boolean' do
194
+ puppies = commands[:puppies]
195
+
196
+ expect {
197
+ puppies.try { puppies.create.call(name: 'Charlie', cute: nil) }
198
+ }.to raise_error(ROM::SQL::NotNullConstraintError)
199
+ end
200
+ end
191
201
  end
192
202
 
193
203
  it 're-raises uniqueness constraint violation error' do
@@ -239,7 +249,11 @@ RSpec.describe 'Commands / Create', :postgres do
239
249
 
240
250
  context 'with a composite pk' do
241
251
  before do
242
- conn.create_table?(:user_group) do
252
+ inferrable_relations.concat %i(user_group)
253
+ end
254
+
255
+ before do
256
+ conn.create_table(:user_group) do
243
257
  primary_key [:user_id, :group_id]
244
258
  column :user_id, Integer, null: false
245
259
  column :group_id, Integer, null: false
@@ -254,16 +268,13 @@ RSpec.describe 'Commands / Create', :postgres do
254
268
  end
255
269
  end
256
270
 
257
- after do
258
- conn.drop_table(:user_group)
259
- end
260
-
261
271
  # with a composite pk sequel returns 0 when inserting for MySQL
262
272
  if !metadata[:mysql]
263
- it 'materializes the result' do
273
+ it 'materializes the result' do |ex|
264
274
  command = container.commands[:user_group][:create]
265
275
  result = command.call(user_id: 1, group_id: 2)
266
276
 
277
+ pending "if sequel could use Oracle's RETURNING statement, that would be possible" if oracle?(ex)
267
278
  expect(result).to eql(user_id: 1, group_id: 2)
268
279
  end
269
280
  end