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
@@ -8,78 +8,78 @@ describe "null_dataset extension" do
8
8
  @pr = proc{|*a| @i += 1}
9
9
  end
10
10
  after do
11
- @db.sqls.should == [] unless @skip_check
11
+ @db.sqls.must_equal [] unless @skip_check
12
12
  end
13
13
 
14
14
  it "should make each be a noop" do
15
- @ds.each(&@pr).should equal(@ds)
16
- @i.should == 0
15
+ @ds.each(&@pr).must_be_same_as(@ds)
16
+ @i.must_equal 0
17
17
  end
18
18
 
19
19
  it "should make fetch_rows be a noop" do
20
- @ds.fetch_rows("SELECT 1", &@pr).should == nil
21
- @i.should == 0
20
+ @ds.fetch_rows("SELECT 1", &@pr).must_equal nil
21
+ @i.must_equal 0
22
22
  end
23
23
 
24
24
  it "should make insert be a noop" do
25
- @ds.insert(1).should == nil
25
+ @ds.insert(1).must_equal nil
26
26
  end
27
27
 
28
28
  it "should make update be a noop" do
29
- @ds.update(:a=>1).should == 0
29
+ @ds.update(:a=>1).must_equal 0
30
30
  end
31
31
 
32
32
  it "should make delete be a noop" do
33
- @ds.delete.should == 0
33
+ @ds.delete.must_equal 0
34
34
  end
35
35
 
36
36
  it "should make truncate be a noop" do
37
- @ds.truncate.should == nil
37
+ @ds.truncate.must_equal nil
38
38
  end
39
39
 
40
40
  it "should make execute_* be a noop" do
41
- @ds.send(:execute_ddl,'FOO').should == nil
42
- @ds.send(:execute_insert,'FOO').should == nil
43
- @ds.send(:execute_dui,'FOO').should == nil
44
- @ds.send(:execute,'FOO').should == nil
41
+ @ds.send(:execute_ddl,'FOO').must_equal nil
42
+ @ds.send(:execute_insert,'FOO').must_equal nil
43
+ @ds.send(:execute_dui,'FOO').must_equal nil
44
+ @ds.send(:execute,'FOO').must_equal nil
45
45
  end
46
46
 
47
47
  it "should have working columns" do
48
48
  @skip_check = true
49
- @ds.columns.should == [:id]
50
- @db.sqls.should == ['SELECT * FROM table LIMIT 1']
49
+ @ds.columns.must_equal [:id]
50
+ @db.sqls.must_equal ['SELECT * FROM table LIMIT 1']
51
51
  end
52
52
 
53
53
  it "should have count return 0" do
54
- @ds.count.should == 0
54
+ @ds.count.must_equal 0
55
55
  end
56
56
 
57
57
  it "should have empty return true" do
58
- @ds.empty?.should == true
58
+ @ds.empty?.must_equal true
59
59
  end
60
60
 
61
61
  it "should make import a noop" do
62
- @ds.import([:id], [[1], [2], [3]]).should == nil
62
+ @ds.import([:id], [[1], [2], [3]]).must_equal nil
63
63
  end
64
64
 
65
65
  it "should have nullify method returned modified receiver" do
66
66
  @skip_check = true
67
67
  ds = @db[:table]
68
- ds.nullify.should_not equal(ds)
68
+ ds.nullify.wont_be_same_as(ds)
69
69
  ds.each(&@pr)
70
- @db.sqls.should == ['SELECT * FROM table']
71
- @i.should == 1
70
+ @db.sqls.must_equal ['SELECT * FROM table']
71
+ @i.must_equal 1
72
72
  end
73
73
 
74
74
  it "should have nullify! method modify receiver" do
75
75
  ds = @db[:table]
76
- ds.nullify!.should equal(ds)
76
+ ds.nullify!.must_be_same_as(ds)
77
77
  ds.each(&@pr)
78
- @i.should == 0
78
+ @i.must_equal 0
79
79
  end
80
80
 
81
81
  it "should work with method chaining" do
82
82
  @ds.where(:a=>1).select(:b).each(&@pr)
83
- @i.should == 0
83
+ @i.must_equal 0
84
84
  end
85
85
  end
@@ -47,55 +47,55 @@ describe "optimistic_locking plugin" do
47
47
  @c.plugin :optimistic_locking
48
48
  end
49
49
 
50
- specify "should raise an error when updating a stale record" do
50
+ it "should raise an error when updating a stale record" do
51
51
  p1 = @c[1]
52
52
  p2 = @c[1]
53
53
  p1.update(:name=>'Jim')
54
- proc{p2.update(:name=>'Bob')}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
54
+ proc{p2.update(:name=>'Bob')}.must_raise(Sequel::Plugins::OptimisticLocking::Error)
55
55
  end
56
56
 
57
- specify "should raise an error when destroying a stale record" do
57
+ it "should raise an error when destroying a stale record" do
58
58
  p1 = @c[1]
59
59
  p2 = @c[1]
60
60
  p1.update(:name=>'Jim')
61
- proc{p2.destroy}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
61
+ proc{p2.destroy}.must_raise(Sequel::Plugins::OptimisticLocking::Error)
62
62
  end
63
63
 
64
- specify "should not raise an error when updating the same record twice" do
64
+ it "should not raise an error when updating the same record twice" do
65
65
  p1 = @c[1]
66
66
  p1.update(:name=>'Jim')
67
- proc{p1.update(:name=>'Bob')}.should_not raise_error
67
+ p1.update(:name=>'Bob')
68
68
  end
69
69
 
70
- specify "should allow changing the lock column via model.lock_column=" do
70
+ it "should allow changing the lock column via model.lock_column=" do
71
71
  @lv.replace('lv')
72
72
  @c.columns :id, :name, :lv
73
73
  @c.lock_column = :lv
74
74
  p1 = @c[1]
75
75
  p2 = @c[1]
76
76
  p1.update(:name=>'Jim')
77
- proc{p2.update(:name=>'Bob')}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
77
+ proc{p2.update(:name=>'Bob')}.must_raise(Sequel::Plugins::OptimisticLocking::Error)
78
78
  end
79
79
 
80
- specify "should allow changing the lock column via plugin option" do
80
+ it "should allow changing the lock column via plugin option" do
81
81
  @lv.replace('lv')
82
82
  @c.columns :id, :name, :lv
83
83
  @c.plugin :optimistic_locking, :lock_column=>:lv
84
84
  p1 = @c[1]
85
85
  p2 = @c[1]
86
86
  p1.update(:name=>'Jim')
87
- proc{p2.destroy}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
87
+ proc{p2.destroy}.must_raise(Sequel::Plugins::OptimisticLocking::Error)
88
88
  end
89
89
 
90
- specify "should work when subclassing" do
90
+ it "should work when subclassing" do
91
91
  c = Class.new(@c)
92
92
  p1 = c[1]
93
93
  p2 = c[1]
94
94
  p1.update(:name=>'Jim')
95
- proc{p2.update(:name=>'Bob')}.should raise_error(Sequel::Plugins::OptimisticLocking::Error)
95
+ proc{p2.update(:name=>'Bob')}.must_raise(Sequel::Plugins::OptimisticLocking::Error)
96
96
  end
97
97
 
98
- specify "should work correctly if attempting to refresh and save again after a failed save" do
98
+ it "should work correctly if attempting to refresh and save again after a failed save" do
99
99
  p1 = @c[1]
100
100
  p2 = @c[1]
101
101
  p1.update(:name=>'Jim')
@@ -104,25 +104,25 @@ describe "optimistic_locking plugin" do
104
104
  rescue Sequel::Plugins::OptimisticLocking::Error
105
105
  p2.refresh
106
106
  @c.db.sqls
107
- proc{p2.update(:name=>'Bob')}.should_not raise_error
107
+ p2.update(:name=>'Bob')
108
108
  end
109
- @c.db.sqls.first.should =~ /UPDATE people SET (name = 'Bob', lock_version = 4|lock_version = 4, name = 'Bob') WHERE \(\(id = 1\) AND \(lock_version = 3\)\)/
109
+ @c.db.sqls.first.must_match(/UPDATE people SET (name = 'Bob', lock_version = 4|lock_version = 4, name = 'Bob') WHERE \(\(id = 1\) AND \(lock_version = 3\)\)/)
110
110
  end
111
111
 
112
- specify "should increment the lock column when #modified! even if no columns are changed" do
112
+ it "should increment the lock column when #modified! even if no columns are changed" do
113
113
  p1 = @c[1]
114
114
  p1.modified!
115
115
  lv = p1.lock_version
116
116
  p1.save_changes
117
- p1.lock_version.should == lv + 1
117
+ p1.lock_version.must_equal lv + 1
118
118
  end
119
119
 
120
- specify "should not increment the lock column when the update fails" do
121
- @c.instance_dataset.meta_def(:update) { raise Exception }
120
+ it "should not increment the lock column when the update fails" do
121
+ @c.instance_dataset.meta_def(:update) {|_| raise }
122
122
  p1 = @c[1]
123
123
  p1.modified!
124
124
  lv = p1.lock_version
125
- proc{p1.save_changes}.should raise_error(Exception)
126
- p1.lock_version.should == lv
125
+ proc{p1.save_changes}.must_raise(RuntimeError)
126
+ p1.lock_version.must_equal lv
127
127
  end
128
128
  end
@@ -8,80 +8,80 @@ describe "A paginated dataset" do
8
8
  @paginated = @d.paginate(1, 20)
9
9
  end
10
10
 
11
- specify "should raise an error if the dataset already has a limit" do
12
- proc{@d.limit(10).paginate(1,10)}.should raise_error(Sequel::Error)
13
- proc{@paginated.paginate(2,20)}.should raise_error(Sequel::Error)
14
- proc{@d.limit(10).each_page(10){|ds|}}.should raise_error(Sequel::Error)
15
- proc{@d.limit(10).each_page(10)}.should raise_error(Sequel::Error)
11
+ it "should raise an error if the dataset already has a limit" do
12
+ proc{@d.limit(10).paginate(1,10)}.must_raise(Sequel::Error)
13
+ proc{@paginated.paginate(2,20)}.must_raise(Sequel::Error)
14
+ proc{@d.limit(10).each_page(10){|ds|}}.must_raise(Sequel::Error)
15
+ proc{@d.limit(10).each_page(10)}.must_raise(Sequel::Error)
16
16
  end
17
17
 
18
- specify "should set the limit and offset options correctly" do
19
- @paginated.opts[:limit].should == 20
20
- @paginated.opts[:offset].should == 0
18
+ it "should set the limit and offset options correctly" do
19
+ @paginated.opts[:limit].must_equal 20
20
+ @paginated.opts[:offset].must_equal 0
21
21
  end
22
22
 
23
- specify "should set the page count correctly" do
24
- @paginated.page_count.should == 8
25
- @d.paginate(1, 50).page_count.should == 4
23
+ it "should set the page count correctly" do
24
+ @paginated.page_count.must_equal 8
25
+ @d.paginate(1, 50).page_count.must_equal 4
26
26
 
27
27
  @d.meta_def(:count) {0}
28
- @d.paginate(1, 50).page_count.should == 1
28
+ @d.paginate(1, 50).page_count.must_equal 1
29
29
  end
30
30
 
31
- specify "should set the current page number correctly" do
32
- @paginated.current_page.should == 1
33
- @d.paginate(3, 50).current_page.should == 3
31
+ it "should set the current page number correctly" do
32
+ @paginated.current_page.must_equal 1
33
+ @d.paginate(3, 50).current_page.must_equal 3
34
34
  end
35
35
 
36
- specify "should return the next page number or nil if we're on the last" do
37
- @paginated.next_page.should == 2
38
- @d.paginate(4, 50).next_page.should be_nil
36
+ it "should return the next page number or nil if we're on the last" do
37
+ @paginated.next_page.must_equal 2
38
+ @d.paginate(4, 50).next_page.must_equal nil
39
39
  end
40
40
 
41
- specify "should return the previous page number or nil if we're on the first" do
42
- @paginated.prev_page.should be_nil
43
- @d.paginate(4, 50).prev_page.should == 3
41
+ it "should return the previous page number or nil if we're on the first" do
42
+ @paginated.prev_page.must_equal nil
43
+ @d.paginate(4, 50).prev_page.must_equal 3
44
44
  end
45
45
 
46
- specify "should return the page range" do
47
- @paginated.page_range.should == (1..8)
48
- @d.paginate(4, 50).page_range.should == (1..4)
46
+ it "should return the page range" do
47
+ @paginated.page_range.must_equal(1..8)
48
+ @d.paginate(4, 50).page_range.must_equal(1..4)
49
49
  end
50
50
 
51
- specify "should return the record range for the current page" do
52
- @paginated.current_page_record_range.should == (1..20)
53
- @d.paginate(4, 50).current_page_record_range.should == (151..153)
54
- @d.paginate(5, 50).current_page_record_range.should == (0..0)
51
+ it "should return the record range for the current page" do
52
+ @paginated.current_page_record_range.must_equal(1..20)
53
+ @d.paginate(4, 50).current_page_record_range.must_equal(151..153)
54
+ @d.paginate(5, 50).current_page_record_range.must_equal(0..0)
55
55
  end
56
56
 
57
- specify "should return the record count for the current page" do
58
- @paginated.current_page_record_count.should == 20
59
- @d.paginate(3, 50).current_page_record_count.should == 50
60
- @d.paginate(4, 50).current_page_record_count.should == 3
61
- @d.paginate(5, 50).current_page_record_count.should == 0
57
+ it "should return the record count for the current page" do
58
+ @paginated.current_page_record_count.must_equal 20
59
+ @d.paginate(3, 50).current_page_record_count.must_equal 50
60
+ @d.paginate(4, 50).current_page_record_count.must_equal 3
61
+ @d.paginate(5, 50).current_page_record_count.must_equal 0
62
62
  end
63
63
 
64
- specify "should know if current page is last page" do
65
- @paginated.last_page?.should == false
66
- @d.paginate(2, 20).last_page?.should == false
67
- @d.paginate(5, 30).last_page?.should == false
68
- @d.paginate(6, 30).last_page?.should == true
64
+ it "should know if current page is last page" do
65
+ @paginated.last_page?.must_equal false
66
+ @d.paginate(2, 20).last_page?.must_equal false
67
+ @d.paginate(5, 30).last_page?.must_equal false
68
+ @d.paginate(6, 30).last_page?.must_equal true
69
69
 
70
70
  @d.meta_def(:count) {0}
71
- @d.paginate(1, 30).last_page?.should == true
72
- @d.paginate(2, 30).last_page?.should == false
71
+ @d.paginate(1, 30).last_page?.must_equal true
72
+ @d.paginate(2, 30).last_page?.must_equal false
73
73
  end
74
74
 
75
- specify "should know if current page is first page" do
76
- @paginated.first_page?.should == true
77
- @d.paginate(1, 20).first_page?.should == true
78
- @d.paginate(2, 20).first_page?.should == false
75
+ it "should know if current page is first page" do
76
+ @paginated.first_page?.must_equal true
77
+ @d.paginate(1, 20).first_page?.must_equal true
78
+ @d.paginate(2, 20).first_page?.must_equal false
79
79
  end
80
80
 
81
- specify "should work with fixed sql" do
81
+ it "should work with fixed sql" do
82
82
  ds = @d.clone(:sql => 'select * from blah')
83
83
  ds.meta_def(:count) {150}
84
- ds.paginate(2, 50).sql.should == 'SELECT * FROM (select * from blah) AS t1 LIMIT 50 OFFSET 50'
84
+ ds.paginate(2, 50).sql.must_equal 'SELECT * FROM (select * from blah) AS t1 LIMIT 50 OFFSET 50'
85
85
  end
86
86
  end
87
87
 
@@ -91,14 +91,14 @@ describe "Dataset#each_page" do
91
91
  @d.meta_def(:count) {153}
92
92
  end
93
93
 
94
- specify "should raise an error if the dataset already has a limit" do
95
- proc{@d.limit(10).each_page(10){}}.should raise_error(Sequel::Error)
94
+ it "should raise an error if the dataset already has a limit" do
95
+ proc{@d.limit(10).each_page(10){}}.must_raise(Sequel::Error)
96
96
  end
97
97
 
98
- specify "should iterate over each page in the resultset as a paginated dataset" do
98
+ it "should iterate over each page in the resultset as a paginated dataset" do
99
99
  a = []
100
100
  @d.each_page(50) {|p| a << p}
101
- a.map {|p| p.sql}.should == [
101
+ a.map {|p| p.sql}.must_equal [
102
102
  'SELECT * FROM items LIMIT 50 OFFSET 0',
103
103
  'SELECT * FROM items LIMIT 50 OFFSET 50',
104
104
  'SELECT * FROM items LIMIT 50 OFFSET 100',
@@ -106,9 +106,9 @@ describe "Dataset#each_page" do
106
106
  ]
107
107
  end
108
108
 
109
- specify "should return an enumerator if no block is given" do
109
+ it "should return an enumerator if no block is given" do
110
110
  enum = @d.each_page(50)
111
- enum.map {|p| p.sql}.should == [
111
+ enum.map {|p| p.sql}.must_equal [
112
112
  'SELECT * FROM items LIMIT 50 OFFSET 0',
113
113
  'SELECT * FROM items LIMIT 50 OFFSET 50',
114
114
  'SELECT * FROM items LIMIT 50 OFFSET 100',
@@ -41,100 +41,100 @@ describe Sequel::Model, "pg_array_associations" do
41
41
  @c2.many_to_pg_array :artists, :clone=>:artists, :eager_loader=>pr
42
42
  @c1.eager(:tags).all
43
43
  @c2.eager(:artists).all
44
- khs.should == [[{}, nil], [{:id=>{2=>[Tag.load(:id=>2)]}}, {2=>[Tag.load(:id=>2)]}]]
44
+ khs.must_equal [[{}, nil], [{:id=>{2=>[Tag.load(:id=>2)]}}, {2=>[Tag.load(:id=>2)]}]]
45
45
  end
46
46
 
47
47
  it "should not issue queries if the object cannot have associated objects" do
48
- @n1.tags.should == []
49
- @c1.load(:tag_ids=>[]).tags.should == []
50
- @n2.artists.should == []
51
- @db.sqls.should == []
48
+ @n1.tags.must_equal []
49
+ @c1.load(:tag_ids=>[]).tags.must_equal []
50
+ @n2.artists.must_equal []
51
+ @db.sqls.must_equal []
52
52
  end
53
53
 
54
54
  it "should use correct SQL when loading associations lazily" do
55
- @o1.tags.should == [@o2]
56
- @o2.artists.should == [@o1]
57
- @db.sqls.should == ["SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))", "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
55
+ @o1.tags.must_equal [@o2]
56
+ @o2.artists.must_equal [@o1]
57
+ @db.sqls.must_equal ["SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))", "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
58
58
  end
59
59
 
60
60
  it "should accept :primary_key option for primary keys to use in current and associated table" do
61
61
  @c1.pg_array_to_many :tags, :clone=>:tags, :primary_key=>Sequel./(:id, 3)
62
62
  @c2.many_to_pg_array :artists, :clone=>:artists, :primary_key=>:id3
63
- @o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE ((tags.id / 3) IN (1, 2, 3))"
64
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[6]::integer[])"
63
+ @o1.tags_dataset.sql.must_equal "SELECT * FROM tags WHERE ((tags.id / 3) IN (1, 2, 3))"
64
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[6]::integer[])"
65
65
  end
66
66
 
67
67
  it "should allowing filtering by associations" do
68
- @c1.filter(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"
69
- @c2.filter(:artists=>@o1).sql.should == "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))"
68
+ @c1.filter(:tags=>@o2).sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"
69
+ @c2.filter(:artists=>@o1).sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))"
70
70
  end
71
71
 
72
72
  it "should allowing filtering by associations with :conditions" do
73
- @c1.filter(:a_tags=>@o2).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id = 2)))), 'f')"
74
- @c2.filter(:a_artists=>@o1).sql.should == "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id = 1))))"
73
+ @c1.filter(:a_tags=>@o2).sql.must_equal "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id = 2)))), 'f')"
74
+ @c2.filter(:a_artists=>@o1).sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id = 1))))"
75
75
  end
