morpheus 0.3.6 → 0.3.7
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.
- data/.autotest +12 -0
- data/.rspec +1 -0
- data/README.md +77 -0
- data/Rakefile +16 -0
- data/lib/morpheus.rb +2 -2
- data/lib/morpheus/base.rb +1 -1
- data/lib/morpheus/client/inflections.rb +1 -1
- data/lib/morpheus/configuration.rb +41 -43
- data/lib/morpheus/errors.rb +1 -1
- data/lib/morpheus/mixins/associations.rb +3 -1
- data/lib/morpheus/mixins/attributes.rb +66 -67
- data/lib/morpheus/mixins/conversion.rb +9 -13
- data/lib/morpheus/mixins/filtering.rb +4 -1
- data/lib/morpheus/mixins/finders.rb +4 -1
- data/lib/morpheus/mixins/introspection.rb +12 -16
- data/lib/morpheus/mixins/persistence.rb +25 -26
- data/lib/morpheus/mixins/reflections.rb +4 -1
- data/lib/morpheus/mixins/request_handling.rb +4 -1
- data/lib/morpheus/mixins/response_parsing.rb +12 -12
- data/lib/morpheus/mixins/url_support.rb +4 -1
- data/lib/morpheus/request.rb +34 -34
- data/lib/morpheus/response.rb +2 -2
- data/lib/morpheus/response_parser.rb +9 -4
- data/lib/morpheus/version.rb +1 -1
- data/morpheus.gemspec +4 -4
- data/spec/dummy/app/resources/author.rb +0 -1
- data/spec/dummy/app/resources/book.rb +0 -1
- data/spec/dummy/app/resources/dog.rb +3 -3
- data/spec/dummy/app/resources/meeting.rb +1 -2
- data/spec/dummy/config/application.rb +7 -36
- data/spec/dummy/config/environments/production.rb +1 -1
- data/spec/dummy/config/initializers/morpheus.rb +1 -1
- data/spec/dummy/config/locales/en.yml +1 -1
- data/spec/dummy/config/routes.rb +0 -56
- data/spec/morpheus/associations/association_spec.rb +51 -33
- data/spec/morpheus/associations/belongs_to_association_spec.rb +14 -2
- data/spec/morpheus/associations/has_many_association_spec.rb +31 -11
- data/spec/morpheus/associations/has_one_association_spec.rb +14 -2
- data/spec/morpheus/base_spec.rb +104 -100
- data/spec/morpheus/client/associations_spec.rb +43 -36
- data/spec/morpheus/client/log_subscriber_spec.rb +33 -0
- data/spec/morpheus/client/railtie_spec.rb +5 -0
- data/spec/morpheus/configuration_spec.rb +92 -113
- data/spec/morpheus/mixins/associations_spec.rb +90 -108
- data/spec/morpheus/mixins/attributes_spec.rb +71 -77
- data/spec/morpheus/mixins/conversion_spec.rb +49 -59
- data/spec/morpheus/mixins/filtering_spec.rb +13 -0
- data/spec/morpheus/mixins/finders_spec.rb +180 -217
- data/spec/morpheus/mixins/introspection_spec.rb +81 -124
- data/spec/morpheus/mixins/persistence_spec.rb +140 -133
- data/spec/morpheus/mixins/{reflection_spec.rb → reflections_spec.rb} +28 -28
- data/spec/morpheus/mixins/request_handling_spec.rb +21 -0
- data/spec/morpheus/mixins/response_parsing_spec.rb +10 -2
- data/spec/morpheus/mixins/url_support_spec.rb +29 -0
- data/spec/morpheus/reflection_spec.rb +21 -0
- data/spec/morpheus/relation_spec.rb +34 -58
- data/spec/morpheus/request_cache_spec.rb +33 -2
- data/spec/morpheus/request_queue_spec.rb +37 -0
- data/spec/morpheus/request_spec.rb +102 -1
- data/spec/morpheus/response_parser_spec.rb +17 -0
- data/spec/morpheus/response_spec.rb +55 -51
- data/spec/morpheus/type_caster_spec.rb +128 -118
- data/spec/morpheus/url_builder_spec.rb +41 -0
- data/spec/shared/active_model_lint_test.rb +2 -2
- data/spec/spec_helper.rb +7 -14
- data/spec/support/configuration.rb +3 -4
- metadata +32 -16
- data/README.rdoc +0 -44
- data/autotest/discover.rb +0 -7
- data/lib/morpheus/mock.rb +0 -66
- data/spec/morpheus/mock_spec.rb +0 -133
@@ -1,44 +1,51 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Morpheus::Client::Associations
|
4
|
-
|
5
|
-
it "defines a getter method" do
|
6
|
-
Purchase.new.should respond_to(:item)
|
7
|
-
end
|
3
|
+
describe Morpheus::Client::Associations do
|
8
4
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
context "when the belongs_to association is fulfilled by its contracted 'association_id' attribute" do
|
14
|
-
|
15
|
-
before(:each) do
|
16
|
-
item = Item.new(:id => 3)
|
17
|
-
Item.stub(:get).and_return(item)
|
18
|
-
|
19
|
-
@item = Item.find(3)
|
5
|
+
describe '.belongs_to_resource' do
|
6
|
+
it 'defines a getter method' do
|
7
|
+
Purchase.new.should respond_to(:item)
|
20
8
|
end
|
21
|
-
|
22
|
-
it
|
23
|
-
|
24
|
-
@purchase.item_id = 3
|
25
|
-
@purchase.item.should be_a(Item)
|
26
|
-
@purchase.item.id.should eql(3)
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'can set an association directly' do
|
30
|
-
@purchase = Purchase.new
|
31
|
-
@purchase.item = @item
|
32
|
-
@purchase.item_id.should eql(3)
|
33
|
-
@purchase.item.should be_a(Item)
|
34
|
-
@purchase.item.id.should eql(3)
|
9
|
+
|
10
|
+
it 'defines a setter method' do
|
11
|
+
Purchase.new.should respond_to('item=')
|
35
12
|
end
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
13
|
+
|
14
|
+
context 'when the belongs_to association is fulfilled by its contracted "association_id" attribute' do
|
15
|
+
before(:each) do
|
16
|
+
item = Item.new(:id => 3)
|
17
|
+
Item.stub(:get).and_return(item)
|
18
|
+
@item = Item.find(3)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns the association object when the id is specified' do
|
22
|
+
@purchase = Purchase.new
|
23
|
+
@purchase.item_id = 3
|
24
|
+
@purchase.item.should be_a(Item)
|
25
|
+
@purchase.item.id.should eql(3)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'can set an association directly' do
|
29
|
+
@purchase = Purchase.new
|
30
|
+
@purchase.item = @item
|
31
|
+
@purchase.item_id.should eql(3)
|
32
|
+
@purchase.item.should be_a(Item)
|
33
|
+
@purchase.item.id.should eql(3)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'returns nil when the id is not specified' do
|
37
|
+
@purchase = Purchase.new
|
38
|
+
@purchase.item.should eql(nil)
|
39
|
+
end
|
40
40
|
end
|
41
|
-
|
42
41
|
end
|
43
|
-
|
42
|
+
|
43
|
+
describe '.has_many_resources' do
|
44
|
+
pending
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '.has_one_resource' do
|
48
|
+
pending
|
49
|
+
end
|
50
|
+
|
44
51
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Morpheus::Client::LogSubscriber do
|
4
|
+
|
5
|
+
describe '#initialize' do
|
6
|
+
pending
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#request' do
|
10
|
+
pending
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#uncached_request' do
|
14
|
+
pending
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#cached_request' do
|
18
|
+
pending
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#payload' do
|
22
|
+
pending
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#logger' do
|
26
|
+
pending
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#odd?' do
|
30
|
+
pending
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -1,136 +1,115 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Morpheus::Configuration
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
context "when host has been set" do
|
20
|
-
|
21
|
-
before(:each) do
|
22
|
-
Morpheus::Configuration.host = "http://localhost:3000"
|
3
|
+
describe Morpheus::Configuration do
|
4
|
+
|
5
|
+
describe '.host' do
|
6
|
+
context 'when host has not been set' do
|
7
|
+
before(:each) do
|
8
|
+
Morpheus::Configuration.host = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'raises a ConfigurationError' do
|
12
|
+
lambda {
|
13
|
+
Morpheus::Configuration.host
|
14
|
+
}.should raise_error(Morpheus::ConfigurationError,
|
15
|
+
'The request HOST has not been set. Please set the host using Morpheus::Configuration.host = "http://www.example.com"')
|
16
|
+
end
|
23
17
|
end
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
|
19
|
+
context 'when host has been set' do
|
20
|
+
before(:each) do
|
21
|
+
Morpheus::Configuration.host = 'http://localhost:3000'
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'returns the host url string' do
|
25
|
+
Morpheus::Configuration.host.should eql('http://localhost:3000')
|
26
|
+
end
|
27
27
|
end
|
28
|
-
|
29
28
|
end
|
30
|
-
|
31
|
-
end
|
32
29
|
|
33
|
-
describe
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
30
|
+
describe '.hydra' do
|
31
|
+
context 'when hydra has not been set' do
|
32
|
+
before(:each) do
|
33
|
+
Morpheus::Configuration.hydra = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'returns the shared Hydra instance from Typhoeus' do
|
37
|
+
Morpheus::Configuration.hydra.should eql(Typhoeus::Hydra.hydra)
|
38
|
+
end
|
39
39
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
|
41
|
+
context 'when hydra has been set' do
|
42
|
+
before(:each) do
|
43
|
+
@hydra = Typhoeus::Hydra.new
|
44
|
+
Morpheus::Configuration.hydra = @hydra
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'returns the specified Typhoeus Hydra instance' do
|
48
|
+
Morpheus::Configuration.hydra.should eql(@hydra)
|
49
|
+
end
|
43
50
|
end
|
44
|
-
|
45
51
|
end
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
@hydra = Typhoeus::Hydra.new
|
51
|
-
Morpheus::Configuration.hydra = @hydra
|
52
|
+
|
53
|
+
describe '.logger' do
|
54
|
+
before(:all) do
|
55
|
+
@original_logger = Morpheus::Configuration.logger
|
52
56
|
end
|
53
|
-
|
54
|
-
|
55
|
-
Morpheus::Configuration.
|
57
|
+
|
58
|
+
after(:all) do
|
59
|
+
Morpheus::Configuration.logger = @original_logger
|
56
60
|
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
end
|
71
|
-
|
72
|
-
context "when logger has not been set" do
|
73
|
-
|
74
|
-
before(:each) do
|
75
|
-
Morpheus::Configuration.logger = nil
|
62
|
+
context 'when logger has not been set' do
|
63
|
+
before(:each) do
|
64
|
+
Morpheus::Configuration.logger = nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'returns the default Logger instance' do
|
68
|
+
Morpheus::Configuration.logger.should be_a(Logger)
|
69
|
+
end
|
76
70
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
71
|
+
|
72
|
+
context 'when logger has been set' do
|
73
|
+
before(:each) do
|
74
|
+
@logger = Logger.new(STDOUT)
|
75
|
+
Morpheus::Configuration.logger = @logger
|
76
|
+
end
|
77
|
+
|
78
|
+
it 'returns the specified Logger instance' do
|
79
|
+
Morpheus::Configuration.logger.should eql(@logger)
|
80
|
+
end
|
80
81
|
end
|
81
|
-
|
82
82
|
end
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
it "returns the specified Logger instance" do
|
92
|
-
Morpheus::Configuration.logger.should eql(@logger)
|
83
|
+
|
84
|
+
describe '.allow_net_connect' do
|
85
|
+
it 'disables all net connections through Typhoeus' do
|
86
|
+
Morpheus::Configuration.allow_net_connect = false
|
87
|
+
lambda {
|
88
|
+
Typhoeus::Request.get('http://localhost:3000')
|
89
|
+
}.should raise_error(Morpheus::NetConnectNotAllowedError)
|
93
90
|
end
|
94
|
-
|
95
91
|
end
|
96
|
-
|
97
|
-
end
|
98
92
|
|
99
|
-
describe
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
Typhoeus::Request.get("http://localhost:3000")
|
105
|
-
}.should raise_error(Morpheus::NetConnectNotAllowedError)
|
106
|
-
end
|
107
|
-
|
108
|
-
end
|
93
|
+
describe '.allow_net_connect?' do
|
94
|
+
context 'when net connect is allowed' do
|
95
|
+
before(:each) do
|
96
|
+
Morpheus::Configuration.allow_net_connect = true
|
97
|
+
end
|
109
98
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
before(:each) do
|
115
|
-
Morpheus::Configuration.allow_net_connect = true
|
116
|
-
end
|
117
|
-
|
118
|
-
it "returns true" do
|
119
|
-
Morpheus::Configuration.should be_allow_net_connect
|
120
|
-
end
|
121
|
-
|
122
|
-
end
|
123
|
-
|
124
|
-
context "when net connect is not allowed" do
|
125
|
-
|
126
|
-
before(:each) do
|
127
|
-
Morpheus::Configuration.allow_net_connect = false
|
99
|
+
it 'returns true' do
|
100
|
+
Morpheus::Configuration.should be_allow_net_connect
|
101
|
+
end
|
128
102
|
end
|
129
|
-
|
130
|
-
|
131
|
-
|
103
|
+
|
104
|
+
context 'when net connect is not allowed' do
|
105
|
+
before(:each) do
|
106
|
+
Morpheus::Configuration.allow_net_connect = false
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'returns true' do
|
110
|
+
Morpheus::Configuration.should_not be_allow_net_connect
|
111
|
+
end
|
132
112
|
end
|
133
|
-
|
134
113
|
end
|
135
|
-
|
114
|
+
|
136
115
|
end
|
@@ -1,141 +1,123 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Morpheus::Associations
|
3
|
+
describe Morpheus::Associations do
|
4
4
|
|
5
|
-
|
6
|
-
Meeting.new.attributes.should include('conference_id')
|
7
|
-
end
|
8
|
-
|
9
|
-
it "defines a getter method" do
|
10
|
-
Meeting.new.should respond_to(:conference)
|
11
|
-
end
|
12
|
-
|
13
|
-
context "when the belongs_to association is fulfilled by its contracted 'association_id' attribute" do
|
5
|
+
describe '.belongs_to' do
|
14
6
|
|
15
|
-
|
16
|
-
|
17
|
-
meetings = [meeting]
|
18
|
-
conference = Conference.new(:id => 2)
|
19
|
-
|
20
|
-
Meeting.stub(:get) do |uri, params|
|
21
|
-
case uri
|
22
|
-
when '/meetings/1'
|
23
|
-
meeting
|
24
|
-
when '/meetings'
|
25
|
-
meetings
|
26
|
-
end
|
27
|
-
end
|
28
|
-
Conference.stub(:get).and_return(conference)
|
29
|
-
|
30
|
-
@meeting = Meeting.find(1)
|
7
|
+
it 'creates a property for this class matching association name, e.g. belong_to :author # => :author_id' do
|
8
|
+
Meeting.new.attributes.should include('conference_id')
|
31
9
|
end
|
32
10
|
|
33
|
-
it
|
34
|
-
|
35
|
-
@conference.should be_a(Conference)
|
36
|
-
@conference.id.should eql(2)
|
37
|
-
@conference.meetings.should include(@meeting)
|
11
|
+
it 'defines a getter method' do
|
12
|
+
Meeting.new.should respond_to(:conference)
|
38
13
|
end
|
39
14
|
|
40
|
-
|
41
|
-
|
42
|
-
|
15
|
+
context 'when the belongs_to association is fulfilled by its contracted "association_id" attribute' do
|
16
|
+
before(:each) do
|
17
|
+
meeting = Meeting.new(:id => 1, :conference_id => 2)
|
18
|
+
meetings = [meeting]
|
19
|
+
conference = Conference.new(:id => 2)
|
20
|
+
Meeting.stub(:get) do |uri, params|
|
21
|
+
case uri
|
22
|
+
when '/meetings/1'
|
23
|
+
meeting
|
24
|
+
when '/meetings'
|
25
|
+
meetings
|
26
|
+
end
|
27
|
+
end
|
28
|
+
Conference.stub(:get).and_return(conference)
|
43
29
|
|
44
|
-
|
45
|
-
|
46
|
-
@meeting.conference_id = nil
|
47
|
-
end
|
30
|
+
@meeting = Meeting.find(1)
|
31
|
+
end
|
48
32
|
|
49
|
-
|
50
|
-
|
33
|
+
it 'returns the belongs_to association object' do
|
34
|
+
@conference = @meeting.conference
|
35
|
+
@conference.should be_a(Conference)
|
36
|
+
@conference.id.should eql(2)
|
37
|
+
@conference.meetings.should include(@meeting)
|
38
|
+
end
|
51
39
|
end
|
52
40
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
it "creates a getter method" do
|
60
|
-
Meeting.new.should respond_to(:attendees)
|
61
|
-
end
|
62
|
-
|
63
|
-
context "when the record has no id" do
|
64
|
-
|
65
|
-
before(:each) do
|
66
|
-
@meeting = Meeting.new
|
67
|
-
end
|
41
|
+
context 'when the belongs_to association is fulfilled by its contracted "association_id" attribute' do
|
42
|
+
before(:each) do
|
43
|
+
@meeting = Meeting.new
|
44
|
+
@meeting.conference_id = nil
|
45
|
+
end
|
68
46
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
@attendees.should be_empty
|
47
|
+
it 'returns nil' do
|
48
|
+
@meeting.conference.should be_nil
|
49
|
+
end
|
73
50
|
end
|
74
|
-
|
75
51
|
end
|
76
52
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
meeting = Meeting.new(:id => 1, :conference_id => 2)
|
81
|
-
attendees = [Attendee.new(:id => 2), Attendee.new(:id => 5)]
|
82
|
-
|
83
|
-
Meeting.stub(:get).and_return(meeting)
|
84
|
-
Attendee.stub(:get).and_return(attendees)
|
85
|
-
|
86
|
-
@meeting = Meeting.find(1)
|
53
|
+
describe '.has_many' do
|
54
|
+
it 'creates a getter method' do
|
55
|
+
Meeting.new.should respond_to(:attendees)
|
87
56
|
end
|
88
57
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
@attendees.should have(2).attendees
|
93
|
-
@attendees.each do |attendee|
|
94
|
-
attendee.should be_a(Attendee)
|
58
|
+
context 'when the record has no id' do
|
59
|
+
before(:each) do
|
60
|
+
@meeting = Meeting.new
|
95
61
|
end
|
96
|
-
end
|
97
62
|
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
it "creates a getter method" do
|
105
|
-
Meeting.new.should respond_to(:speaker)
|
106
|
-
end
|
107
|
-
|
108
|
-
context "when the record has no id" do
|
109
|
-
|
110
|
-
before(:each) do
|
111
|
-
@meeting = Meeting.new
|
63
|
+
it 'returns an empty array' do
|
64
|
+
@attendees = @meeting.attendees
|
65
|
+
@attendees.should be_an(Array)
|
66
|
+
@attendees.should be_empty
|
67
|
+
end
|
112
68
|
end
|
113
69
|
|
114
|
-
|
115
|
-
|
116
|
-
|
70
|
+
context 'when the record has an id' do
|
71
|
+
before(:each) do
|
72
|
+
meeting = Meeting.new(:id => 1, :conference_id => 2)
|
73
|
+
attendees = [Attendee.new(:id => 2), Attendee.new(:id => 5)]
|
74
|
+
Meeting.stub(:get).and_return(meeting)
|
75
|
+
Attendee.stub(:get).and_return(attendees)
|
76
|
+
@meeting = Meeting.find(1)
|
77
|
+
end
|
117
78
|
|
79
|
+
it 'returns the associated objects' do
|
80
|
+
@attendees = @meeting.attendees
|
81
|
+
@attendees.should be_an(Array)
|
82
|
+
@attendees.should have(2).attendees
|
83
|
+
@attendees.each do |attendee|
|
84
|
+
attendee.should be_a(Attendee)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
118
88
|
end
|
119
89
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
speakers = [Speaker.new(:id => 5, :meeting_id => 1)]
|
90
|
+
describe '.has_one' do
|
91
|
+
it 'creates a getter method' do
|
92
|
+
Meeting.new.should respond_to(:speaker)
|
93
|
+
end
|
125
94
|
|
126
|
-
|
127
|
-
|
95
|
+
context 'when the record has no id' do
|
96
|
+
before(:each) do
|
97
|
+
@meeting = Meeting.new
|
98
|
+
end
|
128
99
|
|
129
|
-
|
100
|
+
it 'returns nil' do
|
101
|
+
@meeting.speaker.should be_nil
|
102
|
+
end
|
130
103
|
end
|
131
104
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
105
|
+
context 'when the record has an id' do
|
106
|
+
before(:each) do
|
107
|
+
meeting = Meeting.new(:id => 1, :conference_id => 2)
|
108
|
+
speakers = [Speaker.new(:id => 5, :meeting_id => 1)]
|
109
|
+
Meeting.stub(:get).and_return(meeting)
|
110
|
+
Speaker.stub(:get).and_return(speakers)
|
111
|
+
@meeting = Meeting.find(1)
|
112
|
+
end
|
138
113
|
|
114
|
+
it 'returns the association object' do
|
115
|
+
@speaker = @meeting.speaker
|
116
|
+
@speaker.should be_a(Speaker)
|
117
|
+
@speaker.id.should eql(5)
|
118
|
+
@speaker.meeting.should == @meeting
|
119
|
+
end
|
120
|
+
end
|
139
121
|
end
|
140
122
|
|
141
123
|
end
|