File: test_faker_unique_generator.rb

package info (click to toggle)
ruby-faker 3.6.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,596 kB
  • sloc: ruby: 20,656; sh: 6; makefile: 6
file content (164 lines) | stat: -rw-r--r-- 3,733 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# frozen_string_literal: true

require_relative '../../test_helper'

class TestFakerUniqueGenerator < Test::Unit::TestCase
  def test_generates_unique_values
    generator = Faker::UniqueGenerator.new(Faker::Base, 10_000)

    result = [generator.rand_in_range(1, 2), generator.rand_in_range(1, 2)]

    assert_equal([1, 2], result.sort)
  end

  def test_respond_to_missing
    stubbed_generator = Object.new

    generator = Faker::UniqueGenerator.new(stubbed_generator, 3)

    assert(generator.send(:respond_to_missing?, 'faker_address'))
    refute(generator.send(:respond_to_missing?, 'address'))
  end

  def test_returns_error_when_retries_exceeded
    stubbed_generator = Object.new
    def stubbed_generator.test
      1
    end

    generator = Faker::UniqueGenerator.new(stubbed_generator, 3)

    generator.test

    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator.test
    end
  end

  def test_includes_field_name_in_error
    stubbed_generator = Object.new
    def stubbed_generator.my_field
      1
    end

    generator = Faker::UniqueGenerator.new(stubbed_generator, 3)

    generator.my_field

    assert_raise_message 'Retry limit exceeded for my_field' do
      generator.my_field
    end
  end

  def test_clears_unique_values
    stubbed_generator = Object.new
    def stubbed_generator.test
      1
    end

    generator = Faker::UniqueGenerator.new(stubbed_generator, 3)

    assert_equal(1, generator.test)

    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator.test
    end

    generator.clear

    assert_equal(1, generator.test)

    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator.test
    end

    generator.clear

    assert_equal(1, generator.test)
  end

  def test_clears_unique_values_for_all_generators
    stubbed_generator = Object.new
    def stubbed_generator.test
      1
    end

    stubbed_generator2 = Object.new
    def stubbed_generator2.test
      2
    end

    generator1 = Faker::UniqueGenerator.new(stubbed_generator, 3)
    generator2 = Faker::UniqueGenerator.new(stubbed_generator2, 3)

    assert_equal(1, generator1.test)
    assert_equal(2, generator2.test)

    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator1.test
    end
    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator2.test
    end

    Faker::UniqueGenerator.clear

    assert_nothing_raised Faker::UniqueGenerator::RetryLimitExceeded do
      assert_equal(1, generator1.test)
      assert_equal(2, generator2.test)
    end

    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator1.test
    end
    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator2.test
    end

    Faker::UniqueGenerator.clear

    assert_nothing_raised Faker::UniqueGenerator::RetryLimitExceeded do
      assert_equal(1, generator1.test)
      assert_equal(2, generator2.test)
    end
  end

  def test_thread_safety
    stubbed_generator = Object.new
    def stubbed_generator.test
      1
    end

    generator = Faker::UniqueGenerator.new(stubbed_generator, 3)

    Thread.new do
      assert_equal(1, generator.test)

      assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
        generator.test
      end
    end.join

    Thread.new do
      assert_equal(1, generator.test)
    end.join

    assert_equal(1, generator.test)

    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator.test
    end

    Thread.new do
      generator.clear
    end.join

    assert_raises Faker::UniqueGenerator::RetryLimitExceeded do
      generator.test
    end

    generator.clear

    assert_equal(1, generator.test)
  end
end