Skip to content

Commit

Permalink
Split out CbvApplicant specs per agency
Browse files Browse the repository at this point in the history
Also simplify the validation logic by using Rails built-ins.
  • Loading branch information
tdooner committed Feb 14, 2025
1 parent 3123eb7 commit 45b16ba
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 154 deletions.
16 changes: 2 additions & 14 deletions app/app/models/cbv_applicant/ma.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,6 @@ class CbvApplicant::Ma < CbvApplicant

validates :agency_id_number, format: { with: MA_AGENCY_ID_REGEX, message: :invalid_format }
validates :beacon_id, format: { with: MA_BEACON_ID_REGEX, message: :invalid_format }
validate :ma_snap_application_date_not_more_than_1_year_ago
validate :ma_snap_application_date_not_in_future

def ma_snap_application_date_not_in_future
if snap_application_date.present? && snap_application_date > Date.current
errors.add(:snap_application_date, :ma_invalid_date)
end
end

def ma_snap_application_date_not_more_than_1_year_ago
if snap_application_date.present? && snap_application_date < 1.year.ago.to_date
errors.add(:snap_application_date, :ma_invalid_date)
end
end
validates :snap_application_date, presence: true,
inclusion: { in: Date.current.prev_year..Date.current, message: :ma_invalid_date }
end
16 changes: 2 additions & 14 deletions app/app/models/cbv_applicant/nyc.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,8 @@ class CbvApplicant::Nyc < CbvApplicant

validates :case_number, format: { with: NYC_CASE_NUMBER_REGEX, message: :invalid_format }
validates :client_id_number, format: { with: NYC_CLIENT_ID_REGEX, message: :invalid_format }
validate :nyc_snap_application_date_not_more_than_30_days_ago
validate :nyc_snap_application_date_not_in_future

def nyc_snap_application_date_not_in_future
if snap_application_date.present? && snap_application_date > Date.current
errors.add(:snap_application_date, :nyc_invalid_date)
end
end

def nyc_snap_application_date_not_more_than_30_days_ago
if snap_application_date.present? && snap_application_date < 30.day.ago.to_date
errors.add(:snap_application_date, :nyc_invalid_date)
end
end
validates :snap_application_date, presence: true,
inclusion: { in: (Date.current - 30.days)..Date.current, message: :nyc_invalid_date }

def format_case_number
return if case_number.blank?
Expand Down
45 changes: 45 additions & 0 deletions app/spec/models/cbv_applicant/ma_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
require 'rails_helper'

RSpec.describe CbvApplicant::Ma, type: :model do
let(:ma_attributes) { attributes_for(:cbv_applicant, :ma) }

context "user input is invalid" do
it "requires agency_id_number" do
applicant = CbvApplicant.new(ma_attributes.without(:agency_id_number))
expect(applicant).not_to be_valid
expect(applicant.errors[:agency_id_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/ma.attributes.agency_id_number.invalid_format'),
)
end

it "requires beacon_id" do
applicant = CbvApplicant.new(ma_attributes.without(:beacon_id))
expect(applicant).not_to be_valid
expect(applicant.errors[:beacon_id]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/ma.attributes.beacon_id.invalid_format')
)
end

it "requires beacon_id to have 6 alphanumeric characters" do
applicant = CbvApplicant.new(ma_attributes.merge(beacon_id: '12345'))
expect(applicant).not_to be_valid
expect(applicant.errors[:beacon_id]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/ma.attributes.beacon_id.invalid_format')
)
end

it "validates agency_id_number format" do
applicant = CbvApplicant.new(ma_attributes.merge(agency_id_number: 'invalid'))
expect(applicant).not_to be_valid
expect(applicant.errors[:agency_id_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/ma.attributes.agency_id_number.invalid_format')
)
end

it "does not require client_id_number" do
applicant = CbvApplicant.new(ma_attributes.merge(client_id_number: nil))
expect(applicant).to be_valid
expect(applicant.errors[:client_id_number]).to be_empty
end
end
end
83 changes: 83 additions & 0 deletions app/spec/models/cbv_applicant/nyc_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
require 'rails_helper'

RSpec.describe CbvApplicant::Nyc, type: :model do
let(:nyc_attributes) { attributes_for(:cbv_applicant, :nyc) }

context "user input is valid" do
it "formats a 9-character case number with leading zeros" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: '12345678A'))
expect(applicant).to be_valid
expect(applicant.case_number).to eq('00012345678A')
end

it "converts case number to uppercase" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: '12345678a'))
expect(applicant).to be_valid
expect(applicant.case_number).to eq('00012345678A')
end

it "validates snap_application_date is not older than 30 days" do
applicant = CbvApplicant.new(nyc_attributes.merge(snap_application_date: 31.days.ago))
expect(applicant).not_to be_valid
expect(applicant.errors[:snap_application_date]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.snap_application_date.nyc_invalid_date')
)
end
end

