sequel 3.28.0 → 3.29.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. data/CHANGELOG +119 -3
  2. data/Rakefile +5 -3
  3. data/bin/sequel +1 -5
  4. data/doc/model_hooks.rdoc +9 -1
  5. data/doc/opening_databases.rdoc +49 -40
  6. data/doc/prepared_statements.rdoc +27 -6
  7. data/doc/release_notes/3.28.0.txt +2 -2
  8. data/doc/release_notes/3.29.0.txt +459 -0
  9. data/doc/sharding.rdoc +7 -1
  10. data/doc/testing.rdoc +18 -9
  11. data/doc/transactions.rdoc +41 -1
  12. data/lib/sequel/adapters/ado.rb +28 -17
  13. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  14. data/lib/sequel/adapters/amalgalite.rb +11 -7
  15. data/lib/sequel/adapters/db2.rb +122 -70
  16. data/lib/sequel/adapters/dbi.rb +15 -15
  17. data/lib/sequel/adapters/do.rb +5 -36
  18. data/lib/sequel/adapters/do/mysql.rb +0 -5
  19. data/lib/sequel/adapters/do/postgres.rb +0 -5
  20. data/lib/sequel/adapters/do/sqlite.rb +0 -5
  21. data/lib/sequel/adapters/firebird.rb +3 -6
  22. data/lib/sequel/adapters/ibmdb.rb +24 -16
  23. data/lib/sequel/adapters/informix.rb +2 -4
  24. data/lib/sequel/adapters/jdbc.rb +47 -11
  25. data/lib/sequel/adapters/jdbc/as400.rb +5 -24
  26. data/lib/sequel/adapters/jdbc/db2.rb +0 -5
  27. data/lib/sequel/adapters/jdbc/derby.rb +217 -0
  28. data/lib/sequel/adapters/jdbc/firebird.rb +0 -5
  29. data/lib/sequel/adapters/jdbc/h2.rb +10 -12
  30. data/lib/sequel/adapters/jdbc/hsqldb.rb +166 -0
  31. data/lib/sequel/adapters/jdbc/informix.rb +0 -5
  32. data/lib/sequel/adapters/jdbc/jtds.rb +0 -5
  33. data/lib/sequel/adapters/jdbc/mysql.rb +0 -10
  34. data/lib/sequel/adapters/jdbc/oracle.rb +70 -3
  35. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -11
  36. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -5
  37. data/lib/sequel/adapters/jdbc/sqlserver.rb +0 -5
  38. data/lib/sequel/adapters/jdbc/transactions.rb +56 -7
  39. data/lib/sequel/adapters/mock.rb +315 -0
  40. data/lib/sequel/adapters/mysql.rb +64 -51
  41. data/lib/sequel/adapters/mysql2.rb +15 -9
  42. data/lib/sequel/adapters/odbc.rb +13 -6
  43. data/lib/sequel/adapters/odbc/db2.rb +0 -4
  44. data/lib/sequel/adapters/odbc/mssql.rb +0 -5
  45. data/lib/sequel/adapters/openbase.rb +2 -4
  46. data/lib/sequel/adapters/oracle.rb +333 -51
  47. data/lib/sequel/adapters/postgres.rb +80 -27
  48. data/lib/sequel/adapters/shared/access.rb +0 -6
  49. data/lib/sequel/adapters/shared/db2.rb +13 -15
  50. data/lib/sequel/adapters/shared/firebird.rb +6 -6
  51. data/lib/sequel/adapters/shared/mssql.rb +23 -18
  52. data/lib/sequel/adapters/shared/mysql.rb +6 -6
  53. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +6 -0
  54. data/lib/sequel/adapters/shared/oracle.rb +185 -30
  55. data/lib/sequel/adapters/shared/postgres.rb +35 -18
  56. data/lib/sequel/adapters/shared/progress.rb +0 -6
  57. data/lib/sequel/adapters/shared/sqlite.rb +116 -37
  58. data/lib/sequel/adapters/sqlite.rb +16 -8
  59. data/lib/sequel/adapters/swift.rb +5 -5
  60. data/lib/sequel/adapters/swift/mysql.rb +0 -5
  61. data/lib/sequel/adapters/swift/postgres.rb +0 -5
  62. data/lib/sequel/adapters/swift/sqlite.rb +6 -4
  63. data/lib/sequel/adapters/tinytds.rb +13 -10
  64. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +8 -0
  65. data/lib/sequel/core.rb +40 -0
  66. data/lib/sequel/database/connecting.rb +1 -2
  67. data/lib/sequel/database/dataset.rb +3 -3
  68. data/lib/sequel/database/dataset_defaults.rb +58 -0
  69. data/lib/sequel/database/misc.rb +62 -2
  70. data/lib/sequel/database/query.rb +113 -49
  71. data/lib/sequel/database/schema_methods.rb +7 -2
  72. data/lib/sequel/dataset/actions.rb +37 -19
  73. data/lib/sequel/dataset/features.rb +24 -0
  74. data/lib/sequel/dataset/graph.rb +7 -6
  75. data/lib/sequel/dataset/misc.rb +11 -3
  76. data/lib/sequel/dataset/mutation.rb +2 -3
  77. data/lib/sequel/dataset/prepared_statements.rb +6 -4
  78. data/lib/sequel/dataset/query.rb +46 -15
  79. data/lib/sequel/dataset/sql.rb +28 -4
  80. data/lib/sequel/extensions/named_timezones.rb +5 -0
  81. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  82. data/lib/sequel/model.rb +2 -1
  83. data/lib/sequel/model/associations.rb +115 -33
  84. data/lib/sequel/model/base.rb +91 -31
  85. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  86. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  87. data/lib/sequel/plugins/force_encoding.rb +6 -6
  88. data/lib/sequel/plugins/identity_map.rb +1 -1
  89. data/lib/sequel/plugins/many_through_many.rb +6 -10
  90. data/lib/sequel/plugins/prepared_statements.rb +12 -1
  91. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -1
  92. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  93. data/lib/sequel/plugins/serialization.rb +6 -1
  94. data/lib/sequel/plugins/sharding.rb +0 -5
  95. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  96. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  97. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  98. data/lib/sequel/timezones.rb +42 -42
  99. data/lib/sequel/version.rb +1 -1
  100. data/spec/adapters/mssql_spec.rb +29 -29
  101. data/spec/adapters/mysql_spec.rb +86 -104
  102. data/spec/adapters/oracle_spec.rb +48 -76
  103. data/spec/adapters/postgres_spec.rb +98 -33
  104. data/spec/adapters/spec_helper.rb +0 -5
  105. data/spec/adapters/sqlite_spec.rb +24 -21
  106. data/spec/core/connection_pool_spec.rb +9 -15
  107. data/spec/core/core_sql_spec.rb +20 -31
  108. data/spec/core/database_spec.rb +491 -227
  109. data/spec/core/dataset_spec.rb +638 -1051
  110. data/spec/core/expression_filters_spec.rb +0 -1
  111. data/spec/core/mock_adapter_spec.rb +378 -0
  112. data/spec/core/object_graph_spec.rb +48 -114
  113. data/spec/core/schema_generator_spec.rb +3 -3
  114. data/spec/core/schema_spec.rb +51 -114
  115. data/spec/core/spec_helper.rb +3 -90
  116. data/spec/extensions/class_table_inheritance_spec.rb +1 -1
  117. data/spec/extensions/dataset_associations_spec.rb +199 -0
  118. data/spec/extensions/instance_hooks_spec.rb +71 -0
  119. data/spec/extensions/named_timezones_spec.rb +22 -2
  120. data/spec/extensions/nested_attributes_spec.rb +3 -0
  121. data/spec/extensions/schema_spec.rb +1 -1
  122. data/spec/extensions/serialization_modification_detection_spec.rb +1 -0
  123. data/spec/extensions/serialization_spec.rb +5 -8
  124. data/spec/extensions/spec_helper.rb +4 -0
  125. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  126. data/spec/extensions/typecast_on_load_spec.rb +1 -6
  127. data/spec/integration/associations_test.rb +123 -12
  128. data/spec/integration/dataset_test.rb +140 -47
  129. data/spec/integration/eager_loader_test.rb +19 -21
  130. data/spec/integration/model_test.rb +80 -1
  131. data/spec/integration/plugin_test.rb +179 -128
  132. data/spec/integration/prepared_statement_test.rb +92 -91
  133. data/spec/integration/schema_test.rb +42 -23
  134. data/spec/integration/spec_helper.rb +25 -31
  135. data/spec/integration/timezone_test.rb +38 -12
  136. data/spec/integration/transaction_test.rb +161 -34
  137. data/spec/integration/type_test.rb +3 -3
  138. data/spec/model/association_reflection_spec.rb +83 -7
  139. data/spec/model/associations_spec.rb +393 -676
  140. data/spec/model/base_spec.rb +186 -116
  141. data/spec/model/dataset_methods_spec.rb +7 -27
  142. data/spec/model/eager_loading_spec.rb +343 -867
  143. data/spec/model/hooks_spec.rb +160 -79
  144. data/spec/model/model_spec.rb +118 -165
  145. data/spec/model/plugins_spec.rb +7 -13
  146. data/spec/model/record_spec.rb +138 -207
  147. data/spec/model/spec_helper.rb +10 -73
  148. metadata +14 -8
