このコミットが含まれているのは:
@@ -0,0 +1,73 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe 'Shared Tag and ExternalTag IDs', type: :model do
|
||||
include TagGroupRecords
|
||||
|
||||
def create_resource resource
|
||||
if resource == :tag
|
||||
Tag.find_or_create_by_tag_name!(Locale.nipponese, 'shared_id_new', category: :general)
|
||||
else
|
||||
ExternalTag.create!(platform: :nico, name: 'shared_id_new')
|
||||
end
|
||||
end
|
||||
|
||||
[:tag, :external_tag].each do |resource|
|
||||
it "starts #{ resource } at 1 when both tables are empty" do
|
||||
expect(Tag.count).to eq(0)
|
||||
expect(ExternalTag.count).to eq(0)
|
||||
expect(create_resource(resource).id).to eq(1)
|
||||
end
|
||||
|
||||
it "allocates #{ resource } above the other table's maximum" do
|
||||
create(:tag, id: resource == :tag ? 1 : 20)
|
||||
create(:external_tag, id: resource == :external_tag ? 1 : 20)
|
||||
|
||||
expect(create_resource(resource).id).to eq(21)
|
||||
end
|
||||
|
||||
it "preserves legacy overlaps and gaps when creating #{ resource }" do
|
||||
[1, 2, 5].each { create(:tag, id: _1) }
|
||||
[1, 3, 8].each { create(:external_tag, id: _1) }
|
||||
tags = Tag.order(:id).map(&:attributes)
|
||||
external_tags = ExternalTag.order(:id).map(&:attributes)
|
||||
|
||||
record = create_resource(resource)
|
||||
|
||||
aggregate_failures do
|
||||
expect(record.id).to eq(9)
|
||||
expect(Tag.where(id: [1, 2, 5]).order(:id).map(&:attributes)).to eq(tags)
|
||||
expect(ExternalTag.where(id: [1, 3, 8]).order(:id).map(&:attributes)).to eq(external_tags)
|
||||
expect(Tag.exists?(id: 3)).to be(false)
|
||||
expect(ExternalTag.exists?(id: 2)).to be(false)
|
||||
end
|
||||
end
|
||||
|
||||
it "ignores the description and group ID space when creating #{ resource }" do
|
||||
tag = create(:tag, id: 1)
|
||||
create(:external_tag, id: 2)
|
||||
TagDescription.create!(id: 100, tag:, language_code: 'ja', body: '', version_no: 1)
|
||||
seed_group(name: 'separate_space', id: 200)
|
||||
|
||||
expect(create_resource(resource).id).to eq(3)
|
||||
end
|
||||
end
|
||||
|
||||
it 'preserves overlapping IDs during updates without rewriting the other resource' do
|
||||
tag = create(:tag, id: 5)
|
||||
external = create(:external_tag, id: 5)
|
||||
tag.update!(category: :meta)
|
||||
external.update!(name: 'updated_external')
|
||||
|
||||
expect(tag.reload.id).to eq(5)
|
||||
expect(external.reload.id).to eq(5)
|
||||
expect(tag.category).to eq('meta')
|
||||
expect(external.name).to eq('updated_external')
|
||||
expect(Tag.count).to eq(1)
|
||||
expect(ExternalTag.count).to eq(1)
|
||||
end
|
||||
|
||||
it 'allocates distinct IDs for successive creations across both tables' do
|
||||
records = [:tag, :external_tag].map { create_resource(_1) }
|
||||
expect(records.map(&:id)).to eq([1, 2])
|
||||
end
|
||||
end
|
||||
@@ -431,7 +431,7 @@ RSpec.describe 'Tag group native API', type: :request do
|
||||
|
||||
it 'assigns the next group ID from the existing maximum' do
|
||||
child_id
|
||||
expected_id = (TagGroup.maximum(:id) || 0) + 1
|
||||
expected_id = [TagGroup.maximum(:id).to_i, TagDescription.maximum(:id).to_i].max + 1
|
||||
native_write(:create)
|
||||
expect(response).to have_http_status(:created)
|
||||
expect(json.fetch('id')).to eq(expected_id)
|
||||
|
||||
@@ -25,11 +25,22 @@ RSpec.describe 'Tag resource ID allocation', type: :request do
|
||||
end
|
||||
|
||||
[:description, :group].each do |resource|
|
||||
it "ignores the other resource's larger maximum when allocating #{ resource }" do
|
||||
it "keeps #{ resource } independent of the Tag and ExternalTag ID space" do
|
||||
create(:tag, id: 100)
|
||||
create(:external_tag, id: 200)
|
||||
seed_description(1)
|
||||
seed_group(name: 'shared_space', id: 2)
|
||||
|
||||
create_resource(resource)
|
||||
|
||||
expect(json.fetch('id')).to eq(3)
|
||||
end
|
||||
|
||||
it "uses the other resource's larger maximum when allocating #{ resource }" do
|
||||
seed_description(resource == :description ? 1 : 20)
|
||||
seed_group(name: 'other_space', id: resource == :group ? 1 : 20)
|
||||
create_resource(resource)
|
||||
expect(json.fetch('id')).to eq(2)
|
||||
expect(json.fetch('id')).to eq(21)
|
||||
end
|
||||
|
||||
it "starts #{ resource } at 1 even after previous allocated rows were removed" do
|
||||
@@ -45,7 +56,7 @@ RSpec.describe 'Tag resource ID allocation', type: :request do
|
||||
expect(json.fetch('id')).to eq(1)
|
||||
end
|
||||
|
||||
it "allocates #{ resource } from its own maximum, preserving gaps and existing rows" do
|
||||
it "allocates #{ resource } above both maxima, preserving legacy overlaps and gaps" do
|
||||
[1, 2, 5].each { seed_description(_1) }
|
||||
[1, 3, 8].each { seed_group(name: "group_#{ _1 }", id: _1) }
|
||||
descriptions = TagDescription.order(:id).map(&:attributes)
|
||||
@@ -53,8 +64,7 @@ RSpec.describe 'Tag resource ID allocation', type: :request do
|
||||
|
||||
create_resource(resource)
|
||||
|
||||
expected_id = resource == :description ? 6 : 9
|
||||
expect(json.fetch('id')).to eq(expected_id)
|
||||
expect(json.fetch('id')).to eq(9)
|
||||
expect(TagDescription.where(id: [1, 2, 5]).order(:id).map(&:attributes)).to eq(descriptions)
|
||||
expect(TagGroup.where(id: [1, 3, 8]).order(:id).map(&:attributes)).to eq(groups)
|
||||
expect(TagDescription.exists?(id: 3)).to be(false)
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする