sequel 4.22.0 → 4.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +22 -0
  3. data/README.rdoc +6 -0
  4. data/Rakefile +59 -81
  5. data/doc/migration.rdoc +2 -0
  6. data/doc/release_notes/4.23.0.txt +65 -0
  7. data/doc/sharding.rdoc +16 -14
  8. data/doc/testing.rdoc +61 -77
  9. data/lib/sequel/adapters/jdbc.rb +1 -0
  10. data/lib/sequel/adapters/mock.rb +0 -1
  11. data/lib/sequel/adapters/postgres.rb +1 -0
  12. data/lib/sequel/adapters/postgresql.rb +1 -0
  13. data/lib/sequel/adapters/shared/postgres.rb +3 -3
  14. data/lib/sequel/connection_pool/sharded_threaded.rb +5 -0
  15. data/lib/sequel/connection_pool/threaded.rb +9 -1
  16. data/lib/sequel/database/connecting.rb +1 -1
  17. data/lib/sequel/database/transactions.rb +2 -1
  18. data/lib/sequel/dataset/prepared_statements.rb +1 -1
  19. data/lib/sequel/extensions/constraint_validations.rb +12 -12
  20. data/lib/sequel/extensions/date_arithmetic.rb +0 -4
  21. data/lib/sequel/extensions/pagination.rb +14 -2
  22. data/lib/sequel/extensions/pg_enum.rb +2 -2
  23. data/lib/sequel/extensions/pg_hstore.rb +1 -1
  24. data/lib/sequel/extensions/pg_json_ops.rb +2 -2
  25. data/lib/sequel/plugins/csv_serializer.rb +2 -0
  26. data/lib/sequel/plugins/delay_add_association.rb +50 -0
  27. data/lib/sequel/plugins/list.rb +2 -2
  28. data/lib/sequel/plugins/nested_attributes.rb +8 -28
  29. data/lib/sequel/plugins/update_refresh.rb +50 -0
  30. data/lib/sequel/plugins/validate_associated.rb +55 -0
  31. data/lib/sequel/version.rb +1 -1
  32. data/spec/adapters/db2_spec.rb +29 -29
  33. data/spec/adapters/firebird_spec.rb +97 -103
  34. data/spec/adapters/informix_spec.rb +25 -25
  35. data/spec/adapters/mssql_spec.rb +156 -172
  36. data/spec/adapters/mysql_spec.rb +334 -359
  37. data/spec/adapters/oracle_spec.rb +67 -69
  38. data/spec/adapters/postgres_spec.rb +1298 -1249
  39. data/spec/adapters/spec_helper.rb +2 -35
  40. data/spec/adapters/sqlanywhere_spec.rb +39 -39
  41. data/spec/adapters/sqlite_spec.rb +203 -200
  42. data/spec/bin_spec.rb +57 -59
  43. data/spec/core/connection_pool_spec.rb +402 -401
  44. data/spec/core/database_spec.rb +953 -944
  45. data/spec/core/dataset_spec.rb +2178 -2168
  46. data/spec/core/deprecated_spec.rb +19 -19
  47. data/spec/core/expression_filters_spec.rb +415 -415
  48. data/spec/core/mock_adapter_spec.rb +212 -212
  49. data/spec/core/object_graph_spec.rb +73 -73
  50. data/spec/core/placeholder_literalizer_spec.rb +71 -71
  51. data/spec/core/schema_generator_spec.rb +44 -44
  52. data/spec/core/schema_spec.rb +470 -472
  53. data/spec/core/spec_helper.rb +5 -20
  54. data/spec/core/version_spec.rb +2 -2
  55. data/spec/core_extensions_spec.rb +320 -320
  56. data/spec/extensions/accessed_columns_spec.rb +12 -12
  57. data/spec/extensions/active_model_spec.rb +3 -3
  58. data/spec/extensions/after_initialize_spec.rb +2 -2
  59. data/spec/extensions/arbitrary_servers_spec.rb +23 -23
  60. data/spec/extensions/association_dependencies_spec.rb +34 -34
  61. data/spec/extensions/association_pks_spec.rb +98 -98
  62. data/spec/extensions/association_proxies_spec.rb +33 -33
  63. data/spec/extensions/auto_validations_spec.rb +46 -46
  64. data/spec/extensions/blacklist_security_spec.rb +19 -18
  65. data/spec/extensions/blank_spec.rb +36 -36
  66. data/spec/extensions/boolean_readers_spec.rb +36 -36
  67. data/spec/extensions/caching_spec.rb +82 -82
  68. data/spec/extensions/class_table_inheritance_spec.rb +72 -72
  69. data/spec/extensions/column_conflicts_spec.rb +19 -14
  70. data/spec/extensions/column_select_spec.rb +19 -19
  71. data/spec/extensions/columns_introspection_spec.rb +43 -43
  72. data/spec/extensions/composition_spec.rb +64 -64
  73. data/spec/extensions/connection_validator_spec.rb +92 -90
  74. data/spec/extensions/constraint_validations_plugin_spec.rb +92 -92
  75. data/spec/extensions/constraint_validations_spec.rb +80 -80
  76. data/spec/extensions/core_refinements_spec.rb +220 -220
  77. data/spec/extensions/csv_serializer_spec.rb +44 -44
  78. data/spec/extensions/current_datetime_timestamp_spec.rb +8 -8
  79. data/spec/extensions/dataset_associations_spec.rb +65 -65
  80. data/spec/extensions/dataset_source_alias_spec.rb +16 -16
  81. data/spec/extensions/date_arithmetic_spec.rb +51 -58
  82. data/spec/extensions/defaults_setter_spec.rb +19 -19
  83. data/spec/extensions/delay_add_association_spec.rb +52 -0
  84. data/spec/extensions/dirty_spec.rb +51 -51
  85. data/spec/extensions/eager_each_spec.rb +8 -8
  86. data/spec/extensions/empty_array_ignore_nulls_spec.rb +10 -10
  87. data/spec/extensions/error_splitter_spec.rb +2 -2
  88. data/spec/extensions/error_sql_spec.rb +4 -4
  89. data/spec/extensions/eval_inspect_spec.rb +3 -3
  90. data/spec/extensions/filter_having_spec.rb +8 -8
  91. data/spec/extensions/force_encoding_spec.rb +30 -30
  92. data/spec/extensions/from_block_spec.rb +7 -7
  93. data/spec/extensions/graph_each_spec.rb +19 -19
  94. data/spec/extensions/hash_aliases_spec.rb +5 -5
  95. data/spec/extensions/hook_class_methods_spec.rb +100 -100
  96. data/spec/extensions/inflector_spec.rb +54 -54
  97. data/spec/extensions/input_transformer_spec.rb +10 -10
  98. data/spec/extensions/insert_returning_select_spec.rb +8 -8
  99. data/spec/extensions/instance_filters_spec.rb +26 -26
  100. data/spec/extensions/instance_hooks_spec.rb +85 -85
  101. data/spec/extensions/json_serializer_spec.rb +68 -68
  102. data/spec/extensions/lazy_attributes_spec.rb +49 -49
  103. data/spec/extensions/list_spec.rb +77 -75
  104. data/spec/extensions/looser_typecasting_spec.rb +16 -16
  105. data/spec/extensions/many_through_many_spec.rb +627 -627
  106. data/spec/extensions/meta_def_spec.rb +7 -7
  107. data/spec/extensions/migration_spec.rb +217 -217
  108. data/spec/extensions/modification_detection_spec.rb +20 -20
  109. data/spec/extensions/mssql_optimistic_locking_spec.rb +21 -21
  110. data/spec/extensions/named_timezones_spec.rb +18 -18
  111. data/spec/extensions/nested_attributes_spec.rb +107 -107
  112. data/spec/extensions/null_dataset_spec.rb +24 -24
  113. data/spec/extensions/optimistic_locking_spec.rb +21 -21
  114. data/spec/extensions/pagination_spec.rb +52 -52
  115. data/spec/extensions/pg_array_associations_spec.rb +273 -273
  116. data/spec/extensions/pg_array_ops_spec.rb +52 -52
  117. data/spec/extensions/pg_array_spec.rb +152 -152
  118. data/spec/extensions/pg_enum_spec.rb +13 -13
  119. data/spec/extensions/pg_hstore_ops_spec.rb +63 -63
  120. data/spec/extensions/pg_hstore_spec.rb +84 -84
  121. data/spec/extensions/pg_inet_spec.rb +15 -15
  122. data/spec/extensions/pg_interval_spec.rb +29 -29
  123. data/spec/extensions/pg_json_ops_spec.rb +86 -84
  124. data/spec/extensions/pg_json_spec.rb +104 -104
  125. data/spec/extensions/pg_loose_count_spec.rb +6 -6
  126. data/spec/extensions/pg_range_ops_spec.rb +24 -24
  127. data/spec/extensions/pg_range_spec.rb +143 -143
  128. data/spec/extensions/pg_row_ops_spec.rb +14 -14
  129. data/spec/extensions/pg_row_plugin_spec.rb +12 -12
  130. data/spec/extensions/pg_row_spec.rb +118 -118
  131. data/spec/extensions/pg_static_cache_updater_spec.rb +28 -28
  132. data/spec/extensions/pg_typecast_on_load_spec.rb +21 -21
  133. data/spec/extensions/prepared_statements_associations_spec.rb +42 -42
  134. data/spec/extensions/prepared_statements_safe_spec.rb +18 -18
  135. data/spec/extensions/prepared_statements_spec.rb +28 -28
  136. data/spec/extensions/prepared_statements_with_pk_spec.rb +11 -11
  137. data/spec/extensions/pretty_table_spec.rb +16 -16
  138. data/spec/extensions/query_literals_spec.rb +37 -37
  139. data/spec/extensions/query_spec.rb +32 -32
  140. data/spec/extensions/rcte_tree_spec.rb +141 -141
  141. data/spec/extensions/round_timestamps_spec.rb +21 -21
  142. data/spec/extensions/schema_caching_spec.rb +8 -8
  143. data/spec/extensions/schema_dumper_spec.rb +78 -78
  144. data/spec/extensions/schema_spec.rb +31 -27
  145. data/spec/extensions/scissors_spec.rb +3 -3
  146. data/spec/extensions/select_remove_spec.rb +14 -14
  147. data/spec/extensions/sequel_3_dataset_methods_spec.rb +28 -28
  148. data/spec/extensions/serialization_modification_detection_spec.rb +33 -33
  149. data/spec/extensions/serialization_spec.rb +79 -78
  150. data/spec/extensions/server_block_spec.rb +17 -17
  151. data/spec/extensions/set_overrides_spec.rb +30 -30
  152. data/spec/extensions/sharding_spec.rb +65 -65
  153. data/spec/extensions/shared_caching_spec.rb +29 -29
  154. data/spec/extensions/single_table_inheritance_spec.rb +79 -79
  155. data/spec/extensions/skip_create_refresh_spec.rb +3 -3
  156. data/spec/extensions/spec_helper.rb +4 -29
  157. data/spec/extensions/split_array_nil_spec.rb +9 -9
  158. data/spec/extensions/split_values_spec.rb +7 -7
  159. data/spec/extensions/sql_expr_spec.rb +32 -32
  160. data/spec/extensions/static_cache_spec.rb +123 -123
  161. data/spec/extensions/string_date_time_spec.rb +34 -34
  162. data/spec/extensions/string_stripper_spec.rb +15 -15
  163. data/spec/extensions/subclasses_spec.rb +31 -31
  164. data/spec/extensions/table_select_spec.rb +15 -15
  165. data/spec/extensions/tactical_eager_loading_spec.rb +23 -23
  166. data/spec/extensions/thread_local_timezones_spec.rb +13 -13
  167. data/spec/extensions/timestamps_spec.rb +40 -40
  168. data/spec/extensions/to_dot_spec.rb +34 -34
  169. data/spec/extensions/touch_spec.rb +52 -52
  170. data/spec/extensions/tree_spec.rb +72 -72
  171. data/spec/extensions/typecast_on_load_spec.rb +25 -25
  172. data/spec/extensions/unlimited_update_spec.rb +2 -2
  173. data/spec/extensions/update_or_create_spec.rb +36 -36
  174. data/spec/extensions/update_primary_key_spec.rb +35 -35
  175. data/spec/extensions/update_refresh_spec.rb +41 -0
  176. data/spec/extensions/validate_associated_spec.rb +52 -0
  177. data/spec/extensions/validation_class_methods_spec.rb +314 -317
  178. data/spec/extensions/validation_helpers_spec.rb +195 -195
  179. data/spec/extensions/xml_serializer_spec.rb +48 -48
  180. data/spec/guards_helper.rb +55 -0
  181. data/spec/integration/associations_test.rb +1089 -1088
  182. data/spec/integration/database_test.rb +29 -29
  183. data/spec/integration/dataset_test.rb +661 -661
  184. data/spec/integration/eager_loader_test.rb +147 -147
  185. data/spec/integration/migrator_test.rb +122 -122
  186. data/spec/integration/model_test.rb +70 -70
  187. data/spec/integration/plugin_test.rb +682 -640
  188. data/spec/integration/prepared_statement_test.rb +172 -172
  189. data/spec/integration/schema_test.rb +245 -245
  190. data/spec/integration/spec_helper.rb +1 -64
  191. data/spec/integration/timezone_test.rb +17 -17
  192. data/spec/integration/transaction_test.rb +87 -87
  193. data/spec/integration/type_test.rb +33 -33
  194. data/spec/model/association_reflection_spec.rb +130 -121
  195. data/spec/model/associations_spec.rb +1112 -1113
  196. data/spec/model/base_spec.rb +197 -196
  197. data/spec/model/class_dataset_methods_spec.rb +118 -118
  198. data/spec/model/dataset_methods_spec.rb +49 -49
  199. data/spec/model/eager_loading_spec.rb +705 -702
  200. data/spec/model/hooks_spec.rb +169 -168
  201. data/spec/model/inflector_spec.rb +5 -5
  202. data/spec/model/model_spec.rb +287 -297
  203. data/spec/model/plugins_spec.rb +47 -47
  204. data/spec/model/record_spec.rb +534 -535
  205. data/spec/model/spec_helper.rb +3 -21
  206. data/spec/model/validations_spec.rb +72 -70
  207. data/spec/spec_config.rb +8 -0
  208. metadata +41 -9
  209. data/lib/sequel/adapters/fdbsql.rb +0 -286
  210. data/lib/sequel/adapters/jdbc/fdbsql.rb +0 -66
  211. data/lib/sequel/adapters/openbase.rb +0 -54
  212. data/lib/sequel/adapters/shared/fdbsql.rb +0 -550
  213. data/spec/adapters/fdbsql_spec.rb +0 -429
  214. data/spec/rspec_helper.rb +0 -22
@@ -13,11 +13,11 @@ DB.create_table :test do
13
13
  end
14
14
 
15
15
  describe "A Informix database" do
16
- specify "should provide disconnect functionality" do
16
+ it "should provide disconnect functionality" do
17
17
  DB.execute("select user from dual")
18
- DB.pool.size.should == 1
18
+ DB.pool.size.must_equal 1
19
19
  DB.disconnect
20
- DB.pool.size.should == 0
20
+ DB.pool.size.must_equal 0
21
21
  end
22
22
  end
23
23
 
@@ -27,28 +27,28 @@ describe "A Informix dataset" do
27
27
  @d.delete # remove all records
28
28
  end
29
29
 
30
- specify "should return the correct record count" do
31
- @d.count.should == 0
30
+ it "should return the correct record count" do
31
+ @d.count.must_equal 0
32
32
  @d << {:name => 'abc', :value => 123}
33
33
  @d << {:name => 'abc', :value => 456}
34
34
  @d << {:name => 'def', :value => 789}
35
- @d.count.should == 3
35
+ @d.count.must_equal 3
36
36
  end
37
37
 
38
- specify "should return the correct records" do
39
- @d.to_a.should == []
38
+ it "should return the correct records" do
39
+ @d.to_a.must_equal []
40
40
  @d << {:name => 'abc', :value => 123}
41
41
  @d << {:name => 'abc', :value => 456}
42
42
  @d << {:name => 'def', :value => 789}
43
43
 