@@ -1,7 +1,7 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
2
 
3
3
  describe "Eagerly loading a tree structure" do
4
- before do
4
+ before(:all) do
5
5
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
6
6
  INTEGRATION_DB.create_table!(:nodes) do
7
7
  primary_key :id
@@ -66,9 +66,8 @@ describe "Eagerly loading a tree structure" do
66
66
  Node.insert(:parent_id=>4)
67
67
  Node.insert(:parent_id=>5)
68
68
  Node.insert(:parent_id=>6)
69
- clear_sqls
70
69
  end
71
- after do
70
+ after(:all) do
72
71
  INTEGRATION_DB.drop_table :nodes
73
72
  Object.send(:remove_const, :Node)
74
73
  end
@@ -145,7 +144,6 @@ describe "Association Extensions" do
145
144
  many_to_one :author
146
145
  end
147
146
  @author = Author.create
148
- clear_sqls
149
147
  end
150
148
  after do
151
149
  INTEGRATION_DB.drop_table :authorships, :authors
@@ -172,7 +170,7 @@ describe "Association Extensions" do
172
170
  end
173
171
 
174
172
  describe "has_many :through has_many and has_one :through belongs_to" do
175
- before do
173
+ before(:all) do
176
174
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
177
175
  INTEGRATION_DB.create_table!(:firms) do
178
176
  primary_key :id
@@ -251,9 +249,8 @@ describe "has_many :through has_many and has_one :through belongs_to" do
251
249
  @invoice3 = Invoice.create(:client => @client2)
252
250
  @invoice4 = Invoice.create(:client => @client3)
253
251
  @invoice5 = Invoice.create(:client => @client3)
254
- clear_sqls
255
252
  end
256
- after do
253
+ after(:all) do
257
254
  INTEGRATION_DB.drop_table :invoices, :clients, :firms
258
255
  Object.send(:remove_const, :Firm)
259
256
  Object.send(:remove_const, :Client)
@@ -324,7 +321,7 @@ describe "has_many :through has_many and has_one :through belongs_to" do
324
321
  end
325
322
 
326
323
  describe "Polymorphic Associations" do
327
- before do
324
+ before(:all) do
328
325
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
329
326
  INTEGRATION_DB.create_table!(:assets) do
330
327
  primary_key :id
@@ -413,6 +410,9 @@ describe "Polymorphic Associations" do
413
410
  .update(:attachable_id=>nil, :attachable_type=>nil)
414
411
  end
415
412
  end
413
+ end
414
+ before do
415
+ [:assets, :posts, :notes].each{|t| INTEGRATION_DB[t].delete}
416
416
  @post = Post.create
417
417
  Note.create
418
418
  @note = Note.create
@@ -420,9 +420,8 @@ describe "Polymorphic Associations" do
420
420
  @asset2 = Asset.create(:attachable=>@note)
421
421
  @asset1.associations.clear
422
422
  @asset2.associations.clear
423
- clear_sqls
424
423
  end
425
- after do
424
+ after(:all) do
426
425
  INTEGRATION_DB.drop_table :assets, :posts, :notes
427
426
  Object.send(:remove_const, :Asset)
428
427
  Object.send(:remove_const, :Post)
@@ -483,7 +482,7 @@ describe "Polymorphic Associations" do
483
482
  end
484
483
 
485
484
  describe "many_to_one/one_to_many not referencing primary key" do
486
- before do
485
+ before(:all) do
487
486
  INTEGRATION_DB.instance_variable_set(:@schemas, {})
488
487
  INTEGRATION_DB.create_table!(:clients) do
489
488
  primary_key :id
@@ -540,14 +539,16 @@ describe "many_to_one/one_to_many not referencing primary key" do
540
539
  self.client_name = (client.name if client)
541
540
  end
542
541
  end
543
-
542
+ end
543
+ before do
544
+ Client.delete
545
+ Invoice.delete
544
546
  @client1 = Client.create(:name=>'X')
545
547
  @client2 = Client.create(:name=>'Y')
546
548
  @invoice1 = Invoice.create(:client_name=>'X')
547
549
  @invoice2 = Invoice.create(:client_name=>'X')
548
- clear_sqls
549
550
  end
550
- after do
551
+ after(:all) do
551
552
  INTEGRATION_DB.drop_table :invoices, :clients
552
553
  Object.send(:remove_const, :Client)
553
554
  Object.send(:remove_const, :Invoice)
@@ -618,7 +619,7 @@ describe "many_to_one/one_to_many not referencing primary key" do
618
619
  end
619
620
 
620
621
  describe "statistics associations" do
621
- before do
622
+ before(:all) do
622
623
  INTEGRATION_DB.create_table!(:projects) do
623
624
  primary_key :id
624
625
  String :name
@@ -658,9 +659,8 @@ describe "statistics associations" do
658
659
  @ticket2 = Ticket.create(:project=>@project1, :hours=>10)
659
660
  @ticket3 = Ticket.create(:project=>@project2, :hours=>2)
660
661
  @ticket4 = Ticket.create(:project=>@project2, :hours=>20)
