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,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe String do
4
+ it "should change a single # to a number 0-9" do
5
+ (0..9).should include(Integer(Forgery::Extend("#").to_numbers))
6
+ end
7
+
8
+ it "should change two #'s to two numbers 0-9" do
9
+ Forgery::Extend("##").to_numbers.split("").each do |s|
10
+ (0..9).should include(Integer(s))
11
+ end
12
+ end
13
+
14
+ it "should only replace #'s in the string with numbers 0-9" do
15
+ s = Forgery::Extend('###-###-####')
16
+ n = s.to_numbers
17
+ 0.upto(s.size - 1) do |i|
18
+ if s[i, 1] == "#"
19
+ ('0'..'9').should include(n[i, 1])
20
+ else
21
+ ('0'..'9').should_not include(n[i, 1])
22
+ end
23
+ end
24
+ end
25
+
26
+ it "should allow the replacing of a different character" do
27
+ (0..9).should include(Integer(Forgery::Extend("-").to_numbers("-")))
28
+ end
29
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::FileReader do
4
+ it "should return an array when calling read_dictionary" do
5
+ Forgery::FileReader.read_dictionary(:colors).should be_is_a(Array)
6
+ end
7
+
8
+ it "should return an array when calling read_format" do
9
+ Forgery::FileReader.read_format(:phone).should be_is_a(Array)
10
+ end
11
+
12
+ it "should override default dictionaries if Forgery#load_from! was called" do
13
+ Forgery.load_from! "spec/data"
14
+ Forgery::FileReader.read_dictionary(:female_first_names).should == %w(Amber)
15
+ end
16
+
17
+ it "should read dictionaries from custom places if Forgery#load_from! was called" do
18
+ Forgery.load_from! "spec/data"
19
+ Forgery::FileReader.read_dictionary(:code_names).should include('Shiretoko')
20
+ end
21
+
22
+ it "should raise an exception if file wasn't found in load paths" do
23
+ lambda {
24
+ Forgery::FileReader.read_dictionary(:non_existing_dictionary)
25
+ }.should raise_error(ArgumentError)
26
+ end
27
+ after do
28
+ # reset load_paths
29
+ Forgery.load_paths.clear
30
+ Forgery.load_paths << File.expand_path("lib/forgery")
31
+ end
32
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Address do
4
+ it "should return a random street" do
5
+ Forgery.dictionaries[:streets].should include(Forgery::Address.street_name)
6
+ end
7
+
8
+ it "should return a random street number" do
9
+ original_format = Forgery::Address.street_number.gsub(/\d/, '#')
10
+ Forgery.formats[:street_number].should include(original_format)
11
+ end
12
+
13
+ it "should return a random street suffix" do
14
+ Forgery.dictionaries[:street_suffixes].should include(Forgery::Address.street_suffix)
15
+ end
16
+
17
+ describe ".street_address" do
18
+ before do
19
+ @split_address = Forgery::Address.street_address.split
20
+ end
21
+
22
+ it "should return a random street suffix" do
23
+ street_suffix = @split_address.pop
24
+ Forgery.dictionaries[:street_suffixes].should include(street_suffix)
25
+ end
26
+
27
+ it "should return a random street number" do
28
+ street_number_format = @split_address.shift.gsub(/\d/, '#')
29
+ Forgery.formats[:street_number].should include(street_number_format)
30
+ end
31
+
32
+ it "should return a random street" do
33
+ @split_address.pop
34
+ @split_address.shift
35
+ street = @split_address.join(" ")
36
+ Forgery.dictionaries[:streets].should include(street)
37
+ end
38
+ end
39
+
40
+ it "should return a random city" do
41
+ city = Forgery::Address.city
42
+ Forgery.dictionaries[:cities].should include(city)
43
+ end
44
+
45
+ it "should return a random state" do
46
+ state = Forgery::Address.state
47
+ Forgery.dictionaries[:states].should include(state)
48
+ end
49
+
50
+ it "should return a random state abbreviation" do
51
+ state_abbrev = Forgery::Address.state_abbrev
52
+ Forgery.dictionaries[:state_abbrevs].should include(state_abbrev)
53
+ end
54
+
55
+ it "should return a random Canadian province or territory" do
56
+ province = Forgery::Address.province
57
+ Forgery.dictionaries[:provinces].should include(province)
58
+ end
59
+
60
+ it "should return a random Canadian province or territory abbreviation" do
61
+ province_abbrev = Forgery::Address.province_abbrev
62
+ Forgery.dictionaries[:province_abbrevs].should include(province_abbrev)
63
+ end
64
+
65
+ it "should return a random country" do
66
+ country = Forgery::Address.country
67
+ Forgery.dictionaries[:countries].should include(country)
68
+ end
69
+
70
+ it "should return a random continent" do
71
+ continent = Forgery::Address.continent
72
+ Forgery.dictionaries[:continents].should include(continent)
73
+ end
74
+
75
+ it "should return a random zip code" do
76
+ zip_format = Forgery::Address.zip.gsub(/\d/, '#')
77
+ Forgery.formats[:zip].should include(zip_format)
78
+ end
79
+
80
+ it "should return a random phone number" do
81
+ phone_format = Forgery::Address.phone.gsub(/\d/, '#')
82
+ Forgery.formats[:phone].should include(phone_format)
83
+ end
84
+ end
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Basic do
4
+ describe ".password" do
5
+ it "should only uppercase characters" do
6
+ Forgery::Basic.password(:allow_lower => false,
7
+ :allow_upper => true,
8
+ :allow_numeric => false,
9
+ :allow_special => false).should only_contain(Forgery::Basic::UPPER_ALPHA)
10
+ end
11
+
12
+ it "should only contain lowercase characters" do
13
+ Forgery::Basic.password(:allow_lower => true,
14
+ :allow_upper => false,
15
+ :allow_numeric => false,
16
+ :allow_special => false).should only_contain(Forgery::Basic::LOWER_ALPHA)
17
+ end
18
+
19
+ it "should only contain numeric characters" do
20
+ Forgery::Basic.password(:allow_lower => false,
21
+ :allow_upper => false,
22
+ :allow_numeric => true,
23
+ :allow_special => false).should only_contain(Forgery::Basic::NUMERIC)
24
+ end
25
+
26
+ it "should only contain special characters" do
27
+ Forgery::Basic.password(:allow_lower => false,
28
+ :allow_upper => false,
29
+ :allow_numeric => false,
30
+ :allow_special => true).should only_contain(Forgery::Basic::SPECIAL_CHARACTERS)
31
+ end
32
+
33
+ it "should only contain lower and uppercase characters" do
34
+ Forgery::Basic.password(:allow_lower => true,
35
+ :allow_upper => true,
36
+ :allow_numeric => false,
37
+ :allow_special => false).should only_contain(Forgery::Basic::LOWER_ALPHA,
38
+ Forgery::Basic::UPPER_ALPHA)
39
+ end
40
+
41
+ it "should only contain numeric and special characters" do
42
+ Forgery::Basic.password(:allow_lower => false,
43
+ :allow_upper => false,
44
+ :allow_numeric => true,
45
+ :allow_special => true).should only_contain(Forgery::Basic::NUMERIC,
46
+ Forgery::Basic::SPECIAL_CHARACTERS)
47
+ end
48
+
49
+ it "should contain any of the defined characters" do
50
+ Forgery::Basic.password(:allow_lower => true,
51
+ :allow_upper => true,
52
+ :allow_numeric => true,
53
+ :allow_special => true).should only_contain(Forgery::Basic::NUMERIC,
54
+ Forgery::Basic::SPECIAL_CHARACTERS,
55
+ Forgery::Basic::LOWER_ALPHA,
56
+ Forgery::Basic::UPPER_ALPHA)
57
+ end
58
+ end
59
+
60
+ describe ".encrypt" do
61
+ it "should encrypt to hex digits" do
62
+ Forgery::Basic.encrypt("something").should only_contain(Forgery::Basic::HEX_DIGITS)
63
+ end
64
+
65
+ it "should encrypt different words to different output" do
66
+ Forgery::Basic.encrypt("foo").should_not == Forgery::Basic.encrypt("bar")
67
+ end
68
+
69
+ it "should allow a salt that changes the output" do
70
+ Forgery::Basic.encrypt("foo", "baz").should_not == Forgery::Basic.encrypt("foo", "bar")
71
+ end
72
+
73
+ it "should have the same output when encrypting twice" do
74
+ Forgery::Basic.encrypt("foo", "bar").should == Forgery::Basic.encrypt("foo", "bar")
75
+ end
76
+ end
77
+
78
+ describe ".boolean" do
79
+ it "should return true or false" do
80
+ [true, false].should include(Forgery::Basic.boolean)
81
+ end
82
+ end
83
+
84
+ describe ".color" do
85
+ it "should return a random color" do
86
+ Forgery.dictionaries[:colors].should include(Forgery::Basic.color)
87
+ end
88
+ end
89
+
90
+ describe ".hex_color" do
91
+ it "should return a 6-character hex color" do
92
+ Forgery::Basic.hex_color.should match(/#(#{Forgery::Basic::HEX_DIGITS.join('|')}){6}/)
93
+ end
94
+ end
95
+
96
+ describe ".short_hex_color" do
97
+ it "should return a 3-character hex color" do
98
+ Forgery::Basic.short_hex_color.should match(/#(#{Forgery::Basic::HEX_DIGITS.join('|')}){3}/)
99
+ end
100
+ end
101
+
102
+ describe ".number" do
103
+ it "should return a number >= the at_least option" do
104
+ Forgery::Basic.number(:at_least => 2).should >= 2
105
+ end
106
+
107
+ it "should return a number <= the at_most option" do
108
+ Forgery::Basic.number(:at_most => 12).should <= 12
109
+ end
110
+ end
111
+
112
+ describe ".text" do
113
+ it "should return text whose length is >= the at_least option" do
114
+ Forgery::Basic.text(:at_least => 5).size.should >= 5
115
+ end
116
+
117
+ it "should return text whose length is <= the at_most option" do
118
+ Forgery::Basic.text(:at_most => 15).size.should <= 15
119
+ end
120
+
121
+ it "should return text whose length is == the exactly option" do
122
+ Forgery::Basic.text(:exactly => 20).size.should == 20
123
+ end
124
+
125
+ it "should only uppercase characters" do
126
+ Forgery::Basic.text(:allow_lower => false,
127
+ :allow_upper => true,
128
+ :allow_numeric => false,
129
+ :allow_special => false).should only_contain(Forgery::Basic::UPPER_ALPHA)
130
+ end
131
+
132
+ it "should only contain lowercase characters" do
133
+ Forgery::Basic.text(:allow_lower => true,
134
+ :allow_upper => false,
135
+ :allow_numeric => false,
136
+ :allow_special => false).should only_contain(Forgery::Basic::LOWER_ALPHA)
137
+ end
138
+
139
+ it "should only contain numeric characters" do
140
+ Forgery::Basic.text(:allow_lower => false,
141
+ :allow_upper => false,
142
+ :allow_numeric => true,
143
+ :allow_special => false).should only_contain(Forgery::Basic::NUMERIC)
144
+ end
145
+
146
+ it "should only contain special characters" do
147
+ Forgery::Basic.text(:allow_lower => false,
148
+ :allow_upper => false,
149
+ :allow_numeric => false,
150
+ :allow_special => true).should only_contain(Forgery::Basic::SPECIAL_CHARACTERS)
151
+ end
152
+
153
+ it "should only contain lower and uppercase characters" do
154
+ Forgery::Basic.text(:allow_lower => true,
155
+ :allow_upper => true,
156
+ :allow_numeric => false,
157
+ :allow_special => false).should only_contain(Forgery::Basic::LOWER_ALPHA,
158
+ Forgery::Basic::UPPER_ALPHA)
159
+ end
160
+
161
+ it "should only contain numeric and special characters" do
162
+ Forgery::Basic.text(:allow_lower => false,
163
+ :allow_upper => false,
164
+ :allow_numeric => true,
165
+ :allow_special => true).should only_contain(Forgery::Basic::NUMERIC,
166
+ Forgery::Basic::SPECIAL_CHARACTERS)
167
+ end
168
+
169
+ it "should contain any of the defined characters" do
170
+ Forgery::Basic.text(:allow_lower => true,
171
+ :allow_upper => true,
172
+ :allow_numeric => true,
173
+ :allow_special => true).should only_contain(Forgery::Basic::NUMERIC,
174
+ Forgery::Basic::SPECIAL_CHARACTERS,
175
+ Forgery::Basic::LOWER_ALPHA,
176
+ Forgery::Basic::UPPER_ALPHA)
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::CreditCard do
4
+ describe ".number" do
5
+ # basics
6
+ it "should be valid (pass a Luhn test)" do
7
+ valid_number?(Forgery::CreditCard.number).should eql(true)
8
+ end
9
+
10
+ it "should start with a valid prefix" do
11
+ which_type?(Forgery::CreditCard.number).should_not eql(false)
12
+ end
13
+
14
+ # type specified
15
+ it "should be valid if type specified" do
16
+ valid_number?(Forgery::CreditCard.number :type => 'Discover').should eql(true)
17
+ end
18
+
19
+ it "should start with a valid prefix for type specified" do
20
+ which_type?(Forgery::CreditCard.number :type => 'MasterCard').should eql(:master)
21
+ end
22
+
23
+ # type and length specified
24
+ it "should be valid if type and length specified" do
25
+ valid_number?(Forgery::CreditCard.number :type => 'Visa', :length => 13).should eql(true)
26
+ end
27
+
28
+ it "should be the length specified" do
29
+ (Forgery::CreditCard.number :type => 'Visa', :length => 13).length.should eql(13)
30
+ end
31
+
32
+ # length and prefixes specified
33
+ it "should be valid if length and prefixes specified" do
34
+ valid_number?(Forgery::CreditCard.number :length => 14, :prefixes => %w"300 301 302 303 36 38").should eql(true)
35
+ end
36
+
37
+ it "should be a valid Diners Club card, since its length and prefixes are specified" do
38
+ which_type?(Forgery::CreditCard.number :length => 14, :prefixes => %w"300 301 302 303 36 38").should eql(:diners)
39
+ end
40
+ end
41
+
42
+ describe ".type" do
43
+ it "should return a valid type" do
44
+ which_type?(Forgery::CreditCard.number :type => Forgery::CreditCard.type).should_not eql(false)
45
+ end
46
+ end
47
+
48
+ # helper functions below originally from: https://gist.github.com/1182499
49
+ def valid_number?(number)
50
+ number.reverse!
51
+ relative_number = {'0' => 0, '1' => 2, '2' => 4, '3' => 6, '4' => 8, '5' => 1, '6' => 3, '7' => 5, '8' => 7, '9' => 9}
52
+ sum = 0
53
+ number.split("").each_with_index do |n, i|
54
+ sum += (i % 2 == 0) ? n.to_i : relative_number[n]
55
+ end
56
+ sum % 10 == 0
57
+ end
58
+
59
+ def which_type?(number)
60
+ return :diners if number.length == 14 && number =~ /^3(0[0-5]|[68])/ # 300xxx-305xxx, 36xxxx, 38xxxx
61
+ return :amex if number.length == 15 && number =~ /^3[47]/ # 34xxxx, 37xxxx
62
+ return :visa if [13,16].include?(number.length) && number =~ /^4/ # 4xxxxx
63
+ return :master if number.length == 16 && number =~ /^5[1-5]/ # 51xxxx-55xxxx
64
+ return :discover if number.length == 16 && number =~ /^6011/ # 6011xx
65
+ return false
66
+ end
67
+
68
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Forgery::Currency do
4
+ describe ".currency_descriptions" do
5
+ it "should be able to generate a currency description" do
6
+ Forgery::Currency.description.should_not eql(nil)
7
+ end
8
+ end
9
+
10
+ describe ".currency_codes" do
11
+ it "should have the same output when encrypting twice" do
12
+ Forgery::Currency.code.should_not eql(nil)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,134 @@
1
+ require 'spec_helper'
2
+ require 'date'
3
+
4
+ describe Forgery::Date do
5
+ describe '.day_of_week' do
6
+ it 'should return a day of the week' do
7
+ Date::DAYNAMES.should include(Forgery::Date.day_of_week)
8
+ end
9
+ end
10
+
11
+ describe '.day_of_week(:abbr => true)' do
12
+ it 'should return a day of the week in abbreviated form' do
13
+ Date::ABBR_DAYNAMES.should include(Forgery::Date.day_of_week(:abbr => true))
14
+ end
15
+ end
16
+
17
+ describe '.month' do
18
+ it 'should return a valid month' do
19
+ Date::MONTHNAMES.should include(Forgery::Date.month)
20
+ end
21
+ end
22
+
23
+ describe '.month(:abbr => true)' do
24
+ it 'should return a valid month in abbreviated form' do
25
+ Date::ABBR_MONTHNAMES.should include(Forgery::Date.month(:abbr => true))
26
+ end
27
+ end
28
+
29
+ describe '.month(:numerical => true)' do
30
+ it 'should return a valid month in numeric form' do
31
+ [1,2,3,4,5,6,7,8,9,10,11,12].should include(Forgery::Date.month(:numerical => true))
32
+ end
33
+ end
34
+
35
+ describe '.year' do
36
+ it 'should return a valid year within 20 years of the current year' do
37
+ year = Forgery::Date.year
38
+ year.should > Date.today.year - 21
39
+ year.should < Date.today.year + 21
40
+ end
41
+ end
42
+
43
+ describe '.year(:future => true)' do
44
+ it 'should return a year greater than the current one' do
45
+ year = Forgery::Date.year(:future => true)
46
+ year.should >= Date.today.year
47
+ end
48
+ end
49
+
50
+ describe '.year(:min_delta => 5, :max_delta => 5, :future => true)' do
51
+ it 'should return a year 5 years from the current one' do
52
+ year = Forgery::Date.year(:min_delta => 5, :max_delta => 5, :future => true)
53
+ year.should == Date.today.year + 5
54
+ end
55
+ end
56
+
57
+ describe '.year(:min_delta => 5, :max_delta => 10, :future => true)' do
58
+ it 'should return a year that is between 5 and 10 years greater than the current one' do
59
+ year = Forgery::Date.year(:min_delta => 5, :max_delta => 10, :future => true)
60
+ (0..5).map { |i| Date.today.year + i + 5 }.should include(year)
61
+ end
62
+ end
63
+
64
+ describe '.year(:past => true)' do
65
+ it 'should return a year less than the current one' do
66
+ year = Forgery::Date.year(:past => true)
67
+ year.should <= Date.today.year
68
+ end
69
+ end
70
+
71
+ describe '.year(:min_delta => 5, :max_delta => 5, :past => true)' do
72
+ it 'should return a year 5 years until the current one' do
73
+ year = Forgery::Date.year(:min_delta => 5, :max_delta => 5, :past => true)
74
+ year.should == Date.today.year - 5
75
+ end
76
+ end
77
+
78
+ describe '.year(:min_delta => 5, :max_delta => 10, :past => true)' do
79
+ it 'should return a year that is between 5 and 10 years less than the current one' do
80
+ year = Forgery::Date.year(:min_delta => 5, :max_delta => 10, :past => true)
81
+ (0..5).map { |i| Date.today.year - i - 5 }.should include(year)
82
+ end
83
+ end
84
+
85
+ describe '.date' do
86
+ it 'should return a valid date within 7300 days of the current date' do
87
+ date = Forgery::Date.date
88
+ date.should > Date.today - 7300
89
+ date.should < Date.today + 7300
90
+ end
91
+ end
92
+
93
+ describe '.date(:future => true)' do
94
+ it 'should return a date greater than the current one' do
95
+ date = Forgery::Date.date(:future => true)
96
+ date.should >= Date.today
97
+ end
98
+ end
99
+
100
+ describe '.date(:min_delta => 5, :max_delta => 5, :future => true)' do
101
+ it 'should return a date 5 days from the current one' do
102
+ date = Forgery::Date.date(:min_delta => 5, :max_delta => 5, :future => true)
103
+ date.should == Date.today + 5
104
+ end
105
+ end
106
+
107
+ describe '.date(:min_delta => 5, :max_delta => 10, :future => true)' do
108
+ it 'should return a date that is between 5 and 10 days greater than the current one' do
109
+ date = Forgery::Date.date(:min_delta => 5, :max_delta => 10, :future => true)
110
+ (0..5).map { |i| Date.today + i + 5 }.should include(date)
111
+ end
112
+ end
113
+
114
+ describe '.date(:past => true)' do
115
+ it 'should return a date less than the current one' do
116
+ date = Forgery::Date.date(:past => true)
117
+ date.should <= Date.today
118
+ end
119
+ end
120
+
121
+ describe '.date(:min_delta => 5, :max_delta => 5, :past => true)' do
122
+ it 'should return a date 5 days until the current one' do
123
+ date = Forgery::Date.date(:min_delta => 5, :max_delta => 5, :past => true)
124
+ date.should == Date.today - 5
125
+ end
126
+ end
127
+
128
+ describe '.date(:min_delta => 5, :max_delta => 10, :past => true)' do
129
+ it 'should return a date that is between 5 and 10 days less than the current one' do
130
+ date = Forgery::Date.date(:min_delta => 5, :max_delta => 10, :past => true)
131
+ (0..5).map { |i| Date.today - i - 5 }.should include(date)
132
+ end
133
+ end
134
+ end