76
76
 
77
77
  it "should allowing excluding by associations" do
78
- @c1.exclude(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (NOT (artists.tag_ids @> ARRAY[2]::integer[]) OR (artists.tag_ids IS NULL))"
79
- @c2.exclude(:artists=>@o1).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (1, 2, 3)) OR (tags.id IS NULL))"
78
+ @c1.exclude(:tags=>@o2).sql.must_equal "SELECT * FROM artists WHERE (NOT (artists.tag_ids @> ARRAY[2]::integer[]) OR (artists.tag_ids IS NULL))"
79
+ @c2.exclude(:artists=>@o1).sql.must_equal "SELECT * FROM tags WHERE ((tags.id NOT IN (1, 2, 3)) OR (tags.id IS NULL))"
80
80
  end
81
81
 
82
82
  it "should allowing excluding by associations with :conditions" do
83
- @c1.exclude(:a_tags=>@o2).sql.should == "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id = 2)))), 'f') OR (artists.tag_ids IS NULL))"
84
- @c2.exclude(:a_artists=>@o1).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id = 1)))) OR (tags.id IS NULL))"
83
+ @c1.exclude(:a_tags=>@o2).sql.must_equal "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id = 2)))), 'f') OR (artists.tag_ids IS NULL))"
84
+ @c2.exclude(:a_artists=>@o1).sql.must_equal "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id = 1)))) OR (tags.id IS NULL))"
85
85
  end
86
86
 
87
87
  it "should allowing filtering by multiple associations" do
88
- @c1.filter(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[1,2]::integer[])"
89
- @c2.filter(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE (tags.id IN (3, 4, 5))"
88
+ @c1.filter(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[1,2]::integer[])"
89
+ @c2.filter(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:tag_ids=>Sequel.pg_array([4, 5]))]).sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (3, 4, 5))"
90
90
  end
91
91
 
92
92
  it "should allowing filtering by multiple associations with :conditions" do
93
- @c1.filter(:a_tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (1, 2))))), 'f')"
94
- @c2.filter(:a_artists=>[@c1.load(:id=>7, :tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:id=>8, :tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (7, 8)))))"
93
+ @c1.filter(:a_tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.must_equal "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (1, 2))))), 'f')"
94
+ @c2.filter(:a_artists=>[@c1.load(:id=>7, :tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:id=>8, :tag_ids=>Sequel.pg_array([4, 5]))]).sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (7, 8)))))"
95
95
  end
96
96
 
97
97
  it "should allowing excluding by multiple associations" do
98
- @c1.exclude(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (NOT (artists.tag_ids && ARRAY[1,2]::integer[]) OR (artists.tag_ids IS NULL))"
99
- @c2.exclude(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (3, 4, 5)) OR (tags.id IS NULL))"
98
+ @c1.exclude(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.must_equal "SELECT * FROM artists WHERE (NOT (artists.tag_ids && ARRAY[1,2]::integer[]) OR (artists.tag_ids IS NULL))"
99
+ @c2.exclude(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:tag_ids=>Sequel.pg_array([4, 5]))]).sql.must_equal "SELECT * FROM tags WHERE ((tags.id NOT IN (3, 4, 5)) OR (tags.id IS NULL))"
100
100
  end
101
101
 
102
102
  it "should allowing excluding by multiple associations with :conditions" do
103
- @c1.exclude(:a_tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (1, 2))))), 'f') OR (artists.tag_ids IS NULL))"
104
- @c2.exclude(:a_artists=>[@c1.load(:id=>7, :tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:id=>8, :tag_ids=>Sequel.pg_array([4, 5]))]).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (7, 8))))) OR (tags.id IS NULL))"
103
+ @c1.exclude(:a_tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.must_equal "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (1, 2))))), 'f') OR (artists.tag_ids IS NULL))"
104
+ @c2.exclude(:a_artists=>[@c1.load(:id=>7, :tag_ids=>Sequel.pg_array([3, 4])), @c1.load(:id=>8, :tag_ids=>Sequel.pg_array([4, 5]))]).sql.must_equal "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (7, 8))))) OR (tags.id IS NULL))"
105
105
  end
106
106
 
107
107
  it "should allowing filtering/excluding associations with NULL or empty values" do
108
- @c1.filter(:tags=>@c2.new).sql.should == 'SELECT * FROM artists WHERE \'f\''
109
- @c1.exclude(:tags=>@c2.new).sql.should == 'SELECT * FROM artists WHERE \'t\''
110
- @c2.filter(:artists=>@c1.new).sql.should == 'SELECT * FROM tags WHERE \'f\''
111
- @c2.exclude(:artists=>@c1.new).sql.should == 'SELECT * FROM tags WHERE \'t\''
108
+ @c1.filter(:tags=>@c2.new).sql.must_equal 'SELECT * FROM artists WHERE \'f\''
109
+ @c1.exclude(:tags=>@c2.new).sql.must_equal 'SELECT * FROM artists WHERE \'t\''
110
+ @c2.filter(:artists=>@c1.new).sql.must_equal 'SELECT * FROM tags WHERE \'f\''
111
+ @c2.exclude(:artists=>@c1.new).sql.must_equal 'SELECT * FROM tags WHERE \'t\''
112
112
 
113
- @c2.filter(:artists=>@c1.load(:tag_ids=>[])).sql.should == 'SELECT * FROM tags WHERE \'f\''
114
- @c2.exclude(:artists=>@c1.load(:tag_ids=>[])).sql.should == 'SELECT * FROM tags WHERE \'t\''
113
+ @c2.filter(:artists=>@c1.load(:tag_ids=>[])).sql.must_equal 'SELECT * FROM tags WHERE \'f\''
114
+ @c2.exclude(:artists=>@c1.load(:tag_ids=>[])).sql.must_equal 'SELECT * FROM tags WHERE \'t\''
115
115
 
116
- @c1.filter(:tags=>[@c2.new, @c2.load(:id=>2)]).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"
117
- @c2.filter(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.new]).sql.should == "SELECT * FROM tags WHERE (tags.id IN (3, 4))"
116
+ @c1.filter(:tags=>[@c2.new, @c2.load(:id=>2)]).sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"
117
+ @c2.filter(:artists=>[@c1.load(:tag_ids=>Sequel.pg_array([3, 4])), @c1.new]).sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (3, 4))"
118
118
  end
119
119
 
120
120
  it "should allowing filtering by association datasets" do
121
- @c1.filter(:tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE (id = 1))), 'f')"
122
- @c2.filter(:artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE (id = 1)))"
121
+ @c1.filter(:tags=>@c2.where(:id=>1)).sql.must_equal "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE (id = 1))), 'f')"
122
+ @c2.filter(:artists=>@c1.where(:id=>1)).sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE (id = 1)))"
123
123
  end
124
124
 
125
125
  it "should allowing filtering by association datasets with :conditions" do
126
- @c1.filter(:a_tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (id = 1)))))), 'f')"
127
- @c2.filter(:a_artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (id = 1))))))"
126
+ @c1.filter(:a_tags=>@c2.where(:id=>1)).sql.must_equal "SELECT * FROM artists WHERE coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (id = 1)))))), 'f')"
127
+ @c2.filter(:a_artists=>@c1.where(:id=>1)).sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (id = 1))))))"
128
128
  end
129
129
 
130
130
  it "should allowing excluding by association datasets" do
131
- @c1.exclude(:tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE (id = 1))), 'f') OR (artists.tag_ids IS NULL))"
132
- @c2.exclude(:artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE (id = 1))) OR (tags.id IS NULL))"
131
+ @c1.exclude(:tags=>@c2.where(:id=>1)).sql.must_equal "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE (id = 1))), 'f') OR (artists.tag_ids IS NULL))"
132
+ @c2.exclude(:artists=>@c1.where(:id=>1)).sql.must_equal "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE (id = 1))) OR (tags.id IS NULL))"
133
133
  end
134
134
 
135
135
  it "should allowing excluding by association datasets with :conditions" do
136
- @c1.exclude(:a_tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (id = 1)))))), 'f') OR (artists.tag_ids IS NULL))"
137
- @c2.exclude(:a_artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (id = 1)))))) OR (tags.id IS NULL))"
136
+ @c1.exclude(:a_tags=>@c2.where(:id=>1)).sql.must_equal "SELECT * FROM artists WHERE (NOT coalesce((artists.tag_ids && (SELECT array_agg(tags.id) FROM tags WHERE ((name = 'A') AND (tags.id IS NOT NULL) AND (tags.id IN (SELECT tags.id FROM tags WHERE (id = 1)))))), 'f') OR (artists.tag_ids IS NULL))"
137
+ @c2.exclude(:a_artists=>@c1.where(:id=>1)).sql.must_equal "SELECT * FROM tags WHERE ((tags.id NOT IN (SELECT unnest(artists.tag_ids) FROM artists WHERE ((name = 'A') AND (artists.tag_ids IS NOT NULL) AND (artists.id IN (SELECT artists.id FROM artists WHERE (id = 1)))))) OR (tags.id IS NULL))"
138
138
  end
139
139
 
140
140
  it "filter by associations should respect key options" do
@@ -142,82 +142,82 @@ describe Sequel::Model, "pg_array_associations" do
142
142
  @c1.pg_array_to_many :tags, :clone=>:tags, :primary_key=>Sequel.*(:id, 3), :primary_key_method=>:id3, :key=>:tag3_ids, :key_column=>Sequel.pg_array(:tag_ids)[1..2]
143
143
  @c2.many_to_pg_array :artists, :clone=>:artists, :primary_key=>Sequel.*(:id, 3), :primary_key_method=>:id3, :key=>:tag3_ids, :key_column=>Sequel.pg_array(:tag_ids)[1..2]
