releaf-content 1.1.20 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +5 -5
  2. data/app/assets/config/releaf_content_manifest.js +2 -0
  3. data/app/assets/javascripts/controllers/releaf/content/nodes.js +6 -9
  4. data/app/controllers/releaf/content/nodes_controller.rb +1 -1
  5. data/lib/releaf/content/engine.rb +2 -2
  6. data/lib/releaf/content/node.rb +3 -3
  7. data/lib/releaf/content/route.rb +0 -1
  8. metadata +12 -58
  9. data/spec/builders/content/nodes/action_dialog_spec.rb +0 -39
  10. data/spec/builders/content/nodes/content_form_builder_spec.rb +0 -24
  11. data/spec/builders/content/nodes/form_builder_spec.rb +0 -262
  12. data/spec/builders/content/nodes/toolbox_builder_spec.rb +0 -77
  13. data/spec/controllers/releaf/content/nodes_controller_spec.rb +0 -52
  14. data/spec/features/nodes_services_spec.rb +0 -437
  15. data/spec/features/nodes_spec.rb +0 -572
  16. data/spec/fixtures/dummy.png +0 -0
  17. data/spec/lib/releaf/content/acts_as_node_spec.rb +0 -90
  18. data/spec/lib/releaf/content/configuration_spec.rb +0 -159
  19. data/spec/lib/releaf/content/engine_spec.rb +0 -149
  20. data/spec/lib/releaf/content/node_spec.rb +0 -591
  21. data/spec/lib/releaf/content/route_spec.rb +0 -229
  22. data/spec/middleware/routes_reloader_spec.rb +0 -96
  23. data/spec/routing/node_mapper_spec.rb +0 -310
  24. data/spec/services/releaf/content/build_route_objects_spec.rb +0 -72
  25. data/spec/services/releaf/content/node/copy_spec.rb +0 -338
  26. data/spec/services/releaf/content/node/move_spec.rb +0 -20
  27. data/spec/services/releaf/content/node/save_under_parent_spec.rb +0 -49
  28. data/spec/services/releaf/content/node/service_spec.rb +0 -19
  29. data/spec/validators/content/node/parent_validator_spec.rb +0 -56
  30. data/spec/validators/content/node/root_validator_spec.rb +0 -69
  31. data/spec/validators/content/node/singleness_validator_spec.rb +0 -145
@@ -1,77 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe Releaf::Content::Nodes::ToolboxBuilder, type: :class do
4
-
5
- class NodeToolboxBuilderTestHelper < ActionView::Base
6
- include Releaf::ButtonHelper
7
- include Releaf::ApplicationHelper
8
- end
9
-
10
- let(:template){ NodeToolboxBuilderTestHelper.new }
11
- subject { described_class.new(template) }
12
-
13
- let(:node){ Node.new(content_type: "TextPage", slug: "a", id: 99) }
14
-
15
- before do
16
- allow(subject).to receive(:resource).and_return(node)
17
- allow(subject).to receive(:destroy_confirmation_link).and_return(:super_item)
18
- allow(subject).to receive(:feature_available?).with(:destroy).and_return true
19
- end
20
-
21
- it "extends Releaf::Builders::ToolboxBuilder" do
22
- expect(described_class.ancestors).to include Releaf::Builders::ToolboxBuilder
23
- end
24
-
25
- describe "#items" do
26
-
27
- before do
28
- allow(subject).to receive(:params).and_return({})
29
- allow(subject).to receive(:add_child_button).and_return( :add_child_item )
30
- allow(subject).to receive(:copy_button).and_return( :copy_item )
31
- allow(subject).to receive(:move_button).and_return( :move_item )
32
- end
33
-
34
- context "when applied to a new record" do
35
-
36
- it "returns only items returned by parent class" do
37
- allow(node).to receive(:new_record?).and_return true
38
- expect(subject.items).to eq([ :super_item ])
39
- end
40
-
41
- end
42
-
43
- end
44
-
45
- describe "item methods" do
46
-
47
- describe "#add_child_button" do
48
- it "returns an ajaxbox link to content type dialog" do
49
- allow(subject).to receive(:t).with('Add child').and_return('addchildxx')
50
- allow(subject).to receive(:url_for).with(action: 'content_type_dialog', parent_id: 99).and_return('dialogurl')
51
- html = '<a class="button ajaxbox" title="addchildxx" href="dialogurl">addchildxx</a>'
52
- expect(subject.add_child_button).to eq(html)
53
- end
54
- end
55
-
56
- describe "#copy_button" do
57
- it "returns an ajaxbox link to copy dialog" do
58
- allow(subject).to receive(:t).with('Copy').and_return('copyxx')
59
- allow(subject).to receive(:url_for).with(action: 'copy_dialog', id: 99).and_return('dialogurl')
60
- html = '<a class="button ajaxbox" title="copyxx" href="dialogurl">copyxx</a>'
61
- expect(subject.copy_button).to eq(html)
62
- end
63
- end
64
-
65
-
66
- describe "#move_button" do
67
- it "returns an ajaxbox link to move dialog" do
68
- allow(subject).to receive(:t).with('Move').and_return('movexx')
69
- allow(subject).to receive(:url_for).with(action: 'move_dialog', id: 99).and_return('dialogurl')
70
- html = '<a class="button ajaxbox" title="movexx" href="dialogurl">movexx</a>'
71
- expect(subject.move_button).to eq(html)
72
- end
73
- end
74
-
75
- end
76
-
77
- end
@@ -1,52 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Releaf::Content::NodesController do
4
-
5
- describe "#features"do
6
- it "excludes `create another` and `search` features" do
7
- expect(subject.features).to_not include(:create_another, :search)
8
- end
9
- end
10
-
11
- describe "#ancestor_nodes" do
12
- let(:node){ Node.new }
13
- let(:ancestors){ Node.where(id: 1212) }
14
-
15
- before do
16
- allow(ancestors).to receive(:reorder).with(:depth).and_return(["depth_ordered_ancestors"])
17
- end
18
-
19
- context "when new node" do
20
- context "when node has parent" do
21
- it "returns parent ancestors ordered by depth alongside parent ancestor" do
22
- parent_node = Node.new
23
- node.parent = parent_node
24
- allow(parent_node).to receive(:ancestors).and_return(ancestors)
25
- expect(subject.ancestor_nodes(node)).to eq(["depth_ordered_ancestors", parent_node])
26
- end
27
- end
28
-
29
- context "when node has no parent" do
30
- it "returns empty array" do
31
- expect(subject.ancestor_nodes(node)).to eq([])
32
- end
33
- end
34
- end
35
-
36
- context "when persisted node" do
37
- it "returns resource ancestors ordered by depth" do
38
- allow(node).to receive(:persisted?).and_return(true)
39
- allow(node).to receive(:ancestors).and_return(ancestors)
40
- expect(subject.ancestor_nodes(node)).to eq(["depth_ordered_ancestors"])
41
- end
42
- end
43
- end
44
-
45
- describe ".resource_class" do
46
- it "looks up node class in releaf content resource configuration" do
47
- config = { 'OtherSite::OtherNode' => { controller: 'Releaf::Content::NodesController' } }
48
- allow( Releaf::Content ).to receive(:resources).and_return(config)
49
- expect( described_class.resource_class ).to be OtherSite::OtherNode
50
- end
51
- end
52
- end
@@ -1,437 +0,0 @@
1
- require 'rails_helper'
2
- describe "Nodes services (copy, move)" do
3
-
4
- describe "Moving" do
5
- before do
6
- @home_page_node = create(:home_page_node, locale: "lv")
7
- @home_page_node_2 = create(:home_page_node, locale: "en")
8
- @text_page_node_3 = create(:text_page_node, parent_id: @home_page_node_2.id)
9
- @text_page_node_4 = create(:text_page_node, parent_id: @text_page_node_3.id)
10
-
11
- # it is important to reload nodes, otherwise associations will return empty set
12
- @home_page_node.reload
13
- @home_page_node_2.reload
14
- @text_page_node_3.reload
15
- @text_page_node_4.reload
16
- end
17
-
18
- context "when one of children becomes invalid" do
19
- before do
20
- @text_page_node_4.name = nil
21
- @text_page_node_4.save(validate: false)
22
- end
23
-
24
- it "raises ActiveRecord::RecordInvalid" do
25
- expect { @text_page_node_3.move(@home_page_node.id) }.to raise_error ActiveRecord::RecordInvalid
26
- end
27
-
28
- it "raises error on node being moved, even tought descendant has error" do
29
- begin
30
- @text_page_node_3.move(@home_page_node.id)
31
- rescue ActiveRecord::RecordInvalid => e
32
- expect( e.record ).to eq @text_page_node_3
33
- end
34
-
35
- expect(@text_page_node_3.errors.messages).to eq(name: [], base: ["descendant invalid"])
36
- end
37
- end
38
-
39
- context "when moving existing node to other nodes child's position" do
40
- it "changes parent_id" do
41
- expect{ @text_page_node_3.move(@home_page_node.id) }.to change{ Node.find(@text_page_node_3.id).parent_id }.from(@home_page_node_2.id).to(@home_page_node.id)
42
- end
43
- end
44
-
45
- context "when moving to self child's position" do
46
- it "raises ActiveRecord::RecordInvalid" do
47
- expect{ @text_page_node_3.move(@text_page_node_3.id) }.to raise_error(ActiveRecord::RecordInvalid)
48
- end
49
- end
50
-
51
- context "when passing nil as target node" do
52
- it "updates parent_id" do
53
- allow_any_instance_of(Releaf::Content::Node::RootValidator).to receive(:validate)
54
- @home_page_node.destroy
55
- expect{ @text_page_node_3.move(nil) }.to change { Node.find(@text_page_node_3.id).parent_id }.to(nil)
56
- end
57
- end
58
-
59
- context "when passing nonexistent target node's id" do
60
- it "raises ActiveRecord::RecordInvalid" do
61
- expect{ @text_page_node_3.move(998123) }.to raise_error(ActiveRecord::RecordInvalid)
62
- end
63
- end
64
-
65
- end
66
-
67
- describe "Node copying", create_nodes: true do
68
- before create_nodes: true do
69
- @home_page_node = create(:home_page_node, locale: "lv")
70
- @home_page_node_2 = create(:home_page_node, locale: "en")
71
- @text_page_node_3 = create(:text_page_node, parent_id: @home_page_node_2.id)
72
- @text_page_node_4 = create(:text_page_node, parent_id: @text_page_node_3.id)
73
- @text_page_node_5 = create(:text_page_node, parent_id: @text_page_node_4.id)
74
-
75
- # it is important to reload nodes, otherwise associations will return empty set
76
- @home_page_node.reload
77
- @home_page_node_2.reload
78
- @text_page_node_3.reload
79
- @text_page_node_4.reload
80
- end
81
-
82
- context "when one of children becomes invalid" do
83
- before do
84
- @text_page_node_4.name = nil
85
- @text_page_node_4.save(validate: false)
86
- end
87
-
88
- it "raises ActiveRecord::RecordInvalid" do
89
- expect { @text_page_node_3.copy(@home_page_node.id) }.to raise_error ActiveRecord::RecordInvalid
90
- end
91
-
92
- it "raises error on node being copied" do
93
- begin
94
- @text_page_node_3.copy(@home_page_node.id)
95
- rescue ActiveRecord::RecordInvalid => e
96
- expect( e.record ).to eq @text_page_node_3
97
- end
98
- expect(@text_page_node_3.errors.messages).to eq(name: [], base: ["descendant invalid"])
99
- end
100
-
101
- it "doesn't create any new nodes" do
102
- expect do
103
- begin
104
- @text_page_node_3.copy(@home_page_node.id)
105
- rescue ActiveRecord::RecordInvalid
106
- end
107
- end.to_not change { Node.count }
108
- end
109
-
110
- it "doesn't update settings timestamp" do
111
- expect( Node ).to_not receive(:updated)
112
- begin
113
- @text_page_node_3.copy(@home_page_node.id)
114
- rescue ActiveRecord::RecordInvalid
115
- end
116
- end
117
-
118
- end
119
-
120
-
121
- context "with corect parent_id" do
122
- it "creates node along with descendant nodes" do
123
- expect{ @text_page_node_3.copy(@home_page_node.id) }.to change{ Node.count }.by( @text_page_node_3.descendants.size + 1 )
124
- end
125
-
126
- it "correctly copies attributes" do
127
- allow( @text_page_node_3 ).to receive(:children).and_return([@text_page_node_4])
128
- allow( @text_page_node_4 ).to receive(:children).and_return([@text_page_node_5])
129
-
130
- @text_page_node_3.update_attribute(:active, false)
131
- @text_page_node_4.update_attribute(:active, false)
132
-
133
- allow( @text_page_node_3 ).to receive(:attributes_to_copy).and_return(["name", "parent_id", "content_type"])
134
-
135
- @text_page_node_3.copy(@home_page_node.id)
136
-
137
- @node_2_copy = @home_page_node.children.first
138
- @node_3_copy = @node_2_copy.children.first
139
- @node_4_copy = @node_3_copy.children.first
140
-
141
- # new nodes by default are active, however we stubbed
142
- # #attributes_to_copy of @test_node_2 to not return active attribute
143
- # Also we updated @test_node_2#active to be false.
144
- # However copy is active, because active attribute wasn't copied
145
- expect( @node_2_copy ).to be_active
146
- # for copy of @text_page_node_3 active attribute was copied however, as it
147
- # should have been
148
- expect( @node_3_copy ).to_not be_active
149
- expect( @node_4_copy ).to be_active
150
-
151
- expect( @node_2_copy.name ).to eq @text_page_node_3.name
152
- expect( @node_3_copy.name ).to eq @text_page_node_4.name
153
- expect( @node_4_copy.name ).to eq @text_page_node_5.name
154
- end
155
-
156
- it "updates settings timestamp only once" do
157
- expect( Node ).to receive(:updated).once.and_call_original
158
- @text_page_node_3.copy(@home_page_node.id)
159
- end
160
-
161
- context "when parent_id is nil" do
162
- it "creates new node" do
163
- allow_any_instance_of(Releaf::Content::Node::RootValidator).to receive(:validate)
164
- expect{ @text_page_node_3.copy(nil) }.to change{ Node.count }.by(3)
165
- end
166
- end
167
-
168
- context "when copying root nodes", create_nodes: false do
169
- context "when root locale uniqueness is validated" do
170
- it "resets locale to nil" do
171
- @text_page_node = create(:home_page_node, locale: 'en')
172
- allow_any_instance_of(Node).to receive(:validate_root_locale_uniqueness?).and_return(true)
173
- @text_page_node.copy(nil)
174
- expect( Node.last.locale ).to eq nil
175
- end
176
- end
177
-
178
- context "when root locale uniqueness is not validated" do
179
- it "doesn't reset locale to nil" do
180
- @text_page_node = create(:home_page_node, locale: 'en')
181
- allow_any_instance_of(Node).to receive(:validate_root_locale_uniqueness?).and_return(false)
182
- @text_page_node.copy(nil)
183
- expect( Node.last.locale ).to eq 'en'
184
- end
185
- end
186
- end
187
- end
188
-
189
- context "with nonexistent parent_id" do
190
- it "raises ActiveRecord::RecordInvalid" do
191
- expect { @text_page_node_3.copy(99991) }.to raise_error(ActiveRecord::RecordInvalid)
192
- end
193
- end
194
-
195
- context "with same parent_id as node.id" do
196
- it "raises ActiveRecord::RecordInvalid" do
197
- expect{ @text_page_node_3.copy(@text_page_node_3.id) }.to raise_error(ActiveRecord::RecordInvalid)
198
- end
199
- end
200
-
201
- context "when copying to child node" do
202
- it "raises ActiveRecord::RecordInvalid" do
203
- expect{ @text_page_node_3.copy(@text_page_node_4.id) }.to raise_error(ActiveRecord::RecordInvalid)
204
- end
205
- end
206
-
207
- describe "slug handling" do
208
-
209
- before do
210
- @nodes = {}
211
-
212
- @nodes[:parent_one] = create(:text_page_node, parent: @home_page_node)
213
- @nodes[:parent_two] = create(:text_page_node, parent: @home_page_node)
214
-
215
- @nodes[:child] = create(:text_page_node, parent: @nodes[:parent_one], slug: "child-slug")
216
- @nodes[:grandchild] = create(:text_page_node, parent: @nodes[:child], slug: "grandchild-slug")
217
- @nodes[:great_grandchild] = create(:text_page_node, parent: @nodes[:grandchild], slug: "great-grandchild-slug")
218
-
219
- @nodes[:other_child] = create(:text_page_node, parent: @nodes[:parent_two], slug: "other-child-slug")
220
- end
221
-
222
- context "when copying a node tree to a parent that already has a child node with the same slug" do
223
- it "adds incremental index to the slug of the main copied node, preserving slugs of deeper descendants" do
224
- @nodes[:other_child].update! slug: "child-slug"
225
- @nodes[:child].copy( @nodes[:parent_two].id )
226
-
227
- copy = @nodes[:parent_two].children.last
228
-
229
- expect(copy.slug).to eq "child-slug-1"
230
- expect(copy.children.map(&:slug)).to eq ["grandchild-slug"]
231
- expect(copy.children.first.children.map(&:slug)).to eq ["great-grandchild-slug"]
232
-
233
- end
234
- end
235
-
236
- context "when copying a node tree to a parent that does not have a child node with the same slug" do
237
- it "copies slugs without any changes" do
238
- @nodes[:child].copy( @nodes[:parent_two].id )
239
- copy = @nodes[:parent_two].children.last
240
-
241
- expect(copy.slug).to eq "child-slug"
242
-
243
- expect(copy.children.map(&:slug)).to eq ["grandchild-slug"]
244
- expect(copy.children.first.children.map(&:slug)).to eq ["great-grandchild-slug"]
245
- end
246
- end
247
-
248
- end
249
-
250
- end
251
-
252
-
253
- feature "Deep copying of content nodes", js: true do
254
-
255
- let(:node_class) { Node }
256
- let(:locale) { "en" }
257
-
258
- background do
259
- Rails.cache.clear
260
- # preload ActsAsNode classes
261
- Rails.application.eager_load!
262
-
263
- create(:home_page_node, name: "Root page", locale: "en", slug: "en")
264
- auth_as_user
265
- end
266
-
267
- def expect_different_values original, copy
268
- expect(original).to be_present
269
- expect(copy).to be_present
270
- expect(original).to_not eq copy
271
- end
272
-
273
- scenario "Deep copying of content nodes with nested associations and files" do
274
- visit "/admin/nodes/"
275
- open_toolbox("Add child", node_class.first, ".view-index .collection li")
276
-
277
- dummy_file_path = File.expand_path('../fixtures/dummy.png', __dir__)
278
-
279
- within('.dialog.content-type.initialized') do
280
- click_link "Banner page"
281
- end
282
-
283
- expect(page).to have_css('input[type="text"][name="resource[content_type]"][value="Banner page"]')
284
-
285
- fill_in 'Name', with: "Banner page"
286
- fill_in 'Slug', with: "banner-page"
287
-
288
- attach_file('Top banner', dummy_file_path)
289
- attach_file('Bottom banner', dummy_file_path)
290
-
291
- within('section.nested[data-name="banner_groups"]') do
292
- add_nested_item "banner_groups", 0 do
293
- fill_in "Title", with: "Banner group 1 title"
294
-
295
- within('section.nested[data-name="banners"]') do
296
- add_nested_item "banners", 0 do
297
- attach_file('Image', dummy_file_path)
298
- fill_in "Url", with: "Banner-1-url"
299
- end
300
- add_nested_item "banners", 1 do
301
- attach_file('Image', dummy_file_path)
302
- fill_in "Url", with: "Banner-2-url"
303
- end
304
- end
305
- end
306
-
307
- add_nested_item "banner_groups", 1 do
308
- fill_in "Title", with: "Banner group 2 title"
309
- end
310
- end
311
-
312
- wait_for_all_richtexts
313
- save_and_check_response "Create succeeded"
314
-
315
- open_toolbox("Copy")
316
-
317
- within('.dialog.copy.initialized') do
318
- find('label', text: "Root page").click
319
- click_button "Copy"
320
- end
321
-
322
- expect(page).to have_css('body > .notifications .notification[data-id="resource_status"][data-type="success"]', text: "Copy succeeded")
323
-
324
- # verify record count in db
325
- expect(node_class.where(content_type: 'BannerPage').count).to eq 2
326
- expect(BannerGroup.count).to eq 4
327
- expect(Banner.count).to eq 4
328
-
329
-
330
- # verify that direct and nested files are duplicated correctly
331
- [
332
- { original: BannerPage.first, copy: BannerPage.last, accessor: :top_banner },
333
- { original: BannerPage.first, copy: BannerPage.last, accessor: :bottom_banner },
334
- {
335
- original: BannerPage.first.banner_groups.first.banners.first,
336
- copy: BannerPage.last.banner_groups.first.banners.first,
337
- accessor: :image
338
- }
339
- ].each do |entry|
340
- original = entry[:original]
341
- copy = entry[:copy]
342
- accessor = entry[:accessor]
343
- expect(original.id).to_not eq copy.id
344
-
345
- # verify that uids exist and are different
346
- expect_different_values(original.send("#{accessor}_uid"), copy.send("#{accessor}_uid"))
347
-
348
- # verify files exist and are different
349
- original_file = original.send(accessor)
350
- copied_file = copy.send(accessor)
351
-
352
- expect_different_values(original_file.path, copied_file.path)
353
- expect(original_file.path).to start_with Dragonfly.app.datastore.root_path
354
- expect(copied_file.path).to start_with Dragonfly.app.datastore.root_path
355
- expect(File.exist?(original_file.path)).to be true
356
- expect(File.exist?(copied_file.path)).to be true
357
- end
358
-
359
-
360
- # change values in the copied node to make sure associations are not linked
361
- original_id = node_class.where(content_type: "BannerPage").order(:item_position).first.id
362
- copy_id = node_class.where(content_type: "BannerPage").order(:item_position).last.id
363
- expect(copy_id).to_not eq original_id
364
-
365
- visit "/admin/nodes/#{copy_id}/edit/"
366
-
367
- within('section.nested[data-name="banner_groups"]') do
368
- within('.item[data-name="banner_groups"][data-index="0"]') do
369
- expect(page).to have_field('Title', with: 'Banner group 1 title')
370
- fill_in "Title", with: "Copied banner group 1 title"
371
-
372
- within('.item[data-name="banners"][data-index="0"]') do
373
- expect(page).to have_field('Url', with: 'Banner-1-url')
374
- fill_in "Url", with: "Copied-banner-1-url"
375
- end
376
- within('.item[data-name="banners"][data-index="1"]') do
377
- expect(page).to have_field('Url', with: 'Banner-2-url')
378
- fill_in "Url", with: "Copied-banner-2-url"
379
- end
380
- end
381
- within('.item[data-name="banner_groups"][data-index="1"]') do
382
- expect(page).to have_field('Title', with: 'Banner group 2 title')
383
- fill_in "Title", with: "Copied banner group 2 title"
384
- end
385
- end
386
-
387
- copied_file_urls = {
388
- top_banner: find('.field[data-name="top_banner"]').find_link[:href],
389
- bottom_banner: find('.field[data-name="bottom_banner"]').find_link[:href],
390
- nested_banner: find('.item[data-name="banner_groups"][data-index="0"] .item[data-name="banners"][data-index="0"] .field[data-name="image"]').find_link[:href]
391
- }
392
-
393
- wait_for_all_richtexts
394
- save_and_check_response "Update succeeded"
395
-
396
- # verify that the original banner page still has the old values
397
- visit "/admin/nodes/#{original_id}/edit/"
398
-
399
- within('section.nested[data-name="banner_groups"]') do
400
- within('.item[data-name="banner_groups"][data-index="0"]') do
401
- expect(page).to have_field('Title', with: 'Banner group 1 title')
402
-
403
- within('.item[data-name="banners"][data-index="0"]') do
404
- expect(page).to have_field('Url', with: 'Banner-1-url')
405
- end
406
- within('.item[data-name="banners"][data-index="1"]') do
407
- expect(page).to have_field('Url', with: 'Banner-2-url')
408
- end
409
- end
410
- within('.item[data-name="banner_groups"][data-index="1"]') do
411
- expect(page).to have_field('Title', with: 'Banner group 2 title')
412
- end
413
- end
414
-
415
- original_file_urls = {
416
- top_banner: find('.field[data-name="top_banner"]').find_link[:href],
417
- bottom_banner: find('.field[data-name="bottom_banner"]').find_link[:href],
418
- nested_banner: find('.item[data-name="banner_groups"][data-index="0"] .item[data-name="banners"][data-index="0"] .field[data-name="image"]').find_link[:href]
419
- }
420
-
421
- # make sure that original and copied file urls are different and working
422
- original_file_urls.each do |key, original_url|
423
- expect_different_values(original_url, copied_file_urls[key])
424
-
425
- [original_url, copied_file_urls[key]].each do |file_url|
426
- visit file_url
427
- expect(page.status_code).to eq 200
428
- end
429
- end
430
-
431
- end
432
-
433
- end
434
-
435
-
436
-
437
- end