44
- @d.order(:value).to_a.should == [
44
+ @d.order(:value).to_a.must_equal [
45
45
  {:name => 'abc', :value => 123},
46
46
  {:name => 'abc', :value => 456},
47
47
  {:name => 'def', :value => 789}
48
48
  ]
49
49
  end
50
50
 
51
- specify "should update records correctly" do
51
+ it "should update records correctly" do
52
52
  @d << {:name => 'abc', :value => 123}
53
53
  @d << {:name => 'abc', :value => 456}
54
54
  @d << {:name => 'def', :value => 789}
@@ -56,45 +56,45 @@ describe "A Informix dataset" do
56
56
 
57
57
  # the third record should stay the same
58
58
  # floating-point precision bullshit
59
- @d[:name => 'def'][:value].should == 789
60
- @d.filter(:value => 530).count.should == 2
59
+ @d[:name => 'def'][:value].must_equal 789
60
+ @d.filter(:value => 530).count.must_equal 2
61
61
  end
62
62
 
63
- specify "should delete records correctly" do
63
+ it "should delete records correctly" do
64
64
  @d << {:name => 'abc', :value => 123}
65
65
  @d << {:name => 'abc', :value => 456}
66
66
  @d << {:name => 'def', :value => 789}
67
67
  @d.filter(:name => 'abc').delete
68
68
 
69
- @d.count.should == 1
70
- @d.first[:name].should == 'def'
69
+ @d.count.must_equal 1
70
+ @d.first[:name].must_equal 'def'
71
71
  end
72
72
 
73
- specify "should be able to literalize booleans" do
74
- proc {@d.literal(true)}.should_not raise_error
75
- proc {@d.literal(false)}.should_not raise_error
73
+ it "should be able to literalize booleans" do
74
+ @d.literal(true)
75
+ @d.literal(false)
76
76
  end
77
77
 
78
- specify "should support transactions" do
78
+ it "should support transactions" do
79
79
  DB.transaction do
80
80
  @d << {:name => 'abc', :value => 1}
81
81
  end
82
82
 
83
- @d.count.should == 1
83
+ @d.count.must_equal 1
84
84
  end
85
85
 
86
- specify "should support #first and #last" do
86
+ it "should support #first and #last" do
87
87
  @d << {:name => 'abc', :value => 123}
88
88
  @d << {:name => 'abc', :value => 456}
89
89
  @d << {:name => 'def', :value => 789}
90
90
 
91
- @d.order(:value).first.should == {:name => 'abc', :value => 123}
92
- @d.order(:value).last.should == {:name => 'def', :value => 789}
91
+ @d.order(:value).first.must_equal(:name => 'abc', :value => 123)
92
+ @d.order(:value).last.must_equal(:name => 'def', :value => 789)
93
93
  end
94
94
 
95
- specify "should return last inserted id" do
95
+ it "should return last inserted id" do
96
96
  first = @d.insert :name => 'abc', :value => 123
97
97
  second = @d.insert :name => 'abc', :value => 123
98
- (second - first).should == 1
98
+ (second - first).must_equal 1
99
99
  end
100
100
  end
@@ -16,19 +16,19 @@ describe "A MSSQL database" do
16
16
  @db = DB
17
17
  end
18
18
 
19
- specify "should be able to read fractional part of timestamp" do
19
+ it "should be able to read fractional part of timestamp" do
20
20
  rs = @db["select getutcdate() as full_date, cast(datepart(millisecond, getutcdate()) as int) as milliseconds"].first
21
- rs[:milliseconds].should == rs[:full_date].usec/1000
21
+ rs[:milliseconds].must_equal rs[:full_date].usec/1000
22
22
  end
23
23
 
24
- specify "should be able to write fractional part of timestamp" do
24
+ it "should be able to write fractional part of timestamp" do
25
25
  t = Time.utc(2001, 12, 31, 23, 59, 59, 997000)
26
- (t.usec/1000).should == @db["select cast(datepart(millisecond, ?) as int) as milliseconds", t].get
26
+ (t.usec/1000).must_equal @db["select cast(datepart(millisecond, ?) as int) as milliseconds", t].get
27
27
  end
28
28
 
29
- specify "should not raise an error when getting the server version" do
30
- proc{@db.server_version}.should_not raise_error
31
- proc{@db.dataset.server_version}.should_not raise_error
29
+ it "should not raise an error when getting the server version" do
30
+ @db.server_version
31
+ @db.dataset.server_version
32
32
  end
33
33
  end
34
34
 
@@ -44,8 +44,8 @@ describe "A MSSQL database" do
44
44
  @db.drop_table?(:test3)
45
45
  end
46
46
 
47
- specify "should work with NOLOCK" do
48
- @db.transaction{@db[:test3].nolock.all.should == []}
47
+ it "should work with NOLOCK" do
48
+ @db.transaction{@db[:test3].nolock.all.must_equal []}
49
49
  end
50
50
  end
51
51
 
@@ -61,12 +61,12 @@ describe "MSSQL" do
61
61
  @db.drop_table?(:test3, :test4)
62
62
  end
63
63
 
64
- specify "should should support CROSS APPLY" do
65
- @db[:test3].cross_apply(@db[:test4].where(:test3__v3=>:test4__v4)).select_order_map([:v3, :v4]).should == [[1,1]]
64
+ it "should should support CROSS APPLY" do
65
+ @db[:test3].cross_apply(@db[:test4].where(:test3__v3=>:test4__v4)).select_order_map([:v3, :v4]).must_equal [[1,1]]
66
66
  end
67
67
 
68
- specify "should should support OUTER APPLY" do
69
- @db[:test3].outer_apply(@db[:test4].where(:test3__v3=>:test4__v4)).select_order_map([:v3, :v4]).should == [[1,1], [2, nil]]
68
+ it "should should support OUTER APPLY" do
69
+ @db[:test3].outer_apply(@db[:test4].where(:test3__v3=>:test4__v4)).select_order_map([:v3, :v4]).must_equal [[1,1], [2, nil]]
70
70
  end
71
71
  end
72
72
 
@@ -83,31 +83,29 @@ describe "MSSQL full_text_search" do
83
83
  @db.drop_table?(:posts)
84
84
  end
85
85
 
86
- specify "should support fulltext indexes and full_text_search" do
86
+ it "should support fulltext indexes and full_text_search" do
87
87
  log do
88
88
  @db.create_table(:posts){Integer :id, :null=>false; String :title; String :body; index :id, :name=>:fts_id_idx, :unique=>true; full_text_index :title, :key_index=>:fts_id_idx; full_text_index [:title, :body], :key_index=>:fts_id_idx}
89
89
  @db[:posts].insert(:title=>'ruby rails', :body=>'y')
90
90
  @db[:posts].insert(:title=>'sequel', :body=>'ruby')
91
91
  @db[:posts].insert(:title=>'ruby scooby', :body=>'x')
92
92
 
93
- @db[:posts].full_text_search(:title, 'rails').all.should == [{:title=>'ruby rails', :body=>'y'}]
94
- @db[:posts].full_text_search([:title, :body], ['sequel', 'ruby']).all.should == [{:title=>'sequel', :body=>'ruby'}]
93
+ @db[:posts].full_text_search(:title, 'rails').all.must_equal [{:title=>'ruby rails', :body=>'y'}]
94
+ @db[:posts].full_text_search([:title, :body], ['sequel', 'ruby']).all.must_equal [{:title=>'sequel', :body=>'ruby'}]
95
95
 
96
- @db[:posts].full_text_search(:title, :$n).call(:select, :n=>'rails').should == [{:title=>'ruby rails', :body=>'y'}]
97
- @db[:posts].full_text_search(:title, :$n).prepare(:select, :fts_select).call(:n=>'rails').should == [{:title=>'ruby rails', :body=>'y'}]
96
+ @db[:posts].full_text_search(:title, :$n).call(:select, :n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
97
+ @db[:posts].full_text_search(:title, :$n).prepare(:select, :fts_select).call(:n=>'rails').must_equal [{:title=>'ruby rails', :body=>'y'}]
98
98
  end
99
99
  end
100
100
  end if false
101
101
 
102
102
  describe "MSSQL Dataset#join_table" do
103
- specify "should emulate the USING clause with ON" do
104
- DB[:items].join(:categories, [:id]).sql.should ==
105
- 'SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON ([CATEGORIES].[ID] = [ITEMS].[ID])'
103
+ it "should emulate the USING clause with ON" do
104
+ DB[:items].join(:categories, [:id]).sql.must_equal 'SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON ([CATEGORIES].[ID] = [ITEMS].[ID])'
106
105
  ['SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON (([CATEGORIES].[ID1] = [ITEMS].[ID1]) AND ([CATEGORIES].[ID2] = [ITEMS].[ID2]))',
107
106
  'SELECT * FROM [ITEMS] INNER JOIN [CATEGORIES] ON (([CATEGORIES].[ID2] = [ITEMS].[ID2]) AND ([CATEGORIES].[ID1] = [ITEMS].[ID1]))'].
108
- should include(DB[:items].join(:categories, [:id1, :id2]).sql)
109
- DB[:items___i].join(:categories___c, [:id]).sql.should ==
110
- 'SELECT * FROM [ITEMS] AS [I] INNER JOIN [CATEGORIES] AS [C] ON ([C].[ID] = [I].[ID])'
107
+ must_include(DB[:items].join(:categories, [:id1, :id2]).sql)
108
+ DB[:items___i].join(:categories___c, [:id]).sql.must_equal 'SELECT * FROM [ITEMS] AS [I] INNER JOIN [CATEGORIES] AS [C] ON ([C].[ID] = [I].[ID])'
111
109
  end
112
110
  end
113
111
 
@@ -122,70 +120,58 @@ describe "MSSQL Dataset#output" do
122
120
  @db.drop_table?(:items, :out)
123
121
  end
124
122
 
125
- specify "should format OUTPUT clauses without INTO for DELETE statements" do
126
- @ds.output(nil, [:deleted__name, :deleted__value]).delete_sql.should =~
127
- /DELETE FROM \[ITEMS\] OUTPUT \[DELETED\].\[(NAME|VALUE)\], \[DELETED\].\[(NAME|VALUE)\]/
128
- @ds.output(nil, [Sequel::SQL::ColumnAll.new(:deleted)]).delete_sql.should =~
129
- /DELETE FROM \[ITEMS\] OUTPUT \[DELETED\].*/
123
+ it "should format OUTPUT clauses without INTO for DELETE statements" do
124
+ @ds.output(nil, [:deleted__name, :deleted__value]).delete_sql.must_match(/DELETE FROM \[ITEMS\] OUTPUT \[DELETED\].\[(NAME|VALUE)\], \[DELETED\].\[(NAME|VALUE)\]/)
125
+ @ds.output(nil, [Sequel::SQL::ColumnAll.new(:deleted)]).delete_sql.must_match(/DELETE FROM \[ITEMS\] OUTPUT \[DELETED\].*/)
130
126
  end
131
127
 
132
- specify "should format OUTPUT clauses with INTO for DELETE statements" do
133
- @ds.output(:out, [:deleted__name, :deleted__value]).delete_sql.should =~
134
- /DELETE FROM \[ITEMS\] OUTPUT \[DELETED\].\[(NAME|VALUE)\], \[DELETED\].\[(NAME|VALUE)\] INTO \[OUT\]/
135
- @ds.output(:out, {:name => :deleted__name, :value => :deleted__value}).delete_sql.should =~
136
- /DELETE FROM \[ITEMS\] OUTPUT \[DELETED\].\[(NAME|VALUE)\], \[DELETED\].\[(NAME|VALUE)\] INTO \[OUT\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\)/
128
+ it "should format OUTPUT clauses with INTO for DELETE statements" do
129
+ @ds.output(:out, [:deleted__name, :deleted__value]).delete_sql.must_match(/DELETE FROM \[ITEMS\] OUTPUT \[DELETED\].\[(NAME|VALUE)\], \[DELETED\].\[(NAME|VALUE)\] INTO \[OUT\]/)
130
+ @ds.output(:out, {:name => :deleted__name, :value => :deleted__value}).delete_sql.must_match(/DELETE FROM \[ITEMS\] OUTPUT \[DELETED\].\[(NAME|VALUE)\], \[DELETED\].\[(NAME|VALUE)\] INTO \[OUT\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\)/)
137
131
  end
138
132
 
139
- specify "should format OUTPUT clauses without INTO for INSERT statements" do
140
- @ds.output(nil, [:inserted__name, :inserted__value]).insert_sql(:name => "name", :value => 1).should =~
141
- /INSERT INTO \[ITEMS\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\) OUTPUT \[INSERTED\].\[(NAME|VALUE)\], \[INSERTED\].\[(NAME|VALUE)\] VALUES \((N'name'|1), (N'name'|1)\)/
142
- @ds.output(nil, [Sequel::SQL::ColumnAll.new(:inserted)]).insert_sql(:name => "name", :value => 1).should =~
143
- /INSERT INTO \[ITEMS\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\) OUTPUT \[INSERTED\].* VALUES \((N'name'|1), (N'name'|1)\)/
133
+ it "should format OUTPUT clauses without INTO for INSERT statements" do
134
+ @ds.output(nil, [:inserted__name, :inserted__value]).insert_sql(:name => "name", :value => 1).must_match(/INSERT INTO \[ITEMS\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\) OUTPUT \[INSERTED\].\[(NAME|VALUE)\], \[INSERTED\].\[(NAME|VALUE)\] VALUES \((N'name'|1), (N'name'|1)\)/)
135
+ @ds.output(nil, [Sequel::SQL::ColumnAll.new(:inserted)]).insert_sql(:name => "name", :value => 1).must_match(/INSERT INTO \[ITEMS\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\) OUTPUT \[INSERTED\].* VALUES \((N'name'|1), (N'name'|1)\)/)
144
136
  end
145
137
 
146
- specify "should format OUTPUT clauses with INTO for INSERT statements" do
147
- @ds.output(:out, [:inserted__name, :inserted__value]).insert_sql(:name => "name", :value => 1).should =~
148
- /INSERT INTO \[ITEMS\] \((\[NAME\]|\[VALUE\]), (\[NAME\]|\[VALUE\])\) OUTPUT \[INSERTED\].\[(NAME|VALUE)\], \[INSERTED\].\[(NAME|VALUE)\] INTO \[OUT\] VALUES \((N'name'|1), (N'name'|1)\)/
149
- @ds.output(:out, {:name => :inserted__name, :value => :inserted__value}).insert_sql(:name => "name", :value => 1).should =~
150
- /INSERT INTO \[ITEMS\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\) OUTPUT \[INSERTED\].\[(NAME|VALUE)\], \[INSERTED\].\[(NAME|VALUE)\] INTO \[OUT\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\) VALUES \((N'name'|1), (N'name'|1)\)/
138
+ it "should format OUTPUT clauses with INTO for INSERT statements" do
139
+ @ds.output(:out, [:inserted__name, :inserted__value]).insert_sql(:name => "name", :value => 1).must_match(/INSERT INTO \[ITEMS\] \((\[NAME\]|\[VALUE\]), (\[NAME\]|\[VALUE\])\) OUTPUT \[INSERTED\].\[(NAME|VALUE)\], \[INSERTED\].\[(NAME|VALUE)\] INTO \[OUT\] VALUES \((N'name'|1), (N'name'|1)\)/)
140
+ @ds.output(:out, {:name => :inserted__name, :value => :inserted__value}).insert_sql(:name => "name", :value => 1).must_match(/INSERT INTO \[ITEMS\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\) OUTPUT \[INSERTED\].\[(NAME|VALUE)\], \[INSERTED\].\[(NAME|VALUE)\] INTO \[OUT\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\) VALUES \((N'name'|1), (N'name'|1)\)/)
151
141
  end
152
142
 
153
- specify "should format OUTPUT clauses without INTO for UPDATE statements" do
154
- @ds.output(nil, [:inserted__name, :deleted__value]).update_sql(:value => 2).should =~
155
- /UPDATE \[ITEMS\] SET \[VALUE\] = 2 OUTPUT \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\], \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\]/
156
- @ds.output(nil, [Sequel::SQL::ColumnAll.new(:inserted)]).update_sql(:value => 2).should =~
157
- /UPDATE \[ITEMS\] SET \[VALUE\] = 2 OUTPUT \[INSERTED\].*/
143
+ it "should format OUTPUT clauses without INTO for UPDATE statements" do
144
+ @ds.output(nil, [:inserted__name, :deleted__value]).update_sql(:value => 2).must_match(/UPDATE \[ITEMS\] SET \[VALUE\] = 2 OUTPUT \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\], \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\]/)
145
+ @ds.output(nil, [Sequel::SQL::ColumnAll.new(:inserted)]).update_sql(:value => 2).must_match(/UPDATE \[ITEMS\] SET \[VALUE\] = 2 OUTPUT \[INSERTED\].*/)
158
146
  end
