summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/controllers/assets_controller_test.rb32
-rw-r--r--test/controllers/pages_controller_test.rb69
-rw-r--r--test/controllers/related_assets_controller_test.rb71
-rw-r--r--test/models/asset_license_test.rb31
-rw-r--r--test/models/asset_test.rb35
-rw-r--r--test/models/helpers/content_helper_test.rb124
-rw-r--r--test/models/node_test.rb11
-rw-r--r--test/models/page_test.rb8
-rw-r--r--test/models/related_asset_test.rb54
9 files changed, 405 insertions, 30 deletions
diff --git a/test/controllers/assets_controller_test.rb b/test/controllers/assets_controller_test.rb
index 5f5f6e5..f834541 100644
--- a/test/controllers/assets_controller_test.rb
+++ b/test/controllers/assets_controller_test.rb
@@ -4,17 +4,16 @@ class AssetsControllerTest < ActionController::TestCase
4 4
5 def setup 5 def setup
6 login_as :quentin 6 login_as :quentin
7 @existing_asset_ids = Asset.pluck(:id)
7 end 8 end
8 9
9 def teardown 10 def teardown
10 # Clean up any files written to disk during tests 11 (Asset.pluck(:id) - @existing_asset_ids).each do |id|
11 Dir.glob(Rails.root.join('public', 'system', 'uploads', 'test_*')).each do |dir| 12 dir = Asset.upload_root.join(id.to_s)
13 raise "Refusing to delete #{dir} -- outside tmp/, Rails.env.test? may be false" unless
14 dir.to_s.start_with?(Rails.root.join("tmp").to_s)
12 FileUtils.rm_rf(dir) 15 FileUtils.rm_rf(dir)
13 end 16 end
14 # Remove uploads created for assets created during tests
15 Asset.where("upload_file_name IS NOT NULL").where("id > 1000000").each do |a|
16 FileUtils.rm_rf(Rails.root.join('public', 'system', 'uploads', a.id.to_s))
17 end
18 end 17 end
19 18
20 # --- index --- 19 # --- index ---
@@ -64,15 +63,14 @@ class AssetsControllerTest < ActionController::TestCase
64 63
65 # original and all four variants should exist on disk 64 # original and all four variants should exist on disk
66 %w[original medium thumb headline large].each do |style| 65 %w[original medium thumb headline large].each do |style|
67 path = Rails.root.join('public', 'system', 'uploads', 66 path = asset.send(:file_path, style)
68 asset.id.to_s, style, 'test_image.png')
69 assert File.exist?(path), "Expected #{style} variant at #{path}" 67 assert File.exist?(path), "Expected #{style} variant at #{path}"
70 end 68 end
71 end 69 end
72 70
73 # --- create with PDF --- 71 # --- create with PDF ---
74 72
75 test "create asset with PDF upload generates only original" do 73 test "create asset with PDF upload generates rasterized variants" do
76 uploaded = Rack::Test::UploadedFile.new( 74 uploaded = Rack::Test::UploadedFile.new(
77 Rails.root.join('test', 'fixtures', 'files', 'test_document.pdf'), 75 Rails.root.join('test', 'fixtures', 'files', 'test_document.pdf'),
78 'application/pdf' 76 'application/pdf'
@@ -83,18 +81,14 @@ class AssetsControllerTest < ActionController::TestCase
83 assert_response :redirect 81 assert_response :redirect
84 82
85 asset = Asset.last 83 asset = Asset.last
86 assert_equal 'test_document.pdf', asset.upload_file_name 84 original_path = asset.send(:file_path, :original)
87 assert_equal 'application/pdf', asset.upload_content_type
88
89 # only original should exist, no image variants
90 original_path = Rails.root.join('public', 'system', 'uploads',
91 asset.id.to_s, 'original', 'test_document.pdf')
92 assert File.exist?(original_path), "Expected original at #{original_path}" 85 assert File.exist?(original_path), "Expected original at #{original_path}"
86 assert_equal 'test_document.pdf', File.basename(original_path)
93 87
94 %w[medium thumb headline large].each do |style| 88 %w[medium thumb headline large].each do |style|
95 path = Rails.root.join('public', 'system', 'uploads', 89 path = asset.send(:file_path, style)
96 asset.id.to_s, style, 'test_document.pdf') 90 assert File.exist?(path), "Expected a #{style} variant at #{path}"
97 assert !File.exist?(path), "Expected no #{style} variant for PDF" 91 assert_equal '.png', File.extname(path), "Expected #{style} variant to be a PNG, not a PDF"
98 end 92 end
99 end 93 end
100 94
@@ -137,7 +131,7 @@ class AssetsControllerTest < ActionController::TestCase
137 ) 131 )
138 post :create, params: { asset: { name: 'To be deleted', upload: uploaded } } 132 post :create, params: { asset: { name: 'To be deleted', upload: uploaded } }
139 asset = Asset.last 133 asset = Asset.last
140 upload_dir = Rails.root.join('public', 'system', 'uploads', asset.id.to_s) 134 upload_dir = asset.send(:upload_root).join(asset.id.to_s)
141 assert Dir.exist?(upload_dir), "Upload directory should exist before destroy" 135 assert Dir.exist?(upload_dir), "Upload directory should exist before destroy"
142 136
143 assert_difference 'Asset.count', -1 do 137 assert_difference 'Asset.count', -1 do
diff --git a/test/controllers/pages_controller_test.rb b/test/controllers/pages_controller_test.rb
index 3879014..732869b 100644
--- a/test/controllers/pages_controller_test.rb
+++ b/test/controllers/pages_controller_test.rb
@@ -1,5 +1,72 @@
1require 'test_helper' 1require 'test_helper'
2 2
3class PagesControllerTest < ActionController::TestCase 3class PagesControllerTest < ActionController::TestCase
4 # will be removed anyway 4 test "preview shows the autosave when a draft and an autosave both exist" do
5 login_as :quentin
6
7 node = Node.root.children.create!(:slug => "preview_retest")
8 node.draft.update!(:title => "draft title")
9 node.publish_draft!
10
11 node.draft
12 node.lock_for_editing!(users(:quentin))
13 node.autosave!({ :title => "draft title" }, users(:quentin))
14 node.save_draft!(users(:quentin))
15 node.autosave!({ :title => "autosave title" }, users(:quentin))
16
17 get :preview, params: { :id => node.draft_id }
18
19 assert_response :success
20 assert_match "autosave title", response.body
21 end
22
23 test "preview renders a headlined image on the autosave without crashing" do
24 login_as :quentin
25
26 node = Node.root.children.create!(:slug => "preview_retest_with_image")
27 node.lock_for_editing!(users(:quentin))
28 node.autosave!({ :title => "draft title" }, users(:quentin))
29 node.save_draft!(users(:quentin))
30 node.autosave!({ :title => "autosave title" }, users(:quentin))
31
32 asset = Asset.create!(:name => "test", :upload_content_type => "image/png")
33 node.autosave.related_assets.create!(:asset_id => asset.id, :position => 1, :headline => true)
34
35 get :preview, params: { :id => node.draft_id }
36
37 assert_response :success
38 assert_match "autosave title", response.body
39 end
40
41 test "preview shows the autosave when no draft exists at all" do
42 login_as :quentin
43
44 node = Node.root.children.create!(:slug => "preview_retest_no_draft")
45 node.draft.destroy
46 node.update_column(:draft_id, nil)
47
48 node.lock_for_editing!(users(:quentin))
49 node.autosave!({ :title => "autosave only title" }, users(:quentin))
50
51 asset = Asset.create!(:name => "test", :upload_content_type => "image/png")
52 node.autosave.related_assets.create!(:asset_id => asset.id, :position => 1)
53
54 get :preview, params: { :id => node.autosave_id }
55
56 assert_response :success
57 assert_match "autosave only title", response.body
58 end
59
60 test "preview shows head normally when there is no draft or autosave" do
61 login_as :quentin
62
63 node = Node.root.children.create!(:slug => "preview_retest_head_only")
64 node.draft.update!(:title => "head title")
65 node.publish_draft!
66
67 get :preview, params: { :id => node.head_id }
68
69 assert_response :success
70 assert_match "head title", response.body
71 end
5end 72end
diff --git a/test/controllers/related_assets_controller_test.rb b/test/controllers/related_assets_controller_test.rb
index 9d20cbb..ced4b74 100644
--- a/test/controllers/related_assets_controller_test.rb
+++ b/test/controllers/related_assets_controller_test.rb
@@ -88,4 +88,75 @@ class RelatedAssetsControllerTest < ActionController::TestCase
88 ordered_asset_ids = node.draft.reload.related_assets.map(&:asset_id) 88 ordered_asset_ids = node.draft.reload.related_assets.map(&:asset_id)
89 assert_equal [second.id, first.id], ordered_asset_ids 89 assert_equal [second.id, first.id], ordered_asset_ids
90 end 90 end
91
92 test "update sets the headline flag" do
93 login_as :quentin
94 node = Node.root.children.create!(:slug => "related_assets_headline_test")
95 asset = Asset.create!(:name => "headline-photo", :upload_content_type => "image/png")
96 node.draft.assets << asset
97 related = node.draft.related_assets.find_by(:asset_id => asset.id)
98
99 patch :update, params: { :node_id => node.id, :id => related.id, :headline => "true" }
100
101 assert_response :success
102 assert related.reload.headline?
103 end
104
105 test "update with headline=true clears any previous headline on the same page" do
106 login_as :quentin
107 node = Node.root.children.create!(:slug => "related_assets_headline_swap_test")
108 first = Asset.create!(:name => "first-headline", :upload_content_type => "image/png")
109 second = Asset.create!(:name => "second-headline", :upload_content_type => "image/png")
110 node.draft.assets << first
111 node.draft.assets << second
112
113 first_related = node.draft.related_assets.find_by(:asset_id => first.id)
114 second_related = node.draft.related_assets.find_by(:asset_id => second.id)
115 first_related.update!(:headline => true)
116
117 patch :update, params: { :node_id => node.id, :id => second_related.id, :headline => "true" }
118
119 assert_response :success
120 assert_not first_related.reload.headline?
121 assert second_related.reload.headline?
122 end
123
124 test "update with headline=false clears the headline" do
125 login_as :quentin
126 node = Node.root.children.create!(:slug => "related_assets_headline_unset_test")
127 asset = Asset.create!(:name => "unset-headline", :upload_content_type => "image/png")
128 node.draft.assets << asset
129 related = node.draft.related_assets.find_by(:asset_id => asset.id)
130 related.update!(:headline => true)
131
132 patch :update, params: { :node_id => node.id, :id => related.id, :headline => "false" }
133
134 assert_response :success
135 assert_not related.reload.headline?
136 end
137
138 test "search includes PDF assets as headline-eligible candidates" do
139 login_as :quentin
140 node = Node.root.children.create!(:slug => "related_assets_search_pdf_test")
141 asset = Asset.create!(:name => "expert-opinion-searchable", :upload_content_type => "application/pdf")
142
143 get :search, params: { :node_id => node.id, :search_term => "expert-opinion-searchable" }
144
145 assert_response :success
146 ids = JSON.parse(response.body).map { |r| r["id"] }
147 assert_includes ids, asset.id
148 end
149
150 test "search matches by filename as well as name" do
151 login_as :quentin
152 node = Node.root.children.create!(:slug => "related_assets_search_filename_test")
153 asset = Asset.create!(:name => "Untitled", :upload_content_type => "application/pdf",
154 :upload_file_name => "Stellungnahme_Patientendaten_Schutz.pdf")
155
156 get :search, params: { :node_id => node.id, :search_term => "Patientendaten" }
157
158 assert_response :success
159 ids = JSON.parse(response.body).map { |r| r["id"] }
160 assert_includes ids, asset.id
161 end
91end 162end
diff --git a/test/models/asset_license_test.rb b/test/models/asset_license_test.rb
new file mode 100644
index 0000000..9f2d04f
--- /dev/null
+++ b/test/models/asset_license_test.rb
@@ -0,0 +1,31 @@
1require 'test_helper'
2
3class AssetLicenseTest < ActiveSupport::TestCase
4 test "find returns a populated entry for a known key" do
5 entry = AssetLicense.find("cc_by_4")
6
7 assert_equal "cc_by_4", entry.key
8 assert_equal "https://creativecommons.org/licenses/by/4.0/", entry.url
9 assert entry.requires_attribution
10 assert_equal "license", entry.style
11 end
12
13 test "find returns nil for an unknown or blank key" do
14 assert_nil AssetLicense.find("not_a_real_license")
15 assert_nil AssetLicense.find(nil)
16 assert_nil AssetLicense.find("")
17 end
18
19 test "keys includes every dictionary entry" do
20 assert_includes AssetLicense.keys, "cc0"
21 assert_includes AssetLicense.keys, "own_work"
22 end
23
24 test "a note-style entry has no attribution requirement and no url" do
25 entry = AssetLicense.find("own_work")
26
27 assert_not entry.requires_attribution
28 assert_nil entry.url
29 assert_equal "note", entry.style
30 end
31end
diff --git a/test/models/asset_test.rb b/test/models/asset_test.rb
index a1041e4..ab1cc5d 100644
--- a/test/models/asset_test.rb
+++ b/test/models/asset_test.rb
@@ -19,5 +19,38 @@ class AssetTest < ActiveSupport::TestCase
19 assert_equal 0, draft.assets.length 19 assert_equal 0, draft.assets.length
20 assert_equal 0, RelatedAsset.count 20 assert_equal 0, RelatedAsset.count
21 end 21 end
22 22
23 test "image? is true for supported image content types" do
24 assert Asset.new(:upload_content_type => "image/png").image?
25 assert Asset.new(:upload_content_type => "image/jpeg").image?
26 end
27
28 test "image? is false for non-image content types" do
29 assert_not Asset.new(:upload_content_type => "application/pdf").image?
30 assert_not Asset.new(:upload_content_type => nil).image?
31 end
32
33 test "license_key must be a known dictionary key" do
34 asset = Asset.new(:license_key => "not_a_real_license")
35 I18n.with_locale(:en) do
36 assert_not asset.valid?
37 assert_includes asset.errors[:license_key], "is not included in the list"
38 end
39 end
40
41 test "license_key may be blank" do
42 assert Asset.new(:license_key => nil).valid?
43 end
44
45 test "pdf? is true only for application/pdf" do
46 assert Asset.new(:upload_content_type => "application/pdf").pdf?
47 assert_not Asset.new(:upload_content_type => "image/png").pdf?
48 end
49
50 test "show_credit? is false for a PDF even with every credit field present" do
51 asset = Asset.new(:name => "demo", :upload_content_type => "application/pdf",
52 :creator => "Jane Doe", :source_url => "https://example.org", :license_key => "cc_by_4")
53 assert asset.has_credit?
54 assert_not asset.show_credit?
55 end
23end 56end
diff --git a/test/models/helpers/content_helper_test.rb b/test/models/helpers/content_helper_test.rb
index a7ed478..c69ef4e 100644
--- a/test/models/helpers/content_helper_test.rb
+++ b/test/models/helpers/content_helper_test.rb
@@ -2,7 +2,127 @@ require 'test_helper'
2 2
3class ContentHelperTest < ActionView::TestCase 3class ContentHelperTest < ActionView::TestCase
4 test "weekday_abbr delegates through the current I18n locale" do 4 test "weekday_abbr delegates through the current I18n locale" do
5 I18n.locale = :de 5 I18n.with_locale(:de) do
6 assert_equal "Mo", weekday_abbr(Time.parse("2026-07-06")) 6 assert_equal "Mo", weekday_abbr(Time.parse("2026-07-06"))
7 end
8 end
9
10 test "asset_credit returns nil for a nil asset" do
11 assert_nil asset_credit(nil)
12 end
13
14 test "asset_credit returns nil when creator, source, and license are all blank" do
15 assert_nil asset_credit(Asset.new(:name => "blank"))
16 end
17
18 test "asset_credit renders creator, source link, and license link when all are present" do
19 asset = Asset.new(:name => "demo", :creator => "Jane Doe",
20 :source_url => "https://example.org/photo", :license_key => "cc_by_4")
21
22 result = I18n.with_locale(:en) { asset_credit(asset) }
23
24 assert_match %r{<a href="https://example.org/photo">Photo demo</a>}, result
25 assert_match "by Jane Doe", result
26 assert_match %r{<a href="https://creativecommons.org/licenses/by/4.0/">Licensed under CC BY 4.0</a>}, result
27 end
28
29 test "asset_credit falls back to plain text when source_url is blank" do
30 asset = Asset.new(:name => "demo", :creator => "Jane Doe", :license_key => "cc_by_4")
31 assert_no_match %r{<a href="[^"]*">Photo demo</a>}, I18n.with_locale(:en) { asset_credit(asset) }
32 end
33
34 test "asset_credit omits the 'by' clause when creator is blank" do
35 asset = Asset.new(:name => "demo", :source_url => "https://example.org/photo", :license_key => "cc_by_4")
36 assert_no_match "by ", I18n.with_locale(:en) { asset_credit(asset) }
37 end
38
39 test "a note-style license renders with no 'Licensed under' prefix and no link" do
40 asset = Asset.new(:name => "demo", :creator => "CCC", :license_key => "own_work")
41 result = I18n.with_locale(:en) { asset_credit(asset) }
42
43 assert_match "Own work", result
44 assert_no_match "Licensed under", result
45 assert_no_match "<a", result
46 end
47
48 test "asset_credit degrades gracefully when the license_key is no longer in the dictionary" do
49 asset = Asset.new(:name => "demo", :creator => "Jane Doe")
50 asset.license_key = "a_retired_key"
51
52 result = I18n.with_locale(:en) { asset_credit(asset) }
53
54 assert_match "Photo demo by Jane Doe", result
55 assert_no_match "Licensed under", result
56 end
57
58 test "headline_image renders nothing when no images are attached" do
59 node = Node.root.children.create!(:slug => "headline_image_empty_test")
60 @page = node.draft
61 assert_nil headline_image
62 end
63
64 test "headline_image renders the flagged headline asset" do
65 node = Node.root.children.create!(:slug => "headline_image_flagged_test")
66 asset = Asset.create!(:name => "flagged", :upload_content_type => "image/png")
67 node.draft.assets << asset
68 node.draft.related_assets.find_by(:asset_id => asset.id).update!(:headline => true)
69 @page = node.draft
70
71 assert_match "glightbox", headline_image
72 end
73
74 test "headline_image falls back to a gallery-open caption when no headline is flagged" do
75 node = Node.root.children.create!(:slug => "headline_image_no_flag_test")
76 asset = Asset.create!(:name => "unflagged", :upload_content_type => "image/png")
77 node.draft.assets << asset
78 @page = node.draft
79
80 I18n.with_locale(:en) { assert_match t(:open_gallery), headline_image }
81 end
82
83 test "headline_image renders a document card for a PDF headline, not a lightbox image" do
84 node = Node.root.children.create!(:slug => "headline_image_pdf_test")
85 asset = Asset.create!(:name => "Expert Opinion", :upload_content_type => "application/pdf")
86 node.draft.assets << asset
87 node.draft.related_assets.find_by(:asset_id => asset.id).update!(:headline => true)
88 @page = node.draft
89
90 result = headline_image
91
92 assert_match "headline_document_card", result
93 assert_match "Expert Opinion", result
94 assert_no_match "data-gallery", result
95 end
96
97 test "headline_image lists other attached PDFs below the headline" do
98 node = Node.root.children.create!(:slug => "headline_image_multi_pdf_test")
99 headline_pdf = Asset.create!(:name => "Main Filing", :upload_content_type => "application/pdf")
100 other_pdf = Asset.create!(:name => "Supplementary Exhibit", :upload_content_type => "application/pdf")
101 node.draft.assets << headline_pdf
102 node.draft.assets << other_pdf
103 node.draft.related_assets.find_by(:asset_id => headline_pdf.id).update!(:headline => true)
104 @page = node.draft
105
106 result = headline_image
107
108 assert_match "Main Filing", result
109 assert_match "Supplementary Exhibit", result
110 assert_match "headline_document_card", result
111 assert_match "related_documents_list", result
112 end
113
114 test "headline_image lists attached PDFs even with no headline chosen" do
115 node = Node.root.children.create!(:slug => "headline_image_pdf_no_headline_test")
116 pdf_a = Asset.create!(:name => "Document A", :upload_content_type => "application/pdf")
117 pdf_b = Asset.create!(:name => "Document B", :upload_content_type => "application/pdf")
118 node.draft.assets << pdf_a
119 node.draft.assets << pdf_b
120 @page = node.draft
121
122 result = headline_image
123
124 assert_no_match "headline_document_card", result
125 assert_match "Document A", result
126 assert_match "Document B", result
7 end 127 end
8end 128end
diff --git a/test/models/node_test.rb b/test/models/node_test.rb
index ab66f81..d7e4dd0 100644
--- a/test/models/node_test.rb
+++ b/test/models/node_test.rb
@@ -268,7 +268,6 @@ class NodeTest < ActiveSupport::TestCase
268 assert_equal "quentin", node.head.user.login 268 assert_equal "quentin", node.head.user.login
269 end 269 end
270 270
271
272 test "update?" do 271 test "update?" do
273 Node.root.descendants.delete_all 272 Node.root.descendants.delete_all
274 updates = Node.root.children.create!( :slug => "updates" ) 273 updates = Node.root.children.create!( :slug => "updates" )
@@ -359,6 +358,16 @@ class NodeTest < ActiveSupport::TestCase
359 assert_equal @user1, node.reload.lock_owner 358 assert_equal @user1, node.reload.lock_owner
360 end 359 end
361 360
361 test "title reads from autosave when neither draft nor head exists yet" do
362 node = Node.root.children.create!(:slug => "title_autosave_only_test")
363 node.draft.destroy
364 node.update_column(:draft_id, nil)
365 node.lock_for_editing!(users(:quentin))
366 node.autosave!({ :title => "autosave-only title" }, users(:quentin))
367
368 assert_equal "autosave-only title", node.reload.title
369 end
370
362 test "revert! is a safe no-op on a fresh node with only a draft" do 371 test "revert! is a safe no-op on a fresh node with only a draft" do
363 node = create_node_with_draft 372 node = create_node_with_draft
364 node.lock_for_editing!(@user1) 373 node.lock_for_editing!(@user1)
diff --git a/test/models/page_test.rb b/test/models/page_test.rb
index 1f924f9..98a00d2 100644
--- a/test/models/page_test.rb
+++ b/test/models/page_test.rb
@@ -309,11 +309,15 @@ class PageTest < ActiveSupport::TestCase
309 309
310 kept_asset = Asset.create!(:upload_file_name => "kept.png", :upload_content_type => "image/png", :upload_file_size => 1) 310 kept_asset = Asset.create!(:upload_file_name => "kept.png", :upload_content_type => "image/png", :upload_file_size => 1)
311 removed_asset = Asset.create!(:upload_file_name => "removed.pdf", :upload_content_type => "application/pdf", :upload_file_size => 1) 311 removed_asset = Asset.create!(:upload_file_name => "removed.pdf", :upload_content_type => "application/pdf", :upload_file_size => 1)
312 n.head.update_assets([kept_asset.id, removed_asset.id]) 312 n.head.related_assets.delete_all
313 n.head.related_assets.create!(:asset_id => kept_asset.id, :position => 1)
314 n.head.related_assets.create!(:asset_id => removed_asset.id, :position => 2)
313 315
314 d2 = find_or_create_draft(n, @user1) 316 d2 = find_or_create_draft(n, @user1)
315 added_asset = Asset.create!(:upload_file_name => "added.png", :upload_content_type => "image/png", :upload_file_size => 1) 317 added_asset = Asset.create!(:upload_file_name => "added.png", :upload_content_type => "image/png", :upload_file_size => 1)
316 d2.update_assets([kept_asset.id, added_asset.id]) 318 d2.related_assets.delete_all
319 d2.related_assets.create!(:asset_id => kept_asset.id, :position => 1)
320 d2.related_assets.create!(:asset_id => added_asset.id, :position => 2)
317 d2.save! 321 d2.save!
318 322
319 diff = d2.diff_against(n.head) 323 diff = d2.diff_against(n.head)
diff --git a/test/models/related_asset_test.rb b/test/models/related_asset_test.rb
index a739e6b..bb86ddb 100644
--- a/test/models/related_asset_test.rb
+++ b/test/models/related_asset_test.rb
@@ -1,8 +1,54 @@
1require 'test_helper' 1require 'test_helper'
2 2
3class RelatedImageTest < ActiveSupport::TestCase 3class RelatedAssetTest < ActiveSupport::TestCase
4 # Replace this with your real tests. 4 test "headline can be set on an image asset" do
5 test "the truth" do 5 node = Node.root.children.create!(:slug => "related_asset_headline_image_test")
6 assert true 6 asset = Asset.create!(:name => "photo", :upload_content_type => "image/png")
7 node.draft.assets << asset
8 related = node.draft.related_assets.find_by(:asset_id => asset.id)
9
10 related.headline = true
11 assert related.valid?
12 end
13
14 test "headline can be set on a PDF asset" do
15 node = Node.root.children.create!(:slug => "related_asset_headline_pdf_test")
16 asset = Asset.create!(:name => "expert opinion", :upload_content_type => "application/pdf")
17 node.draft.assets << asset
18 related = node.draft.related_assets.find_by(:asset_id => asset.id)
19
20 related.headline = true
21 assert related.valid?
22 end
23
24 test "headline cannot be set on a non-image, non-PDF asset" do
25 node = Node.root.children.create!(:slug => "related_asset_headline_text_test")
26 asset = Asset.create!(:name => "programme", :upload_content_type => "text/plain")
27 node.draft.assets << asset
28 related = node.draft.related_assets.find_by(:asset_id => asset.id)
29
30 related.headline = true
31 assert_not related.valid?
32 assert_includes related.errors[:headline], "can only be set on image or PDF assets"
33 end
34
35 test "the headline validation does not raise when asset is missing" do
36 related = RelatedAsset.new(:headline => true)
37 assert_not related.valid?
38 end
39
40 test "at most one headline per page is enforced at the database level" do
41 node = Node.root.children.create!(:slug => "related_asset_headline_uniqueness_test")
42 first = Asset.create!(:name => "first", :upload_content_type => "image/png")
43 second = Asset.create!(:name => "second", :upload_content_type => "image/png")
44 node.draft.assets << first
45 node.draft.assets << second
46
47 node.draft.related_assets.find_by(:asset_id => first.id).update!(:headline => true)
48 second_related = node.draft.related_assets.find_by(:asset_id => second.id)
49
50 assert_raises(ActiveRecord::RecordNotUnique) do
51 RelatedAsset.where(:id => second_related.id).update_all(:headline => true)
52 end
7 end 53 end
8end 54end