context "user input is invalid" do
it "requires case_number" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: nil))
expect(applicant).not_to be_valid
expect(applicant.errors[:case_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.case_number.invalid_format'),
)
end

it "validates invalid case_number format" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: 'invalid'))
expect(applicant).not_to be_valid
expect(applicant.errors[:case_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.case_number.invalid_format')
)
end

it "checks that a shorter case number is invalid" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: '123A'))
expect(applicant).not_to be_valid
expect(applicant.errors[:case_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.case_number.invalid_format')
)
end

it "validates an invalid 11 char string" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: '1234567890A'))
expect(applicant).not_to be_valid
expect(applicant.case_number).to eq('1234567890A')
end

it "validates client_id_number format when present" do
applicant = CbvApplicant.new(nyc_attributes.merge(client_id_number: 'invalid'))
expect(applicant).not_to be_valid
expect(applicant.errors[:client_id_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.client_id_number.invalid_format')
)
end

it "requires valid snap_application_date" do
applicant = CbvApplicant.new(nyc_attributes.merge(snap_application_date: "invalid"))
expect(applicant).not_to be_valid
expect(applicant.errors[:snap_application_date]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.snap_application_date.nyc_invalid_date')
)
end

it "requires client_id_number" do
applicant = CbvApplicant.new(nyc_attributes.merge(client_id_number: nil))
expect(applicant).not_to be_valid
expect(applicant.errors[:client_id_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.client_id_number.invalid_format')
)
end
end
end
126 changes: 0 additions & 126 deletions app/spec/models/cbv_applicant_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,131 +63,5 @@
)
end
end

context "when client_agency_id is 'nyc'" do
let(:nyc_attributes) { valid_attributes.merge(client_agency_id: 'nyc') }

context "user input is valid" do
it "formats a 9-character case number with leading zeros" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: '12345678A'))
expect(applicant).to be_valid
expect(applicant.case_number).to eq('00012345678A')
end

it "converts case number to uppercase" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: '12345678a'))
expect(applicant).to be_valid
expect(applicant.case_number).to eq('00012345678A')
end

it "validates snap_application_date is not older than 30 days" do
applicant = CbvApplicant.new(nyc_attributes.merge(snap_application_date: 31.days.ago))
expect(applicant).not_to be_valid
expect(applicant.errors[:snap_application_date]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.snap_application_date.nyc_invalid_date')
)
end
end

context "user input is invalid" do
it "requires case_number" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: nil))
expect(applicant).not_to be_valid
expect(applicant.errors[:case_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.case_number.invalid_format'),
)
end

it "validates invalid case_number format" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: 'invalid'))
expect(applicant).not_to be_valid
expect(applicant.errors[:case_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.case_number.invalid_format')
)
end

it "checks that a shorter case number is invalid" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: '123A'))
expect(applicant).not_to be_valid
expect(applicant.errors[:case_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.case_number.invalid_format')
)
end

it "validates an invalid 11 char string" do
applicant = CbvApplicant.new(nyc_attributes.merge(case_number: '1234567890A'))
expect(applicant).not_to be_valid
expect(applicant.case_number).to eq('1234567890A')
end

it "validates client_id_number format when present" do
applicant = CbvApplicant.new(nyc_attributes.merge(client_id_number: 'invalid'))
expect(applicant).not_to be_valid
expect(applicant.errors[:client_id_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.client_id_number.invalid_format')
)
end

it "requires valid snap_application_date" do
applicant = CbvApplicant.new(nyc_attributes.merge(snap_application_date: "invalid"))
expect(applicant).not_to be_valid
expect(applicant.errors[:snap_application_date]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.snap_application_date.nyc_invalid_date')
)
end

it "requires client_id_number" do
applicant = CbvApplicant.new(nyc_attributes.merge(client_id_number: nil))
expect(applicant).not_to be_valid
expect(applicant.errors[:client_id_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/nyc.attributes.client_id_number.invalid_format')
)
end
end
end

context "when client_agency_id is 'ma'" do
let(:ma_attributes) { valid_attributes.merge(client_agency_id: 'ma') }

context "user input is invalid" do
it "requires agency_id_number" do
applicant = CbvApplicant.new(ma_attributes)
expect(applicant).not_to be_valid
expect(applicant.errors[:agency_id_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/ma.attributes.agency_id_number.invalid_format'),
)
end

it "requires beacon_id" do
applicant = CbvApplicant.new(ma_attributes)
expect(applicant).not_to be_valid
expect(applicant.errors[:beacon_id]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/ma.attributes.beacon_id.invalid_format')
)
end

it "requires beacon_id to have 6 alphanumeric characters" do
applicant = CbvApplicant.new(ma_attributes.merge(beacon_id: '12345'))
expect(applicant).not_to be_valid
expect(applicant.errors[:beacon_id]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/ma.attributes.beacon_id.invalid_format')
)
end

it "validates agency_id_number format" do
applicant = CbvApplicant.new(ma_attributes.merge(agency_id_number: 'invalid'))
expect(applicant).not_to be_valid
expect(applicant.errors[:agency_id_number]).to include(
I18n.t('activerecord.errors.models.cbv_applicant/ma.attributes.agency_id_number.invalid_format')
)
end

it "does not require client_id_number" do
applicant = CbvApplicant.new(valid_attributes.merge(client_id_number: nil, client_agency_id: "ma"))
expect(applicant).not_to be_valid
expect(applicant.errors[:client_id_number]).to be_empty
end
end
end
end
end

0 comments on commit 45b16ba

Please sign in to comment.