rom-sql 1.0.1 → 1.0.2

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile +1 -0
  4. data/lib/rom/sql/attribute.rb +1 -1
  5. data/lib/rom/sql/projection_dsl.rb +6 -0
  6. data/lib/rom/sql/version.rb +1 -1
  7. data/rom-sql.gemspec +1 -1
  8. data/spec/integration/association/many_to_many/custom_fks_spec.rb +9 -13
  9. data/spec/integration/association/many_to_many/from_view_spec.rb +9 -8
  10. data/spec/integration/association/many_to_many_spec.rb +103 -102
  11. data/spec/integration/association/many_to_one/custom_fks_spec.rb +6 -7
  12. data/spec/integration/association/many_to_one/from_view_spec.rb +8 -4
  13. data/spec/integration/association/many_to_one_spec.rb +61 -54
  14. data/spec/integration/association/one_to_many/custom_fks_spec.rb +7 -6
  15. data/spec/integration/association/one_to_many/from_view_spec.rb +7 -10
  16. data/spec/integration/association/one_to_many/self_ref_spec.rb +6 -6
  17. data/spec/integration/association/one_to_many_spec.rb +0 -3
  18. data/spec/integration/association/one_to_one_spec.rb +17 -11
  19. data/spec/integration/association/one_to_one_through_spec.rb +3 -5
  20. data/spec/integration/commands/create_spec.rb +33 -22
  21. data/spec/integration/commands/update_spec.rb +3 -3
  22. data/spec/integration/commands/upsert_spec.rb +1 -1
  23. data/spec/integration/gateway_spec.rb +12 -8
  24. data/spec/integration/migration_spec.rb +4 -3
  25. data/spec/integration/plugins/associates/many_to_many_spec.rb +2 -2
  26. data/spec/integration/plugins/associates_spec.rb +1 -1
  27. data/spec/integration/relation_schema_spec.rb +4 -5
  28. data/spec/integration/schema/call_spec.rb +1 -1
  29. data/spec/integration/schema/inferrer/mysql_spec.rb +22 -23
  30. data/spec/integration/schema/inferrer/postgres_spec.rb +83 -82
  31. data/spec/integration/schema/inferrer/sqlite_spec.rb +18 -19
  32. data/spec/integration/schema/inferrer_spec.rb +54 -33
  33. data/spec/integration/schema/prefix_spec.rb +9 -11
  34. data/spec/integration/schema/qualified_spec.rb +9 -11
  35. data/spec/integration/schema/rename_spec.rb +13 -15
  36. data/spec/integration/schema/view_spec.rb +2 -2
  37. data/spec/integration/sequel_api_spec.rb +1 -1
  38. data/spec/integration/setup_spec.rb +5 -5
  39. data/spec/integration/support/active_support_notifications_spec.rb +2 -2
  40. data/spec/integration/support/rails_log_subscriber_spec.rb +2 -2
  41. data/spec/shared/accounts.rb +44 -0
  42. data/spec/shared/database_setup.rb +42 -81
  43. data/spec/shared/notes.rb +21 -0
  44. data/spec/shared/posts.rb +32 -0
  45. data/spec/shared/puppies.rb +13 -0
  46. data/spec/shared/relations.rb +1 -1
  47. data/spec/shared/users.rb +29 -0
  48. data/spec/shared/users_and_tasks.rb +32 -18
  49. data/spec/spec_helper.rb +18 -30
  50. data/spec/support/env_helper.rb +25 -0
  51. data/spec/support/oracle/create_users.sql +7 -0
  52. data/spec/support/oracle/set_sys_passwords.sql +2 -0
  53. data/spec/unit/plugin/pagination_spec.rb +2 -2
  54. data/spec/unit/plugin/timestamp_spec.rb +1 -1
  55. data/spec/unit/projection_dsl_spec.rb +8 -0
  56. data/spec/unit/relation/group_spec.rb +5 -3
  57. data/spec/unit/relation/max_spec.rb +1 -1
  58. data/spec/unit/relation/select_spec.rb +7 -0
  59. metadata +33 -5
  60. data/spec/shared/users_and_accounts.rb +0 -10
@@ -1,7 +1,7 @@
1
1
  require 'dry-struct'
2
2
 
3
- RSpec.describe 'Commands / Update' do
4
- include_context 'database setup'
3
+ RSpec.describe 'Commands / Update', seeds: false do
4
+ include_context 'users'
5
5
 
