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