forgery 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +13 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +27 -0
  6. data/LICENSE +1 -1
  7. data/README.markdown +9 -5
  8. data/Rakefile +9 -1
  9. data/forgery.gemspec +23 -0
  10. data/lib/forgery/dictionaries/company_names +0 -1
  11. data/lib/forgery/dictionaries/currency_descriptions +2 -2
  12. data/lib/forgery/file_reader.rb +1 -0
  13. data/lib/forgery/forgery/geo.rb +54 -0
  14. data/lib/forgery/forgery/internet.rb +7 -0
  15. data/lib/forgery/forgery/russian_tax.rb +57 -0
  16. data/lib/forgery/version.rb +1 -1
  17. data/spec/data/dictionaries/code_names +6 -0
  18. data/spec/data/dictionaries/female_first_names +1 -0
  19. data/spec/data/documents/mock_web_page.html +17 -0
  20. data/spec/data/documents/mock_xml_doc.xml +5 -0
  21. data/spec/dictionaries_spec.rb +35 -0
  22. data/spec/extensions/array_spec.rb +25 -0
  23. data/spec/extensions/range_spec.rb +31 -0
  24. data/spec/extensions/string_spec.rb +29 -0
  25. data/spec/file_reader_spec.rb +32 -0
  26. data/spec/forgery/address_spec.rb +84 -0
  27. data/spec/forgery/basic_spec.rb +179 -0
  28. data/spec/forgery/credit_card_spec.rb +68 -0
  29. data/spec/forgery/currency_spec.rb +15 -0
  30. data/spec/forgery/date_spec.rb +134 -0
  31. data/spec/forgery/internet_spec.rb +62 -0
  32. data/spec/forgery/lorem_ipsum_spec.rb +132 -0
  33. data/spec/forgery/monetary_spec.rb +14 -0
  34. data/spec/forgery/name_spec.rb +11 -0
  35. data/spec/forgery/personal_spec.rb +15 -0
  36. data/spec/forgery/russian_tax_spec.rb +81 -0
  37. data/spec/forgery/time_spec.rb +7 -0
  38. data/spec/forgery_spec.rb +63 -0
  39. data/spec/formats_spec.rb +35 -0
  40. data/spec/spec_helper.rb +39 -0
  41. metadata +101 -64
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Internet do
4
+ describe ".user_name" do
5
+ it "should return a username that is lowercase" do
6
+ Forgery::Internet.user_name.should only_contain(Forgery::Basic::LOWER_ALPHA)
7
+ end
8
+ end
9
+
10
+ it "should return a top level domain" do
11
+ Forgery.dictionaries[:top_level_domains].should include(Forgery::Internet.top_level_domain)
12
+ end
13
+
14
+ describe ".domain_name" do
15
+ it "should return a domain name that contains a lowercase company name" do
16
+ downcase_company_name = Forgery::Internet.domain_name.split('.').first
17
+ Forgery.dictionaries[:company_names].any?{ |cn| cn =~ /#{downcase_company_name}/i }
18
+ end
19
+
20
+ it "should return a domain name that contains a top level domain" do
21
+ Forgery.dictionaries[:top_level_domains].should include(Forgery::Internet.domain_name.split('.').last)
22
+ end
23
+ end
24
+
25
+ describe ".email_address" do
26
+ it "should match the email format" do
27
+ Forgery::Internet.email_address.should match(/.+@.+\.(#{Forgery.dictionaries[:top_level_domains].join("|")})/)
28
+ end
29
+ end
30
+
31
+ describe ".cctld" do
32
+ it "should return a country-code top level domain" do
33
+ Forgery.dictionaries[:country_code_top_level_domains].should include(Forgery::Internet.cctld)
34
+ end
35
+
36
+ it "should return the cctld in correct two-letter format" do
37
+ Forgery::Internet.cctld.should =~ /\A[a-z]{2}\Z/
38
+ end
39
+ end
40
+
41
+ describe '.ip_v4' do
42
+ it 'should be 4 integers between 0 and 255 seprated by "."' do
43
+ val = Forgery::Internet.ip_v4
44
+ nums = val.split('.')
45
+ nums.should have(4).items
46
+ nums.each do |num|
47
+ num.should =~ /\d{1,3}/
48
+ num.to_i.should <= 255
49
+ num.to_i.should >= 0
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '.ip_v6' do
55
+ it 'should be a valid ipv6 address' do
56
+ val = Forgery::Internet.ip_v6
57
+ address = IPAddr.new(val)
58
+ address.ipv6?.should eq(true)
59
+ end
60
+ end
61
+
62
+ end
@@ -0,0 +1,132 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::LoremIpsum do
4
+ describe ".paragraphs" do
5
+ it "should return text" do
6
+ Forgery::LoremIpsum.paragraphs.should be_a_kind_of(String)
7
+ end
8
+
9
+ it "should return text with 1 or more character" do
10
+ Forgery::LoremIpsum.paragraphs.size.should >= 1
11
+ end
12
+
13
+ it "should default to returning 2 paragraphs separated by \\n\\n" do
14
+ Forgery::LoremIpsum.paragraphs.split("\n\n").size.should == 2
15
+ end
16
+
17
+ it "should default to returning 3 sentences per paragraph" do
18
+ paragraphs = Forgery::LoremIpsum.paragraphs.split("\n\n")
19
+ paragraphs.each do |paragraph|
20
+ paragraph.scan(".").size.should == 3
21
+ end
22
+ end
23
+
24
+ it "should wrap paragraphs in html paragraph tags when the :html option is true" do
25
+ paragraphs = Forgery::LoremIpsum.paragraphs(2, :html => true).split("\n\n")
26
+ paragraphs.each do |paragraph|
27
+ paragraph.should match(/<p>.+?<\/p>/)
28
+ end
29
+ end
30
+
31
+ it "should wrap paragraphs in specified wrapping text" do
32
+ paragraphs = Forgery::LoremIpsum.paragraphs(2, :wrap => {:start => "foo", :end => "bar"}).split("\n\n")
33
+ paragraphs.each do |paragraph|
34
+ paragraph.should match(/foo.+bar/)
35
+ end
36
+ end
37
+
38
+ it "should separate paragraphs with the specified string" do
39
+ Forgery::LoremIpsum.paragraphs(2, :separator => "foo").split("foo").size.should == 2
40
+ end
41
+ end
42
+
43
+ describe ".paragraph" do
44
+ it "should return text" do
45
+ Forgery::LoremIpsum.paragraph.should be_a_kind_of(String)
46
+ end
47
+
48
+ it "should return text with 1 or more character" do
49
+ Forgery::LoremIpsum.paragraph.size.should >= 1
50
+ end
51
+
52
+ it "should return a single paragraph" do
53
+ Forgery::LoremIpsum.paragraph.scan("\n\n").size.should == 0
54
+ end
55
+ end
56
+
57
+ describe ".sentences" do
58
+ it "should return text" do
59
+ Forgery::LoremIpsum.sentences.should be_a_kind_of(String)
60
+ end
61
+
62
+ it "should return text with 1 or more character" do
63
+ Forgery::LoremIpsum.sentences.size.should >= 1
64
+ end
65
+
66
+ it "should return two sentences by default" do
67
+ Forgery::LoremIpsum.sentences.scan(".").size.should == 2
68
+ end
69
+
70
+ it "should return as many sentences as you specify" do
71
+ Forgery::LoremIpsum.sentences(4).scan(".").size.should == 4
72
+ end
73
+ end
74
+
75
+ describe ".sentence" do
76
+ it "should return text" do
77
+ Forgery::LoremIpsum.sentence.should be_a_kind_of(String)
78
+ end
79
+
80
+ it "should return text with 1 or more character" do
81
+ Forgery::LoremIpsum.sentence.size.should >= 1
82
+ end
83
+
84
+ it "should return a single sentence" do
85
+ Forgery::LoremIpsum.sentence.scan(".").size.should == 1
86
+ end
87
+ end
88
+
89
+ describe ".words" do
90
+ it "should return text" do
91
+ Forgery::LoremIpsum.words.should be_a_kind_of(String)
92
+ end
93
+
94
+ it "should return text with 1 or more character" do
95
+ Forgery::LoremIpsum.words.size.should >= 1
96
+ end
97
+
98
+ it "should return a random set of words" do
99
+ Forgery::LoremIpsum.words(2, :random => true)
100
+ end
101
+ end
102
+
103
+ describe ".word" do
104
+ it "should return text" do
105
+ Forgery::LoremIpsum.word.should be_a_kind_of(String)
106
+ end
107
+
108
+ it "should return text with 1 or more character" do
109
+ Forgery::LoremIpsum.word.size.should >= 1
110
+ end
111
+ end
112
+
113
+ describe ".characters" do
114
+ it "should return text" do
115
+ Forgery::LoremIpsum.characters.should be_a_kind_of(String)
116
+ end
117
+
118
+ it "should return text with 1 or more character" do
119
+ Forgery::LoremIpsum.characters.size.should >= 1
120
+ end
121
+ end
122
+
123
+ describe ".character" do
124
+ it "should return text" do
125
+ Forgery::LoremIpsum.character.should be_a_kind_of(String)
126
+ end
127
+
128
+ it "should return text with 1 or more character" do
129
+ Forgery::LoremIpsum.character.size.should >= 1
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+ require 'bigdecimal'
3
+
4
+ describe Forgery::Monetary do
5
+
6
+ it "should return random number string" do
7
+ Forgery(:monetary).money.should match(/^[\d+\.]+$/)
8
+ end
9
+
10
+ it "should return random number respecting min and max parameters" do
11
+ BigDecimal.new(Forgery(:monetary).money({:min => 10, :max => 20})).should be_between(10, 20)
12
+ end
13
+
14
+ end
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Name do
4
+ it "should return a random first name" do
5
+ (Forgery.dictionaries[:male_first_names] + Forgery.dictionaries[:female_first_names]).should include(Forgery::Name.first_name)
6
+ end
7
+
8
+ it "should return a random last name" do
9
+ Forgery.dictionaries[:last_names].should include(Forgery::Name.last_name)
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Personal do
4
+ describe '.gender' do
5
+ it 'should return male or female' do
6
+ Forgery.dictionaries[:genders].should include(Forgery::Personal.gender)
7
+ end
8
+ end
9
+
10
+ describe '.shirt_size' do
11
+ it 'should return a sane size' do
12
+ Forgery.dictionaries[:shirt_sizes].should include(Forgery::Personal.shirt_size)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::RussianTax do
4
+
5
+ it 'bik should be 9 symbols' do
6
+ Forgery::RussianTax.bik.length.should eq 9
7
+ end
8
+
9
+ it "bik should start with 04" do
10
+ Forgery::RussianTax.bik[0,2].should eq '04'
11
+ end
12
+
13
+ it "bik should have valid last part" do
14
+ Forgery::RussianTax.bik[6,8].to_i.should be > 50
15
+ end
16
+
17
+ it 'bik should be 20 symbols' do
18
+ Forgery::RussianTax.account_number.length.should eq 20
19
+ end
20
+
21
+ context 'legal inn' do
22
+ let(:inn) { Forgery::RussianTax.inn({ :type =>:legal }) }
23
+
24
+ it 'legal inn should be 10 symbols' do
25
+ inn.length.should eq 10
26
+ end
27
+
28
+ it 'leagl inn crc' do
29
+ mask = [2, 4, 10, 3, 5, 9, 4, 6, 8]
30
+ ((0..(inn.length-2)).inject(0) {|crc, i| crc + inn[i].to_i*mask[i].to_i} % 11 % 10).should eq inn[9].chr.to_i
31
+ end
32
+
33
+ end
34
+
35
+ context 'person inn' do
36
+ let(:inn) { Forgery::RussianTax.inn({ :type => :person }) }
37
+
38
+ it 'person inn should be 12 symbols' do
39
+ inn.length.should eq 12
40
+ end
41
+
42
+ it 'person inn crc 10' do
43
+ mask = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
44
+ ((0..(inn.length-3)).inject(0) {|crc, i| crc + inn[i].to_i*mask[i].to_i} % 11 % 10).should eq inn[10].chr.to_i
45
+ end
46
+
47
+ it 'person inn crc 11' do
48
+ mask = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
49
+ ((0..(inn.length-2)).inject(0) {|crc, i| crc + inn[i].to_i*mask[i].to_i} % 11 % 10).should eq inn[11].chr.to_i
50
+ end
51
+
52
+ end
53
+
54
+ context 'legal ogrn' do
55
+ let(:ogrn) { Forgery::RussianTax.ogrn({ :type => :legal }) }
56
+
57
+ it 'legal ogrn should be 13 symbols' do
58
+ ogrn.length.should eq 13
59
+ end
60
+
61
+ it 'legal ogrn should have valid crc' do
62
+ (ogrn[0..-2].to_i%11%10).should eq ogrn[-1].chr.to_i
63
+ end
64
+ end
65
+
66
+ context 'person ogrn' do
67
+ let(:ogrn) { Forgery::RussianTax.ogrn({ :type => :person }) }
68
+
69
+ it 'person ogrn should be 15 symbols' do
70
+ ogrn.length.should eq 15
71
+ end
72
+
73
+ it 'person ogrn should have valid crc' do
74
+ (ogrn[0..-2].to_i%13%10).should eq ogrn[-1].chr.to_i
75
+ end
76
+ end
77
+
78
+
79
+
80
+
81
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Time do
4
+ it "should return a random timezone" do
5
+ Forgery.dictionaries[:zones].should include(Forgery::Time.zone)
6
+ end
7
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+ require 'pathname'
3
+
4
+ describe Forgery do
5
+ it "should load a dictionary when it is requested" do
6
+ Forgery.dictionaries.reset!
7
+
8
+ Forgery.dictionaries.should_not be_loaded(:colors)
9
+
10
+ Forgery.dictionaries[:colors]
11
+
12
+ Forgery.dictionaries.should be_loaded(:colors)
13
+ end
14
+
15
+ it "should load formats when it is requested" do
16
+ Forgery.formats.reset!
17
+
18
+ Forgery.formats.should_not be_loaded(:phone)
19
+
20
+ Forgery.formats[:phone]
21
+
22
+ Forgery.formats.should be_loaded(:phone)
23
+ end
24
+
25
+ it "should accept a symbol and return the appropriate forgery class" do
26
+ Forgery(:address).should == Forgery::Address
27
+ Forgery(:basic).should == Forgery::Basic
28
+ Forgery(:internet).should == Forgery::Internet
29
+ end
30
+
31
+ it "should accept two symbols, finding the right class and calling the appropriate method" do
32
+ Forgery::Address.should_receive(:street_name)
33
+ Forgery(:address, :street_name)
34
+
35
+ Forgery::Name.should_receive(:full_name)
36
+ Forgery(:name, :full_name)
37
+ end
38
+
39
+ it "should accept two symbols and arguments, passing them along to the appropriate method" do
40
+ Forgery::LoremIpsum.should_receive(:text).with(:sentences, 2)
41
+ Forgery(:lorem_ipsum, :text, :sentences, 2)
42
+ end
43
+
44
+ it "should return the rails root path as a string if Rails.root is defined" do
45
+ Rails = Object.new
46
+ Rails.stub!(:root).and_return(Pathname.new('/path/from/rails/dot/root'))
47
+ Forgery.rails_root.should == '/path/from/rails/dot/root'
48
+ Object.instance_eval { remove_const(:Rails) }
49
+ end
50
+
51
+ it "should return nil when Rails.root and Rails.root are not defined" do
52
+ Forgery.rails_root.should be_nil
53
+ end
54
+
55
+ it "should not be a rails environment when there is not a rails_root" do
56
+ Forgery.rails?.should be_false
57
+ end
58
+
59
+ it "should be a rails environment when there is a rails_root" do
60
+ Forgery.stub!(:rails?).and_return(true)
61
+ Forgery.rails?.should be_true
62
+ end
63
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Formats do
4
+ it "should check if the dictionary is loaded" do
5
+ formats = Forgery::Formats.new
6
+
7
+ formats[:phone]
8
+
9
+ formats.should be_loaded(:phone)
10
+ end
11
+
12
+ it "should load a dictionary when called by the key" do
13
+ formats = Forgery::Formats.new
14
+
15
+ formats.reset!
16
+
17
+ formats.should_not be_loaded(:phone)
18
+
19
+ formats[:phone]
20
+
21
+ formats.should be_loaded(:phone)
22
+ end
23
+
24
+ it "should clear the loaded formats when calling reset!" do
25
+ formats = Forgery::Formats.new
26
+
27
+ formats[:phone]
28
+
29
+ formats.should be_loaded(:phone)
30
+
31
+ formats.reset!
32
+
33
+ formats.should_not be_loaded(:phone)
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+
4
+ require 'rubygems'
5
+ require 'bundler/setup'
6
+ require 'forgery'
7
+ require 'ipaddr'
8
+
9
+ ENV["TESTING_VIA_RSPEC"] = "true"
10
+
11
+ RSpec.configure do |config|
12
+
13
+ end
14
+
15
+ class OnlyContain
16
+ def initialize(*expected)
17
+ @expected = [expected].flatten
18
+ end
19
+
20
+ def matches?(target)
21
+ @target = target.dup
22
+ @expected.each do |e|
23
+ target.gsub!(e, '')
24
+ end
25
+ target.size == 0
26
+ end
27
+
28
+ def failure_message
29
+ "expected #{@target} to only contain #{@expected.join(', ')}"
30
+ end
31
+
32
+ def failure_message
33
+ "expected #{@target} to not only contain #{@expected.join(', ')}"
34
+ end
35
+ end
36
+
37
+ def only_contain(*expected)
38
+ OnlyContain.new(expected)
39
+ end