mirror of
https://github.com/discourse/discourse.git
synced 2025-05-31 01:08:35 +08:00
DEV: Gracefully handle regex_replace
max column length violations (#29787)
* DEV: Gracefully handle `regex_replace` violations of column length constraints
This is a follow-up to the `remap` [refactor](9b0cfa99c5
).
Similar to `remap`, the entire `regex_replace` operation fails if the new content exceeds the column’s max length.
This change introduces an optional mode, controlled by the new `skip_max_length_violations` param
to skip records eligible for `regex_replace` where the new content violates the max column length constraint.
It also includes updates to the exception message raised when `regex_replace` fails to include more details
* DEV: Remove string escapes in heredoc text
This commit is contained in:
@ -1,12 +1,12 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe DbHelper do
|
||||
describe ".remap" do
|
||||
fab!(:bookmark1) { Fabricate(:bookmark, name: "short-bookmark") }
|
||||
fab!(:bookmark2) { Fabricate(:bookmark, name: "another-bookmark") }
|
||||
let(:bookmark_name_limit) { Bookmark.columns_hash["name"].limit }
|
||||
let(:long_bookmark_name) { "a" * (bookmark_name_limit + 1) }
|
||||
fab!(:bookmark1) { Fabricate(:bookmark, name: "short-bookmark") }
|
||||
fab!(:bookmark2) { Fabricate(:bookmark, name: "another-bookmark") }
|
||||
let(:bookmark_name_limit) { Bookmark.columns_hash["name"].limit }
|
||||
let(:long_bookmark_name) { "a" * (bookmark_name_limit + 1) }
|
||||
|
||||
describe ".remap" do
|
||||
it "should remap columns properly" do
|
||||
post = Fabricate(:post, cooked: "this is a specialcode that I included")
|
||||
post_attributes = post.reload.attributes
|
||||
@ -97,5 +97,43 @@ RSpec.describe DbHelper do
|
||||
|
||||
expect(post.reload.raw).to include("[img]something[/img]")
|
||||
end
|
||||
|
||||
context "when skip_max_length_violations is false" do
|
||||
it "raises an exception if regexp_replace exceeds column length constraint by default" do
|
||||
expect { DbHelper.regexp_replace("bookmark", long_bookmark_name) }.to raise_error(
|
||||
PG::StringDataRightTruncation,
|
||||
/value too long.*table: bookmarks,.*name/,
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
context "when skip_max_length_violations is true" do
|
||||
it "skips regexp_replace eligible rows if new value exceeds column length constraint" do
|
||||
DbHelper.regexp_replace("bookmark", long_bookmark_name, skip_max_length_violations: true)
|
||||
|
||||
bookmark1.reload
|
||||
bookmark2.reload
|
||||
|
||||
expect(bookmark1.name).to eq("short-bookmark")
|
||||
expect(bookmark2.name).to eq("another-bookmark")
|
||||
end
|
||||
|
||||
it "logs skipped regexp_replace due to max length constraints when verbose is true" do
|
||||
expect {
|
||||
DbHelper.regexp_replace(
|
||||
"bookmark",
|
||||
long_bookmark_name,
|
||||
verbose: true,
|
||||
skip_max_length_violations: true,
|
||||
)
|
||||
}.to output(/SKIPPED:/).to_stdout
|
||||
|
||||
bookmark1.reload
|
||||
bookmark2.reload
|
||||
|
||||
expect(bookmark1.name).to eq("short-bookmark")
|
||||
expect(bookmark2.name).to eq("another-bookmark")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user