paper_trail 7.1.0 → 7.1.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 (151) hide show
  1. checksums.yaml +4 -4
  2. data/lib/paper_trail/record_trail.rb +1 -1
  3. data/lib/paper_trail/version_number.rb +1 -1
  4. metadata +3 -274
  5. data/.github/CONTRIBUTING.md +0 -151
  6. data/.github/ISSUE_TEMPLATE.md +0 -13
  7. data/.gitignore +0 -23
  8. data/.rspec +0 -2
  9. data/.rubocop.yml +0 -135
  10. data/.rubocop_todo.yml +0 -41
  11. data/.travis.yml +0 -41
  12. data/Appraisals +0 -26
  13. data/CHANGELOG.md +0 -739
  14. data/Gemfile +0 -2
  15. data/MIT-LICENSE +0 -20
  16. data/README.md +0 -1613
  17. data/Rakefile +0 -38
  18. data/doc/bug_report_template.rb +0 -73
  19. data/doc/triage.md +0 -27
  20. data/doc/warning_about_not_setting_whodunnit.md +0 -33
  21. data/gemfiles/ar_4.0.gemfile +0 -7
  22. data/gemfiles/ar_4.2.gemfile +0 -7
  23. data/gemfiles/ar_5.0.gemfile +0 -8
  24. data/gemfiles/ar_5.1.gemfile +0 -8
  25. data/gemfiles/ar_master.gemfile +0 -9
  26. data/lib/generators/paper_trail/default_initializer.rb +0 -0
  27. data/paper_trail.gemspec +0 -49
  28. data/spec/controllers/articles_controller_spec.rb +0 -28
  29. data/spec/controllers/widgets_controller_spec.rb +0 -85
  30. data/spec/dummy_app/Rakefile +0 -7
  31. data/spec/dummy_app/app/controllers/application_controller.rb +0 -30
  32. data/spec/dummy_app/app/controllers/articles_controller.rb +0 -16
  33. data/spec/dummy_app/app/controllers/test_controller.rb +0 -5
  34. data/spec/dummy_app/app/controllers/widgets_controller.rb +0 -28
  35. data/spec/dummy_app/app/models/animal.rb +0 -4
  36. data/spec/dummy_app/app/models/article.rb +0 -25
  37. data/spec/dummy_app/app/models/authorship.rb +0 -5
  38. data/spec/dummy_app/app/models/bar_habtm.rb +0 -4
  39. data/spec/dummy_app/app/models/book.rb +0 -9
  40. data/spec/dummy_app/app/models/boolit.rb +0 -4
  41. data/spec/dummy_app/app/models/callback_modifier.rb +0 -45
  42. data/spec/dummy_app/app/models/car.rb +0 -3
  43. data/spec/dummy_app/app/models/cat.rb +0 -2
  44. data/spec/dummy_app/app/models/chapter.rb +0 -9
  45. data/spec/dummy_app/app/models/citation.rb +0 -5
  46. data/spec/dummy_app/app/models/custom_primary_key_record.rb +0 -15
  47. data/spec/dummy_app/app/models/customer.rb +0 -4
  48. data/spec/dummy_app/app/models/document.rb +0 -8
  49. data/spec/dummy_app/app/models/dog.rb +0 -2
  50. data/spec/dummy_app/app/models/editor.rb +0 -4
  51. data/spec/dummy_app/app/models/editorship.rb +0 -5
  52. data/spec/dummy_app/app/models/elephant.rb +0 -3
  53. data/spec/dummy_app/app/models/fluxor.rb +0 -3
  54. data/spec/dummy_app/app/models/foo_habtm.rb +0 -5
  55. data/spec/dummy_app/app/models/foo_widget.rb +0 -2
  56. data/spec/dummy_app/app/models/fruit.rb +0 -5
  57. data/spec/dummy_app/app/models/gadget.rb +0 -3
  58. data/spec/dummy_app/app/models/kitchen/banana.rb +0 -5
  59. data/spec/dummy_app/app/models/legacy_widget.rb +0 -6
  60. data/spec/dummy_app/app/models/line_item.rb +0 -4
  61. data/spec/dummy_app/app/models/not_on_update.rb +0 -4
  62. data/spec/dummy_app/app/models/on/create.rb +0 -6
  63. data/spec/dummy_app/app/models/on/destroy.rb +0 -6
  64. data/spec/dummy_app/app/models/on/empty_array.rb +0 -6
  65. data/spec/dummy_app/app/models/on/update.rb +0 -6
  66. data/spec/dummy_app/app/models/order.rb +0 -5
  67. data/spec/dummy_app/app/models/paragraph.rb +0 -5
  68. data/spec/dummy_app/app/models/person.rb +0 -39
  69. data/spec/dummy_app/app/models/post.rb +0 -3
  70. data/spec/dummy_app/app/models/post_with_status.rb +0 -7
  71. data/spec/dummy_app/app/models/quotation.rb +0 -5
  72. data/spec/dummy_app/app/models/section.rb +0 -6
  73. data/spec/dummy_app/app/models/skipper.rb +0 -3
  74. data/spec/dummy_app/app/models/song.rb +0 -37
  75. data/spec/dummy_app/app/models/thing.rb +0 -3
  76. data/spec/dummy_app/app/models/translation.rb +0 -11
  77. data/spec/dummy_app/app/models/truck.rb +0 -4
  78. data/spec/dummy_app/app/models/vehicle.rb +0 -4
  79. data/spec/dummy_app/app/models/whatchamajigger.rb +0 -4
  80. data/spec/dummy_app/app/models/widget.rb +0 -8
  81. data/spec/dummy_app/app/models/wotsit.rb +0 -8
  82. data/spec/dummy_app/app/versions/custom_primary_key_record_version.rb +0 -3
  83. data/spec/dummy_app/app/versions/joined_version.rb +0 -6
  84. data/spec/dummy_app/app/versions/json_version.rb +0 -3
  85. data/spec/dummy_app/app/versions/kitchen/banana_version.rb +0 -5
  86. data/spec/dummy_app/app/versions/post_version.rb +0 -3
  87. data/spec/dummy_app/config.ru +0 -4
  88. data/spec/dummy_app/config/application.rb +0 -39
  89. data/spec/dummy_app/config/boot.rb +0 -24
  90. data/spec/dummy_app/config/database.mysql.yml +0 -19
  91. data/spec/dummy_app/config/database.postgres.yml +0 -15
  92. data/spec/dummy_app/config/database.sqlite.yml +0 -15
  93. data/spec/dummy_app/config/environment.rb +0 -5
  94. data/spec/dummy_app/config/environments/development.rb +0 -36
  95. data/spec/dummy_app/config/environments/production.rb +0 -74
  96. data/spec/dummy_app/config/environments/test.rb +0 -46
  97. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +0 -9
  98. data/spec/dummy_app/config/initializers/inflections.rb +0 -10
  99. data/spec/dummy_app/config/initializers/mime_types.rb +0 -5
  100. data/spec/dummy_app/config/initializers/paper_trail.rb +0 -1
  101. data/spec/dummy_app/config/initializers/secret_token.rb +0 -9
  102. data/spec/dummy_app/config/initializers/session_store.rb +0 -8
  103. data/spec/dummy_app/config/locales/en.yml +0 -5
  104. data/spec/dummy_app/config/routes.rb +0 -4
  105. data/spec/dummy_app/db/migrate/20110208155312_set_up_test_tables.rb +0 -344
  106. data/spec/dummy_app/db/schema.rb +0 -298
  107. data/spec/generators/install_generator_spec.rb +0 -88
  108. data/spec/models/animal_spec.rb +0 -61
  109. data/spec/models/article_spec.rb +0 -186
  110. data/spec/models/boolit_spec.rb +0 -41
  111. data/spec/models/callback_modifier_spec.rb +0 -92
  112. data/spec/models/car_spec.rb +0 -13
  113. data/spec/models/custom_primary_key_record_spec.rb +0 -18
  114. data/spec/models/document_spec.rb +0 -57
  115. data/spec/models/gadget_spec.rb +0 -63
  116. data/spec/models/joined_version_spec.rb +0 -41
  117. data/spec/models/json_version_spec.rb +0 -101
  118. data/spec/models/kitchen/banana_spec.rb +0 -14
  119. data/spec/models/legacy_widget_spec.rb +0 -40
  120. data/spec/models/not_on_update_spec.rb +0 -22
  121. data/spec/models/on/create_spec.rb +0 -27
  122. data/spec/models/on/destroy_spec.rb +0 -27
  123. data/spec/models/on/empty_array_spec.rb +0 -30
  124. data/spec/models/on/update_spec.rb +0 -27
  125. data/spec/models/post_with_status_spec.rb +0 -46
  126. data/spec/models/skipper_spec.rb +0 -42
  127. data/spec/models/thing_spec.rb +0 -11
  128. data/spec/models/translation_spec.rb +0 -70
  129. data/spec/models/vehicle_spec.rb +0 -5
  130. data/spec/models/version_spec.rb +0 -282
  131. data/spec/models/widget_spec.rb +0 -338
  132. data/spec/modules/paper_trail_spec.rb +0 -27
  133. data/spec/modules/version_concern_spec.rb +0 -28
  134. data/spec/modules/version_number_spec.rb +0 -18
  135. data/spec/paper_trail/associations_spec.rb +0 -965
  136. data/spec/paper_trail/cleaner_spec.rb +0 -152
  137. data/spec/paper_trail/config_spec.rb +0 -45
  138. data/spec/paper_trail/model_spec.rb +0 -992
  139. data/spec/paper_trail/serializer_spec.rb +0 -85
  140. data/spec/paper_trail/serializers/custom_json_serializer_spec.rb +0 -18
  141. data/spec/paper_trail/serializers/custom_yaml_serializer_spec.rb +0 -45
  142. data/spec/paper_trail/serializers/json_spec.rb +0 -57
  143. data/spec/paper_trail/serializers/yaml_spec.rb +0 -42
  144. data/spec/paper_trail/thread_safety_spec.rb +0 -44
  145. data/spec/paper_trail/version_limit_spec.rb +0 -55
  146. data/spec/paper_trail/version_spec.rb +0 -96
  147. data/spec/paper_trail_spec.rb +0 -122
  148. data/spec/requests/articles_spec.rb +0 -34
  149. data/spec/spec_helper.rb +0 -78
  150. data/spec/support/alt_db_init.rb +0 -54
  151. data/spec/support/custom_json_serializer.rb +0 -13