159
147
 
160
- specify "should format OUTPUT clauses with INTO for UPDATE statements" do
161
- @ds.output(:out, [:inserted__name, :deleted__value]).update_sql(:value => 2).should =~
162
- /UPDATE \[ITEMS\] SET \[VALUE\] = 2 OUTPUT \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\], \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\] INTO \[OUT\]/
163
- @ds.output(:out, {:name => :inserted__name, :value => :deleted__value}).update_sql(:value => 2).should =~
164
- /UPDATE \[ITEMS\] SET \[VALUE\] = 2 OUTPUT \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\], \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\] INTO \[OUT\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\)/
148
+ it "should format OUTPUT clauses with INTO for UPDATE statements" do
149
+ @ds.output(:out, [:inserted__name, :deleted__value]).update_sql(:value => 2).must_match(/UPDATE \[ITEMS\] SET \[VALUE\] = 2 OUTPUT \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\], \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\] INTO \[OUT\]/)
150
+ @ds.output(:out, {:name => :inserted__name, :value => :deleted__value}).update_sql(:value => 2).must_match(/UPDATE \[ITEMS\] SET \[VALUE\] = 2 OUTPUT \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\], \[(INSERTED\].\[NAME|DELETED\].\[VALUE)\] INTO \[OUT\] \(\[(NAME|VALUE)\], \[(NAME|VALUE)\]\)/)
165
151
  end
