Files
openfoodnetwork/spec/services/sets/model_set_spec.rb
Gaetan Craig-Riou bc23423521 Remove the link between enterprise and internal payment method
Enterprise have access to the internal payment method by default.
The access is handled at the application level so we don't have to
manage database links.
2026-03-10 16:07:43 +11:00

85 lines
2.8 KiB
Ruby

# frozen_string_literal: true
RSpec.describe Sets::ModelSet do
describe "updating" do
it "creates new models" do
attrs = { collection_attributes: { '1' => { name: "Fantasia", iso_name: "FAN" },
'2' => { name: "Utopia", iso_name: "UTO" } } }
ms = Sets::ModelSet.new(Spree::Country,
Spree::Country.all,
attrs)
expect { ms.save }.to change { Spree::Country.count }.by(2)
expect(Spree::Country.where(name: ["Fantasia", "Utopia"]).count).to eq(2)
end
it "updates existing models" do
e1 = create(:enterprise_group)
e2 = create(:enterprise_group)
attrs = { collection_attributes: { '1' => { id: e1.id, name: 'e1zz', description: 'foo' },
'2' => { id: e2.id, name: 'e2yy', description: 'bar' } } }
ms = Sets::ModelSet.new(EnterpriseGroup, EnterpriseGroup.all, attrs)
expect { ms.save }.to change { EnterpriseGroup.count }.by(0)
expect(EnterpriseGroup.where(name: ['e1zz', 'e2yy']).count).to eq(2)
end
it "destroys deleted models" do
e1 = create(:enterprise)
e2 = create(:enterprise)
attributes = { collection_attributes: { '1' => { id: e1.id, name: 'deleteme' },
'2' => { id: e2.id, name: 'e2' } } }
ms = Sets::ModelSet.new(Enterprise, Enterprise.all, attributes, nil,
proc { |attrs| attrs['name'] == 'deleteme' })
expect { ms.save }.to change { Enterprise.count }.by(-1)
expect(Enterprise.where(id: e1.id)).to be_empty
expect(Enterprise.where(id: e2.id)).to be_present
end
it "ignores deletable new records" do
attributes = { collection_attributes: { '1' => { name: 'deleteme' } } }
ms = Sets::ModelSet.new(Enterprise, Enterprise.all, attributes, nil,
proc { |attrs| attrs[:name] == 'deleteme' })
expect { ms.save }.to change { Enterprise.count }.by(0)
end
describe "errors" do
let(:product_b) { create(:simple_product, name: "Bananas") }
let(:product_a) { create(:simple_product, name: "Apples") }
let(:collection_attributes) do
{
0 => {
id: product_a.id,
name: "", # Product Name can't be blank
},
1 => {
id: product_b.id,
name: "Bananes",
},
}
end
subject{ Sets::ModelSet.new(Spree::Product, [product_a, product_b], collection_attributes:) }
it 'errors are aggregated' do
subject.save
expect(subject.errors.full_messages).to eq ["Product Name can't be blank"]
expect(subject.invalid).to include product_a
expect(subject.invalid).not_to include product_b
end
end
end
end