144
144
 
145
- @c1.filter(:tags=>@o2).sql.should == "SELECT * FROM artists WHERE (artists.tag_ids[1:2] @> ARRAY[6]::integer[])"
146
- @c2.filter(:artists=>@o1).sql.should == "SELECT * FROM tags WHERE ((tags.id * 3) IN (3, 6, 9))"
147
- @c1.filter(:tags=>@c2.where(:id=>1)).sql.should == "SELECT * FROM artists WHERE coalesce((artists.tag_ids[1:2] && (SELECT array_agg((tags.id * 3)) FROM tags WHERE (id = 1))), 'f')"
148
- @c2.filter(:artists=>@c1.where(:id=>1)).sql.should == "SELECT * FROM tags WHERE ((tags.id * 3) IN (SELECT unnest(artists.tag_ids[1:2]) FROM artists WHERE (id = 1)))"
145
+ @c1.filter(:tags=>@o2).sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids[1:2] @> ARRAY[6]::integer[])"
146
+ @c2.filter(:artists=>@o1).sql.must_equal "SELECT * FROM tags WHERE ((tags.id * 3) IN (3, 6, 9))"
147
+ @c1.filter(:tags=>@c2.where(:id=>1)).sql.must_equal "SELECT * FROM artists WHERE coalesce((artists.tag_ids[1:2] && (SELECT array_agg((tags.id * 3)) FROM tags WHERE (id = 1))), 'f')"
148
+ @c2.filter(:artists=>@c1.where(:id=>1)).sql.must_equal "SELECT * FROM tags WHERE ((tags.id * 3) IN (SELECT unnest(artists.tag_ids[1:2]) FROM artists WHERE (id = 1)))"
149
149
  end
150
150
 
151
151
  it "should raise an error if associated model does not have a primary key, and :primary_key is not specified" do
152
152
  @c1.no_primary_key
153
153
  @c2.no_primary_key
154
154
  @c1.pg_array_to_many :tags, :clone=>:tags
155
- proc{@o1.tags}.should raise_error(Sequel::Error)
156
- proc{@c2.many_to_pg_array :artists, :clone=>:artists}.should raise_error(Sequel::Error)
157
- @db.sqls.should == []
155
+ proc{@o1.tags}.must_raise(Sequel::Error)
156
+ proc{@c2.many_to_pg_array :artists, :clone=>:artists}.must_raise(Sequel::Error)
157
+ @db.sqls.must_equal []
158
158
  end
159
159
 
160
160
  it "should support a :key option" do
161
161
  @c1.pg_array_to_many :tags, :clone=>:tags, :key=>:tag2_ids
162
162
  @c2.many_to_pg_array :artists, :clone=>:artists, :key=>:tag2_ids
163
163
  @c1.class_eval{def tag2_ids; tag_ids.map{|x| x * 2} end}
164
- @o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (tags.id IN (2, 4, 6))"
165
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag2_ids @> ARRAY[2]::integer[])"
164
+ @o1.tags_dataset.sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (2, 4, 6))"
165
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE (artists.tag2_ids @> ARRAY[2]::integer[])"
166
166
  end
167
167
 
168
168
  it "should support a :key_column option" do
169
169
  @c2.many_to_pg_array :artists, :clone=>:artists, :key_column=>Sequel.pg_array(:tag_ids)[1..2], :key=>:tag2_ids
170
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids[1:2] @> ARRAY[2]::integer[])"
170
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids[1:2] @> ARRAY[2]::integer[])"
171
171
  end
172
172
 
173
173
  it "should support a :primary_key option" do
174
174
  @c1.pg_array_to_many :tags, :clone=>:tags, :primary_key=>:id2
175
175
  @c2.many_to_pg_array :artists, :clone=>:artists, :primary_key=>:id2
176
- @o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (tags.id2 IN (1, 2, 3))"
176
+ @o1.tags_dataset.sql.must_equal "SELECT * FROM tags WHERE (tags.id2 IN (1, 2, 3))"
177
177
  @c2.class_eval{def id2; id*2 end}
178
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[4]::integer[])"
178
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[4]::integer[])"
179
179
  end
180
180
 
181
181
  it "should support a :conditions option" do
182
182
  @c1.pg_array_to_many :tags, :clone=>:tags, :conditions=>{:a=>1}
183
183
  @c2.many_to_pg_array :artists, :clone=>:artists, :conditions=>{:a=>1}
184
- @o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE ((a = 1) AND (tags.id IN (1, 2, 3)))"
185
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE ((a = 1) AND (artists.tag_ids @> ARRAY[2]::integer[]))"
184
+ @o1.tags_dataset.sql.must_equal "SELECT * FROM tags WHERE ((a = 1) AND (tags.id IN (1, 2, 3)))"
185
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE ((a = 1) AND (artists.tag_ids @> ARRAY[2]::integer[]))"
186
186
  end
187
187
 
188
188
  it "should support an :order option" do
189
189
  @c1.pg_array_to_many :tags, :clone=>:tags, :order=>[:a, :b]
190
190
  @c2.many_to_pg_array :artists, :clone=>:artists, :order=>[:a, :b]
191
- @o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3)) ORDER BY a, b"
192
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[]) ORDER BY a, b"
191
+ @o1.tags_dataset.sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3)) ORDER BY a, b"
192
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[]) ORDER BY a, b"
193
193
  end
194
194
 
195
195
  it "should support a select option" do
196
196
  @c1.pg_array_to_many :tags, :clone=>:tags, :select=>[:a, :b]
197
197
  @c2.many_to_pg_array :artists, :clone=>:artists, :select=>[:a, :b]
198
- @c1.load(:tag_ids=>Sequel.pg_array([1,2,3])).tags_dataset.sql.should == "SELECT a, b FROM tags WHERE (tags.id IN (1, 2, 3))"
199
- @c2.load(:id=>1).artists_dataset.sql.should == "SELECT a, b FROM artists WHERE (artists.tag_ids @> ARRAY[1]::integer[])"
198
+ @c1.load(:tag_ids=>Sequel.pg_array([1,2,3])).tags_dataset.sql.must_equal "SELECT a, b FROM tags WHERE (tags.id IN (1, 2, 3))"
199
+ @c2.load(:id=>1).artists_dataset.sql.must_equal "SELECT a, b FROM artists WHERE (artists.tag_ids @> ARRAY[1]::integer[])"
200
200
  end
201
201
 
202
202
  it "should accept a block" do
203
203
  @c1.pg_array_to_many :tags, :clone=>:tags do |ds| ds.filter(:yyy=>@yyy) end
204
204
  @c2.many_to_pg_array :artists, :clone=>:artists do |ds| ds.filter(:a=>1) end
205
- @c1.new(:yyy=>6, :tag_ids=>Sequel.pg_array([1,2,3])).tags_dataset.sql.should == "SELECT * FROM tags WHERE ((tags.id IN (1, 2, 3)) AND (yyy = 6))"
206
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE ((artists.tag_ids @> ARRAY[2]::integer[]) AND (a = 1))"
205
+ @c1.new(:yyy=>6, :tag_ids=>Sequel.pg_array([1,2,3])).tags_dataset.sql.must_equal "SELECT * FROM tags WHERE ((tags.id IN (1, 2, 3)) AND (yyy = 6))"
206
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE ((artists.tag_ids @> ARRAY[2]::integer[]) AND (a = 1))"
207
207
  end
208
208
 
209
209
  it "should support a :dataset option that is used instead of the default" do
210
210
  @c1.pg_array_to_many :tags, :clone=>:tags, :dataset=>proc{Tag.where(:id=>tag_ids.map{|x| x*2})}
211
211
  @c2.many_to_pg_array :artists, :clone=>:artists, :dataset=>proc{Artist.where(Sequel.pg_array(Sequel.pg_array(:tag_ids)[1..2]).contains([id]))}
212
- @o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (id IN (2, 4, 6))"
213
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (tag_ids[1:2] @> ARRAY[2])"
212
+ @o1.tags_dataset.sql.must_equal "SELECT * FROM tags WHERE (id IN (2, 4, 6))"
213
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE (tag_ids[1:2] @> ARRAY[2])"
214
214
  end
215
215
 
216
216
  it "should support a :limit option" do
217
217
  @c1.pg_array_to_many :tags, :clone=>:tags, :limit=>[2, 3]
218
218
  @c2.many_to_pg_array :artists, :clone=>:artists, :limit=>[3, 2]
219
- @o1.tags_dataset.sql.should == "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3)) LIMIT 2 OFFSET 3"
220
- @o2.artists_dataset.sql.should == "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[]) LIMIT 3 OFFSET 2"
219
+ @o1.tags_dataset.sql.must_equal "SELECT * FROM tags WHERE (tags.id IN (1, 2, 3)) LIMIT 2 OFFSET 3"
220
+ @o2.artists_dataset.sql.must_equal "SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[]) LIMIT 3 OFFSET 2"
221
221
  end
222
222
 
223
223
  it "should support a :uniq option that removes duplicates from the association" do
@@ -225,39 +225,39 @@ describe Sequel::Model, "pg_array_associations" do
225
225
  @c2.many_to_pg_array :artists, :clone=>:artists, :uniq=>true
226
226
  @c1.dataset._fetch = [{:id=>20}, {:id=>30}, {:id=>20}, {:id=>30}]
227
227
  @c2.dataset._fetch = [{:id=>20}, {:id=>30}, {:id=>20}, {:id=>30}]
228
- @o1.tags.should == [@c2.load(:id=>20), @c2.load(:id=>30)]
229
- @o2.artists.should == [@c1.load(:id=>20), @c1.load(:id=>30)]
228
+ @o1.tags.must_equal [@c2.load(:id=>20), @c2.load(:id=>30)]
229
+ @o2.artists.must_equal [@c1.load(:id=>20), @c1.load(:id=>30)]
230
230
  end
231
231
 
232
232
  it "reflection associated_object_keys should return correct values" do
