163 lines
5.1 KiB
Ruby
163 lines
5.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
describe AdPlugin::HouseAd do
|
|
let(:valid_attrs) { {
|
|
name: 'Find A Mechanic',
|
|
html: '<div class="house-ad find-a-mechanic"><a href="https://mechanics.example.com">Find A Mechanic!</a></div>'
|
|
} }
|
|
|
|
describe '#find' do
|
|
let!(:ad) { AdPlugin::HouseAd.create(valid_attrs) }
|
|
|
|
it "returns nil if no match" do
|
|
expect(AdPlugin::HouseAd.find(100)).to be_nil
|
|
end
|
|
|
|
it "can retrieve by id" do
|
|
r = AdPlugin::HouseAd.find(ad.id)
|
|
expect(r&.name).to eq(valid_attrs[:name])
|
|
expect(r&.html).to eq(valid_attrs[:html])
|
|
end
|
|
end
|
|
|
|
describe '#all' do
|
|
it "returns empty array if no records" do
|
|
expect(AdPlugin::HouseAd.all).to eq([])
|
|
end
|
|
|
|
it "returns an array of records" do
|
|
AdPlugin::HouseAd.create(valid_attrs)
|
|
AdPlugin::HouseAd.create(valid_attrs.merge(name: "Ad 2", html: "<div>Ad 2 Here</div>"))
|
|
all = AdPlugin::HouseAd.all
|
|
expect(all.size).to eq(2)
|
|
expect(all.map(&:name)).to contain_exactly("Ad 2", valid_attrs[:name])
|
|
expect(all.map(&:html)).to contain_exactly("<div>Ad 2 Here</div>", valid_attrs[:html])
|
|
end
|
|
end
|
|
|
|
describe "save" do
|
|
it "assigns an id and attrs for new record" do
|
|
ad = AdPlugin::HouseAd.from_hash(valid_attrs)
|
|
expect(ad.save).to eq(true)
|
|
expect(ad.name).to eq(valid_attrs[:name])
|
|
expect(ad.html).to eq(valid_attrs[:html])
|
|
expect(ad.id.to_i > 0).to eq(true)
|
|
ad2 = AdPlugin::HouseAd.from_hash(valid_attrs.merge(name: 'Find Another Mechanic'))
|
|
expect(ad2.save).to eq(true)
|
|
expect(ad2.id).to_not eq(ad.id)
|
|
end
|
|
|
|
it "updates existing record" do
|
|
ad = AdPlugin::HouseAd.create(valid_attrs)
|
|
id = ad.id
|
|
ad.name = 'Sell Your Car'
|
|
ad.html = '<div class="house-ad">Sell Your Car!</div>'
|
|
expect(ad.save).to eq(true)
|
|
ad = AdPlugin::HouseAd.find(id)
|
|
expect(ad.name).to eq('Sell Your Car')
|
|
expect(ad.html).to eq('<div class="house-ad">Sell Your Car!</div>')
|
|
expect(ad).to be_valid
|
|
end
|
|
|
|
describe "errors" do
|
|
it "blank name" do
|
|
ad = AdPlugin::HouseAd.from_hash(valid_attrs.merge(name: ''))
|
|
expect(ad.save).to eq(false)
|
|
expect(ad).to_not be_valid
|
|
expect(ad.errors.full_messages).to be_present
|
|
expect(ad.errors[:name]).to be_present
|
|
expect(ad.errors.count).to eq(1)
|
|
end
|
|
|
|
it "duplicate name" do
|
|
existing = AdPlugin::HouseAd.create(valid_attrs)
|
|
ad = AdPlugin::HouseAd.from_hash(valid_attrs)
|
|
expect(ad.save).to eq(false)
|
|
expect(ad).to_not be_valid
|
|
expect(ad.errors.full_messages).to be_present
|
|
expect(ad.errors[:name]).to be_present
|
|
expect(ad.errors.count).to eq(1)
|
|
end
|
|
|
|
it "duplicate name, different case" do
|
|
existing = AdPlugin::HouseAd.create(valid_attrs.merge(name: 'mechanic'))
|
|
ad = AdPlugin::HouseAd.create(valid_attrs.merge(name: 'Mechanic'))
|
|
expect(ad.save).to eq(false)
|
|
expect(ad).to_not be_valid
|
|
expect(ad.errors[:name]).to be_present
|
|
expect(ad.errors.count).to eq(1)
|
|
end
|
|
|
|
it "blank html" do
|
|
ad = AdPlugin::HouseAd.from_hash(valid_attrs.merge(html: ''))
|
|
expect(ad.save).to eq(false)
|
|
expect(ad).to_not be_valid
|
|
expect(ad.errors.full_messages).to be_present
|
|
expect(ad.errors[:html]).to be_present
|
|
expect(ad.errors.count).to eq(1)
|
|
end
|
|
|
|
it "invalid name" do
|
|
ad = AdPlugin::HouseAd.from_hash(valid_attrs.merge(name: '<script>'))
|
|
expect(ad.save).to eq(false)
|
|
expect(ad).to_not be_valid
|
|
expect(ad.errors[:name]).to be_present
|
|
expect(ad.errors.count).to eq(1)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'create' do
|
|
it "can create new records" do
|
|
ad = AdPlugin::HouseAd.create(valid_attrs)
|
|
expect(ad).to be_a(AdPlugin::HouseAd)
|
|
expect(ad.id).to be_present
|
|
expect(ad.name).to eq(valid_attrs[:name])
|
|
expect(ad.html).to eq(valid_attrs[:html])
|
|
end
|
|
|
|
it "validates attributes" do
|
|
ad = AdPlugin::HouseAd.create(name: '', html: '')
|
|
expect(ad).to be_a(AdPlugin::HouseAd)
|
|
expect(ad).to_not be_valid
|
|
expect(ad.errors.full_messages).to be_present
|
|
expect(ad.errors.count).to eq(2)
|
|
end
|
|
end
|
|
|
|
describe 'destroy' do
|
|
it "can delete a record" do
|
|
ad = AdPlugin::HouseAd.create(valid_attrs)
|
|
ad.destroy
|
|
expect(AdPlugin::HouseAd.find(ad.id)).to be_nil
|
|
end
|
|
end
|
|
|
|
describe 'update' do
|
|
let(:ad) { AdPlugin::HouseAd.create(valid_attrs) }
|
|
|
|
it "updates existing record" do
|
|
expect(
|
|
ad.update(
|
|
name: 'Mechanics 4 Hire',
|
|
html: '<a href="https://mechanics.example.com">Find A Mechanic!</a>'
|
|
)
|
|
).to eq(true)
|
|
after_save = AdPlugin::HouseAd.find(ad.id)
|
|
expect(after_save.name).to eq('Mechanics 4 Hire')
|
|
expect(after_save.html).to eq('<a href="https://mechanics.example.com">Find A Mechanic!</a>')
|
|
end
|
|
|
|
it "validates attributes" do
|
|
expect(
|
|
ad.update(name: '', html: '')
|
|
).to eq(false)
|
|
expect(ad).to_not be_valid
|
|
expect(ad.errors.full_messages).to be_present
|
|
expect(ad.errors.count).to eq(2)
|
|
end
|
|
end
|
|
end
|