Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'rspec'
- class Person
- require 'date'
- # NOTES: Because I couldn't find abbreviation list of US cities, I used states list instead
- STATES = {
- AK: "Alaska",
- AL: "Alabama",
- AR: "Arkansas",
- AS: "American Samoa",
- AZ: "Arizona",
- CA: "California",
- CO: "Colorado",
- CT: "Connecticut",
- DC: "District of Columbia",
- DE: "Delaware",
- FL: "Florida",
- GA: "Georgia",
- GU: "Guam",
- HI: "Hawaii",
- IA: "Iowa",
- ID: "Idaho",
- IL: "Illinois",
- IN: "Indiana",
- KS: "Kansas",
- KY: "Kentucky",
- LA: "Louisiana",
- MA: "Massachusetts",
- MD: "Maryland",
- ME: "Maine",
- MI: "Michigan",
- MN: "Minnesota",
- MO: "Missouri",
- MS: "Mississippi",
- MT: "Montana",
- NC: "North Carolina",
- ND: "North Dakota",
- NE: "Nebraska",
- NH: "New Hampshire",
- NJ: "New Jersey",
- NM: "New Mexico",
- NV: "Nevada",
- NY: "New York",
- OH: "Ohio",
- OK: "Oklahoma",
- OR: "Oregon",
- PA: "Pennsylvania",
- PR: "Puerto Rico",
- RI: "Rhode Island",
- SC: "South Carolina",
- SD: "South Dakota",
- TN: "Tennessee",
- TX: "Texas",
- UT: "Utah",
- VA: "Virginia",
- VI: "Virgin Islands",
- VT: "Vermont",
- WA: "Washington",
- WI: "Wisconsin",
- WV: "West Virginia",
- WY: "Wyoming"
- }
- attr_reader :first_name, :state_name, :birthday
- def initialize(first_name, state_name, birthday)
- if first_name.nil? || first_name.empty?
- @first_name = ''
- else
- @first_name = first_name.strip
- end
- if state_name.nil? || state_name.empty?
- @state_name = ''
- else
- @state_name = state_name.strip
- end
- if birthday.nil? || birthday.empty?
- @birthday = ''
- else
- @birthday = birthday.strip
- end
- end
- def valid?
- @state_name = find_state
- @birthday = format_birthday
- return !first_name.empty? && state_name && birthday
- end
- def format
- "#{first_name} #{state_name} #{birthday.strftime('%-m/%-d/%Y')}"
- end
- def find_state
- return if state_name.empty?
- if STATES.assoc(state_name.to_sym) # abbreviation
- STATES[state_name.to_sym]
- elsif STATES.key(state_name.to_s) # full state name
- state_name
- else
- nil
- end
- end
- def format_birthday
- return if birthday.empty?
- birthday.gsub!(/[-.\/]/, '/')
- begin
- Date.strptime(birthday, '%m/%d/%Y')
- rescue Exception => e
- return
- end
- end
- end
- class PeopleController
- def self.normalize(request_params)
- people = []
- return people if request_params.empty?
- request_params.each do |key, values|
- unless values.empty?
- values.each do |val|
- if key.to_s == 'comma'
- person_info = val.split(',')
- person = Person.new person_info[0], person_info[1], person_info[2]
- elsif key.to_s == 'dollar'
- person_info = val.split('$')
- person = Person.new person_info[3], person_info[0], person_info[1]
- end
- people.push person.format if person.valid?
- end
- end
- end
- people
- end
- end
- RSpec.describe PeopleController do
- describe "#normalize" do
- context 'when person first_name is missing' do
- it 'should not return a person' do
- test_case = {
- comma: [' , Alabama, 5/29/1986']
- }
- expect(PeopleController.normalize(test_case)).to be_empty
- end
- end
- context 'when person birthday is missing or invalid' do
- it 'should not return a person' do
- test_case = {
- dollar: ['NY $$Mckayla ']
- }
- expect(PeopleController.normalize(test_case)).to be_empty
- test_case = {
- comma: ['Mckayla,Alabama, 5/209/1986']
- }
- expect(PeopleController.normalize(test_case)).to be_empty
- end
- end
- context 'when person state is missing or invalid' do
- it 'should not return a person' do
- test_case = {
- dollar: ['$ 29-5-1986 $Mckayla']
- }
- expect(PeopleController.normalize(test_case)).to be_empty
- test_case = {
- comma: ['Mckayla ,Hanoi,5/29/1986']
- }
- expect(PeopleController.normalize(test_case)).to be_empty
- end
- end
- context 'when all person information correct' do
- it 'should return correct people information' do
- test_case = {
- comma: [ # Fields: first name, city name, birth date
- 'Mckayla, Alabama, 5/29/1986',
- 'Elliot, New York, 4/3/1947',
- ],
- dollar: [ # Fields: city abbreviation, birth date, last name, first name
- 'LA $ 10-4-1974 $ Nolan $ Rhiannon',
- 'NY $ 12-1-1962 $ Bruen $ Rigoberto',
- ],
- }
- expect(PeopleController.normalize(test_case)).to eq([
- 'Mckayla Alabama 5/29/1986',
- 'Elliot New York 4/3/1947',
- 'Rhiannon Louisiana 10/4/1974',
- 'Rigoberto New York 12/1/1962',
- ])
- end
- end
- end
- end
Add Comment
Please, Sign In to add comment