661
- clear_sqls
662
662
  end
663
- after do
663
+ after(:all) do
664
664
  INTEGRATION_DB.drop_table :tickets, :projects
665
665
  Object.send(:remove_const, :Project)
666
666
  Object.send(:remove_const, :Ticket)
@@ -679,7 +679,7 @@ describe "statistics associations" do
679
679
  end
680
680
 
681
681
  describe "one to one associations" do
682
- before do
682
+ before(:all) do
683
683
  INTEGRATION_DB.create_table!(:books) do
684
684
  primary_key :id
685
685
  end
@@ -703,10 +703,8 @@ describe "one to one associations" do
703
703
  @page2 = Page.create(:book=>@book1, :page_number=>2)
704
704
  @page3 = Page.create(:book=>@book2, :page_number=>1)
705
705
  @page4 = Page.create(:book=>@book2, :page_number=>2)
706
- clear_sqls
707
706
  end
708
-
709
- after do
707
+ after(:all) do
710
708
  INTEGRATION_DB.drop_table :pages, :books
711
709
  Object.send(:remove_const, :Book)
712
710
  Object.send(:remove_const, :Page)
@@ -3,7 +3,7 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
3
3
  describe "Sequel::Model basic support" do
4
4
  before do
5
5
  @db = INTEGRATION_DB
6
- @db.create_table!(:items) do
6
+ @db.create_table!(:items, :engine=>:InnoDB) do
7
7
  primary_key :id
8
8
  String :name
9
9
  end
@@ -38,6 +38,14 @@ describe "Sequel::Model basic support" do
38
38
  Item::Thing.first.should == Item::Thing.load(:id=>1, :name=>'J')
39
39
  end
40
40
 
41
+ specify "should create accessors for all table columns even if all dataset columns aren't selected" do
42
+ c = Class.new(Sequel::Model(@db[:items].select(:id)))
43
+ o = c.new
44
+ o.name = 'A'
45
+ o.save.should == c.load(:id=>1)
46
+ c.select_map(:name).should == ['A']
47
+ end
48
+
41
49
  specify "should work correctly when a dataset restricts the colums it selects" do
42
50
  class ::Item::Thing < Sequel::Model(@db[:items].select(:name))
43
51
  end
@@ -52,6 +60,68 @@ describe "Sequel::Model basic support" do
52
60
  Item.count.should == 0
53
61
  end
54
62
 
63
+ specify "#save should return nil if raise_on_save_failure is false and save isn't successful" do
64
+ i = Item.new(:name=>'J')
65
+ i.use_transactions = true
66
+ def i.after_save
67
+ raise Sequel::Rollback
68
+ end
69
+ i.save.should be_nil
70
+ end
71
+
72
+ specify "#should respect after_commit, after_rollback, after_destroy_commit, and after_destroy_rollback hooks" do
73
+ i = Item.create(:name=>'J')
74
+ i.use_transactions = true
75
+ def i.hooks
76
+ @hooks
77
+ end
78
+ def i.rb=(x)
79
+ @hooks = []
80
+ @rb = x
81
+ end
82
+ def i.after_save
83
+ @hooks << :as
84
+ raise Sequel::Rollback if @rb
85
+ end
86
+ def i.after_destroy
87
+ @hooks << :ad
88
+ raise Sequel::Rollback if @rb
89
+ end
90
+ def i.after_commit
91
+ @hooks << :ac
92
+ end
93
+ def i.after_rollback
94
+ @hooks << :ar
95
+ end
96
+ def i.after_destroy_commit
97
+ @hooks << :adc
98
+ end
99
+ def i.after_destroy_rollback
100
+ @hooks << :adr
101
+ end
102
+ i.name = 'K'
103
+ i.rb = true
104
+ i.save.should be_nil
105
+ i.reload.name.should == 'J'
106
+ i.hooks.should == [:as, :ar]
107
+
108
+ i.rb = true
109
+ i.destroy.should be_nil
110
+ i.exists?.should be_true
111
+ i.hooks.should == [:ad, :adr]
112
+
113
+ i.name = 'K'
114
+ i.rb = false
115
+ i.save.should_not be_nil
116
+ i.reload.name.should == 'K'
117
+ i.hooks.should == [:as, :ac]
118
+
119
+ i.rb = false
120
+ i.destroy.should_not be_nil
121
+ i.exists?.should be_false
122
+ i.hooks.should == [:ad, :adc]
123
+ end
124
+
55
125
  specify "#exists? should return whether the item is still in the database" do
56
126
  i = Item.create(:name=>'J')
57
127
  i.exists?.should == true
@@ -128,3 +198,12 @@ describe "Sequel::Model basic support" do
128
198
  end
129
199
  end
130
200
  end
201
+
202
+ describe "Sequel::Model with no existing table" do
203
+ specify "should not raise an error when setting the dataset" do
204
+ db = INTEGRATION_DB
205
+ db.drop_table(:items) if db.table_exists?(:items)
206
+ proc{class ::Item < Sequel::Model(db); end}.should_not raise_error
207
+ proc{c = Class.new(Sequel::Model); c.set_dataset(db[:items])}.should_not raise_error
208
+ end
209
+ end
@@ -3,28 +3,32 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
3
3
  # H2 and MSSQL don't support USING joins
4
4
  # DB2 does not seem to support USING joins in every version; it seems to be
5
5
  # valid expression in DB2 iSeries UDB though.
6
- unless [:h2, :mssql, :db2].include?(INTEGRATION_DB.database_type)
6
+ unless Sequel.guarded?(:h2, :mssql, :db2)
7
7
  describe "Class Table Inheritance Plugin" do
8
- before do
8
+ before(:all) do
9
9
  @db = INTEGRATION_DB
10
10
  @db.instance_variable_set(:@schemas, {})
11
- @db.create_table!(:employees) do
11
+ [:staff, :executives, :managers, :employees].each{|t| @db.drop_table(t) if @db.table_exists?(t)}
12
+ @db.create_table(:employees) do
12
13
  primary_key :id
13
14
  String :name
14
15
  String :kind
15
16
  end
16
- @db.create_table!(:managers) do
17
+ @db.create_table(:managers) do
17
18
  foreign_key :id, :employees, :primary_key=>true
18
19
  Integer :num_staff
19
20
  end
20
- @db.create_table!(:executives) do
21
+ @db.create_table(:executives) do
21
22
  foreign_key :id, :managers, :primary_key=>true
22
23
  Integer :num_managers
23
24
  end
24
- @db.create_table!(:staff) do
25
+ @db.create_table(:staff) do
25
26
  foreign_key :id, :employees, :primary_key=>true
26
27
  foreign_key :manager_id, :managers
27
28
  end
29
+ end
30
+ before do
31
+ [:staff, :executives, :managers, :employees].each{|t| @db[t].delete}
28
32
  class ::Employee < Sequel::Model(@db)
29
33
  plugin :class_table_inheritance, :key=>:kind, :table_map=>{:Staff=>:staff}
30
34
  end
@@ -34,7 +38,7 @@ describe "Class Table Inheritance Plugin" do
34
38
  class ::Executive < Manager
35
39
  end
36
40
  class ::Staff < Employee
37
- many_to_one :manager
41
+ many_to_one :manager, :qualify=>false
38
42
  end
