このコミットが含まれているのは:
@@ -9,7 +9,9 @@ RSpec.describe HistoryAccess do
|
||||
locale
|
||||
rows = ['ja', 'ain'].flat_map do |language|
|
||||
['create', 'discard', 'restore'].each_with_index.map do |event, index|
|
||||
TagDescriptionVersion.create!(tag_id: tag.id, language_code: language,
|
||||
TagDescriptionVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag_id: tag.id, language_code: language,
|
||||
version_no: index + 1, event_type: language == 'ain' ? 'update' : event,
|
||||
body: "#{ language } #{ index }", created_at: Time.utc(2024))
|
||||
end
|
||||
@@ -28,7 +30,9 @@ RSpec.describe HistoryAccess do
|
||||
public_metadata = described_class.set(user: nil) { described_class.authority }
|
||||
admin = create(:user, :admin)
|
||||
admin_metadata = described_class.set(user: admin) { described_class.authority }
|
||||
TagVersion.create!(tag:, version_no: 1, event_type: 'discard', name: 'private',
|
||||
TagVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag:, version_no: 1, event_type: 'discard', name: 'private',
|
||||
category: 'general',
|
||||
names: { ja: { name: 'private', script_code: 'Jpan',
|
||||
auto_generated: false, aliases: [] } },
|
||||
@@ -52,7 +56,9 @@ RSpec.describe HistoryAccess do
|
||||
blob = ActiveStorage::Blob.create_before_direct_upload!(filename: 'private.png',
|
||||
byte_size: 1, checksum: Base64.strict_encode64('checksum'), content_type: 'image/png')
|
||||
ActiveStorage::Attachment.create!(name: 'thumbnail', record: post, blob:)
|
||||
PostVersion.create!(post:, version_no: 1, event_type: 'discard', url: post.url,
|
||||
PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post:, version_no: 1, event_type: 'discard', url: post.url,
|
||||
title: 'private', tags: '', tags_json: [], parent_post_ids: '', created_at: Time.utc(2024))
|
||||
variant = ActiveStorage::VariantRecord.create!(blob:, variation_digest: 'spec-variation')
|
||||
derived = ActiveStorage::Blob.create_before_direct_upload!(filename: 'derived.png',
|
||||
@@ -78,7 +84,9 @@ RSpec.describe 'Counts artifact policy and external references' do
|
||||
|
||||
it 'does not expose a private linked tag name through an external history snapshot' do
|
||||
tag = create(:tag, primary_name: 'private-linked-name')
|
||||
TagVersion.create!(tag:, version_no: 1, event_type: 'discard', name: 'private-linked-name',
|
||||
TagVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag:, version_no: 1, event_type: 'discard', name: 'private-linked-name',
|
||||
category: 'general', aliases: '', parent_tag_ids: '', created_at: Time.utc(2024),
|
||||
names: { ja: { name: 'private-linked-name', script_code: 'Jpan',
|
||||
auto_generated: false, aliases: [] } })
|
||||
@@ -87,7 +95,9 @@ RSpec.describe 'Counts artifact policy and external references' do
|
||||
name: 'nico:public-external', linked_tags: 'private-linked-name',
|
||||
created_at: Time.utc(2024))
|
||||
post = create(:post)
|
||||
snapshot = PostVersion.create!(post:, version_no: 1, event_type: 'create',
|
||||
snapshot = PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post:, version_no: 1, event_type: 'create',
|
||||
title: 'external reference', url: post.url, tags: '',
|
||||
tags_json: [{ external_tag_id: external.id }], parent_post_ids: '',
|
||||
created_at: Time.utc(2024, 2))
|
||||
@@ -112,13 +122,17 @@ RSpec.describe 'Counts artifact policy and external references' do
|
||||
child = create(:tag, primary_name: 'referencing child')
|
||||
[[parent, 'discard', '', 'private parent'],
|
||||
[child, 'create', parent.id.to_s, 'referencing child']].each do |tag, event, parents, name|
|
||||
TagVersion.create!(tag:, version_no: 1, event_type: event, name:,
|
||||
TagVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag:, version_no: 1, event_type: event, name:,
|
||||
category: 'general', aliases: '', parent_tag_ids: parents, created_at: Time.utc(2023),
|
||||
names: { ja: { name:, script_code: 'Jpan',
|
||||
auto_generated: false, aliases: [] } })
|
||||
end
|
||||
post = create(:post)
|
||||
row = PostVersion.create!(post:, version_no: 1, event_type: 'create', title: 'snapshot',
|
||||
row = PostVersion.create!(
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post:, version_no: 1, event_type: 'create', title: 'snapshot',
|
||||
url: post.url, tags: '', parent_post_ids: '',
|
||||
tags_json: [{ tag_id: child.id, version_no: 1, name: 'referencing child', sections: [] }],
|
||||
created_at: Time.utc(2024))
|
||||
|
||||
@@ -23,9 +23,22 @@ RSpec.describe 'Locale activation', type: :model do
|
||||
.and_raise('backfill failed')
|
||||
end
|
||||
|
||||
it 'groups all tag histories from locale creation into one event' do
|
||||
previous_ids = TagVersion.pluck(:id)
|
||||
|
||||
expect { build_locale.save! }.to change { event_rows.length }.by(1)
|
||||
|
||||
event = event_rows.last
|
||||
expect(event).to include('event_type' => 'locales.create', 'created_by_user_id' => nil)
|
||||
versions = TagVersion.where.not(id: previous_ids)
|
||||
expect(versions.pluck(:tag_id)).to include(first.id, second.id)
|
||||
expect(versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
|
||||
it 'rolls back a newly created locale and the preceding generated names' do
|
||||
locale = build_locale
|
||||
fail_second_generation!
|
||||
events = event_rows
|
||||
|
||||
expect { locale.save! }.to raise_error('backfill failed')
|
||||
|
||||
@@ -33,6 +46,7 @@ RSpec.describe 'Locale activation', type: :model do
|
||||
expect(generated_names).to be_empty
|
||||
expect(first.reload.name('ja')).to eq('activation_first')
|
||||
expect(second.reload.name('ja')).to eq('activation_second')
|
||||
expect(event_rows).to eq(events)
|
||||
end
|
||||
|
||||
it 'does not backfill while the locale is inactive' do
|
||||
@@ -45,7 +59,14 @@ RSpec.describe 'Locale activation', type: :model do
|
||||
locale = build_locale(deprecated_at: Time.current)
|
||||
locale.save!
|
||||
|
||||
locale.update!(deprecated_at: nil)
|
||||
previous_ids = TagVersion.pluck(:id)
|
||||
expect { locale.update!(deprecated_at: nil) }.to change { event_rows.length }.by(1)
|
||||
|
||||
event = event_rows.last
|
||||
expect(event).to include('event_type' => 'locales.restore', 'created_by_user_id' => nil)
|
||||
versions = TagVersion.where.not(id: previous_ids)
|
||||
expect(versions.pluck(:tag_id)).to include(first.id, second.id)
|
||||
expect(versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
|
||||
expect(generated_names.pluck(:tag_id)).to contain_exactly(first.id, second.id)
|
||||
expect(generated_names).to all(have_attributes(
|
||||
@@ -57,11 +78,13 @@ RSpec.describe 'Locale activation', type: :model do
|
||||
locale.save!
|
||||
previous_deprecated_at = locale.reload.deprecated_at
|
||||
fail_second_generation!
|
||||
events = event_rows
|
||||
|
||||
expect { locale.update!(deprecated_at: nil) }.to raise_error('backfill failed')
|
||||
|
||||
expect(locale.reload.deprecated_at).to eq(previous_deprecated_at)
|
||||
expect(generated_names).to be_empty
|
||||
expect(event_rows).to eq(events)
|
||||
end
|
||||
|
||||
it 'preserves a human primary through deactivation and repeated activation' do
|
||||
|
||||
@@ -12,20 +12,20 @@ RSpec.describe PostVersion, type: :model do
|
||||
|
||||
let!(:post_version) do
|
||||
PostVersion.create!(
|
||||
post: post_record,
|
||||
version_no: 1,
|
||||
event_type: 'create',
|
||||
title: post_record.title,
|
||||
url: post_record.url,
|
||||
thumbnail_base: post_record.thumbnail_base,
|
||||
tags: post_record.snapshot_tag_names.join(' '),
|
||||
tags_json: post_record.snapshot_tags_json,
|
||||
parent_post_ids: post_record.snapshot_parent_post_ids.join(' '),
|
||||
original_created_from: post_record.original_created_from,
|
||||
original_created_before: post_record.original_created_before,
|
||||
created_at: Time.current,
|
||||
created_by_user: nil
|
||||
)
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: post_record,
|
||||
version_no: 1,
|
||||
event_type: 'create',
|
||||
title: post_record.title,
|
||||
url: post_record.url,
|
||||
thumbnail_base: post_record.thumbnail_base,
|
||||
tags: post_record.snapshot_tag_names.join(' '),
|
||||
tags_json: post_record.snapshot_tags_json,
|
||||
parent_post_ids: post_record.snapshot_parent_post_ids.join(' '),
|
||||
original_created_from: post_record.original_created_from,
|
||||
original_created_before: post_record.original_created_before,
|
||||
created_at: Time.current,
|
||||
created_by_user: nil)
|
||||
end
|
||||
|
||||
it 'is read only after create' do
|
||||
|
||||
@@ -34,6 +34,31 @@ RSpec.describe TagNameSanitisationRule, type: :model do
|
||||
described_class.create!(priority: 10, source_pattern: 'foo_', replacement: 'foo')
|
||||
end
|
||||
|
||||
it 'groups renames, merges and affected post histories into one event' do
|
||||
target = create(:tag, primary_name: 'foobar')
|
||||
source = create(:tag, primary_name: 'temporary_source')
|
||||
renamed = create(:tag, primary_name: 'temporary_rename')
|
||||
source.tag_name('ja').update_columns(name: 'foo_bar')
|
||||
renamed.tag_name('ja').update_columns(name: 'foo_baz')
|
||||
post = create(:post)
|
||||
PostTag.create!(post:, tag: source)
|
||||
previous_tag_ids = TagVersion.pluck(:id)
|
||||
previous_post_ids = PostVersion.pluck(:id)
|
||||
|
||||
expect { described_class.apply! }.to change { event_rows.length }.by(1)
|
||||
|
||||
event = event_rows.last
|
||||
expect(event).to include(
|
||||
'event_type' => 'tag_name_sanitisation_rules.apply', 'created_by_user_id' => nil)
|
||||
tag_versions = TagVersion.where.not(id: previous_tag_ids)
|
||||
expect(tag_versions.pluck(:tag_id).uniq).to contain_exactly(target.id, source.id, renamed.id)
|
||||
expect(tag_versions.pluck(:event_type)).to include('discard', 'update')
|
||||
expect(tag_versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
post_versions = PostVersion.where.not(id: previous_post_ids)
|
||||
expect(post_versions.pluck(:post_id).uniq).to eq([post.id])
|
||||
expect(post_versions.pluck(:event_id).uniq).to eq([event.fetch('id')])
|
||||
end
|
||||
|
||||
[:primary, :alias].each do |source_kind|
|
||||
it "keeps the primary identity when a #{ source_kind } collides within its Tag" do
|
||||
tag = create(:tag, primary_name: source_kind == :primary ? 'temporary' : 'foobar')
|
||||
@@ -83,6 +108,7 @@ RSpec.describe TagNameSanitisationRule, type: :model do
|
||||
PostTag.create!(post:, tag: source)
|
||||
models = [Tag, TagName, TagVersion, TagDescription, TagDescriptionVersion, PostTag]
|
||||
snapshots = models.map { |model| model.order(*Array(model.primary_key)).map(&:attributes) }
|
||||
events = event_rows
|
||||
|
||||
expect { described_class.apply! }.to raise_error(ActiveRecord::RecordInvalid)
|
||||
|
||||
@@ -90,6 +116,7 @@ RSpec.describe TagNameSanitisationRule, type: :model do
|
||||
model.order(*Array(model.primary_key)).map(&:attributes)
|
||||
end
|
||||
expect(after_state).to eq(snapshots)
|
||||
expect(event_rows).to eq(events)
|
||||
expect(post.reload.tags).to contain_exactly(source)
|
||||
expect(target.reload.name('ja')).to eq('foobar')
|
||||
end
|
||||
|
||||
@@ -665,20 +665,20 @@ RSpec.describe Tag, type: :model do
|
||||
|
||||
def create_post_version_for!(post, version_no: 1, event_type: 'create', created_by_user: nil)
|
||||
PostVersion.create!(
|
||||
post: post,
|
||||
version_no: version_no,
|
||||
event_type: 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: Time.current,
|
||||
created_by_user: created_by_user
|
||||
)
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
post: post,
|
||||
version_no: version_no,
|
||||
event_type: 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: Time.current,
|
||||
created_by_user: created_by_user)
|
||||
end
|
||||
|
||||
context 'when post versions are enabled' do
|
||||
|
||||
@@ -6,17 +6,18 @@ RSpec.describe VersionRecord, type: :model do
|
||||
|
||||
it 'makes TagVersion read only after create' do
|
||||
version = TagVersion.create!(
|
||||
tag: tag,
|
||||
version_no: 1,
|
||||
event_type: 'create',
|
||||
name: primary_tag_name_for(tag, 'ja').name,
|
||||
category: tag.category,
|
||||
aliases: '',
|
||||
names: { ja: { name: primary_tag_name_for(tag, 'ja').name,
|
||||
script_code: 'Jpan', auto_generated: false, aliases: [] } },
|
||||
parent_tag_ids: '',
|
||||
created_at: Time.current,
|
||||
created_by_user: nil)
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag: tag,
|
||||
version_no: 1,
|
||||
event_type: 'create',
|
||||
name: primary_tag_name_for(tag, 'ja').name,
|
||||
category: tag.category,
|
||||
aliases: '',
|
||||
names: { ja: { name: primary_tag_name_for(tag, 'ja').name,
|
||||
script_code: 'Jpan', auto_generated: false, aliases: [] } },
|
||||
parent_tag_ids: '',
|
||||
created_at: Time.current,
|
||||
created_by_user: nil)
|
||||
|
||||
expect {
|
||||
version.update!(name: 'changed')
|
||||
@@ -25,17 +26,18 @@ RSpec.describe VersionRecord, type: :model do
|
||||
|
||||
it 'prevents TagVersion destroy' do
|
||||
version = TagVersion.create!(
|
||||
tag: tag,
|
||||
version_no: 1,
|
||||
event_type: 'create',
|
||||
name: primary_tag_name_for(tag, 'ja').name,
|
||||
category: tag.category,
|
||||
aliases: '',
|
||||
names: { ja: { name: primary_tag_name_for(tag, 'ja').name,
|
||||
script_code: 'Jpan', auto_generated: false, aliases: [] } },
|
||||
parent_tag_ids: '',
|
||||
created_at: Time.current,
|
||||
created_by_user: nil)
|
||||
event_id: create_event!(event_type: 'unknown').id,
|
||||
tag: tag,
|
||||
version_no: 1,
|
||||
event_type: 'create',
|
||||
name: primary_tag_name_for(tag, 'ja').name,
|
||||
category: tag.category,
|
||||
aliases: '',
|
||||
names: { ja: { name: primary_tag_name_for(tag, 'ja').name,
|
||||
script_code: 'Jpan', auto_generated: false, aliases: [] } },
|
||||
parent_tag_ids: '',
|
||||
created_at: Time.current,
|
||||
created_by_user: nil)
|
||||
|
||||
expect {
|
||||
version.destroy!
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする