Note we're excluding a few files: * Configuration files that weren't generated by us * Migration files that weren't generated by us * The Gemfile, since it includes an important comment that must be on the same line as the gem declaration * The Budget::Stats class, since the heading statistics are a mess and having shorter lines would require a lot of refactoring
282 lines
8.4 KiB
Ruby
282 lines
8.4 KiB
Ruby
require "rails_helper"
|
|
|
|
describe Verification::Residence do
|
|
let!(:geozone) { create(:geozone, census_code: "01") }
|
|
let(:residence) { build(:verification_residence, document_number: "12345678Z") }
|
|
|
|
describe "validations" do
|
|
it "is valid" do
|
|
expect(residence).to be_valid
|
|
end
|
|
|
|
describe "dates" do
|
|
it "is valid with a valid date of birth" do
|
|
residence = Verification::Residence.new("date_of_birth(3i)" => "1",
|
|
"date_of_birth(2i)" => "1",
|
|
"date_of_birth(1i)" => "1980")
|
|
|
|
expect(residence.errors[:date_of_birth]).to be_empty
|
|
end
|
|
|
|
it "is not valid without a date of birth" do
|
|
residence = Verification::Residence.new("date_of_birth(3i)" => "",
|
|
"date_of_birth(2i)" => "",
|
|
"date_of_birth(1i)" => "")
|
|
expect(residence).not_to be_valid
|
|
expect(residence.errors[:date_of_birth]).to include("can't be blank")
|
|
end
|
|
end
|
|
|
|
it "validates user has allowed age" do
|
|
residence = Verification::Residence.new("date_of_birth(3i)" => "1",
|
|
"date_of_birth(2i)" => "1",
|
|
"date_of_birth(1i)" => 5.years.ago.year.to_s)
|
|
expect(residence).not_to be_valid
|
|
expect(residence.errors[:date_of_birth]).to include("You don't have the required age to participate")
|
|
end
|
|
|
|
it "validates uniquness of document_number" do
|
|
user = create(:user)
|
|
residence.user = user
|
|
residence.save!
|
|
|
|
build(:verification_residence)
|
|
|
|
residence.valid?
|
|
expect(residence.errors[:document_number]).to include("has already been taken")
|
|
end
|
|
|
|
it "validates census terms" do
|
|
residence.terms_of_service = nil
|
|
expect(residence).not_to be_valid
|
|
end
|
|
|
|
describe "postal code" do
|
|
before do
|
|
Setting["postal_codes"] = "28001:28100,28200,28303-455"
|
|
|
|
census_data = double(valid?: true, district_code: "", gender: "")
|
|
allow(census_data).to receive(:postal_code) { residence.postal_code }
|
|
allow(census_data).to receive(:date_of_birth) { residence.date_of_birth }
|
|
allow(residence).to receive(:census_data).and_return(census_data)
|
|
end
|
|
|
|
it "is not valid when it's nil" do
|
|
residence.postal_code = nil
|
|
|
|
expect(residence).not_to be_valid
|
|
end
|
|
|
|
it "is valid with postal codes included in settings" do
|
|
residence.postal_code = "28012"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "28001"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "28100"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "28200"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "28303-455"
|
|
expect(residence).to be_valid
|
|
end
|
|
|
|
it "uses string ranges and not integer ranges" do
|
|
Setting["postal_codes"] = "0000-9999"
|
|
|
|
residence.postal_code = "02004"
|
|
|
|
expect(residence).not_to be_valid
|
|
end
|
|
|
|
it "accepts postal codes of any length" do
|
|
Setting["postal_codes"] = "AB1 3NE,815C,38000"
|
|
|
|
residence.postal_code = "AB1 3NE"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "815C"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "38000"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "815"
|
|
expect(residence).not_to be_valid
|
|
end
|
|
|
|
it "does not ignore spaces inside the postal code" do
|
|
Setting["postal_codes"] = "00001,000 05,00011"
|
|
|
|
residence.postal_code = "000 05"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "00005"
|
|
expect(residence).not_to be_valid
|
|
end
|
|
|
|
it "ignores trailing spaces in both the setting and the postal codes" do
|
|
Setting["postal_codes"] = " 00001,00002: 00005, 00011 "
|
|
|
|
residence.postal_code = " 00003 "
|
|
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "00011 "
|
|
|
|
expect(residence).to be_valid
|
|
end
|
|
|
|
it "allows regular expressions" do
|
|
Setting["postal_codes"] = "007,[A-Za-z]{2}-[0-9]{3},86"
|
|
|
|
residence.postal_code = "007"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "86"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "AB-123"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "zz-789"
|
|
expect(residence).to be_valid
|
|
|
|
residence.postal_code = "006"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "87"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "AB-12"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "AB-1234"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "A-123"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "ABC-123"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "ABC-12"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "AB-A12"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "12A-12"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "123-12"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "ABC-A1"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "AB-123\n123"
|
|
expect(residence).not_to be_valid
|
|
end
|
|
|
|
it "is not valid with postal codes not included in settings" do
|
|
residence.postal_code = "12345"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "28000"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "28303-454"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "28303"
|
|
expect(residence).not_to be_valid
|
|
|
|
residence.postal_code = "28101"
|
|
expect(residence).not_to be_valid
|
|
expect(residence.errors.count).to eq 1
|
|
expect(residence.errors[:postal_code]).to eq ["Citizens from this postal code cannot participate"]
|
|
end
|
|
|
|
it "allows any postal code when the setting is blank" do
|
|
Setting["postal_codes"] = nil
|
|
residence.postal_code = "randomthing"
|
|
|
|
expect(residence).to be_valid
|
|
|
|
Setting["postal_codes"] = ""
|
|
residence.postal_code = "ABC123"
|
|
|
|
expect(residence).to be_valid
|
|
|
|
Setting["postal_codes"] = " "
|
|
residence.postal_code = "555-5"
|
|
|
|
expect(residence).to be_valid
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "new" do
|
|
it "upcases document number" do
|
|
residence = Verification::Residence.new(document_number: "x1234567z")
|
|
expect(residence.document_number).to eq("X1234567Z")
|
|
end
|
|
|
|
it "removes all characters except numbers and letters" do
|
|
residence = Verification::Residence.new(document_number: " 12.345.678 - B")
|
|
expect(residence.document_number).to eq("12345678B")
|
|
end
|
|
end
|
|
|
|
describe "save" do
|
|
it "stores document number, document type, geozone, date of birth and gender" do
|
|
user = create(:user)
|
|
residence.user = user
|
|
residence.save!
|
|
|
|
user.reload
|
|
expect(user.document_number).to eq("12345678Z")
|
|
expect(user.document_type).to eq("1")
|
|
expect(user.date_of_birth.year).to eq(1980)
|
|
expect(user.date_of_birth.month).to eq(12)
|
|
expect(user.date_of_birth.day).to eq(31)
|
|
expect(user.gender).to eq("male")
|
|
expect(user.geozone).to eq(geozone)
|
|
end
|
|
end
|
|
|
|
describe "tries" do
|
|
it "increases tries after a call to the Census" do
|
|
residence.postal_code = "28011"
|
|
residence.valid?
|
|
expect(residence.user.lock.tries).to eq(1)
|
|
end
|
|
|
|
it "does not increase tries after a validation error" do
|
|
residence.postal_code = ""
|
|
residence.valid?
|
|
expect(residence.user.lock).to be nil
|
|
end
|
|
end
|
|
|
|
describe "Failed census call" do
|
|
it "stores failed census API calls" do
|
|
residence = build(:verification_residence, :invalid, document_number: "12345678Z")
|
|
residence.save
|
|
|
|
expect(FailedCensusCall.count).to eq(1)
|
|
expect(FailedCensusCall.first).to have_attributes(
|
|
user_id: residence.user.id,
|
|
document_number: "12345678Z",
|
|
document_type: "1",
|
|
date_of_birth: Date.new(1980, 12, 31),
|
|
postal_code: "28001"
|
|
)
|
|
end
|
|
end
|
|
end
|