Files
nairobi/spec/models/budget/heading_spec.rb
Javi Martín dadbf873ba Order translations using ruby
Joining the translations table caused duplicate records to appear.
Ordering with SQL is simply too hard because we need to consider
fallback locales.

Thanks Senén for providing most of the tests in the poll spec.
2019-06-03 18:35:59 +02:00

331 lines
9.7 KiB
Ruby

require "rails_helper"
describe Budget::Heading do
let(:budget) { create(:budget) }
let(:group) { create(:budget_group, budget: budget) }
it_behaves_like "sluggable", updatable_slug_trait: :drafting_budget
describe "OSM_DISTRICT_LEVEL_ZOOM constant" do
it "is defined" do
expect(Budget::Heading::OSM_DISTRICT_LEVEL_ZOOM).to be 12
end
end
describe "name" do
let(:heading) { create(:budget_heading, group: group) }
before do
heading.update(name_en: "object name")
end
it "can be repeatead in other budgets" do
new_budget = create(:budget)
new_group = create(:budget_group, budget: new_budget)
expect(build(:budget_heading, group: new_group, name_en: "object name")).to be_valid
end
it "must be unique among all budget's groups" do
new_group = create(:budget_group, budget: budget)
expect(build(:budget_heading, group: new_group, name_en: "object name")).not_to be_valid
end
it "must be unique among all it's group" do
expect(build(:budget_heading, group: group, name_en: "object name")).not_to be_valid
end
it "can be repeated for the same heading and a different locale" do
heading.update(name_fr: "object name")
expect(heading.translations.last).to be_valid
end
it "must not be repeated for a different heading in any locale" do
heading.update(name_en: "English", name_es: "Español")
expect(build(:budget_heading, group: group, name_en: "English")).not_to be_valid
expect(build(:budget_heading, group: group, name_en: "Español")).not_to be_valid
end
end
describe "Save population" do
it "Allows population == nil" do
expect(create(:budget_heading, group: group, name: "Population is nil", population: nil)).to be_valid
end
it "Doesn't allow population <= 0" do
heading = create(:budget_heading, group: group, name: "Population is > 0")
heading.population = 0
expect(heading).not_to be_valid
heading.population = -10
expect(heading).not_to be_valid
heading.population = 10
expect(heading).to be_valid
end
end
describe "save latitude" do
it "Doesn't allow latitude < -90" do
heading = create(:budget_heading, group: group, name: "Latitude is < -90")
heading.latitude = "-90.127491"
expect(heading).not_to be_valid
heading.latitude = "-91.723491"
expect(heading).not_to be_valid
heading.latitude = "-108.127412"
expect(heading).not_to be_valid
heading.latitude = "-1100.888491"
expect(heading).not_to be_valid
end
it "Doesn't allow latitude > 90" do
heading = create(:budget_heading, group: group, name: "Latitude is > 90")
heading.latitude = "90.127491"
expect(heading).not_to be_valid
heading.latitude = "97.723491"
expect(heading).not_to be_valid
heading.latitude = "119.127412"
expect(heading).not_to be_valid
heading.latitude = "1200.888491"
expect(heading).not_to be_valid
heading.latitude = "+128.888491"
expect(heading).not_to be_valid
heading.latitude = "+255.888491"
expect(heading).not_to be_valid
end
it "Doesn't allow latitude length > 22" do
heading = create(:budget_heading, group: group, name: "Latitude length is > 22")
heading.latitude = "10.12749112312418238128213"
expect(heading).not_to be_valid
heading.latitude = "7.7234941211121231231241"
expect(heading).not_to be_valid
heading.latitude = "9.1274124111241248688995"
expect(heading).not_to be_valid
heading.latitude = "+12.8884911231238684445311"
expect(heading).not_to be_valid
end
it "Allows latitude inside [-90,90] interval" do
heading = create(:budget_heading, group: group, name: "Latitude is inside [-90,90] interval")
heading.latitude = "90"
expect(heading).to be_valid
heading.latitude = "-90"
expect(heading).to be_valid
heading.latitude = "-90.000"
expect(heading).to be_valid
heading.latitude = "-90.00000"
expect(heading).to be_valid
heading.latitude = "90.000"
expect(heading).to be_valid
heading.latitude = "90.00000"
expect(heading).to be_valid
heading.latitude = "-80.123451"
expect(heading).to be_valid
heading.latitude = "+65.888491"
expect(heading).to be_valid
heading.latitude = "80.144812"
expect(heading).to be_valid
heading.latitude = "17.417412"
expect(heading).to be_valid
heading.latitude = "-21.000054"
expect(heading).to be_valid
heading.latitude = "+80.888491"
expect(heading).to be_valid
end
end
describe "save longitude" do
it "Doesn't allow longitude < -180" do
heading = create(:budget_heading, group: group, name: "Longitude is < -180")
heading.longitude = "-180.127491"
expect(heading).not_to be_valid
heading.longitude = "-181.723491"
expect(heading).not_to be_valid
heading.longitude = "-188.127412"
expect(heading).not_to be_valid
heading.longitude = "-1100.888491"
expect(heading).not_to be_valid
end
it "Doesn't allow longitude > 180" do
heading = create(:budget_heading, group: group, name: "Longitude is > 180")
heading.longitude = "190.127491"
expect(heading).not_to be_valid
heading.longitude = "197.723491"
expect(heading).not_to be_valid
heading.longitude = "+207.723491"
expect(heading).not_to be_valid
heading.longitude = "300.723491"
expect(heading).not_to be_valid
heading.longitude = "189.127412"
expect(heading).not_to be_valid
heading.longitude = "1200.888491"
expect(heading).not_to be_valid
end
it "Doesn't allow longitude length > 23" do
heading = create(:budget_heading, group: group, name: "Longitude length is > 23")
heading.longitude = "50.1274911123124112312418238128213"
expect(heading).not_to be_valid
heading.longitude = "53.73412349178811231241"
expect(heading).not_to be_valid
heading.longitude = "+20.1274124124124123121435"
expect(heading).not_to be_valid
heading.longitude = "10.88849112312312311232123311"
expect(heading).not_to be_valid
end
it "Allows longitude inside [-180,180] interval" do
heading = create(:budget_heading, group: group,
name: "Longitude is inside [-180,180] interval")
heading.longitude = "180"
expect(heading).to be_valid
heading.longitude = "-180"
expect(heading).to be_valid
heading.longitude = "-180.000"
expect(heading).to be_valid
heading.longitude = "-180.00000"
expect(heading).to be_valid
heading.longitude = "180.000"
expect(heading).to be_valid
heading.longitude = "180.00000"
expect(heading).to be_valid
heading.longitude = "+75.00000"
expect(heading).to be_valid
heading.longitude = "+15.023321"
expect(heading).to be_valid
heading.longitude = "-80.123451"
expect(heading).to be_valid
heading.longitude = "80.144812"
expect(heading).to be_valid
heading.longitude = "17.417412"
expect(heading).to be_valid
heading.longitude = "-21.000054"
expect(heading).to be_valid
end
end
describe "heading" do
it "can be deleted if no budget's investments associated" do
heading1 = create(:budget_heading, group: group, name: "name")
heading2 = create(:budget_heading, group: group, name: "name 2")
create(:budget_investment, heading: heading1)
expect(heading1.can_be_deleted?).to eq false
expect(heading2.can_be_deleted?).to eq true
end
end
describe ".sort_by_name" do
it "returns headings sorted by DESC group name first and then ASC heading name" do
last_group = create(:budget_group, name: "Group A")
first_group = create(:budget_group, name: "Group B")
heading4 = create(:budget_heading, group: last_group, name: "Name B")
heading3 = create(:budget_heading, group: last_group, name: "Name A")
heading2 = create(:budget_heading, group: first_group, name: "Name D")
heading1 = create(:budget_heading, group: first_group, name: "Name C")
sorted_headings = [heading1, heading2, heading3, heading4]
expect(Budget::Heading.sort_by_name).to eq sorted_headings
end
it "only sort headings using the group name (DESC) in the current locale" do
last_group = create(:budget_group, name_en: "CCC", name_es: "BBB")
first_group = create(:budget_group, name_en: "DDD", name_es: "AAA")
last_heading = create(:budget_heading, group: last_group, name: "Name")
first_heading = create(:budget_heading, group: first_group, name: "Name")
expect(Budget::Heading.sort_by_name.size).to be 2
expect(Budget::Heading.sort_by_name.first).to eq first_heading
expect(Budget::Heading.sort_by_name.last).to eq last_heading
end
end
describe "scope allow_custom_content" do
it "returns headings with allow_custom_content order by name" do
excluded_heading = create(:budget_heading, name: "Name A")
last_heading = create(:budget_heading, allow_custom_content: true, name: "Name C")
first_heading = create(:budget_heading, allow_custom_content: true, name: "Name B")
expect(Budget::Heading.allow_custom_content.count).to be 2
expect(Budget::Heading.allow_custom_content.first).to eq first_heading
expect(Budget::Heading.allow_custom_content.last).to eq last_heading
end
it "returns headings with multiple translations only once" do
create(:budget_heading, allow_custom_content: true, name_en: "English", name_es: "Spanish")
expect(Budget::Heading.allow_custom_content.count).to eq 1
end
end
end