39
43
 
40
44
  @i1 =@db[:employees].insert(:name=>'E', :kind=>'Employee')
@@ -45,13 +49,13 @@ describe "Class Table Inheritance Plugin" do
45
49
  @db[:managers].insert(:id=>@i4, :num_staff=>5)
46
50
  @db[:executives].insert(:id=>@i4, :num_managers=>6)
47
51
  @db[:staff].insert(:id=>@i2, :manager_id=>@i4)
48
-
49
- clear_sqls
50
52
  end
51
53
  after do
52
- @db.drop_table :staff, :executives, :managers, :employees
53
54
  [:Executive, :Manager, :Staff, :Employee].each{|s| Object.send(:remove_const, s)}
54
55
  end
56
+ after(:all) do
57
+ @db.drop_table :staff, :executives, :managers, :employees
58
+ end
55
59
 
56
60
  specify "should return rows as subclass instances" do
57
61
  Employee.order(:id).all.should == [
@@ -122,7 +126,7 @@ describe "Class Table Inheritance Plugin" do
122
126
  Staff.limit(1).eager(:manager).all.map{|x| x.manager}.should == [Manager[@i4]]
123
127
  end
124
128
 
125
- cspecify "should handle eagerly graphing many_to_one relationships", :sqlite do
129
+ specify "should handle eagerly graphing many_to_one relationships" do
126
130
  ss = Staff.eager_graph(:manager).all
127
131
  ss.should == [Staff[@i2]]
128
132
  ss.map{|x| x.manager}.should == [Manager[@i4]]
@@ -145,21 +149,25 @@ end
145
149
  end
146
150
 
147
151
  describe "Many Through Many Plugin" do
148
- before do
152
+ before(:all) do
149
153
  @db = INTEGRATION_DB
150
154
  @db.instance_variable_set(:@schemas, {})
151
- @db.create_table!(:albums) do
155
+ [:albums_artists, :albums, :artists].each{|t| @db.drop_table(t) if @db.table_exists?(t)}
156
+ @db.create_table(:albums) do
152
157
  primary_key :id
153
158
  String :name
154
159
  end
155
- @db.create_table!(:artists) do
160
+ @db.create_table(:artists) do
156
161
  primary_key :id
157
162
  String :name
158
163
  end
159
- @db.create_table!(:albums_artists) do
164
+ @db.create_table(:albums_artists) do
160
165
  foreign_key :album_id, :albums
161
166
  foreign_key :artist_id, :artists
162
167
  end
168
+ end
169
+ before do
170
+ [:albums_artists, :albums, :artists].each{|t| @db[t].delete}
163
171
  class ::Album < Sequel::Model(@db)
164
172
  many_to_many :artists
165
173
  end
@@ -183,26 +191,26 @@ describe "Many Through Many Plugin" do
183
191
  @album4 = Album.create(:name=>'D')
184
192
  @album4.add_artist(@artist1)
185
193
  @album4.add_artist(@artist4)
186
-
187
- clear_sqls
188
194
  end
189
195
  after do
190
- @db.drop_table :albums_artists, :albums, :artists
191
196
  [:Album, :Artist].each{|s| Object.send(:remove_const, s)}
192
197
  end
198
+ after(:all) do
199
+ @db.drop_table :albums_artists, :albums, :artists
200
+ end
193
201
 
194
202
  specify "should handle super simple case with 1 join table" do
195
203
  Artist.many_through_many :albums, [[:albums_artists, :artist_id, :album_id]]
196
- Artist[1].albums.map{|x| x.name}.sort.should == %w'A D'
197
- Artist[2].albums.map{|x| x.name}.sort.should == %w'A C'
198
- Artist[3].albums.map{|x| x.name}.sort.should == %w'B C'
199
- Artist[4].albums.map{|x| x.name}.sort.should == %w'B D'
204
+ Artist[@artist1.id].albums.map{|x| x.name}.sort.should == %w'A D'
205
+ Artist[@artist2.id].albums.map{|x| x.name}.sort.should == %w'A C'
206
+ Artist[@artist3.id].albums.map{|x| x.name}.sort.should == %w'B C'
207
+ Artist[@artist4.id].albums.map{|x| x.name}.sort.should == %w'B D'
200
208
 
201
209
  Artist.plugin :prepared_statements_associations
202
- Artist[1].albums.map{|x| x.name}.sort.should == %w'A D'
203
- Artist[2].albums.map{|x| x.name}.sort.should == %w'A C'
204
- Artist[3].albums.map{|x| x.name}.sort.should == %w'B C'
205
- Artist[4].albums.map{|x| x.name}.sort.should == %w'B D'
210
+ Artist[@artist1.id].albums.map{|x| x.name}.sort.should == %w'A D'
211
+ Artist[@artist2.id].albums.map{|x| x.name}.sort.should == %w'A C'
212
+ Artist[@artist3.id].albums.map{|x| x.name}.sort.should == %w'B C'
213
+ Artist[@artist4.id].albums.map{|x| x.name}.sort.should == %w'B D'
206
214
 
207
215
  Artist.filter(:id=>1).eager(:albums).all.map{|x| x.albums.map{|a| a.name}}.flatten.sort.should == %w'A D'
208
216
  Artist.filter(:id=>2).eager(:albums).all.map{|x| x.albums.map{|a| a.name}}.flatten.sort.should == %w'A C'
@@ -236,26 +244,26 @@ describe "Many Through Many Plugin" do
236
244
 
237
245
  specify "should handle typical case with 3 join tables" do
238
246
  Artist.many_through_many :related_artists, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_artists, :album_id, :artist_id]], :class=>Artist, :distinct=>true
239
- Artist[1].related_artists.map{|x| x.name}.sort.should == %w'1 2 4'
240
- Artist[2].related_artists.map{|x| x.name}.sort.should == %w'1 2 3'
241
- Artist[3].related_artists.map{|x| x.name}.sort.should == %w'2 3 4'
242
- Artist[4].related_artists.map{|x| x.name}.sort.should == %w'1 3 4'
247
+ Artist[@artist1.id].related_artists.map{|x| x.name}.sort.should == %w'1 2 4'
248
+ Artist[@artist2.id].related_artists.map{|x| x.name}.sort.should == %w'1 2 3'
249
+ Artist[@artist3.id].related_artists.map{|x| x.name}.sort.should == %w'2 3 4'
250
+ Artist[@artist4.id].related_artists.map{|x| x.name}.sort.should == %w'1 3 4'
243
251
 
244
252
  Artist.plugin :prepared_statements_associations
245
- Artist[1].related_artists.map{|x| x.name}.sort.should == %w'1 2 4'
246
- Artist[2].related_artists.map{|x| x.name}.sort.should == %w'1 2 3'
247
- Artist[3].related_artists.map{|x| x.name}.sort.should == %w'2 3 4'
248
- Artist[4].related_artists.map{|x| x.name}.sort.should == %w'1 3 4'
253
+ Artist[@artist1.id].related_artists.map{|x| x.name}.sort.should == %w'1 2 4'
254
+ Artist[@artist2.id].related_artists.map{|x| x.name}.sort.should == %w'1 2 3'
255
+ Artist[@artist3.id].related_artists.map{|x| x.name}.sort.should == %w'2 3 4'
256
+ Artist[@artist4.id].related_artists.map{|x| x.name}.sort.should == %w'1 3 4'
249
257
 
