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
|
@@ -19,9 +19,9 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
19
19
|
Object.send(:remove_const, :StiTest)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
StiTest.simple_table.
|
|
24
|
-
StiTestSub1.simple_table.
|
|
22
|
+
it "should have simple_table = nil" do
|
|
23
|
+
StiTest.simple_table.must_equal "sti_tests"
|
|
24
|
+
StiTestSub1.simple_table.must_equal nil
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
it "should allow changing the inheritance column via a plugin :single_table_inheritance call" do
|
|
@@ -31,31 +31,31 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
31
31
|
class ::StiTestSub1 < StiTest; end
|
|
32
32
|
class ::StiTestSub2 < StiTest; end
|
|
33
33
|
@ds._fetch = [{:blah=>'StiTest'}, {:blah=>'StiTestSub1'}, {:blah=>'StiTestSub2'}]
|
|
34
|
-
StiTest.all.collect{|x| x.class}.
|
|
35
|
-
StiTest.dataset.sql.
|
|
36
|
-
StiTestSub1.dataset.sql.
|
|
37
|
-
StiTestSub2.dataset.sql.
|
|
34
|
+
StiTest.all.collect{|x| x.class}.must_equal [StiTest, StiTestSub1, StiTestSub2]
|
|
35
|
+
StiTest.dataset.sql.must_equal "SELECT * FROM sti_tests"
|
|
36
|
+
StiTestSub1.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.blah IN ('StiTestSub1'))"
|
|
37
|
+
StiTestSub2.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.blah IN ('StiTestSub2'))"
|
|
38
38
|
end
|
|
39
39
|
|
|
40
40
|
it "should return rows with the correct class based on the polymorphic_key value" do
|
|
41
41
|
@ds._fetch = [{:kind=>'StiTest'}, {:kind=>'StiTestSub1'}, {:kind=>'StiTestSub2'}]
|
|
42
|
-
StiTest.all.collect{|x| x.class}.
|
|
42
|
+
StiTest.all.collect{|x| x.class}.must_equal [StiTest, StiTestSub1, StiTestSub2]
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
it "should return rows with the correct class based on the polymorphic_key value when retreiving by primary key" do
|
|
46
46
|
@ds._fetch = [{:kind=>'StiTestSub1'}]
|
|
47
|
-
StiTest[1].class.
|
|
47
|
+
StiTest[1].class.must_equal StiTestSub1
|
|
48
48
|
end
|
|
49
49
|
|
|
50
50
|
it "should return rows with the correct class for subclasses based on the polymorphic_key value" do
|
|
51
51
|
class ::StiTestSub1Sub < StiTestSub1; end
|
|
52
52
|
StiTestSub1.dataset._fetch = [{:kind=>'StiTestSub1'}, {:kind=>'StiTestSub1Sub'}]
|
|
53
|
-
StiTestSub1.all.collect{|x| x.class}.
|
|
53
|
+
StiTestSub1.all.collect{|x| x.class}.must_equal [StiTestSub1, StiTestSub1Sub]
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
it "should fallback to the main class if the given class does not exist" do
|
|
57
57
|
@ds._fetch = {:kind=>'StiTestSub3'}
|
|
58
|
-
StiTest.all.collect{|x| x.class}.
|
|
58
|
+
StiTest.all.collect{|x| x.class}.must_equal [StiTest]
|
|
59
59
|
end
|
|
60
60
|
|
|
61
61
|
it "should fallback to the main class if the sti_key field is empty or nil without calling constantize" do
|
|
@@ -66,22 +66,22 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
66
66
|
end
|
|
67
67
|
StiTest.plugin :single_table_inheritance, :kind
|
|
68
68
|
@ds._fetch = [{:kind=>''}, {:kind=>nil}]
|
|
69
|
-
StiTest.all.collect{|x| x.class}.
|
|
70
|
-
called.
|
|
69
|
+
StiTest.all.collect{|x| x.class}.must_equal [StiTest, StiTest]
|
|
70
|
+
called.must_equal false
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
it "should set the model class name when saving" do
|
|
74
74
|
StiTest.new.save
|
|
75
75
|
StiTestSub1.new.save
|
|
76
76
|
StiTestSub2.new.save
|
|
77
|
-
DB.sqls.
|
|
77
|
+
DB.sqls.must_equal ["INSERT INTO sti_tests (kind) VALUES ('StiTest')", "SELECT * FROM sti_tests WHERE (id = 10) LIMIT 1", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub1')) AND (id = 10)) LIMIT 1", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub2')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub2')) AND (id = 10)) LIMIT 1"]
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
it "should destroy the model correctly" do
|
|
81
81
|
StiTest.load(:id=>1).destroy
|
|
82
82
|
StiTestSub1.load(:id=>1).destroy
|
|
83
83
|
StiTestSub2.load(:id=>1).destroy
|
|
84
|
-
DB.sqls.
|
|
84
|
+
DB.sqls.must_equal ["DELETE FROM sti_tests WHERE id = 1", "DELETE FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub1')) AND (id = 1))", "DELETE FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub2')) AND (id = 1))"]
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
it "should handle validations on the type column field" do
|
|
@@ -89,43 +89,43 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
89
89
|
def o.validate
|
|
90
90
|
errors.add(:kind, 'not present') unless kind
|
|
91
91
|
end
|
|
92
|
-
o.valid?.
|
|
92
|
+
o.valid?.must_equal true
|
|
93
93
|
end
|
|
94
94
|
|
|
95
95
|
it "should set type column field even if validations are skipped" do
|
|
96
96
|
StiTestSub1.new.save(:validate=>false)
|
|
97
|
-
DB.sqls.
|
|
97
|
+
DB.sqls.must_equal ["INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE ((sti_tests.kind IN ('StiTestSub1')) AND (id = 10)) LIMIT 1"]
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
it "should override an existing value in the class name field" do
|
|
101
101
|
StiTest.create(:kind=>'StiTestSub1')
|
|
102
|
-
DB.sqls.
|
|
102
|
+
DB.sqls.must_equal ["INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "SELECT * FROM sti_tests WHERE (id = 10) LIMIT 1"]
|
|
103
103
|
end
|
|
104
104
|
|
|
105
105
|
it "should handle type column with the same name as existing method names" do
|
|
106
106
|
StiTest.plugin :single_table_inheritance, :type
|
|
107
107
|
StiTest.columns :id, :type
|
|
108
108
|
StiTest.create
|
|
109
|
-
DB.sqls.
|
|
109
|
+
DB.sqls.must_equal ["INSERT INTO sti_tests (type) VALUES ('StiTest')", "SELECT * FROM sti_tests WHERE (id = 10) LIMIT 1"]
|
|
110
110
|
end
|
|
111
111
|
|
|
112
112
|
it "should add a filter to model datasets inside subclasses hook to only retreive objects with the matching key" do
|
|
113
|
-
StiTest.dataset.sql.
|
|
114
|
-
StiTestSub1.dataset.sql.
|
|
115
|
-
StiTestSub2.dataset.sql.
|
|
113
|
+
StiTest.dataset.sql.must_equal "SELECT * FROM sti_tests"
|
|
114
|
+
StiTestSub1.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1'))"
|
|
115
|
+
StiTestSub2.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub2'))"
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
it "should add a correct filter for multiple levels of subclasses" do
|
|
119
119
|
class ::StiTestSub1A < StiTestSub1; end
|
|
120
|
-
StiTestSub1.dataset.sql.
|
|
121
|
-
StiTestSub1A.dataset.sql.
|
|
120
|
+
StiTestSub1.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1', 'StiTestSub1A'))"
|
|
121
|
+
StiTestSub1A.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1A'))"
|
|
122
122
|
class ::StiTestSub2A < StiTestSub2; end
|
|
123
|
-
StiTestSub2.dataset.sql.
|
|
124
|
-
StiTestSub2A.dataset.sql.
|
|
123
|
+
StiTestSub2.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub2', 'StiTestSub2A'))"
|
|
124
|
+
StiTestSub2A.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub2A'))"
|
|
125
125
|
class ::StiTestSub1B < StiTestSub1A; end
|
|
126
|
-
StiTestSub1.dataset.sql.
|
|
127
|
-
StiTestSub1A.dataset.sql.
|
|
128
|
-
StiTestSub1B.dataset.sql.
|
|
126
|
+
StiTestSub1.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1', 'StiTestSub1A', 'StiTestSub1B'))"
|
|
127
|
+
StiTestSub1A.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1A', 'StiTestSub1B'))"
|
|
128
|
+
StiTestSub1B.dataset.sql.must_equal "SELECT * FROM sti_tests WHERE (sti_tests.kind IN ('StiTestSub1B'))"
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
it "should work correctly with the :caching plugin" do
|
|
@@ -139,16 +139,16 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
139
139
|
StiTest.plugin :caching, cache
|
|
140
140
|
def StiTest.cache_key_prefix; "stitest" end
|
|
141
141
|
c2 = Class.new StiTest
|
|
142
|
-
c2.cache_key(:id).
|
|
142
|
+
c2.cache_key(:id).must_equal StiTest.cache_key(:id)
|
|
143
143
|
|
|
144
144
|
obj2 = c2.new
|
|
145
145
|
obj2.values[:x] = 2
|
|
146
146
|
obj2.save
|
|
147
147
|
c2[obj2.id]
|
|
148
|
-
c2.cache_get_pk(obj2.id).values.
|
|
148
|
+
c2.cache_get_pk(obj2.id).values.must_equal StiTest.cache_get_pk(obj2.id).values
|
|
149
149
|
obj2.save
|
|
150
|
-
c2.cache_get_pk(obj2.id).
|
|
151
|
-
StiTest.cache_get_pk(obj2.id).
|
|
150
|
+
c2.cache_get_pk(obj2.id).must_equal nil
|
|
151
|
+
StiTest.cache_get_pk(obj2.id).must_equal nil
|
|
152
152
|
end
|
|
153
153
|
|
|
154
154
|
describe "with custom options" do
|
|
@@ -164,91 +164,91 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
164
164
|
Object.send(:remove_const, :StiTest4)
|
|
165
165
|
end
|
|
166
166
|
|
|
167
|
-
|
|
167
|
+
it "should have working row_proc if using set_dataset in subclass to remove columns" do
|
|
168
168
|
StiTest2.plugin :single_table_inheritance, :kind
|
|
169
169
|
class ::StiTest3 < ::StiTest2
|
|
170
170
|
set_dataset(dataset.select(*(columns - [:blah])))
|
|
171
171
|
end
|
|
172
172
|
class ::StiTest4 < ::StiTest3; end
|
|
173
173
|
StiTest3.dataset._fetch = {:id=>1, :kind=>'StiTest4'}
|
|
174
|
-
StiTest3[1].
|
|
174
|
+
StiTest3[1].must_equal StiTest4.load(:id=>1, :kind=>'StiTest4')
|
|
175
175
|
end
|
|
176
176
|
|
|
177
177
|
it "should work with custom procs with strings" do
|
|
178
178
|
StiTest2.plugin :single_table_inheritance, :kind, :model_map=>proc{|v| v == 1 ? 'StiTest3' : 'StiTest4'}, :key_map=>proc{|klass| klass.name == 'StiTest3' ? 1 : 2}
|
|
179
179
|
class ::StiTest3 < ::StiTest2; end
|
|
180
180
|
class ::StiTest4 < ::StiTest2; end
|
|
181
|
-
StiTest2.dataset.row_proc.call(:kind=>0).
|
|
182
|
-
StiTest2.dataset.row_proc.call(:kind=>1).
|
|
183
|
-
StiTest2.dataset.row_proc.call(:kind=>2).
|
|
181
|
+
StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest4)
|
|
182
|
+
StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
|
|
183
|
+
StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
|
|
184
184
|
|
|
185
|
-
StiTest2.create.kind.
|
|
186
|
-
StiTest3.create.kind.
|
|
187
|
-
StiTest4.create.kind.
|
|
185
|
+
StiTest2.create.kind.must_equal 2
|
|
186
|
+
StiTest3.create.kind.must_equal 1
|
|
187
|
+
StiTest4.create.kind.must_equal 2
|
|
188
188
|
end
|
|
189
189
|
|
|
190
190
|
it "should work with custom procs with symbols" do
|
|
191
191
|
StiTest2.plugin :single_table_inheritance, :kind, :model_map=>proc{|v| v == 1 ? :StiTest3 : :StiTest4}, :key_map=>proc{|klass| klass.name == 'StiTest3' ? 1 : 2}
|
|
192
192
|
class ::StiTest3 < ::StiTest2; end
|
|
193
193
|
class ::StiTest4 < ::StiTest2; end
|
|
194
|
-
StiTest2.dataset.row_proc.call(:kind=>0).
|
|
195
|
-
StiTest2.dataset.row_proc.call(:kind=>1).
|
|
196
|
-
StiTest2.dataset.row_proc.call(:kind=>2).
|
|
194
|
+
StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest4)
|
|
195
|
+
StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
|
|
196
|
+
StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
|
|
197
197
|
|
|
198
|
-
StiTest2.create.kind.
|
|
199
|
-
StiTest3.create.kind.
|
|
200
|
-
StiTest4.create.kind.
|
|
198
|
+
StiTest2.create.kind.must_equal 2
|
|
199
|
+
StiTest3.create.kind.must_equal 1
|
|
200
|
+
StiTest4.create.kind.must_equal 2
|
|
201
201
|
end
|
|
202
202
|
|
|
203
203
|
it "should work with custom hashes" do
|
|
204
204
|
StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>StiTest2, 1=>:StiTest3, 2=>'StiTest4'}, :key_map=>{StiTest2=>4, 'StiTest3'=>5, 'StiTest4'=>6}
|
|
205
205
|
class ::StiTest3 < ::StiTest2; end
|
|
206
206
|
class ::StiTest4 < ::StiTest2; end
|
|
207
|
-
StiTest2.dataset.row_proc.call(:kind=>0).
|
|
208
|
-
StiTest2.dataset.row_proc.call(:kind=>1).
|
|
209
|
-
StiTest2.dataset.row_proc.call(:kind=>2).
|
|
210
|
-
StiTest3.sti_model_map.
|
|
207
|
+
StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest2)
|
|
208
|
+
StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
|
|
209
|
+
StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
|
|
210
|
+
StiTest3.sti_model_map.must_equal StiTest2.sti_model_map
|
|
211
211
|
|
|
212
|
-
StiTest2.create.kind.
|
|
213
|
-
StiTest3.create.kind.
|
|
214
|
-
StiTest4.create.kind.
|
|
212
|
+
StiTest2.create.kind.must_equal 4
|
|
213
|
+
StiTest3.create.kind.must_equal 5
|
|
214
|
+
StiTest4.create.kind.must_equal 6
|
|
215
215
|
|
|
216
216
|
class ::StiTest5 < ::StiTest4; end
|
|
217
|
-
StiTest5.create.kind.
|
|
217
|
+
StiTest5.create.kind.must_equal nil
|
|
218
218
|
end
|
|
219
219
|
|
|
220
220
|
it "should infer key_map from model_map if provided as a hash" do
|
|
221
221
|
StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>StiTest2, 1=>'StiTest3', 2=>:StiTest4}
|
|
222
222
|
class ::StiTest3 < ::StiTest2; end
|
|
223
223
|
class ::StiTest4 < ::StiTest2; end
|
|
224
|
-
StiTest2.dataset.row_proc.call(:kind=>0).
|
|
225
|
-
StiTest2.dataset.row_proc.call(:kind=>1).
|
|
226
|
-
StiTest2.dataset.row_proc.call(:kind=>2).
|
|
224
|
+
StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest2)
|
|
225
|
+
StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
|
|
226
|
+
StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
|
|
227
227
|
|
|
228
|
-
StiTest2.create.kind.
|
|
229
|
-
StiTest3.create.kind.
|
|
230
|
-
StiTest4.create.kind.
|
|
228
|
+
StiTest2.create.kind.must_equal 0
|
|
229
|
+
StiTest3.create.kind.must_equal 1
|
|
230
|
+
StiTest4.create.kind.must_equal 2
|
|
231
231
|
end
|
|
232
232
|
|
|
233
233
|
it "should raise exceptions if a bad model value is used" do
|
|
234
234
|
StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>1,1=>1.5, 2=>Date.today}
|
|
235
235
|
class ::StiTest3 < ::StiTest2; end
|
|
236
236
|
class ::StiTest4 < ::StiTest2; end
|
|
237
|
-
proc{StiTest2.dataset.row_proc.call(:kind=>0)}.
|
|
238
|
-
proc{StiTest2.dataset.row_proc.call(:kind=>1)}.
|
|
239
|
-
proc{StiTest2.dataset.row_proc.call(:kind=>2)}.
|
|
237
|
+
proc{StiTest2.dataset.row_proc.call(:kind=>0)}.must_raise(Sequel::Error)
|
|
238
|
+
proc{StiTest2.dataset.row_proc.call(:kind=>1)}.must_raise(Sequel::Error)
|
|
239
|
+
proc{StiTest2.dataset.row_proc.call(:kind=>2)}.must_raise(Sequel::Error)
|
|
240
240
|
end
|
|
241
241
|
|
|
242
242
|
it "should work with non-bijective mappings" do
|
|
243
243
|
StiTest2.plugin :single_table_inheritance, :kind, :model_map=>{0=>'StiTest3', 1=>'StiTest3', 2=>'StiTest4'}
|
|
244
244
|
class ::StiTest3 < ::StiTest2; end
|
|
245
245
|
class ::StiTest4 < ::StiTest2; end
|
|
246
|
-
StiTest2.dataset.row_proc.call(:kind=>0).
|
|
247
|
-
StiTest2.dataset.row_proc.call(:kind=>1).
|
|
248
|
-
StiTest2.dataset.row_proc.call(:kind=>2).
|
|
246
|
+
StiTest2.dataset.row_proc.call(:kind=>0).must_be_instance_of(StiTest3)
|
|
247
|
+
StiTest2.dataset.row_proc.call(:kind=>1).must_be_instance_of(StiTest3)
|
|
248
|
+
StiTest2.dataset.row_proc.call(:kind=>2).must_be_instance_of(StiTest4)
|
|
249
249
|
|
|
250
|
-
[0,1].
|
|
251
|
-
StiTest4.create.kind.
|
|
250
|
+
[0,1].must_include(StiTest3.create.kind)
|
|
251
|
+
StiTest4.create.kind.must_equal 2
|
|
252
252
|
end
|
|
253
253
|
|
|
254
254
|
it "should work with non-bijective mappings and key map procs" do
|
|
@@ -257,9 +257,9 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
257
257
|
class ::StiTest3 < ::StiTest2; end
|
|
258
258
|
class ::StiTest4 < ::StiTest2; end
|
|
259
259
|
|
|
260
|
-
StiTest2.dataset.sql.
|
|
261
|
-
StiTest3.dataset.sql.
|
|
262
|
-
StiTest4.dataset.sql.
|
|
260
|
+
StiTest2.dataset.sql.must_equal "SELECT * FROM sti_test2s"
|
|
261
|
+
StiTest3.dataset.sql.must_equal "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (0, 1))"
|
|
262
|
+
StiTest4.dataset.sql.must_equal "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (2))"
|
|
263
263
|
end
|
|
264
264
|
|
|
265
265
|
it "should create correct sql with non-bijective mappings" do
|
|
@@ -267,9 +267,9 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
267
267
|
class ::StiTest3 < ::StiTest2; end
|
|
268
268
|
class ::StiTest4 < ::StiTest2; end
|
|
269
269
|
|
|
270
|
-
StiTest2.dataset.sql.
|
|
270
|
+
StiTest2.dataset.sql.must_equal "SELECT * FROM sti_test2s"
|
|
271
271
|
["SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (0, 1))",
|
|
272
|
-
"SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (1, 0))"].
|
|
272
|
+
"SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (1, 0))"].must_include(StiTest3.dataset.sql)
|
|
273
273
|
end
|
|
274
274
|
|
|
275
275
|
it "should destroy the model correctly" do
|
|
@@ -279,10 +279,10 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
279
279
|
StiTest2.load(:id=>1).destroy
|
|
280
280
|
StiTest3.load(:id=>1).destroy
|
|
281
281
|
sqls = DB.sqls
|
|
282
|
-
sqls.shift.
|
|
282
|
+
sqls.shift.must_equal "DELETE FROM sti_test2s WHERE id = 1"
|
|
283
283
|
["DELETE FROM sti_test2s WHERE ((sti_test2s.kind IN ('sti3', 'sti3b')) AND (id = 1))",
|
|
284
|
-
"DELETE FROM sti_test2s WHERE ((sti_test2s.kind IN ('sti3b', 'sti3')) AND (id = 1))"].
|
|
285
|
-
sqls.
|
|
284
|
+
"DELETE FROM sti_test2s WHERE ((sti_test2s.kind IN ('sti3b', 'sti3')) AND (id = 1))"].must_include(sqls.pop)
|
|
285
|
+
sqls.must_equal []
|
|
286
286
|
end
|
|
287
287
|
|
|
288
288
|
it "should honor a :key_chooser" do
|
|
@@ -290,8 +290,8 @@ describe Sequel::Model, "single table inheritance plugin" do
|
|
|
290
290
|
class ::StiTest3 < ::StiTest2; end
|
|
291
291
|
class ::StiTest4 < ::StiTest2; end
|
|
292
292
|
|
|
293
|
-
StiTest3.create.kind.
|
|
294
|
-
StiTest4.create.kind.
|
|
293
|
+
StiTest3.create.kind.must_equal 'stitest3'
|
|
294
|
+
StiTest4.create.kind.must_equal 'stitest4'
|
|
295
295
|
end
|
|
296
296
|
end
|
|
297
297
|
end
|
|
@@ -7,11 +7,11 @@ describe "Sequel::Plugins::SkipCreateRefresh" do
|
|
|
7
7
|
c.db.reset
|
|
8
8
|
c.instance_dataset.meta_def(:insert){|*a| super(*a); 2}
|
|
9
9
|
c.create(:x=>1)
|
|
10
|
-
c.db.sqls.
|
|
10
|
+
c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (1)', 'SELECT * FROM a WHERE (id = 2) LIMIT 1']
|
|
11
11
|
|
|
12
12
|
c.plugin :skip_create_refresh
|
|
13
13
|
c.db.reset
|
|
14
|
-
c.create(:x=>3).values.
|
|
15
|
-
c.db.sqls.
|
|
14
|
+
c.create(:x=>3).values.must_equal(:id=>2, :x=>3)
|
|
15
|
+
c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (3)']
|
|
16
16
|
end
|
|
17
17
|
end
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
require 'rubygems'
|
|
2
2
|
|
|
3
|
-
if defined?(RSpec)
|
|
4
|
-
begin
|
|
5
|
-
require 'rspec/expectations'
|
|
6
|
-
rescue LoadError
|
|
7
|
-
nil
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
3
|
if ENV['COVERAGE']
|
|
12
4
|
require File.join(File.dirname(File.expand_path(__FILE__)), "../sequel_coverage")
|
|
13
5
|
SimpleCov.sequel_coverage(:filter=>%r{lib/sequel/(extensions|plugins)/\w+\.rb\z})
|
|
@@ -37,27 +29,10 @@ def skip_warn(s)
|
|
|
37
29
|
warn "Skipping test of #{s}" if ENV["SKIPPED_TEST_WARN"]
|
|
38
30
|
end
|
|
39
31
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class << self
|
|
45
|
-
alias qspecify specify
|
|
46
|
-
end
|
|
47
|
-
else
|
|
48
|
-
def self.qspecify(*a, &block)
|
|
49
|
-
specify(*a) do
|
|
50
|
-
begin
|
|
51
|
-
output = Sequel::Deprecation.output
|
|
52
|
-
Sequel::Deprecation.output = false
|
|
53
|
-
instance_exec(&block)
|
|
54
|
-
ensure
|
|
55
|
-
Sequel::Deprecation.output = output
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
32
|
+
gem 'minitest'
|
|
33
|
+
require 'minitest/autorun'
|
|
34
|
+
require 'minitest/hooks/default'
|
|
35
|
+
require 'minitest/shared_description'
|
|
61
36
|
|
|
62
37
|
Sequel.quote_identifiers = false
|
|
63
38
|
Sequel.identifier_input_method = nil
|
|
@@ -5,20 +5,20 @@ describe "split_array_nil extension" do
|
|
|
5
5
|
@ds = Sequel.mock[:table].extension(:split_array_nil)
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
@ds.filter(:a=>[1, nil]).sql.
|
|
8
|
+
it "should split IN with nil in array into separate OR IS NULL clause" do
|
|
9
|
+
@ds.filter(:a=>[1, nil]).sql.must_equal "SELECT * FROM table WHERE ((a IN (1)) OR (a IS NULL))"
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
@ds.exclude(:a=>[1, nil]).sql.
|
|
12
|
+
it "should split NOT IN with nil in array into separate AND IS NOT NULL clause" do
|
|
13
|
+
@ds.exclude(:a=>[1, nil]).sql.must_equal "SELECT * FROM table WHERE ((a NOT IN (1)) AND (a IS NOT NULL))"
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
@ds.filter(:a=>[1, 2]).sql.
|
|
18
|
-
@ds.exclude(:a=>[1, 2]).sql.
|
|
16
|
+
it "should not affect other IN/NOT in clauses" do
|
|
17
|
+
@ds.filter(:a=>[1, 2]).sql.must_equal "SELECT * FROM table WHERE (a IN (1, 2))"
|
|
18
|
+
@ds.exclude(:a=>[1, 2]).sql.must_equal "SELECT * FROM table WHERE (a NOT IN (1, 2))"
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
@ds.filter(:a=>1).sql.
|
|
21
|
+
it "should not affect other types of filters clauses" do
|
|
22
|
+
@ds.filter(:a=>1).sql.must_equal "SELECT * FROM table WHERE (a = 1)"
|
|
23
23
|
end
|
|
24
24
|
end
|
|
@@ -9,14 +9,14 @@ describe "Sequel::Plugins::SplitValues" do
|
|
|
9
9
|
o = c.first
|
|
10
10
|
c.db.reset
|
|
11
11
|
|
|
12
|
-
o.
|
|
13
|
-
o[:id].
|
|
14
|
-
o[:x].
|
|
15
|
-
o[:y].
|
|
16
|
-
{c.load(:id=>1, :x=>2)=>4}[o].
|
|
17
|
-
o.values.
|
|
12
|
+
o.must_equal c.load(:id=>1, :x=>2)
|
|
13
|
+
o[:id].must_equal 1
|
|
14
|
+
o[:x].must_equal 2
|
|
15
|
+
o[:y].must_equal 3
|
|
16
|
+
{c.load(:id=>1, :x=>2)=>4}[o].must_equal 4
|
|
17
|
+
o.values.must_equal(:id=>1, :x=>2)
|
|
18
18
|
|
|
19
19
|
o.save
|
|
20
|
-
c.db.sqls.
|
|
20
|
+
c.db.sqls.must_equal ["UPDATE a SET x = 2 WHERE (id = 1)"]
|
|
21
21
|
end
|
|
22
22
|
end
|
|
@@ -7,54 +7,54 @@ describe "Sequel sql_expr extension" do
|
|
|
7
7
|
@ds = Sequel.mock.dataset
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
it "Object#sql_expr should wrap the object in a GenericComplexExpression" do
|
|
11
11
|
o = Object.new
|
|
12
12
|
def o.sql_literal(ds) 'foo' end
|
|
13
13
|
s = o.sql_expr
|
|
14
|
-
@ds.literal(s).
|
|
15
|
-
@ds.literal(s+1).
|
|
16
|
-
@ds.literal(s & true).
|
|
17
|
-
@ds.literal(s < 1).
|
|
18
|
-
@ds.literal(s.sql_subscript(1)).
|
|
19
|
-
@ds.literal(s.like('a')).
|
|
20
|
-
@ds.literal(s.as(:a)).
|
|
21
|
-
@ds.literal(s.cast(Integer)).
|
|
22
|
-
@ds.literal(s.desc).
|
|
23
|
-
@ds.literal(s.sql_string + '1').
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
|
|
14
|
+
@ds.literal(s).must_equal "foo"
|
|
15
|
+
@ds.literal(s+1).must_equal "(foo + 1)"
|
|
16
|
+
@ds.literal(s & true).must_equal "(foo AND 't')"
|
|
17
|
+
@ds.literal(s < 1).must_equal "(foo < 1)"
|
|
18
|
+
@ds.literal(s.sql_subscript(1)).must_equal "foo[1]"
|
|
19
|
+
@ds.literal(s.like('a')).must_equal "(foo LIKE 'a' ESCAPE '\\')"
|
|
20
|
+
@ds.literal(s.as(:a)).must_equal "foo AS a"
|
|
21
|
+
@ds.literal(s.cast(Integer)).must_equal "CAST(foo AS integer)"
|
|
22
|
+
@ds.literal(s.desc).must_equal "foo DESC"
|
|
23
|
+
@ds.literal(s.sql_string + '1').must_equal "(foo || '1')"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "Numeric#sql_expr should wrap the object in a NumericExpression" do
|
|
27
27
|
[1, 2.0, 2^70, BigDecimal.new('1.0')].each do |o|
|
|
28
|
-
@ds.literal(o.sql_expr).
|
|
29
|
-
@ds.literal(o.sql_expr + 1).
|
|
28
|
+
@ds.literal(o.sql_expr).must_equal @ds.literal(o)
|
|
29
|
+
@ds.literal(o.sql_expr + 1).must_equal "(#{@ds.literal(o)} + 1)"
|
|
30
30
|
end
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
@ds.literal("".sql_expr).
|
|
35
|
-
@ds.literal("".sql_expr + :a).
|
|
33
|
+
it "String#sql_expr should wrap the object in a StringExpression" do
|
|
34
|
+
@ds.literal("".sql_expr).must_equal "''"
|
|
35
|
+
@ds.literal("".sql_expr + :a).must_equal "('' || a)"
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
it "NilClass, TrueClass, and FalseClass#sql_expr should wrap the object in a BooleanExpression" do
|
|
39
39
|
[nil, true, false].each do |o|
|
|
40
|
-
@ds.literal(o.sql_expr).
|
|
41
|
-
@ds.literal(o.sql_expr & :a).
|
|
40
|
+
@ds.literal(o.sql_expr).must_equal @ds.literal(o)
|
|
41
|
+
@ds.literal(o.sql_expr & :a).must_equal "(#{@ds.literal(o)} AND a)"
|
|
42
42
|
end
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
@ds.literal(proc{a}.sql_expr).
|
|
47
|
-
@ds.literal(proc{a__b}.sql_expr).
|
|
48
|
-
@ds.literal(proc{a(b)}.sql_expr).
|
|
45
|
+
it "Proc#sql_expr should should treat the object as a virtual row block" do
|
|
46
|
+
@ds.literal(proc{a}.sql_expr).must_equal "a"
|
|
47
|
+
@ds.literal(proc{a__b}.sql_expr).must_equal "a.b"
|
|
48
|
+
@ds.literal(proc{a(b)}.sql_expr).must_equal "a(b)"
|
|
49
49
|
end
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
@ds.literal(proc{1}.sql_expr).
|
|
53
|
-
@ds.literal(proc{1}.sql_expr + 2).
|
|
51
|
+
it "Proc#sql_expr should should wrap the object in a GenericComplexExpression if the object is not already an expression" do
|
|
52
|
+
@ds.literal(proc{1}.sql_expr).must_equal "1"
|
|
53
|
+
@ds.literal(proc{1}.sql_expr + 2).must_equal "(1 + 2)"
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
@ds.literal(proc{{a=>b}}.sql_expr).
|
|
58
|
-
@ds.literal(proc{[[a, b]]}.sql_expr & :a).
|
|
56
|
+
it "Proc#sql_expr should should convert a hash or array of two element arrays to a BooleanExpression" do
|
|
57
|
+
@ds.literal(proc{{a=>b}}.sql_expr).must_equal "(a = b)"
|
|
58
|
+
@ds.literal(proc{[[a, b]]}.sql_expr & :a).must_equal "((a = b) AND a)"
|
|
59
59
|
end
|
|
60
60
|
end
|