6
6
  subject(:users) { container.command(:users) }
7
7
 
@@ -73,7 +73,7 @@ RSpec.describe 'Commands / Update' do
73
73
 
74
74
  expect {
75
75
  users.update.by_id(piotr[:id]).call(name: nil)
76
- }.to raise_error(ROM::SQL::NotNullConstraintError, /name/)
76
+ }.to raise_error(ROM::SQL::NotNullConstraintError, /name/i)
77
77
  end
78
78
 
79
79
  it 'materializes single result' do
@@ -1,4 +1,4 @@
1
- RSpec.describe 'Commands / Postgres / Upsert', :postgres do
1
+ RSpec.describe 'Commands / Postgres / Upsert', :postgres, seeds: false do
2
2
  subject(:command) { commands[:tasks][:create_or_update] }
3
3
 
4
4
  include_context 'relations'
@@ -1,19 +1,17 @@
1
- RSpec.describe ROM::SQL::Gateway, :postgres, skip_tables: true do
1
+ RSpec.describe ROM::SQL::Gateway, :postgres do
2
2
  include_context 'database setup'
3
3
 
4
4
  describe 'migration' do
5
+ before do
6
+ inferrable_relations.concat %i(rabbits carrots)
7
+ end
8
+
5
9
  context 'creating migrations inline' do
6
10
  subject(:gateway) { container.gateways[:default] }
7
11
 
8
12
  let(:conf) { ROM::Configuration.new(:sql, conn) }
9
13
  let(:container) { ROM.container(conf) }
10
14
 
11
- after do
12
- [:rabbits, :carrots].each do |name|
13
- gateway.connection.drop_table?(name)
14
- end
15
- end
16
-
17
15
  it 'allows creating and running migrations' do
18
16
  migration = gateway.migration do
19
17
  up do
@@ -39,6 +37,10 @@ RSpec.describe ROM::SQL::Gateway, :postgres, skip_tables: true do
39
37
  end
40
38
 
41
39
  context 'running migrations from a file system' do
40
+ before do
41
+ inferrable_relations.concat %i(schema_migrations)
42
+ end
43
+
42
44
  let(:migration_dir) do
43
45
  Pathname(__FILE__).dirname.join('../fixtures/migrations').realpath
44
46
  end
@@ -64,8 +66,10 @@ RSpec.describe ROM::SQL::Gateway, :postgres, skip_tables: true do
64
66
 
65
67
  describe 'transactions' do
66
68
  before do
67
- conn.drop_table?(:names)
69
+ inferrable_relations.concat %i(names)
70
+ end
68
71
 
72
+ before do
69
73
  conn.create_table(:names) do
70
74
  String :name
71
75
  end
@@ -1,11 +1,12 @@
1
- RSpec.describe ROM::SQL, '.migration', :postgres, skip_tables: true do
1
+ RSpec.describe ROM::SQL, '.migration', :postgres do
2
2
  include_context 'database setup'
3
3
 
4
4
  before do
5
- conf
6
- conn.drop_table?(:dragons)
5
+ inferrable_relations.concat %i(dragons schema_migrations)
7
6
  end
8
7
 
8
+ before { conf }
9
+
9
10
  it 'creates a migration for a specific gateway' do
10
11
  migration = ROM::SQL.migration do
11
12
  change do
@@ -1,5 +1,5 @@
1
- RSpec.describe 'Plugins / :associates / with many-to-many', :sqlite do
2
- include_context 'database setup'
1
+ RSpec.describe 'Plugins / :associates / with many-to-many', :sqlite, seeds: false do
2
+ include_context 'users and tasks'
3
3
 
4
4
  let(:tasks) { container.commands[:tasks] }
5
5
  let(:tags) { container.commands[:tags] }
@@ -1,4 +1,4 @@
1
- RSpec.describe 'Plugins / :associates' do
1
+ RSpec.describe 'Plugins / :associates', seeds: false do
2
2
  include_context 'relations'
3
3
 
4
4
  with_adapters do
@@ -1,5 +1,6 @@
1
1
  RSpec.describe 'Inferring schema from database' do
2
- include_context 'database setup'
2
+ include_context 'users'
3
+ include_context 'posts'
3
4
 
4
5
  with_adapters do
