acts_as_sdata 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/MIT-LICENSE +20 -0
- data/README.textile +200 -0
- data/Rakefile +20 -0
- data/VERSION +1 -0
- data/config/sdata.yml +13 -0
- data/config/sdata.yml.example +20 -0
- data/config/sdata.yml.tmpl.staging +14 -0
- data/generators/acts_as_sdata/acts_as_sdata_generator.rb +9 -0
- data/generators/acts_as_sdata/templates/migration.rb +69 -0
- data/init.rb +36 -0
- data/lib/s_data/active_record_extensions/base.rb +7 -0
- data/lib/s_data/active_record_extensions/mixin.rb +157 -0
- data/lib/s_data/active_record_extensions/sdata_uuid_mixin.rb +133 -0
- data/lib/s_data/atom_extensions/content_mixin.rb +14 -0
- data/lib/s_data/atom_extensions/entry_mixin.rb +41 -0
- data/lib/s_data/atom_extensions/nodes/digest.rb +48 -0
- data/lib/s_data/atom_extensions/nodes/payload.rb +34 -0
- data/lib/s_data/atom_extensions/nodes/sync_state.rb +14 -0
- data/lib/s_data/conditions_builder.rb +59 -0
- data/lib/s_data/controller_mixin.rb +11 -0
- data/lib/s_data/controller_mixin/actions.rb +87 -0
- data/lib/s_data/controller_mixin/collection_scope.rb +57 -0
- data/lib/s_data/controller_mixin/s_data_feed.rb +87 -0
- data/lib/s_data/controller_mixin/s_data_instance.rb +35 -0
- data/lib/s_data/diagnosis/application_controller_mixin.rb +16 -0
- data/lib/s_data/diagnosis/diagnosis.rb +130 -0
- data/lib/s_data/diagnosis/diagnosis_mapper.rb +39 -0
- data/lib/s_data/exceptions.rb +10 -0
- data/lib/s_data/formatting.rb +13 -0
- data/lib/s_data/namespace_definitions.rb +19 -0
- data/lib/s_data/payload.rb +158 -0
- data/lib/s_data/payload_map.rb +0 -0
- data/lib/s_data/payload_map/payload_map.rb +136 -0
- data/lib/s_data/payload_map/payload_map_hash.rb +39 -0
- data/lib/s_data/predicate.rb +31 -0
- data/lib/s_data/route_mapper.rb +143 -0
- data/lib/s_data/router_mixin.rb +10 -0
- data/lib/s_data/sync/controller_mixin.rb +122 -0
- data/lib/s_data/sync/sdata_syncing_mixin.rb +17 -0
- data/lib/s_data/virtual_base.rb +114 -0
- data/test/functional/Rakefile +0 -0
- data/test/unit/active_record_mixin/active_record_mixin_spec.rb +20 -0
- data/test/unit/active_record_mixin/acts_as_sdata_spec.rb +41 -0
- data/test/unit/active_record_mixin/find_by_sdata_instance_id_spec.rb +34 -0
- data/test/unit/active_record_mixin/payload_spec.rb +622 -0
- data/test/unit/active_record_mixin/to_atom_spec.rb +85 -0
- data/test/unit/atom_entry_mixin/atom_entry_mixin_spec.rb +11 -0
- data/test/unit/atom_entry_mixin/to_attributes_spec.rb +30 -0
- data/test/unit/class_stubs/address.rb +19 -0
- data/test/unit/class_stubs/contact.rb +25 -0
- data/test/unit/class_stubs/customer.rb +70 -0
- data/test/unit/class_stubs/model_base.rb +17 -0
- data/test/unit/class_stubs/payload.rb +15 -0
- data/test/unit/class_stubs/sd_uuid.rb +28 -0
- data/test/unit/class_stubs/user.rb +40 -0
- data/test/unit/conditions_builder_spec.rb +54 -0
- data/test/unit/controller_mixin/acts_as_sdata_spec.rb +29 -0
- data/test/unit/controller_mixin/build_sdata_feed_spec.rb +50 -0
- data/test/unit/controller_mixin/controller_mixin_spec.rb +22 -0
- data/test/unit/controller_mixin/diagnosis_spec.rb +232 -0
- data/test/unit/controller_mixin/sdata_collection_spec.rb +78 -0
- data/test/unit/controller_mixin/sdata_create_instance_spec.rb +173 -0
- data/test/unit/controller_mixin/sdata_opensearch_and_links_spec.rb +382 -0
- data/test/unit/controller_mixin/sdata_scope/linked_model_spec.rb +58 -0
- data/test/unit/controller_mixin/sdata_scope/non_linked_model_spec.rb +66 -0
- data/test/unit/controller_mixin/sdata_scope/scoping_in_config_spec.rb +64 -0
- data/test/unit/controller_mixin/sdata_show_instance_spec.rb +98 -0
- data/test/unit/controller_mixin/sdata_update_instance_spec.rb +65 -0
- data/test/unit/payload_map/payload_map_hash_spec.rb +84 -0
- data/test/unit/payload_map/payload_map_spec.rb +144 -0
- data/test/unit/predicate_spec.rb +59 -0
- data/test/unit/router_mixin/routes_spec.rb +138 -0
- data/test/unit/spec.opts +4 -0
- data/test/unit/spec_helper.rb +47 -0
- data/test/unit/spec_helpers/nokogiri_extensions.rb +16 -0
- data/test/unit/sync_controller_mixin/controller_mixin_spec.rb +22 -0
- data/test/unit/sync_controller_mixin/sdata_collection_sync_feed_spec.rb +69 -0
- metadata +175 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
describe SData::ActiveRecordExtensions::Mixin, "#to_atom" do
|
4
|
+
describe "given a class extended by ActiveRecordExtensions" do
|
5
|
+
before :all do
|
6
|
+
class Base
|
7
|
+
extend SData::ActiveRecordExtensions::Mixin
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "when .acts_as_sdata is called without arguments" do
|
12
|
+
before :each do
|
13
|
+
Base.class_eval { acts_as_sdata }
|
14
|
+
@model = Base.new
|
15
|
+
@model.stub! :id => 1, :name => 'John Smith', :updated_at => Time.now - 1.day, :created_by => @model, :sage_username => 'basic_user'
|
16
|
+
@model.stub! :sdata_content => "Base ##{@model.id}: #{@model.name}", :attributes => {}
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should return an Atom::Entry instance" do
|
20
|
+
@model.to_atom(:dataset => '-').should be_kind_of(Atom::Entry)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should assign model name to Atom::Entry#content" do
|
24
|
+
@model.to_atom(:dataset => '-').content.should == 'Base #1: John Smith'
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should assign model name and id to Atom::Entry#title" do
|
28
|
+
@model.to_atom(:dataset => '-').title.should == 'Base 1'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should assign Atom::Entry#updated" do
|
32
|
+
Time.parse(@model.to_atom(:dataset => '-').updated).should < Time.now-1.day
|
33
|
+
Time.parse(@model.to_atom(:dataset => '-').updated).should > Time.now-1.day-1.minute
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should assign Atom::Entry#links" do
|
37
|
+
@model.to_atom(:dataset => '-').links.size.should == 1
|
38
|
+
@model.to_atom(:dataset => '-').links[0].rel.should == 'self'
|
39
|
+
@model.to_atom(:dataset => '-').links[0].href.should == "http://www.example.com/sdata/example/myContract/-/bases('1')"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should assign Atom::Entry#links when param query is present" do
|
43
|
+
@model.to_atom(:dataset => '-', :select => 'attribute').links.size.should == 1
|
44
|
+
@model.to_atom(:dataset => '-', :select => 'attribute').links[0].rel.should == 'self'
|
45
|
+
@model.to_atom(:dataset => '-', :select => 'attribute').links[0].href.should == "http://www.example.com/sdata/example/myContract/-/bases('1')?select=attribute"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should assign Atom::Entry::id" do
|
49
|
+
@model.to_atom(:dataset => '-').id.should == "http://www.example.com/sdata/example/myContract/-/bases('1')"
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should assign Atom::Entry::categories" do
|
53
|
+
@model.to_atom.categories.size.should == 1
|
54
|
+
@model.to_atom.categories[0].term.should == "base"
|
55
|
+
@model.to_atom.categories[0].label.should == "Base"
|
56
|
+
@model.to_atom.categories[0].scheme.should == "http://schemas.sage.com/sdata/categories"
|
57
|
+
end
|
58
|
+
|
59
|
+
# #QUESTION: Why is it commented out?
|
60
|
+
# it "should expose activerecord attributes in a simple XML extension" do
|
61
|
+
# @model.stub! :attributes => { :last_name => "Washington", :first_name => "George" }
|
62
|
+
# atom_entry = @model.to_atom
|
63
|
+
# atom_entry['http://sdata.sage.com/schemes/attributes'].should == { 'last_name' => ["Washington"], 'first_name' => ["George"] }
|
64
|
+
# end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "when .acts_as_sdata is called with arguments" do
|
68
|
+
before :each do
|
69
|
+
Base.class_eval do
|
70
|
+
acts_as_sdata :title => lambda { "#{id}: #{name}" },
|
71
|
+
:content => lambda { "#{name}" }
|
72
|
+
end
|
73
|
+
|
74
|
+
@model = Base.new
|
75
|
+
@model.stub! :id => 1, :name => 'Test', :updated_at => Time.now - 1.day, :created_by => @model, :sage_username => 'basic_user'
|
76
|
+
@model.stub! :sdata_content => "Base ##{@model.id}: #{@model.name}", :to_xml => ''
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should evaulate given lambda's in the correct context" do
|
80
|
+
@model.to_atom.title.should == '1: Test'
|
81
|
+
@model.to_atom.content.should == 'Base #1: Test'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
include SData
|
4
|
+
|
5
|
+
describe "Atom extensions" do
|
6
|
+
describe "given an extended Atom::Entry" do
|
7
|
+
it "should respond to #to_attributes" do
|
8
|
+
Atom::Entry.new.should respond_to(:to_attributes)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
include SData
|
4
|
+
|
5
|
+
describe Atom::Entry, "#to_attributes" do
|
6
|
+
describe "given an Atom::Entry extended with AtomExtensions::Entry" do
|
7
|
+
describe "when model has attributes in a simple XML extension" do
|
8
|
+
before :each do
|
9
|
+
@entry = Atom::Entry.new
|
10
|
+
@entry['http://sdata.sage.com/schemes/attributes', 'first_name'] << 'George'
|
11
|
+
@entry['http://sdata.sage.com/schemes/attributes', 'last_name'] << 'Washington'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should return an ActiveRecord-friendly hash" do
|
15
|
+
@entry.to_attributes.should == { 'first_name' => 'George', 'last_name' => 'Washington' }
|
16
|
+
end
|
17
|
+
|
18
|
+
describe "when some attribute has multiple values" do
|
19
|
+
before :each do
|
20
|
+
@entry['http://sdata.sage.com/schemes/attributes', 'initials'] << 'G.'
|
21
|
+
@entry['http://sdata.sage.com/schemes/attributes', 'initials'] << 'GW'
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should take the first one" do
|
25
|
+
@entry.to_attributes['initials'].should == 'G.'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# SData::VirtualBase is uninitialized for some reason without below line
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
3
|
+
|
4
|
+
class Address < SData::VirtualBase
|
5
|
+
|
6
|
+
attr_writer :city, :created_at, :updated_at, :owner
|
7
|
+
def populate_defaults
|
8
|
+
self.city = @city || "Vancouver"
|
9
|
+
self.created_at = @created_at || Time.now-2.days
|
10
|
+
self.updated_at = @updated_at || Time.now-1.day
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
define_payload_map :customer_id => { :proc => lambda { @customer_id }, :precedence => 2 },
|
15
|
+
:city => { :proc => lambda { @city }, :precedence => 2 },
|
16
|
+
:created_at => { :proc => lambda { @created_at }, :precedence => 4 },
|
17
|
+
:updated_at => { :proc => lambda { @updated_at }, :precedence => 4 }
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class Contact < ModelBase
|
2
|
+
|
3
|
+
attr_writer :customer, :name, :created_at, :updated_at
|
4
|
+
|
5
|
+
def baze
|
6
|
+
self
|
7
|
+
end
|
8
|
+
|
9
|
+
def populate_defaults
|
10
|
+
self.id = @id || object_id.abs
|
11
|
+
self.name = @name || "Contact Name"
|
12
|
+
self.created_at = @created_at || Time.now-2.days
|
13
|
+
self.updated_at = @updated_at || Time.now-1.day
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
def sdata_content
|
18
|
+
"Contact ##{self.id}: #{self.name}"
|
19
|
+
end
|
20
|
+
|
21
|
+
define_payload_map :name => { :proc => lambda { @name }, :precedence => 2 },
|
22
|
+
:customer_id => { :proc => lambda { @customer_id }, :precedence => 2 },
|
23
|
+
:created_at => { :proc => lambda { @created_at }, :precedence => 4 },
|
24
|
+
:updated_at => { :proc => lambda { @updated_at }, :precedence => 4 }
|
25
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class Customer < ModelBase
|
2
|
+
|
3
|
+
attr_writer :created_by, :name, :number, :contacts, :created_at, :updated_at, :address
|
4
|
+
|
5
|
+
def self.is_a?(value)
|
6
|
+
# Don't really like doing this but don't see a quick better way
|
7
|
+
return true if value == SData::VirtualBase
|
8
|
+
super
|
9
|
+
end
|
10
|
+
def baze
|
11
|
+
self
|
12
|
+
end
|
13
|
+
def populate_defaults
|
14
|
+
self.id = @id || object_id.abs
|
15
|
+
self.name = @name || "Customer Name"
|
16
|
+
self.number = @number || 12345
|
17
|
+
self.contacts = @contacts || build_contacts(:number => 2, :created_by => self)
|
18
|
+
self.created_at = @created_at || Time.now-2.days
|
19
|
+
self.updated_at = @updated_at || Time.now-1.day
|
20
|
+
self.address = @address || Address.new(self)
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def contacts
|
25
|
+
@contacts || []
|
26
|
+
end
|
27
|
+
|
28
|
+
def default_contact
|
29
|
+
self.contacts[0]
|
30
|
+
end
|
31
|
+
|
32
|
+
def created_by_id
|
33
|
+
@created_by ? @created_by.id : nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def sdata_content
|
37
|
+
"Customer ##{self.id}: #{self.name}"
|
38
|
+
end
|
39
|
+
|
40
|
+
define_payload_map :name => { :proc => lambda { @name }, :precedence => 2 },
|
41
|
+
:number => { :proc => lambda { @number }, :precedence => 5 },
|
42
|
+
:created_at => { :proc => lambda { @created_at }, :precedence => 3 },
|
43
|
+
:updated_at => { :proc => lambda { @updated_at }, :precedence => 3 },
|
44
|
+
:my_default_contact => { :proc => lambda { self.default_contact }, :precedence => 3 },
|
45
|
+
:my_contacts => { :proc => lambda { @contacts },
|
46
|
+
:precedence => 5, #treated as a CHILD of customer
|
47
|
+
:type => :child
|
48
|
+
},
|
49
|
+
:associated_contacts => { :proc => lambda { @contacts },
|
50
|
+
:precedence => 3,
|
51
|
+
:type => :association
|
52
|
+
}, #treated as an ASSOCIATION of customer
|
53
|
+
|
54
|
+
:address => { :proc => lambda { @address }, :precedence => 5 },
|
55
|
+
|
56
|
+
:simple_elements => { :static_value => ['element 1', 'element 2'], :precedence => 6 },
|
57
|
+
|
58
|
+
:hash_value => { :static_value => { :simple_object_key => 'simple_object_value' }, :precedence => 6 }
|
59
|
+
|
60
|
+
def build_contacts(options)
|
61
|
+
the_contacts = []
|
62
|
+
for i in 1..options[:number] do
|
63
|
+
c = Contact.new
|
64
|
+
c.id = i
|
65
|
+
c.customer = options[:created_by]
|
66
|
+
the_contacts << c
|
67
|
+
end
|
68
|
+
the_contacts
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
TradingAccount = Struct.new :id, :uuid
|
2
|
+
|
3
|
+
class Payload < Struct.new(:trading_account)
|
4
|
+
def to_xml
|
5
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
6
|
+
xml.payload(
|
7
|
+
'xmlns:sdata' => "http://schemas.sage.com/sdata/2008/1") {
|
8
|
+
xml['sdata'].tradingAccount :uuid => trading_account.uuid,
|
9
|
+
:url => "http://www.billingboss.com/myApp/myContract/-/tradingAccounts!#{trading_account.id}"
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
builder.to_xml
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module SData
|
2
|
+
class SdUuid
|
3
|
+
@@test_uuids = []
|
4
|
+
[
|
5
|
+
{:sd_class => 'Customer', :bb_model_type => 'Customer', :bb_model_id => 12345, :uuid => 'CUST-10000'},
|
6
|
+
{:sd_class => 'Address', :bb_model_type => 'Customer', :bb_model_id => 12345, :uuid => 'ADDR-10001'},
|
7
|
+
{:sd_class => 'Contact', :bb_model_type => 'Contact', :bb_model_id => 23456, :uuid => 'CONT-10002'},
|
8
|
+
{:sd_class => 'Contact', :bb_model_type => 'Contact', :bb_model_id => 123, :uuid => 'C-123-456'},
|
9
|
+
{:sd_class => 'Customer', :bb_model_type => 'Customer', :bb_model_id => 23456, :uuid => 'CUST-10003'},
|
10
|
+
].each do |params|
|
11
|
+
@@test_uuids << OpenStruct.new(params)
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def self.first(params)
|
16
|
+
match = nil
|
17
|
+
@@test_uuids.each do |record|
|
18
|
+
if (record.sd_class == params[:conditions][:sd_class] and
|
19
|
+
record.bb_model_type == params[:conditions][:bb_model_type] and
|
20
|
+
record.bb_model_id == params[:conditions][:bb_model_id])
|
21
|
+
|
22
|
+
match = record
|
23
|
+
end
|
24
|
+
end
|
25
|
+
return match
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class User < ModelBase
|
2
|
+
|
3
|
+
attr_writer :name, :password, :customers, :created_at, :updated_at
|
4
|
+
def populate_defaults
|
5
|
+
self.id = @id || object_id.abs
|
6
|
+
self.name = @name || "username"
|
7
|
+
self.password = @password || "user_password"
|
8
|
+
self.customers = @customers || build_customers(:number => 3, :created_by => self)
|
9
|
+
self.created_at = @created_at || Time.now-2.days
|
10
|
+
self.updated_at = @updated_at || Time.now-1.day
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def record_id
|
15
|
+
@record ? @record.id : nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def sdata_content
|
19
|
+
"User ##{self.id}: #{self.name}"
|
20
|
+
end
|
21
|
+
|
22
|
+
define_payload_map :name => { :proc => lambda { @name }, :precedence => 2 },
|
23
|
+
:record_id => { :proc => lambda { @record_id }, :precedence => 2 },
|
24
|
+
:uuid => { :proc => lambda { @uuid }, :precedence => 2 },
|
25
|
+
:created_at => { :proc => lambda { @created_at }, :precedence => 3 },
|
26
|
+
:updated_at => { :proc => lambda { @updated_at }, :precedence => 3 }
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def build_customers(options)
|
31
|
+
the_customers = []
|
32
|
+
for i in 1..options[:number] do
|
33
|
+
c = Customer.new
|
34
|
+
c.id = i
|
35
|
+
c.created_by = options[:created_by]
|
36
|
+
the_customers << c
|
37
|
+
end
|
38
|
+
the_customers
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
|
+
|
3
|
+
include SData
|
4
|
+
|
5
|
+
describe ConditionsBuilder do
|
6
|
+
describe "#build_conditions" do
|
7
|
+
it "should correctly build equality" do
|
8
|
+
conditions = ConditionsBuilder.build_conditions 'born_at', :eq, '1900'
|
9
|
+
conditions.should == ["#{quoted('born_at')} = ?", '1900']
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should correctly build '>'" do
|
13
|
+
conditions = ConditionsBuilder.build_conditions 'born_at', :gt, '1900'
|
14
|
+
conditions.should == ["#{quoted('born_at')} > ?", '1900']
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should correctly build '<'" do
|
18
|
+
conditions = ConditionsBuilder.build_conditions 'born_at', :lt, '1900'
|
19
|
+
conditions.should == ["#{quoted('born_at')} < ?", '1900']
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should currectly build '<=' " do
|
23
|
+
conditions = ConditionsBuilder.build_conditions 'born_at', :lteq, '1900'
|
24
|
+
conditions.should == ["#{quoted('born_at')} <= ?", '1900']
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should currectly build '>='" do
|
28
|
+
conditions = ConditionsBuilder.build_conditions 'born_at', :gteq, '1900'
|
29
|
+
conditions.should == ["#{quoted('born_at')} >= ?", '1900']
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should currectly build '<>'" do
|
33
|
+
conditions = ConditionsBuilder.build_conditions 'born_at', :ne, '1900'
|
34
|
+
conditions.should == ["#{quoted('born_at')} <> ?", '1900']
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should currectly build 'between'" do
|
38
|
+
conditions = ConditionsBuilder.build_conditions 'born_at', :between, '1900', '1905'
|
39
|
+
conditions.should == ["#{quoted('born_at')} BETWEEN ? AND ?", '1900', '1905']
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should return empty hash is arguments are invalid" do
|
43
|
+
ConditionsBuilder.build_conditions(nil, :gt, 1).should == []
|
44
|
+
ConditionsBuilder.build_conditions('field', :invalid_relation, 1).should == []
|
45
|
+
ConditionsBuilder.build_conditions('field', :gt).should == []
|
46
|
+
ConditionsBuilder.build_conditions('field', :gt, 'value', 'redundant_value').should == []
|
47
|
+
ConditionsBuilder.build_conditions('field', :between, 'insufficient value').should == []
|
48
|
+
end
|
49
|
+
|
50
|
+
def quoted(column_name)
|
51
|
+
ActiveRecord::Base.connection.quote_column_name(column_name)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
include SData
|
4
|
+
|
5
|
+
describe ControllerMixin, ".acts_as_sdata" do
|
6
|
+
describe "given an ActionController::Base class extended by ControllerMixin" do
|
7
|
+
before :all do
|
8
|
+
Base = Class.new ActionController::Base
|
9
|
+
Base.extend ControllerMixin
|
10
|
+
end
|
11
|
+
|
12
|
+
before :each do
|
13
|
+
@options = { :model => Class.new }
|
14
|
+
Base.acts_as_sdata @options
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should make passed options available for class" do
|
18
|
+
Base.sdata_options.should == @options
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should make passed options available for instances" do
|
22
|
+
Base.new.sdata_options.should == @options
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should include instance methods" do
|
26
|
+
Base.new.should respond_to(:build_sdata_feed)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
include SData
|
4
|
+
|
5
|
+
describe ControllerMixin, "#build_sdata_feed" do
|
6
|
+
describe "given a controller which acts as sdata" do
|
7
|
+
before :all do
|
8
|
+
Base = Class.new(ActionController::Base)
|
9
|
+
Base.extend ControllerMixin
|
10
|
+
Base.__send__ :define_method, :build_sdata_feed, lambda { super }
|
11
|
+
|
12
|
+
Base.acts_as_sdata :feed => { :id => 'some-unique-id',
|
13
|
+
:author => 'Test Author',
|
14
|
+
:path => '/test_resource',
|
15
|
+
:title => 'List of Test Items' }
|
16
|
+
end
|
17
|
+
|
18
|
+
before :each do
|
19
|
+
@controller = Base.new
|
20
|
+
@controller.stub! :request => OpenStruct.new(
|
21
|
+
:protocol => 'http',
|
22
|
+
:host_with_port => 'http://example.com',
|
23
|
+
:request_uri => Base.sdata_options[:feed][:path],
|
24
|
+
:path => SData.store_path + '/-/testResource'),
|
25
|
+
:params => {:dataset => '-'},
|
26
|
+
:sdata_options => {:feed => {}, :model => OpenStruct.new(:name => 'base', :sdata_resource_kind_url => '')}
|
27
|
+
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should return Atom::Feed instance" do
|
32
|
+
@controller.build_sdata_feed.should be_kind_of(Atom::Feed)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should not contain any entries" do
|
36
|
+
@controller.build_sdata_feed.entries.should be_empty
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should adopt passed sdata_options" do
|
40
|
+
@controller.build_sdata_feed.id = Base.sdata_options[:feed][:id]
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should assign categories" do
|
44
|
+
@controller.build_sdata_feed.categories.size.should == 1
|
45
|
+
@controller.build_sdata_feed.categories[0].term.should == 'bases'
|
46
|
+
@controller.build_sdata_feed.categories[0].label.should == 'Bases'
|
47
|
+
@controller.build_sdata_feed.categories[0].scheme.should == "http://schemas.sage.com/sdata/categories"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|