sequel 4.41.0 → 4.42.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +98 -0
- data/README.rdoc +23 -10
- data/doc/active_record.rdoc +4 -4
- data/doc/advanced_associations.rdoc +2 -2
- data/doc/association_basics.rdoc +5 -2
- data/doc/cheat_sheet.rdoc +3 -3
- data/doc/core_extensions.rdoc +2 -2
- data/doc/dataset_basics.rdoc +4 -4
- data/doc/dataset_filtering.rdoc +1 -1
- data/doc/migration.rdoc +19 -1
- data/doc/prepared_statements.rdoc +2 -2
- data/doc/release_notes/4.42.0.txt +221 -0
- data/doc/testing.rdoc +3 -1
- data/lib/sequel/adapters/ado/access.rb +0 -1
- data/lib/sequel/adapters/ado/mssql.rb +0 -1
- data/lib/sequel/adapters/do/mysql.rb +0 -1
- data/lib/sequel/adapters/do/postgres.rb +0 -1
- data/lib/sequel/adapters/do/sqlite3.rb +0 -1
- data/lib/sequel/adapters/ibmdb.rb +21 -25
- data/lib/sequel/adapters/jdbc.rb +8 -16
- data/lib/sequel/adapters/jdbc/as400.rb +0 -1
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
- data/lib/sequel/adapters/jdbc/db2.rb +0 -1
- data/lib/sequel/adapters/jdbc/derby.rb +0 -1
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
- data/lib/sequel/adapters/jdbc/h2.rb +0 -1
- data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
- data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
- data/lib/sequel/adapters/mock.rb +54 -12
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +11 -17
- data/lib/sequel/adapters/odbc/mssql.rb +0 -1
- data/lib/sequel/adapters/oracle.rb +8 -20
- data/lib/sequel/adapters/postgres.rb +11 -29
- data/lib/sequel/adapters/shared/access.rb +5 -12
- data/lib/sequel/adapters/shared/cubrid.rb +4 -13
- data/lib/sequel/adapters/shared/db2.rb +4 -2
- data/lib/sequel/adapters/shared/firebird.rb +2 -4
- data/lib/sequel/adapters/shared/informix.rb +4 -2
- data/lib/sequel/adapters/shared/mssql.rb +3 -5
- data/lib/sequel/adapters/shared/mysql.rb +4 -14
- data/lib/sequel/adapters/shared/oracle.rb +1 -3
- data/lib/sequel/adapters/shared/postgres.rb +16 -38
- data/lib/sequel/adapters/shared/progress.rb +0 -2
- data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
- data/lib/sequel/adapters/shared/sqlite.rb +20 -16
- data/lib/sequel/adapters/sqlite.rb +8 -20
- data/lib/sequel/adapters/swift/mysql.rb +0 -1
- data/lib/sequel/adapters/swift/postgres.rb +0 -1
- data/lib/sequel/adapters/swift/sqlite.rb +0 -1
- data/lib/sequel/adapters/tinytds.rb +4 -12
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
- data/lib/sequel/ast_transformer.rb +2 -2
- data/lib/sequel/database/dataset.rb +1 -1
- data/lib/sequel/database/dataset_defaults.rb +0 -66
- data/lib/sequel/database/features.rb +6 -0
- data/lib/sequel/database/misc.rb +31 -17
- data/lib/sequel/database/query.rb +7 -4
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset.rb +8 -8
- data/lib/sequel/dataset/actions.rb +140 -46
- data/lib/sequel/dataset/features.rb +1 -5
- data/lib/sequel/dataset/graph.rb +7 -8
- data/lib/sequel/dataset/misc.rb +127 -56
- data/lib/sequel/dataset/mutation.rb +9 -20
- data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
- data/lib/sequel/dataset/prepared_statements.rb +102 -46
- data/lib/sequel/dataset/query.rb +155 -72
- data/lib/sequel/dataset/sql.rb +26 -9
- data/lib/sequel/extensions/columns_introspection.rb +3 -1
- data/lib/sequel/extensions/core_extensions.rb +5 -5
- data/lib/sequel/extensions/core_refinements.rb +5 -5
- data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
- data/lib/sequel/extensions/freeze_datasets.rb +69 -0
- data/lib/sequel/extensions/identifier_mangling.rb +196 -0
- data/lib/sequel/extensions/looser_typecasting.rb +11 -7
- data/lib/sequel/extensions/migration.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +5 -2
- data/lib/sequel/extensions/pagination.rb +42 -23
- data/lib/sequel/extensions/pg_enum.rb +3 -3
- data/lib/sequel/extensions/query.rb +3 -3
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
- data/lib/sequel/model/associations.rb +25 -8
- data/lib/sequel/model/base.rb +88 -29
- data/lib/sequel/model/dataset_module.rb +37 -0
- data/lib/sequel/plugins/association_pks.rb +4 -4
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/constraint_validations.rb +1 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +8 -8
- data/lib/sequel/plugins/eager_each.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +2 -2
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +4 -4
- data/lib/sequel/plugins/prepared_statements.rb +2 -4
- data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +13 -13
- data/lib/sequel/plugins/sharding.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/plugins/validation_helpers.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +2 -2
- data/lib/sequel/sql.rb +69 -36
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +10 -0
- data/spec/adapters/firebird_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +4 -5
- data/spec/adapters/mysql_spec.rb +9 -9
- data/spec/adapters/postgres_spec.rb +67 -68
- data/spec/adapters/spec_helper.rb +6 -1
- data/spec/adapters/sqlite_spec.rb +29 -15
- data/spec/core/connection_pool_spec.rb +14 -14
- data/spec/core/database_spec.rb +38 -180
- data/spec/core/dataset_mutation_spec.rb +253 -0
- data/spec/core/dataset_spec.rb +394 -537
- data/spec/core/expression_filters_spec.rb +34 -32
- data/spec/core/mock_adapter_spec.rb +27 -35
- data/spec/core/placeholder_literalizer_spec.rb +2 -4
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +1 -2
- data/spec/core_extensions_spec.rb +22 -29
- data/spec/extensions/active_model_spec.rb +6 -6
- data/spec/extensions/association_dependencies_spec.rb +2 -2
- data/spec/extensions/blacklist_security_spec.rb +3 -3
- data/spec/extensions/boolean_readers_spec.rb +12 -12
- data/spec/extensions/caching_spec.rb +13 -10
- data/spec/extensions/class_table_inheritance_spec.rb +38 -43
- data/spec/extensions/column_conflicts_spec.rb +1 -3
- data/spec/extensions/columns_introspection_spec.rb +2 -3
- data/spec/extensions/composition_spec.rb +5 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
- data/spec/extensions/constraint_validations_spec.rb +14 -8
- data/spec/extensions/core_refinements_spec.rb +22 -29
- data/spec/extensions/csv_serializer_spec.rb +7 -6
- data/spec/extensions/date_arithmetic_spec.rb +15 -15
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +1 -1
- data/spec/extensions/dirty_spec.rb +19 -10
- data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
- data/spec/extensions/eager_each_spec.rb +12 -16
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +4 -3
- data/spec/extensions/force_encoding_spec.rb +12 -12
- data/spec/extensions/freeze_datasets_spec.rb +31 -0
- data/spec/extensions/graph_each_spec.rb +6 -18
- data/spec/extensions/hook_class_methods_spec.rb +7 -7
- data/spec/extensions/identifier_mangling_spec.rb +307 -0
- data/spec/extensions/instance_filters_spec.rb +5 -6
- data/spec/extensions/instance_hooks_spec.rb +12 -12
- data/spec/extensions/json_serializer_spec.rb +12 -15
- data/spec/extensions/lazy_attributes_spec.rb +4 -4
- data/spec/extensions/list_spec.rb +19 -21
- data/spec/extensions/many_through_many_spec.rb +108 -163
- data/spec/extensions/meta_def_spec.rb +7 -2
- data/spec/extensions/migration_spec.rb +10 -12
- data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
- data/spec/extensions/named_timezones_spec.rb +4 -3
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +17 -12
- data/spec/extensions/optimistic_locking_spec.rb +4 -5
- data/spec/extensions/pagination_spec.rb +8 -10
- data/spec/extensions/pg_array_associations_spec.rb +28 -27
- data/spec/extensions/pg_array_ops_spec.rb +2 -1
- data/spec/extensions/pg_array_spec.rb +6 -2
- data/spec/extensions/pg_enum_spec.rb +5 -3
- data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
- data/spec/extensions/pg_hstore_spec.rb +7 -6
- data/spec/extensions/pg_inet_ops_spec.rb +2 -1
- data/spec/extensions/pg_inet_spec.rb +2 -1
- data/spec/extensions/pg_interval_spec.rb +2 -1
- data/spec/extensions/pg_json_ops_spec.rb +2 -1
- data/spec/extensions/pg_json_spec.rb +6 -3
- data/spec/extensions/pg_loose_count_spec.rb +1 -0
- data/spec/extensions/pg_range_ops_spec.rb +3 -1
- data/spec/extensions/pg_range_spec.rb +9 -5
- data/spec/extensions/pg_row_ops_spec.rb +2 -1
- data/spec/extensions/pg_row_plugin_spec.rb +4 -6
- data/spec/extensions/pg_row_spec.rb +5 -3
- data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
- data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
- data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +12 -11
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +8 -5
- data/spec/extensions/rcte_tree_spec.rb +39 -39
- data/spec/extensions/round_timestamps_spec.rb +2 -2
- data/spec/extensions/schema_dumper_spec.rb +3 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +1 -2
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
- data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
- data/spec/extensions/serialization_spec.rb +15 -13
- data/spec/extensions/set_overrides_spec.rb +14 -8
- data/spec/extensions/sharding_spec.rb +9 -18
- data/spec/extensions/shared_caching_spec.rb +3 -4
- data/spec/extensions/single_table_inheritance_spec.rb +11 -11
- data/spec/extensions/skip_create_refresh_spec.rb +2 -1
- data/spec/extensions/spec_helper.rb +1 -1
- data/spec/extensions/split_values_spec.rb +2 -2
- data/spec/extensions/sql_comments_spec.rb +6 -0
- data/spec/extensions/static_cache_spec.rb +7 -9
- data/spec/extensions/string_agg_spec.rb +30 -29
- data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
- data/spec/extensions/thread_local_timezones_spec.rb +2 -2
- data/spec/extensions/timestamps_spec.rb +28 -3
- data/spec/extensions/to_dot_spec.rb +1 -2
- data/spec/extensions/tree_spec.rb +33 -29
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -0
- data/spec/extensions/update_primary_key_spec.rb +11 -7
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +0 -1
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +10 -10
- data/spec/extensions/validation_helpers_spec.rb +10 -10
- data/spec/extensions/xml_serializer_spec.rb +7 -3
- data/spec/integration/associations_test.rb +31 -31
- data/spec/integration/dataset_test.rb +17 -19
- data/spec/integration/eager_loader_test.rb +24 -24
- data/spec/integration/model_test.rb +6 -6
- data/spec/integration/plugin_test.rb +43 -43
- data/spec/integration/prepared_statement_test.rb +6 -6
- data/spec/integration/schema_test.rb +63 -52
- data/spec/integration/spec_helper.rb +6 -1
- data/spec/integration/transaction_test.rb +13 -13
- data/spec/model/association_reflection_spec.rb +17 -17
- data/spec/model/associations_spec.rb +101 -96
- data/spec/model/base_spec.rb +175 -49
- data/spec/model/class_dataset_methods_spec.rb +5 -9
- data/spec/model/dataset_methods_spec.rb +5 -5
- data/spec/model/eager_loading_spec.rb +209 -235
- data/spec/model/hooks_spec.rb +15 -15
- data/spec/model/model_spec.rb +28 -21
- data/spec/model/plugins_spec.rb +4 -5
- data/spec/model/record_spec.rb +59 -57
- data/spec/model/spec_helper.rb +1 -1
- data/spec/model/validations_spec.rb +6 -6
- data/spec/spec_config.rb +1 -1
- metadata +10 -2
@@ -4,11 +4,12 @@ describe "Sequel::Plugins::SkipCreateRefresh" do
|
|
4
4
|
it "should skip the refresh after saving a new object" do
|
5
5
|
c = Class.new(Sequel::Model(:a))
|
6
6
|
c.columns :id, :x
|
7
|
+
c.dataset = c.dataset.with_autoid(2)
|
7
8
|
c.db.reset
|
8
|
-
c.instance_dataset.meta_def(:insert){|*a| super(*a); 2}
|
9
9
|
c.create(:x=>1)
|
10
10
|
c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (1)', 'SELECT * FROM a WHERE (id = 2) LIMIT 1']
|
11
11
|
|
12
|
+
c.dataset = c.dataset.with_autoid(2)
|
12
13
|
c.plugin :skip_create_refresh
|
13
14
|
c.db.reset
|
14
15
|
c.create(:x=>3).values.must_equal(:id=>2, :x=>3)
|
@@ -45,7 +45,7 @@ class << Sequel::Model
|
|
45
45
|
def columns(*cols)
|
46
46
|
return super if cols.empty?
|
47
47
|
define_method(:columns){cols}
|
48
|
-
@dataset.
|
48
|
+
@dataset.send(:columns=, cols) if @dataset
|
49
49
|
def_column_accessor(*cols)
|
50
50
|
@columns = cols
|
51
51
|
@db_schema = {}
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
2
2
|
|
3
3
|
describe "Sequel::Plugins::SplitValues" do
|
4
|
-
it "
|
4
|
+
it "stores non-columns in a separate hash" do
|
5
5
|
c = Class.new(Sequel::Model(:a))
|
6
6
|
c.columns :id, :x
|
7
7
|
c.plugin :split_values
|
8
|
-
c.dataset
|
8
|
+
c.dataset = c.dataset.with_fetch(:id=>1, :x=>2, :y=>3)
|
9
9
|
o = c.first
|
10
10
|
c.db.reset
|
11
11
|
|
@@ -24,4 +24,10 @@ describe "sql_comments extension" do
|
|
24
24
|
ds = @ds.comment("Some\nComment\r\n Here")
|
25
25
|
ds.where(:id=>ds).select_sql.must_equal "SELECT * FROM t WHERE (id IN (SELECT * FROM t -- Some Comment Here\n)) -- Some Comment Here\n"
|
26
26
|
end
|
27
|
+
|
28
|
+
it "should handle frozen SQL strings" do
|
29
|
+
@ds = Sequel.mock[:t].with_extend{def select_sql; super.freeze; end}.extension(:sql_comments)
|
30
|
+
ds = @ds.comment("Some\nComment\r\n Here")
|
31
|
+
ds.select_sql.must_equal "SELECT * FROM t -- Some Comment Here\n"
|
32
|
+
end
|
27
33
|
end
|
@@ -25,10 +25,10 @@ describe "Sequel::Plugins::StaticCache" do
|
|
25
25
|
it "should make .[] method with primary key use the cache" do
|
26
26
|
@c[1].must_equal @c1
|
27
27
|
@c[2].must_equal @c2
|
28
|
-
@c[3].
|
29
|
-
@c[[1, 2]].
|
30
|
-
@c[nil].
|
31
|
-
@c[].
|
28
|
+
@c[3].must_be_nil
|
29
|
+
@c[[1, 2]].must_be_nil
|
30
|
+
@c[nil].must_be_nil
|
31
|
+
@c[].must_be_nil
|
32
32
|
@db.sqls.must_equal []
|
33
33
|
end
|
34
34
|
|
@@ -41,7 +41,7 @@ describe "Sequel::Plugins::StaticCache" do
|
|
41
41
|
it "should support cache_get_pk" do
|
42
42
|
@c.cache_get_pk(1).must_equal @c1
|
43
43
|
@c.cache_get_pk(2).must_equal @c2
|
44
|
-
@c.cache_get_pk(3).
|
44
|
+
@c.cache_get_pk(3).must_be_nil
|
45
45
|
@db.sqls.must_equal []
|
46
46
|
end
|
47
47
|
|
@@ -171,9 +171,7 @@ describe "Sequel::Plugins::StaticCache" do
|
|
171
171
|
end
|
172
172
|
|
173
173
|
it "set_dataset should work correctly" do
|
174
|
-
ds = @c.dataset.from(:t2)
|
175
|
-
ds.instance_variable_set(:@columns, [:id])
|
176
|
-
ds._fetch = {:id=>3}
|
174
|
+
ds = @c.dataset.from(:t2).columns(:id).with_fetch(:id=>3)
|
177
175
|
@c.dataset = ds
|
178
176
|
@c.all.must_equal [@c.load(:id=>3)]
|
179
177
|
@c.to_hash.must_equal(3=>@c.load(:id=>3))
|
@@ -341,7 +339,7 @@ describe "Sequel::Plugins::StaticCache" do
|
|
341
339
|
@db.autoid = 3
|
342
340
|
@db.fetch = [[{:id=>1}, {:id=>2}, {:id=>3}], [{:id=>3}]]
|
343
341
|
o.save
|
344
|
-
@c[3].
|
342
|
+
@c[3].must_be_nil
|
345
343
|
end
|
346
344
|
|
347
345
|
it "should not automatically update the cache when updating model objects" do
|
@@ -30,39 +30,40 @@ describe "string_agg extension" do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should correctly literalize on Postgres" do
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
ds = dbf.call(:postgres).dataset.with_quote_identifiers(false)
|
34
|
+
ds.literal(@sa1).must_equal "string_agg(c, ',')"
|
35
|
+
ds.literal(@sa2).must_equal "string_agg(c, '-')"
|
36
|
+
ds.literal(@sa3).must_equal "string_agg(c, '-' ORDER BY o)"
|
37
|
+
ds.literal(@sa4).must_equal "string_agg(DISTINCT c, ',' ORDER BY o)"
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should correctly literalize on SQLAnywhere" do
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
ds = dbf.call(:sqlanywhere).dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
|
42
|
+
ds.literal(@sa1).must_equal "list(c, ',')"
|
43
|
+
ds.literal(@sa2).must_equal "list(c, '-')"
|
44
|
+
ds.literal(@sa3).must_equal "list(c, '-' ORDER BY o)"
|
45
|
+
ds.literal(@sa4).must_equal "list(DISTINCT c, ',' ORDER BY o)"
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should correctly literalize on MySQL, H2, HSQLDB, CUBRID" do
|
49
49
|
[:mysql, :h2, :hsqldb, :cubrid].each do |type|
|
50
50
|
db = dbf.call(type)
|
51
51
|
db.meta_def(:database_type){type}
|
52
|
-
db.
|
53
|
-
|
54
|
-
|
55
|
-
|
52
|
+
ds = db.dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
|
53
|
+
ds.literal(@sa1).upcase.must_equal "GROUP_CONCAT(C SEPARATOR ',')"
|
54
|
+
ds.literal(@sa2).upcase.must_equal "GROUP_CONCAT(C SEPARATOR '-')"
|
55
|
+
ds.literal(@sa3).upcase.must_equal "GROUP_CONCAT(C ORDER BY O SEPARATOR '-')"
|
56
|
+
ds.literal(@sa4).upcase.must_equal "GROUP_CONCAT(DISTINCT C ORDER BY O SEPARATOR ',')"
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
59
60
|
it "should correctly literalize on Oracle and DB2" do
|
60
61
|
[:oracle, :db2].each do |type|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
proc{
|
62
|
+
ds = dbf.call(type).dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
|
63
|
+
ds.literal(@sa1).must_equal "listagg(c, ',') WITHIN GROUP (ORDER BY 1)"
|
64
|
+
ds.literal(@sa2).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY 1)"
|
65
|
+
ds.literal(@sa3).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY o)"
|
66
|
+
proc{ds.literal(@sa4)}.must_raise Sequel::Error
|
66
67
|
end
|
67
68
|
end
|
68
69
|
|
@@ -72,18 +73,18 @@ describe "string_agg extension" do
|
|
72
73
|
|
73
74
|
it "should handle order without arguments" do
|
74
75
|
db = dbf.call(:postgres)
|
75
|
-
db.literal(@sa1.order).must_equal "string_agg(c, ',')"
|
76
|
+
db.dataset.with_quote_identifiers(false).literal(@sa1.order).must_equal "string_agg(c, ',')"
|
76
77
|
end
|
77
78
|
|
78
79
|
it "should handle operations on object" do
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
80
|
+
ds = dbf.call(:postgres).dataset.with_quote_identifiers(false)
|
81
|
+
ds.literal(@sa1 + 'b').must_equal "(string_agg(c, ',') || 'b')"
|
82
|
+
ds.literal(@sa1.like('b')).must_equal "(string_agg(c, ',') LIKE 'b' ESCAPE '\\')"
|
83
|
+
ds.literal(@sa1 < 'b').must_equal "(string_agg(c, ',') < 'b')"
|
84
|
+
ds.literal(@sa1.as(:b)).must_equal "string_agg(c, ',') AS b"
|
85
|
+
ds.literal(@sa1.cast(:b)).must_equal "CAST(string_agg(c, ',') AS b)"
|
86
|
+
ds.literal(@sa1.desc).must_equal "string_agg(c, ',') DESC"
|
87
|
+
ds.literal(@sa1 =~ /a/).must_equal "(string_agg(c, ',') ~ 'a')"
|
88
|
+
ds.literal(@sa1.sql_subscript(1)).must_equal "string_agg(c, ',')[1]"
|
88
89
|
end
|
89
90
|
end
|
@@ -21,7 +21,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
|
|
21
21
|
columns :id, :parent_id
|
22
22
|
many_to_one :parent, :class=>self
|
23
23
|
one_to_many :children, :class=>self, :key=>:parent_id
|
24
|
-
dataset.
|
24
|
+
set_dataset dataset.with_fetch(proc do |sql|
|
25
25
|
if sql !~ /WHERE/
|
26
26
|
[{:id=>1, :parent_id=>101}, {:id=>2, :parent_id=>102}, {:id=>101, :parent_id=>nil}, {:id=>102, :parent_id=>nil}]
|
27
27
|
elsif sql =~ /WHERE.*\bid = (\d+)/
|
@@ -31,7 +31,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
|
|
31
31
|
elsif sql =~ /WHERE.*\bparent_id IN \(([\d, ]*)\)/
|
32
32
|
$1.split(', ').map{|x| {:id=>x.to_i - 100, :parent_id=>x.to_i} if x.to_i > 100}.compact
|
33
33
|
end
|
34
|
-
end
|
34
|
+
end)
|
35
35
|
end
|
36
36
|
@c = ::TacticalEagerLoadingModel
|
37
37
|
@ds = TacticalEagerLoadingModel.dataset
|
@@ -63,7 +63,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
|
|
63
63
|
it "association getter methods should not eagerly load the association if the association is cached" do
|
64
64
|
ts.map{|x| x.parent}.must_equal [ts[2], ts[3], nil, nil]
|
65
65
|
sql_match(/\ASELECT \* FROM t WHERE \(t\.id IN \(10[12], 10[12]\)\)\z/)
|
66
|
-
|
66
|
+
@c.dataset = @c.dataset.with_extend{def eager_load(*) raise end}
|
67
67
|
ts.map{|x| x.parent}.must_equal [ts[2], ts[3], nil, nil]
|
68
68
|
end
|
69
69
|
|
@@ -113,8 +113,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
|
|
113
113
|
it "should handle case where an association is valid on an instance, but not on all instances" do
|
114
114
|
c = Class.new(@c)
|
115
115
|
c.many_to_one :parent2, :class=>@c, :key=>:parent_id
|
116
|
-
@c.dataset.
|
117
|
-
@c.all{|x| x.parent2 if x.is_a?(c)}
|
116
|
+
@c.dataset.with_row_proc(proc{|r| (r[:parent_id] == 101 ? c : @c).call(r)}).all{|x| x.parent2 if x.is_a?(c)}
|
118
117
|
sql_match('SELECT * FROM t', 'SELECT * FROM t WHERE id = 101')
|
119
118
|
end
|
120
119
|
|
@@ -22,7 +22,7 @@ describe "Sequel thread_local_timezones extension" do
|
|
22
22
|
Sequel.thread_database_timezone = :utc
|
23
23
|
Sequel.database_timezone.must_equal :utc
|
24
24
|
Sequel.thread_typecast_timezone = nil
|
25
|
-
Sequel.typecast_timezone.
|
25
|
+
Sequel.typecast_timezone.must_be_nil
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should fallback to default timezone if no thread_local timezone" do
|
@@ -37,7 +37,7 @@ describe "Sequel thread_local_timezones extension" do
|
|
37
37
|
Sequel.thread_typecast_timezone = nil
|
38
38
|
Sequel.typecast_timezone.must_equal :utc
|
39
39
|
Sequel.thread_typecast_timezone = :nil
|
40
|
-
Sequel.typecast_timezone.
|
40
|
+
Sequel.typecast_timezone.must_be_nil
|
41
41
|
end
|
42
42
|
|
43
43
|
it "should be thread safe" do
|
@@ -16,7 +16,6 @@ describe "Sequel::Plugins::Timestamps" do
|
|
16
16
|
def _save_refresh(*) end
|
17
17
|
db.reset
|
18
18
|
end
|
19
|
-
@c.dataset.autoid = nil
|
20
19
|
end
|
21
20
|
after do
|
22
21
|
Sequel.datetime_class = Time
|
@@ -71,7 +70,7 @@ describe "Sequel::Plugins::Timestamps" do
|
|
71
70
|
end
|
72
71
|
|
73
72
|
it "should not update the update timestamp on creation" do
|
74
|
-
@c.create.updated_at.
|
73
|
+
@c.create.updated_at.must_be_nil
|
75
74
|
end
|
76
75
|
|
77
76
|
it "should use the same value for the creation and update timestamps when creating if the :update_on_create option is given" do
|
@@ -133,6 +132,32 @@ describe "Sequel::Plugins::Timestamps" do
|
|
133
132
|
o.created_at.must_equal '2009-08-01'
|
134
133
|
end
|
135
134
|
|
135
|
+
it "should set update timestamp to same timestamp as create timestamp when setting creating timestamp" do
|
136
|
+
i = 1
|
137
|
+
(class << (Sequel.datetime_class); self end).send(:define_method, :now){"2009-08-0#{i+=1}"}
|
138
|
+
@c.plugin :timestamps, :update_on_create=>true
|
139
|
+
o = @c.create
|
140
|
+
sqls = @c.db.sqls
|
141
|
+
sqls.length.must_equal 1
|
142
|
+
["INSERT INTO t (created_at, updated_at) VALUES ('2009-08-02', '2009-08-02')",
|
143
|
+
"INSERT INTO t (updated_at, created_at) VALUES ('2009-08-02', '2009-08-02')"].must_include sqls.first
|
144
|
+
o.created_at.must_equal '2009-08-02'
|
145
|
+
o.updated_at.must_equal '2009-08-02'
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should set update timestamp when using not overriding create timestamp" do
|
149
|
+
i = 1
|
150
|
+
(class << (Sequel.datetime_class); self end).send(:define_method, :now){"2009-08-0#{i+=1}"}
|
151
|
+
@c.plugin :timestamps, :update_on_create=>true
|
152
|
+
o = @c.create(:created_at=>'2009-08-10')
|
153
|
+
sqls = @c.db.sqls
|
154
|
+
sqls.length.must_equal 1
|
155
|
+
["INSERT INTO t (created_at, updated_at) VALUES ('2009-08-10', '2009-08-02')",
|
156
|
+
"INSERT INTO t (updated_at, created_at) VALUES ('2009-08-02', '2009-08-10')"].must_include sqls.first
|
157
|
+
o.created_at.must_equal '2009-08-10'
|
158
|
+
o.updated_at.must_equal '2009-08-02'
|
159
|
+
end
|
160
|
+
|
136
161
|
it "should have create_timestamp_field give the create timestamp field" do
|
137
162
|
@c.create_timestamp_field.must_equal :created_at
|
138
163
|
@c.plugin :timestamps, :create=>:c
|
@@ -161,7 +186,7 @@ describe "Sequel::Plugins::Timestamps" do
|
|
161
186
|
c = Class.new(@c)
|
162
187
|
o = c.create
|
163
188
|
o.created_at.must_equal '2009-08-01'
|
164
|
-
o.updated_at.
|
189
|
+
o.updated_at.must_be_nil
|
165
190
|
o = c.load(:id=>1).save
|
166
191
|
o.updated_at.must_equal '2009-08-01'
|
167
192
|
c.db.sqls.must_equal ["INSERT INTO t (created_at) VALUES ('2009-08-01')", "UPDATE t SET updated_at = '2009-08-01' WHERE (id = 1)"]
|
@@ -25,8 +25,7 @@ END
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should handle WITH" do
|
28
|
-
|
29
|
-
a = dot(@ds.with(:a, @ds))
|
28
|
+
a = dot(@ds.with_extend{def supports_cte?(*) true end}.with(:a, @ds))
|
30
29
|
a[0..3].must_equal ["1 -> 2 [label=\"with\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"Hash\"];"]
|
31
30
|
[["3 -> 4 [label=\"dataset\"];", "4 [label=\"Dataset\"];", "3 -> 5 [label=\"name\"];", "5 [label=\":a\"];"],
|
32
31
|
["3 -> 4 [label=\"name\"];", "4 [label=\":a\"];", "3 -> 5 [label=\"dataset\"];", "5 [label=\"Dataset\"];"]].must_include(a[4..-1])
|
@@ -48,7 +48,7 @@ describe Sequel::Model, "tree plugin" do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should have tree_order give the order of the association" do
|
51
|
-
@c.tree_order.
|
51
|
+
@c.tree_order.must_be_nil
|
52
52
|
klass(:order=>:name).tree_order.must_equal :name
|
53
53
|
klass(:order=>[:parent_id, :name]).tree_order.must_equal [:parent_id, :name]
|
54
54
|
end
|
@@ -60,7 +60,7 @@ describe Sequel::Model, "tree plugin" do
|
|
60
60
|
end
|
61
61
|
|
62
62
|
it "should have roots return an array of the tree's roots" do
|
63
|
-
@
|
63
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
64
64
|
@c.roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :name=>'r')]
|
65
65
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE (parent_id IS NULL)"]
|
66
66
|
end
|
@@ -70,14 +70,14 @@ describe Sequel::Model, "tree plugin" do
|
|
70
70
|
end
|
71
71
|
|
72
72
|
it "should have ancestors return the ancestors of the current node" do
|
73
|
-
@
|
73
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]])
|
74
74
|
@o.ancestors.must_equal [@c.load(:id=>1, :parent_id=>5, :name=>'r'), @c.load(:id=>5, :parent_id=>nil, :name=>'r2')]
|
75
75
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
76
76
|
"SELECT * FROM nodes WHERE id = 5"]
|
77
77
|
end
|
78
78
|
|
79
79
|
it "should have descendants return the descendants of the current node" do
|
80
|
-
@
|
80
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>3, :parent_id=>2, :name=>'r'}, {:id=>4, :parent_id=>2, :name=>'r2'}], [{:id=>5, :parent_id=>4, :name=>'r3'}], []])
|
81
81
|
@o.descendants.must_equal [@c.load(:id=>3, :parent_id=>2, :name=>'r'), @c.load(:id=>4, :parent_id=>2, :name=>'r2'), @c.load(:id=>5, :parent_id=>4, :name=>'r3')]
|
82
82
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.parent_id = 2)",
|
83
83
|
"SELECT * FROM nodes WHERE (nodes.parent_id = 3)",
|
@@ -86,7 +86,7 @@ describe Sequel::Model, "tree plugin" do
|
|
86
86
|
end
|
87
87
|
|
88
88
|
it "should have root return the root of the current node" do
|
89
|
-
@
|
89
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]])
|
90
90
|
@o.root.must_equal @c.load(:id=>5, :parent_id=>nil, :name=>'r2')
|
91
91
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
92
92
|
"SELECT * FROM nodes WHERE id = 5"]
|
@@ -102,14 +102,14 @@ describe Sequel::Model, "tree plugin" do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
it "should have self_and_siblings return the children of the current node's parent" do
|
105
|
-
@
|
105
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]])
|
106
106
|
@o.self_and_siblings.must_equal [@c.load(:id=>7, :parent_id=>1, :name=>'r2'), @o]
|
107
107
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
108
108
|
"SELECT * FROM nodes WHERE (nodes.parent_id = 1)"]
|
109
109
|
end
|
110
110
|
|
111
111
|
it "should have siblings return the children of the current node's parent, except for the current node" do
|
112
|
-
@
|
112
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]])
|
113
113
|
@o.siblings.must_equal [@c.load(:id=>7, :parent_id=>1, :name=>'r2')]
|
114
114
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
|
115
115
|
"SELECT * FROM nodes WHERE (nodes.parent_id = 1)"]
|
@@ -121,23 +121,23 @@ describe Sequel::Model, "tree plugin" do
|
|
121
121
|
end
|
122
122
|
|
123
123
|
it "should have root class method return the root" do
|
124
|
-
@c.dataset
|
124
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
125
125
|
@c.root.must_equal @c.load(:id=>1, :parent_id=>nil, :name=>'r')
|
126
126
|
end
|
127
127
|
|
128
128
|
it "prevents creating a second root" do
|
129
|
-
@c.dataset
|
129
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
130
130
|
lambda { @c.create }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
131
131
|
end
|
132
132
|
|
133
133
|
it "errors when promoting an existing record to a second root" do
|
134
|
-
@c.dataset
|
134
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
135
135
|
n = @c.load(:id => 2, :parent_id => 1)
|
136
136
|
lambda { n.update(:parent_id => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
137
137
|
end
|
138
138
|
|
139
139
|
it "allows updating existing root" do
|
140
|
-
@c.dataset
|
140
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
|
141
141
|
@c.root.update(:name => 'fdsa')
|
142
142
|
end
|
143
143
|
end
|
@@ -152,6 +152,10 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
152
152
|
columns :id, :id2, :name, :parent_id, :parent_id2, :i, :pi
|
153
153
|
set_primary_key [:id, :id2]
|
154
154
|
plugin :tree, opts.merge(:key=>[:parent_id, :parent_id2])
|
155
|
+
def self.set_dataset(ds)
|
156
|
+
super
|
157
|
+
set_primary_key [:id, :id2]
|
158
|
+
end
|
155
159
|
end
|
156
160
|
c
|
157
161
|
end
|
@@ -174,7 +178,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
174
178
|
end
|
175
179
|
|
176
180
|
it "should have roots return an array of the tree's roots" do
|
177
|
-
@
|
181
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
178
182
|
@c.roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r')]
|
179
183
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE ((parent_id IS NULL) OR (parent_id2 IS NULL))"]
|
180
184
|
end
|
@@ -184,7 +188,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
184
188
|
end
|
185
189
|
|
186
190
|
it "should have ancestors return the ancestors of the current node" do
|
187
|
-
@
|
191
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]])
|
188
192
|
@o.ancestors.must_equal [@c.load(:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'), @c.load(:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2')]
|
189
193
|
sqls = @db.sqls
|
190
194
|
sqls.length.must_equal 2
|
@@ -193,7 +197,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
193
197
|
end
|
194
198
|
|
195
199
|
it "should have descendants return the descendants of the current node" do
|
196
|
-
@
|
200
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'}, {:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'}], [{:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3'}], []])
|
197
201
|
@o.descendants.must_equal [@c.load(:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'), @c.load(:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'), @c.load(:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3')]
|
198
202
|
@db.sqls.must_equal ["SELECT * FROM nodes WHERE ((nodes.parent_id = 2) AND (nodes.parent_id2 = 5))",
|
199
203
|
"SELECT * FROM nodes WHERE ((nodes.parent_id = 3) AND (nodes.parent_id2 = 7))",
|
@@ -202,7 +206,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
202
206
|
end
|
203
207
|
|
204
208
|
it "should have root return the root of the current node" do
|
205
|
-
@
|
209
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]])
|
206
210
|
@o.root.must_equal @c.load(:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2')
|
207
211
|
sqls = @db.sqls
|
208
212
|
sqls.length.must_equal 2
|
@@ -222,7 +226,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
222
226
|
end
|
223
227
|
|
224
228
|
it "should have self_and_siblings return the children of the current node's parent" do
|
225
|
-
@
|
229
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]])
|
226
230
|
@o.self_and_siblings.must_equal [@c.load(:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'), @o]
|
227
231
|
sqls = @db.sqls
|
228
232
|
sqls.length.must_equal 2
|
@@ -231,7 +235,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
231
235
|
end
|
232
236
|
|
233
237
|
it "should have siblings return the children of the current node's parent, except for the current node" do
|
234
|
-
@
|
238
|
+
@c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]])
|
235
239
|
@o.siblings.must_equal [@c.load(:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2')]
|
236
240
|
sqls = @db.sqls
|
237
241
|
sqls.length.must_equal 2
|
@@ -245,30 +249,30 @@ describe Sequel::Model, "tree plugin with composite keys" do
|
|
245
249
|
end
|
246
250
|
|
247
251
|
it "prevents creating a second root" do
|
248
|
-
@c.dataset
|
252
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
249
253
|
lambda { @c.create }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
250
|
-
@c.dataset
|
254
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}])
|
251
255
|
lambda { @c.create(:parent_id2=>1) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
252
|
-
@c.dataset
|
256
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}])
|
253
257
|
lambda { @c.create(:parent_id=>2) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
254
258
|
end
|
255
259
|
|
256
260
|
it "errors when promoting an existing record to a second root" do
|
257
|
-
@c.dataset
|
261
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
|
258
262
|
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id => nil, :parent_id2=>nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
259
|
-
@c.dataset
|
263
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}])
|
260
264
|
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
261
|
-
@c.dataset
|
265
|
+
@c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}])
|
262
266
|
lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id2 => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
|
263
267
|
end
|
264
268
|
|
265
269
|
it "allows updating existing root" do
|
266
|
-
@c.dataset
|
267
|
-
|
268
|
-
@c.dataset
|
269
|
-
|
270
|
-
@c.dataset
|
271
|
-
|
270
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r')
|
271
|
+
@c.root.update(:name => 'fdsa')
|
272
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r')
|
273
|
+
@c.root.update(:name => 'fdsa')
|
274
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r')
|
275
|
+
@c.root.update(:name => 'fdsa')
|
272
276
|
end
|
273
277
|
end
|
274
278
|
end
|