233
- @c1.association_reflection(:tags).associated_object_keys.should == [:id]
234
- @c2.association_reflection(:artists).associated_object_keys.should == [:tag_ids]
233
+ @c1.association_reflection(:tags).associated_object_keys.must_equal [:id]
234
+ @c2.association_reflection(:artists).associated_object_keys.must_equal [:tag_ids]
235
235
  end
236
236
 
237
237
  it "reflection remove_before_destroy? should return correct values" do
238
- @c1.association_reflection(:tags).remove_before_destroy?.should == true
239
- @c2.association_reflection(:artists).remove_before_destroy?.should == false
238
+ @c1.association_reflection(:tags).remove_before_destroy?.must_equal true
239
+ @c2.association_reflection(:artists).remove_before_destroy?.must_equal false
240
240
  end
241
241
 
242
242
  it "reflection reciprocal should be correct" do
243
- @c1.association_reflection(:tags).reciprocal.should == :artists
244
- @c2.association_reflection(:artists).reciprocal.should == :tags
243
+ @c1.association_reflection(:tags).reciprocal.must_equal :artists
244
+ @c2.association_reflection(:artists).reciprocal.must_equal :tags
245
245
  end
246
246
 
247
247
  it "should eagerly load correctly" do
248
248
  a = @c1.eager(:tags).all
249
- a.should == [@o1]
249
+ a.must_equal [@o1]
250
250
  sqls = @db.sqls
251
- sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
252
- sqls.should == ["SELECT * FROM artists"]
253
- a.first.tags.should == [@o2]
254
- @db.sqls.should == []
251
+ sqls.pop.must_match(/SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/)
252
+ sqls.must_equal ["SELECT * FROM artists"]
253
+ a.first.tags.must_equal [@o2]
254
+ @db.sqls.must_equal []
255
255
 
256
256
  a = @c2.eager(:artists).all
257
- a.should == [@o2]
258
- @db.sqls.should == ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
259
- a.first.artists.should == [@o1]
260
- @db.sqls.should == []
257
+ a.must_equal [@o2]
258
+ @db.sqls.must_equal ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
259
+ a.first.artists.must_equal [@o1]
260
+ @db.sqls.must_equal []
261
261
  end
262
262
 
263
263
  it "should support using custom key options when eager loading associations" do
@@ -266,46 +266,46 @@ describe Sequel::Model, "pg_array_associations" do
266
266
  @c2.many_to_pg_array :artists, :clone=>:artists, :primary_key=>:id3, :key=>:tag3_ids, :key_column=>Sequel.pg_array(:tag_ids)[1..2]
267
267
 
268
268
  a = @c1.eager(:tags).all
269
- a.should == [@o1]
269
+ a.must_equal [@o1]
270
270
  sqls = @db.sqls
271
- sqls.pop.should =~ /SELECT \* FROM tags WHERE \(\(tags\.id \* 3\) IN \([369], [369], [369]\)\)/
272
- sqls.should == ["SELECT * FROM artists"]
273
- a.first.tags.should == [@o2]
274
- @db.sqls.should == []
271
+ sqls.pop.must_match(/SELECT \* FROM tags WHERE \(\(tags\.id \* 3\) IN \([369], [369], [369]\)\)/)
272
+ sqls.must_equal ["SELECT * FROM artists"]
273
+ a.first.tags.must_equal [@o2]
274
+ @db.sqls.must_equal []
275
275
 
276
276
  a = @c2.eager(:artists).all
277
- a.should == [@o2]
278
- @db.sqls.should == ["SELECT * FROM tags", "SELECT * FROM artists WHERE (artists.tag_ids[1:2] && ARRAY[6]::integer[])"]
279
- a.first.artists.should == [@o1]
280
- @db.sqls.should == []
277
+ a.must_equal [@o2]
278
+ @db.sqls.must_equal ["SELECT * FROM tags", "SELECT * FROM artists WHERE (artists.tag_ids[1:2] && ARRAY[6]::integer[])"]
279
+ a.first.artists.must_equal [@o1]
280
+ @db.sqls.must_equal []
281
281
  end
282
282
 
283
283
  it "should allow cascading of eager loading for associations of associated models" do
284
284
  a = @c1.eager(:tags=>:artists).all
285
- a.should == [@o1]
285
+ a.must_equal [@o1]
286
286
  sqls = @db.sqls
287
- sqls.slice!(1).should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
288
- sqls.should == ['SELECT * FROM artists', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
289
- a.first.tags.should == [@o2]
290
- a.first.tags.first.artists.should == [@o1]
291
- @db.sqls.should == []
287
+ sqls.slice!(1).must_match(/SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/)
288
+ sqls.must_equal ['SELECT * FROM artists', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
289
+ a.first.tags.must_equal [@o2]
290
+ a.first.tags.first.artists.must_equal [@o1]
291
+ @db.sqls.must_equal []
292
292
  end
293
293
 
294
294
  it "should respect :eager when lazily loading an association" do
295
295
  @c1.pg_array_to_many :tags2, :clone=>:tags, :eager=>:artists, :key=>:tag_ids
296
296
  @c2.many_to_pg_array :artists2, :clone=>:artists, :eager=>:tags
297
297
 
298
- @o1.tags2.should == [@o2]
299
- @db.sqls.should == ["SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))", "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
300
- @o1.tags2.first.artists.should == [@o1]
301
- @db.sqls.should == []
298
+ @o1.tags2.must_equal [@o2]
299
+ @db.sqls.must_equal ["SELECT * FROM tags WHERE (tags.id IN (1, 2, 3))", "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
300
+ @o1.tags2.first.artists.must_equal [@o1]
301
+ @db.sqls.must_equal []
302
302
 
303
- @o2.artists2.should == [@o1]
303
+ @o2.artists2.must_equal [@o1]
304
304
  sqls = @db.sqls
305
- sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
306
- sqls.should == ["SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
307
- @o2.artists2.first.tags.should == [@o2]
308
- @db.sqls.should == []
305
+ sqls.pop.must_match(/SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/)
306
+ sqls.must_equal ["SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
307
+ @o2.artists2.first.tags.must_equal [@o2]
308
+ @db.sqls.must_equal []
309
309
  end
310
310
 
311
311
  it "should cascade eagerly loading when the :eager_graph association option is used" do
@@ -315,37 +315,37 @@ describe Sequel::Model, "pg_array_associations" do
315
315
  @c2.dataset._fetch = {:id=>2, :artists_id=>1, :tag_ids=>Sequel.pg_array([1,2,3])}
316
316
  @c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
317
317
 
318
- @o1.tags2.should == [@o2]
319
- @db.sqls.first.should =~ /SELECT tags\.id, artists\.id AS artists_id, artists\.tag_ids FROM tags LEFT OUTER JOIN artists ON \(artists.tag_ids @> ARRAY\[tags.id\]\) WHERE \(tags\.id IN \([123], [123], [123]\)\)/
320
- @o1.tags2.first.artists.should == [@o1]
321
- @db.sqls.should == []
318
+ @o1.tags2.must_equal [@o2]
319
+ @db.sqls.first.must_match(/SELECT tags\.id, artists\.id AS artists_id, artists\.tag_ids FROM tags LEFT OUTER JOIN artists ON \(artists.tag_ids @> ARRAY\[tags.id\]\) WHERE \(tags\.id IN \([123], [123], [123]\)\)/)
320
+ @o1.tags2.first.artists.must_equal [@o1]
321
+ @db.sqls.must_equal []
322
322
 
323
- @o2.artists2.should == [@o1]
324
- @db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
325
- @o2.artists2.first.tags.should == [@o2]
326
- @db.sqls.should == []
323
+ @o2.artists2.must_equal [@o1]
324
+ @db.sqls.must_equal ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) WHERE (artists.tag_ids @> ARRAY[2]::integer[])"]
325
+ @o2.artists2.first.tags.must_equal [@o2]
326
+ @db.sqls.must_equal []
327
327
 
328
328
  @c2.dataset._fetch = {:id=>2, :artists_id=>1, :tag_ids=>Sequel.pg_array([1,2,3])}
329
329
  @c1.dataset._fetch = {:id=>1, :tag_ids=>Sequel.pg_array([1,2,3])}
330
330
 
331
331
  a = @c1.eager(:tags2).all
332
332
  sqls = @db.sqls
333
- sqls.pop.should =~ /SELECT tags\.id, artists\.id AS artists_id, artists\.tag_ids FROM tags LEFT OUTER JOIN artists ON \(artists.tag_ids @> ARRAY\[tags.id\]\) WHERE \(tags\.id IN \([123], [123], [123]\)\)/
334
- sqls.should == ["SELECT * FROM artists"]
335
- a.should == [@o1]
336
- a.first.tags2.should == [@o2]
337
- a.first.tags2.first.artists.should == [@o1]
338
- @db.sqls.should == []
333
+ sqls.pop.must_match(/SELECT tags\.id, artists\.id AS artists_id, artists\.tag_ids FROM tags LEFT OUTER JOIN artists ON \(artists.tag_ids @> ARRAY\[tags.id\]\) WHERE \(tags\.id IN \([123], [123], [123]\)\)/)
334
+ sqls.must_equal ["SELECT * FROM artists"]
335
+ a.must_equal [@o1]
336
+ a.first.tags2.must_equal [@o2]
337
+ a.first.tags2.first.artists.must_equal [@o1]
338
+ @db.sqls.must_equal []
339
339
 
340
340
  @c2.dataset._fetch = {:id=>2}
341
341
  @c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
342
342
 
343
343
  a = @c2.eager(:artists2).all
344
- @db.sqls.should == ["SELECT * FROM tags", "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
345
- a.should == [@o2]
346
- a.first.artists2.should == [@o1]
347
- a.first.artists2.first.tags.should == [@o2]
348
- @db.sqls.should == []
344
+ @db.sqls.must_equal ["SELECT * FROM tags", "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
345
+ a.must_equal [@o2]
346
+ a.first.artists2.must_equal [@o1]
347
+ a.first.artists2.first.tags.must_equal [@o2]
348
+ @db.sqls.must_equal []
349
349
  end
350
350
 
351
351
  it "should respect the :limit option when eager loading" do
@@ -353,64 +353,64 @@ describe Sequel::Model, "pg_array_associations" do
353
353
 
354
354
  @c1.pg_array_to_many :tags, :clone=>:tags, :limit=>2
355
355
  a = @c1.eager(:tags).all
356
- a.should == [@o1]
356
+ a.must_equal [@o1]
357
357
  sqls = @db.sqls
358
- sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
359
- sqls.should == ["SELECT * FROM artists"]
360
- a.first.tags.should == [@c2.load(:id=>1), @c2.load(:id=>2)]
361
- @db.sqls.should == []
358
+ sqls.pop.must_match(/SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/)
359
+ sqls.must_equal ["SELECT * FROM artists"]
360
+ a.first.tags.must_equal [@c2.load(:id=>1), @c2.load(:id=>2)]
361
+ @db.sqls.must_equal []
362
362
 
363
363
  @c1.pg_array_to_many :tags, :clone=>:tags, :limit=>[1, 1]
364
364
  a = @c1.eager(:tags).all
365
- a.should == [@o1]
365
+ a.must_equal [@o1]
366
366
  sqls = @db.sqls
367
- sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
368
- sqls.should == ["SELECT * FROM artists"]
369
- a.first.tags.should == [@c2.load(:id=>2)]
370
- @db.sqls.should == []
367
+ sqls.pop.must_match(/SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/)
368
+ sqls.must_equal ["SELECT * FROM artists"]
369
+ a.first.tags.must_equal [@c2.load(:id=>2)]
370
+ @db.sqls.must_equal []
371
371
 
372
372
  @c1.pg_array_to_many :tags, :clone=>:tags, :limit=>[nil, 1]
373
373
  a = @c1.eager(:tags).all
374
- a.should == [@o1]
374
+ a.must_equal [@o1]
375
375
  sqls = @db.sqls
376
- sqls.pop.should =~ /SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/
377
- sqls.should == ["SELECT * FROM artists"]
378
- a.first.tags.should == [@c2.load(:id=>2), @c2.load(:id=>3)]
379
- @db.sqls.length.should == 0
376
+ sqls.pop.must_match(/SELECT \* FROM tags WHERE \(tags\.id IN \([123], [123], [123]\)\)/)
377
+ sqls.must_equal ["SELECT * FROM artists"]
378
+ a.first.tags.must_equal [@c2.load(:id=>2), @c2.load(:id=>3)]
379
+ @db.sqls.length.must_equal 0
380
380
 
381
381
  @c2.dataset._fetch = [{:id=>2}]
382
382
  @c1.dataset._fetch = [{:id=>5, :tag_ids=>Sequel.pg_array([1,2,3])},{:id=>6, :tag_ids=>Sequel.pg_array([2,3])}, {:id=>7, :tag_ids=>Sequel.pg_array([1,2])}]
383
383
 
384
384
  @c2.many_to_pg_array :artists, :clone=>:artists, :limit=>2
385
385
  a = @c2.eager(:artists).all
386
- a.should == [@o2]
387
- @db.sqls.should == ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
388
- a.first.artists.should == [@c1.load(:id=>5, :tag_ids=>Sequel.pg_array([1,2,3])), @c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3]))]
389
- @db.sqls.should == []
386
+ a.must_equal [@o2]
387
+ @db.sqls.must_equal ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
388
+ a.first.artists.must_equal [@c1.load(:id=>5, :tag_ids=>Sequel.pg_array([1,2,3])), @c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3]))]
389
+ @db.sqls.must_equal []
390
390
 
391
391
  @c2.many_to_pg_array :artists, :clone=>:artists, :limit=>[1, 1]
392
392
  a = @c2.eager(:artists).all
393
- a.should == [@o2]
394
- @db.sqls.should == ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
395
- a.first.artists.should == [@c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3]))]
396
- @db.sqls.should == []
393
+ a.must_equal [@o2]
394
+ @db.sqls.must_equal ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
395
+ a.first.artists.must_equal [@c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3]))]
396
+ @db.sqls.must_equal []
397
397
 
