# coding: utf-8 require 'spec_helper' describe RussianPhone do describe 'clean' do it 'should remove everything except numbers from string' do RussianPhone::Number.clean('+7 (906) 111-11-11').should eq '79061111111' end end describe 'extract city' do it 'should extract city from number correctly' do RussianPhone::Number.extract('(906) 111-11-11', 7, 3).should eq ['906', '1111111'] RussianPhone::Number.extract('(906) 111-11-11', 6, 4).should eq ['9061', '111111'] RussianPhone::Number.extract('(906) 111-11-11', 5, 5).should eq ['90611', '11111'] end end describe '#full' do it "formats number" do RussianPhone::Number.new('906 111-11-11').full.should eq '+7 (906) 111-11-11' RussianPhone::Number.new('9061111111').full.should eq '+7 (906) 111-11-11' RussianPhone::Number.new('79061111111').full.should eq '+7 (906) 111-11-11' RussianPhone::Number.new('89061111111').full.should eq '+7 (906) 111-11-11' end end describe 'when parsing' do it 'should parse 8-800-111-11-11 number' do phone = RussianPhone::Number.new('8-800-111-11-11', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be true phone.city.should eq '800' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '8-800-111-11-11' end it 'should parse (906) 111-11-11 number' do phone = RussianPhone::Number.new('(906) 111-11-11', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be true phone.free?.should be false phone.city.should eq '906' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '+7 (906) 111-11-11' end it 'should parse 111-11-11 number with default city' do phone = RussianPhone::Number.new('111-11-11', default_country: 7, default_city: 495) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '495' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '+7 (495) 111-11-11' end it 'should not parse 111-11-11 number without default city' do phone = RussianPhone::Number.new('111-11-11', default_country: 7) phone.valid?.should be false end it 'should parse 1111111 number with default city' do phone = RussianPhone::Number.new('1111111', default_country: 7, default_city: 495) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '495' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '+7 (495) 111-11-11' end it 'should parse +7 (495) 111-11-11 number' do phone = RussianPhone::Number.new('+7 (495) 111-11-11') phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '495' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '+7 (495) 111-11-11' end it 'should parse +7 (495) 111-11-11 number' do phone = RussianPhone::Number.new('+7 (495) 111-11-11') phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '495' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '+7 (495) 111-11-11' end it 'should parse 8(4912)12-34-56 number' do phone = RussianPhone::Number.new('+7 (4912) 12-34-56', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '4912' phone.country.should eq '7' phone.subscriber.should eq '123456' phone.full.should eq '+7 (4912) 12-34-56' end it 'should parse 2-34-56 number whith default city' do phone = RussianPhone::Number.new('2-34-56', default_country: 7, default_city: 87252) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '87252' phone.country.should eq '7' phone.subscriber.should eq '23456' phone.full.should eq '+7 (87252) 2-34-56' end it 'should parse 12-34-56 number whith default city' do phone = RussianPhone::Number.new('12-34-56', default_country: 7, default_city: 4912) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '4912' phone.country.should eq '7' phone.subscriber.should eq '123456' phone.full.should eq '+7 (4912) 12-34-56' end it 'should parse 8(34356)5-67-89 number correctly' do # это номер в Екатеринбурге, с неправильно указанным кодом города phone = RussianPhone::Number.new('8(34356)5-67-89', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '343' phone.country.should eq '7' phone.subscriber.should eq '5656789' phone.full.should eq '+7 (343) 565-67-89' end it 'should parse 7 (906) 123-45-67 number correctly' do # это номер в Екатеринбурге, с неправильно указанным кодом города phone = RussianPhone::Number.new('7 (906) 123-45-67', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be true phone.free?.should be false phone.extra.should eq '' phone.city.should eq '906' phone.country.should eq '7' phone.subscriber.should eq '1234567' phone.full.should eq '+7 (906) 123-45-67' end it 'should handle phones with extra stuff [8 (906) 111-11-11 доб. 123]' do phone = RussianPhone::Number.new('8 (906) 111-11-11 доб. 123', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be true phone.free?.should be false phone.city.should eq '906' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '+7 (906) 111-11-11 доб. 123' end it 'should handle phones with extra stuff [8 (906) 111-11-11 д. 123]' do phone = RussianPhone::Number.new('8 (906) 111-11-11 д. 123', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be true phone.free?.should be false phone.city.should eq '906' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '+7 (906) 111-11-11 д. 123' end it 'should handle phones with extra stuff [89061010101 д. 123]' do phone = RussianPhone::Number.new('89061010101 д. 123', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be true phone.free?.should be false phone.city.should eq '906' phone.country.should eq '7' phone.subscriber.should eq '1010101' phone.full.should eq '+7 (906) 101-01-01 д. 123' end it 'should handle phones with extra stuff [89061010101-д. 123]' do phone = RussianPhone::Number.new('89061010101-д. 123', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be true phone.free?.should be false phone.city.should eq '906' phone.country.should eq '7' phone.subscriber.should eq '1010101' phone.full.should eq '+7 (906) 101-01-01 -д. 123' end it 'should handle phones with unknown codes [8 (533) 111-11-11]' do phone = RussianPhone::Number.new('8 (533) 111-11-11', default_country: 7) phone.should_not be_nil phone.valid?.should be true phone.cell?.should be false phone.free?.should be false phone.city.should eq '533' phone.country.should eq '7' phone.subscriber.should eq '1111111' phone.full.should eq '+7 (533) 111-11-11' end tests = { '+79261234567' => [7, 926, 1234567], '89261234567' => [7, 926, 1234567], '79261234567' => [7, 926, 1234567], '+7 926 123 45 67' => [7, 926, 1234567], '8(926)123-45-67' => [7, 926, 1234567], '8 (926) 12-3-45-67' => [7, 926, 1234567], '9261234567' => [7, 926, 1234567], '(495)1234567' => [7, 495, 1234567], '(495)123 45 67' => [7, 495, 1234567], '8-926-123-45-67' => [7, 926, 1234567], '8 927 1234 234' => [7, 927, 1234234], '8 927 12 12 234' => [7, 927, 1212234], '8 927 1 2 3 4 2 3 4' => [7, 927, 1234234], '8 927 12 34 234' => [7, 927, 1234234], '8 927 12 342 34' => [7, 927, 1234234], '8 927 123-4-234' => [7, 927, 1234234], '8 (927) 12 342 34' => [7, 927, 1234234], '8-(927)-12-342-34' => [7, 927, 1234234], '+7 927 1234 234' => [7, 927, 1234234], '+7 927 12 12 234' => [7, 927, 1212234], '+7 927 1 2 3 4 2 3 4' => [7, 927, 1234234], '+7 927 12 34 234' => [7, 927, 1234234], '+7 927 12 342 34' => [7, 927, 1234234], '+7 927 123-4-234' => [7, 927, 1234234], '+7 (927) 12 342 34' => [7, 927, 1234234], '+7-(927)-12-342-34' => [7, 927, 1234234], '7 927 1234 234' => [7, 927, 1234234], '7 927 12 12 234' => [7, 927, 1212234], '7 927 1 2 3 4 2 3 4' => [7, 927, 1234234], '7 927 12 34 234' => [7, 927, 1234234], '7 927 12 342 34' => [7, 927, 1234234], '7 927 123-4-234' => [7, 927, 1234234], '7 (927) 12 342 34' => [7, 927, 1234234], '7-(927)-12-342-34' => [7, 927, 1234234], '7 84543 123 12' => [7, 84543, 12312], '78454312312' => [7, 84543, 12312], '88454312312' => [7, 84543, 12312], } tests.each_pair do |str, result| it "should parse #{str}" do phone = RussianPhone::Number.new(str, default_country: 7) phone.should_not be_nil phone.valid?.should be true if %w(927 926).include? result[1].to_s phone.cell?.should be true else phone.cell?.should be false end phone.free?.should be false phone.country.should eq result[0].to_s phone.city.should eq result[1].to_s phone.subscriber.should eq result[2].to_s phone.clean.should eq "#{result[0]}#{result[1]}#{result[2]}" end end bad_phones = [ '123 123', '000000', '123', 'пыщ пыщ ололо я водитель НЛО', '11 1 11 1' ] bad_phones.each do |phone| it "should not parse #{phone}" do phone = RussianPhone::Number.new(phone, default_country: 7) phone.valid?.should be false end end end describe 'when using ::Field' do it 'should serialize and deserialize correctly' do RussianPhone::Number.new('8 (906) 111-11-11 д. 123').mongoize.should eq '+7 (906) 111-11-11 д. 123' RussianPhone::Number.new('495 111 11 11').mongoize.should eq '+7 (495) 111-11-11' RussianPhone::Number.demongoize('+7 (495) 111-11-11').mongoize.should eq '+7 (495) 111-11-11' RussianPhone::Field.mongoize(RussianPhone::Number.new('495 111 11 11')).should eq '+7 (495) 111-11-11' RussianPhone::Field.evolve(RussianPhone::Number.new('495 111 11 11')).should eq '+7 (495) 111-11-11' RussianPhone::Field.evolve(RussianPhone::Number.new('495 111 11 11 доб 123')).should eq '+7 (495) 111-11-11 доб 123' end end describe 'when storing with activerecord' do it 'should parse, store and retrieve numbers correctly' do u = ArUser.new(name: 'test', phone: '906 111 11 11') u.save.should be true u = ArUser.first u.phone.should eq '+7 (906) 111-11-11' u.phone.cell?.should be true u.phone.free?.should be false u.phone.clean.should eq '79061111111' u.phone.country.should eq '7' u.phone.city.should eq '906' u.phone.subscriber.should eq '1111111' end it 'should fail validation when validate is on and phone is invalid' do u = ArUser.new(validated_phone: '123') u.valid?.should be false u.save.should be false u.errors.messages.should eq({:validated_phone =>["Неверный телефонный номер"]}) end it 'should pass validation when validate is on and phone is valid' do u = ArUser.new(validated_phone: '495 121 11 11') u.valid?.should be true u.save.should be true ArUser.first.read_attribute(:validated_phone).should eq '+7 (495) 121-11-11' ArUser.first.validated_phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = ArUser.new(validated_phone: '7495 121 11 11') u.valid?.should be true u.save.should be true ArUser.first.read_attribute(:validated_phone).should eq '+7 (495) 121-11-11' ArUser.first.validated_phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = ArUser.new(validated_phone: '7 495 121 11 11') u.valid?.should be true u.save.should be true ArUser.first.read_attribute(:validated_phone).should eq '+7 (495) 121-11-11' ArUser.first.validated_phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = ArUser.new(validated_phone: '8495 121 11 11') u.valid?.should be true u.save.should be true ArUser.first.read_attribute(:validated_phone).should eq '+7 (495) 121-11-11' ArUser.first.validated_phone.should eq '+7 (495) 121-11-11' end end describe 'when storing with mongoid' do it 'should parse, store and retrieve numbers correctly' do u = User.new(name: 'test', phone: '906 111 11 11') u.save.should be true u = User.first u.phone.should eq '+7 (906) 111-11-11' u.phone.cell?.should be true u.phone.free?.should be false u.phone.clean.should eq '79061111111' u.phone.country.should eq '7' u.phone.city.should eq '906' u.phone.subscriber.should eq '1111111' end it 'should respect field options' do u = User.create(name: 'test', phone_in_495: '+7 (495) 111-11-11', phone_in_812: '222 2222') u.save.should be true u = User.first u.phone_in_495.class.name.should eq 'RussianPhone::Number' u.phone_in_495.should eq '+7 (495) 111-11-11' u.phone_in_495.cell?.should be false u.phone_in_495.free?.should be false u.phone_in_495.country.should eq '7' u.phone_in_495.city.should eq '495' u.phone_in_495.subscriber.should eq '1111111' u.phone_in_495.clean.should eq '74951111111' u.phone_in_495.full.should eq '+7 (495) 111-11-11' u.phone_in_812.class.name.should eq 'RussianPhone::Number' u.phone_in_812.should eq '+7 (812) 222-22-22' u.phone_in_812.cell?.should be false u.phone_in_812.free?.should be false u.phone_in_812.country.should eq '7' u.phone_in_812.city.should eq '812' u.phone_in_812.subscriber.should eq '2222222' u.phone_in_812.clean.should eq '78122222222' u.phone_in_812.full.should eq '+7 (812) 222-22-22' end it 'should fail validation when validate is on and phone is invalid' do u = UserWithValidation.new(phone: '123') u.valid?.should be false u.save.should be false u.errors.messages.should eq({:phone =>["Неверный телефонный номер"]}) end it 'should pass validation when validate is on and phone is valid' do u = UserWithValidation.new(phone: '495 121 11 11') u.valid?.should be true u.save.should be true UserWithValidation.first.read_attribute(:phone).should eq '+7 (495) 121-11-11' UserWithValidation.first.phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = UserWithValidation.new(phone: '7495 121 11 11') u.valid?.should be true u.save.should be true UserWithValidation.first.read_attribute(:phone).should eq '+7 (495) 121-11-11' UserWithValidation.first.phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = UserWithValidation.new(phone: '7 495 121 11 11') u.valid?.should be true u.save.should be true UserWithValidation.first.read_attribute(:phone).should eq '+7 (495) 121-11-11' UserWithValidation.first.phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = UserWithValidation.new(phone: '8495 121 11 11') u.valid?.should be true u.save.should be true UserWithValidation.first.read_attribute(:phone).should eq '+7 (495) 121-11-11' UserWithValidation.first.phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = UserWithValidation.new(phone: '7495123-12-12 доб 123') u.valid?.should be true u.save.should be true UserWithValidation.first.read_attribute(:phone).should eq '+7 (495) 123-12-12 доб 123' UserWithValidation.first.phone.should eq '+7 (495) 123-12-12 доб 123' end it 'should pass validation when phone is valid (unknown city code)' do u = UserWithAnyCode.new(phone: '7701123-12-12 доб 123') u.valid?.should be true u.save.should be true UserWithAnyCode.first.read_attribute(:phone).should eq '+7 (701) 123-12-12 доб 123' UserWithAnyCode.first.phone.should eq '+7 (701) 123-12-12 доб 123' end it 'should pass validation when validate is on and phone is valid (unknown city code)' do u = UserWithAnyCode.new(phone: '701123-12-12 доб 123') u.valid?.should be true u.save.should be true UserWithAnyCode.first.read_attribute(:phone).should eq '+7 (701) 123-12-12 доб 123' UserWithAnyCode.first.phone.should eq '+7 (701) 123-12-12 доб 123' end it 'should pass validation when validate is on and phone is valid' do u = UserWithValidation.new(phone: '8 495 121 11 11') u.valid?.should be true u.save.should be true UserWithValidation.first.read_attribute(:phone).should eq '+7 (495) 121-11-11' UserWithValidation.first.phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = UserWithValidation.new(phone: '+7 495 121 11 11') u.valid?.should be true u.save.should be true UserWithValidation.first.read_attribute(:phone).should eq '+7 (495) 121-11-11' UserWithValidation.first.phone.should eq '+7 (495) 121-11-11' end it 'should pass validation when validate is on and phone is valid' do u = UserWithValidation.new(phone: '495 121 11 11 доб 123') u.valid?.should be true u.save.should be true UserWithValidation.first.read_attribute(:phone).should eq '+7 (495) 121-11-11 доб 123' UserWithValidation.first.phone.should eq '+7 (495) 121-11-11 доб 123' end it 'should fail validation when validate is on and city is not in allowed_cities' do u = UserWithValidation.new(phone: '906 121 11 11') u.valid?.should be false u.save.should be false u.errors.messages.should eq({:phone =>["Неверный телефонный номер"]}) end it 'should pass validation when validate is off and phone is invalid' do u = UserWithoutValidation.new(phone: '123') u.valid?.should be true u.save.should be true end it 'should pass validation when validate is off and phone is valid' do u = UserWithoutValidation.new(phone: '495 121 11 11') u.valid?.should be true u.save.should be true end it 'should pass validation when validate is off and city is not in allowed_cities' do u = UserWithoutValidation.new(phone: '906 121 11 11') u.valid?.should be true u.save.should be true end it 'should pass validation when required but not validated' do u = UserWithRequired.new(phone: '906 121 11 11') u.valid?.should be true u.save.should be true end it 'should pass validation when required but not validated' do u = UserWithRequired.new(phone: '11 11') u.valid?.should be true u.save.should be true end it 'should fail validation when required and not present' do u = UserWithRequired.new() u.valid?.should be false u.save.should be false u = UserWithRequired.new(phone: '') u.valid?.should be false u.save.should be false end end end