sequel 4.22.0 → 4.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +22 -0
- data/README.rdoc +6 -0
- data/Rakefile +59 -81
- data/doc/migration.rdoc +2 -0
- data/doc/release_notes/4.23.0.txt +65 -0
- data/doc/sharding.rdoc +16 -14
- data/doc/testing.rdoc +61 -77
- data/lib/sequel/adapters/jdbc.rb +1 -0
- data/lib/sequel/adapters/mock.rb +0 -1
- data/lib/sequel/adapters/postgres.rb +1 -0
- data/lib/sequel/adapters/postgresql.rb +1 -0
- data/lib/sequel/adapters/shared/postgres.rb +3 -3
- data/lib/sequel/connection_pool/sharded_threaded.rb +5 -0
- data/lib/sequel/connection_pool/threaded.rb +9 -1
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/transactions.rb +2 -1
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/extensions/constraint_validations.rb +12 -12
- data/lib/sequel/extensions/date_arithmetic.rb +0 -4
- data/lib/sequel/extensions/pagination.rb +14 -2
- data/lib/sequel/extensions/pg_enum.rb +2 -2
- data/lib/sequel/extensions/pg_hstore.rb +1 -1
- data/lib/sequel/extensions/pg_json_ops.rb +2 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -0
- data/lib/sequel/plugins/delay_add_association.rb +50 -0
- data/lib/sequel/plugins/list.rb +2 -2
- data/lib/sequel/plugins/nested_attributes.rb +8 -28
- data/lib/sequel/plugins/update_refresh.rb +50 -0
- data/lib/sequel/plugins/validate_associated.rb +55 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +29 -29
- data/spec/adapters/firebird_spec.rb +97 -103
- data/spec/adapters/informix_spec.rb +25 -25
- data/spec/adapters/mssql_spec.rb +156 -172
- data/spec/adapters/mysql_spec.rb +334 -359
- data/spec/adapters/oracle_spec.rb +67 -69
- data/spec/adapters/postgres_spec.rb +1298 -1249
- data/spec/adapters/spec_helper.rb +2 -35
- data/spec/adapters/sqlanywhere_spec.rb +39 -39
- data/spec/adapters/sqlite_spec.rb +203 -200
- data/spec/bin_spec.rb +57 -59
- data/spec/core/connection_pool_spec.rb +402 -401
- data/spec/core/database_spec.rb +953 -944
- data/spec/core/dataset_spec.rb +2178 -2168
- data/spec/core/deprecated_spec.rb +19 -19
- data/spec/core/expression_filters_spec.rb +415 -415
- data/spec/core/mock_adapter_spec.rb +212 -212
- data/spec/core/object_graph_spec.rb +73 -73
- data/spec/core/placeholder_literalizer_spec.rb +71 -71
- data/spec/core/schema_generator_spec.rb +44 -44
- data/spec/core/schema_spec.rb +470 -472
- data/spec/core/spec_helper.rb +5 -20
- data/spec/core/version_spec.rb +2 -2
- data/spec/core_extensions_spec.rb +320 -320
- data/spec/extensions/accessed_columns_spec.rb +12 -12
- data/spec/extensions/active_model_spec.rb +3 -3
- data/spec/extensions/after_initialize_spec.rb +2 -2
- data/spec/extensions/arbitrary_servers_spec.rb +23 -23
- data/spec/extensions/association_dependencies_spec.rb +34 -34
- data/spec/extensions/association_pks_spec.rb +98 -98
- data/spec/extensions/association_proxies_spec.rb +33 -33
- data/spec/extensions/auto_validations_spec.rb +46 -46
- data/spec/extensions/blacklist_security_spec.rb +19 -18
- data/spec/extensions/blank_spec.rb +36 -36
- data/spec/extensions/boolean_readers_spec.rb +36 -36
- data/spec/extensions/caching_spec.rb +82 -82
- data/spec/extensions/class_table_inheritance_spec.rb +72 -72
- data/spec/extensions/column_conflicts_spec.rb +19 -14
- data/spec/extensions/column_select_spec.rb +19 -19
- data/spec/extensions/columns_introspection_spec.rb +43 -43
- data/spec/extensions/composition_spec.rb +64 -64
- data/spec/extensions/connection_validator_spec.rb +92 -90
- data/spec/extensions/constraint_validations_plugin_spec.rb +92 -92
- data/spec/extensions/constraint_validations_spec.rb +80 -80
- data/spec/extensions/core_refinements_spec.rb +220 -220
- data/spec/extensions/csv_serializer_spec.rb +44 -44
- data/spec/extensions/current_datetime_timestamp_spec.rb +8 -8
- data/spec/extensions/dataset_associations_spec.rb +65 -65
- data/spec/extensions/dataset_source_alias_spec.rb +16 -16
- data/spec/extensions/date_arithmetic_spec.rb +51 -58
- data/spec/extensions/defaults_setter_spec.rb +19 -19
- data/spec/extensions/delay_add_association_spec.rb +52 -0
- data/spec/extensions/dirty_spec.rb +51 -51
- data/spec/extensions/eager_each_spec.rb +8 -8
- data/spec/extensions/empty_array_ignore_nulls_spec.rb +10 -10
- data/spec/extensions/error_splitter_spec.rb +2 -2
- data/spec/extensions/error_sql_spec.rb +4 -4
- data/spec/extensions/eval_inspect_spec.rb +3 -3
- data/spec/extensions/filter_having_spec.rb +8 -8
- data/spec/extensions/force_encoding_spec.rb +30 -30
- data/spec/extensions/from_block_spec.rb +7 -7
- data/spec/extensions/graph_each_spec.rb +19 -19
- data/spec/extensions/hash_aliases_spec.rb +5 -5
- data/spec/extensions/hook_class_methods_spec.rb +100 -100
- data/spec/extensions/inflector_spec.rb +54 -54
- data/spec/extensions/input_transformer_spec.rb +10 -10
- data/spec/extensions/insert_returning_select_spec.rb +8 -8
- data/spec/extensions/instance_filters_spec.rb +26 -26
- data/spec/extensions/instance_hooks_spec.rb +85 -85
- data/spec/extensions/json_serializer_spec.rb +68 -68
- data/spec/extensions/lazy_attributes_spec.rb +49 -49
- data/spec/extensions/list_spec.rb +77 -75
- data/spec/extensions/looser_typecasting_spec.rb +16 -16
- data/spec/extensions/many_through_many_spec.rb +627 -627
- data/spec/extensions/meta_def_spec.rb +7 -7
- data/spec/extensions/migration_spec.rb +217 -217
- data/spec/extensions/modification_detection_spec.rb +20 -20
- data/spec/extensions/mssql_optimistic_locking_spec.rb +21 -21
- data/spec/extensions/named_timezones_spec.rb +18 -18
- data/spec/extensions/nested_attributes_spec.rb +107 -107
- data/spec/extensions/null_dataset_spec.rb +24 -24
- data/spec/extensions/optimistic_locking_spec.rb +21 -21
- data/spec/extensions/pagination_spec.rb +52 -52
- data/spec/extensions/pg_array_associations_spec.rb +273 -273
- data/spec/extensions/pg_array_ops_spec.rb +52 -52
- data/spec/extensions/pg_array_spec.rb +152 -152
- data/spec/extensions/pg_enum_spec.rb +13 -13
- data/spec/extensions/pg_hstore_ops_spec.rb +63 -63
- data/spec/extensions/pg_hstore_spec.rb +84 -84
- data/spec/extensions/pg_inet_spec.rb +15 -15
- data/spec/extensions/pg_interval_spec.rb +29 -29
- data/spec/extensions/pg_json_ops_spec.rb +86 -84
- data/spec/extensions/pg_json_spec.rb +104 -104
- data/spec/extensions/pg_loose_count_spec.rb +6 -6
- data/spec/extensions/pg_range_ops_spec.rb +24 -24
- data/spec/extensions/pg_range_spec.rb +143 -143
- data/spec/extensions/pg_row_ops_spec.rb +14 -14
- data/spec/extensions/pg_row_plugin_spec.rb +12 -12
- data/spec/extensions/pg_row_spec.rb +118 -118
- data/spec/extensions/pg_static_cache_updater_spec.rb +28 -28
- data/spec/extensions/pg_typecast_on_load_spec.rb +21 -21
- data/spec/extensions/prepared_statements_associations_spec.rb +42 -42
- data/spec/extensions/prepared_statements_safe_spec.rb +18 -18
- data/spec/extensions/prepared_statements_spec.rb +28 -28
- data/spec/extensions/prepared_statements_with_pk_spec.rb +11 -11
- data/spec/extensions/pretty_table_spec.rb +16 -16
- data/spec/extensions/query_literals_spec.rb +37 -37
- data/spec/extensions/query_spec.rb +32 -32
- data/spec/extensions/rcte_tree_spec.rb +141 -141
- data/spec/extensions/round_timestamps_spec.rb +21 -21
- data/spec/extensions/schema_caching_spec.rb +8 -8
- data/spec/extensions/schema_dumper_spec.rb +78 -78
- data/spec/extensions/schema_spec.rb +31 -27
- data/spec/extensions/scissors_spec.rb +3 -3
- data/spec/extensions/select_remove_spec.rb +14 -14
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +28 -28
- data/spec/extensions/serialization_modification_detection_spec.rb +33 -33
- data/spec/extensions/serialization_spec.rb +79 -78
- data/spec/extensions/server_block_spec.rb +17 -17
- data/spec/extensions/set_overrides_spec.rb +30 -30
- data/spec/extensions/sharding_spec.rb +65 -65
- data/spec/extensions/shared_caching_spec.rb +29 -29
- data/spec/extensions/single_table_inheritance_spec.rb +79 -79
- data/spec/extensions/skip_create_refresh_spec.rb +3 -3
- data/spec/extensions/spec_helper.rb +4 -29
- data/spec/extensions/split_array_nil_spec.rb +9 -9
- data/spec/extensions/split_values_spec.rb +7 -7
- data/spec/extensions/sql_expr_spec.rb +32 -32
- data/spec/extensions/static_cache_spec.rb +123 -123
- data/spec/extensions/string_date_time_spec.rb +34 -34
- data/spec/extensions/string_stripper_spec.rb +15 -15
- data/spec/extensions/subclasses_spec.rb +31 -31
- data/spec/extensions/table_select_spec.rb +15 -15
- data/spec/extensions/tactical_eager_loading_spec.rb +23 -23
- data/spec/extensions/thread_local_timezones_spec.rb +13 -13
- data/spec/extensions/timestamps_spec.rb +40 -40
- data/spec/extensions/to_dot_spec.rb +34 -34
- data/spec/extensions/touch_spec.rb +52 -52
- data/spec/extensions/tree_spec.rb +72 -72
- data/spec/extensions/typecast_on_load_spec.rb +25 -25
- data/spec/extensions/unlimited_update_spec.rb +2 -2
- data/spec/extensions/update_or_create_spec.rb +36 -36
- data/spec/extensions/update_primary_key_spec.rb +35 -35
- data/spec/extensions/update_refresh_spec.rb +41 -0
- data/spec/extensions/validate_associated_spec.rb +52 -0
- data/spec/extensions/validation_class_methods_spec.rb +314 -317
- data/spec/extensions/validation_helpers_spec.rb +195 -195
- data/spec/extensions/xml_serializer_spec.rb +48 -48
- data/spec/guards_helper.rb +55 -0
- data/spec/integration/associations_test.rb +1089 -1088
- data/spec/integration/database_test.rb +29 -29
- data/spec/integration/dataset_test.rb +661 -661
- data/spec/integration/eager_loader_test.rb +147 -147
- data/spec/integration/migrator_test.rb +122 -122
- data/spec/integration/model_test.rb +70 -70
- data/spec/integration/plugin_test.rb +682 -640
- data/spec/integration/prepared_statement_test.rb +172 -172
- data/spec/integration/schema_test.rb +245 -245
- data/spec/integration/spec_helper.rb +1 -64
- data/spec/integration/timezone_test.rb +17 -17
- data/spec/integration/transaction_test.rb +87 -87
- data/spec/integration/type_test.rb +33 -33
- data/spec/model/association_reflection_spec.rb +130 -121
- data/spec/model/associations_spec.rb +1112 -1113
- data/spec/model/base_spec.rb +197 -196
- data/spec/model/class_dataset_methods_spec.rb +118 -118
- data/spec/model/dataset_methods_spec.rb +49 -49
- data/spec/model/eager_loading_spec.rb +705 -702
- data/spec/model/hooks_spec.rb +169 -168
- data/spec/model/inflector_spec.rb +5 -5
- data/spec/model/model_spec.rb +287 -297
- data/spec/model/plugins_spec.rb +47 -47
- data/spec/model/record_spec.rb +534 -535
- data/spec/model/spec_helper.rb +3 -21
- data/spec/model/validations_spec.rb +72 -70
- data/spec/spec_config.rb +8 -0
- metadata +41 -9
- data/lib/sequel/adapters/fdbsql.rb +0 -286
- data/lib/sequel/adapters/jdbc/fdbsql.rb +0 -66
- data/lib/sequel/adapters/openbase.rb +0 -54
- data/lib/sequel/adapters/shared/fdbsql.rb +0 -550
- data/spec/adapters/fdbsql_spec.rb +0 -429
- data/spec/rspec_helper.rb +0 -22
data/spec/model/base_spec.rb
CHANGED
|
@@ -9,35 +9,35 @@ describe "Model attribute setters" do
|
|
|
9
9
|
DB.reset
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
it "refresh should return self" do
|
|
13
13
|
@o = @c[1]
|
|
14
|
-
@o.
|
|
15
|
-
@o.refresh.
|
|
14
|
+
def @o._refresh(*) [] end
|
|
15
|
+
@o.refresh.must_equal @o
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
it "should mark the column value as changed" do
|
|
19
|
-
@o.changed_columns.
|
|
19
|
+
@o.changed_columns.must_equal []
|
|
20
20
|
|
|
21
21
|
@o.x = 2
|
|
22
|
-
@o.changed_columns.
|
|
22
|
+
@o.changed_columns.must_equal [:x]
|
|
23
23
|
|
|
24
24
|
@o.y = 3
|
|
25
|
-
@o.changed_columns.
|
|
25
|
+
@o.changed_columns.must_equal [:x, :y]
|
|
26
26
|
|
|
27
27
|
@o.changed_columns.clear
|
|
28
28
|
|
|
29
29
|
@o[:x] = 2
|
|
30
|
-
@o.changed_columns.
|
|
30
|
+
@o.changed_columns.must_equal [:x]
|
|
31
31
|
|
|
32
32
|
@o[:y] = 3
|
|
33
|
-
@o.changed_columns.
|
|
33
|
+
@o.changed_columns.must_equal [:x, :y]
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
it "should handle columns that can't be called like normal ruby methods" do
|
|
37
37
|
@o.send(:"x y=", 3)
|
|
38
|
-
@o.changed_columns.
|
|
39
|
-
@o.values.
|
|
40
|
-
@o.send(:"x y").
|
|
38
|
+
@o.changed_columns.must_equal [:"x y"]
|
|
39
|
+
@o.values.must_equal(:"x y"=>3)
|
|
40
|
+
@o.send(:"x y").must_equal 3
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
43
|
|
|
@@ -51,13 +51,13 @@ describe "Model.def_column_alias" do
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
it "should create an getter alias for the column" do
|
|
54
|
-
@o.id2.
|
|
54
|
+
@o.id2.must_equal 1
|
|
55
55
|
end
|
|
56
56
|
|
|
57
57
|
it "should create an setter alias for the column" do
|
|
58
58
|
@o.id2 = 2
|
|
59
|
-
@o.id2.
|
|
60
|
-
@o.values.
|
|
59
|
+
@o.id2.must_equal 2
|
|
60
|
+
@o.values.must_equal(:id => 2)
|
|
61
61
|
end
|
|
62
62
|
end
|
|
63
63
|
|
|
@@ -74,32 +74,32 @@ describe Sequel::Model, "dataset" do
|
|
|
74
74
|
[:Elephant, :Maggot, :ShoeSize, :BootSize].each{|x| Object.send(:remove_const, x)}
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
Maggot.dataset.sql.
|
|
79
|
-
ShoeSize.dataset.sql.
|
|
77
|
+
it "should default to the plural of the class name" do
|
|
78
|
+
Maggot.dataset.sql.must_equal 'SELECT * FROM maggots'
|
|
79
|
+
ShoeSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
BootSize.dataset.sql.
|
|
82
|
+
it "should return the dataset for the superclass if available" do
|
|
83
|
+
BootSize.dataset.sql.must_equal 'SELECT * FROM shoe_sizes'
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
|
|
87
|
-
Elephant.dataset.sql.
|
|
88
|
-
@a.dataset.sql.
|
|
86
|
+
it "should return the correct dataset if set explicitly" do
|
|
87
|
+
Elephant.dataset.sql.must_equal 'SELECT * FROM ele1'
|
|
88
|
+
@a.dataset.sql.must_equal 'SELECT * FROM items'
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
proc {@b.dataset}.
|
|
91
|
+
it "should raise if no dataset is explicitly set and the class is anonymous" do
|
|
92
|
+
proc {@b.dataset}.must_raise(Sequel::Error)
|
|
93
93
|
end
|
|
94
94
|
|
|
95
|
-
|
|
95
|
+
it "should disregard namespaces for the table name" do
|
|
96
96
|
begin
|
|
97
97
|
module ::BlahBlah
|
|
98
98
|
class MwaHaHa < Sequel::Model
|
|
99
99
|
end
|
|
100
100
|
end
|
|
101
101
|
|
|
102
|
-
BlahBlah::MwaHaHa.dataset.sql.
|
|
102
|
+
BlahBlah::MwaHaHa.dataset.sql.must_equal 'SELECT * FROM mwa_ha_has'
|
|
103
103
|
ensure
|
|
104
104
|
Object.send(:remove_const, :BlahBlah)
|
|
105
105
|
end
|
|
@@ -113,14 +113,14 @@ describe Sequel::Model, ".def_dataset_method" do
|
|
|
113
113
|
|
|
114
114
|
it "should add a method to the dataset and model if called with a block argument" do
|
|
115
115
|
@c.def_dataset_method(:return_3){3}
|
|
116
|
-
@c.return_3.
|
|
117
|
-
@c.dataset.return_3.
|
|
116
|
+
@c.return_3.must_equal 3
|
|
117
|
+
@c.dataset.return_3.must_equal 3
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
it "should handle weird method names" do
|
|
121
121
|
@c.def_dataset_method(:"return 3"){3}
|
|
122
|
-
@c.send(:"return 3").
|
|
123
|
-
@c.dataset.send(:"return 3").
|
|
122
|
+
@c.send(:"return 3").must_equal 3
|
|
123
|
+
@c.dataset.send(:"return 3").must_equal 3
|
|
124
124
|
end
|
|
125
125
|
|
|
126
126
|
it "should not add a model method if the model already responds to the method" do
|
|
@@ -138,37 +138,37 @@ describe Sequel::Model, ".def_dataset_method" do
|
|
|
138
138
|
def_dataset_method(:foo){3}
|
|
139
139
|
def_dataset_method(:bar){4}
|
|
140
140
|
end
|
|
141
|
-
@c.foo.
|
|
142
|
-
@c.dataset.foo.
|
|
143
|
-
@c.send(:bar).
|
|
144
|
-
@c.dataset.bar.
|
|
141
|
+
@c.foo.must_equal 1
|
|
142
|
+
@c.dataset.foo.must_equal 3
|
|
143
|
+
@c.send(:bar).must_equal 2
|
|
144
|
+
@c.dataset.bar.must_equal 4
|
|
145
145
|
end
|
|
146
146
|
|
|
147
147
|
it "should add all passed methods to the model if called without a block argument" do
|
|
148
148
|
@c.def_dataset_method(:return_3, :return_4)
|
|
149
|
-
proc{@c.return_3}.
|
|
150
|
-
proc{@c.return_4}.
|
|
149
|
+
proc{@c.return_3}.must_raise(NoMethodError)
|
|
150
|
+
proc{@c.return_4}.must_raise(NoMethodError)
|
|
151
151
|
@c.dataset.instance_eval do
|
|
152
152
|
def return_3; 3; end
|
|
153
153
|
def return_4; 4; end
|
|
154
154
|
end
|
|
155
|
-
@c.return_3.
|
|
156
|
-
@c.return_4.
|
|
155
|
+
@c.return_3.must_equal 3
|
|
156
|
+
@c.return_4.must_equal 4
|
|
157
157
|
end
|
|
158
158
|
|
|
159
159
|
it "should cache calls and readd methods if set_dataset is used" do
|
|
160
160
|
@c.def_dataset_method(:return_3){3}
|
|
161
161
|
@c.set_dataset :items
|
|
162
|
-
@c.return_3.
|
|
163
|
-
@c.dataset.return_3.
|
|
162
|
+
@c.return_3.must_equal 3
|
|
163
|
+
@c.dataset.return_3.must_equal 3
|
|
164
164
|
end
|
|
165
165
|
|
|
166
166
|
it "should readd methods to subclasses, if set_dataset is used in a subclass" do
|
|
167
167
|
@c.def_dataset_method(:return_3){3}
|
|
168
168
|
c = Class.new(@c)
|
|
169
169
|
c.set_dataset :items
|
|
170
|
-
c.return_3.
|
|
171
|
-
c.dataset.return_3.
|
|
170
|
+
c.return_3.must_equal 3
|
|
171
|
+
c.dataset.return_3.must_equal 3
|
|
172
172
|
end
|
|
173
173
|
end
|
|
174
174
|
|
|
@@ -179,69 +179,69 @@ describe Sequel::Model, ".dataset_module" do
|
|
|
179
179
|
|
|
180
180
|
it "should extend the dataset with the module if the model has a dataset" do
|
|
181
181
|
@c.dataset_module{def return_3() 3 end}
|
|
182
|
-
@c.dataset.return_3.
|
|
182
|
+
@c.dataset.return_3.must_equal 3
|
|
183
183
|
end
|
|
184
184
|
|
|
185
185
|
it "should also extend the instance_dataset with the module if the model has a dataset" do
|
|
186
186
|
@c.dataset_module{def return_3() 3 end}
|
|
187
|
-
@c.instance_dataset.return_3.
|
|
187
|
+
@c.instance_dataset.return_3.must_equal 3
|
|
188
188
|
end
|
|
189
189
|
|
|
190
190
|
it "should add methods defined in the module to the class" do
|
|
191
191
|
@c.dataset_module{def return_3() 3 end}
|
|
192
|
-
@c.return_3.
|
|
192
|
+
@c.return_3.must_equal 3
|
|
193
193
|
end
|
|
194
194
|
|
|
195
195
|
it "should add methods defined in the module outside the block to the class" do
|
|
196
196
|
@c.dataset_module.module_eval{def return_3() 3 end}
|
|
197
|
-
@c.return_3.
|
|
197
|
+
@c.return_3.must_equal 3
|
|
198
198
|
end
|
|
199
199
|
|
|
200
200
|
it "should cache calls and readd methods if set_dataset is used" do
|
|
201
201
|
@c.dataset_module{def return_3() 3 end}
|
|
202
202
|
@c.set_dataset :items
|
|
203
|
-
@c.return_3.
|
|
204
|
-
@c.dataset.return_3.
|
|
203
|
+
@c.return_3.must_equal 3
|
|
204
|
+
@c.dataset.return_3.must_equal 3
|
|
205
205
|
end
|
|
206
206
|
|
|
207
207
|
it "should readd methods to subclasses, if set_dataset is used in a subclass" do
|
|
208
208
|
@c.dataset_module{def return_3() 3 end}
|
|
209
209
|
c = Class.new(@c)
|
|
210
210
|
c.set_dataset :items
|
|
211
|
-
c.return_3.
|
|
212
|
-
c.dataset.return_3.
|
|
211
|
+
c.return_3.must_equal 3
|
|
212
|
+
c.dataset.return_3.must_equal 3
|
|
213
213
|
end
|
|
214
214
|
|
|
215
215
|
it "should only have a single dataset_module per class" do
|
|
216
216
|
@c.dataset_module{def return_3() 3 end}
|
|
217
217
|
@c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
|
|
218
|
-
@c.return_3.
|
|
218
|
+
@c.return_3.must_equal 4
|
|
219
219
|
end
|
|
220
220
|
|
|
221
221
|
it "should not have subclasses share the dataset_module" do
|
|
222
222
|
@c.dataset_module{def return_3() 3 end}
|
|
223
223
|
c = Class.new(@c)
|
|
224
224
|
c.dataset_module{def return_3() 3 + (begin; super; rescue NoMethodError; 1; end) end}
|
|
225
|
-
c.return_3.
|
|
225
|
+
c.return_3.must_equal 6
|
|
226
226
|
end
|
|
227
227
|
|
|
228
228
|
it "should accept a module object and extend the dataset with it" do
|
|
229
229
|
@c.dataset_module Module.new{def return_3() 3 end}
|
|
230
|
-
@c.dataset.return_3.
|
|
230
|
+
@c.dataset.return_3.must_equal 3
|
|
231
231
|
end
|
|
232
232
|
|
|
233
233
|
it "should be able to call dataset_module with a module multiple times" do
|
|
234
234
|
@c.dataset_module Module.new{def return_3() 3 end}
|
|
235
235
|
@c.dataset_module Module.new{def return_4() 4 end}
|
|
236
|
-
@c.dataset.return_3.
|
|
237
|
-
@c.dataset.return_4.
|
|
236
|
+
@c.dataset.return_3.must_equal 3
|
|
237
|
+
@c.dataset.return_4.must_equal 4
|
|
238
238
|
end
|
|
239
239
|
|
|
240
240
|
it "should be able mix dataset_module calls with and without arguments" do
|
|
241
241
|
@c.dataset_module{def return_3() 3 end}
|
|
242
242
|
@c.dataset_module Module.new{def return_4() 4 end}
|
|
243
|
-
@c.dataset.return_3.
|
|
244
|
-
@c.dataset.return_4.
|
|
243
|
+
@c.dataset.return_3.must_equal 3
|
|
244
|
+
@c.dataset.return_4.must_equal 4
|
|
245
245
|
end
|
|
246
246
|
|
|
247
247
|
it "should have modules provided to dataset_module extend subclass datasets" do
|
|
@@ -249,26 +249,26 @@ describe Sequel::Model, ".dataset_module" do
|
|
|
249
249
|
@c.dataset_module Module.new{def return_4() 4 end}
|
|
250
250
|
c = Class.new(@c)
|
|
251
251
|
c.set_dataset :a
|
|
252
|
-
c.dataset.return_3.
|
|
253
|
-
c.dataset.return_4.
|
|
252
|
+
c.dataset.return_3.must_equal 3
|
|
253
|
+
c.dataset.return_4.must_equal 4
|
|
254
254
|
end
|
|
255
255
|
|
|
256
256
|
it "should return the dataset module if given a block" do
|
|
257
|
-
Object.new.extend(@c.dataset_module{def return_3() 3 end}).return_3.
|
|
257
|
+
Object.new.extend(@c.dataset_module{def return_3() 3 end}).return_3.must_equal 3
|
|
258
258
|
end
|
|
259
259
|
|
|
260
260
|
it "should return the argument if given one" do
|
|
261
|
-
Object.new.extend(@c.dataset_module Module.new{def return_3() 3 end}).return_3.
|
|
261
|
+
Object.new.extend(@c.dataset_module Module.new{def return_3() 3 end}).return_3.must_equal 3
|
|
262
262
|
end
|
|
263
263
|
|
|
264
264
|
it "should have dataset_module support a subset method" do
|
|
265
265
|
@c.dataset_module{subset :released, :released}
|
|
266
|
-
@c.released.sql.
|
|
267
|
-
@c.where(:foo).released.sql.
|
|
266
|
+
@c.released.sql.must_equal 'SELECT * FROM items WHERE released'
|
|
267
|
+
@c.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
|
|
268
268
|
end
|
|
269
269
|
|
|
270
270
|
it "should raise error if called with both an argument and ablock" do
|
|
271
|
-
proc{@c.dataset_module(Module.new{def return_3() 3 end}){}}.
|
|
271
|
+
proc{@c.dataset_module(Module.new{def return_3() 3 end}){}}.must_raise(Sequel::Error)
|
|
272
272
|
end
|
|
273
273
|
end
|
|
274
274
|
|
|
@@ -281,8 +281,8 @@ describe "A model class with implicit table name" do
|
|
|
281
281
|
Object.send(:remove_const, :Donkey)
|
|
282
282
|
end
|
|
283
283
|
|
|
284
|
-
|
|
285
|
-
Donkey.dataset.model.
|
|
284
|
+
it "should have a dataset associated with the model class" do
|
|
285
|
+
Donkey.dataset.model.must_equal Donkey
|
|
286
286
|
end
|
|
287
287
|
end
|
|
288
288
|
|
|
@@ -296,9 +296,9 @@ describe "A model inheriting from a model" do
|
|
|
296
296
|
Object.send(:remove_const, :Feline)
|
|
297
297
|
end
|
|
298
298
|
|
|
299
|
-
|
|
300
|
-
Feline.dataset.model.
|
|
301
|
-
Leopard.dataset.model.
|
|
299
|
+
it "should have a dataset associated with itself" do
|
|
300
|
+
Feline.dataset.model.must_equal Feline
|
|
301
|
+
Leopard.dataset.model.must_equal Leopard
|
|
302
302
|
end
|
|
303
303
|
end
|
|
304
304
|
|
|
@@ -307,21 +307,21 @@ describe "Model.primary_key" do
|
|
|
307
307
|
@c = Class.new(Sequel::Model)
|
|
308
308
|
end
|
|
309
309
|
|
|
310
|
-
|
|
311
|
-
@c.primary_key.
|
|
310
|
+
it "should default to id" do
|
|
311
|
+
@c.primary_key.must_equal :id
|
|
312
312
|
end
|
|
313
313
|
|
|
314
|
-
|
|
314
|
+
it "should be overridden by set_primary_key" do
|
|
315
315
|
@c.set_primary_key :cid
|
|
316
|
-
@c.primary_key.
|
|
316
|
+
@c.primary_key.must_equal :cid
|
|
317
317
|
|
|
318
318
|
@c.set_primary_key([:id1, :id2])
|
|
319
|
-
@c.primary_key.
|
|
319
|
+
@c.primary_key.must_equal [:id1, :id2]
|
|
320
320
|
end
|
|
321
321
|
|
|
322
|
-
|
|
322
|
+
it "should use nil for no primary key" do
|
|
323
323
|
@c.no_primary_key
|
|
324
|
-
@c.primary_key.
|
|
324
|
+
@c.primary_key.must_equal nil
|
|
325
325
|
end
|
|
326
326
|
end
|
|
327
327
|
|
|
@@ -330,18 +330,18 @@ describe "Model.primary_key_hash" do
|
|
|
330
330
|
@c = Class.new(Sequel::Model)
|
|
331
331
|
end
|
|
332
332
|
|
|
333
|
-
|
|
334
|
-
@c.primary_key_hash(1).
|
|
333
|
+
it "should handle a single primary key" do
|
|
334
|
+
@c.primary_key_hash(1).must_equal(:id=>1)
|
|
335
335
|
end
|
|
336
336
|
|
|
337
|
-
|
|
337
|
+
it "should handle a composite primary key" do
|
|
338
338
|
@c.set_primary_key([:id1, :id2])
|
|
339
|
-
@c.primary_key_hash([1, 2]).
|
|
339
|
+
@c.primary_key_hash([1, 2]).must_equal(:id1=>1, :id2=>2)
|
|
340
340
|
end
|
|
341
341
|
|
|
342
|
-
|
|
342
|
+
it "should raise an error for no primary key" do
|
|
343
343
|
@c.no_primary_key
|
|
344
|
-
proc{@c.primary_key_hash(1)}.
|
|
344
|
+
proc{@c.primary_key_hash(1)}.must_raise(Sequel::Error)
|
|
345
345
|
end
|
|
346
346
|
end
|
|
347
347
|
|
|
@@ -350,24 +350,24 @@ describe "Model.qualified_primary_key_hash" do
|
|
|
350
350
|
@c = Class.new(Sequel::Model(:items))
|
|
351
351
|
end
|
|
352
352
|
|
|
353
|
-
|
|
354
|
-
@c.qualified_primary_key_hash(1).
|
|
353
|
+
it "should handle a single primary key" do
|
|
354
|
+
@c.qualified_primary_key_hash(1).must_equal(Sequel.qualify(:items, :id)=>1)
|
|
355
355
|
end
|
|
356
356
|
|
|
357
|
-
|
|
357
|
+
it "should handle a composite primary key" do
|
|
358
358
|
@c.set_primary_key([:id1, :id2])
|
|
359
|
-
@c.qualified_primary_key_hash([1, 2]).
|
|
359
|
+
@c.qualified_primary_key_hash([1, 2]).must_equal(Sequel.qualify(:items, :id1)=>1, Sequel.qualify(:items, :id2)=>2)
|
|
360
360
|
end
|
|
361
361
|
|
|
362
|
-
|
|
362
|
+
it "should raise an error for no primary key" do
|
|
363
363
|
@c.no_primary_key
|
|
364
|
-
proc{@c.qualified_primary_key_hash(1)}.
|
|
364
|
+
proc{@c.qualified_primary_key_hash(1)}.must_raise(Sequel::Error)
|
|
365
365
|
end
|
|
366
366
|
|
|
367
|
-
|
|
368
|
-
@c.qualified_primary_key_hash(1, :apple).
|
|
367
|
+
it "should allow specifying a different qualifier" do
|
|
368
|
+
@c.qualified_primary_key_hash(1, :apple).must_equal(Sequel.qualify(:apple, :id)=>1)
|
|
369
369
|
@c.set_primary_key([:id1, :id2])
|
|
370
|
-
@c.qualified_primary_key_hash([1, 2], :bear).
|
|
370
|
+
@c.qualified_primary_key_hash([1, 2], :bear).must_equal(Sequel.qualify(:bear, :id1)=>1, Sequel.qualify(:bear, :id2)=>2)
|
|
371
371
|
end
|
|
372
372
|
end
|
|
373
373
|
|
|
@@ -380,40 +380,40 @@ describe "Model.db" do
|
|
|
380
380
|
Sequel::DATABASES.clear
|
|
381
381
|
end
|
|
382
382
|
after do
|
|
383
|
-
Sequel::Model.instance_variable_get(:@db).
|
|
383
|
+
Sequel::Model.instance_variable_get(:@db).must_equal nil
|
|
384
384
|
Sequel::DATABASES.replace(@databases)
|
|
385
385
|
Sequel::Model.db = @model_db
|
|
386
386
|
end
|
|
387
387
|
|
|
388
|
-
|
|
388
|
+
it "should be required when creating named model classes" do
|
|
389
389
|
begin
|
|
390
|
-
proc{class ModelTest < Sequel::Model; end}.
|
|
390
|
+
proc{class ModelTest < Sequel::Model; end}.must_raise(Sequel::Error)
|
|
391
391
|
ensure
|
|
392
392
|
Object.send(:remove_const, :ModelTest)
|
|
393
393
|
end
|
|
394
394
|
end
|
|
395
395
|
|
|
396
|
-
|
|
397
|
-
proc{Sequel::Model(:foo)}.
|
|
396
|
+
it "should be required when creating anonymous model classes without a database" do
|
|
397
|
+
proc{Sequel::Model(:foo)}.must_raise(Sequel::Error)
|
|
398
398
|
end
|
|
399
399
|
|
|
400
|
-
|
|
401
|
-
Sequel::Model(@db).db.
|
|
402
|
-
Sequel::Model(@db[:foo]).db.
|
|
400
|
+
it "should not be required when creating anonymous model classes with a database" do
|
|
401
|
+
Sequel::Model(@db).db.must_equal @db
|
|
402
|
+
Sequel::Model(@db[:foo]).db.must_equal @db
|
|
403
403
|
end
|
|
404
404
|
|
|
405
|
-
|
|
405
|
+
it "should work correctly when subclassing anonymous model classes with a database" do
|
|
406
406
|
begin
|
|
407
|
-
Class.new(Sequel::Model(@db)).db.
|
|
408
|
-
Class.new(Sequel::Model(@db[:foo])).db.
|
|
407
|
+
Class.new(Sequel::Model(@db)).db.must_equal @db
|
|
408
|
+
Class.new(Sequel::Model(@db[:foo])).db.must_equal @db
|
|
409
409
|
class ModelTest < Sequel::Model(@db)
|
|
410
|
-
db.
|
|
410
|
+
db.must_equal @db
|
|
411
411
|
end
|
|
412
412
|
class ModelTest2 < Sequel::Model(@db[:foo])
|
|
413
|
-
db.
|
|
413
|
+
db.must_equal @db
|
|
414
414
|
end
|
|
415
415
|
ModelTest.instance_variable_set(:@db, nil)
|
|
416
|
-
ModelTest.db.
|
|
416
|
+
ModelTest.db.must_equal @db
|
|
417
417
|
ensure
|
|
418
418
|
Object.send(:remove_const, :ModelTest)
|
|
419
419
|
Object.send(:remove_const, :ModelTest2)
|
|
@@ -429,21 +429,21 @@ describe "Model.db=" do
|
|
|
429
429
|
@m = Class.new(Sequel::Model(@db1[:blue].filter(:x=>1)))
|
|
430
430
|
end
|
|
431
431
|
|
|
432
|
-
|
|
432
|
+
it "should affect the underlying dataset" do
|
|
433
433
|
@m.db = @db2
|
|
434
434
|
|
|
435
|
-
@m.dataset.db.
|
|
436
|
-
@m.dataset.db.
|
|
435
|
+
@m.dataset.db.must_equal @db2
|
|
436
|
+
@m.dataset.db.wont_equal @db1
|
|
437
437
|
end
|
|
438
438
|
|
|
439
|
-
|
|
439
|
+
it "should keep the same dataset options" do
|
|
440
440
|
@m.db = @db2
|
|
441
|
-
@m.dataset.sql.
|
|
441
|
+
@m.dataset.sql.must_equal 'SELECT * FROM blue WHERE (x = 1)'
|
|
442
442
|
end
|
|
443
443
|
|
|
444
|
-
|
|
444
|
+
it "should use the database for subclasses" do
|
|
445
445
|
@m.db = @db2
|
|
446
|
-
Class.new(@m).db.
|
|
446
|
+
Class.new(@m).db.must_equal @db2
|
|
447
447
|
end
|
|
448
448
|
end
|
|
449
449
|
|
|
@@ -454,28 +454,29 @@ describe Sequel::Model, ".(allowed|restricted)_columns " do
|
|
|
454
454
|
end
|
|
455
455
|
@c.strict_param_setting = false
|
|
456
456
|
@c.instance_variable_set(:@columns, [:x, :y, :z])
|
|
457
|
+
DB.reset
|
|
457
458
|
end
|
|
458
459
|
|
|
459
460
|
it "should set the allowed columns correctly" do
|
|
460
|
-
@c.allowed_columns.
|
|
461
|
+
@c.allowed_columns.must_equal nil
|
|
461
462
|
@c.set_allowed_columns :x
|
|
462
|
-
@c.allowed_columns.
|
|
463
|
+
@c.allowed_columns.must_equal [:x]
|
|
463
464
|
@c.set_allowed_columns :x, :y
|
|
464
|
-
@c.allowed_columns.
|
|
465
|
+
@c.allowed_columns.must_equal [:x, :y]
|
|
465
466
|
end
|
|
466
467
|
|
|
467
468
|
it "should only set allowed columns by default" do
|
|
468
469
|
@c.set_allowed_columns :x, :y
|
|
469
470
|
i = @c.new(:x => 1, :y => 2, :z => 3)
|
|
470
|
-
i.values.
|
|
471
|
+
i.values.must_equal(:x => 1, :y => 2)
|
|
471
472
|
i.set(:x => 4, :y => 5, :z => 6)
|
|
472
|
-
i.values.
|
|
473
|
+
i.values.must_equal(:x => 4, :y => 5)
|
|
473
474
|
|
|
474
475
|
@c.instance_dataset._fetch = @c.dataset._fetch = {:x => 7}
|
|
475
476
|
i = @c.new
|
|
476
477
|
i.update(:x => 7, :z => 9)
|
|
477
|
-
i.values.
|
|
478
|
-
DB.sqls.
|
|
478
|
+
i.values.must_equal(:x => 7)
|
|
479
|
+
DB.sqls.must_equal ["INSERT INTO blahblah (x) VALUES (7)", "SELECT * FROM blahblah WHERE (id = 10) LIMIT 1"]
|
|
479
480
|
end
|
|
480
481
|
end
|
|
481
482
|
|
|
@@ -490,30 +491,30 @@ describe Sequel::Model, ".(un)?restrict_primary_key\\??" do
|
|
|
490
491
|
|
|
491
492
|
it "should restrict updates to primary key by default" do
|
|
492
493
|
i = @c.new(:x => 1, :y => 2, :id => 3)
|
|
493
|
-
i.values.
|
|
494
|
+
i.values.must_equal(:x => 1, :y => 2)
|
|
494
495
|
i.set(:x => 4, :y => 5, :id => 6)
|
|
495
|
-
i.values.
|
|
496
|
+
i.values.must_equal(:x => 4, :y => 5)
|
|
496
497
|
end
|
|
497
498
|
|
|
498
499
|
it "should allow updates to primary key if unrestrict_primary_key is used" do
|
|
499
500
|
@c.unrestrict_primary_key
|
|
500
501
|
i = @c.new(:x => 1, :y => 2, :id => 3)
|
|
501
|
-
i.values.
|
|
502
|
+
i.values.must_equal(:x => 1, :y => 2, :id=>3)
|
|
502
503
|
i.set(:x => 4, :y => 5, :id => 6)
|
|
503
|
-
i.values.
|
|
504
|
+
i.values.must_equal(:x => 4, :y => 5, :id=>6)
|
|
504
505
|
end
|
|
505
506
|
|
|
506
507
|
it "should have restrict_primary_key? return true or false depending" do
|
|
507
|
-
@c.restrict_primary_key?.
|
|
508
|
+
@c.restrict_primary_key?.must_equal true
|
|
508
509
|
@c.unrestrict_primary_key
|
|
509
|
-
@c.restrict_primary_key?.
|
|
510
|
+
@c.restrict_primary_key?.must_equal false
|
|
510
511
|
c1 = Class.new(@c)
|
|
511
|
-
c1.restrict_primary_key?.
|
|
512
|
+
c1.restrict_primary_key?.must_equal false
|
|
512
513
|
@c.restrict_primary_key
|
|
513
|
-
@c.restrict_primary_key?.
|
|
514
|
-
c1.restrict_primary_key?.
|
|
514
|
+
@c.restrict_primary_key?.must_equal true
|
|
515
|
+
c1.restrict_primary_key?.must_equal false
|
|
515
516
|
c2 = Class.new(@c)
|
|
516
|
-
c2.restrict_primary_key?.
|
|
517
|
+
c2.restrict_primary_key?.must_equal true
|
|
517
518
|
end
|
|
518
519
|
end
|
|
519
520
|
|
|
@@ -526,25 +527,25 @@ describe Sequel::Model, ".strict_param_setting" do
|
|
|
526
527
|
end
|
|
527
528
|
|
|
528
529
|
it "should be enabled by default" do
|
|
529
|
-
@c.strict_param_setting.
|
|
530
|
+
@c.strict_param_setting.must_equal true
|
|
530
531
|
end
|
|
531
532
|
|
|
532
533
|
it "should raise an error if a missing/restricted column/method is accessed" do
|
|
533
|
-
proc{@c.new(:z=>1)}.
|
|
534
|
-
proc{@c.create(:z=>1)}.
|
|
534
|
+
proc{@c.new(:z=>1)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
535
|
+
proc{@c.create(:z=>1)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
535
536
|
c = @c.new
|
|
536
|
-
proc{c.set(:z=>1)}.
|
|
537
|
-
proc{c.set_all(:use_after_commit_rollback => false)}.
|
|
538
|
-
proc{c.set_only({:x=>1}, :y)}.
|
|
539
|
-
proc{c.update(:z=>1)}.
|
|
540
|
-
proc{c.update_all(:use_after_commit_rollback=>false)}.
|
|
541
|
-
proc{c.update_only({:x=>1}, :y)}.
|
|
537
|
+
proc{c.set(:z=>1)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
538
|
+
proc{c.set_all(:use_after_commit_rollback => false)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
539
|
+
proc{c.set_only({:x=>1}, :y)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
540
|
+
proc{c.update(:z=>1)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
541
|
+
proc{c.update_all(:use_after_commit_rollback=>false)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
542
|
+
proc{c.update_only({:x=>1}, :y)}.must_raise(Sequel::MassAssignmentRestriction)
|
|
542
543
|
end
|
|
543
544
|
|
|
544
545
|
it "should be disabled by strict_param_setting = false" do
|
|
545
546
|
@c.strict_param_setting = false
|
|
546
|
-
@c.strict_param_setting.
|
|
547
|
-
|
|
547
|
+
@c.strict_param_setting.must_equal false
|
|
548
|
+
@c.new(:z=>1)
|
|
548
549
|
end
|
|
549
550
|
end
|
|
550
551
|
|
|
@@ -560,18 +561,18 @@ describe Sequel::Model, ".require_modification" do
|
|
|
560
561
|
end
|
|
561
562
|
|
|
562
563
|
it "should depend on whether the dataset provides an accurate number of rows matched by default" do
|
|
563
|
-
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.
|
|
564
|
-
Class.new(Sequel::Model).set_dataset(@ds2).require_modification.
|
|
564
|
+
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
|
|
565
|
+
Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
|
|
565
566
|
end
|
|
566
567
|
|
|
567
568
|
it "should obey global setting regardless of dataset support if set" do
|
|
568
569
|
Sequel::Model.require_modification = true
|
|
569
|
-
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.
|
|
570
|
-
Class.new(Sequel::Model).set_dataset(@ds2).require_modification.
|
|
570
|
+
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal true
|
|
571
|
+
Class.new(Sequel::Model).set_dataset(@ds2).require_modification.must_equal true
|
|
571
572
|
|
|
572
573
|
Sequel::Model.require_modification = false
|
|
573
|
-
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.
|
|
574
|
-
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.
|
|
574
|
+
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
|
|
575
|
+
Class.new(Sequel::Model).set_dataset(@ds1).require_modification.must_equal false
|
|
575
576
|
end
|
|
576
577
|
end
|
|
577
578
|
|
|
@@ -586,73 +587,73 @@ describe Sequel::Model, ".[] optimization" do
|
|
|
586
587
|
|
|
587
588
|
it "should set simple_pk to the literalized primary key column name if a single primary key" do
|
|
588
589
|
@c.set_primary_key :id
|
|
589
|
-
@c.simple_pk.
|
|
590
|
+
@c.simple_pk.must_equal '"id"'
|
|
590
591
|
@c.set_primary_key :b
|
|
591
|
-
@c.simple_pk.
|
|
592
|
+
@c.simple_pk.must_equal '"b"'
|
|
592
593
|
@c.set_primary_key Sequel.identifier(:b__a)
|
|
593
|
-
@c.simple_pk.
|
|
594
|
+
@c.simple_pk.must_equal '"b__a"'
|
|
594
595
|
end
|
|
595
596
|
|
|
596
597
|
it "should have simple_pk be blank if compound or no primary key" do
|
|
597
598
|
@c.no_primary_key
|
|
598
|
-
@c.simple_pk.
|
|
599
|
+
@c.simple_pk.must_equal nil
|
|
599
600
|
@c.set_primary_key [:b, :a]
|
|
600
|
-
@c.simple_pk.
|
|
601
|
+
@c.simple_pk.must_equal nil
|
|
601
602
|
end
|
|
602
603
|
|
|
603
604
|
it "should have simple table set if passed a Symbol to set_dataset" do
|
|
604
605
|
@c.set_dataset :a
|
|
605
|
-
@c.simple_table.
|
|
606
|
+
@c.simple_table.must_equal '"a"'
|
|
606
607
|
@c.set_dataset :b
|
|
607
|
-
@c.simple_table.
|
|
608
|
+
@c.simple_table.must_equal '"b"'
|
|
608
609
|
@c.set_dataset :b__a
|
|
609
|
-
@c.simple_table.
|
|
610
|
+
@c.simple_table.must_equal '"b"."a"'
|
|
610
611
|
end
|
|
611
612
|
|
|
612
613
|
it "should have simple_table set if passed a simple select all dataset to set_dataset" do
|
|
613
614
|
@c.set_dataset @db[:a]
|
|
614
|
-
@c.simple_table.
|
|
615
|
+
@c.simple_table.must_equal '"a"'
|
|
615
616
|
@c.set_dataset @db[:b]
|
|
616
|
-
@c.simple_table.
|
|
617
|
+
@c.simple_table.must_equal '"b"'
|
|
617
618
|
@c.set_dataset @db[:b__a]
|
|
618
|
-
@c.simple_table.
|
|
619
|
+
@c.simple_table.must_equal '"b"."a"'
|
|
619
620
|
end
|
|
620
621
|
|
|
621
622
|
it "should have simple_pk and simple_table respect dataset's identifier input methods" do
|
|
622
623
|
ds = @db[:ab]
|
|
623
624
|
ds.identifier_input_method = :reverse
|
|
624
625
|
@c.set_dataset ds
|
|
625
|
-
@c.simple_table.
|
|
626
|
+
@c.simple_table.must_equal '"ba"'
|
|
626
627
|
@c.set_primary_key :cd
|
|
627
|
-
@c.simple_pk.
|
|
628
|
+
@c.simple_pk.must_equal '"dc"'
|
|
628
629
|
|
|
629
630
|
@c.set_dataset ds.from(:ef__gh)
|
|
630
|
-
@c.simple_table.
|
|
631
|
+
@c.simple_table.must_equal '"fe"."hg"'
|
|
631
632
|
end
|
|
632
633
|
|
|
633
634
|
it "should have simple_table = nil if passed a non-simple select all dataset to set_dataset" do
|
|
634
635
|
@c.set_dataset @c.db[:a].filter(:active)
|
|
635
|
-
@c.simple_table.
|
|
636
|
+
@c.simple_table.must_equal nil
|
|
636
637
|
end
|
|
637
638
|
|
|
638
639
|
it "should have simple_table inherit superclass's setting" do
|
|
639
|
-
Class.new(@c).simple_table.
|
|
640
|
+
Class.new(@c).simple_table.must_equal nil
|
|
640
641
|
@c.set_dataset :a
|
|
641
|
-
Class.new(@c).simple_table.
|
|
642
|
+
Class.new(@c).simple_table.must_equal '"a"'
|
|
642
643
|
end
|
|
643
644
|
|
|
644
645
|
it "should use Dataset#with_sql if simple_table and simple_pk are true" do
|
|
645
646
|
@c.set_dataset :a
|
|
646
647
|
@c.instance_dataset._fetch = @c.dataset._fetch = {:id => 1}
|
|
647
|
-
@c[1].
|
|
648
|
-
@db.sqls.
|
|
648
|
+
@c[1].must_equal @c.load(:id=>1)
|
|
649
|
+
@db.sqls.must_equal ['SELECT * FROM "a" WHERE "id" = 1']
|
|
649
650
|
end
|
|
650
651
|
|
|
651
652
|
it "should not use Dataset#with_sql if either simple_table or simple_pk is nil" do
|
|
652
653
|
@c.set_dataset @db[:a].filter(:active)
|
|
653
654
|
@c.dataset._fetch = {:id => 1}
|
|
654
|
-
@c[1].
|
|
655
|
-
@db.sqls.
|
|
655
|
+
@c[1].must_equal @c.load(:id=>1)
|
|
656
|
+
@db.sqls.must_equal ['SELECT * FROM "a" WHERE ("active" AND ("id" = 1)) LIMIT 1']
|
|
656
657
|
end
|
|
657
658
|
end
|
|
658
659
|
|
|
@@ -665,31 +666,31 @@ describe "Model datasets #with_pk with #with_pk!" do
|
|
|
665
666
|
end
|
|
666
667
|
|
|
667
668
|
it "should be callable on the model class with optimized SQL" do
|
|
668
|
-
@c.with_pk(1).
|
|
669
|
-
DB.sqls.
|
|
670
|
-
@c.with_pk!(1).
|
|
671
|
-
DB.sqls.
|
|
669
|
+
@c.with_pk(1).must_equal @c.load(:id=>1)
|
|
670
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
|
|
671
|
+
@c.with_pk!(1).must_equal @c.load(:id=>1)
|
|
672
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
|
|
672
673
|
end
|
|
673
674
|
|
|
674
675
|
it "should return the first record where the primary key matches" do
|
|
675
|
-
@ds.with_pk(1).
|
|
676
|
-
DB.sqls.
|
|
677
|
-
@ds.with_pk!(1).
|
|
678
|
-
DB.sqls.
|
|
676
|
+
@ds.with_pk(1).must_equal @c.load(:id=>1)
|
|
677
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
678
|
+
@ds.with_pk!(1).must_equal @c.load(:id=>1)
|
|
679
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
679
680
|
end
|
|
680
681
|
|
|
681
682
|
it "should handle existing filters" do
|
|
682
683
|
@ds.filter(:a=>2).with_pk(1)
|
|
683
|
-
DB.sqls.
|
|
684
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
|
|
684
685
|
@ds.filter(:a=>2).with_pk!(1)
|
|
685
|
-
DB.sqls.
|
|
686
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
|
|
686
687
|
end
|
|
687
688
|
|
|
688
689
|
it "should work with string values" do
|
|
689
690
|
@ds.with_pk("foo")
|
|
690
|
-
DB.sqls.
|
|
691
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
|
|
691
692
|
@ds.with_pk!("foo")
|
|
692
|
-
DB.sqls.
|
|
693
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
|
|
693
694
|
end
|
|
694
695
|
|
|
695
696
|
it "should handle an array for composite primary keys" do
|
|
@@ -697,40 +698,40 @@ describe "Model datasets #with_pk with #with_pk!" do
|
|
|
697
698
|
@ds.with_pk([1, 2])
|
|
698
699
|
sqls = DB.sqls
|
|
699
700
|
["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1",
|
|
700
|
-
"SELECT * FROM a WHERE ((a.id2 = 2) AND (a.id1 = 1)) LIMIT 1"].
|
|
701
|
-
sqls.
|
|
701
|
+
"SELECT * FROM a WHERE ((a.id2 = 2) AND (a.id1 = 1)) LIMIT 1"].must_include(sqls.pop)
|
|
702
|
+
sqls.must_equal []
|
|
702
703
|
|
|
703
704
|
@ds.with_pk!([1, 2])
|
|
704
705
|
sqls = DB.sqls
|
|
705
706
|
["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1",
|
|
706
|
-
"SELECT * FROM a WHERE ((a.id2 = 2) AND (a.id1 = 1)) LIMIT 1"].
|
|
707
|
-
sqls.
|
|
707
|
+
"SELECT * FROM a WHERE ((a.id2 = 2) AND (a.id1 = 1)) LIMIT 1"].must_include(sqls.pop)
|
|
708
|
+
sqls.must_equal []
|
|
708
709
|
end
|
|
709
710
|
|
|
710
711
|
it "should have with_pk return nil and with_pk! raise if no rows match" do
|
|
711
712
|
@ds._fetch = []
|
|
712
|
-
@ds.with_pk(1).
|
|
713
|
-
DB.sqls.
|
|
714
|
-
proc{@ds.with_pk!(1)}.
|
|
715
|
-
DB.sqls.
|
|
713
|
+
@ds.with_pk(1).must_equal nil
|
|
714
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
715
|
+
proc{@ds.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
|
|
716
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
716
717
|
end
|
|
717
718
|
|
|
718
719
|
it "should have with_pk return nil and with_pk! raise if no rows match when calling the class method" do
|
|
719
720
|
@ds._fetch = []
|
|
720
|
-
@c.with_pk(1).
|
|
721
|
-
DB.sqls.
|
|
722
|
-
proc{@c.with_pk!(1)}.
|
|
723
|
-
DB.sqls.
|
|
721
|
+
@c.with_pk(1).must_equal nil
|
|
722
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
|
|
723
|
+
proc{@c.with_pk!(1)}.must_raise(Sequel::NoMatchingRow)
|
|
724
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE id = 1"]
|
|
724
725
|
end
|
|
725
726
|
|
|
726
727
|
it "should have #[] consider an integer as a primary key lookup" do
|
|
727
|
-
@ds[1].
|
|
728
|
-
DB.sqls.
|
|
728
|
+
@ds[1].must_equal @c.load(:id=>1)
|
|
729
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
|
|
729
730
|
end
|
|
730
731
|
|
|
731
732
|
it "should not have #[] consider a string as a primary key lookup" do
|
|
732
|
-
@ds['foo'].
|
|
733
|
-
DB.sqls.
|
|
733
|
+
@ds['foo'].must_equal @c.load(:id=>1)
|
|
734
|
+
DB.sqls.must_equal ["SELECT * FROM a WHERE (foo) LIMIT 1"]
|
|
734
735
|
end
|
|
735
736
|
end
|
|
736
737
|
|
|
@@ -741,6 +742,6 @@ describe "Model::include" do
|
|
|
741
742
|
including_class = Class.new(Sequel::Model(:items)) do
|
|
742
743
|
include(mod1, mod2)
|
|
743
744
|
end
|
|
744
|
-
including_class.included_modules.
|
|
745
|
+
including_class.included_modules.must_include(mod1, mod2)
|
|
745
746
|
end
|
|
746
747
|
end
|