398
398
  @c2.many_to_pg_array :artists, :clone=>:artists, :limit=>[nil, 1]
399
399
  a = @c2.eager(:artists).all
400
- a.should == [@o2]
401
- @db.sqls.should == ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
402
- a.first.artists.should == [@c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3])), @c1.load(:id=>7, :tag_ids=>Sequel.pg_array([1,2]))]
403
- @db.sqls.should == []
400
+ a.must_equal [@o2]
401
+ @db.sqls.must_equal ['SELECT * FROM tags', "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::integer[])"]
402
+ a.first.artists.must_equal [@c1.load(:id=>6, :tag_ids=>Sequel.pg_array([2,3])), @c1.load(:id=>7, :tag_ids=>Sequel.pg_array([1,2]))]
403
+ @db.sqls.must_equal []
404
404
  end
405
405
 
406
406
  it "should support association_join" do
407
- @c1.association_join(:tags).sql.should == "SELECT * FROM artists INNER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"
408
- @c2.association_join(:artists).sql.should == "SELECT * FROM tags INNER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"
407
+ @c1.association_join(:tags).sql.must_equal "SELECT * FROM artists INNER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"
408
+ @c2.association_join(:artists).sql.must_equal "SELECT * FROM tags INNER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"
409
409
  end
410
410
 
411
411
  it "should support custom selects when using association_join" do
412
- @c1.select{a(b)}.association_join(:tags).sql.should == "SELECT a(b) FROM artists INNER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"
413
- @c2.select{a(b)}.association_join(:artists).sql.should == "SELECT a(b) FROM tags INNER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"
412
+ @c1.select{a(b)}.association_join(:tags).sql.must_equal "SELECT a(b) FROM artists INNER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"
413
+ @c2.select{a(b)}.association_join(:artists).sql.must_equal "SELECT a(b) FROM tags INNER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"
414
414
  end
415
415
 
416
416
  it "should eagerly graph associations" do
@@ -418,16 +418,16 @@ describe Sequel::Model, "pg_array_associations" do
418
418
  @c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
419
419
 
420
420
  a = @c1.eager_graph(:tags).all
421
- @db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"]
422
- a.should == [@o1]
423
- a.first.tags.should == [@o2]
424
- @db.sqls.should == []
421
+ @db.sqls.must_equal ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"]
422
+ a.must_equal [@o1]
423
+ a.first.tags.must_equal [@o2]
424
+ @db.sqls.must_equal []
425
425
 
426
426
  a = @c2.eager_graph(:artists).all
427
- @db.sqls.should == ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"]
428
- a.should == [@o2]
429
- a.first.artists.should == [@o1]
430
- @db.sqls.should == []
427
+ @db.sqls.must_equal ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"]
428
+ a.must_equal [@o2]
429
+ a.first.artists.must_equal [@o1]
430
+ @db.sqls.must_equal []
431
431
  end
432
432
 
433
433
  it "should allow cascading of eager graphing for associations of associated models" do
@@ -435,18 +435,18 @@ describe Sequel::Model, "pg_array_associations" do
435
435
  @c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3]), :artists_0_id=>1, :artists_0_tag_ids=>Sequel.pg_array([1,2,3])}
436
436
 
437
437
  a = @c1.eager_graph(:tags=>:artists).all
438
- @db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id, artists_0.id AS artists_0_id, artists_0.tag_ids AS artists_0_tag_ids FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) LEFT OUTER JOIN artists AS artists_0 ON (artists_0.tag_ids @> ARRAY[tags.id])"]
439
- a.should == [@o1]
440
- a.first.tags.should == [@o2]
441
- a.first.tags.first.artists.should == [@o1]
442
- @db.sqls.should == []
438
+ @db.sqls.must_equal ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id, artists_0.id AS artists_0_id, artists_0.tag_ids AS artists_0_tag_ids FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id]) LEFT OUTER JOIN artists AS artists_0 ON (artists_0.tag_ids @> ARRAY[tags.id])"]
439
+ a.must_equal [@o1]
440
+ a.first.tags.must_equal [@o2]
441
+ a.first.tags.first.artists.must_equal [@o1]
442
+ @db.sqls.must_equal []
443
443
 
444
444
  a = @c2.eager_graph(:artists=>:tags).all
445
- @db.sqls.should == ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids, tags_0.id AS tags_0_id FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id]) LEFT OUTER JOIN tags AS tags_0 ON (artists.tag_ids @> ARRAY[tags_0.id])"]
446
- a.should == [@o2]
447
- a.first.artists.should == [@o1]
448
- a.first.artists.first.tags.should == [@o2]
449
- @db.sqls.should == []
445
+ @db.sqls.must_equal ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids, tags_0.id AS tags_0_id FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id]) LEFT OUTER JOIN tags AS tags_0 ON (artists.tag_ids @> ARRAY[tags_0.id])"]
446
+ a.must_equal [@o2]
447
+ a.first.artists.must_equal [@o1]
448
+ a.first.artists.first.tags.must_equal [@o2]
449
+ @db.sqls.must_equal []
450
450
  end
451
451
 
452
452
  it "eager graphing should respect key options" do
@@ -458,16 +458,16 @@ describe Sequel::Model, "pg_array_associations" do
458
458
  @c1.dataset._fetch = {:id=>1, :tags_id=>2, :tag_ids=>Sequel.pg_array([1,2,3]), :artists_0_id=>1, :artists_0_tag_ids=>Sequel.pg_array([1,2,3])}
459
459
 
460
460
  a = @c1.eager_graph(:tags).all
461
- a.should == [@o1]
462
- @db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids[1:2] @> ARRAY[(tags.id * 3)])"]
463
- a.first.tags.should == [@o2]
464
- @db.sqls.should == []
461
+ a.must_equal [@o1]
462
+ @db.sqls.must_equal ["SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids[1:2] @> ARRAY[(tags.id * 3)])"]
463
+ a.first.tags.must_equal [@o2]
464
+ @db.sqls.must_equal []
465
465
 