166
152
 
167
- specify "should execute OUTPUT clauses in DELETE statements" do
153
+ it "should execute OUTPUT clauses in DELETE statements" do
168
154
  @ds.insert(:name => "name", :value => 1)
169
155
  @ds.output(:out, [:deleted__name, :deleted__value]).delete
170
- @db[:out].all.should == [{:name => "name", :value => 1}]
156
+ @db[:out].all.must_equal [{:name => "name", :value => 1}]
171
157
  @ds.insert(:name => "name", :value => 2)
172
158
  @ds.output(:out, {:name => :deleted__name, :value => :deleted__value}).delete
173
- @db[:out].all.should == [{:name => "name", :value => 1}, {:name => "name", :value => 2}]
159
+ @db[:out].all.must_equal [{:name => "name", :value => 1}, {:name => "name", :value => 2}]
174
160
  end
175
161
 
176
- specify "should execute OUTPUT clauses in INSERT statements" do
162
+ it "should execute OUTPUT clauses in INSERT statements" do
177
163
  @ds.output(:out, [:inserted__name, :inserted__value]).insert(:name => "name", :value => 1)
178
- @db[:out].all.should == [{:name => "name", :value => 1}]
164
+ @db[:out].all.must_equal [{:name => "name", :value => 1}]
179
165
  @ds.output(:out, {:name => :inserted__name, :value => :inserted__value}).insert(:name => "name", :value => 2)
180
- @db[:out].all.should == [{:name => "name", :value => 1}, {:name => "name", :value => 2}]
166
+ @db[:out].all.must_equal [{:name => "name", :value => 1}, {:name => "name", :value => 2}]
181
167
  end
182
168
 
183
- specify "should execute OUTPUT clauses in UPDATE statements" do
169
+ it "should execute OUTPUT clauses in UPDATE statements" do
184
170
  @ds.insert(:name => "name", :value => 1)
185
171
  @ds.output(:out, [:inserted__name, :deleted__value]).update(:value => 2)
186
- @db[:out].all.should == [{:name => "name", :value => 1}]
172
+ @db[:out].all.must_equal [{:name => "name", :value => 1}]
187
173
  @ds.output(:out, {:name => :inserted__name, :value => :deleted__value}).update(:value => 3)
188
- @db[:out].all.should == [{:name => "name", :value => 1}, {:name => "name", :value => 2}]
174
+ @db[:out].all.must_equal [{:name => "name", :value => 1}, {:name => "name", :value => 2}]
189
175
  end
190
176
  end
191
177
 
@@ -197,24 +183,24 @@ describe "MSSQL dataset using #with and #with_recursive" do
197
183
  @ds2 = @ds.with_recursive(:t, @db[:x], @db[:t])
198
184
  end
199
185
 
200
- specify "should prepend UPDATE statements with WITH clause" do
201
- @ds1.update_sql(:x => :y).should == 'WITH [T] AS (SELECT * FROM [X]) UPDATE [T] SET [X] = [Y]'
202
- @ds2.update_sql(:x => :y).should == 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) UPDATE [T] SET [X] = [Y]'
186
+ it "should prepend UPDATE statements with WITH clause" do
187
+ @ds1.update_sql(:x => :y).must_equal 'WITH [T] AS (SELECT * FROM [X]) UPDATE [T] SET [X] = [Y]'
188
+ @ds2.update_sql(:x => :y).must_equal 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) UPDATE [T] SET [X] = [Y]'
203
189
  end
204
190
 
205
- specify "should prepend DELETE statements with WITH clause" do
206
- @ds1.filter(:y => 1).delete_sql.should == 'WITH [T] AS (SELECT * FROM [X]) DELETE FROM [T] WHERE ([Y] = 1)'
207
- @ds2.filter(:y => 1).delete_sql.should == 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) DELETE FROM [T] WHERE ([Y] = 1)'
191
+ it "should prepend DELETE statements with WITH clause" do
192
+ @ds1.filter(:y => 1).delete_sql.must_equal 'WITH [T] AS (SELECT * FROM [X]) DELETE FROM [T] WHERE ([Y] = 1)'
193
+ @ds2.filter(:y => 1).delete_sql.must_equal 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) DELETE FROM [T] WHERE ([Y] = 1)'
208
194
  end
209
195
 
210
- specify "should prepend INSERT statements with WITH clause" do
211
- @ds1.insert_sql(@db[:t]).should == 'WITH [T] AS (SELECT * FROM [X]) INSERT INTO [T] SELECT * FROM [T]'
212
- @ds2.insert_sql(@db[:t]).should == 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) INSERT INTO [T] SELECT * FROM [T]'
196
+ it "should prepend INSERT statements with WITH clause" do
197
+ @ds1.insert_sql(@db[:t]).must_equal 'WITH [T] AS (SELECT * FROM [X]) INSERT INTO [T] SELECT * FROM [T]'
198
+ @ds2.insert_sql(@db[:t]).must_equal 'WITH [T] AS (SELECT * FROM [X] UNION ALL SELECT * FROM [T]) INSERT INTO [T] SELECT * FROM [T]'
213
199
  end
214
200
 
215
- specify "should move WITH clause on joined dataset to top level" do
216
- @db[:s].inner_join(@ds1).sql.should == "WITH [T] AS (SELECT * FROM [X]) SELECT * FROM [S] INNER JOIN (SELECT * FROM [T]) AS [T1]"
217
- @ds1.inner_join(@db[:s].with(:s, @db[:y])).sql.should == "WITH [T] AS (SELECT * FROM [X]), [S] AS (SELECT * FROM [Y]) SELECT * FROM [T] INNER JOIN (SELECT * FROM [S]) AS [T1]"
201
+ it "should move WITH clause on joined dataset to top level" do
202
+ @db[:s].inner_join(@ds1).sql.must_equal "WITH [T] AS (SELECT * FROM [X]) SELECT * FROM [S] INNER JOIN (SELECT * FROM [T]) AS [T1]"
203
+ @ds1.inner_join(@db[:s].with(:s, @db[:y])).sql.must_equal "WITH [T] AS (SELECT * FROM [X]), [S] AS (SELECT * FROM [Y]) SELECT * FROM [T] INNER JOIN (SELECT * FROM [S]) AS [T1]"
218
204
  end
219
205
  end
220
206
 
@@ -228,16 +214,16 @@ describe "MSSQL::Dataset#import" do
228
214
  @db.drop_table?(:test)
229
215
  end
230
216
 
231
- specify "#import should work correctly with an arbitrary output value" do
217
+ it "#import should work correctly with an arbitrary output value" do
232
218
  @db.create_table!(:test){primary_key :x; Integer :y}
233
- @ds.output(nil, [:inserted__y, :inserted__x]).import([:y], [[3], [4]]).should == [{:y=>3, :x=>1}, {:y=>4, :x=>2}]
234
- @ds.all.should == [{:x=>1, :y=>3}, {:x=>2, :y=>4}]
219
+ @ds.output(nil, [:inserted__y, :inserted__x]).import([:y], [[3], [4]]).must_equal [{:y=>3, :x=>1}, {:y=>4, :x=>2}]
220
+ @ds.all.must_equal [{:x=>1, :y=>3}, {:x=>2, :y=>4}]
235
221
  end
236
222
 
237
- specify "should handle WITH statements" do
223
+ it "should handle WITH statements" do
238
224
  @db.create_table!(:test){Integer :x; Integer :y}
