0ff7fdf78a
#317 #317 #317 #317 #317 #317 Co-authored-by: miteruzo <miteruzo@naver.com> Reviewed-on: #333
197 lines
5.9 KiB
Ruby
197 lines
5.9 KiB
Ruby
require 'cgi'
|
|
require 'rails_helper'
|
|
|
|
RSpec.describe 'Wiki history integrity', type: :request do
|
|
let!(:user) { create_member_user! }
|
|
|
|
def auth_headers user
|
|
{ 'X-Transfer-Code' => user.inheritance_code }
|
|
end
|
|
|
|
def create_wiki_page title:, body: 'body', message: 'init', user: self.user
|
|
Wiki::Commit.create_content!(
|
|
tag_name: TagName.create!(name: title),
|
|
body:,
|
|
created_by_user: user,
|
|
message:)
|
|
end
|
|
|
|
describe 'POST /wiki' do
|
|
it 'creates wiki_page, wiki_revision, and wiki_version atomically' do
|
|
expect {
|
|
post '/wiki',
|
|
params: {
|
|
title: 'wiki_history_create_atomic',
|
|
body: "a\nb\nc",
|
|
message: 'initial commit',
|
|
},
|
|
headers: auth_headers(user)
|
|
}
|
|
.to change(WikiPage, :count).by(1)
|
|
.and change(WikiRevision, :count).by(1)
|
|
.and change(WikiVersion, :count).by(1)
|
|
|
|
expect(response).to have_http_status(:created)
|
|
|
|
page = WikiPage.find(json.fetch('id'))
|
|
revision = page.current_revision
|
|
version = page.wiki_versions.order(:version_no).last
|
|
|
|
expect(page.title).to eq('wiki_history_create_atomic')
|
|
expect(page.body).to eq("a\nb\nc")
|
|
|
|
expect(revision).to be_content
|
|
expect(revision.message).to eq('initial commit')
|
|
expect(revision.lines_count).to eq(3)
|
|
|
|
expect(version).to have_attributes(
|
|
version_no: 1,
|
|
event_type: 'create',
|
|
title: 'wiki_history_create_atomic',
|
|
body: "a\nb\nc",
|
|
reason: 'initial commit',
|
|
created_by_user_id: user.id
|
|
)
|
|
end
|
|
|
|
it 'returns 422 and creates nothing when normalised body is blank' do
|
|
expect {
|
|
post '/wiki',
|
|
params: {
|
|
title: 'wiki_history_blank_body',
|
|
body: "\r\n\r\n",
|
|
message: 'blank',
|
|
},
|
|
headers: auth_headers(user)
|
|
}
|
|
.not_to change(WikiPage, :count)
|
|
|
|
expect(response).to have_http_status(:unprocessable_entity)
|
|
expect(WikiPage.joins(:tag_name).where(tag_names: { name: 'wiki_history_blank_body' })).not_to exist
|
|
end
|
|
|
|
it 'returns 422 and creates no partial page when title already exists' do
|
|
create_wiki_page(title: 'wiki_history_duplicate_title', body: 'first')
|
|
|
|
expect {
|
|
post '/wiki',
|
|
params: {
|
|
title: 'wiki_history_duplicate_title',
|
|
body: 'second',
|
|
message: 'duplicate',
|
|
},
|
|
headers: auth_headers(user)
|
|
}
|
|
.not_to change(WikiPage, :count)
|
|
|
|
expect(response).to have_http_status(:unprocessable_entity)
|
|
expect(WikiPage.joins(:tag_name).where(tag_names: { name: 'wiki_history_duplicate_title' }).count).to eq(1)
|
|
end
|
|
end
|
|
|
|
describe 'PUT /wiki/:id' do
|
|
it 'updates body and records wiki_revision and wiki_version' do
|
|
page = create_wiki_page(title: 'wiki_history_update_body', body: 'before')
|
|
current_id = page.current_revision.id
|
|
|
|
expect {
|
|
put "/wiki/#{ page.id }",
|
|
params: {
|
|
title: 'wiki_history_update_body',
|
|
body: 'after',
|
|
message: 'edit body',
|
|
base_revision_id: current_id,
|
|
},
|
|
headers: auth_headers(user)
|
|
}
|
|
.to change(WikiRevision, :count).by(1)
|
|
.and change(WikiVersion, :count).by(1)
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
|
|
page.reload
|
|
version = page.wiki_versions.order(:version_no).last
|
|
|
|
expect(page.title).to eq('wiki_history_update_body')
|
|
expect(page.body).to eq('after')
|
|
|
|
expect(version).to have_attributes(
|
|
event_type: 'update',
|
|
title: 'wiki_history_update_body',
|
|
body: 'after',
|
|
reason: 'edit body',
|
|
created_by_user_id: user.id
|
|
)
|
|
end
|
|
|
|
it 'renames title and records wiki_version with new title' do
|
|
page = create_wiki_page(title: 'wiki_history_rename_before', body: 'before')
|
|
current_id = page.current_revision.id
|
|
|
|
expect {
|
|
put "/wiki/#{ page.id }",
|
|
params: {
|
|
title: 'wiki_history_rename_after',
|
|
body: 'after',
|
|
message: 'rename',
|
|
base_revision_id: current_id,
|
|
},
|
|
headers: auth_headers(user)
|
|
}
|
|
.to change(WikiRevision, :count).by(1)
|
|
.and change(WikiVersion, :count).by(1)
|
|
|
|
expect(response).to have_http_status(:ok)
|
|
|
|
page.reload
|
|
version = page.wiki_versions.order(:version_no).last
|
|
|
|
expect(page.title).to eq('wiki_history_rename_after')
|
|
expect(page.body).to eq('after')
|
|
|
|
expect(version).to have_attributes(
|
|
event_type: 'update',
|
|
title: 'wiki_history_rename_after',
|
|
body: 'after',
|
|
reason: 'rename',
|
|
created_by_user_id: user.id
|
|
)
|
|
end
|
|
|
|
it 'does not change title, body, revision, or version on stale base_revision_id' do
|
|
page = create_wiki_page(title: 'wiki_history_conflict_page', body: 'first')
|
|
stale_id = page.current_revision.id
|
|
|
|
Wiki::Commit.content!(
|
|
page:,
|
|
body: 'second',
|
|
created_user: user,
|
|
message: 'other edit',
|
|
base_revision_id: stale_id)
|
|
|
|
page.reload
|
|
current_title = page.title
|
|
current_body = page.body
|
|
revision_count = page.wiki_revisions.count
|
|
version_count = page.wiki_versions.count
|
|
|
|
put "/wiki/#{ page.id }",
|
|
params: {
|
|
title: 'wiki_history_conflict_renamed',
|
|
body: 'third',
|
|
message: 'stale edit',
|
|
base_revision_id: stale_id,
|
|
},
|
|
headers: auth_headers(user)
|
|
|
|
expect(response).to have_http_status(:conflict)
|
|
|
|
page.reload
|
|
expect(page.title).to eq(current_title)
|
|
expect(page.body).to eq(current_body)
|
|
expect(page.wiki_revisions.count).to eq(revision_count)
|
|
expect(page.wiki_versions.count).to eq(version_count)
|
|
end
|
|
end
|
|
end
|