250
- Artist.filter(:id=>1).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 4'
251
- Artist.filter(:id=>2).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 3'
252
- Artist.filter(:id=>3).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'2 3 4'
253
- Artist.filter(:id=>4).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 3 4'
258
+ Artist.filter(:id=>@artist1.id).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 4'
259
+ Artist.filter(:id=>@artist2.id).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 3'
260
+ Artist.filter(:id=>@artist3.id).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'2 3 4'
261
+ Artist.filter(:id=>@artist4.id).eager(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 3 4'
254
262
 
255
- Artist.filter(:artists__id=>1).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 4'
256
- Artist.filter(:artists__id=>2).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 3'
257
- Artist.filter(:artists__id=>3).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'2 3 4'
258
- Artist.filter(:artists__id=>4).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 3 4'
263
+ Artist.filter(:artists__id=>@artist1.id).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 4'
264
+ Artist.filter(:artists__id=>@artist2.id).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 2 3'
265
+ Artist.filter(:artists__id=>@artist3.id).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'2 3 4'
266
+ Artist.filter(:artists__id=>@artist4.id).eager_graph(:related_artists).all.map{|x| x.related_artists.map{|a| a.name}}.flatten.sort.should == %w'1 3 4'
259
267
 
260
268
  Artist.filter(:related_artists=>@artist1).all.map{|a| a.name}.sort.should == %w'1 2 4'
261
269
  Artist.filter(:related_artists=>@artist2).all.map{|a| a.name}.sort.should == %w'1 2 3'
@@ -285,26 +293,26 @@ describe "Many Through Many Plugin" do
285
293
  @album4.add_artist(@artist3)
286
294
  @album4.add_artist(@artist4)
287
295
 
288
- Artist[1].related_albums.map{|x| x.name}.sort.should == %w'A B C'
289
- Artist[2].related_albums.map{|x| x.name}.sort.should == %w'A B C D'
290
- Artist[3].related_albums.map{|x| x.name}.sort.should == %w'A B D'
291
- Artist[4].related_albums.map{|x| x.name}.sort.should == %w'B D'
296
+ Artist[@artist1.id].related_albums.map{|x| x.name}.sort.should == %w'A B C'
297
+ Artist[@artist2.id].related_albums.map{|x| x.name}.sort.should == %w'A B C D'
298
+ Artist[@artist3.id].related_albums.map{|x| x.name}.sort.should == %w'A B D'
299
+ Artist[@artist4.id].related_albums.map{|x| x.name}.sort.should == %w'B D'
292
300
 
293
301
  Artist.plugin :prepared_statements_associations
294
- Artist[1].related_albums.map{|x| x.name}.sort.should == %w'A B C'
295
- Artist[2].related_albums.map{|x| x.name}.sort.should == %w'A B C D'
296
- Artist[3].related_albums.map{|x| x.name}.sort.should == %w'A B D'
297
- Artist[4].related_albums.map{|x| x.name}.sort.should == %w'B D'
302
+ Artist[@artist1.id].related_albums.map{|x| x.name}.sort.should == %w'A B C'
303
+ Artist[@artist2.id].related_albums.map{|x| x.name}.sort.should == %w'A B C D'
304
+ Artist[@artist3.id].related_albums.map{|x| x.name}.sort.should == %w'A B D'
305
+ Artist[@artist4.id].related_albums.map{|x| x.name}.sort.should == %w'B D'
298
306
 
299
- Artist.filter(:id=>1).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C'
300
- Artist.filter(:id=>2).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C D'
301
- Artist.filter(:id=>3).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B D'
302
- Artist.filter(:id=>4).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'B D'
307
+ Artist.filter(:id=>@artist1.id).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C'
308
+ Artist.filter(:id=>@artist2.id).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C D'
309
+ Artist.filter(:id=>@artist3.id).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B D'
310
+ Artist.filter(:id=>@artist4.id).eager(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'B D'
303
311
 
304
- Artist.filter(:artists__id=>1).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C'
305
- Artist.filter(:artists__id=>2).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C D'
306
- Artist.filter(:artists__id=>3).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B D'
307
- Artist.filter(:artists__id=>4).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'B D'
312
+ Artist.filter(:artists__id=>@artist1.id).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C'
313
+ Artist.filter(:artists__id=>@artist2.id).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B C D'
314
+ Artist.filter(:artists__id=>@artist3.id).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'A B D'
315
+ Artist.filter(:artists__id=>@artist4.id).eager_graph(:related_albums).all.map{|x| x.related_albums.map{|a| a.name}}.flatten.sort.should == %w'B D'
308
316
 
309
317
  Artist.filter(:related_albums=>@album1).all.map{|a| a.name}.sort.should == %w'1 2 3'
310
318
  Artist.filter(:related_albums=>@album2).all.map{|a| a.name}.sort.should == %w'1 2 3 4'
@@ -328,19 +336,20 @@ describe "Many Through Many Plugin" do
328
336
  end
329
337
 
330
338
  describe "Lazy Attributes plugin" do
331
- before do
339
+ before(:all) do
332
340
  @db = INTEGRATION_DB
333
341
  @db.create_table!(:items) do
334
342
  primary_key :id
335
343
  String :name
336
344
  Integer :num
337
345
  end
346
+ @db[:items].delete
338
347
  class ::Item < Sequel::Model(@db)
339
348
  plugin :lazy_attributes, :num
340
349
  end
341
350
  Item.create(:name=>'J', :num=>1)
342
351
  end
343
- after do
352
+ after(:all) do
344
353
  @db.drop_table(:items)
345
354
  Object.send(:remove_const, :Item)
346
355
  end
@@ -373,7 +382,7 @@ describe "Lazy Attributes plugin" do
373
382
  end
374
383
 
375
384
  describe "Tactical Eager Loading Plugin" do
376
- before do
385
+ before(:all) do
377
386
  @db = INTEGRATION_DB
378
387
  @db.instance_variable_set(:@schemas, {})
379
388
  @db.create_table!(:artists) do
@@ -385,6 +394,10 @@ describe "Tactical Eager Loading Plugin" do
385
394
  String :name
386
395
  foreign_key :artist_id, :artists
387
396
  end
397
+ end
398
+ before do
399
+ @db[:albums].delete
400
+ @db[:artists].delete
388
401
  class ::Album < Sequel::Model(@db)
389
402
  plugin :tactical_eager_loading
390
403
  many_to_one :artist
@@ -402,13 +415,13 @@ describe "Tactical Eager Loading Plugin" do
402
415
  @album2 = Album.create(:name=>'B', :artist=>@artist1)
403
416
  @album3 = Album.create(:name=>'C', :artist=>@artist2)
404
417
  @album4 = Album.create(:name=>'D', :artist=>@artist3)
405
-
406
- clear_sqls
407
418
  end
408
419
  after do
409
- @db.drop_table :albums, :artists
410
420
  [:Album, :Artist].each{|s| Object.send(:remove_const, s)}
411
421
  end
422
+ after(:all) do
423
+ @db.drop_table :albums, :artists
424
+ end
412
425
 
413
426
  specify "should eagerly load associations for all items when accessing any item" do
414
427
  a = Artist.order(:name).all
@@ -456,7 +469,7 @@ describe "Identity Map plugin" do
456
469
  end
457
470
 
458
471
  describe "Touch plugin" do
459
- before do
472
+ before(:all) do
460
473
  @db = INTEGRATION_DB
461
474
  @db.instance_variable_set(:@schemas, {})
462
475
  @db.create_table!(:artists) do
@@ -470,6 +483,10 @@ describe "Touch plugin" do
470
483
  foreign_key :artist_id, :artists
471
484
  DateTime :updated_at
472
485
  end
486
+ end
487
+ before do
488
+ @db[:albums].delete
489
+ @db[:artists].delete
473
490
  class ::Album < Sequel::Model(@db)
474
491
  many_to_one :artist
475
492
  plugin :touch, :associations=>:artist
@@ -481,9 +498,11 @@ describe "Touch plugin" do
481
498
  @album = Album.create(:name=>'A', :artist=>@artist)
482
499
  end
483
500
  after do
484
- @db.drop_table :albums, :artists
485
501
  [:Album, :Artist].each{|s| Object.send(:remove_const, s)}
486
502
  end
503
+ after(:all) do
504
+ @db.drop_table :albums, :artists
505
+ end
487
506
 
488
507
  specify "should update the timestamp column when touching the record" do
489
508
  @album.updated_at.should == nil
@@ -538,7 +557,7 @@ describe "Serialization plugin" do
538
557
  end
539
558
 
540
559
  describe "OptimisticLocking plugin" do
541
- before do
560
+ before(:all) do
542
561
  @db = INTEGRATION_DB
543
562
  @db.create_table!(:people) do
544
563
  primary_key :id
@@ -547,30 +566,33 @@ describe "OptimisticLocking plugin" do
547
566
  end
548
567
  class ::Person < Sequel::Model(@db)
549
568
  plugin :optimistic_locking
550
- create(:name=>'John')
551
569
  end
552
570
  end
553
- after do
571
+ before do
572
+ @db[:people].delete
573
+ @p = Person.create(:name=>'John')
574
+ end
575
+ after(:all) do
554
576
  @db.drop_table(:people)
555
577
  Object.send(:remove_const, :Person)
556
578
  end
557
579
 
558
580
  specify "should raise an error when updating a stale record" do
559
- p1 = Person[1]
560
- p2 = Person[1]
581
+ p1 = Person[@p.id]
582
+ p2 = Person[@p.id]
561
583
  p1.update(:name=>'Jim')
562
584
  proc{p2.update(:name=>'Bob')}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
563
585
  end
564
586
 
565
587
  specify "should raise an error when destroying a stale record" do
566
- p1 = Person[1]
567
- p2 = Person[1]
588
+ p1 = Person[@p.id]
589
+ p2 = Person[@p.id]
568
590
  p1.update(:name=>'Jim')
569
591
  proc{p2.destroy}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
570
592
  end
571
593
 
572
594
  specify "should not raise an error when updating the same record twice" do
573
- p1 = Person[1]
595
+ p1 = Person[@p.id]
574
596
  p1.update(:name=>'Jim')
575
597
  proc{p1.update(:name=>'Bob')}.should_not raise_error
576
598
  end
@@ -630,9 +652,9 @@ describe "Composition plugin" do
630
652
  end
631
653
 
632
654
  # DB2's implemention of CTE is too limited to use this plugin
633
- if INTEGRATION_DB.dataset.supports_cte? and INTEGRATION_DB.database_type != :db2
655
+ if INTEGRATION_DB.dataset.supports_cte? and !Sequel.guarded?(:db2)
634
656
  describe "RcteTree Plugin" do
635
- before do
657
+ before(:all) do
636
658
  @db = INTEGRATION_DB
637
659
  @db.create_table!(:nodes) do
638
660
  primary_key :id
@@ -643,21 +665,25 @@ if INTEGRATION_DB.dataset.supports_cte? and INTEGRATION_DB.database_type != :db2
643
665
  plugin :rcte_tree, :order=>:name
644
666
  end
645
667
 
646
- @a = Node.create(:name=>'a')
647
- @b = Node.create(:name=>'b')
648
- @aa = Node.create(:name=>'aa', :parent=>@a)
649
- @ab = Node.create(:name=>'ab', :parent=>@a)
650
- @ba = Node.create(:name=>'ba', :parent=>@b)
651
- @bb = Node.create(:name=>'bb', :parent=>@b)
652
- @aaa = Node.create(:name=>'aaa', :parent=>@aa)
653
- @aab = Node.create(:name=>'aab', :parent=>@aa)
654
- @aba = Node.create(:name=>'aba', :parent=>@ab)
655
- @abb = Node.create(:name=>'abb', :parent=>@ab)
656
- @aaaa = Node.create(:name=>'aaaa', :parent=>@aaa)
657
- @aaab = Node.create(:name=>'aaab', :parent=>@aaa)
658
- @aaaaa = Node.create(:name=>'aaaaa', :parent=>@aaaa)
659
- end
660
- after do
668
+ @nodes = []
669
+ @nodes << @a = Node.create(:name=>'a')
670
+ @nodes << @b = Node.create(:name=>'b')
671
+ @nodes << @aa = Node.create(:name=>'aa', :parent=>@a)
672
+ @nodes << @ab = Node.create(:name=>'ab', :parent=>@a)
673
+ @nodes << @ba = Node.create(:name=>'ba', :parent=>@b)
674
+ @nodes << @bb = Node.create(:name=>'bb', :parent=>@b)
675
+ @nodes << @aaa = Node.create(:name=>'aaa', :parent=>@aa)
676
+ @nodes << @aab = Node.create(:name=>'aab', :parent=>@aa)
677
+ @nodes << @aba = Node.create(:name=>'aba', :parent=>@ab)
678
+ @nodes << @abb = Node.create(:name=>'abb', :parent=>@ab)
679
+ @nodes << @aaaa = Node.create(:name=>'aaaa', :parent=>@aaa)
680
+ @nodes << @aaab = Node.create(:name=>'aaab', :parent=>@aaa)
681
+ @nodes << @aaaaa = Node.create(:name=>'aaaaa', :parent=>@aaaa)
682
+ end
683
+ before do
684
+ @nodes.each{|n| n.associations.clear}
685
+ end
686
+ after(:all) do
661
687
  @db.drop_table :nodes
662
688
  Object.send(:remove_const, :Node)
663
689
  end
@@ -734,13 +760,15 @@ if INTEGRATION_DB.dataset.supports_cte? and INTEGRATION_DB.database_type != :db2
734
760
  end
735
761
 
736
762
  specify "should work correctly if not all columns are selected" do
737
- Node.plugin :lazy_attributes, :name
738
- @aaaa.descendants.should == [Node.load(:parent_id=>11, :id=>13)]
739
- @aa.ancestors.should == [Node.load(:parent_id=>nil, :id=>1)]
740
- nodes = Node.filter(:id=>[@a.id, @b.id, @aaa.id]).order(:name).eager(:ancestors, :descendants).all
741
- nodes.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>3, :id=>7}, {:parent_id=>nil, :id=>2}].map{|x| Node.load(x)}
742
- nodes[2].descendants.should == [{:parent_id=>2, :id=>5}, {:parent_id=>2, :id=>6}].map{|x| Node.load(x)}
743
- nodes[1].ancestors.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>1, :id=>3}].map{|x| Node.load(x)}
763
+ c = Class.new(Sequel::Model(@db[:nodes]))
764
+ c.plugin :rcte_tree, :order=>:name
765
+ c.plugin :lazy_attributes, :name
766
+ c[:name=>'aaaa'].descendants.should == [c.load(:parent_id=>11, :id=>13)]
767
+ c[:name=>'aa'].ancestors.should == [c.load(:parent_id=>nil, :id=>1)]
768
+ nodes = c.filter(:id=>[@a.id, @b.id, @aaa.id]).order(:name).eager(:ancestors, :descendants).all
769
+ nodes.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>3, :id=>7}, {:parent_id=>nil, :id=>2}].map{|x| c.load(x)}
770
+ nodes[2].descendants.should == [{:parent_id=>2, :id=>5}, {:parent_id=>2, :id=>6}].map{|x| c.load(x)}
771
+ nodes[1].ancestors.should == [{:parent_id=>nil, :id=>1}, {:parent_id=>1, :id=>3}].map{|x| c.load(x)}
744
772
  end