239
225
  @db[:testx].with(:testx, @db[:test]).import([:x, :y], [[1, 2], [3, 4], [5, 6]], :slice => 2)
240
- @ds.select_order_map([:x, :y]).should == [[1, 2], [3, 4], [5, 6]]
226
+ @ds.select_order_map([:x, :y]).must_equal [[1, 2], [3, 4], [5, 6]]
241
227
  end
242
228
  end
243
229
 
@@ -246,14 +232,12 @@ describe "MSSQL joined datasets" do
246
232
  @db = DB
247
233
  end
248
234
 
249
- specify "should format DELETE statements" do
250
- @db[:t1].inner_join(:t2, :t1__pk => :t2__pk).delete_sql.should ==
251
- "DELETE FROM [T1] FROM [T1] INNER JOIN [T2] ON ([T1].[PK] = [T2].[PK])"
235
+ it "should format DELETE statements" do
236
+ @db[:t1].inner_join(:t2, :t1__pk => :t2__pk).delete_sql.must_equal "DELETE FROM [T1] FROM [T1] INNER JOIN [T2] ON ([T1].[PK] = [T2].[PK])"
252
237
  end
253
238
 
254
- specify "should format UPDATE statements" do
255
- @db[:t1].inner_join(:t2, :t1__pk => :t2__pk).update_sql(:pk => :t2__pk).should ==
256
- "UPDATE [T1] SET [PK] = [T2].[PK] FROM [T1] INNER JOIN [T2] ON ([T1].[PK] = [T2].[PK])"
239
+ it "should format UPDATE statements" do
240
+ @db[:t1].inner_join(:t2, :t1__pk => :t2__pk).update_sql(:pk => :t2__pk).must_equal "UPDATE [T1] SET [PK] = [T2].[PK] FROM [T1] INNER JOIN [T2] ON ([T1].[PK] = [T2].[PK])"
257
241
  end
258
242
  end
259
243
 
@@ -270,13 +254,13 @@ describe "Offset support" do
270
254
  @db.drop_table?(:i)
271
255
  end
272
256
 
273
- specify "should return correct rows" do
274
- @ds.limit(2, 2).all.should == [{:id=>6, :parent_id=>3}, {:id=>8, :parent_id=>3}]
257
+ it "should return correct rows" do
258
+ @ds.limit(2, 2).all.must_equal [{:id=>6, :parent_id=>3}, {:id=>8, :parent_id=>3}]
275
259
  end
276
260
 
277
- specify "should not include offset column in hashes passed to row_proc" do
261
+ it "should not include offset column in hashes passed to row_proc" do
278
262
  @ds.limit(2, 2).all
279
- @hs.should == [{:id=>3, :parent_id=>1}, {:id=>4, :parent_id=>1}]
263
+ @hs.must_equal [{:id=>3, :parent_id=>1}, {:id=>4, :parent_id=>1}]
280
264
  end
281
265
  end
282
266
 
@@ -293,62 +277,62 @@ describe "Common Table Expressions" do
293
277
  @db.drop_table?(:i1, :i2)
294
278
  end
295
279
 
296
- specify "using #with should be able to update" do
280
+ it "using #with should be able to update" do
297
281
  @ds.insert(:id=>1)
298
282
  @ds2.insert(:id=>2, :parent_id=>1)
299
283
  @ds2.insert(:id=>3, :parent_id=>2)
300
284
  @ds.with(:t, @ds2).filter(:id => @db[:t].select(:id)).update(:parent_id => @db[:t].filter(:id => :i1__id).select(:parent_id).limit(1))
301
- @ds[:id => 1].should == {:id => 1, :parent_id => nil}
302
- @ds[:id => 2].should == {:id => 2, :parent_id => 1}
303
- @ds[:id => 3].should == {:id => 3, :parent_id => 2}
304
- @ds[:id => 4].should == {:id => 4, :parent_id => 1}
285
+ @ds[:id => 1].must_equal(:id => 1, :parent_id => nil)
286
+ @ds[:id => 2].must_equal(:id => 2, :parent_id => 1)
287
+ @ds[:id => 3].must_equal(:id => 3, :parent_id => 2)
288
+ @ds[:id => 4].must_equal(:id => 4, :parent_id => 1)
305
289
  end
306
290
 
307
- specify "using #with_recursive should be able to update" do
291
+ it "using #with_recursive should be able to update" do
308
292
  ds = @ds.with_recursive(:t, @ds.filter(:parent_id=>1).or(:id => 1), @ds.join(:t, :i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi])
309
293
  ds.exclude(:id => @db[:t].select(:i)).update(:parent_id => 1)
310
- @ds[:id => 1].should == {:id => 1, :parent_id => nil}
311
- @ds[:id => 2].should == {:id => 2, :parent_id => 1}
312
- @ds[:id => 5].should == {:id => 5, :parent_id => 3}
294
+ @ds[:id => 1].must_equal(:id => 1, :parent_id => nil)
295
+ @ds[:id => 2].must_equal(:id => 2, :parent_id => 1)
296
+ @ds[:id => 5].must_equal(:id => 5, :parent_id => 3)
313
297
  end
314
298
 
315
- specify "using #with should be able to insert" do
299
+ it "using #with should be able to insert" do
316
300
  @ds2.insert(:id=>7)
317
301
  @ds.with(:t, @ds2).insert(@db[:t])
318
- @ds[:id => 7].should == {:id => 7, :parent_id => nil}
302
+ @ds[:id => 7].must_equal(:id => 7, :parent_id => nil)
319
303
  end
320
304
 
321
- specify "using #with_recursive should be able to insert" do
305
+ it "using #with_recursive should be able to insert" do
322
306
  ds = @ds2.with_recursive(:t, @ds.filter(:parent_id=>1), @ds.join(:t, :i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi])
323
307
  ds.insert @db[:t]
324
- @ds2.all.should == [{:id => 3, :parent_id => 1}, {:id => 4, :parent_id => 1}, {:id => 5, :parent_id => 3}, {:id => 6, :parent_id => 5}]
308
+ @ds2.all.must_equal [{:id => 3, :parent_id => 1}, {:id => 4, :parent_id => 1}, {:id => 5, :parent_id => 3}, {:id => 6, :parent_id => 5}]
325
309
  end
326
310
 
327
- specify "using #with should be able to delete" do
311
+ it "using #with should be able to delete" do
328
312
  @ds2.insert(:id=>6)
329
313
  @ds2.insert(:id=>5)
330
314
  @ds2.insert(:id=>4)
331
315
  @ds.with(:t, @ds2).filter(:id => @db[:t].select(:id)).delete
332
- @ds.all.should == [{:id => 1, :parent_id => nil}, {:id => 2, :parent_id => nil}, {:id => 3, :parent_id => 1}]
316
+ @ds.all.must_equal [{:id => 1, :parent_id => nil}, {:id => 2, :parent_id => nil}, {:id => 3, :parent_id => 1}]
333
317
  end
334
318
 
335
- specify "using #with_recursive should be able to delete" do
319
+ it "using #with_recursive should be able to delete" do
336
320
  @ds.insert(:id=>7, :parent_id=>2)
337
321
  ds = @ds.with_recursive(:t, @ds.filter(:parent_id=>1), @ds.join(:t, :i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi])
338
322
  ds.filter(:i1__id => @db[:t].select(:i)).delete
339
- @ds.all.should == [{:id => 1, :parent_id => nil}, {:id => 2, :parent_id => nil}, {:id => 7, :parent_id => 2}]
323
+ @ds.all.must_equal [{:id => 1, :parent_id => nil}, {:id => 2, :parent_id => nil}, {:id => 7, :parent_id => 2}]
340
324
  end
341
325
 
342
- specify "using #with should be able to import" do
326
+ it "using #with should be able to import" do
343
327
  @ds2.insert(:id=>7)
344
328
  @ds.with(:t, @ds2).import [:id, :parent_id], @db[:t].select(:id, :parent_id)
345
- @ds[:id => 7].should == {:id => 7, :parent_id => nil}
329
+ @ds[:id => 7].must_equal(:id => 7, :parent_id => nil)
346
330
  end
347
331
 
348
- specify "using #with_recursive should be able to import" do
332
+ it "using #with_recursive should be able to import" do
349
333
  ds = @ds2.with_recursive(:t, @ds.filter(:parent_id=>1), @ds.join(:t, :i=>:parent_id).select(:i1__id, :i1__parent_id), :args=>[:i, :pi])
