このコミットが含まれているのは:
@@ -84,7 +84,9 @@ RSpec.describe 'Counts native GET acknowledgement', type: :request do
|
||||
expect(response).to have_http_status(:not_found)
|
||||
job, file, attempt = ready_job('json')
|
||||
record = create(:post)
|
||||
PostVersion.create!(post: record, version_no: 1, event_type: 'discard', title: 'private',
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: record, version_no: 1, event_type: 'discard', title: 'private',
|
||||
url: record.url, tags: '', tags_json: [], parent_post_ids: '', created_at: Time.utc(2024))
|
||||
get "/counts/export/files/#{ file }", params: { job:, attempt: }
|
||||
expect(response).to have_http_status(:not_found)
|
||||
|
||||
@@ -8,7 +8,9 @@ RSpec.describe 'History boundaries shared with Counts', type: :request do
|
||||
|
||||
before do
|
||||
['create', 'discard'].each_with_index do |event, index|
|
||||
TagDescriptionVersion.create!(tag_id: tag.id, language_code: 'ja',
|
||||
TagDescriptionVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag_id: tag.id, language_code: 'ja',
|
||||
version_no: index + 1, event_type: event, body: 'private body',
|
||||
created_at: Time.utc(2024))
|
||||
end
|
||||
|
||||
@@ -10,12 +10,16 @@ RSpec.describe 'Legacy Counts API', type: :request do
|
||||
category: 'general', sections: [] }
|
||||
[1, 2, 3].each do |number|
|
||||
time = Time.utc(2024, number == 3 ? 2 : 1, number, 0, 0)
|
||||
PostVersion.create!(post:, version_no: number,
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post:, version_no: number,
|
||||
event_type: number == 1 ? 'create' : 'update',
|
||||
tags: '', url: post.url, title: "Snapshot #{ number }", parent_post_ids: '',
|
||||
tags_json: number == 1 ? [snapshot] : [],
|
||||
created_by_user: number == 3 ? nil : actor, created_at: time)
|
||||
TagVersion.create!(tag:, version_no: number,
|
||||
TagVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag:, version_no: number,
|
||||
event_type: number == 1 ? 'create' : 'update',
|
||||
name: 'counts tag', category: 'general', aliases: '', parent_tag_ids: '',
|
||||
names: { ja: { name: 'counts tag', script_code: 'Jpan',
|
||||
|
||||
@@ -14,7 +14,9 @@ RSpec.describe 'Counts table API', type: :request do
|
||||
end
|
||||
|
||||
before do
|
||||
TagVersion.create!(tag:, version_no: 1, event_type: 'create', name: 'alpha',
|
||||
TagVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag:, version_no: 1, event_type: 'create', name: 'alpha',
|
||||
category: 'general', aliases: '', parent_tag_ids: '',
|
||||
names: { ja: { name: 'alpha', script_code: 'Jpan', auto_generated: false, aliases: [] } },
|
||||
created_at: Time.utc(2023))
|
||||
@@ -24,7 +26,9 @@ RSpec.describe 'Counts table API', type: :request do
|
||||
{ tag_id: tag.id, version_no: 1, name: 'alpha', category: 'general', sections: [] },
|
||||
{ external_tag_id: external.id }]
|
||||
[1, 2, 3].each do |number|
|
||||
PostVersion.create!(post: record, version_no: number,
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: record, version_no: number,
|
||||
event_type: number == 1 ? 'create' : 'update', url: record.url,
|
||||
title: "snapshot #{ number }", tags: '', parent_post_ids: '',
|
||||
tags_json: snapshots.first(number == 1 ? 2 : (number == 2 ? 1 : 0)),
|
||||
@@ -134,7 +138,9 @@ RSpec.describe 'Counts table API', type: :request do
|
||||
end
|
||||
|
||||
it 'checks the current latest flag beyond the execution timestamp' do
|
||||
PostVersion.create!(post: record, version_no: 4, event_type: 'update',
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: record, version_no: 4, event_type: 'update',
|
||||
url: record.url, title: 'after execution', tags: '', tags_json: [],
|
||||
parent_post_ids: '', created_at: Time.utc(2025, 2, 1))
|
||||
result = query
|
||||
@@ -188,12 +194,16 @@ RSpec.describe 'Counts table API', type: :request do
|
||||
tag.tag_names.find_by!(language_code: 'ja', primary_flg: true)
|
||||
.update!(name: 'renamed-alpha')
|
||||
create(:tag_name, :alias, tag:, name: 'alpha-alias')
|
||||
TagVersion.create!(tag:, version_no: 2, event_type: 'update', name: 'renamed-alpha',
|
||||
TagVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag:, version_no: 2, event_type: 'update', name: 'renamed-alpha',
|
||||
category: 'general', aliases: 'alpha-alias', parent_tag_ids: '',
|
||||
names: { ja: { name: 'renamed-alpha', script_code: 'Jpan', auto_generated: false,
|
||||
aliases: [{ name: 'alpha-alias', script_code: 'Jpan' }] } },
|
||||
created_at: Time.utc(2024, 2, 1))
|
||||
PostVersion.create!(post: record, version_no: 4, event_type: 'update',
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: record, version_no: 4, event_type: 'update',
|
||||
url: record.url, title: 'after rename', tags: '', parent_post_ids: '',
|
||||
tags_json: [{ tag_id: tag.id, version_no: 2, name: 'renamed-alpha',
|
||||
category: 'general', sections: [] }],
|
||||
@@ -257,7 +267,9 @@ RSpec.describe 'Counts table API', type: :request do
|
||||
|
||||
it 'reports column overflow separately from malformed input' do
|
||||
101.times do |index|
|
||||
PostVersion.create!(post: record, version_no: index + 4,
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: record, version_no: index + 4,
|
||||
event_type: 'update', url: record.url, title: "column #{ index }",
|
||||
tags: '', tags_json: [], parent_post_ids: '', created_at: Time.utc(2024, 3))
|
||||
end
|
||||
@@ -301,7 +313,9 @@ RSpec.describe 'Counts table API', type: :request do
|
||||
sign_in_as(create(:user, role)) if role
|
||||
# Equal timestamps deliberately require version ordering, not a date comparison.
|
||||
['discard', 'restore', 'discard', 'restore'].each_with_index do |event, index|
|
||||
PostVersion.create!(post: record, version_no: index + 4, event_type: event,
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: record, version_no: index + 4, event_type: event,
|
||||
url: record.url, title: event == 'restore' ? 'restored' : 'private snapshot',
|
||||
tags: '', tags_json: [], parent_post_ids: '', created_at: Time.utc(2024, 3))
|
||||
end
|
||||
@@ -329,7 +343,9 @@ RSpec.describe 'Counts table API', type: :request do
|
||||
end
|
||||
|
||||
it 'does not resolve private condition names even when the result set is empty' do
|
||||
TagVersion.create!(tag:, version_no: 2, event_type: 'discard', name: 'secret tag',
|
||||
TagVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag:, version_no: 2, event_type: 'discard', name: 'secret tag',
|
||||
category: 'general', aliases: '', parent_tag_ids: '',
|
||||
names: { ja: { name: 'secret tag', script_code: 'Jpan', auto_generated: false, aliases: [] } },
|
||||
created_at: Time.utc(2024, 2))
|
||||
@@ -345,7 +361,9 @@ RSpec.describe 'Counts table API', type: :request do
|
||||
end
|
||||
end
|
||||
it 'includes private history in the public timeline without an exclusion count' do
|
||||
PostVersion.create!(post: record, version_no: 4, event_type: 'discard', url: record.url,
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: record, version_no: 4, event_type: 'discard', url: record.url,
|
||||
title: 'hidden title', tags: '', tags_json: [], parent_post_ids: '',
|
||||
created_at: Time.utc(2024, 3))
|
||||
result = query(mode: 'summary', rows: 'created_at:month', cols: 'event_type')
|
||||
|
||||
@@ -314,6 +314,7 @@ RSpec.describe 'Materials API', type: :request do
|
||||
.and change(Tag, :count).by(1)
|
||||
.and change(TagName, :count).by(1)
|
||||
.and change(MaterialVersion, :count).by(1)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:created)
|
||||
|
||||
@@ -325,6 +326,12 @@ RSpec.describe 'Materials API', type: :request do
|
||||
expect(material.file.attached?).to be(true)
|
||||
expect(material.version_no).to eq(1)
|
||||
expect(material.material_versions.first.event_type).to eq('create')
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'materials.create',
|
||||
'created_by_user_id' => member_user.id)
|
||||
expect(material.material_versions.first.event_id).to eq(event.fetch('id'))
|
||||
expect(material.tag.tag_versions.pluck(:event_id)).to eq([event.fetch('id')])
|
||||
expect(material.material_export_items.first.export_path).to eq('伊地知ニジカ/created.png')
|
||||
expect(material.material_versions.first.export_paths_json).to eq(
|
||||
'legacy_drive' => '伊地知ニジカ/created.png'
|
||||
@@ -509,6 +516,7 @@ RSpec.describe 'Materials API', type: :request do
|
||||
export_paths: { legacy_drive: '伊地知ニジカ/updated.jpg' }
|
||||
}
|
||||
end.to change(MaterialVersion, :count).by(2)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:ok)
|
||||
|
||||
@@ -517,6 +525,12 @@ RSpec.describe 'Materials API', type: :request do
|
||||
expect(material.tag.category).to eq('material')
|
||||
expect(material.url).to eq('https://example.com/updated-source')
|
||||
expect(material.updated_by_user).to eq(member_user)
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'materials.update',
|
||||
'created_by_user_id' => member_user.id)
|
||||
expect(material.material_versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
expect(material.tag.tag_versions.pluck(:event_id)).to eq([event.fetch('id')])
|
||||
expect(material.file.attached?).to be(true)
|
||||
expect(material.file.blob.id).not_to eq(old_blob_id)
|
||||
expect(ActiveStorage::Blob.where(id: old_blob_id).exists?).to be(true)
|
||||
@@ -632,6 +646,7 @@ RSpec.describe 'Materials API', type: :request do
|
||||
MaterialVersionRecorder.record!(material:, event_type: :create,
|
||||
created_by_user: member_user)
|
||||
TagVersioning.ensure_snapshot!(tag, created_by_user: member_user)
|
||||
events = event_rows
|
||||
|
||||
expect do
|
||||
put "/materials/#{ material.id }", params: {
|
||||
@@ -643,6 +658,7 @@ RSpec.describe 'Materials API', type: :request do
|
||||
|
||||
expect(response).to have_http_status(:ok)
|
||||
expect(material.reload.version_no).to eq(1)
|
||||
expect(event_rows).to eq(events)
|
||||
end
|
||||
|
||||
it 'records update version when only export_path changes' do
|
||||
@@ -807,6 +823,12 @@ RSpec.describe 'Materials API', type: :request do
|
||||
|
||||
it 'creates source suppression as member' do
|
||||
sign_in_as(member_user)
|
||||
materials = ['a', 'b'].map do |name|
|
||||
Material.create!(
|
||||
source_kind: 'google_drive_file', source_file_id: "blocked-#{ name }",
|
||||
source_path: "伊地知ニジカ/危険素材/#{ name }.png",
|
||||
url: "https://example.com/blocked-#{ name }", created_by_user: member_user)
|
||||
end
|
||||
|
||||
expect do
|
||||
post '/materials/suppressions', params: {
|
||||
@@ -815,6 +837,7 @@ RSpec.describe 'Materials API', type: :request do
|
||||
reason: 'copyright_high_risk'
|
||||
}
|
||||
end.to change(MaterialSyncSuppression, :count).by(1)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:created)
|
||||
expect(json).to include(
|
||||
@@ -822,6 +845,14 @@ RSpec.describe 'Materials API', type: :request do
|
||||
'drive_path' => '伊地知ニジカ/危険素材',
|
||||
'normalized_source_key' => 'google_drive_path_prefix:伊地知ニジカ/危険素材'
|
||||
)
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'materials.block', 'created_by_user_id' => member_user.id)
|
||||
expect(materials.map { _1.reload.discarded? }).to eq([true, true])
|
||||
versions = MaterialVersion.where(material_id: materials.map(&:id))
|
||||
expect(versions.where(event_type: 'discard').pluck(:material_id))
|
||||
.to match_array(materials.map(&:id))
|
||||
expect(versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
end
|
||||
|
||||
@@ -860,11 +891,19 @@ RSpec.describe 'Materials API', type: :request do
|
||||
end
|
||||
|
||||
it 'discards the material and returns 204' do
|
||||
delete "/materials/#{ material.id }"
|
||||
expect { delete "/materials/#{ material.id }" }
|
||||
.to change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:no_content)
|
||||
expect(Material.find_by(id: material.id)).to be_nil
|
||||
expect(Material.with_discarded.find(material.id)).to be_discarded
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'materials.destroy',
|
||||
'created_by_user_id' => member_user.id)
|
||||
versions = MaterialVersion.where(material_id: material.id)
|
||||
expect(versions.order(:version_no).last.event_type).to eq('discard')
|
||||
expect(versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -177,6 +177,7 @@ RSpec.describe 'NicoTags', type: :request do
|
||||
}
|
||||
}.to change(TagVersion, :count).by(2)
|
||||
.and change(NicoTagVersion, :count).by(1)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:ok)
|
||||
|
||||
@@ -186,6 +187,10 @@ RSpec.describe 'NicoTags', type: :request do
|
||||
linked_versions = TagVersion.where(tag: [linked_a, linked_b]).order(:tag_id)
|
||||
expect(linked_versions.map(&:event_type)).to eq(['create', 'create'])
|
||||
expect(linked_versions.map(&:created_by_user_id)).to all(eq(admin.id))
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'tags.update', 'created_by_user_id' => admin.id)
|
||||
expect(linked_versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
|
||||
versions = nico_tag.reload.nico_tag_versions.order(:version_no)
|
||||
expect(versions.map(&:event_type)).to eq(['create', 'update'])
|
||||
|
||||
@@ -50,6 +50,8 @@ RSpec.describe 'Posts API', type: :request do
|
||||
post:,
|
||||
version_no: 1,
|
||||
event_type: 'create',
|
||||
event_id: create_event!(
|
||||
event_type: 'posts.create', created_by_user: post.uploaded_user).id,
|
||||
title: post.title,
|
||||
url: post.url,
|
||||
thumbnail_base: post.thumbnail_base,
|
||||
@@ -1027,7 +1029,7 @@ RSpec.describe 'Posts API', type: :request do
|
||||
|
||||
it 'dry-runs without persisting posts or new tags' do
|
||||
sign_in_as(member)
|
||||
counts = [Post.count, Tag.count, TagName.count]
|
||||
counts = [Post.count, Tag.count, TagName.count, event_rows.length]
|
||||
|
||||
post '/posts?dry=1', params: post_write_params(
|
||||
title: 'dry-run post',
|
||||
@@ -1043,7 +1045,7 @@ RSpec.describe 'Posts API', type: :request do
|
||||
[{ 'name' => 'new_dry_run_tag',
|
||||
'category' => 'character',
|
||||
'section_literals' => [] }])
|
||||
expect([Post.count, Tag.count, TagName.count]).to eq(counts)
|
||||
expect([Post.count, Tag.count, TagName.count, event_rows.length]).to eq(counts)
|
||||
end
|
||||
|
||||
it 'dry-runs an existing URL without validating its upload' do
|
||||
@@ -2218,20 +2220,20 @@ RSpec.describe 'Posts API', type: :request do
|
||||
|
||||
def create_post_version! post, version_no:, event_type:, created_by_user:, created_at:
|
||||
PostVersion.create!(
|
||||
post:,
|
||||
version_no:,
|
||||
event_type:,
|
||||
title: post.title,
|
||||
url: post.url,
|
||||
thumbnail_base: post.thumbnail_base,
|
||||
tags: snapshot_tags(post),
|
||||
tags_json: post.snapshot_tags_json,
|
||||
parent_post_ids: post.snapshot_parent_post_ids.join(' '),
|
||||
original_created_from: post.original_created_from,
|
||||
original_created_before: post.original_created_before,
|
||||
created_at:,
|
||||
created_by_user:
|
||||
)
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post:,
|
||||
version_no:,
|
||||
event_type:,
|
||||
title: post.title,
|
||||
url: post.url,
|
||||
thumbnail_base: post.thumbnail_base,
|
||||
tags: snapshot_tags(post),
|
||||
tags_json: post.snapshot_tags_json,
|
||||
parent_post_ids: post.snapshot_parent_post_ids.join(' '),
|
||||
original_created_from: post.original_created_from,
|
||||
original_created_before: post.original_created_before,
|
||||
created_at:,
|
||||
created_by_user:)
|
||||
end
|
||||
|
||||
let!(:v1) do
|
||||
@@ -2559,6 +2561,7 @@ RSpec.describe 'Posts API', type: :request do
|
||||
tags: 'spec_tag',
|
||||
thumbnail: dummy_upload)
|
||||
end.to change(PostVersion, :count).by(1)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:created)
|
||||
|
||||
@@ -2570,6 +2573,13 @@ RSpec.describe 'Posts API', type: :request do
|
||||
expect(version.url).to eq('https://example.com/versioned-post')
|
||||
expect(version.created_by_user_id).to eq(member.id)
|
||||
expect(version.tags).to eq(snapshot_tags(created_post))
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'posts.create', 'created_by_user_id' => member.id)
|
||||
expect(version.event_id).to eq(event.fetch('id'))
|
||||
tag_versions = TagVersion.where(tag_id: created_post.tags.select(:id))
|
||||
expect(tag_versions).not_to be_empty
|
||||
expect(tag_versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
|
||||
it 'creates next version on PUT /posts/:id when snapshot changes' do
|
||||
@@ -2585,6 +2595,7 @@ RSpec.describe 'Posts API', type: :request do
|
||||
title: 'updated title',
|
||||
tags: 'spec_tag_2')
|
||||
end.to change(PostVersion, :count).by(1)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:ok)
|
||||
|
||||
@@ -2594,6 +2605,12 @@ RSpec.describe 'Posts API', type: :request do
|
||||
expect(version.title).to eq('updated title')
|
||||
expect(version.created_by_user_id).to eq(member.id)
|
||||
expect(version.tags).to eq(snapshot_tags(post_record.reload))
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'posts.update', 'created_by_user_id' => member.id)
|
||||
expect(version.event_id).to eq(event.fetch('id'))
|
||||
tag_version = TagVersion.find_by!(tag_id: tag_name2.reload.tag_id, version_no: 1)
|
||||
expect(tag_version.event_id).to eq(event.fetch('id'))
|
||||
end
|
||||
|
||||
it 'does not create a new version on PUT /posts/:id when snapshot is unchanged' do
|
||||
@@ -2602,6 +2619,7 @@ RSpec.describe 'Posts API', type: :request do
|
||||
PostTag.create!(post: post_record, tag: Tag.no_deerjikist)
|
||||
base_version = create_post_version_for!(post_record.reload)
|
||||
|
||||
events = event_rows
|
||||
expect {
|
||||
put "/posts/#{post_record.id}", params: post_write_params(
|
||||
base_version_no: base_version.version_no,
|
||||
@@ -2615,10 +2633,12 @@ RSpec.describe 'Posts API', type: :request do
|
||||
expect(version.version_no).to eq(1)
|
||||
expect(version.event_type).to eq('create')
|
||||
expect(version.tags).to eq(snapshot_tags(post_record))
|
||||
expect(event_rows).to eq(events)
|
||||
end
|
||||
|
||||
it 'does not create a version when POST /posts is invalid' do
|
||||
sign_in_as(member)
|
||||
events = event_rows
|
||||
|
||||
expect do
|
||||
post '/posts', params: post_write_params(
|
||||
@@ -2629,11 +2649,13 @@ RSpec.describe 'Posts API', type: :request do
|
||||
end.not_to change(PostVersion, :count)
|
||||
|
||||
expect(response).to have_http_status(:unprocessable_entity)
|
||||
expect(event_rows).to eq(events)
|
||||
end
|
||||
|
||||
it 'does not create a version when PUT /posts/:id is invalid' do
|
||||
sign_in_as(member)
|
||||
base_version = create_post_version_for!(post_record)
|
||||
events = event_rows
|
||||
|
||||
expect do
|
||||
put "/posts/#{post_record.id}", params: post_write_params(
|
||||
@@ -2645,6 +2667,7 @@ RSpec.describe 'Posts API', type: :request do
|
||||
end.not_to change(PostVersion, :count)
|
||||
|
||||
expect(response).to have_http_status(:unprocessable_entity)
|
||||
expect(event_rows).to eq(events)
|
||||
end
|
||||
|
||||
it 'rejects second-bearing original created timestamps on POST /posts' do
|
||||
|
||||
@@ -119,7 +119,9 @@ RSpec.describe 'Sitemap entries API', type: :request do
|
||||
# Legacy empty bodies can exist even though the write service rejects them.
|
||||
empty = TagDescription.create!(tag: empty_tag, language_code: 'ain',
|
||||
body: '', version_no: 1)
|
||||
TagDescriptionVersion.create!(tag_id: empty_tag.id, language_code: 'ain',
|
||||
TagDescriptionVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag_id: empty_tag.id, language_code: 'ain',
|
||||
body: '', version_no: 1, event_type: 'create',
|
||||
created_by_user_id: user.id, created_at: Time.current)
|
||||
|
||||
|
||||
@@ -53,8 +53,13 @@ RSpec.describe "TagChildren", type: :request do
|
||||
expect { do_request }
|
||||
.to change { parent.reload.children.ids.include?(child.id) }
|
||||
.from(false).to(true)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:no_content)
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'tags.update', 'created_by_user_id' => admin.id)
|
||||
expect(child.tag_versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
|
||||
it 'returns 422 and does not create relation when the new link makes a cycle' do
|
||||
@@ -132,6 +137,7 @@ RSpec.describe "TagChildren", type: :request do
|
||||
expect {
|
||||
do_request
|
||||
}.to change(TagVersion, :count).by(2)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:no_content)
|
||||
|
||||
@@ -140,6 +146,10 @@ RSpec.describe "TagChildren", type: :request do
|
||||
expect(versions.first.parent_tag_ids.split).to include(parent.id.to_s)
|
||||
expect(versions.second.parent_tag_ids).to eq('')
|
||||
expect(versions.second.created_by_user_id).to eq(admin.id)
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'tags.update', 'created_by_user_id' => admin.id)
|
||||
expect(versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ RSpec.describe 'Tag description Wiki compatibility', type: :request do
|
||||
let!(:versions) do
|
||||
['A', 'A', 'new-version'].each_with_index.map do |body, index|
|
||||
TagDescriptionVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag_id: tag.id, language_code: 'ja', version_no: index + 1,
|
||||
event_type: index.zero? ? 'create' : 'update', body:,
|
||||
created_by_user_id: user.id, created_at: Time.current)
|
||||
@@ -73,6 +74,7 @@ RSpec.describe 'Tag description Wiki compatibility', type: :request do
|
||||
let!(:other_tag) { create(:tag, primary_name: 'other_description_contract') }
|
||||
let!(:other_version) do
|
||||
TagDescriptionVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag_id: other_tag.id, language_code: 'ja', version_no: 1,
|
||||
event_type: 'create', body: 'other tag history',
|
||||
created_by_user_id: user.id, created_at: Time.current)
|
||||
|
||||
@@ -13,7 +13,7 @@ RSpec.describe 'Tag description native API', type: :request do
|
||||
def stored_state
|
||||
[TagDescription, TagDescriptionVersion, TagName, TagVersion].map do |model|
|
||||
model.order(:id).map(&:attributes)
|
||||
end
|
||||
end + [event_rows]
|
||||
end
|
||||
|
||||
def fail_save model
|
||||
@@ -91,6 +91,8 @@ RSpec.describe 'Tag description native API', type: :request do
|
||||
let!(:version) do
|
||||
TagDescriptionVersion.create!(
|
||||
tag_id: tag.id, language_code: 'ja', body: 'native version', version_no: 1,
|
||||
event_id: create_event!(
|
||||
event_type: 'tag_descriptions.create', created_by_user: author).id,
|
||||
event_type: 'create', created_by_user_id: author.id, created_at: Time.current)
|
||||
end
|
||||
let(:name_endpoint) { "/tags/name/#{ tag_name.name }/description" }
|
||||
@@ -185,6 +187,7 @@ RSpec.describe 'Tag description native API', type: :request do
|
||||
expect { native_write(body: 'created natively') }
|
||||
.to change(TagDescription, :count).by(1)
|
||||
.and change(TagDescriptionVersion, :count).by(1)
|
||||
.and change { event_rows.length }.by(1)
|
||||
expect(response).to have_http_status(:created)
|
||||
description = TagDescription.find_by!(tag_id: tag.id, language_code: 'ja')
|
||||
expect_current(description)
|
||||
@@ -192,6 +195,10 @@ RSpec.describe 'Tag description native API', type: :request do
|
||||
expect(version).to have_attributes(
|
||||
body: 'created natively', version_no: 1, event_type: 'create',
|
||||
created_by_user_id: editor.id)
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'tag_descriptions.create', 'created_by_user_id' => editor.id)
|
||||
expect(version.event_id).to eq(event.fetch('id'))
|
||||
get "/wiki/#{ description.id }"
|
||||
expect(response).to have_http_status(:ok)
|
||||
expect(json).to include('body' => description.body, 'revision_id' => version.id)
|
||||
@@ -223,6 +230,7 @@ RSpec.describe 'Tag description native API', type: :request do
|
||||
expect(description.version_no).to eq(1)
|
||||
expect { native_write(body: 'after') }
|
||||
.to change(TagDescriptionVersion, :count).by(1)
|
||||
.and change { event_rows.length }.by(1)
|
||||
expect(response).to have_http_status(:ok)
|
||||
expect(description.reload).to have_attributes(
|
||||
body: 'after', version_no: 2,
|
||||
@@ -234,6 +242,10 @@ RSpec.describe 'Tag description native API', type: :request do
|
||||
expect(version).to have_attributes(
|
||||
tag_id: tag.id, language_code: 'ja', version_no: 2, event_type: 'update',
|
||||
body: 'after', created_by_user_id: editor.id)
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'tag_descriptions.update', 'created_by_user_id' => editor.id)
|
||||
expect(version.event_id).to eq(event.fetch('id'))
|
||||
expect(revision.body).to eq(version.body)
|
||||
expect(description_versions(page).order(:version_no).last.body).to eq(version.body)
|
||||
get "/wiki/#{ description.id }"
|
||||
|
||||
@@ -121,10 +121,14 @@ RSpec.describe 'Tag group native API', type: :request do
|
||||
[:create, :update].each do |operation|
|
||||
it "#{ operation }s structured data and keeps unplaced membership" do
|
||||
previous = group_version(group_id, 1)
|
||||
native_write(operation)
|
||||
expect { native_write(operation) }.to change { event_rows.length }.by(1)
|
||||
expect(response).to have_http_status(operation == :create ? :created : :ok)
|
||||
id = operation == :create ? json.fetch('id') : group_id
|
||||
number = operation == :create ? 1 : 2
|
||||
event = event_rows.last
|
||||
event_type = operation == :create ? 'tag_groups.create' : 'tag_groups.update'
|
||||
expect(event).to include('event_type' => event_type, 'created_by_user_id' => user.id)
|
||||
expect(group_version(id, number).fetch('event_id')).to eq(event.fetch('id'))
|
||||
expect_group_snapshot(
|
||||
id, number:, members: snapshot_members, placements:, description: '全体の説明')
|
||||
expect(group_version(group_id, 1)).to eq(previous)
|
||||
|
||||
@@ -30,6 +30,7 @@ RSpec.describe 'TagVersions API', type: :request do
|
||||
)
|
||||
version =
|
||||
TagVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag: tag,
|
||||
version_no: version_no,
|
||||
event_type: event_type,
|
||||
|
||||
@@ -705,6 +705,7 @@ RSpec.describe 'Tags API', type: :request do
|
||||
expect {
|
||||
patch "/tags/#{tag.id}", params: { name: 'new_tag_name', category: 'meme' }
|
||||
}.to change(TagVersion, :count).by(2)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:ok)
|
||||
|
||||
@@ -719,6 +720,10 @@ RSpec.describe 'Tags API', type: :request do
|
||||
expect(version_primary_name(versions.second, 'ja')).to eq('new_tag_name')
|
||||
expect(versions.second.category).to eq('meme')
|
||||
expect(versions.second.created_by_user_id).to eq(member_user.id)
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'tags.update', 'created_by_user_id' => member_user.id)
|
||||
expect(versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
|
||||
it 'updates deprecated state and records it in tag versions' do
|
||||
@@ -1275,6 +1280,7 @@ RSpec.describe 'Tags API', type: :request do
|
||||
deprecated: '0',
|
||||
}
|
||||
}.to change(TagVersion, :count).by(2)
|
||||
.and change { event_rows.length }.by(1)
|
||||
|
||||
expect(response).to have_http_status(:ok)
|
||||
|
||||
@@ -1290,6 +1296,10 @@ RSpec.describe 'Tags API', type: :request do
|
||||
expect(versions.second.category).to eq('meta')
|
||||
expect(version_alias_names(versions.second, 'ja')).to include('spec_tag')
|
||||
expect(versions.second.created_by_user_id).to eq(member_user.id)
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'tags.update', 'created_by_user_id' => member_user.id)
|
||||
expect(versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
|
||||
it '同じ tag の旧 alias へ戻しても rename できる' do
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする