forgery 0.4.3 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +12 -0
  4. data/Gemfile +9 -0
  5. data/Gemfile.lock +35 -0
  6. data/LICENSE +1 -1
  7. data/README.markdown +196 -60
  8. data/Rakefile +10 -54
  9. data/forgery.gemspec +23 -0
  10. data/lib/forgery.rb +0 -1
  11. data/lib/forgery/dictionaries/bics +7 -0
  12. data/lib/forgery/dictionaries/company_names +0 -1
  13. data/lib/forgery/dictionaries/currency_descriptions +2 -2
  14. data/lib/forgery/dictionaries/ibans +61 -0
  15. data/lib/forgery/dictionaries/job_titles +1 -1
  16. data/lib/forgery/dictionaries/zones +1 -2
  17. data/lib/forgery/extend.rb +0 -2
  18. data/lib/forgery/extensions/range.rb +1 -1
  19. data/lib/forgery/file_reader.rb +2 -1
  20. data/lib/forgery/forgery/bank_account.rb +25 -0
  21. data/lib/forgery/forgery/basic.rb +1 -1
  22. data/lib/forgery/forgery/credit_card.rb +71 -0
  23. data/lib/forgery/forgery/geo.rb +54 -0
  24. data/lib/forgery/forgery/internet.rb +7 -0
  25. data/lib/forgery/forgery/lorem_ipsum.rb +4 -4
  26. data/lib/forgery/forgery/russian_tax.rb +57 -0
  27. data/lib/forgery/forgery_railtie.rb +0 -29
  28. data/lib/forgery/formats/phone +1 -1
  29. data/lib/forgery/version.rb +3 -1
  30. data/spec/data/dictionaries/code_names +6 -0
  31. data/spec/data/dictionaries/female_first_names +1 -0
  32. data/spec/data/documents/mock_web_page.html +17 -0
  33. data/spec/data/documents/mock_xml_doc.xml +5 -0
  34. data/spec/dictionaries_spec.rb +35 -0
  35. data/spec/extensions/array_spec.rb +25 -0
  36. data/spec/extensions/range_spec.rb +33 -0
  37. data/spec/extensions/string_spec.rb +29 -0
  38. data/spec/file_reader_spec.rb +32 -0
  39. data/spec/forgery/address_spec.rb +84 -0
  40. data/spec/forgery/bank_account_spec.rb +16 -0
  41. data/spec/forgery/basic_spec.rb +179 -0
  42. data/spec/forgery/credit_card_spec.rb +68 -0
  43. data/spec/forgery/currency_spec.rb +15 -0
  44. data/spec/forgery/date_spec.rb +134 -0
  45. data/spec/forgery/internet_spec.rb +62 -0
  46. data/spec/forgery/lorem_ipsum_spec.rb +132 -0
  47. data/spec/forgery/monetary_spec.rb +14 -0
  48. data/spec/forgery/name_spec.rb +11 -0
  49. data/spec/forgery/personal_spec.rb +15 -0
  50. data/spec/forgery/russian_tax_spec.rb +81 -0
  51. data/spec/forgery/time_spec.rb +7 -0
  52. data/spec/forgery_spec.rb +63 -0
  53. data/spec/formats_spec.rb +35 -0
  54. data/spec/spec_helper.rb +39 -0
  55. metadata +89 -38
  56. data/lib/forgery/file_writer.rb +0 -54
