ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

174 lines
5.2 KiB

  1. require 'digest'
  2. require 'rails_helper'
  3. RSpec.describe Wiki::Commit do
  4. let(:user) { create_member_user! }
  5. def create_page title:, body: 'initial body'
  6. described_class.create_content!(
  7. tag_name: TagName.create!(name: title),
  8. body:,
  9. created_by_user: user,
  10. message: 'init')
  11. end
  12. describe '.create_content!' do
  13. it 'creates page, revision, and version with normalised body' do
  14. expect {
  15. described_class.create_content!(
  16. tag_name: TagName.create!(name: 'commit_integrity_create'),
  17. body: "a\r\nb\r\n\r\n",
  18. created_by_user: user,
  19. message: 'init')
  20. }
  21. .to change(WikiPage, :count).by(1)
  22. .and change(WikiRevision, :count).by(1)
  23. .and change(WikiVersion, :count).by(1)
  24. page = WikiPage.joins(:tag_name).find_by!(tag_names: { name: 'commit_integrity_create' })
  25. revision = page.current_revision
  26. version = page.wiki_versions.order(:version_no).last
  27. expect(page.body).to eq("a\nb")
  28. expect(revision.lines_count).to eq(2)
  29. expect(version.body).to eq("a\nb")
  30. expect(version.reason).to eq('init')
  31. end
  32. it 'rejects body that becomes blank after normalisation' do
  33. tag_name = TagName.create!(name: 'commit_integrity_blank')
  34. expect {
  35. described_class.create_content!(
  36. tag_name:,
  37. body: "\r\n\r\n",
  38. created_by_user: user,
  39. message: 'blank')
  40. }
  41. .to raise_error(ActiveRecord::RecordInvalid)
  42. expect(WikiPage.where(tag_name:)).not_to exist
  43. end
  44. end
  45. describe '.content!' do
  46. it 'updates page body, revision, and version' do
  47. page = create_page(title: 'commit_integrity_update', body: 'before')
  48. current_id = page.current_revision.id
  49. expect {
  50. described_class.content!(
  51. page:,
  52. body: 'after',
  53. created_user: user,
  54. message: 'edit',
  55. base_revision_id: current_id)
  56. }
  57. .to change(WikiRevision, :count).by(1)
  58. .and change(WikiVersion, :count).by(1)
  59. page.reload
  60. version = page.wiki_versions.order(:version_no).last
  61. expect(page.body).to eq('after')
  62. expect(version.body).to eq('after')
  63. expect(version.reason).to eq('edit')
  64. end
  65. it 'does not record tag_version on body-only wiki update' do
  66. tag_name = TagName.create!(name: 'commit_integrity_linked_tag')
  67. tag = Tag.create!(tag_name:, category: :general)
  68. page =
  69. described_class.create_content!(
  70. tag_name:,
  71. body: 'before',
  72. created_by_user: user,
  73. message: 'init')
  74. TagVersionRecorder.record!(
  75. tag:,
  76. event_type: :create,
  77. created_by_user: user)
  78. before_count = tag.reload.tag_versions.count
  79. described_class.content!(
  80. page:,
  81. body: 'after',
  82. created_user: user,
  83. message: 'edit',
  84. base_revision_id: page.current_revision.id)
  85. expect(tag.reload.tag_versions.count).to eq(before_count)
  86. end
  87. it 'raises conflict and leaves page, revision, and version unchanged' do
  88. page = create_page(title: 'commit_integrity_conflict', body: 'first')
  89. stale_id = page.current_revision.id
  90. described_class.content!(
  91. page:,
  92. body: 'second',
  93. created_user: user,
  94. message: 'second',
  95. base_revision_id: stale_id)
  96. page.reload
  97. before_body = page.body
  98. before_revision_count = page.wiki_revisions.count
  99. before_version_count = page.wiki_versions.count
  100. expect {
  101. described_class.content!(
  102. page:,
  103. body: 'third',
  104. created_user: user,
  105. message: 'stale',
  106. base_revision_id: stale_id)
  107. }
  108. .to raise_error(Wiki::Commit::Conflict)
  109. page.reload
  110. expect(page.body).to eq(before_body)
  111. expect(page.wiki_revisions.count).to eq(before_revision_count)
  112. expect(page.wiki_versions.count).to eq(before_version_count)
  113. end
  114. it 'deduplicates duplicated missing wiki lines' do
  115. page = create_page(title: 'commit_integrity_dedup', body: 'before')
  116. duplicated = 'commit_integrity_duplicate_line'
  117. described_class.content!(
  118. page:,
  119. body: "#{ duplicated }\n#{ duplicated }",
  120. created_user: user,
  121. message: 'dedup',
  122. base_revision_id: page.current_revision.id)
  123. revision = page.reload.current_revision
  124. expect(WikiLine.where(body: duplicated).count).to eq(1)
  125. expect(revision.wiki_revision_lines.count).to eq(2)
  126. expect(revision.wiki_revision_lines.pluck(:wiki_line_id).uniq.size).to eq(1)
  127. end
  128. end
  129. describe '.redirect!' do
  130. it 'raises because redirect revisions are deprecated' do
  131. page = create_page(title: 'commit_integrity_redirect_source', body: 'source')
  132. target = create_page(title: 'commit_integrity_redirect_target', body: 'target')
  133. expect {
  134. described_class.redirect!(
  135. page:,
  136. redirect_page: target,
  137. created_user: user,
  138. message: 'redirect',
  139. base_revision_id: page.current_revision.id)
  140. }
  141. .to raise_error(RuntimeError, '廃止しました.')
  142. end
  143. end
  144. end