releaf-content 0.2.1 → 1.0.3
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.
- checksums.yaml +4 -4
- data/LICENSE +19 -21
- data/app/assets/javascripts/{releaf/controllers → controllers}/releaf/content/nodes.js +0 -0
- data/app/assets/stylesheets/{releaf/controllers → controllers}/releaf/content/nodes.scss +0 -0
- data/app/builders/releaf/content/builders/action_dialog.rb +9 -1
- data/app/builders/releaf/content/builders/tree.rb +1 -1
- data/app/builders/releaf/content/content_type_dialog_builder.rb +2 -2
- data/app/builders/releaf/content/nodes/form_builder.rb +3 -3
- data/app/builders/releaf/content/nodes/index_builder.rb +1 -1
- data/app/builders/releaf/content/nodes/toolbox_builder.rb +0 -5
- data/app/controllers/releaf/content/nodes_controller.rb +109 -129
- data/app/middleware/releaf/content/routes_reloader.rb +12 -4
- data/app/services/releaf/content/node/copy.rb +90 -0
- data/app/services/releaf/content/node/move.rb +21 -0
- data/app/services/releaf/content/node/save_under_parent.rb +22 -0
- data/app/services/releaf/content/node/service.rb +17 -0
- data/app/validators/releaf/content/node/singleness_validator.rb +1 -24
- data/lib/releaf-content.rb +85 -6
- data/lib/releaf/content/acts_as_node.rb +0 -5
- data/lib/releaf/content/acts_as_node/active_record/acts/node.rb +2 -8
- data/lib/releaf/content/configuration.rb +61 -0
- data/lib/releaf/content/engine.rb +1 -34
- data/lib/releaf/content/node.rb +30 -101
- data/lib/releaf/content/node_mapper.rb +28 -2
- data/lib/releaf/content/route.rb +37 -25
- data/spec/builders/content/nodes/action_dialog_spec.rb +39 -0
- data/spec/builders/content/nodes/form_builder_spec.rb +47 -3
- data/spec/builders/content/nodes/toolbox_builder_spec.rb +1 -32
- data/spec/controllers/releaf/content/nodes_controller_spec.rb +42 -11
- data/spec/features/nodes_services_spec.rb +207 -0
- data/spec/features/nodes_spec.rb +328 -30
- data/spec/lib/releaf/content/acts_as_node_spec.rb +4 -32
- data/spec/lib/releaf/content/configuration_spec.rb +159 -0
- data/spec/lib/releaf/content/engine_spec.rb +149 -0
- data/spec/lib/releaf/content/node_spec.rb +66 -324
- data/spec/lib/releaf/content/route_spec.rb +223 -34
- data/spec/middleware/routes_reloader_spec.rb +62 -14
- data/spec/routing/node_mapper_spec.rb +223 -55
- data/spec/services/releaf/content/node/copy_spec.rb +115 -0
- data/spec/services/releaf/content/node/move_spec.rb +20 -0
- data/spec/services/releaf/content/node/save_under_parent_spec.rb +49 -0
- data/spec/services/releaf/content/node/service_spec.rb +19 -0
- metadata +38 -21
- data/app/builders/releaf/content/go_to_dialog_builder.rb +0 -9
- data/app/views/releaf/content/nodes/go_to_dialog.ruby +0 -1
- data/lib/releaf/content/builders_autoload.rb +0 -18
- data/releaf-content.gemspec +0 -20
@@ -1,26 +1,192 @@
|
|
1
1
|
require "rails_helper"
|
2
2
|
|
3
3
|
describe Releaf::Content::Route do
|
4
|
-
let(:node_route) { FactoryGirl.build(:node_route, node_id: 12, locale: "en", path: "/en") }
|
4
|
+
let(:node_route) { FactoryGirl.build(:node_route, node_class: Node, node_id: 12, locale: "en", path: "/en") }
|
5
5
|
|
6
|
-
describe ".node_class" do
|
7
|
-
it "returns ::Node" do
|
8
|
-
expect( described_class.node_class ).to eq ::Node
|
9
|
-
end
|
10
|
-
end
|
11
6
|
|
12
|
-
describe ".
|
7
|
+
describe ".default_controller" do
|
13
8
|
context "when given node class inherits `ActionController::Base`" do
|
14
9
|
it "returns undercored, stripped down controller class" do
|
15
|
-
expect(described_class.
|
10
|
+
expect(described_class.default_controller(HomePagesController)).to eq("home_pages")
|
16
11
|
end
|
17
12
|
end
|
18
13
|
|
19
14
|
context "when given node class does not inherit `ActionController::Base`" do
|
20
15
|
it "returns pluralized, underscorized class" do
|
21
|
-
expect(described_class.
|
16
|
+
expect(described_class.default_controller(TextPage)).to eq("text_pages")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
describe '#params' do
|
23
|
+
let(:options_argument) { { foo: :bar } }
|
24
|
+
|
25
|
+
it "returns params for router method" do
|
26
|
+
expect(node_route.params("home#index")).to eq ['/en', {to: "home#index", node_class: "Node", node_id: "12", locale: "en", as: nil }]
|
27
|
+
end
|
28
|
+
|
29
|
+
it "uses #path_for to calculate path" do
|
30
|
+
allow(node_route).to receive(:path_for).with("home#index", options_argument).and_return( "foo_path" )
|
31
|
+
expect(node_route.params("home#index", options_argument)[0]).to eq "foo_path"
|
32
|
+
end
|
33
|
+
|
34
|
+
it "uses #options_for to calculate options" do
|
35
|
+
allow(node_route).to receive(:options_for).with("home#index", options_argument).and_return( some: :options )
|
36
|
+
expect(node_route.params("home#index", options_argument)[1]).to eq( some: :options )
|
37
|
+
end
|
38
|
+
|
39
|
+
it "converts method_or_path argument to string" do
|
40
|
+
expect(node_route).to receive(:path_for).with("foo", options_argument)
|
41
|
+
expect(node_route).to receive(:options_for).with("foo", options_argument)
|
42
|
+
node_route.params(:foo, options_argument)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "does not require options argument" do
|
46
|
+
expect(node_route).to receive(:path_for).with("home#index", {})
|
47
|
+
expect(node_route).to receive(:options_for).with("home#index", {})
|
48
|
+
node_route.params("home#index")
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#path_for" do
|
54
|
+
|
55
|
+
it "returns route path" do
|
56
|
+
expect( node_route.path_for( "foo", {} ) ).to eq "/en"
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when options contain a :to key" do
|
60
|
+
it "returns route path combined with given method_or_path" do
|
61
|
+
expect( node_route.path_for( "foo", { to: "bar" } ) ).to eq "/en/foo"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "when first argument contains a controller#action or #action string" do
|
66
|
+
it "returns the route path" do
|
67
|
+
expect( node_route.path_for( "home#index", { to: "bar" } ) ).to eq "/en"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "#options_for" do
|
74
|
+
|
75
|
+
it "returns route options hash" do
|
76
|
+
expect( node_route.options_for( "home#index", {} ) ).to be_a Hash
|
77
|
+
end
|
78
|
+
|
79
|
+
it "sets :node_class to route node class name string" do
|
80
|
+
expect( node_route.options_for( "home#index", {} ) ).to include( node_class: "Node" )
|
81
|
+
end
|
82
|
+
|
83
|
+
it "sets :node_id to route node id string" do
|
84
|
+
expect( node_route.options_for( "home#index", {} ) ).to include( node_id: "12" )
|
85
|
+
end
|
86
|
+
|
87
|
+
it "sets :locale to route locale" do
|
88
|
+
expect( node_route.options_for( "home#index", {} ) ).to include( locale: "en" )
|
89
|
+
end
|
90
|
+
|
91
|
+
it "sets :to to the result of #controller_and_action_for" do
|
92
|
+
allow(node_route).to receive(:controller_and_action_for).with( "home#index", foo: :bar).and_return("ok")
|
93
|
+
expect( node_route.options_for( "home#index", foo: :bar ) ).to include( to: "ok" )
|
94
|
+
end
|
95
|
+
|
96
|
+
it "sets :as to the result of #name by passing all other calculated options" do
|
97
|
+
expected_name_options = {
|
98
|
+
foo: :bar,
|
99
|
+
to: "home#index",
|
100
|
+
node_class: "Node",
|
101
|
+
node_id: "12",
|
102
|
+
locale: "en"
|
103
|
+
}
|
104
|
+
|
105
|
+
allow(node_route).to receive(:name).with( expected_name_options ).and_return("ok")
|
106
|
+
expect( node_route.options_for( "home#index", foo: :bar ) ).to include( as: "ok" )
|
107
|
+
end
|
108
|
+
|
109
|
+
it "preserves unrecognized option keys" do
|
110
|
+
expect( node_route.options_for( "home#index", foo: :bar ) ).to include( foo: :bar )
|
111
|
+
end
|
112
|
+
|
113
|
+
it "uses calculated keys in case conflicting option keys given" do
|
114
|
+
in_options = { to: "invalid", node_class: "invalid", node_id: "invalid", locale: "invalid" }
|
115
|
+
|
116
|
+
expect( node_route.options_for( "home#index", in_options ) ).to include({
|
117
|
+
to: "home#index",
|
118
|
+
node_class: "Node",
|
119
|
+
node_id: "12",
|
120
|
+
locale: "en"
|
121
|
+
})
|
122
|
+
end
|
123
|
+
|
124
|
+
context "when node route has site" do
|
125
|
+
|
126
|
+
it "sets :site to route site" do
|
127
|
+
node_route.site = "ok"
|
128
|
+
expect( node_route.options_for( "home#index", {} ) ).to include( site: "ok" )
|
129
|
+
end
|
130
|
+
|
131
|
+
it "overrides site given in options" do
|
132
|
+
node_route.site = "ok"
|
133
|
+
expect( node_route.options_for( "home#index", { site: "foo" } ) ).to include( site: "ok" )
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
context "when node route does not have site" do
|
139
|
+
|
140
|
+
it "does not set :site" do
|
141
|
+
expect( node_route.options_for( "home#index", {} ) ).to_not include( :site )
|
142
|
+
end
|
143
|
+
|
144
|
+
it "allows site from options" do
|
145
|
+
expect( node_route.options_for( "home#index", { site: "ok" } ) ).to include( site: "ok" )
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
describe "#name" do
|
154
|
+
|
155
|
+
context "when route options contain :as option" do
|
156
|
+
|
157
|
+
context "when neither :site nor :locale are set or are blank in route options" do
|
158
|
+
it "returns the value intact" do
|
159
|
+
expect(node_route.name( { as: "foo" } )).to eq "foo"
|
160
|
+
expect(node_route.name( { as: "foo", site: nil, locale: nil } )).to eq "foo"
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context "when :site is set in route options" do
|
165
|
+
it "returns the value with site prepended" do
|
166
|
+
expect(node_route.name( { as: "foo", site: "sss" } )).to eq "sss_foo"
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
context "when :locale is set in route options" do
|
171
|
+
it "returns the value with locale prepended" do
|
172
|
+
expect(node_route.name( { as: "foo", locale: "lll" } )).to eq "lll_foo"
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
context "when both :site and :locale are set in route options" do
|
177
|
+
it "returns the value with site and locale prepended" do
|
178
|
+
expect(node_route.name( { as: "foo", site: "sss", locale: "lll" } )).to eq "sss_lll_foo"
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
context "when route options do not contain :as option" do
|
185
|
+
it "returns nil" do
|
186
|
+
expect(node_route.name( {} )).to be_nil
|
22
187
|
end
|
23
188
|
end
|
189
|
+
|
24
190
|
end
|
25
191
|
|
26
192
|
describe ".for" do
|
@@ -29,26 +195,27 @@ describe Releaf::Content::Route do
|
|
29
195
|
end
|
30
196
|
|
31
197
|
it "returns an array" do
|
32
|
-
expect(described_class.for(HomePage, 'foo')
|
198
|
+
expect(described_class.for(Node, HomePage, 'foo')).to be_a Array
|
33
199
|
end
|
34
200
|
|
35
201
|
context "when databse doesn't exists" do
|
36
202
|
it "returns an empty array" do
|
37
|
-
allow(
|
38
|
-
expect(described_class.for(HomePage, 'foo')).to eq([])
|
203
|
+
allow(Node).to receive(:where).and_raise(ActiveRecord::NoDatabaseError.new("xxx"))
|
204
|
+
expect(described_class.for(Node, HomePage, 'foo')).to eq([])
|
39
205
|
end
|
40
206
|
end
|
41
207
|
|
42
|
-
context "when
|
208
|
+
context "when node table doesn't exist" do
|
43
209
|
it "returns an empty array" do
|
44
|
-
allow(
|
45
|
-
expect(described_class.for(HomePage, 'foo')).to eq([])
|
210
|
+
allow(Node).to receive(:where).and_raise(ActiveRecord::StatementInvalid.new("xxx"))
|
211
|
+
expect(described_class.for(Node, HomePage, 'foo')).to eq([])
|
46
212
|
end
|
47
213
|
end
|
48
214
|
|
49
|
-
context "when
|
50
|
-
it "returns an array of Node::Route objects" do
|
51
|
-
|
215
|
+
context "when node table exists" do
|
216
|
+
it "returns an array of Node::Route objects returned by build_route_object" do
|
217
|
+
expect(described_class).to receive(:build_route_object).and_call_original
|
218
|
+
result = described_class.for(Node, HomePage, 'foo')
|
52
219
|
expect(result.count).to eq(1)
|
53
220
|
expect(result.first.class).to eq(described_class)
|
54
221
|
end
|
@@ -56,30 +223,52 @@ describe Releaf::Content::Route do
|
|
56
223
|
context "when node is not available" do
|
57
224
|
it "does not include it in return" do
|
58
225
|
allow_any_instance_of(Node).to receive(:available?).and_return(false)
|
59
|
-
expect(described_class.for(HomePage, 'foo')).to eq([])
|
226
|
+
expect(described_class.for(Node, HomePage, 'foo')).to eq([])
|
60
227
|
end
|
61
228
|
end
|
229
|
+
|
230
|
+
it "accepts node_class as string also" do
|
231
|
+
result = described_class.for('Node', HomePage, 'foo')
|
232
|
+
expect(result.count).to eq(1)
|
233
|
+
end
|
234
|
+
|
62
235
|
end
|
63
236
|
end
|
64
237
|
|
65
|
-
|
66
|
-
|
67
|
-
|
238
|
+
|
239
|
+
describe ".build_route_object" do
|
240
|
+
|
241
|
+
let(:node) { create(:home_page_node, id: 23, locale: "lv", slug: "llvv") }
|
242
|
+
let(:controller) { described_class.default_controller( node.class ) }
|
243
|
+
let(:route) { described_class.build_route_object(node, controller) }
|
244
|
+
|
245
|
+
it "returns a route instance" do
|
246
|
+
expect(route).to be_a Releaf::Content::Route
|
68
247
|
end
|
69
248
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
expect(node_route.params("home#index", as: "home").last).to match hash_including(as: "en_home")
|
74
|
-
end
|
75
|
-
end
|
249
|
+
it "assigns node_class from given node" do
|
250
|
+
expect(route.node_class).to be Node
|
251
|
+
end
|
76
252
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
253
|
+
it "assigns node_id from given node" do
|
254
|
+
expect(route.node_id).to eq "23"
|
255
|
+
end
|
256
|
+
|
257
|
+
it "assigns path from given node" do
|
258
|
+
expect(route.path).to eq "/llvv"
|
259
|
+
end
|
260
|
+
|
261
|
+
it "assigns locale from given node" do
|
262
|
+
expect(route.locale).to eq "lv"
|
263
|
+
end
|
264
|
+
|
265
|
+
it "assigns default_controller from given argument" do
|
266
|
+
expect(route.default_controller).to be controller
|
267
|
+
end
|
268
|
+
|
269
|
+
it "assigns site from content routing configuration" do
|
270
|
+
allow( Releaf::Content).to receive(:routing).and_return('Node' => {site: 'some_site'})
|
271
|
+
expect(route.site).to eq 'some_site'
|
83
272
|
end
|
84
273
|
end
|
85
274
|
end
|
@@ -15,34 +15,82 @@ describe Releaf::Content::RoutesReloader do
|
|
15
15
|
|
16
16
|
describe "on each request" do
|
17
17
|
it "compares latest updates" do
|
18
|
-
expect(described_class).to receive(:
|
18
|
+
expect(described_class).to receive(:reload_if_needed)
|
19
19
|
request
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
describe ".
|
24
|
-
|
23
|
+
describe ".reset!" do
|
24
|
+
|
25
|
+
it "changes class @updated_at instance to nil" do
|
26
|
+
described_class.instance_variable_set(:@updated_at, "x")
|
27
|
+
expect{ described_class.reset! }.to change{ described_class.instance_variable_get(:@updated_at) }.to(nil)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".reload_if_needed" do
|
33
|
+
|
34
|
+
context "when reload is needed" do
|
35
|
+
it "reloads routes" do
|
36
|
+
allow(described_class).to receive(:needs_reload?).and_return true
|
37
|
+
expect(Rails.application).to receive(:reload_routes!)
|
38
|
+
described_class.reload_if_needed
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "when reload is not needed" do
|
25
43
|
it "does not reload routes" do
|
26
|
-
allow(
|
44
|
+
allow(described_class).to receive(:needs_reload?).and_return false
|
27
45
|
expect(Rails.application).to_not receive(:reload_routes!)
|
28
|
-
described_class.
|
46
|
+
described_class.reload_if_needed
|
29
47
|
end
|
30
48
|
end
|
31
49
|
|
32
|
-
|
33
|
-
|
50
|
+
end
|
51
|
+
|
52
|
+
describe ".needs_reload?" do
|
53
|
+
|
54
|
+
context "when no nodes exist" do
|
55
|
+
it "returns false" do
|
56
|
+
allow(Node).to receive(:updated_at).and_return(nil)
|
57
|
+
expect(described_class.needs_reload?).to be false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "when node routes has not been loaded" do
|
62
|
+
it "returns true" do
|
63
|
+
described_class.instance_variable_set(:@updated_at, nil)
|
34
64
|
allow(Node).to receive(:updated_at).and_return(Time.parse("1991-01-01"))
|
35
|
-
expect(
|
36
|
-
described_class.reload_if_expired
|
65
|
+
expect(described_class.needs_reload?).to be true
|
37
66
|
end
|
38
67
|
end
|
39
68
|
|
40
|
-
context "when routes
|
41
|
-
it "
|
42
|
-
|
43
|
-
|
44
|
-
described_class.
|
69
|
+
context "when node routes are up to date" do
|
70
|
+
it "returns false" do
|
71
|
+
described_class.instance_variable_set(:@updated_at, Time.parse("1991-01-01"))
|
72
|
+
allow(Node).to receive(:updated_at).and_return(Time.parse("1991-01-01"))
|
73
|
+
expect(described_class.needs_reload?).to be false
|
45
74
|
end
|
46
75
|
end
|
76
|
+
|
77
|
+
context "when node routes are outdated" do
|
78
|
+
it "returns true" do
|
79
|
+
allow(Node).to receive(:updated_at).and_return(Time.now + 1.minute)
|
80
|
+
expect(described_class.needs_reload?).to be true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it "checks all content model classes" do
|
85
|
+
class RouteReloaderDummyNode
|
86
|
+
def self.updated_at
|
87
|
+
Time.now + 1.minute
|
88
|
+
end
|
89
|
+
end
|
90
|
+
allow(Releaf::Content).to receive(:models).and_return [ Node, RouteReloaderDummyNode ]
|
91
|
+
allow(Node).to receive(:updated_at).and_return(nil)
|
92
|
+
expect(described_class.needs_reload?).to be true
|
93
|
+
end
|
94
|
+
|
47
95
|
end
|
48
96
|
end
|
@@ -1,142 +1,310 @@
|
|
1
1
|
require "rails_helper"
|
2
2
|
|
3
3
|
describe Releaf::Content::NodeMapper do
|
4
|
-
|
5
|
-
|
4
|
+
|
5
|
+
let(:multiple_node_resources) {{
|
6
|
+
'Node' => {
|
7
|
+
controller: 'Releaf::Content::NodesController',
|
8
|
+
routing: { site: "main_site", constraints: { host: /^releaf\.local$/ } }
|
9
|
+
},
|
10
|
+
'OtherSite::OtherNode' => {
|
11
|
+
controller: 'Admin::OtherSite::OtherNodesController',
|
12
|
+
routing: { site: "other_site", constraints: { host: /^other\.releaf\.local$/ } }
|
13
|
+
}
|
14
|
+
}}
|
15
|
+
|
16
|
+
before do
|
17
|
+
@text_page = create(:text_page)
|
18
|
+
@lv_root_node = create(:home_page_node, name: "lv", locale: "lv", slug: 'lv')
|
19
|
+
@node = create(:node, slug: 'test-page', content: @text_page, parent: @lv_root_node)
|
20
|
+
end
|
21
|
+
|
22
|
+
before with_multiple_node_classes: true do
|
23
|
+
allow( Releaf.application.config ).to receive(:content).and_return(
|
24
|
+
Releaf::Content::Configuration.new(resources: multiple_node_resources)
|
25
|
+
)
|
26
|
+
@other_text_page = create(:text_page)
|
27
|
+
@other_lv_root_node = create(:other_home_page_node, name: "lv", locale: "lv", slug: 'lv')
|
28
|
+
@other_node = create(:other_node, slug: 'test-page', content: @other_text_page, parent: @other_lv_root_node)
|
29
|
+
end
|
30
|
+
|
31
|
+
after do
|
6
32
|
Dummy::Application.reload_routes!
|
7
33
|
end
|
8
34
|
|
9
|
-
|
35
|
+
after(:all) do
|
36
|
+
# without this the test environent remains polluted with test node class config.
|
37
|
+
# the routing configuration gets already reset after each test in the after block above
|
38
|
+
# but that seems to not be enough
|
10
39
|
Dummy::Application.reload_routes!
|
11
|
-
@text_page = FactoryGirl.create(:text_page)
|
12
|
-
@lv_root = create(:home_page_node, name: "lv", locale: "lv", slug: 'lv')
|
13
|
-
@node = FactoryGirl.create(:node, slug: 'test-page', content: @text_page, parent: @lv_root)
|
14
40
|
end
|
15
41
|
|
16
|
-
describe "#
|
42
|
+
describe "#node_routes_for", create_nodes: true do
|
43
|
+
|
44
|
+
it "draws public website routes for default node class" do
|
45
|
+
|
46
|
+
routes.draw do
|
47
|
+
node_routes_for(TextPage) do |route|
|
48
|
+
get 'show'
|
49
|
+
delete :destroy
|
50
|
+
end
|
51
|
+
end
|
17
52
|
|
18
|
-
|
19
|
-
|
53
|
+
expect(get: '/lv/test-page').to route_to(
|
54
|
+
"controller" => "text_pages",
|
55
|
+
"action" => "show",
|
56
|
+
"node_class" => "Node",
|
57
|
+
"node_id" => @node.id.to_s,
|
58
|
+
"locale" => 'lv'
|
59
|
+
)
|
60
|
+
|
61
|
+
expect(delete: '/lv/test-page').to route_to(
|
62
|
+
"controller" => "text_pages",
|
63
|
+
"action" => "destroy",
|
64
|
+
"node_class" => "Node",
|
65
|
+
"node_id" => @node.id.to_s,
|
66
|
+
"locale" => 'lv'
|
67
|
+
)
|
68
|
+
end
|
69
|
+
|
70
|
+
context "when a controller is given in arguments" do
|
71
|
+
|
72
|
+
it "draws the public website route to given controller" do
|
20
73
|
routes.draw do
|
21
|
-
|
74
|
+
node_routes_for(TextPage, controller: 'home_pages') do |route|
|
22
75
|
get 'show'
|
23
|
-
delete :destroy
|
24
76
|
end
|
25
77
|
end
|
26
78
|
|
27
79
|
expect(get: '/lv/test-page').to route_to(
|
28
|
-
"controller" => "
|
80
|
+
"controller" => "home_pages",
|
29
81
|
"action" => "show",
|
30
|
-
"
|
31
|
-
"locale" => 'lv'
|
32
|
-
)
|
33
|
-
|
34
|
-
expect(delete: '/lv/test-page').to route_to(
|
35
|
-
"controller" => "text_pages",
|
36
|
-
"action" => "destroy",
|
82
|
+
"node_class" => "Node",
|
37
83
|
"node_id" => @node.id.to_s,
|
38
84
|
"locale" => 'lv'
|
39
85
|
)
|
40
86
|
end
|
41
87
|
|
42
|
-
|
88
|
+
end
|
89
|
+
|
90
|
+
context "when a controller is passed in route options" do
|
91
|
+
it "draws the public website route using the controller from options" do
|
43
92
|
routes.draw do
|
44
|
-
|
45
|
-
get '
|
46
|
-
delete :destroy
|
93
|
+
node_routes_for(TextPage, controller: 'doesnt_matter') do |route|
|
94
|
+
get 'home_pages#hide'
|
47
95
|
end
|
48
96
|
end
|
49
97
|
|
50
98
|
expect(get: '/lv/test-page').to route_to(
|
51
99
|
"controller" => "home_pages",
|
52
|
-
"action" => "
|
100
|
+
"action" => "hide",
|
101
|
+
"node_class" => "Node",
|
53
102
|
"node_id" => @node.id.to_s,
|
54
103
|
"locale" => 'lv'
|
55
104
|
)
|
56
105
|
end
|
106
|
+
end
|
57
107
|
|
58
|
-
|
108
|
+
context "when custom action is given in :to" do
|
109
|
+
it "draws the public website route using the action from :to" do
|
59
110
|
routes.draw do
|
60
|
-
|
61
|
-
get '
|
111
|
+
node_routes_for(TextPage) do |route|
|
112
|
+
get '' , to: '#list'
|
62
113
|
end
|
63
114
|
end
|
64
115
|
|
65
116
|
expect(get: '/lv/test-page').to route_to(
|
66
|
-
"controller" => "
|
67
|
-
"action" => "
|
117
|
+
"controller" => "text_pages",
|
118
|
+
"action" => "list",
|
119
|
+
"node_class" => "Node",
|
68
120
|
"node_id" => @node.id.to_s,
|
69
121
|
"locale" => 'lv'
|
70
122
|
)
|
123
|
+
|
71
124
|
end
|
72
125
|
end
|
73
126
|
|
74
|
-
|
75
|
-
|
127
|
+
context "when custom controller and action are given in :to" do
|
128
|
+
it "draws the public website route using the given controller and action from :to" do
|
76
129
|
routes.draw do
|
77
|
-
|
78
|
-
get '
|
130
|
+
node_routes_for(TextPage) do |route|
|
131
|
+
get '' , to: 'home_pages#list'
|
79
132
|
end
|
80
133
|
end
|
81
134
|
|
82
|
-
expect(get: '/lv/test-page
|
135
|
+
expect(get: '/lv/test-page').to route_to(
|
83
136
|
"controller" => "home_pages",
|
84
137
|
"action" => "list",
|
138
|
+
"node_class" => "Node",
|
85
139
|
"node_id" => @node.id.to_s,
|
86
|
-
"locale" => 'lv'
|
87
|
-
"my_id" => '8888'
|
140
|
+
"locale" => 'lv'
|
88
141
|
)
|
89
142
|
end
|
143
|
+
end
|
90
144
|
|
91
|
-
|
145
|
+
context "when additional params are given in route path" do
|
146
|
+
it "passes the params to the public website route" do
|
92
147
|
routes.draw do
|
93
|
-
|
94
|
-
get ':
|
148
|
+
node_routes_for(TextPage) do |route|
|
149
|
+
get ':some_id', to: "#view"
|
95
150
|
end
|
96
151
|
end
|
97
152
|
|
98
|
-
expect(get: '/lv/test-page/8888
|
153
|
+
expect(get: '/lv/test-page/8888').to route_to(
|
99
154
|
"controller" => "text_pages",
|
100
|
-
"action" => "
|
155
|
+
"action" => "view",
|
156
|
+
"node_class" => "Node",
|
101
157
|
"node_id" => @node.id.to_s,
|
102
158
|
"locale" => 'lv',
|
103
|
-
"
|
159
|
+
"some_id" => '8888'
|
104
160
|
)
|
105
161
|
end
|
162
|
+
end
|
106
163
|
|
107
|
-
|
164
|
+
context "when custom path is given for route" do
|
165
|
+
it "uses the custom path for public website route" do
|
108
166
|
routes.draw do
|
109
|
-
|
110
|
-
get '
|
167
|
+
node_routes_for(TextPage) do |route|
|
168
|
+
get 'home_pages#show', path: "#{route.path}/abc/:my_id"
|
111
169
|
end
|
112
170
|
end
|
113
171
|
|
114
|
-
expect(get: '/lv/test-page/
|
172
|
+
expect(get: '/lv/test-page/abc/333').to route_to(
|
115
173
|
"controller" => "home_pages",
|
116
|
-
"action" => "
|
174
|
+
"action" => "show",
|
175
|
+
"node_class" => "Node",
|
117
176
|
"node_id" => @node.id.to_s,
|
118
177
|
"locale" => 'lv',
|
119
|
-
"my_id" => '
|
178
|
+
"my_id" => '333'
|
120
179
|
)
|
121
180
|
end
|
181
|
+
end
|
122
182
|
|
123
|
-
|
183
|
+
context "when custom node class is given as an argument", with_multiple_node_classes: true do
|
184
|
+
|
185
|
+
it "uses that node class for the public website route" do
|
124
186
|
routes.draw do
|
125
|
-
|
126
|
-
get '
|
187
|
+
node_routes_for(TextPage, node_class: "OtherSite::OtherNode") do |route|
|
188
|
+
get 'show'
|
127
189
|
end
|
128
190
|
end
|
129
191
|
|
130
|
-
expect(get: '/lv/test-page
|
131
|
-
"controller" => "
|
192
|
+
expect(get: '/lv/test-page').to route_to(
|
193
|
+
"controller" => "text_pages",
|
132
194
|
"action" => "show",
|
133
|
-
"
|
195
|
+
"node_class" => "OtherSite::OtherNode",
|
196
|
+
"node_id" => @other_node.id.to_s,
|
134
197
|
"locale" => 'lv',
|
135
|
-
"
|
198
|
+
"site" => 'other_site'
|
136
199
|
)
|
137
200
|
end
|
138
201
|
|
139
202
|
end
|
140
203
|
|
141
204
|
end
|
205
|
+
|
206
|
+
describe "#for_node_class", with_multiple_node_classes: true do
|
207
|
+
|
208
|
+
it "uses given node class as a default when drawing public website routes in the given block" do
|
209
|
+
routes.draw do
|
210
|
+
for_node_class "OtherSite::OtherNode" do
|
211
|
+
node_routes_for(TextPage) do |route|
|
212
|
+
get 'show'
|
213
|
+
end
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
expect(get: '/lv/test-page').to route_to(
|
218
|
+
"controller" => "text_pages",
|
219
|
+
"action" => "show",
|
220
|
+
"node_class" => "OtherSite::OtherNode",
|
221
|
+
"node_id" => @other_node.id.to_s,
|
222
|
+
"locale" => 'lv',
|
223
|
+
"site" => 'other_site'
|
224
|
+
)
|
225
|
+
end
|
226
|
+
|
227
|
+
it "restores default node class after block has been executed" do
|
228
|
+
routes.draw do
|
229
|
+
for_node_class "OtherSite::OtherNode" do
|
230
|
+
node_routes_for(TextPage) do |route|
|
231
|
+
get 'show'
|
232
|
+
end
|
233
|
+
end
|
234
|
+
node_routes_for(HomePage) do |route|
|
235
|
+
get 'show'
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
expect(get: '/lv').to route_to(
|
240
|
+
"controller" => "home_pages",
|
241
|
+
"action" => "show",
|
242
|
+
"node_class" => "Node",
|
243
|
+
"node_id" => @lv_root_node.id.to_s,
|
244
|
+
"locale" => 'lv',
|
245
|
+
"site" => 'main_site'
|
246
|
+
)
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
250
|
+
|
251
|
+
describe "#node_routing", with_multiple_node_classes: true do
|
252
|
+
|
253
|
+
it "draws public website routes for all node classes in the given routing hash using respective route constraints" do
|
254
|
+
|
255
|
+
routes.draw do
|
256
|
+
node_routing( Releaf::Content.routing ) do
|
257
|
+
node_routes_for(TextPage) do |route|
|
258
|
+
get 'show'
|
259
|
+
end
|
260
|
+
end
|
261
|
+
end
|
262
|
+
|
263
|
+
expect(get: 'http://releaf.local/lv/test-page').to route_to(
|
264
|
+
"controller" => "text_pages",
|
265
|
+
"action" => "show",
|
266
|
+
"node_class" => "Node",
|
267
|
+
"node_id" => @node.id.to_s,
|
268
|
+
"locale" => 'lv',
|
269
|
+
"site" => 'main_site'
|
270
|
+
)
|
271
|
+
|
272
|
+
expect(get: 'http://other.releaf.local/lv/test-page').to route_to(
|
273
|
+
"controller" => "text_pages",
|
274
|
+
"action" => "show",
|
275
|
+
"node_class" => "OtherSite::OtherNode",
|
276
|
+
"node_id" => @other_node.id.to_s,
|
277
|
+
"locale" => 'lv',
|
278
|
+
"site" => 'other_site'
|
279
|
+
)
|
280
|
+
|
281
|
+
end
|
282
|
+
|
283
|
+
context "when passed a routing hash for only a subset of available node classes" do
|
284
|
+
it "draws constrained public website routes only for the given node classes" do
|
285
|
+
routes.draw do
|
286
|
+
routing_hash = Releaf::Content.routing.except('Node')
|
287
|
+
node_routing( routing_hash ) do
|
288
|
+
node_routes_for(TextPage) do |route|
|
289
|
+
get 'show'
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
expect(get: 'http://other.releaf.local/lv/test-page').to route_to(
|
295
|
+
"controller" => "text_pages",
|
296
|
+
"action" => "show",
|
297
|
+
"node_class" => "OtherSite::OtherNode",
|
298
|
+
"node_id" => @other_node.id.to_s,
|
299
|
+
"locale" => 'lv',
|
300
|
+
"site" => 'other_site'
|
301
|
+
)
|
302
|
+
|
303
|
+
expect(get: 'http://releaf.local/lv/test-page').to_not be_routable
|
304
|
+
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
end
|
309
|
+
|
142
310
|
end
|