@@ -1,85 +0,0 @@
1
- require "spec_helper"
2
- require "support/custom_json_serializer"
3
-
4
- RSpec.describe(PaperTrail, versioning: true) do
5
- context "YAML serializer" do
6
- it "saves the expected YAML in the object column" do
7
- customer = Customer.create(name: "Some text.")
8
- original_attributes = customer.paper_trail.attributes_before_change
9
- customer.update(name: "Some more text.")
10
- expect(customer.versions.length).to(eq(2))
11
- expect(customer.versions[0].reify).to(be_nil)
12
- expect(customer.versions[1].reify.name).to(eq("Some text."))
13
- expect(YAML.load(customer.versions[1].object)).to(eq(original_attributes))
14
- expect(customer.versions[1].object).to(eq(YAML.dump(original_attributes)))
15
- end
16
- end
17
-
18
- context "JSON Serializer" do
19
- before do
20
- PaperTrail.configure do |config|
21
- config.serializer = PaperTrail::Serializers::JSON
22
- end
23
- end
24
-
25
- after do
26
- PaperTrail.config.serializer = PaperTrail::Serializers::YAML
27
- end
28
-
29
- it "reify with JSON serializer" do
30
- customer = Customer.create(name: "Some text.")
31
- original_attributes = customer.paper_trail.attributes_before_change
32
- customer.update(name: "Some more text.")
33
- expect(customer.versions.length).to(eq(2))
34
- expect(customer.versions[0].reify).to(be_nil)
35
- expect(customer.versions[1].reify.name).to(eq("Some text."))
36
- expect(ActiveSupport::JSON.decode(customer.versions[1].object)).to(eq(original_attributes))
37
- expect(customer.versions[1].object).to(eq(ActiveSupport::JSON.encode(original_attributes)))
38
- end
39
-
40
- describe "#changeset" do
41
- it "returns the expected hash" do
42
- customer = Customer.create(name: "Some text.")
43
- customer.update(name: "Some more text.")
44
- initial_changeset = { "name" => [nil, "Some text."], "id" => [nil, customer.id] }
45
- second_changeset = { "name" => ["Some text.", "Some more text."] }
46
- expect(customer.versions[0].changeset).to(eq(initial_changeset))
47
- expect(customer.versions[1].changeset).to(eq(second_changeset))
48
- end
49
- end
50
- end
51
-
52
- context "Custom Serializer" do
53
- before do
54
- PaperTrail.configure { |config| config.serializer = CustomJsonSerializer }
55
- end
56
-
57
- after do
58
- PaperTrail.config.serializer = PaperTrail::Serializers::YAML
59
- end
60
-
61
- it "reify with custom serializer" do
62
- customer = Customer.create
63
- original_attributes = customer.paper_trail.attributes_before_change.reject { |_k, v| v.nil? }
64
- customer.update(name: "Some more text.")
65
- expect(customer.versions.length).to(eq(2))
66
- expect(customer.versions[0].reify).to(be_nil)
67
- expect(customer.versions[1].reify.name).to(be_nil)
68
- expect(
69
- ActiveSupport::JSON.decode(customer.versions[1].object)
70
- ).to eq(original_attributes)
71
- expect(
72
- customer.versions[1].object
73
- ).to eq(ActiveSupport::JSON.encode(original_attributes))
74
- end
75
-
76
- describe "#changeset" do
77
- it "store object_changes" do
78
- customer = Customer.create
79
- customer.update(name: "banana")
80
- expect(customer.versions[0].changeset).to eq("id" => [nil, customer.id])
81
- expect(customer.versions[1].changeset).to eq("name" => [nil, "banana"])
82
- end
83
- end
84
- end
85
- end
@@ -1,18 +0,0 @@
1
- require "spec_helper"
2
- require_relative "../../support/custom_json_serializer"
3
-
4
- RSpec.describe CustomJsonSerializer do
5
- describe ".load" do
6
- it "deserializes, removing pairs with blank keys or values" do
7
- hash = { "key1" => "banana", "tkey" => nil, "" => "foo" }
8
- expect(described_class.load(hash.to_json)).to(eq("key1" => "banana"))
9
- end
10
- end
11
-
12
- describe ".dump" do
13
- it "serializes to JSON, removing pairs with nil values" do
14
- hash = { "key1" => "banana", "tkey" => nil, "" => "foo" }
15
- expect(described_class.dump(hash)).to(eq('{"key1":"banana","":"foo"}'))
16
- end
17
- end
18
- end
@@ -1,45 +0,0 @@
1
- require "spec_helper"
2
-
3
- module CustomYamlSerializer
4
- extend PaperTrail::Serializers::YAML
5
-
6
- def self.load(string)
7
- parsed_value = super(string)
8
- if parsed_value.is_a?(Hash)
9
- parsed_value.reject { |k, v| (k.blank? || v.blank?) }
10
- else
11
- parsed_value
12
- end
13
- end
14
-
15
- def self.dump(object)
16
- object.is_a?(Hash) ? super(object.reject { |_k, v| v.nil? }) : super
17
- end
18
- end
19
-
20
- RSpec.describe CustomYamlSerializer do
21
- let(:word_hash) {
22
- {
23
- "key1" => ::FFaker::Lorem.word,
24
- "key2" => nil,
25
- "tkey" => nil,
26
- "" => "foo"
27
- }
28
- }
29
-
30
- context(".load") do
31
- it("deserializes YAML to Ruby, removing pairs with blank keys or values") do
32
- expect(described_class.load(word_hash.to_yaml)).to eq(
33
- word_hash.reject { |k, v| (k.blank? || v.blank?) }
34
- )
35
- end
36
- end
37
-
38
- context(".dump") do
39
- it("serializes Ruby to YAML, removing pairs with nil values") do
40
- expect(described_class.dump(word_hash)).to eq(
41
- word_hash.reject { |_k, v| v.nil? }.to_yaml
42
- )
43
- end
44
- end
45
- end
@@ -1,57 +0,0 @@
1
- require "spec_helper"
2
-
3
- module PaperTrail
4
- module Serializers
5
- ::RSpec.describe JSON do
6
- let(:word_hash) {
7
- (1..4).each_with_object({}) { |i, a| a["key#{i}"] = ::FFaker::Lorem.word }
8
- }
9
- let(:word_array) { [].fill(0, rand(5) + 4) { ::FFaker::Lorem.word } }
10
-
11
- describe ".load" do
12
- it "deserialize JSON to Ruby" do
13
- expect(described_class.load(word_hash.to_json)).to eq(word_hash)
14
- expect(described_class.load(word_array.to_json)).to eq(word_array)
15
- end
16
- end
17
-
18
- describe ".dump" do
19
- it "serializes Ruby to JSON" do
20
- expect(described_class.dump(word_hash)).to eq(word_hash.to_json)
21
- expect(described_class.dump(word_array)).to eq(word_array.to_json)
22
- end
23
- end
24
-
25
- describe ".where_object_condition" do
26
- context "when value is a string" do
27
- it "construct correct WHERE query" do
28
- matches = described_class.
29
- where_object_condition(PaperTrail::Version.arel_table[:object], :arg1, "Val 1")
30
- expect(matches.instance_of?(Arel::Nodes::Matches)).to(eq(true))
31
- expect(matches.right.val).to eq("%\"arg1\":\"Val 1\"%")
32
- end
33
- end
34
-
35
- context "when value is null" do
36
- it "construct correct WHERE query" do
37
- matches = described_class.
38
- where_object_condition(PaperTrail::Version.arel_table[:object], :arg1, nil)
39
- expect(matches.instance_of?(Arel::Nodes::Matches)).to(eq(true))
40
- expect(matches.right.val).to(eq("%\"arg1\":null%"))
41
- end
42
- end
43
-
44
- context "when value is a number" do
45
- it "construct correct WHERE query" do
46
- grouping = described_class.
47
- where_object_condition(PaperTrail::Version.arel_table[:object], :arg1, -3.5)
48
- expect(grouping.instance_of?(Arel::Nodes::Grouping)).to(eq(true))
49
- matches = grouping.select { |v| v.instance_of?(Arel::Nodes::Matches) }
50
- expect(matches.first.right.val).to eq("%\"arg1\":-3.5,%")
51
- expect(matches.last.right.val).to eq("%\"arg1\":-3.5}%")
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,42 +0,0 @@
1
- require "spec_helper"
2
-
3
- module PaperTrail
4
- module Serializers
5
- ::RSpec.describe(YAML, versioning: true) do
6
- let(:array) { ::Array.new(10) { ::FFaker::Lorem.word } }
7
- let(:hash) {
8
- {
9
- alice: "bob",
10
- binary: 0xdeadbeef,
11
- octal_james_bond: 0o7,
12
- int: 42,
13
- float: 4.2
14
- }
15
- }
16
-
17
- describe ".load" do
18
- it "deserializes YAML to Ruby" do
19
- expect(described_class.load(hash.to_yaml)).to eq(hash)
20
- expect(described_class.load(array.to_yaml)).to eq(array)
21
- end
22
- end
23
-
24
- describe ".dump" do
25
- it "serializes Ruby to YAML" do
26
- expect(described_class.dump(hash)).to eq(hash.to_yaml)
27
- expect(described_class.dump(array)).to eq(array.to_yaml)
28
- end
29
- end
30
-
31
- describe ".where_object" do
32
- it "constructs the correct WHERE query" do
33
- matches = described_class.where_object_condition(
34
- ::PaperTrail::Version.arel_table[:object], :arg1, "Val 1"
35
- )
36
- expect(matches.instance_of?(Arel::Nodes::Matches)).to(eq(true))
37
- expect(matches.right.val).to eq("%\narg1: Val 1\n%")
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,44 +0,0 @@
1
- require "spec_helper"
2
-
3
- RSpec.describe PaperTrail do
4
- describe "#set_paper_trail_whodunnit" do
5
- it "is thread-safe" do
6
- blocked = true
7
- slow_thread = Thread.new do
8
- controller = TestController.new
9
- controller.send(:set_paper_trail_whodunnit)
10
- sleep(0.001) while blocked
11
- described_class.whodunnit
12
- end
13
- fast_thread = Thread.new do
14
- controller = TestController.new
15
- controller.send(:set_paper_trail_whodunnit)
16
- who = described_class.whodunnit
17
- blocked = false
18
- who
19
- end
20
- expect(fast_thread.value).not_to(eq(slow_thread.value))
21
- end
22
- end
23
-
24
- describe "#without_versioning" do
25
- it "is thread-safe" do
26
- enabled = nil
27
- slow_thread = Thread.new do
28
- Widget.new.paper_trail.without_versioning do
29
- sleep(0.01)
30
- enabled = Widget.paper_trail.enabled?
31
- sleep(0.01)
32
- end
33
- enabled
34
- end
35
- fast_thread = Thread.new do
36
- sleep(0.005)
37
- Widget.paper_trail.enabled?
38
- end
39
- expect(fast_thread.value).not_to(eq(slow_thread.value))
40
- expect(Widget.paper_trail.enabled?).to(eq(true))
41
- expect(described_class.enabled_for_model?(Widget)).to(eq(true))
42
- end
43
- end
44
- end
@@ -1,55 +0,0 @@
1
- require "spec_helper"
2
-
3
- module PaperTrail
4
- ::RSpec.describe Cleaner, versioning: true do
5
- after do
6
- PaperTrail.config.version_limit = nil
7
- end
8
-
9
- it "cleans up old versions" do
10
- PaperTrail.config.version_limit = 10
11
- widget = Widget.create
12
-
13
- 100.times do |i|
14
- widget.update_attributes(name: "Name #{i}")
15
- expect(Widget.find(widget.id).versions.count).to be <= 11
16
- # 11 versions = 10 updates + 1 create.
17
- end
18
- end
19
-
20
- it "deletes oldest versions, when the database returns them in a different order" do
21
- epoch = DateTime.new(2017, 1, 1)
22
-
23
- widget = Timecop.freeze(epoch) { Widget.create }
24
-
25
- # Sometimes a database will returns records in a different order than
26
- # they were inserted. That's hard to get the database to do, so we'll
27
- # just create them out-of-order:
28
- (1..5).to_a.shuffle.each do |n|
29
- Timecop.freeze(epoch + n.hours) do
30
- PaperTrail::Version.create!(
31
- item: widget,
32
- event: "update",
33
- object: { "id" => widget.id, "name" => "Name #{n}" }.to_yaml
34
- )
35
- end
36
- end
37
- expect(Widget.find(widget.id).versions.count).to eq(6) # 1 create + 5 updates
38
-
39
- # Now, we've recreated the scenario where we can accidentally clean up
40
- # the wrong versions. Re-enable the version_limit, and trigger the
41
- # clean-up:
42
- PaperTrail.config.version_limit = 3
43
- widget.versions.last.send(:enforce_version_limit!)
44
-
45
- # Verify that we have fewer versions:
46
- expect(widget.reload.versions.count).to eq(4) # 1 create + 4 updates
47
-
48
- # Exclude the create, because the create will return nil for `#reify`.
49
- last_names = widget.versions.not_creates.map(&:reify).map(&:name)
50
- expect(last_names).to eq(["Name 3", "Name 4", "Name 5"])
51
- # No matter what order the version records are returned it, we should
52
- # always keep the most-recent changes.
53
- end
54
- end
55
- end
@@ -1,96 +0,0 @@
1
- require "spec_helper"
2
-
3
- module PaperTrail
4
- ::RSpec.describe(Version, versioning: true) do
5
- describe ".creates" do
6
- it "returns only create events" do
7
- animal = Animal.create(name: "Foo")
8
- animal.update_attributes(name: "Bar")
9
- expect(described_class.creates.pluck(:event)).to eq(["create"])
10
- end
11
- end
12
-
13
- describe ".updates" do
14
- it "returns only update events" do
15
- animal = Animal.create
16
- animal.update_attributes(name: "Animal")
17
- expect(described_class.updates.pluck(:event)).to eq(["update"])
18
- end
19
- end
20
-
21
- describe ".destroys" do
22
- it "returns only destroy events" do
23
- animal = Animal.create
24
- animal.destroy
25
- expect(described_class.destroys.pluck(:event)).to eq(["destroy"])
26
- end
27
- end
28
-
29
- describe ".not_creates" do
30
- it "returns all versions except create events" do
31
- animal = Animal.create
32
- animal.update_attributes(name: "Animal")
33
- animal.destroy
34
- expect(
35
- described_class.not_creates.pluck(:event)
36
- ).to match_array(%w[update destroy])
37
- end
38
- end
39
-
40
- describe ".subsequent" do
41
- context "given a timestamp" do
42
- it "returns all versions that were created after the timestamp" do
43
- animal = Animal.create
44
- 2.times do
45
- animal.update_attributes(name: FFaker::Lorem.word)
46
- end
47
- value = described_class.subsequent(1.hour.ago, true)
48
- expect(value).to eq(animal.versions.to_a)
49
- expect(value.to_sql).to match(
50
- /ORDER BY #{described_class.arel_table[:created_at].asc.to_sql}/
51
- )
52
- end
53
- end
54
-
55
- context "given a Version" do
56
- it "grab the timestamp from the version and use that as the value" do
57
- animal = Animal.create
58
- 2.times do
59
- animal.update_attributes(name: FFaker::Lorem.word)
60
- end
61
- expect(described_class.subsequent(animal.versions.first)).to eq(
62
- animal.versions.to_a.drop(1)
63
- )
64
- end
65
- end
66
- end
67
-
68
- describe ".preceding" do
69
- context "given a timestamp" do
70
- it "returns all versions that were created before the timestamp" do
71
- animal = Animal.create
72
- 2.times do
73
- animal.update_attributes(name: FFaker::Lorem.word)
74
- end
75
- value = described_class.preceding(5.seconds.from_now, true)
76
- expect(value).to eq(animal.versions.reverse)
77
- expect(value.to_sql).to match(
78
- /ORDER BY #{described_class.arel_table[:created_at].desc.to_sql}/
79
- )
80
- end
81
- end
82
-
83
- context "given a Version" do
84
- it "grab the timestamp from the version and use that as the value" do
85
- animal = Animal.create
86
- 2.times do
87
- animal.update_attributes(name: FFaker::Lorem.word)
88
- end
89
- expect(described_class.preceding(animal.versions.last)).to eq(
90
- animal.versions.to_a.tap(&:pop).reverse
91
- )
92
- end
93
- end
94
- end
95
- end
96
- end