spec/phone_spec.rb in russian_phone-0.3.3 vs spec/phone_spec.rb in russian_phone-0.3.4

- old
+ new

@@ -1,534 +1,534 @@ -# 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 '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 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: '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 - +# 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 '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 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: '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 \ No newline at end of file