dm-filemaker-adapter 0.0.3 → 0.0.4

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.
@@ -24,36 +24,12 @@ require 'spec_helper'
24
24
  # end
25
25
 
26
26
  describe DataMapper do
27
- before :each do
28
- DataMapper.setup(:default, 'filemaker://user:pass@hostname.com/DatabaseName')
29
- class ::User
30
- include DataMapper::Resource
31
- property :id, Serial
32
- property :email, String
33
- property :username, String
34
- property :activated_at, DateTime
35
-
36
- has n, :orders
37
- end
38
- class ::Order
39
- include DataMapper::Resource
40
- property :id, Serial
41
- property :total, Decimal
42
-
43
- belongs_to :user
44
- end
45
- DataMapper.finalize
46
- end
47
27
 
48
28
  describe DataMapper::Adapters::FilemakerAdapter do
49
29
 
50
30
  it 'Has a version number' do
51
31
  expect(DataMapper::Adapters::FilemakerAdapter::VERSION).not_to be nil
52
32
  end
53
-
54
- it 'Does something useful' do
55
- expect(true).to eq(true)
56
- end
57
33
 
58
34
  it 'Supports model classes' do
59
35
  expect(User.ancestors.include?(DataMapper::Adapters::FilemakerAdapter::ResourceMethods)).to eq(true)
@@ -78,13 +54,77 @@ describe DataMapper do
78
54
  end.and_return(Rfm::Resultset.allocate)
79
55
  User.all(:id=>1).inspect
80
56
  end
57
+
58
+ # Fix this to work with current relationships (not portals).
59
+ # it 'returns related datasets?' do
60
+ # # allow(User.layout).to receive(:find).and_return({
61
+ # # 'users'=>[{'id'=>100, 'email'=>'abc@def.com', 'username'=>'abc', 'activated_at'=>DateTime.now}],
62
+ # # 'orders'=>[{'user_id'=>100, 'total'=>123, 'id'=>999}]
63
+ # # })
64
+ # allow(User.layout).to receive(:find).and_return([
65
+ # {'id'=>100, 'email'=>'abc@def.com', 'username'=>'abc', 'activated_at'=>DateTime.now, :@orders=>[{'id'=>999, 'user_id'=>100, 'todal'=>123}] }
66
+ # ])
67
+ # user = User.get(100)
68
+ # puts "USER"
69
+ # puts user.inspect
70
+ # puts "USER-ORDERS"
71
+ # puts user.instance_variable_get(:@orders).inspect
72
+ # puts user.instance_variables.inspect
73
+ # end
74
+
81
75
  end
82
76
 
83
77
  describe '#create' do; it 'does something essential'; end
84
78
  describe '#update' do; it 'does something essential'; end
85
79
  describe '#delete' do; it 'does something essential'; end
86
80
  describe '#layout' do; it 'does something essential'; end
87
- describe '#prepare_fmp_attributes' do; it 'does something essential'; end
81
+
82
+ describe '#prepare_fmp_attributes' do
83
+ before(:each) {allow_any_instance_of(Rfm::Layout).to receive(:find).and_return(Rfm::Resultset.allocate)}
84
+ before(:each) {@original_method = DataMapper.repository.adapter.method(:prepare_fmp_attributes)}
85
+
86
+ it 'Converts dm attributes to fmp attributes' do
87
+ expect(DataMapper.repository.adapter).to receive(:prepare_fmp_attributes) do |attributes, *args|
88
+ expect(attributes.keys.first.class).to eq(DataMapper::Property::String)
89
+ expect(@original_method.call(attributes, *args)).to eq({"email"=>"==abc@def.com"})
90
+ {"email"=>"==abc@def.com"}
91
+ end
92
+ User.all(:email=>'abc@def.com').inspect
93
+ end
94
+
95
+ it 'Converts dm relationship object to fmp attributes' do
96
+ allow(User.layout).to receive(:find).and_return([{'id'=>100, 'email'=>'abc@def.com', 'username'=>'abc', 'activated_at'=>DateTime.now}])
97
+ user = User.get(100)
98
+ expect(DataMapper.repository.adapter).to receive(:prepare_fmp_attributes) do |attributes, *args|
99
+ expect((attributes.keys.first.class.name)[/Relationship/]).to eq('Relationship')
100
+ expect(attributes.keys.first.parent_key.first.class).to eq(DataMapper::Property::Serial)
101
+ #puts 'RAW ATTRIBUTES'
102
+ #puts attributes.class
103
+ #puts attributes.to_yaml
104
+ original_method_result = @original_method.call(attributes, *args)
105
+ expect(original_method_result).to eq({"user_id"=>"==100"})
106
+ #puts "PROCESSED ATTRIBUTES"
107
+ #puts original_method_result.to_yaml
108
+ original_method_result
109
+ end
110
+
111
+ user_orders = user.orders.inspect
112
+ #puts "USER ORDERS INSPECT"
113
+ #puts user_orders
114
+ end
115
+
116
+ it 'Applies comparison logic to operand value' do
117
+ expect(DataMapper.repository.adapter).to receive(:prepare_fmp_attributes) do |attributes, *args|
118
+ expect((attributes.keys.first.class.name)[/DateTime/]).to eq('DateTime')
119
+ expect((args.first.values.first)).to eq('>')
120
+ original_method_result = @original_method.call(attributes, *args)
121
+ expect(original_method_result.values.first[0] == '>').to eq(true)
122
+ original_method_result
123
+ end
124
+ User.all(:activated_at.gt=>DateTime.now).inspect
125
+ end
126
+ end
127
+
88
128
  describe '#merge_fmp_response' do; it 'does something essential'; end
89
129
 
90
130
  end # datamapper-adapters-filemaker
@@ -187,11 +227,44 @@ describe DataMapper do
187
227
  end
188
228
  end
189
229
 
190
- describe DataMapper::Model do
191
- describe '#finalize' do
192
- it 'Adds properties for :record_id, :mod_id to model'
193
- it 'Calls original #finalize method'
194
- end
195
- end
230
+ # This is now obsolete. Redo these specs to handle Model#load monkey-patching.
231
+ # describe DataMapper::Model do
232
+ # describe '#finalize' do
233
+ # it 'Adds properties for :_record_id, :_mod_id to resource' do
234
+ # allow(User.layout).to receive(:find).and_return([{'id'=>100, 'email'=>'abc@def.com', 'username'=>'abc', 'activated_at'=>DateTime.now}])
235
+ # user = User.get(100)
236
+ # expect(user._record_id).to eq('something')
237
+ # expect(user._mod_id).to eq('something')
238
+ # end
239
+ #
240
+ # it 'Calls original #finalize method'
241
+ # end
242
+ # end
196
243
 
197
244
  end # datamapper
245
+
246
+
247
+ describe Rfm::Resultset do
248
+ describe '#map' do
249
+ it 'Adds properties for :_record_id, :_mod_id to resource' do
250
+ expect_any_instance_of(Rfm::Connection).to receive(:http_fetch).and_return(RESULT_SET_WITH_PORTALS)
251
+ project = Project.first
252
+ expect(project.instance_variable_get(:@_record_id)).to eq('499')
253
+ expect(project.instance_variable_get(:@_mod_id)).to eq('86')
254
+ end
255
+
256
+ it 'Adds properties for :_record_id, :_mod_id to nested (portal) resource' do
257
+ expect_any_instance_of(Rfm::Connection).to receive(:http_fetch).and_return(RESULT_SET_WITH_PORTALS)
258
+ project = Project.first
259
+ #puts project.items.inspect
260
+ #puts Project.instance_variable_get(:@record).inspect
261
+ expect(project.items[1].instance_variable_get(:@_record_id)).to eq('2470')
262
+ expect(project.items[1].instance_variable_get(:@_mod_id)).to eq('137')
263
+ end
264
+ end
265
+ end
266
+
267
+
268
+
269
+
270
+
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,61 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
2
  require 'dm-filemaker-adapter'
3
+
4
+ DB_CONFIG = {
5
+ adapter: 'filemaker',
6
+ host: 'my.host.com',
7
+ account_name: 'developer',
8
+ password: '12345',
9
+ database: 'my_database',
10
+ ssl: 'true',
11
+ port: 443,
12
+ root_cert: false,
13
+ log_actions: false,
14
+ log_responses: false,
15
+ log_parser: false
16
+ }
17
+
18
+ RESULT_SET_WITH_PORTALS = File.read(File.expand_path('../data/resultset_with_portals.xml', __FILE__)).tap do |dat|
19
+ dat.define_singleton_method(:body){self}
20
+ end
21
+
22
+
23
+ DataMapper.setup(:default, DB_CONFIG)
24
+
25
+ class User
26
+ include DataMapper::Resource
27
+ property :id, Serial
28
+ property :email, String
29
+ property :username, String
30
+ property :activated_at, DateTime
31
+
32
+ has n, :orders
33
+ end
34
+
35
+ class Order
36
+ include DataMapper::Resource
37
+ property :id, Serial
38
+ property :total, Decimal
39
+ property :user_id, Integer
40
+
41
+ belongs_to :user
42
+ end
43
+
44
+ class Project
45
+ include DataMapper::Resource
46
+ storage_names[:default] = 'Project Data Entry New'
47
+ property :id, String, :key=>true, :field=>'ClientPO'
48
+
49
+ has n, :items
50
+ end
51
+
52
+ class Item
53
+ include DataMapper::Resource
54
+ storage_names[:default] = 'projectlineitems'
55
+ property :id, String, :key=>true, :field=>'ItemNumber'
56
+ property :project_id, String
57
+
58
+ belongs_to :project
59
+ end
60
+
61
+ DataMapper.finalize
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-filemaker-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Richardson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-08 00:00:00.000000000 Z
11
+ date: 2015-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: data_mapper
@@ -99,6 +99,8 @@ files:
99
99
  - lib/dm-filemaker-adapter/core_patches.rb
100
100
  - lib/dm-filemaker-adapter/dm-fmresultset.yml
101
101
  - lib/dm-filemaker-adapter/version.rb
102
+ - spec/data/resultset_with_duplicate_portals.xml
103
+ - spec/data/resultset_with_portals.xml
102
104
  - spec/dm-filemaker-adapter/adapter_spec.rb
103
105
  - spec/spec_helper.rb
104
106
  homepage: ''
@@ -126,5 +128,7 @@ signing_key:
126
128
  specification_version: 4
127
129
  summary: Filemaker adapter for DataMapper
128
130
  test_files:
131
+ - spec/data/resultset_with_duplicate_portals.xml
132
+ - spec/data/resultset_with_portals.xml
129
133
  - spec/dm-filemaker-adapter/adapter_spec.rb
130
134
  - spec/spec_helper.rb