745
773
 
746
774
  specify "should eagerly load descendants to a given level" do
@@ -858,7 +886,7 @@ if INTEGRATION_DB.dataset.supports_cte? and INTEGRATION_DB.database_type != :db2
858
886
  end
859
887
 
860
888
  describe "Instance Filters plugin" do
861
- before do
889
+ before(:all) do
862
890
  @db = INTEGRATION_DB
863
891
  @db.create_table!(:items) do
864
892
  primary_key :id
@@ -869,11 +897,14 @@ describe "Instance Filters plugin" do
869
897
  class ::Item < Sequel::Model(@db)
870
898
  plugin :instance_filters
871
899
  end
900
+ end
901
+ before do
902
+ @db[:items].delete
872
903
  @i = Item.create(:name=>'J', :number=>1, :cost=>2)
873
904
  @i.instance_filter(:number=>1)
874
905
  @i.set(:name=>'K')
875
906
  end
876
- after do
907
+ after(:all) do
877
908
  @db.drop_table(:items)
878
909
  Object.send(:remove_const, :Item)
879
910
  end
@@ -918,20 +949,23 @@ describe "Instance Filters plugin" do
918
949
  end
919
950
 
920
951
  describe "UpdatePrimaryKey plugin" do
921
- before do
952
+ before(:all) do
922
953
  @db = INTEGRATION_DB