5
6
  context "when database schema exists" do
@@ -13,13 +14,11 @@ RSpec.describe 'Inferring schema from database' do
13
14
 
14
15
  context "for empty database schemas" do
15
16
  it "returns an empty schema" do
16
- drop_tables
17
-
18
- expect { container.not_here }.to raise_error(NoMethodError)
17
+ expect { container.users }.to raise_error(NoMethodError)
19
18
  end
20
19
  end
21
20
 
22
- context 'defining associations' do
21
+ context 'defining associations', seeds: false do
23
22
  it "allows defining a one-to-many" do
24
23
  class Test::Posts < ROM::Relation[:sql]
25
24
  schema(:posts) do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe ROM::SQL::Schema, '#call' do
4
- include_context 'database setup'
4
+ include_context 'users'
5
5
 
6
6
  with_adapters :postgres do
7
7
  before do
@@ -2,45 +2,44 @@ RSpec.describe 'ROM::SQL::Schema::MysqlInferrer', :mysql do
2
2
  include_context 'database setup'
3
3
 
4
4
  before do
5
- conn.drop_table?(:test_inferrence)
5
+ inferrable_relations.concat %i(test_inferrence)
6
+ end
6
7
 
8
+ before do
7
9
  conn.create_table :test_inferrence do
8
10
  tinyint :tiny
9
11
  mediumint :medium
12
+ bigint :big
10
13
  datetime :created_at
11
14
  column :date_and_time, 'datetime(0)'
12
15
  column :time_with_ms, 'datetime(3)'
13
16
  timestamp :unix_time_usec
14
17
  column :unix_time_sec, 'timestamp(0) null'
18
+ boolean :flag, null: false
15
19
  end
16
20
  end
17
21
 
18
- after do
19
- conn.drop_table?(:test_inferrence)
20
- end
21
-
22
- let(:dataset) { :test_inferrence }
23
-
24
- let(:schema) { container.relations[dataset].schema }
25
-
26
22
  before do
27
- dataset = self.dataset
28
- conf.relation(dataset) do
29
- schema(dataset, infer: true)
23
+ conf.relation(:test_inferrence) do
24
+ schema(infer: true)
30
25
  end
31
26
  end
32
27
 
33
- it 'can infer attributes for dataset' do
34
- source = container.relations[:test_inferrence].name
28
+ let(:schema) { container.relations[:test_inferrence].schema }
29
+ let(:source) { container.relations[:test_inferrence].name }
35
30
 
36
- expect(schema.to_h).to eql(
37
- tiny: ROM::SQL::Types::Int.optional.meta(name: :tiny, source: source),
38
- medium: ROM::SQL::Types::Int.optional.meta(name: :medium, source: source),
39
- created_at: ROM::SQL::Types::Time.optional.meta(name: :created_at, source: source),
40
- date_and_time: ROM::SQL::Types::Time.optional.meta(name: :date_and_time, source: source),
41
- time_with_ms: ROM::SQL::Types::Time.optional.meta(name: :time_with_ms, source: source),
42
- unix_time_usec: ROM::SQL::Types::Time.meta(name: :unix_time_usec, source: source),
43
- unix_time_sec: ROM::SQL::Types::Time.optional.meta(name: :unix_time_sec, source: source)
44
- )
31
+ it 'can infer attributes for dataset' do
32
+ expect(schema.to_h).
33
+ to eql(
34
+ tiny: ROM::SQL::Types::Int.optional.meta(name: :tiny, source: source),
35
+ medium: ROM::SQL::Types::Int.optional.meta(name: :medium, source: source),
36
+ big: ROM::SQL::Types::Int.optional.meta(name: :big, source: source),
37
+ created_at: ROM::SQL::Types::Time.optional.meta(name: :created_at, source: source),
38
+ date_and_time: ROM::SQL::Types::Time.optional.meta(name: :date_and_time, source: source),
39
+ time_with_ms: ROM::SQL::Types::Time.optional.meta(name: :time_with_ms, source: source),
40
+ unix_time_usec: ROM::SQL::Types::Time.meta(name: :unix_time_usec, source: source),
41
+ unix_time_sec: ROM::SQL::Types::Time.optional.meta(name: :unix_time_sec, source: source),
42
+ flag: ROM::SQL::Types::Bool.meta(name: :flag, source: source)
43
+ )
45
44
  end
