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