923
954
  @db.create_table!(:t) do
924
955
  Integer :a, :primary_key=>true
925
956
  Integer :b
926
957
  end
927
958
  @ds = @db[:t]
928
- @ds.insert(:a=>1, :b=>3)
929
959
  @c = Class.new(Sequel::Model(@ds))
930
960
  @c.set_primary_key(:a)
931
961
  @c.unrestrict_primary_key
932
962
  @c.plugin :update_primary_key
933
963
  end
934
- after do
964
+ before do
965
+ @ds.delete
966
+ @ds.insert(:a=>1, :b=>3)
967
+ end
968
+ after(:all) do
935
969
  @db.drop_table(:t)
936
970
  end
937
971
 
@@ -973,22 +1007,23 @@ describe "UpdatePrimaryKey plugin" do
973
1007
  end
974
1008
 
975
1009
  describe "AssociationPks plugin" do
976
- before do
1010
+ before(:all) do
977
1011
  @db = INTEGRATION_DB
978
- @db.create_table!(:artists) do
1012
+ [:albums_tags, :tags, :albums, :artists].each{|t| @db.drop_table(t) if @db.table_exists?(t)}
1013
+ @db.create_table(:artists) do
979
1014
  primary_key :id
980
1015
  String :name
981
1016
  end
982
- @db.create_table!(:albums) do
1017
+ @db.create_table(:albums) do
983
1018
  primary_key :id
984
1019
  String :name
985
1020
  foreign_key :artist_id, :artists
986
1021
  end
987
- @db.create_table!(:tags) do
1022
+ @db.create_table(:tags) do
988
1023
  primary_key :id
989
1024
  String :name
990
1025
  end
991
- @db.create_table!(:albums_tags) do
1026
+ @db.create_table(:albums_tags) do
992
1027
  foreign_key :album_id, :albums
993
1028
  foreign_key :tag_id, :tags
994
1029
  end
@@ -1002,7 +1037,9 @@ describe "AssociationPks plugin" do
1002
1037
  end
1003
1038
  class ::Tag < Sequel::Model
1004
1039
  end
1005
-
1040
+ end
1041
+ before do
1042
+ [:albums_tags, :tags, :albums, :artists].each{|t| @db[t].delete}
1006
1043
  @ar1 =@db[:artists].insert(:name=>'YJM')
1007
1044
  @ar2 =@db[:artists].insert(:name=>'AS')
1008
1045
  @al1 =@db[:albums].insert(:name=>'RF', :artist_id=>@ar1)
@@ -1015,7 +1052,7 @@ describe "AssociationPks plugin" do
1015
1052
  tids.each{|tid| @db[:albums_tags].insert([aid, tid])}
1016
1053
  end
1017
1054
  end
1018
- after do
1055
+ after(:all) do
1019
1056
  @db.drop_table :albums_tags, :tags, :albums, :artists
1020
1057
  [:Artist, :Album, :Tag].each{|s| Object.send(:remove_const, s)}
1021
1058
  end
@@ -1069,9 +1106,9 @@ end
1069
1106
 
1070
1107
 
1071
1108
  describe "List plugin without a scope" do
1072
- before do
1109
+ before(:all) do
1073
1110
  @db = INTEGRATION_DB
1074
- @db.create_table :sites do
1111
+ @db.create_table!(:sites) do
1075
1112
  primary_key :id
1076
1113
  String :name
1077
1114
  Integer :position
@@ -1079,13 +1116,14 @@ describe "List plugin without a scope" do
1079
1116
 
1080
1117
  @c = Class.new(Sequel::Model(@db[:sites]))
1081
1118
  @c.plugin :list
1119
+ end
1120
+ before do
1082
1121
  @c.delete
1083
1122
  @c.create :name => "hig", :position => 3
1084
1123
  @c.create :name => "def", :position => 2
1085
1124
  @c.create :name => "abc", :position => 1
1086
1125
  end
1087
-
1088
- after do
1126
+ after(:all) do
1089
1127
  @db.drop_table(:sites)
1090
1128
  end
1091
1129
 
@@ -1142,9 +1180,9 @@ describe "List plugin without a scope" do
1142
1180
  end
1143
1181
 
1144
1182
  describe "List plugin with a scope" do
1145
- before do
1183
+ before(:all) do
1146
1184
  @db = INTEGRATION_DB
1147
- @db.create_table :pages do
1185
+ @db.create_table!(:pages) do
1148
1186
  primary_key :id
1149
1187
  String :name
1150
1188
  Integer :pos
@@ -1153,6 +1191,9 @@ describe "List plugin with a scope" do
1153
1191
 