466
466
  a = @c2.eager_graph(:artists).all
467
- a.should == [@o2]
468
- @db.sqls.should == ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids[1:2] @> ARRAY[tags.id3])"]
469
- a.first.artists.should == [@o1]
470
- @db.sqls.should == []
467
+ a.must_equal [@o2]
468
+ @db.sqls.must_equal ["SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids[1:2] @> ARRAY[tags.id3])"]
469
+ a.first.artists.must_equal [@o1]
470
+ @db.sqls.must_equal []
471
471
  end
472
472
 
473
473
  it "should respect the association's :graph_select option" do
@@ -478,177 +478,177 @@ describe Sequel::Model, "pg_array_associations" do
478
478
  @c1.dataset._fetch = {:id=>1, :id2=>2, :tag_ids=>Sequel.pg_array([1,2,3])}
479
479
 
480
480
  a = @c1.eager_graph(:tags).all
481
- @db.sqls.should == ["SELECT artists.id, artists.tag_ids, tags.id2 FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"]
482
- a.should == [@o1]
483
- a.first.tags.should == [@c2.load(:id2=>2)]
484
- @db.sqls.should == []
481
+ @db.sqls.must_equal ["SELECT artists.id, artists.tag_ids, tags.id2 FROM artists LEFT OUTER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"]
482
+ a.must_equal [@o1]
483
+ a.first.tags.must_equal [@c2.load(:id2=>2)]
484
+ @db.sqls.must_equal []
485
485
 
486
486
  a = @c2.eager_graph(:artists).all
487
- @db.sqls.should == ["SELECT tags.id, artists.id AS artists_id FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"]
488
- a.should == [@o2]
489
- a.first.artists.should == [@c1.load(:id=>1)]
490
- @db.sqls.should == []
487
+ @db.sqls.must_equal ["SELECT tags.id, artists.id AS artists_id FROM tags LEFT OUTER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"]
488
+ a.must_equal [@o2]
489
+ a.first.artists.must_equal [@c1.load(:id=>1)]
490
+ @db.sqls.must_equal []
491
491
  end
492
492
 
493
493
  it "should respect the association's :graph_join_type option" do
494
494
  @c1.pg_array_to_many :tags, :clone=>:tags, :graph_join_type=>:inner
495
495
  @c2.many_to_pg_array :artists, :clone=>:artists, :graph_join_type=>:inner
496
- @c1.eager_graph(:tags).sql.should == "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists INNER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"
497
- @c2.eager_graph(:artists).sql.should == "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags INNER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"
496
+ @c1.eager_graph(:tags).sql.must_equal "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists INNER JOIN tags ON (artists.tag_ids @> ARRAY[tags.id])"
497
+ @c2.eager_graph(:artists).sql.must_equal "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags INNER JOIN artists ON (artists.tag_ids @> ARRAY[tags.id])"
498
498
  end
499
499
 
500
500
  it "should respect the association's :conditions option" do
501
501
  @c1.pg_array_to_many :tags, :clone=>:tags, :conditions=>{:a=>1}
502
502
  @c2.many_to_pg_array :artists, :clone=>:artists, :conditions=>{:a=>1}
503
- @c1.eager_graph(:tags).sql.should == "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON ((tags.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
504
- @c2.eager_graph(:artists).sql.should == "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON ((artists.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
503
+ @c1.eager_graph(:tags).sql.must_equal "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON ((tags.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
504
+ @c2.eager_graph(:artists).sql.must_equal "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON ((artists.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
505
505
  end
506
506
 
507
507
  it "should respect the association's :graph_conditions option" do
508
508
  @c1.pg_array_to_many :tags, :clone=>:tags, :graph_conditions=>{:a=>1}
509
509
  @c2.many_to_pg_array :artists, :clone=>:artists, :graph_conditions=>{:a=>1}
510
- @c1.eager_graph(:tags).sql.should == "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON ((tags.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
511
- @c2.eager_graph(:artists).sql.should == "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON ((artists.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
510
+ @c1.eager_graph(:tags).sql.must_equal "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON ((tags.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
511
+ @c2.eager_graph(:artists).sql.must_equal "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON ((artists.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
512
512
  end
513
513
 
514
514
  it "should respect the association's :graph_block option" do
515
515
  @c1.pg_array_to_many :tags, :clone=>:tags, :graph_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :a)=>1}}
516
516
  @c2.many_to_pg_array :artists, :clone=>:artists, :graph_block=>proc{|ja,lja,js| {Sequel.qualify(ja, :a)=>1}}
517
- @c1.eager_graph(:tags).sql.should == "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON ((tags.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
518
- @c2.eager_graph(:artists).sql.should == "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON ((artists.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
517
+ @c1.eager_graph(:tags).sql.must_equal "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON ((tags.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
518
+ @c2.eager_graph(:artists).sql.must_equal "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON ((artists.a = 1) AND (artists.tag_ids @> ARRAY[tags.id]))"
519
519
  end
520
520
 
521
521
  it "should respect the association's :graph_only_conditions option" do
522
522
  @c1.pg_array_to_many :tags, :clone=>:tags, :graph_only_conditions=>{:a=>1}
523
523
  @c2.many_to_pg_array :artists, :clone=>:artists, :graph_only_conditions=>{:a=>1}
524
- @c1.eager_graph(:tags).sql.should == "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (tags.a = 1)"
525
- @c2.eager_graph(:artists).sql.should == "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON (artists.a = 1)"
524
+ @c1.eager_graph(:tags).sql.must_equal "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON (tags.a = 1)"
525
+ @c2.eager_graph(:artists).sql.must_equal "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON (artists.a = 1)"
526
526
  end
527
527
 
528
528
  it "should respect the association's :graph_only_conditions with :graph_block option" do
529
529
  @c1.pg_array_to_many :tags, :clone=>:tags, :graph_only_conditions=>{:a=>1}, :graph_block=>proc{|ja,lja,js| {Sequel.qualify(lja, :b)=>1}}
530
530
  @c2.many_to_pg_array :artists, :clone=>:artists, :graph_only_conditions=>{:a=>1}, :graph_block=>proc{|ja,lja,js| {Sequel.qualify(lja, :b)=>1}}
531
- @c1.eager_graph(:tags).sql.should == "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON ((tags.a = 1) AND (artists.b = 1))"
532
- @c2.eager_graph(:artists).sql.should == "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON ((artists.a = 1) AND (tags.b = 1))"
531
+ @c1.eager_graph(:tags).sql.must_equal "SELECT artists.id, artists.tag_ids, tags.id AS tags_id FROM artists LEFT OUTER JOIN tags ON ((tags.a = 1) AND (artists.b = 1))"
532
+ @c2.eager_graph(:artists).sql.must_equal "SELECT tags.id, artists.id AS artists_id, artists.tag_ids FROM tags LEFT OUTER JOIN artists ON ((artists.a = 1) AND (tags.b = 1))"
533
533
  end
534
534
 
535
535
  it "should define an add_ method for adding associated objects" do
536
536
  @o1.add_tag(@c2.load(:id=>4))
537
- @o1.tag_ids.should == [1,2,3,4]
538
- @db.sqls.should == []
537
+ @o1.tag_ids.must_equal [1,2,3,4]
538
+ @db.sqls.must_equal []
539
539
  @o1.save_changes
540
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,2,3,4] WHERE (id = 1)"]
540
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[1,2,3,4] WHERE (id = 1)"]
541
541
 
542
542
  @o2.add_artist(@c1.load(:id=>1, :tag_ids=>Sequel.pg_array([4])))
543
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[4,2] WHERE (id = 1)"]
543
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[4,2] WHERE (id = 1)"]
544
544
  end
545
545
 
546
546
  it "should define a remove_ method for removing associated objects" do
547
547
  @o1.remove_tag(@o2)
548
- @o1.tag_ids.should == [1,3]
549
- @db.sqls.should == []
548
+ @o1.tag_ids.must_equal [1,3]
549
+ @db.sqls.must_equal []
550
550
  @o1.save_changes
551
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,3] WHERE (id = 1)"]
551
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[1,3] WHERE (id = 1)"]
552
552
 
553
553
  @o2.remove_artist(@c1.load(:id=>1, :tag_ids=>Sequel.pg_array([1,2,3,4])))
554
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,3,4] WHERE (id = 1)"]
554
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[1,3,4] WHERE (id = 1)"]
555
555
  end
556
556
 
557
557
  it "should define a remove_all_ method for removing all associated objects" do
558
558
  @o1.remove_all_tags
559
- @o1.tag_ids.should == []
560
- @db.sqls.should == []
559
+ @o1.tag_ids.must_equal []
560
+ @db.sqls.must_equal []
561
561
  @o1.save_changes
562
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[] WHERE (id = 1)"]
562
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[] WHERE (id = 1)"]
563
563
 
564
564
  @o2.remove_all_artists
565
- @db.sqls.should == ["UPDATE artists SET tag_ids = array_remove(tag_ids, 2) WHERE (tag_ids @> ARRAY[2])"]
565
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = array_remove(tag_ids, 2) WHERE (tag_ids @> ARRAY[2])"]
566
566
  end
567
567
 
568
568
  it "should allow calling add_ and remove_ methods on new objects for pg_array_to_many associations" do
569
569
  a = Artist.new
570
570
  a.add_tag(@c2.load(:id=>4))
571
- a.tag_ids.should == [4]
571
+ a.tag_ids.must_equal [4]
572
572
  a.remove_tag(@c2.load(:id=>4))
573
- a.tag_ids.should == []
573
+ a.tag_ids.must_equal []
574
574
  a.add_tag(@c2.load(:id=>4))
575
- a.tag_ids.should == [4]
575
+ a.tag_ids.must_equal [4]
576
576
  a.remove_all_tags
577
- a.tag_ids.should == []
577
+ a.tag_ids.must_equal []
578
578
  end
579
579
 
580
580
  it "should have pg_array_to_many association modification methods save if :save_after_modify option is used" do
581
581
  @c1.pg_array_to_many :tags, :clone=>:tags, :save_after_modify=>true
582
582
 
583
583
  @o1.add_tag(@c2.load(:id=>4))
584
- @o1.tag_ids.should == [1,2,3,4]
585
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,2,3,4] WHERE (id = 1)"]
584
+ @o1.tag_ids.must_equal [1,2,3,4]
585
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[1,2,3,4] WHERE (id = 1)"]
586
586
 
587
587
  @o1.remove_tag(@o2)
588
- @o1.tag_ids.should == [1,3,4]
589
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1,3,4] WHERE (id = 1)"]
588
+ @o1.tag_ids.must_equal [1,3,4]
589
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[1,3,4] WHERE (id = 1)"]
590
590
 
591
591
  @o1.remove_all_tags
592
- @o1.tag_ids.should == []
593
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[] WHERE (id = 1)"]
592
+ @o1.tag_ids.must_equal []
593
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[] WHERE (id = 1)"]
594
594
  end
595
595
 
596
596
  it "should have association modification methods deal with nil values" do
597
597
  v = @c1.load(:id=>1)
598
598
  v.add_tag(@c2.load(:id=>4))
599
- v.tag_ids.should == [4]
600
- @db.sqls.should == []
599
+ v.tag_ids.must_equal [4]
600
+ @db.sqls.must_equal []
601
601
  v.save_changes
602
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[4]::integer[] WHERE (id = 1)"]
602
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[4]::integer[] WHERE (id = 1)"]
603
603
 
604
604
  @o2.add_artist(@c1.load(:id=>1))
605
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[2]::integer[] WHERE (id = 1)"]
605
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[2]::integer[] WHERE (id = 1)"]
606
606
 
607
607
  v = @c1.load(:id=>1)
608
608
  v.remove_tag(@c2.load(:id=>4))
609
- v.tag_ids.should == nil
610
- @db.sqls.should == []
609
+ v.tag_ids.must_equal nil
610
+ @db.sqls.must_equal []
611
611
  v.save_changes
612
- @db.sqls.should == []
612
+ @db.sqls.must_equal []
613
613
 
614
614
  @o2.remove_artist(@c1.load(:id=>1))
615
- @db.sqls.should == []
615
+ @db.sqls.must_equal []
616
616
 
617
617
  v = @c1.load(:id=>1)
618
618
  v.remove_all_tags
619
- v.tag_ids.should == nil
620
- @db.sqls.should == []
619
+ v.tag_ids.must_equal nil
620
+ @db.sqls.must_equal []
621
621
  v.save_changes
622
- @db.sqls.should == []
622
+ @db.sqls.must_equal []
623
623
  end
624
624
 
625
625
  it "should have association modification methods deal with empty arrays values" do
626
626
  v = @c1.load(:id=>1, :tag_ids=>Sequel.pg_array([]))
627
627
  v.add_tag(@c2.load(:id=>4))
628
- v.tag_ids.should == [4]
629
- @db.sqls.should == []
628
+ v.tag_ids.must_equal [4]
629
+ @db.sqls.must_equal []
630
630
  v.save_changes
631
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[4] WHERE (id = 1)"]
631
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[4] WHERE (id = 1)"]
632
632
 
633
633
  @o2.add_artist(@c1.load(:id=>1, :tag_ids=>Sequel.pg_array([])))
634
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[2] WHERE (id = 1)"]
634
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[2] WHERE (id = 1)"]
635
635
 
636
636
  v = @c1.load(:id=>1, :tag_ids=>Sequel.pg_array([]))
637
637
  v.remove_tag(@c2.load(:id=>4))
638
- v.tag_ids.should == []
639
- @db.sqls.should == []
638
+ v.tag_ids.must_equal []
639
+ @db.sqls.must_equal []
640
640
  v.save_changes
641
- @db.sqls.should == []
641
+ @db.sqls.must_equal []
642
642
 
643
643
  @o2.remove_artist(@c1.load(:id=>1, :tag_ids=>Sequel.pg_array([])))
644
- @db.sqls.should == []
644
+ @db.sqls.must_equal []
645
645
 
646
646
  v = @c1.load(:id=>1, :tag_ids=>Sequel.pg_array([]))
647
647
  v.remove_all_tags
648
- v.tag_ids.should == []
649
- @db.sqls.should == []
648
+ v.tag_ids.must_equal []
649
+ @db.sqls.must_equal []
650
650
  v.save_changes
651
- @db.sqls.should == []
651
+ @db.sqls.must_equal []
652
652
  end
653
653
 
654
654
  it "should respect the :array_type option when manually creating arrays" do
@@ -656,39 +656,39 @@ describe Sequel::Model, "pg_array_associations" do
656
656
  @c2.many_to_pg_array :artists, :clone=>:artists, :array_type=>:int8
657
657
  v = @c1.load(:id=>1)
658
658
  v.add_tag(@c2.load(:id=>4))
659
- v.tag_ids.should == [4]
660
- @db.sqls.should == []
659
+ v.tag_ids.must_equal [4]
660
+ @db.sqls.must_equal []
661
661
  v.save_changes
662
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[4]::int8[] WHERE (id = 1)"]
662
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[4]::int8[] WHERE (id = 1)"]
663
663
 
664
664
  @o2.add_artist(@c1.load(:id=>1))
665
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[2]::int8[] WHERE (id = 1)"]
665
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[2]::int8[] WHERE (id = 1)"]
666
666
  end
667
667
 
668
668
  it "should respect the :array_type option in the associations dataset" do
669
669
  @c2.many_to_pg_array :artists, :clone=>:artists, :array_type=>:int8
670
- @c2.load(:id=>1).artists_dataset.sql.should == 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
670
+ @c2.load(:id=>1).artists_dataset.sql.must_equal 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
671
671
  end
672
672
 
673
673
  it "should respect the :array_type option when eager loading" do
674
674
  @c2.many_to_pg_array :artists, :clone=>:artists, :array_type=>:int8
675
675
  @c2.eager(:artists).all
676
- @db.sqls.should == ["SELECT * FROM tags", "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::int8[])"]
676
+ @db.sqls.must_equal ["SELECT * FROM tags", "SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[2]::int8[])"]
677
677
  end
678
678
 
679
679
  it "should respect the :array_type option when filtering by associations" do
680
680
  @c1.pg_array_to_many :tags, :clone=>:tags, :array_type=>:int8
681
- @c1.where(:tags=>@c2.load(:id=>1)).sql.should == 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
682
- @c1.where(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.should == 'SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[1,2]::int8[])'
681
+ @c1.where(:tags=>@c2.load(:id=>1)).sql.must_equal 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
682
+ @c1.where(:tags=>[@c2.load(:id=>1), @c2.load(:id=>2)]).sql.must_equal 'SELECT * FROM artists WHERE (artists.tag_ids && ARRAY[1,2]::int8[])'
683
683
  end
684
684
 
685
685
  it "should automatically determine the array type by looking at the schema" do
686
686
  @c1.db_schema[:tag_ids][:db_type] = 'int8'
687
687
  @c2.many_to_pg_array :artists, :clone=>:artists
688
688
  @c1.pg_array_to_many :tags, :clone=>:tags, :save_after_modify=>true
689
- @c2.load(:id=>1).artists_dataset.sql.should == 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
689
+ @c2.load(:id=>1).artists_dataset.sql.must_equal 'SELECT * FROM artists WHERE (artists.tag_ids @> ARRAY[1]::int8[])'
690
690
  @c1.load(:id=>1).add_tag(@c2.load(:id=>1))
691
- @db.sqls.should == ["UPDATE artists SET tag_ids = ARRAY[1]::int8[] WHERE (id = 1)"]
691
+ @db.sqls.must_equal ["UPDATE artists SET tag_ids = ARRAY[1]::int8[] WHERE (id = 1)"]
692
692
  end
693
693
 
694
694
  it "should automatically determine the array type by looking at the schema" do
@@ -701,16 +701,16 @@ describe Sequel::Model, "pg_array_associations" do
701
701
  t = @c2.load(:id=>2)
702
702
  def a.validate() errors.add(:id, 'foo') end
703
703
  a.associations[:tags] = []
704
- a.add_tag(t).should == t
705
- a.tags.should == [t]
706
- a.remove_tag(t).should == t
707
- a.tags.should == []
704
+ a.add_tag(t).must_equal t
705
+ a.tags.must_equal [t]
706
+ a.remove_tag(t).must_equal t
707
+ a.tags.must_equal []
708
708
 
709
709
  t.associations[:artists] = []
710
- t.add_artist(a).should == a
711
- t.artists.should == [a]
712
- t.remove_artist(a).should == a
713
- t.artists.should == []
710
+ t.add_artist(a).must_equal a
711
+ t.artists.must_equal [a]
712
+ t.remove_artist(a).must_equal a
713
+ t.artists.must_equal []
714
714
  end
715
715
 
716
716
  it "should not raise exception in add_ and remove_ if the :raise_on_save_failure=>false option is used" do
@@ -720,17 +720,17 @@ describe Sequel::Model, "pg_array_associations" do
720
720
  t = @c2.load(:id=>2)
721
721
  def a.validate() errors.add(:id, 'foo') end
722
722
  a.associations[:tags] = []
723
- a.add_tag(t).should == nil
724
- a.tags.should == []
723
+ a.add_tag(t).must_equal nil
724
+ a.tags.must_equal []
725
725
  a.associations[:tags] = [t]
726
- a.remove_tag(t).should == nil
727
- a.tags.should == [t]
726
+ a.remove_tag(t).must_equal nil
727
+ a.tags.must_equal [t]
728
728
 
729
729
  t.associations[:artists] = []
730
- t.add_artist(a).should == nil
731
- t.artists.should == []
730
+ t.add_artist(a).must_equal nil
731
+ t.artists.must_equal []
732
732
  t.associations[:artists] = [a]
733
- t.remove_artist(a).should == nil
734
- t.artists.should == [a]
733
+ t.remove_artist(a).must_equal nil
734
+ t.artists.must_equal [a]
735
735
  end
736
736
  end