350
334
  ds.import [:id, :parent_id], @db[:t].select(:i, :pi)
351
- @ds2.all.should == [{:id => 3, :parent_id => 1}, {:id => 4, :parent_id => 1}, {:id => 5, :parent_id => 3}, {:id => 6, :parent_id => 5}]
335
+ @ds2.all.must_equal [{:id => 3, :parent_id => 1}, {:id => 4, :parent_id => 1}, {:id => 5, :parent_id => 3}, {:id => 6, :parent_id => 5}]
352
336
  end
353
337
  end
354
338
 
@@ -367,31 +351,31 @@ describe "MSSSQL::Dataset#insert" do
367
351
  @db.drop_table?(:test5, :test4)
368
352
  end
369
353
 
370
- specify "should have insert_select return nil if disable_insert_output is used" do
371
- @ds.disable_insert_output.insert_select(:value=>10).should == nil
354
+ it "should have insert_select return nil if disable_insert_output is used" do
355
+ @ds.disable_insert_output.insert_select(:value=>10).must_equal nil
372
356
  end
373
357
 
374
- specify "should have insert_select return nil if the server version is not 2005+" do
358
+ it "should have insert_select return nil if the server version is not 2005+" do
375
359
  def @ds.server_version() 8000760 end
376
- @ds.insert_select(:value=>10).should == nil
360
+ @ds.insert_select(:value=>10).must_equal nil
377
361
  end
378
362
 
379
- specify "should have insert_select insert the record and return the inserted record" do
363
+ it "should have insert_select insert the record and return the inserted record" do
380
364
  h = @ds.insert_select(:value=>10)
381
- h[:value].should == 10
382
- @ds.first(:xid=>h[:xid])[:value].should == 10
365
+ h[:value].must_equal 10
366
+ @ds.first(:xid=>h[:xid])[:value].must_equal 10
383
367
  end
384
368
 
385
- cspecify "should allow large text and binary values", :odbc do
369
+ cspecify "should allow large text and binary values", [:odbc] do
386
370
  blob = Sequel::SQL::Blob.new("0" * (65*1024))
387
371
  @db[:test4].insert(:name => 'max varbinary test', :value => blob)
388
372
  b = @db[:test4].where(:name => 'max varbinary test').get(:value)
389
- b.length.should == blob.length
390
- b.should == blob
373
+ b.length.must_equal blob.length
374
+ b.must_equal blob
391
375
  end
392
376
 
393
- specify "should play nicely with simple_select_all?" do
394
- DB[:test4].disable_insert_output.send(:simple_select_all?).should == true
377
+ it "should play nicely with simple_select_all?" do
378
+ DB[:test4].disable_insert_output.send(:simple_select_all?).must_equal true
395
379
  end
396
380
  end
397
381
 
@@ -400,15 +384,15 @@ describe "MSSSQL::Dataset#into" do
400
384
  @db = DB
401
385
  end
402
386
 
403
- specify "should format SELECT statement" do
404
- @db[:t].into(:new).select_sql.should == "SELECT * INTO [NEW] FROM [T]"
387
+ it "should format SELECT statement" do
388
+ @db[:t].into(:new).select_sql.must_equal "SELECT * INTO [NEW] FROM [T]"
405
389
  end
406
390
 
407
- specify "should select rows into a new table" do
391
+ it "should select rows into a new table" do
408
392
  @db.create_table!(:t) {Integer :id; String :value}
409
393
  @db[:t].insert(:id => 1, :value => "test")
410
394
  @db << @db[:t].into(:new).select_sql
411
- @db[:new].all.should == [{:id => 1, :value => "test"}]
395
+ @db[:new].all.must_equal [{:id => 1, :value => "test"}]
412
396
  @db.drop_table?(:t, :new)
413
397
  end
414
398
  end
@@ -421,21 +405,21 @@ describe "A MSSQL database" do
421
405
  @db.drop_table?(:a)
422
406
  end
423
407
 
424
- specify "should handle many existing types for set_column_allow_null" do
408
+ it "should handle many existing types for set_column_allow_null" do
425
409
  @db.create_table!(:a){column :a, 'integer'}
426
410
  @db.alter_table(:a){set_column_allow_null :a, false}
427
411
  @db.create_table!(:a){column :a, 'decimal(24, 2)'}
428
412
  @db.alter_table(:a){set_column_allow_null :a, false}
429
- @db.schema(:a).first.last[:column_size].should == 24
430
- @db.schema(:a).first.last[:scale].should == 2
413
+ @db.schema(:a).first.last[:column_size].must_equal 24
414
+ @db.schema(:a).first.last[:scale].must_equal 2
431
415
  @db.create_table!(:a){column :a, 'decimal(10)'}
432
- @db.schema(:a).first.last[:column_size].should == 10
433
- @db.schema(:a).first.last[:scale].should == 0
416
+ @db.schema(:a).first.last[:column_size].must_equal 10
417
+ @db.schema(:a).first.last[:scale].must_equal 0
434
418
  @db.alter_table(:a){set_column_allow_null :a, false}
435
419
  @db.create_table!(:a){column :a, 'nchar(2)'}
436
420
  @db.alter_table(:a){set_column_allow_null :a, false}
437
421
  s = @db.schema(:a).first.last
438
- (s[:max_chars] || s[:column_size]).should == 2
422
+ (s[:max_chars] || s[:column_size]).must_equal 2
439
423
  end
440
424
  end
441
425
 
@@ -444,16 +428,16 @@ describe "MSSQL::Database#rename_table" do
444
428
  DB.drop_table?(:foo)
445
429
  end
446
430
 
447
- specify "should work on non-schema bound tables which need escaping" do
431
+ it "should work on non-schema bound tables which need escaping" do
448
432
  DB.quote_identifiers = true
449
433
  DB.create_table! :'foo bar' do
450
434
  text :name
451
435
  end
452
436
  DB.drop_table? :foo
453
- proc { DB.rename_table 'foo bar', 'foo' }.should_not raise_error
437
+ DB.rename_table 'foo bar', 'foo'
454
438
  end
455
439
 
456
- specify "should work on schema bound tables" do
440
+ it "should work on schema bound tables" do
457
441
  DB.execute(<<-SQL)
458
442
  IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'MY')
459
443
  EXECUTE sp_executesql N'create schema MY'
@@ -461,26 +445,26 @@ describe "MSSQL::Database#rename_table" do
461
445
  DB.create_table! :MY__foo do
462
446
  text :name
463
447
  end
464
- proc { DB.rename_table :MY__foo, :MY__bar }.should_not raise_error
465
- proc { DB.rename_table :MY__bar, :foo }.should_not raise_error
448
+ DB.rename_table :MY__foo, :MY__bar
449
+ DB.rename_table :MY__bar, :foo
466
450
  end
467
451
  end
468
452
 
469
453
  describe "MSSQL::Dataset#count" do
470
- specify "should work with a distinct query with an order clause" do
454
+ it "should work with a distinct query with an order clause" do
471
455
  DB.create_table!(:items){String :name; Integer :value}
472
456
  DB[:items].insert(:name => "name", :value => 1)
473
457
  DB[:items].insert(:name => "name", :value => 1)
474
- DB[:items].select(:name, :value).distinct.order(:name).count.should == 1
475
- DB[:items].select(:name, :value).group(:name, :value).order(:name).count.should == 1
458
+ DB[:items].select(:name, :value).distinct.order(:name).count.must_equal 1
459
+ DB[:items].select(:name, :value).group(:name, :value).order(:name).count.must_equal 1
476
460
  end
477
461
  end
478
462
 
479
463
  describe "MSSQL::Database#create_table" do
480
- specify "should support collate with various other column options" do
464
+ it "should support collate with various other column options" do
481
465
  DB.create_table!(:items){ String :name, :size => 128, :collate => :sql_latin1_general_cp1_ci_as, :default => 'foo', :null => false, :unique => true}
482
466
  DB[:items].insert
483
- DB[:items].select_map(:name).should == ["foo"]
467
+ DB[:items].select_map(:name).must_equal ["foo"]
484
468
  end
485
469
  end
486
470
 
@@ -493,21 +477,21 @@ describe "MSSQL::Database#mssql_unicode_strings = false" do
493
477
  DB.mssql_unicode_strings = true
494
478
  end
495
479
 
496
- specify "should work correctly" do
480
+ it "should work correctly" do
497
481
  DB.create_table!(:items){String :name}