46
45
  end
@@ -1,6 +1,10 @@
1
1
  RSpec.describe 'ROM::SQL::Schema::PostgresInferrer', :postgres do
2
2
  include_context 'database setup'
3
3
 
4
+ before do
5
+ inferrable_relations.concat %i(test_inferrence)
6
+ end
7
+
4
8
  colors = %w(red orange yellow green blue purple)
5
9
 
6
10
  before do
@@ -14,6 +18,7 @@ RSpec.describe 'ROM::SQL::Schema::PostgresInferrer', :postgres do
14
18
 
15
19
  conn.create_table :test_inferrence do
16
20
  primary_key :id, :uuid
21
+ bigint :big
17
22
  Json :json_data
18
23
  Jsonb :jsonb_data
19
24
  Decimal :money, null: false
@@ -35,92 +40,88 @@ RSpec.describe 'ROM::SQL::Schema::PostgresInferrer', :postgres do
35
40
  timestamp :created_at
36
41
  column :datetime, "timestamp(0) without time zone"
37
42
  column :datetime_tz, "timestamp(0) with time zone"
43
+ boolean :flag, null: false
38
44
  end
39
45
  end
40
46
 
41
- after do
42
- conn.drop_table?(:test_inferrence)
43
- end
44
-
45
- let(:dataset) { :test_inferrence }
46
-
47
- let(:schema) { container.relations[dataset].schema }
47
+ let(:schema) { container.relations[:test_inferrence].schema }
48
+ let(:source) { container.relations[:test_inferrence].name }
48
49
 
49
50
  context 'inferring db-specific attributes' do
50
51
  before do
51
- dataset = self.dataset
52
- conf.relation(dataset) do
53
- schema(dataset, infer: true)
52
+ conf.relation(:test_inferrence) do
53
+ schema(infer: true)
54
54
  end
55
55
  end
56
56
 
57
57
  it 'can infer attributes for dataset' do