@@ -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
+ expect(valid_number?(Forgery::CreditCard.number)).to eql(true)
8
+ end
9
+
10
+ it "should start with a valid prefix" do
11
+ expect(which_type?(Forgery::CreditCard.number)).not_to eql(false)
12
+ end
13
+
14
+ # type specified
15
+ it "should be valid if type specified" do
16
+ expect(valid_number?(Forgery::CreditCard.number :type => 'Discover')).to eql(true)
17
+ end
18
+
19
+ it "should start with a valid prefix for type specified" do
20
+ expect(which_type?(Forgery::CreditCard.number :type => 'MasterCard')).to eql(:master)
21
+ end
22
+
23
+ # type and length specified
24
+ it "should be valid if type and length specified" do
25
+ expect(valid_number?(Forgery::CreditCard.number :type => 'Visa', :length => 13)).to eql(true)
26
+ end
27
+
28
+ it "should be the length specified" do
29
+ expect((Forgery::CreditCard.number :type => 'Visa', :length => 13).length).to eql(13)
30
+ end
31
+
32
+ # length and prefixes specified
33
+ it "should be valid if length and prefixes specified" do
34
+ expect(valid_number?(Forgery::CreditCard.number :length => 14, :prefixes => %w"300 301 302 303 36 38")).to eql(true)
35
+ end
36
+
37
+ it "should be a valid Diners Club card, since its length and prefixes are specified" do
38
+ expect(which_type?(Forgery::CreditCard.number :length => 14, :prefixes => %w"300 301 302 303 36 38")).to eql(:diners)
39
+ end
40
+ end
41
+
42
+ describe ".type" do
43
+ it "should return a valid type" do
44
+ expect(which_type?(Forgery::CreditCard.number :type => Forgery::CreditCard.type)).not_to 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
+ expect(Forgery::Currency.description).not_to eql(nil)
7
+ end
8
+ end
9
+
10
+ describe ".currency_codes" do
11
+ it "should have the same output when encrypting twice" do
12
+ expect(Forgery::Currency.code).not_to 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
+ expect(Date::DAYNAMES).to 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
+ expect(Date::ABBR_DAYNAMES).to 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
+ expect(Date::MONTHNAMES).to 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
+ expect(Date::ABBR_MONTHNAMES).to 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
+ expect([1,2,3,4,5,6,7,8,9,10,11,12]).to 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
+ expect(year).to be > Date.today.year - 21
39
+ expect(year).to be < 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
+ expect(year).to be >= 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
+ expect(year).to eq(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
+ expect((0..5).map { |i| Date.today.year + i + 5 }).to 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
+ expect(year).to be <= 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
+ expect(year).to eq(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
+ expect((0..5).map { |i| Date.today.year - i - 5 }).to 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
+ expect(date).to be > Date.today - 7300
89
+ expect(date).to be < 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
+ expect(date).to be >= 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
+ expect(date).to eq(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
+ expect((0..5).map { |i| Date.today + i + 5 }).to 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
+ expect(date).to be <= 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
+ expect(date).to eq(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
+ expect((0..5).map { |i| Date.today - i - 5 }).to include(date)
132
+ end
133
+ end
134
+ end
@@ -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
+ expect(Forgery::Internet.user_name).to only_contain(Forgery::Basic::LOWER_ALPHA)
7
+ end
8
+ end
9
+
10
+ it "should return a top level domain" do
11
+ expect(Forgery.dictionaries[:top_level_domains]).to 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
+ expect(Forgery.dictionaries[:top_level_domains]).to 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
+ expect(Forgery::Internet.email_address).to 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
+ expect(Forgery.dictionaries[:country_code_top_level_domains]).to include(Forgery::Internet.cctld)
34
+ end
35
+
36
+ it "should return the cctld in correct two-letter format" do
37
+ expect(Forgery::Internet.cctld).to match(/\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
+ expect(nums.size).to eq(4)
46
+ nums.each do |num|
47
+ expect(num).to match(/\d{1,3}/)
48
+ expect(num.to_i).to be <= 255
49
+ expect(num.to_i).to be >= 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
+ expect(address.ipv6?).to 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
+ expect(Forgery::LoremIpsum.paragraphs).to be_a_kind_of(String)
7
+ end
8
+
9
+ it "should return text with 1 or more character" do
10
+ expect(Forgery::LoremIpsum.paragraphs.size).to be >= 1
11
+ end
12
+
13
+ it "should default to returning 2 paragraphs separated by \\n\\n" do
14
+ expect(Forgery::LoremIpsum.paragraphs.split("\n\n").size).to eq(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
+ expect(paragraph.scan(".").size).to eq(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
+ expect(paragraph).to 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
+ expect(paragraph).to match(/foo.+bar/)
35
+ end
36
+ end
37
+
38
+ it "should separate paragraphs with the specified string" do
39
+ expect(Forgery::LoremIpsum.paragraphs(2, :separator => "foo").split("foo").size).to eq(2)
40
+ end
41
+ end
42
+
43
+ describe ".paragraph" do
44
+ it "should return text" do
45
+ expect(Forgery::LoremIpsum.paragraph).to be_a_kind_of(String)
46
+ end
47
+
48
+ it "should return text with 1 or more character" do
49
+ expect(Forgery::LoremIpsum.paragraph.size).to be >= 1
50
+ end
51
+
52
+ it "should return a single paragraph" do
53
+ expect(Forgery::LoremIpsum.paragraph.scan("\n\n").size).to eq(0)
54
+ end
55
+ end
56
+
57
+ describe ".sentences" do
58
+ it "should return text" do
59
+ expect(Forgery::LoremIpsum.sentences).to be_a_kind_of(String)
60
+ end
61
+
62
+ it "should return text with 1 or more character" do
63
+ expect(Forgery::LoremIpsum.sentences.size).to be >= 1
64
+ end
65
+
66
+ it "should return two sentences by default" do
67
+ expect(Forgery::LoremIpsum.sentences.scan(".").size).to eq(2)
68
+ end
69
+
70
+ it "should return as many sentences as you specify" do
71
+ expect(Forgery::LoremIpsum.sentences(4).scan(".").size).to eq(4)
72
+ end
73
+ end
74
+
75
+ describe ".sentence" do
76
+ it "should return text" do
77
+ expect(Forgery::LoremIpsum.sentence).to be_a_kind_of(String)
78
+ end
79
+
80
+ it "should return text with 1 or more character" do
81
+ expect(Forgery::LoremIpsum.sentence.size).to be >= 1
82
+ end
83
+
84
+ it "should return a single sentence" do
85
+ expect(Forgery::LoremIpsum.sentence.scan(".").size).to eq(1)
86
+ end
87
+ end
88
+
89
+ describe ".words" do
90
+ it "should return text" do
91
+ expect(Forgery::LoremIpsum.words).to be_a_kind_of(String)
92
+ end
93
+
94
+ it "should return text with 1 or more character" do
95
+ expect(Forgery::LoremIpsum.words.size).to be >= 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
+ expect(Forgery::LoremIpsum.word).to be_a_kind_of(String)
106
+ end
107
+
108
+ it "should return text with 1 or more character" do
109
+ expect(Forgery::LoremIpsum.word.size).to be >= 1
110
+ end
111
+ end
112
+
113
+ describe ".characters" do
114
+ it "should return text" do
115
+ expect(Forgery::LoremIpsum.characters).to be_a_kind_of(String)
116
+ end
117
+
118
+ it "should return text with 1 or more character" do
119
+ expect(Forgery::LoremIpsum.characters.size).to be >= 1
120
+ end
121
+ end
122
+
123
+ describe ".character" do
124
+ it "should return text" do
125
+ expect(Forgery::LoremIpsum.character).to be_a_kind_of(String)
126
+ end
127
+
128
+ it "should return text with 1 or more character" do
129
+ expect(Forgery::LoremIpsum.character.size).to be >= 1
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'bigdecimal'
5
+
6
+ describe Forgery::Monetary do
7
+ it 'should return random number string' do
8
+ expect(Forgery(:monetary).money).to match(/^[\d+\.]+$/)
9
+ end
10
+
11
+ it 'should return random number respecting min and max parameters' do
12
+ expect(BigDecimal(Forgery(:monetary).money({ min: 10, max: 20 }))).to be_between(10, 20)
13
+ end
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
+ expect(Forgery.dictionaries[:male_first_names] + Forgery.dictionaries[:female_first_names]).to include(Forgery::Name.first_name)
6
+ end
7
+
8
+ it "should return a random last name" do
9
+ expect(Forgery.dictionaries[:last_names]).to 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
+ expect(Forgery.dictionaries[:genders]).to include(Forgery::Personal.gender)
7
+ end
8
+ end
9
+
10
+ describe '.shirt_size' do
11
+ it 'should return a sane size' do
12
+ expect(Forgery.dictionaries[:shirt_sizes]).to include(Forgery::Personal.shirt_size)
13
+ end
14
+ end
15
+ end