498
- DB[:items].mssql_unicode_strings.should == false
482
+ DB[:items].mssql_unicode_strings.must_equal false
499
483
  DB[:items].insert(:name=>'foo')
500
- DB[:items].select_map(:name).should == ['foo']
484
+ DB[:items].select_map(:name).must_equal ['foo']
501
485
  end
502
486
 
503
- specify "should be overridable at the dataset level" do
487
+ it "should be overridable at the dataset level" do
504
488
  DB.create_table!(:items){String :name}
505
489
  ds = DB[:items]
506
- ds.mssql_unicode_strings.should == false
490
+ ds.mssql_unicode_strings.must_equal false
507
491
  ds.mssql_unicode_strings = true
508
- ds.mssql_unicode_strings.should == true
492
+ ds.mssql_unicode_strings.must_equal true
509
493
  ds.insert(:name=>'foo')
510
- ds.select_map(:name).should == ['foo']
494
+ ds.select_map(:name).must_equal ['foo']
511
495
  end
512
496
  end
513
497
 
@@ -526,11 +510,11 @@ describe "A MSSQL database adds index with include" do
526
510
  @db.drop_table? @table_name
527
511
  end
528
512
 
529
- cspecify "should be able add index with include" do
513
+ it "should be able add index with include" do
530
514
  @db.alter_table @table_name do
531
515
  add_index [:col1], :include => [:col2,:col3]
532
516
  end
533
- @db.indexes(@table_name).should have_key("#{@table_name}_col1_index".to_sym)
517
+ @db.indexes(@table_name).keys.must_include("#{@table_name}_col1_index".to_sym)
534
518
  end
535
519
  end
536
520
 
@@ -543,10 +527,10 @@ describe "MSSQL::Database#drop_column with a schema" do
543
527
  DB.run "drop schema test" rescue nil
544
528
  end
545
529
 
546
- specify "drops columns with a default value" do
530
+ it "drops columns with a default value" do
547
531
  DB.create_table!(:test__items){ Integer :id; String :name, :default => 'widget' }
548
532
  DB.drop_column(:test__items, :name)
549
- DB[:test__items].columns.should == [:id]
533
+ DB[:test__items].columns.must_equal [:id]
550
534
  end
551
535
  end
552
536
 
@@ -576,7 +560,7 @@ describe "Database#foreign_key_list" do
576
560
  DB.drop_table :items
577
561
  end
578
562
  it "should support typical foreign keys" do
579
- DB.foreign_key_list(:prices).should == [{:name => :fk_prices_items,
563
+ DB.foreign_key_list(:prices).must_equal [{:name => :fk_prices_items,
580
564
  :table => :items,
581
565
  :columns => [:item_id],
582
566
  :key => [:id],
@@ -584,7 +568,7 @@ describe "Database#foreign_key_list" do
584
568
  :on_delete => :no_action }]
585
569
  end
586
570
  it "should support a foreign key with multiple columns" do
587
- DB.foreign_key_list(:sales).should == [{:name => :fk_sales_prices,
571
+ DB.foreign_key_list(:sales).must_equal [{:name => :fk_sales_prices,
588
572
  :table => :prices,
589
573
  :columns => [:price_item_id, :price_valid_from],
590
574
  :key => [:item_id, :valid_from],
@@ -592,7 +576,7 @@ describe "Database#foreign_key_list" do
592
576
  :on_delete => :cascade }]
593
577
  end
594
578
 
595
- context "with multiple schemas" do
579
+ describe "with multiple schemas" do
596
580
  before(:all) do
597
581
  DB.execute_ddl "create schema vendor"
598
582
  DB.create_table! :vendor__vendors do
@@ -612,7 +596,7 @@ describe "Database#foreign_key_list" do
612
596
  DB.execute_ddl "drop schema vendor"
613
597
  end
614
598
  it "should support mixed schema bound tables" do
615
- DB.foreign_key_list(:vendor__mapping).sort_by{|h| h[:name].to_s}.should == [{:name => :fk_mapping_item, :table => :items, :columns => [:item_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }, {:name => :fk_mapping_vendor, :table => Sequel.qualify(:vendor, :vendors), :columns => [:vendor_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }]
599
+ DB.foreign_key_list(:vendor__mapping).sort_by{|h| h[:name].to_s}.must_equal [{:name => :fk_mapping_item, :table => :items, :columns => [:item_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }, {:name => :fk_mapping_vendor, :table => Sequel.qualify(:vendor, :vendors), :columns => [:vendor_id], :key => [:id], :on_update => :no_action, :on_delete => :no_action }]
616
600
  end
617
601
  end
618
602
  end
@@ -636,11 +620,11 @@ describe "MSSQL optimistic locking plugin" do
636
620
  o = c.create(:name=>'test')
637
621
  o2 = c.first
638
622
  ts = o.timestamp
639
- ts.should_not be_nil
623
+ ts.wont_equal nil
640
624
  o.name = 'test2'
641
625
  o.save
642
- o.timestamp.should_not == ts
643
- proc{o2.save}.should raise_error(Sequel::NoExistingObject)
626
+ o.timestamp.wont_equal ts
627
+ proc{o2.save}.must_raise(Sequel::NoExistingObject)
644
628
  end
645
629
  end unless DB.adapter_scheme == :odbc
646
630
 
@@ -659,24 +643,24 @@ describe "MSSQL Stored Procedure support" do
659
643
  describe "with unnamed parameters" do
660
644
  it "should return a hash of output variables" do
661
645
  r = @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, :output, :output]})
662
- r.should be_a_kind_of(Hash)
663
- r.values_at(:var2, :var3).should == [@now, '1']
646
+ r.must_be_kind_of(Hash)
647
+ r.values_at(:var2, :var3).must_equal [@now, '1']
664
648
  end
665
649
 
666
650
  it "should support typed output variables" do
667
- @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, :output, [:output, 'int']]})[:var3].should == 1
651
+ @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, :output, [:output, 'int']]})[:var3].must_equal 1
668
652
  end
669
653
 
670
654
  it "should support named output variables" do
671
- @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, [:output, nil, 'output'], :output]})[:output].should == @now
655
+ @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, [:output, nil, 'output'], :output]})[:output].must_equal @now
672
656
  end
673
657
 
674
658
  it "should return the number of Affected Rows" do
675
- @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, :output, :output]})[:numrows].should == 1
659
+ @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, :output, :output]})[:numrows].must_equal 1
676
660
  end
677
661
 
678
662
  it "should return the Result Code" do
679
- @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, :output, :output]})[:result].should == 1
663
+ @db.call_mssql_sproc(:SequelTest, {:args => [@now, 1, :output, :output]})[:result].must_equal 1
680
664
  end
681
665
  end
682
666
 
@@ -688,8 +672,8 @@ describe "MSSQL Stored Procedure support" do
688
672
  'Output' => [:output, nil, 'output'],
689
673
  'IntegerOutput' => [:output, nil, 'integer_output']
690
674
  })
691
- r.should be_a_kind_of(Hash)
692
- r.values_at(:output, :integer_output).should == [@now, '1']
675
+ r.must_be_kind_of(Hash)
676
+ r.values_at(:output, :integer_output).must_equal [@now, '1']
693
677
  end
694
678
 
695
679
  it "should support typed output variables" do
@@ -698,7 +682,7 @@ describe "MSSQL Stored Procedure support" do
698
682
  'IntegerInput' => 1,
699
683
  'Output' => [:output, nil, 'output'],
700
684
  'IntegerOutput' => [:output, 'int', 'integer_output']
701
- })[:integer_output].should == 1
685
+ })[:integer_output].must_equal 1
702
686
  end
703
687
 
704
688
  it "should return the number of Affected Rows" do
@@ -707,7 +691,7 @@ describe "MSSQL Stored Procedure support" do
707
691
  'IntegerInput' => 1,
708
692
  'Output' => [:output, nil, 'output'],
709
693
  'IntegerOutput' => [:output, nil, 'integer_output']
710
- })[:numrows].should == 1
694
+ })[:numrows].must_equal 1
711
695
  end
712
696
 
713
697
  it "should return the Result Code" do
@@ -716,7 +700,7 @@ describe "MSSQL Stored Procedure support" do
716
700
  'IntegerInput' => 1,
717
701
  'Output' => [:output, nil, 'output'],
718
702
  'IntegerOutput' => [:output, nil, 'integer_output']
719
- })[:result].should == 1
703
+ })[:result].must_equal 1
720
704
  end
721
705
  end
722
706
  end unless DB.adapter_scheme == :odbc