hensei-api/spec/models/collection_artifact_spec.rb
Justin Edmund 623661eb2c fix artifact test factories and specs
use unique granblue_ids, default to empty skills, fix element matching
2025-12-03 13:27:40 -08:00

204 lines
6.5 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
RSpec.describe CollectionArtifact, type: :model do
describe 'associations' do
it { is_expected.to belong_to(:user) }
it { is_expected.to belong_to(:artifact) }
end
describe 'validations' do
subject { build(:collection_artifact, skill1: {}, skill2: {}, skill3: {}, skill4: {}) }
it { is_expected.to validate_presence_of(:element) }
it 'validates presence of level' do
subject.level = nil
expect(subject).not_to be_valid
end
it 'validates level is between 1 and 5' do
artifact = build(:collection_artifact, skill1: {}, skill2: {}, skill3: {}, skill4: {})
artifact.level = 0
expect(artifact).not_to be_valid
artifact.level = 6
expect(artifact).not_to be_valid
artifact.level = 3
expect(artifact).to be_valid
end
end
describe 'enums' do
it 'defines element enum' do
expect(CollectionArtifact.elements).to include(
'wind' => 1,
'fire' => 2,
'water' => 3,
'earth' => 4,
'dark' => 5,
'light' => 6
)
end
it 'defines proficiency enum' do
expect(CollectionArtifact.proficiencies).to include(
'sabre' => 1,
'dagger' => 2
)
end
end
describe '#effective_proficiency' do
context 'for standard artifact' do
let(:artifact) { create(:artifact, proficiency: :dagger) }
it 'returns proficiency from base artifact' do
collection_artifact = build(:collection_artifact,
artifact: artifact,
proficiency: nil,
skill1: {}, skill2: {}, skill3: {}, skill4: {}
)
expect(collection_artifact.effective_proficiency).to eq('dagger')
end
end
context 'for quirk artifact' do
let(:artifact) { create(:artifact, :quirk) }
it 'returns proficiency from instance' do
collection_artifact = build(:collection_artifact,
artifact: artifact,
proficiency: :staff,
level: 1,
skill1: {}, skill2: {}, skill3: {}, skill4: {}
)
expect(collection_artifact.effective_proficiency).to eq('staff')
end
end
end
describe 'skill validations' do
before do
# Seed the required artifact skills for validation
ArtifactSkill.find_or_create_by!(skill_group: :group_i, modifier: 1) do |s|
s.name_en = 'ATK'
s.name_jp = '攻撃力'
s.base_values = [1320, 1440, 1560, 1680, 1800]
s.growth = 300.0
s.polarity = :positive
end
ArtifactSkill.find_or_create_by!(skill_group: :group_i, modifier: 2) do |s|
s.name_en = 'HP'
s.name_jp = 'HP'
s.base_values = [660, 720, 780, 840, 900]
s.growth = 150.0
s.polarity = :positive
end
ArtifactSkill.find_or_create_by!(skill_group: :group_ii, modifier: 1) do |s|
s.name_en = 'C.A. DMG'
s.name_jp = '奥義ダメ'
s.base_values = [13.2, 14.4, 15.6, 16.8, 18.0]
s.growth = 3.0
s.polarity = :positive
end
ArtifactSkill.find_or_create_by!(skill_group: :group_iii, modifier: 1) do |s|
s.name_en = 'Chain Burst DMG'
s.name_jp = 'チェインダメ'
s.base_values = [6, 7, 8, 9, 10]
s.growth = 2.5
s.polarity = :positive
end
ArtifactSkill.clear_cache!
end
it 'is valid with correct skills' do
artifact = create(:artifact)
collection_artifact = build(:collection_artifact,
artifact: artifact,
level: 1,
skill1: { 'modifier' => 1, 'strength' => 1800, 'level' => 1 },
skill2: { 'modifier' => 2, 'strength' => 900, 'level' => 1 },
skill3: { 'modifier' => 1, 'strength' => 18.0, 'level' => 1 },
skill4: { 'modifier' => 1, 'strength' => 10, 'level' => 1 }
)
expect(collection_artifact).to be_valid
end
it 'is invalid when skill1 and skill2 have the same modifier' do
artifact = create(:artifact)
collection_artifact = build(:collection_artifact,
artifact: artifact,
level: 1,
skill1: { 'modifier' => 1, 'strength' => 1800, 'level' => 1 },
skill2: { 'modifier' => 1, 'strength' => 1800, 'level' => 1 }, # Same modifier
skill3: { 'modifier' => 1, 'strength' => 18.0, 'level' => 1 },
skill4: { 'modifier' => 1, 'strength' => 10, 'level' => 1 }
)
expect(collection_artifact).not_to be_valid
expect(collection_artifact.errors[:base]).to include('Skill 1 and Skill 2 cannot have the same modifier')
end
it 'validates skill levels sum correctly' do
artifact = create(:artifact)
# At level 1, skill levels must sum to 4 (1 + 3)
collection_artifact = build(:collection_artifact,
artifact: artifact,
level: 1,
skill1: { 'modifier' => 1, 'strength' => 1800, 'level' => 2 },
skill2: { 'modifier' => 2, 'strength' => 900, 'level' => 2 },
skill3: { 'modifier' => 1, 'strength' => 18.0, 'level' => 2 },
skill4: { 'modifier' => 1, 'strength' => 10, 'level' => 2 }
)
expect(collection_artifact).not_to be_valid
expect(collection_artifact.errors[:base].first).to include('Skill levels must sum to')
end
end
describe 'quirk artifact constraints' do
let(:quirk_artifact) { create(:artifact, :quirk) }
it 'requires level 1 for quirk artifacts' do
collection_artifact = build(:collection_artifact,
artifact: quirk_artifact,
proficiency: :sabre,
level: 3,
skill1: {},
skill2: {},
skill3: {},
skill4: {}
)
expect(collection_artifact).not_to be_valid
expect(collection_artifact.errors[:level]).to include('must be 1 for quirk artifacts')
end
it 'requires empty skills for quirk artifacts' do
collection_artifact = build(:collection_artifact,
artifact: quirk_artifact,
proficiency: :sabre,
level: 1,
skill1: { 'modifier' => 1, 'strength' => 1800, 'level' => 1 },
skill2: {},
skill3: {},
skill4: {}
)
expect(collection_artifact).not_to be_valid
expect(collection_artifact.errors[:skill1]).to include('must be empty for quirk artifacts')
end
it 'is valid with empty skills and level 1' do
collection_artifact = build(:collection_artifact,
artifact: quirk_artifact,
proficiency: :sabre,
level: 1,
skill1: {},
skill2: {},
skill3: {},
skill4: {}
)
expect(collection_artifact).to be_valid
end
end
end