#317 #317 #317 #317 #317 #317 Co-authored-by: miteruzo <miteruzo@naver.com> Reviewed-on: #333
This commit was merged in pull request #333.
This commit is contained in:
@@ -0,0 +1,173 @@
|
||||
require 'digest'
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Wiki::Commit do
|
||||
let(:user) { create_member_user! }
|
||||
|
||||
def create_page title:, body: 'initial body'
|
||||
described_class.create_content!(
|
||||
tag_name: TagName.create!(name: title),
|
||||
body:,
|
||||
created_by_user: user,
|
||||
message: 'init')
|
||||
end
|
||||
|
||||
describe '.create_content!' do
|
||||
it 'creates page, revision, and version with normalised body' do
|
||||
expect {
|
||||
described_class.create_content!(
|
||||
tag_name: TagName.create!(name: 'commit_integrity_create'),
|
||||
body: "a\r\nb\r\n\r\n",
|
||||
created_by_user: user,
|
||||
message: 'init')
|
||||
}
|
||||
.to change(WikiPage, :count).by(1)
|
||||
.and change(WikiRevision, :count).by(1)
|
||||
.and change(WikiVersion, :count).by(1)
|
||||
|
||||
page = WikiPage.joins(:tag_name).find_by!(tag_names: { name: 'commit_integrity_create' })
|
||||
revision = page.current_revision
|
||||
version = page.wiki_versions.order(:version_no).last
|
||||
|
||||
expect(page.body).to eq("a\nb")
|
||||
expect(revision.lines_count).to eq(2)
|
||||
expect(version.body).to eq("a\nb")
|
||||
expect(version.reason).to eq('init')
|
||||
end
|
||||
|
||||
it 'rejects body that becomes blank after normalisation' do
|
||||
tag_name = TagName.create!(name: 'commit_integrity_blank')
|
||||
|
||||
expect {
|
||||
described_class.create_content!(
|
||||
tag_name:,
|
||||
body: "\r\n\r\n",
|
||||
created_by_user: user,
|
||||
message: 'blank')
|
||||
}
|
||||
.to raise_error(ActiveRecord::RecordInvalid)
|
||||
|
||||
expect(WikiPage.where(tag_name:)).not_to exist
|
||||
end
|
||||
end
|
||||
|
||||
describe '.content!' do
|
||||
it 'updates page body, revision, and version' do
|
||||
page = create_page(title: 'commit_integrity_update', body: 'before')
|
||||
current_id = page.current_revision.id
|
||||
|
||||
expect {
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: 'after',
|
||||
created_user: user,
|
||||
message: 'edit',
|
||||
base_revision_id: current_id)
|
||||
}
|
||||
.to change(WikiRevision, :count).by(1)
|
||||
.and change(WikiVersion, :count).by(1)
|
||||
|
||||
page.reload
|
||||
version = page.wiki_versions.order(:version_no).last
|
||||
|
||||
expect(page.body).to eq('after')
|
||||
expect(version.body).to eq('after')
|
||||
expect(version.reason).to eq('edit')
|
||||
end
|
||||
|
||||
it 'does not record tag_version on body-only wiki update' do
|
||||
tag_name = TagName.create!(name: 'commit_integrity_linked_tag')
|
||||
tag = Tag.create!(tag_name:, category: :general)
|
||||
|
||||
page =
|
||||
described_class.create_content!(
|
||||
tag_name:,
|
||||
body: 'before',
|
||||
created_by_user: user,
|
||||
message: 'init')
|
||||
|
||||
TagVersionRecorder.record!(
|
||||
tag:,
|
||||
event_type: :create,
|
||||
created_by_user: user)
|
||||
|
||||
before_count = tag.reload.tag_versions.count
|
||||
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: 'after',
|
||||
created_user: user,
|
||||
message: 'edit',
|
||||
base_revision_id: page.current_revision.id)
|
||||
|
||||
expect(tag.reload.tag_versions.count).to eq(before_count)
|
||||
end
|
||||
|
||||
it 'raises conflict and leaves page, revision, and version unchanged' do
|
||||
page = create_page(title: 'commit_integrity_conflict', body: 'first')
|
||||
stale_id = page.current_revision.id
|
||||
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: 'second',
|
||||
created_user: user,
|
||||
message: 'second',
|
||||
base_revision_id: stale_id)
|
||||
|
||||
page.reload
|
||||
before_body = page.body
|
||||
before_revision_count = page.wiki_revisions.count
|
||||
before_version_count = page.wiki_versions.count
|
||||
|
||||
expect {
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: 'third',
|
||||
created_user: user,
|
||||
message: 'stale',
|
||||
base_revision_id: stale_id)
|
||||
}
|
||||
.to raise_error(Wiki::Commit::Conflict)
|
||||
|
||||
page.reload
|
||||
expect(page.body).to eq(before_body)
|
||||
expect(page.wiki_revisions.count).to eq(before_revision_count)
|
||||
expect(page.wiki_versions.count).to eq(before_version_count)
|
||||
end
|
||||
|
||||
it 'deduplicates duplicated missing wiki lines' do
|
||||
page = create_page(title: 'commit_integrity_dedup', body: 'before')
|
||||
duplicated = 'commit_integrity_duplicate_line'
|
||||
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: "#{ duplicated }\n#{ duplicated }",
|
||||
created_user: user,
|
||||
message: 'dedup',
|
||||
base_revision_id: page.current_revision.id)
|
||||
|
||||
revision = page.reload.current_revision
|
||||
|
||||
expect(WikiLine.where(body: duplicated).count).to eq(1)
|
||||
expect(revision.wiki_revision_lines.count).to eq(2)
|
||||
expect(revision.wiki_revision_lines.pluck(:wiki_line_id).uniq.size).to eq(1)
|
||||
end
|
||||
end
|
||||
|
||||
describe '.redirect!' do
|
||||
it 'raises because redirect revisions are deprecated' do
|
||||
page = create_page(title: 'commit_integrity_redirect_source', body: 'source')
|
||||
target = create_page(title: 'commit_integrity_redirect_target', body: 'target')
|
||||
|
||||
expect {
|
||||
described_class.redirect!(
|
||||
page:,
|
||||
redirect_page: target,
|
||||
created_user: user,
|
||||
message: 'redirect',
|
||||
base_revision_id: page.current_revision.id)
|
||||
}
|
||||
.to raise_error(RuntimeError, '廃止しました.')
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,150 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Wiki::Commit do
|
||||
let(:user) { create_member_user! }
|
||||
|
||||
def create_page(title: 'commit_spec_page', body: 'initial body')
|
||||
tag_name = TagName.create!(name: title)
|
||||
|
||||
Wiki::Commit.create_content!(
|
||||
tag_name:,
|
||||
body:,
|
||||
created_by_user: user,
|
||||
message: 'init')
|
||||
end
|
||||
|
||||
describe '.content!' do
|
||||
it 'stores normalised body in wiki_pages and wiki_versions' do
|
||||
page = create_page(title: 'commit_normalised_page')
|
||||
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: "a\r\nb\r\n\r\n",
|
||||
created_user: user,
|
||||
message: 'init'
|
||||
)
|
||||
|
||||
page.reload
|
||||
version = page.wiki_versions.order(:version_no).last
|
||||
|
||||
expect(page.body).to eq("a\nb")
|
||||
expect(version.body).to eq("a\nb")
|
||||
expect(page.current_revision.lines_count).to eq(2)
|
||||
end
|
||||
|
||||
it 'deduplicates duplicated missing wiki lines before upsert' do
|
||||
page = create_page(title: 'commit_duplicate_line_page')
|
||||
duplicated = 'commit_duplicate_line'
|
||||
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: "#{ duplicated }\n#{ duplicated }",
|
||||
created_user: user,
|
||||
message: 'init'
|
||||
)
|
||||
|
||||
page.reload
|
||||
|
||||
expect(WikiLine.where(body: duplicated).count).to eq(1)
|
||||
expect(page.current_revision.lines_count).to eq(2)
|
||||
expect(page.current_revision.wiki_revision_lines.count).to eq(2)
|
||||
end
|
||||
|
||||
it 'raises conflict when base_revision_id is stale' do
|
||||
page = create_page(title: 'commit_conflict_page')
|
||||
|
||||
first = described_class.content!(
|
||||
page:,
|
||||
body: 'first',
|
||||
created_user: user,
|
||||
message: 'first'
|
||||
)
|
||||
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: 'second',
|
||||
created_user: user,
|
||||
message: 'second',
|
||||
base_revision_id: first.id
|
||||
)
|
||||
|
||||
expect {
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: 'third',
|
||||
created_user: user,
|
||||
message: 'third',
|
||||
base_revision_id: first.id
|
||||
)
|
||||
}.to raise_error(Wiki::Commit::Conflict)
|
||||
end
|
||||
|
||||
it 'does not record tag version when corresponding tag has no versions' do
|
||||
tag_name = TagName.create!(name: 'commit_linked_tag_without_versions')
|
||||
tag = Tag.create!(tag_name:, category: :general)
|
||||
|
||||
page =
|
||||
described_class.create_content!(
|
||||
tag_name:,
|
||||
body: 'before',
|
||||
created_by_user: user,
|
||||
message: 'init')
|
||||
|
||||
expect(tag.reload.tag_versions.count).to eq(0)
|
||||
|
||||
current_revision_id = page.current_revision.id
|
||||
|
||||
expect {
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: 'after',
|
||||
created_user: user,
|
||||
message: 'edit',
|
||||
base_revision_id: current_revision_id)
|
||||
}.to change(WikiVersion, :count).by(1)
|
||||
|
||||
expect(tag.reload.tag_versions.count).to eq(0)
|
||||
end
|
||||
|
||||
it 'does not record tag version when corresponding tag has no versions' do
|
||||
tag_name = TagName.create!(name: 'commit_linked_tag_without_versions')
|
||||
tag = Tag.create!(tag_name:, category: :general)
|
||||
|
||||
page =
|
||||
described_class.create_content!(
|
||||
tag_name:,
|
||||
body: 'before',
|
||||
created_by_user: user,
|
||||
message: 'init')
|
||||
|
||||
current_revision_id = page.current_revision.id
|
||||
|
||||
expect {
|
||||
described_class.content!(
|
||||
page:,
|
||||
body: 'after',
|
||||
created_user: user,
|
||||
message: 'edit',
|
||||
base_revision_id: current_revision_id)
|
||||
}.to change(WikiVersion, :count).by(1)
|
||||
|
||||
expect(tag.reload.tag_versions.count).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
describe '.redirect!' do
|
||||
it 'raises because redirect revisions are deprecated' do
|
||||
page = create_page(title: 'commit_redirect_source')
|
||||
target = create_page(title: 'commit_redirect_target')
|
||||
|
||||
expect {
|
||||
described_class.redirect!(
|
||||
page:,
|
||||
redirect_page: target,
|
||||
created_user: user,
|
||||
message: 'redirect'
|
||||
)
|
||||
}.to raise_error(RuntimeError, '廃止しました.')
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,99 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe WikiVersionRecorder do
|
||||
let(:user) { create_member_user! }
|
||||
|
||||
def create_page title:, body: 'body'
|
||||
Wiki::Commit.create_content!(
|
||||
tag_name: TagName.create!(name: title),
|
||||
body:,
|
||||
created_by_user: user,
|
||||
message: 'init')
|
||||
end
|
||||
|
||||
describe '.record!' do
|
||||
it 'records title, body, reason, user, and version number' do
|
||||
page = create_page(title: 'wiki_version_recorder_basic', body: 'body')
|
||||
|
||||
expect {
|
||||
described_class.record!(
|
||||
page:,
|
||||
event_type: :update,
|
||||
reason: 'manual reason',
|
||||
created_by_user: user)
|
||||
}
|
||||
.to change { page.reload.wiki_versions.count }.by(1)
|
||||
|
||||
version = page.wiki_versions.order(:version_no).last
|
||||
|
||||
expect(version).to have_attributes(
|
||||
version_no: 2,
|
||||
event_type: 'update',
|
||||
title: 'wiki_version_recorder_basic',
|
||||
body: 'body',
|
||||
reason: 'manual reason',
|
||||
created_by_user_id: user.id
|
||||
)
|
||||
end
|
||||
|
||||
it 'does not create duplicated update version for identical snapshot' do
|
||||
page = create_page(title: 'wiki_version_recorder_duplicate', body: 'body')
|
||||
|
||||
described_class.record!(
|
||||
page:,
|
||||
event_type: :update,
|
||||
reason: nil,
|
||||
created_by_user: user)
|
||||
|
||||
before_count = page.reload.wiki_versions.count
|
||||
|
||||
described_class.record!(
|
||||
page:,
|
||||
event_type: :update,
|
||||
reason: nil,
|
||||
created_by_user: user)
|
||||
|
||||
expect(page.reload.wiki_versions.count).to eq(before_count)
|
||||
end
|
||||
|
||||
it 'creates update version when title changes' do
|
||||
page = create_page(title: 'wiki_version_recorder_title_before', body: 'body')
|
||||
page.tag_name.update!(name: 'wiki_version_recorder_title_after')
|
||||
|
||||
expect {
|
||||
described_class.record!(
|
||||
page:,
|
||||
event_type: :update,
|
||||
reason: 'rename',
|
||||
created_by_user: user)
|
||||
}
|
||||
.to change { page.reload.wiki_versions.count }.by(1)
|
||||
|
||||
version = page.wiki_versions.order(:version_no).last
|
||||
|
||||
expect(version.title).to eq('wiki_version_recorder_title_after')
|
||||
expect(version.body).to eq('body')
|
||||
expect(version.reason).to eq('rename')
|
||||
end
|
||||
|
||||
it 'creates update version when body changes' do
|
||||
page = create_page(title: 'wiki_version_recorder_body', body: 'before')
|
||||
page.update!(body: 'after')
|
||||
|
||||
expect {
|
||||
described_class.record!(
|
||||
page:,
|
||||
event_type: :update,
|
||||
reason: 'body',
|
||||
created_by_user: user)
|
||||
}
|
||||
.to change { page.reload.wiki_versions.count }.by(1)
|
||||
|
||||
version = page.wiki_versions.order(:version_no).last
|
||||
|
||||
expect(version.title).to eq('wiki_version_recorder_body')
|
||||
expect(version.body).to eq('after')
|
||||
expect(version.reason).to eq('body')
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user