impress/spec/models/pet_spec.rb
Emi Matchu 3a5f33fd56 Add tests that modeling a pet a second time doesn't affect its records
That is, if everything is the same as before, we don't need to change
anything in our database!

I also learned a bit more about RSpec syntax sugars, it's cute!
2024-10-24 15:04:25 -07:00

108 lines
4.1 KiB
Ruby

require 'rails_helper'
require_relative '../support/mocks/custom_pets'
require_relative '../support/matchers/a_record_matching'
RSpec.describe Pet, type: :model do
fixtures :colors, :species, :zones
context "#load" do
context "for thyassa, the Purple Chia" do
subject(:pet) { Pet.load "thyassa" }
it "is named thyassa" do
expect(pet.name).to eq("thyassa")
end
it "has no items" do
expect(pet.items).to be_empty
end
it "has a new Purple Chia pet type" do
expect(pet.pet_type.new_record?).to be true
expect(pet.pet_type.color).to eq Color.find_by_name!("purple")
expect(pet.pet_type.species).to eq Species.find_by_name!("chia")
expect(pet.pet_type.body_id).to eq 212
expect(pet.pet_type.image_hash).to eq "m:thyass"
end
it "has a new unlabeled Purple Chia pet state" do
expect(pet.pet_state.new_record?).to be true
expect(pet.pet_state.color).to eq Color.find_by_name!("purple")
expect(pet.pet_state.species).to eq Species.find_by_name!("chia")
expect(pet.pet_state.pose).to eq "UNKNOWN"
end
it "has new assets for the biology layers" do
pet.save! # TODO: I wish this were set up before saving.
expect(pet.pet_state.swf_assets).to contain_exactly(
a_record_matching(
type: "biology",
remote_id: 10083,
zone_id: 37,
url: "https://images.neopets.com/cp/bio/swf/000/000/010/10083_8a1111a13f.swf",
manifest_url: "https://images.neopets.com/cp/bio/data/000/000/010/10083_8a1111a13f/manifest.json",
zones_restrict: "0000000000000000000000000000000000000000000000000000",
),
a_record_matching(
type: "biology",
remote_id: 11613,
zone_id: 15,
url: "https://images.neopets.com/cp/bio/swf/000/000/011/11613_f7d8d377ab.swf",
manifest_url: "https://images.neopets.com/cp/bio/data/000/000/011/11613_f7d8d377ab/manifest.json",
zones_restrict: "0000000000000000000000000000000000000000000000000000",
),
a_record_matching(
type: "biology",
remote_id: 14187,
zone_id: 34,
url: "https://images.neopets.com/cp/bio/swf/000/000/014/14187_0e65c2082f.swf",
manifest_url: "https://images.neopets.com/cp/bio/data/000/000/014/14187_0e65c2082f/manifest.json",
zones_restrict: "0000000000000000000000000000000000000000000000000000",
),
a_record_matching(
type: "biology",
remote_id: 14189,
zone_id: 33,
url: "https://images.neopets.com/cp/bio/swf/000/000/014/14189_102e4991e9.swf",
manifest_url: "https://images.neopets.com/cp/bio/data/000/000/014/14189_102e4991e9/manifest.json",
zones_restrict: "0000000000000000000000000000000000000000000000000000",
)
)
end
it "saves the pet type when saved" do
expect { pet.save! }.to change { pet.pet_type.persisted? }.from(false).to(true)
end
it "saves the pet state when saved" do
expect { pet.save! }.to change { pet.pet_state.persisted? }.from(false).to(true)
end
context "when modeled a second time" do
before { pet.save! }
subject!(:new_pet) { Pet.load("thyassa") }
describe "its pet type" do
subject(:pet_type) { new_pet.pet_type }
it("already exists") { should be_persisted }
it("is the same as before") { should eq pet.pet_type }
it "is not changed when saving the pet" do
expect { new_pet.save! }.not_to change { pet_type.attributes }
end
end
describe "its pet state" do
subject(:pet_state) { new_pet.pet_state }
it("already exists") { should be_persisted }
it("is the same as before") { should eq pet.pet_state }
it "is not changed when saving the pet" do
expect { new_pet.save! }.not_to change { pet_state.attributes }
end
end
end
end
end
end