Skip to content

Commit e7fba32

Browse files
authored
ROM 4.x integration (#56)
* Split ROM specs on v3 and v4 * Use activerecord42.gemfile for Ruby 2.2.5
1 parent 4dadcee commit e7fba32

File tree

6 files changed

+648
-314
lines changed

6 files changed

+648
-314
lines changed

.travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@ matrix:
1717
- rvm: 2.3.1
1818
gemfile: Gemfile
1919
- rvm: 2.2.5
20-
gemfile: Gemfile
20+
gemfile: gemfiles/activerecord42.gemfile
2121
- rvm: 2.2.0
2222
gemfile: gemfiles/activerecord42.gemfile

Gemfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ group :development, :test do
1010
gem 'dm-sqlite-adapter'
1111
gem 'dry-struct'
1212
gem 'dry-types'
13-
gem 'rom', '~> 3.0'
13+
gem 'rom', '~> 4.0'
1414
gem 'rom-repository'
1515
gem 'rom-sql'
1616
gem 'sequel'

spec/orms/rom/rom_3_spec.rb

+312
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,312 @@
1+
# frozen_string_literal: true
2+
3+
if ruby_22
4+
class UserModel
5+
include Surrealist
6+
7+
json_schema { { id: Integer, email: String } }
8+
9+
attr_reader :id, :name, :email
10+
11+
def initialize(attributes)
12+
@id, @name, @email = attributes.values_at(:id, :name, :email)
13+
end
14+
end
15+
16+
class UsersMapper < ROM::Mapper
17+
register_as :user_obj
18+
relation :users
19+
model UserModel
20+
end
21+
22+
class SchemalessUser
23+
include Surrealist
24+
25+
attr_reader :id, :name, :email
26+
27+
def initialize(attributes)
28+
@id, @name, @email = attributes.values_at(:id, :name, :email)
29+
end
30+
end
31+
32+
class DelegatedUser < UserModel
33+
delegate_surrealization_to UserModel
34+
35+
def initialize(attributes)
36+
super
37+
@email = 'delegated@example.com'
38+
end
39+
end
40+
41+
class GrandChildUser < DelegatedUser
42+
end
43+
44+
class MapperWithoutSchema < ROM::Mapper
45+
register_as :user_wo_schema
46+
relation :users
47+
model SchemalessUser
48+
end
49+
50+
class MapperDelegatedSchema < ROM::Mapper
51+
register_as :user_de_schema
52+
relation :users
53+
model DelegatedUser
54+
end
55+
56+
class MapperInheritedDelegatedSchema < ROM::Mapper
57+
register_as :user_child_de_schema
58+
relation :users
59+
model GrandChildUser
60+
end
61+
62+
container = ROM.container(:sql, ['sqlite::memory']) do |conf|
63+
conf.default.create_table(:users) do
64+
primary_key :id
65+
column :name, String, null: false
66+
column :email, String, null: false
67+
end
68+
69+
conf.register_mapper(UsersMapper)
70+
conf.register_mapper(MapperWithoutSchema)
71+
conf.register_mapper(MapperDelegatedSchema)
72+
conf.register_mapper(MapperInheritedDelegatedSchema)
73+
conf.commands(:users) do
74+
define(:create)
75+
end
76+
end
77+
78+
class UserRepo < ROM::Repository[:users]
79+
commands :create, update: :by_pk, delete: :by_pk
80+
end
81+
82+
class RomUser < Dry::Struct
83+
include Surrealist
84+
85+
attribute :name, String
86+
attribute :email, String
87+
88+
json_schema { { email: String } }
89+
end
90+
91+
class ROM::Struct::User < ROM::Struct
92+
include Surrealist
93+
94+
json_schema { { name: String } }
95+
end
96+
97+
RSpec.describe 'ROM Integration' do
98+
let(:user_repo) { UserRepo.new(container) }
99+
let(:users) { user_repo.users }
100+
let(:parsed_collection) { JSON.parse(Surrealist.surrealize_collection(collection)) }
101+
102+
before(:all) do
103+
user_repo = UserRepo.new(container)
104+
[
105+
{ name: 'Jane Struct', email: 'jane@struct.rom' },
106+
{ name: 'Dane As', email: 'dane@as.rom' },
107+
{ name: 'Jack Mapper', email: 'jack@mapper.rom' },
108+
].each { |user| user_repo.create(user) }
109+
end
110+
111+
context 'with schema defined in ROM::Struct::Model' do
112+
context 'instance' do
113+
let(:instance) { users.to_a.first }
114+
let(:result) { '{"name":"Jane Struct"}' }
115+
116+
it { expect(instance.surrealize).to eq(result) }
117+
it_behaves_like 'error is not raised for valid params: instance'
118+
it_behaves_like 'error is raised for invalid params: instance'
119+
120+
context '#where().first' do
121+
let(:instance) { users.where(id: 1).first }
122+
let(:result) { '{"name":"Jane Struct"}' }
123+
124+
it { expect(instance.surrealize).to eq(result) }
125+
it_behaves_like 'error is not raised for valid params: instance'
126+
it_behaves_like 'error is raised for invalid params: instance'
127+
end
128+
end
129+
130+
context 'collection' do
131+
let(:collection) { users.to_a }
132+
let(:result) do
133+
[{ 'name' => 'Jane Struct' },
134+
{ 'name' => 'Dane As' },
135+
{ 'name' => 'Jack Mapper' }]
136+
end
137+
138+
it { expect(parsed_collection).to eq(result) }
139+
it_behaves_like 'error is not raised for valid params: collection'
140+
it_behaves_like 'error is raised for invalid params: collection'
141+
142+
context '#where().to_a' do
143+
let(:collection) { users.where { id < 4 }.to_a }
144+
145+
it { expect(parsed_collection).to eq(result) }
146+
it_behaves_like 'error is not raised for valid params: collection'
147+
it_behaves_like 'error is raised for invalid params: collection'
148+
end
149+
end
150+
end
151+
152+
context 'using ROM::Struct::Model#as(Representative)' do
153+
context 'instance' do
154+
let(:instance) { users.as(RomUser).to_a[1] }
155+
let(:result) { '{"email":"dane@as.rom"}' }
156+
157+
it { expect(instance.surrealize).to eq(result) }
158+
it_behaves_like 'error is not raised for valid params: instance'
159+
it_behaves_like 'error is raised for invalid params: instance'
160+
161+
context '#where().first' do
162+
let(:instance) { users.as(RomUser).where(id: 2).first }
163+
164+
it { expect(instance.surrealize).to eq(result) }
165+
it_behaves_like 'error is not raised for valid params: instance'
166+
it_behaves_like 'error is raised for invalid params: instance'
167+
end
168+
end
169+
170+
context 'collection' do
171+
let(:collection) { users.as(RomUser).to_a }
172+
let(:result) do
173+
[{ 'email' => 'jane@struct.rom' },
174+
{ 'email' => 'dane@as.rom' },
175+
{ 'email' => 'jack@mapper.rom' }]
176+
end
177+
178+
it { expect(parsed_collection).to eq(result) }
179+
it_behaves_like 'error is not raised for valid params: collection'
180+
it_behaves_like 'error is raised for invalid params: collection'
181+
182+
context '#where().to_a' do
183+
let(:collection) { users.as(RomUser).where { id < 4 }.to_a }
184+
185+
it { expect(parsed_collection).to eq(result) }
186+
it_behaves_like 'error is not raised for valid params: collection'
187+
it_behaves_like 'error is raised for invalid params: collection'
188+
end
189+
end
190+
end
191+
192+
context 'using mapper' do
193+
context 'instance' do
194+
let(:instance) { users.as(:user_obj).to_a[2] }
195+
let(:result) { '{"id":3,"email":"jack@mapper.rom"}' }
196+
197+
it { expect(instance.surrealize).to eq(result) }
198+
it { expect(users.as(:user_obj).to_a.size).to eq(3) }
199+
it_behaves_like 'error is not raised for valid params: instance'
200+
it_behaves_like 'error is raised for invalid params: instance'
201+
202+
context '#where().first' do
203+
let(:instance) { users.as(:user_obj).where(id: 3).first }
204+
205+
it { expect(instance.surrealize).to eq(result) }
206+
it_behaves_like 'error is not raised for valid params: instance'
207+
it_behaves_like 'error is raised for invalid params: instance'
208+
end
209+
end
210+
211+
context 'collection' do
212+
let(:collection) { users.as(:user_obj).to_a }
213+
let(:result) do
214+
[{ 'id' => 1, 'email' => 'jane@struct.rom' },
215+
{ 'id' => 2, 'email' => 'dane@as.rom' },
216+
{ 'id' => 3, 'email' => 'jack@mapper.rom' }]
217+
end
218+
219+
it { expect(parsed_collection).to eq(result) }
220+
it_behaves_like 'error is not raised for valid params: collection'
221+
it_behaves_like 'error is raised for invalid params: collection'
222+
223+
context '#where().to_a' do
224+
let(:collection) { users.as(:user_obj).where { id < 4 }.to_a }
225+
226+
it { expect(parsed_collection).to eq(result) }
227+
it_behaves_like 'error is not raised for valid params: collection'
228+
it_behaves_like 'error is raised for invalid params: collection'
229+
end
230+
end
231+
end
232+
233+
context 'with no schema provided' do
234+
let(:instance) { users.as(:user_wo_schema).first }
235+
let(:collection) { users.as(:user_wo_schema).to_a }
236+
237+
describe 'UnknownSchemaError is raised' do
238+
specify 'for instance' do
239+
expect { instance.surrealize }
240+
.to raise_error(Surrealist::UnknownSchemaError,
241+
"Can't serialize SchemalessUser - no schema was provided.")
242+
end
243+
244+
specify 'for collection' do
245+
expect { Surrealist.surrealize_collection(collection) }
246+
.to raise_error(Surrealist::UnknownSchemaError,
247+
"Can't serialize SchemalessUser - no schema was provided.")
248+
end
249+
end
250+
end
251+
252+
context 'with delegated schema' do
253+
context 'for instance' do
254+
let(:instance) { users.as(:user_de_schema).to_a[2] }
255+
let(:result) { '{"id":3,"email":"delegated@example.com"}' }
256+
257+
it { expect(instance.surrealize).to eq(result) }
258+
it { expect(users.as(:user_de_schema).to_a.size).to eq(3) }
259+
it_behaves_like 'error is not raised for valid params: instance'
260+
it_behaves_like 'error is raised for invalid params: instance'
261+
262+
context '#where().first' do
263+
let(:instance) { users.as(:user_de_schema).where(id: 3).first }
264+
265+
it { expect(instance.surrealize).to eq(result) }
266+
it_behaves_like 'error is not raised for valid params: instance'
267+
it_behaves_like 'error is raised for invalid params: instance'
268+
end
269+
end
270+
271+
context 'for collection' do
272+
let(:collection) { users.as(:user_de_schema).to_a }
273+
let(:result) do
274+
[{ 'id' => 1, 'email' => 'delegated@example.com' },
275+
{ 'id' => 2, 'email' => 'delegated@example.com' },
276+
{ 'id' => 3, 'email' => 'delegated@example.com' }]
277+
end
278+
279+
it { expect(parsed_collection).to eq(result) }
280+
it_behaves_like 'error is not raised for valid params: collection'
281+
it_behaves_like 'error is raised for invalid params: collection'
282+
283+
context '#where().to_a' do
284+
let(:collection) { users.as(:user_de_schema).where { id < 4 }.to_a }
285+
286+
it { expect(parsed_collection).to eq(result) }
287+
it_behaves_like 'error is not raised for valid params: collection'
288+
it_behaves_like 'error is raised for invalid params: collection'
289+
end
290+
end
291+
end
292+
293+
context 'with inheritance of class that has delegated but we don\'t delegate' do
294+
let(:instance) { users.as(:user_child_de_schema).first }
295+
let(:collection) { users.as(:user_child_de_schema).to_a }
296+
297+
describe 'UnknownSchemaError is raised' do
298+
specify 'for instance' do
299+
expect { instance.surrealize }
300+
.to raise_error(Surrealist::UnknownSchemaError,
301+
"Can't serialize GrandChildUser - no schema was provided.")
302+
end
303+
304+
specify 'for collection' do
305+
expect { Surrealist.surrealize_collection(collection) }
306+
.to raise_error(Surrealist::UnknownSchemaError,
307+
"Can't serialize GrandChildUser - no schema was provided.")
308+
end
309+
end
310+
end
311+
end
312+
end

0 commit comments

Comments
 (0)