1154
1192
  @c = Class.new(Sequel::Model(@db[:pages]))
1155
1193
  @c.plugin :list, :field => :pos, :scope => :parent_id
1194
+ end
1195
+ before do
1196
+ @c.delete
1156
1197
  p1 = @c.create :name => "Hm", :pos => 1, :parent_id => 0
1157
1198
  p2 = @c.create :name => "Ps", :pos => 1, :parent_id => p1.id
1158
1199
  @c.create :name => "P1", :pos => 1, :parent_id => p2.id
@@ -1160,8 +1201,7 @@ describe "List plugin with a scope" do
1160
1201
  @c.create :name => "P3", :pos => 3, :parent_id => p2.id
1161
1202
  @c.create :name => "Au", :pos => 2, :parent_id => p1.id
1162
1203
  end
1163
-
1164
- after do
1204
+ after(:all) do
1165
1205
  @db.drop_table(:pages)
1166
1206
  end
1167
1207
 
@@ -1218,12 +1258,12 @@ describe "List plugin with a scope" do
1218
1258
  end
1219
1259
 
1220
1260
  describe "Sequel::Plugins::Tree" do
1221
- before do
1261
+ before(:all) do
1222
1262
  @db = INTEGRATION_DB
1223
1263
  end
1224
1264
 
1225
1265
  describe "with natural database order" do
1226
- before do
1266
+ before(:all) do
1227
1267
  @db.create_table!(:nodes) do
1228
1268
  Integer :id, :primary_key=>true
1229
1269
  String :name
@@ -1249,7 +1289,7 @@ describe "Sequel::Plugins::Tree" do
1249
1289
  plugin :tree
1250
1290
  end
1251
1291
  end
1252
- after do
1292
+ after(:all) do
1253
1293
  @db.drop_table(:nodes)
1254
1294
  Object.send(:remove_const, :Node)
1255
1295
  end
@@ -1324,12 +1364,12 @@ describe "Sequel::Plugins::Tree" do
1324
1364
  end
1325
1365
 
1326
1366
  describe "Nodes in specified order" do
1327
- before do
1367
+ before(:all) do
1328
1368
  class ::OrderedNode < Sequel::Model(:nodes)
1329
1369
  plugin :tree, :order => :position
1330
1370
  end
1331
1371
  end
1332
- after do
1372
+ after(:all) do
1333
1373
  Object.send(:remove_const, :OrderedNode)
1334
1374
  end
1335
1375
 
@@ -1347,7 +1387,7 @@ describe "Sequel::Plugins::Tree" do
1347
1387
  end
1348
1388
 
1349
1389
  describe "Lorems in specified order" do
1350
- before do
1390
+ before(:all) do
1351
1391
  @db.create_table!(:lorems) do
1352
1392
  Integer :id, :primary_key=>true
1353
1393
  String :name
@@ -1365,7 +1405,7 @@ describe "Sequel::Plugins::Tree" do
1365
1405
  plugin :tree, :key => :ipsum_id, :order => :neque
1366
1406
  end
1367
1407
  end
1368
- after do
1408
+ after(:all) do
1369
1409
  @db.drop_table(:lorems)
1370
1410
  Object.send(:remove_const, :Lorem)
1371
1411
  end
@@ -1383,7 +1423,7 @@ describe "Sequel::Plugins::Tree" do
1383
1423
  end
1384
1424
 
1385
1425
  describe "Sequel::Plugins::PreparedStatements" do
1386
- before do
1426
+ before(:all) do
1387
1427
  @db = INTEGRATION_DB
1388
1428
  @db.create_table!(:ps_test) do
1389
1429
  primary_key :id
@@ -1391,11 +1431,14 @@ describe "Sequel::Plugins::PreparedStatements" do
1391
1431
  Integer :i
1392
1432
  end
1393
1433
  @c = Class.new(Sequel::Model(@db[:ps_test]))
1434
+ @c.plugin :prepared_statements_with_pk
1435
+ end
1436
+ before do
1437
+ @c.delete
1394
1438
  @foo = @c.create(:name=>'foo', :i=>10)
1395
1439
  @bar = @c.create(:name=>'bar', :i=>20)
1396
- @c.plugin :prepared_statements_with_pk
1397
1440
  end
1398
- after do
1441
+ after(:all) do
1399
1442
  @db.drop_table(:ps_test)
1400
1443
  end
1401
1444
 
@@ -1403,19 +1446,23 @@ describe "Sequel::Plugins::PreparedStatements" do
1403
1446
  @c[@foo.id].should == @foo
1404
1447
  @c[@bar.id].should == @bar
1405
1448
  @c[0].should == nil
1449
+ @c[nil].should == nil
1406
1450
  end
1407
1451
 
1408
1452
  it "should work with looking up using Dataset#with_pk" do
1409
1453
  @c.dataset.with_pk(@foo.id).should == @foo
1410
1454
  @c.dataset.with_pk(@bar.id).should == @bar
1411
1455
  @c.dataset.with_pk(0).should == nil
1456
+ @c.dataset.with_pk(nil).should == nil
1412
1457
 
1413
1458
  @c.dataset.filter(:i=>0).with_pk(@foo.id).should == nil
1414
1459
  @c.dataset.filter(:i=>10).with_pk(@foo.id).should == @foo
1415
1460
  @c.dataset.filter(:i=>20).with_pk(@bar.id).should == @bar
1461
+ @c.dataset.filter(:i=>10).with_pk(nil).should == nil
1416
1462
  @c.dataset.filter(:name=>'foo').with_pk(@foo.id).should == @foo
1417
1463
  @c.dataset.filter(:name=>'bar').with_pk(@bar.id).should == @bar
1418
1464
  @c.dataset.filter(:name=>'baz').with_pk(@bar.id).should == nil
1465
+ @c.dataset.filter(:name=>'bar').with_pk(nil).should == nil
1419
1466
  end
1420
1467
 
1421
1468
  it "should work with Model#destroy" do
@@ -1432,6 +1479,8 @@ describe "Sequel::Plugins::PreparedStatements" do
1432
1479
  @c[@foo.id].should == @c.load(:id=>@foo.id, :name=>'foo3', :i=>30)
1433
1480
  @foo.update(:i=>40)
1434
1481
  @c[@foo.id].should == @c.load(:id=>@foo.id, :name=>'foo3', :i=>40)
1482
+ @foo.update(:i=>nil)
1483
+ @c[@foo.id].should == @c.load(:id=>@foo.id, :name=>'foo3', :i=>nil)
1435
1484
  end
1436
1485
 
1437
1486
  it "should work with Model#create" do
@@ -1441,5 +1490,7 @@ describe "Sequel::Plugins::PreparedStatements" do
1441
1490
  @c[o.id].should == @c.load(:id=>o.id, :name=>'foo2', :i=>nil)
1442
1491
  o = @c.create(:i=>30)
1443
1492
  @c[o.id].should == @c.load(:id=>o.id, :name=>nil, :i=>30)
1493
+ o = @c.create(:name=>nil, :i=>40)
1494
+ @c[o.id].should == @c.load(:id=>o.id, :name=>nil, :i=>40)
1444
1495
  end
1445
1496
  end