58
- source = container.relations[:test_inferrence].name
59
-
60
- expect(schema.to_h).to eql(
61
- id: ROM::SQL::Types::PG::UUID.meta(name: :id, source: source, primary_key: true),
62
- json_data: ROM::SQL::Types::PG::JSON.optional.meta(name: :json_data, source: source),
63
- jsonb_data: ROM::SQL::Types::PG::JSONB.optional.meta(name: :jsonb_data, source: source),
64
- money: ROM::SQL::Types::Decimal.meta(name: :money, source: source),
65
- tags: ROM::SQL::Types::PG::Array('text').optional.meta(name: :tags, source: source),
66
- tag_ids: ROM::SQL::Types::PG::Array('biging').optional.meta(name: :tag_ids, source: source),
67
- color: ROM::SQL::Types::String.enum(*colors).optional.meta(name: :color, source: source),
68
- ip: ROM::SQL::Types::PG::IPAddress.optional.meta(
69
- name: :ip,
70
- source: source,
71
- read: ROM::SQL::Types::PG::IPAddressR.optional
72
- ),
73
- subnet: ROM::SQL::Types::PG::IPAddress.optional.meta(
74
- name: :subnet,
75
- source: source,
76
- read: ROM::SQL::Types::PG::IPAddressR.optional
77
- ),
78
- hw_address: ROM::SQL::Types::String.optional.meta(name: :hw_address, source: source),
79
- center: ROM::SQL::Types::PG::PointT.optional.meta(
80
- name: :center,
81
- source: source,
82
- read: ROM::SQL::Types::PG::PointTR.optional
83
- ),
84
- page: ROM::SQL::Types::String.optional.meta(name: :page, source: source),
85
- mapping: ROM::SQL::Types::PG::HStore.optional.meta(
86
- name: :mapping,
87
- source: source,
88
- read: ROM::SQL::Types::PG::HStoreR.optional
89
- ),
90
- line: ROM::SQL::Types::PG::LineT.optional.meta(
91
- name: :line,
92
- source: source,
93
- read: ROM::SQL::Types::PG::LineTR.optional
94
- ),
95
- circle: ROM::SQL::Types::PG::CircleT.optional.meta(
96
- name: :circle,
97
- source: source,
98
- read: ROM::SQL::Types::PG::CircleTR.optional
99
- ),
100
- box: ROM::SQL::Types::PG::BoxT.optional.meta(
101
- name: :box,
102
- source: source,
103
- read: ROM::SQL::Types::PG::BoxTR.optional
104
- ),
105
- lseg: ROM::SQL::Types::PG::LineSegmentT.optional.meta(
106
- name: :lseg,
107
- source: source,
108
- read: ROM::SQL::Types::PG::LineSegmentTR.optional
109
- ),
110
- polygon: ROM::SQL::Types::PG::PolygonT.optional.meta(
111
- name: :polygon,
112
- source: source,
113
- read: ROM::SQL::Types::PG::PolygonTR.optional
114
- ),
115
- path: ROM::SQL::Types::PG::PathT.optional.meta(
116
- name: :path,
117
- source: source,
118
- read: ROM::SQL::Types::PG::PathTR.optional
119
- ),
120
- created_at: ROM::SQL::Types::Time.optional.meta(name: :created_at, source: source),
121
- datetime: ROM::SQL::Types::Time.optional.meta(name: :datetime, source: source),
122
- datetime_tz: ROM::SQL::Types::Time.optional.meta(name: :datetime_tz, source: source)
123
- )
58
+ expect(schema.to_h).
59
+ to eql(
60
+ id: ROM::SQL::Types::PG::UUID.meta(name: :id, source: source, primary_key: true),
61
+ big: ROM::SQL::Types::Int.optional.meta(name: :big, source: source),
62
+ json_data: ROM::SQL::Types::PG::JSON.optional.meta(name: :json_data, source: source),
63
+ jsonb_data: ROM::SQL::Types::PG::JSONB.optional.meta(name: :jsonb_data, source: source),
64
+ money: ROM::SQL::Types::Decimal.meta(name: :money, source: source),
65
+ tags: ROM::SQL::Types::PG::Array('text').optional.meta(name: :tags, source: source),
66
+ tag_ids: ROM::SQL::Types::PG::Array('biging').optional.meta(name: :tag_ids, source: source),
67
+ color: ROM::SQL::Types::String.enum(*colors).optional.meta(name: :color, source: source),
68
+ ip: ROM::SQL::Types::PG::IPAddress.optional.meta(
69
+ name: :ip,
70
+ source: source,
71
+ read: ROM::SQL::Types::PG::IPAddressR.optional
72
+ ),
73
+ subnet: ROM::SQL::Types::PG::IPAddress.optional.meta(
74
+ name: :subnet,
75
+ source: source,
76
+ read: ROM::SQL::Types::PG::IPAddressR.optional
77
+ ),
78
+ hw_address: ROM::SQL::Types::String.optional.meta(name: :hw_address, source: source),
79
+ center: ROM::SQL::Types::PG::PointT.optional.meta(
80
+ name: :center,
81
+ source: source,
82
+ read: ROM::SQL::Types::PG::PointTR.optional
83
+ ),
84
+ page: ROM::SQL::Types::String.optional.meta(name: :page, source: source),
85
+ mapping: ROM::SQL::Types::PG::HStore.optional.meta(
86
+ name: :mapping,
87
+ source: source,
88
+ read: ROM::SQL::Types::PG::HStoreR.optional
89
+ ),
90
+ line: ROM::SQL::Types::PG::LineT.optional.meta(
91
+ name: :line,
92
+ source: source,
93
+ read: ROM::SQL::Types::PG::LineTR.optional
94
+ ),
95
+ circle: ROM::SQL::Types::PG::CircleT.optional.meta(
96
+ name: :circle,
97
+ source: source,
98
+ read: ROM::SQL::Types::PG::CircleTR.optional
99
+ ),
100
+ box: ROM::SQL::Types::PG::BoxT.optional.meta(
101
+ name: :box,
102
+ source: source,
103
+ read: ROM::SQL::Types::PG::BoxTR.optional
104
+ ),
105
+ lseg: ROM::SQL::Types::PG::LineSegmentT.optional.meta(
106
+ name: :lseg,
107
+ source: source,
108
+ read: ROM::SQL::Types::PG::LineSegmentTR.optional
109
+ ),
110
+ polygon: ROM::SQL::Types::PG::PolygonT.optional.meta(
111
+ name: :polygon,
112
+ source: source,
113
+ read: ROM::SQL::Types::PG::PolygonTR.optional
114
+ ),
115
+ path: ROM::SQL::Types::PG::PathT.optional.meta(
116
+ name: :path,
117
+ source: source,
118
+ read: ROM::SQL::Types::PG::PathTR.optional
119
+ ),
120
+ created_at: ROM::SQL::Types::Time.optional.meta(name: :created_at, source: source),
121
+ datetime: ROM::SQL::Types::Time.optional.meta(name: :datetime, source: source),
122
+ datetime_tz: ROM::SQL::Types::Time.optional.meta(name: :datetime_tz, source: source),
123
+ flag: ROM::SQL::Types::Bool.meta(name: :flag, source: source)
124
+ )
124
125
  end
125
126
  end
126
127
 
@@ -137,7 +138,6 @@ RSpec.describe 'ROM::SQL::Schema::PostgresInferrer', :postgres do
137
138
 
138
139
  context 'with a column with bi-directional mapping' do
139
140
  before do
140
- conn.drop_table?(:test_bidirectional)
141
141
  conn.execute('create extension if not exists hstore')
142
142
 
143
143
  conn.create_table(:test_bidirectional) do
@@ -191,11 +191,12 @@ RSpec.describe 'ROM::SQL::Schema::PostgresInferrer', :postgres do
191
191
  line: line, circle: circle, lseg: lseg, box: box,
192
192
  polygon: polygon, closed_path: closed_path, open_path: open_path
193
193
  )
194
- expect(inserted).to eql(
195
- id: 1, center: point, ip: dns, mapping: mapping,
196
- line: line, circle: circle, lseg: lseg, box: box_corrected,
197
- polygon: polygon, closed_path: closed_path, open_path: open_path
198
- )
194
+ expect(inserted).
195
+ to eql(
196
+ id: 1, center: point, ip: dns, mapping: mapping,
197
+ line: line, circle: circle, lseg: lseg, box: box_corrected,
198
+ polygon: polygon, closed_path: closed_path, open_path: open_path
199
+ )
199
200
  expect(relation.to_a).to eql([inserted])
200
201
  end
201
202
  end
@@ -2,37 +2,36 @@ RSpec.describe 'ROM::SQL::Schema::SqliteInferrer', :sqlite do
2
2
  include_context 'database setup'
3
3
 
4
4
  before do
5
- conn.drop_table?(:test_inferrence)
5
+ inferrable_relations.concat %i(test_inferrence)
6
+ end
6
7
 
8
+ before do
7
9
  conn.create_table :test_inferrence do
8
10
  tinyint :tiny
9
11
  int8 :big
12
+ bigint :long
10
13
  column :dummy, nil
14
+ boolean :flag, null: false
11
15
  end
12
16
  end
13
17
 
14
- after do
15
- conn.drop_table?(:test_inferrence)
16
- end
17
-
18
- let(:dataset) { :test_inferrence }
19
-
20
- let(:schema) { container.relations[dataset].schema }
21
-
22
18
  before do
23
- dataset = self.dataset
24
- conf.relation(dataset) do
25
- schema(dataset, infer: true)
19
+ conf.relation(:test_inferrence) do
20
+ schema(infer: true)
26
21
  end
27
22
  end
28
23
 
29
- it 'can infer attributes for dataset' do
30
- source = container.relations[:test_inferrence].name
24
+ let(:schema) { container.relations[:test_inferrence].schema }
25
+ let(:source) { container.relations[:test_inferrence].name }
31
26
 
32
- expect(schema.to_h).to eql(
33
- tiny: ROM::SQL::Types::Int.optional.meta(name: :tiny, source: source),
34
- big: ROM::SQL::Types::Int.optional.meta(name: :big, source: source),
35
- dummy: ROM::SQL::Types::SQLite::Object.optional.meta(name: :dummy, source: source)
36
- )
27
+ it 'can infer attributes for dataset' do
28
+ expect(schema.to_h).
29
+ to eql(
30
+ tiny: ROM::SQL::Types::Int.optional.meta(name: :tiny, source: source),
31
+ big: ROM::SQL::Types::Int.optional.meta(name: :big, source: source),
32
+ long: ROM::SQL::Types::Int.optional.meta(name: :long, source: source),
33
+ dummy: ROM::SQL::Types::SQLite::Object.optional.meta(name: :dummy, source: source),
34
+ flag: ROM::SQL::Types::Bool.meta(name: :flag, source: source)
35
+ )
37
36
  end
38
37
  end