paper_trail 4.2.0 → 5.0.0
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.
- checksums.yaml +4 -4
 - data/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +28 -9
 - data/.github/ISSUE_TEMPLATE.md +13 -0
 - data/.gitignore +2 -1
 - data/.rubocop.yml +100 -0
 - data/.rubocop_todo.yml +14 -0
 - data/.travis.yml +8 -9
 - data/Appraisals +41 -0
 - data/CHANGELOG.md +49 -9
 - data/Gemfile +1 -1
 - data/README.md +130 -109
 - data/Rakefile +19 -19
 - data/doc/bug_report_template.rb +20 -14
 - data/gemfiles/ar3.gemfile +10 -53
 - data/gemfiles/ar4.gemfile +7 -0
 - data/gemfiles/ar5.gemfile +13 -0
 - data/lib/generators/paper_trail/install_generator.rb +26 -18
 - data/lib/generators/paper_trail/templates/add_object_changes_to_versions.rb +4 -2
 - data/lib/generators/paper_trail/templates/add_transaction_id_column_to_versions.rb +2 -0
 - data/lib/generators/paper_trail/templates/create_version_associations.rb +9 -4
 - data/lib/generators/paper_trail/templates/create_versions.rb +39 -5
 - data/lib/paper_trail.rb +169 -146
 - data/lib/paper_trail/attributes_serialization.rb +89 -17
 - data/lib/paper_trail/cleaner.rb +15 -9
 - data/lib/paper_trail/config.rb +28 -11
 - data/lib/paper_trail/frameworks/active_record.rb +4 -0
 - data/lib/paper_trail/frameworks/active_record/models/paper_trail/version.rb +5 -1
 - data/lib/paper_trail/frameworks/active_record/models/paper_trail/version_association.rb +6 -2
 - data/lib/paper_trail/frameworks/cucumber.rb +1 -0
 - data/lib/paper_trail/frameworks/rails.rb +2 -7
 - data/lib/paper_trail/frameworks/rails/controller.rb +29 -9
 - data/lib/paper_trail/frameworks/rails/engine.rb +7 -1
 - data/lib/paper_trail/frameworks/rspec.rb +5 -5
 - data/lib/paper_trail/frameworks/rspec/helpers.rb +3 -1
 - data/lib/paper_trail/frameworks/sinatra.rb +6 -4
 - data/lib/paper_trail/has_paper_trail.rb +199 -106
 - data/lib/paper_trail/record_history.rb +1 -3
 - data/lib/paper_trail/reifier.rb +297 -118
 - data/lib/paper_trail/serializers/json.rb +3 -3
 - data/lib/paper_trail/serializers/yaml.rb +27 -8
 - data/lib/paper_trail/version_association_concern.rb +3 -1
 - data/lib/paper_trail/version_concern.rb +75 -35
 - data/lib/paper_trail/version_number.rb +6 -9
 - data/paper_trail.gemspec +44 -51
 - data/spec/generators/install_generator_spec.rb +24 -25
 - data/spec/generators/paper_trail/templates/create_versions_spec.rb +51 -0
 - data/spec/models/animal_spec.rb +12 -12
 - data/spec/models/boolit_spec.rb +8 -8
 - data/spec/models/callback_modifier_spec.rb +47 -47
 - data/spec/models/car_spec.rb +13 -0
 - data/spec/models/fluxor_spec.rb +3 -3
 - data/spec/models/gadget_spec.rb +19 -19
 - data/spec/models/joined_version_spec.rb +3 -3
 - data/spec/models/json_version_spec.rb +23 -24
 - data/spec/models/kitchen/banana_spec.rb +3 -3
 - data/spec/models/not_on_update_spec.rb +7 -4
 - data/spec/models/post_with_status_spec.rb +13 -3
 - data/spec/models/skipper_spec.rb +10 -10
 - data/spec/models/thing_spec.rb +4 -4
 - data/spec/models/truck_spec.rb +5 -0
 - data/spec/models/vehicle_spec.rb +5 -0
 - data/spec/models/version_spec.rb +103 -59
 - data/spec/models/widget_spec.rb +82 -52
 - data/spec/modules/paper_trail_spec.rb +2 -2
 - data/spec/modules/version_concern_spec.rb +11 -12
 - data/spec/modules/version_number_spec.rb +2 -4
 - data/spec/paper_trail/config_spec.rb +10 -29
 - data/spec/paper_trail_spec.rb +16 -14
 - data/spec/rails_helper.rb +10 -9
 - data/spec/requests/articles_spec.rb +11 -7
 - data/spec/spec_helper.rb +41 -22
 - data/spec/support/alt_db_init.rb +8 -13
 - data/test/custom_json_serializer.rb +3 -3
 - data/test/dummy/Rakefile +2 -2
 - data/test/dummy/app/controllers/application_controller.rb +21 -8
 - data/test/dummy/app/controllers/articles_controller.rb +11 -8
 - data/test/dummy/app/controllers/widgets_controller.rb +13 -12
 - data/test/dummy/app/models/animal.rb +1 -1
 - data/test/dummy/app/models/article.rb +19 -11
 - data/test/dummy/app/models/authorship.rb +1 -1
 - data/test/dummy/app/models/bar_habtm.rb +4 -0
 - data/test/dummy/app/models/book.rb +4 -4
 - data/test/dummy/app/models/boolit.rb +1 -1
 - data/test/dummy/app/models/callback_modifier.rb +6 -6
 - data/test/dummy/app/models/car.rb +3 -0
 - data/test/dummy/app/models/chapter.rb +4 -4
 - data/test/dummy/app/models/customer.rb +1 -1
 - data/test/dummy/app/models/document.rb +2 -2
 - data/test/dummy/app/models/editor.rb +1 -1
 - data/test/dummy/app/models/foo_habtm.rb +4 -0
 - data/test/dummy/app/models/fruit.rb +2 -2
 - data/test/dummy/app/models/gadget.rb +1 -1
 - data/test/dummy/app/models/kitchen/banana.rb +1 -1
 - data/test/dummy/app/models/legacy_widget.rb +2 -2
 - data/test/dummy/app/models/line_item.rb +1 -1
 - data/test/dummy/app/models/not_on_update.rb +1 -1
 - data/test/dummy/app/models/person.rb +6 -6
 - data/test/dummy/app/models/post.rb +1 -1
 - data/test/dummy/app/models/post_with_status.rb +1 -1
 - data/test/dummy/app/models/quotation.rb +1 -1
 - data/test/dummy/app/models/section.rb +1 -1
 - data/test/dummy/app/models/skipper.rb +2 -2
 - data/test/dummy/app/models/song.rb +13 -4
 - data/test/dummy/app/models/thing.rb +2 -2
 - data/test/dummy/app/models/translation.rb +2 -2
 - data/test/dummy/app/models/truck.rb +4 -0
 - data/test/dummy/app/models/vehicle.rb +4 -0
 - data/test/dummy/app/models/whatchamajigger.rb +1 -1
 - data/test/dummy/app/models/widget.rb +7 -6
 - data/test/dummy/app/versions/joined_version.rb +4 -3
 - data/test/dummy/app/versions/json_version.rb +1 -1
 - data/test/dummy/app/versions/kitchen/banana_version.rb +1 -1
 - data/test/dummy/app/versions/post_version.rb +2 -2
 - data/test/dummy/config.ru +1 -1
 - data/test/dummy/config/application.rb +20 -9
 - data/test/dummy/config/boot.rb +5 -5
 - data/test/dummy/config/environment.rb +1 -1
 - data/test/dummy/config/environments/development.rb +4 -3
 - data/test/dummy/config/environments/production.rb +3 -2
 - data/test/dummy/config/environments/test.rb +15 -5
 - data/test/dummy/config/initializers/backtrace_silencers.rb +4 -2
 - data/test/dummy/config/initializers/paper_trail.rb +1 -2
 - data/test/dummy/config/initializers/secret_token.rb +3 -1
 - data/test/dummy/config/initializers/session_store.rb +1 -1
 - data/test/dummy/config/routes.rb +2 -2
 - data/test/dummy/db/migrate/20110208155312_set_up_test_tables.rb +120 -74
 - data/test/dummy/db/schema.rb +29 -6
 - data/test/dummy/script/rails +6 -4
 - data/test/functional/controller_test.rb +34 -35
 - data/test/functional/enabled_for_controller_test.rb +6 -7
 - data/test/functional/modular_sinatra_test.rb +43 -38
 - data/test/functional/sinatra_test.rb +49 -40
 - data/test/functional/thread_safety_test.rb +4 -6
 - data/test/paper_trail_test.rb +15 -14
 - data/test/test_helper.rb +68 -44
 - data/test/time_travel_helper.rb +1 -15
 - data/test/unit/associations_test.rb +517 -251
 - data/test/unit/cleaner_test.rb +66 -60
 - data/test/unit/inheritance_column_test.rb +17 -17
 - data/test/unit/model_test.rb +611 -504
 - data/test/unit/protected_attrs_test.rb +16 -12
 - data/test/unit/serializer_test.rb +44 -43
 - data/test/unit/serializers/json_test.rb +17 -18
 - data/test/unit/serializers/mixin_json_test.rb +15 -14
 - data/test/unit/serializers/mixin_yaml_test.rb +20 -16
 - data/test/unit/serializers/yaml_test.rb +12 -13
 - data/test/unit/timestamp_test.rb +10 -12
 - data/test/unit/version_test.rb +7 -7
 - metadata +92 -40
 
    
        data/test/unit/cleaner_test.rb
    CHANGED
    
    | 
         @@ -1,71 +1,71 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            require "test_helper"
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class PaperTrailCleanerTest < ActiveSupport::TestCase
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
4 
     | 
    
         
             
              def populate_db!
         
     | 
| 
       6 
5 
     | 
    
         
             
                @animals = [@animal = Animal.new, @dog = Dog.new, @cat = Cat.new]
         
     | 
| 
       7 
6 
     | 
    
         
             
                @animals.each do |animal|
         
     | 
| 
       8 
     | 
    
         
            -
                  3.times { animal.update_attribute(:name,  
     | 
| 
      
 7 
     | 
    
         
            +
                  3.times { animal.update_attribute(:name, FFaker::Name.name) }
         
     | 
| 
       9 
8 
     | 
    
         
             
                end
         
     | 
| 
       10 
9 
     | 
    
         
             
              end
         
     | 
| 
       11 
10 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
              context  
     | 
| 
       13 
     | 
    
         
            -
                setup {  
     | 
| 
      
 11 
     | 
    
         
            +
              context "`clean_versions!` method" do
         
     | 
| 
      
 12 
     | 
    
         
            +
                setup { populate_db! }
         
     | 
| 
       14 
13 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                should  
     | 
| 
      
 14 
     | 
    
         
            +
                should "Baseline" do
         
     | 
| 
       16 
15 
     | 
    
         
             
                  assert_equal 9, PaperTrail::Version.count
         
     | 
| 
       17 
16 
     | 
    
         
             
                  @animals.each { |animal| assert_equal 3, animal.versions.size }
         
     | 
| 
       18 
17 
     | 
    
         
             
                end
         
     | 
| 
       19 
18 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
                should  
     | 
| 
      
 19 
     | 
    
         
            +
                should "be extended by `PaperTrail` module" do
         
     | 
| 
       21 
20 
     | 
    
         
             
                  assert_respond_to PaperTrail, :clean_versions!
         
     | 
| 
       22 
21 
     | 
    
         
             
                end
         
     | 
| 
       23 
22 
     | 
    
         | 
| 
       24 
     | 
    
         
            -
                context  
     | 
| 
       25 
     | 
    
         
            -
                  should  
     | 
| 
      
 23 
     | 
    
         
            +
                context "No options provided" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                  should "removes extra versions for each item" do
         
     | 
| 
       26 
25 
     | 
    
         
             
                    PaperTrail.clean_versions!
         
     | 
| 
       27 
26 
     | 
    
         
             
                    assert_equal 3, PaperTrail::Version.count
         
     | 
| 
       28 
27 
     | 
    
         
             
                    @animals.each { |animal| assert_equal 1, animal.versions.size }
         
     | 
| 
       29 
28 
     | 
    
         
             
                  end
         
     | 
| 
       30 
29 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
                  should  
     | 
| 
       32 
     | 
    
         
            -
                     
     | 
| 
      
 30 
     | 
    
         
            +
                  should "removes the earliest version(s)" do
         
     | 
| 
      
 31 
     | 
    
         
            +
                    before = @animals.map { |animal| animal.versions.last.reify.name }
         
     | 
| 
       33 
32 
     | 
    
         
             
                    PaperTrail.clean_versions!
         
     | 
| 
       34 
     | 
    
         
            -
                     
     | 
| 
      
 33 
     | 
    
         
            +
                    after = @animals.map { |animal| animal.versions.last.reify.name }
         
     | 
| 
      
 34 
     | 
    
         
            +
                    assert_equal before, after
         
     | 
| 
       35 
35 
     | 
    
         
             
                  end
         
     | 
| 
       36 
36 
     | 
    
         
             
                end
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
       38 
     | 
    
         
            -
                context  
     | 
| 
       39 
     | 
    
         
            -
                  should  
     | 
| 
       40 
     | 
    
         
            -
                    PaperTrail.clean_versions!(: 
     | 
| 
      
 38 
     | 
    
         
            +
                context "`:keeping` option" do
         
     | 
| 
      
 39 
     | 
    
         
            +
                  should "modifies the number of versions ommitted from destruction" do
         
     | 
| 
      
 40 
     | 
    
         
            +
                    PaperTrail.clean_versions!(keeping: 2)
         
     | 
| 
       41 
41 
     | 
    
         
             
                    assert_equal 6, PaperTrail::Version.all.count
         
     | 
| 
       42 
42 
     | 
    
         
             
                    @animals.each { |animal| assert_equal 2, animal.versions.size }
         
     | 
| 
       43 
43 
     | 
    
         
             
                  end
         
     | 
| 
       44 
44 
     | 
    
         
             
                end
         
     | 
| 
       45 
45 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
                context  
     | 
| 
      
 46 
     | 
    
         
            +
                context "`:date` option" do
         
     | 
| 
       47 
47 
     | 
    
         
             
                  setup do
         
     | 
| 
       48 
48 
     | 
    
         
             
                    @animal.versions.each { |ver| ver.update_attribute(:created_at, ver.created_at - 1.day) }
         
     | 
| 
       49 
49 
     | 
    
         
             
                    @date = @animal.versions.first.created_at.to_date
         
     | 
| 
       50 
     | 
    
         
            -
                    @animal.update_attribute(:name,  
     | 
| 
      
 50 
     | 
    
         
            +
                    @animal.update_attribute(:name, FFaker::Name.name)
         
     | 
| 
       51 
51 
     | 
    
         
             
                  end
         
     | 
| 
       52 
52 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
                  should  
     | 
| 
      
 53 
     | 
    
         
            +
                  should "restrict the versions destroyed to those that were created on the date provided" do
         
     | 
| 
       54 
54 
     | 
    
         
             
                    assert_equal 10, PaperTrail::Version.count
         
     | 
| 
       55 
55 
     | 
    
         
             
                    assert_equal 4, @animal.versions.size
         
     | 
| 
       56 
56 
     | 
    
         
             
                    assert_equal 3, @animal.versions_between(@date, @date + 1.day).size
         
     | 
| 
       57 
     | 
    
         
            -
                    PaperTrail.clean_versions!(: 
     | 
| 
      
 57 
     | 
    
         
            +
                    PaperTrail.clean_versions!(date: @date)
         
     | 
| 
       58 
58 
     | 
    
         
             
                    assert_equal 8, PaperTrail::Version.count
         
     | 
| 
       59 
     | 
    
         
            -
                    assert_equal 2, @animal.versions 
     | 
| 
      
 59 
     | 
    
         
            +
                    assert_equal 2, @animal.versions.reload.size
         
     | 
| 
       60 
60 
     | 
    
         
             
                    assert_equal @date, @animal.versions.first.created_at.to_date
         
     | 
| 
       61 
61 
     | 
    
         
             
                    assert_not_same @date, @animal.versions.last.created_at.to_date
         
     | 
| 
       62 
62 
     | 
    
         
             
                  end
         
     | 
| 
       63 
63 
     | 
    
         
             
                end
         
     | 
| 
       64 
64 
     | 
    
         | 
| 
       65 
     | 
    
         
            -
                context  
     | 
| 
       66 
     | 
    
         
            -
                  context  
     | 
| 
       67 
     | 
    
         
            -
                    should  
     | 
| 
       68 
     | 
    
         
            -
                      PaperTrail.clean_versions!(: 
     | 
| 
      
 65 
     | 
    
         
            +
                context "`:item_id` option" do
         
     | 
| 
      
 66 
     | 
    
         
            +
                  context "single ID received" do
         
     | 
| 
      
 67 
     | 
    
         
            +
                    should "restrict the versions destroyed to the versions for the Item with that ID" do
         
     | 
| 
      
 68 
     | 
    
         
            +
                      PaperTrail.clean_versions!(item_id: @animal.id)
         
     | 
| 
       69 
69 
     | 
    
         
             
                      assert_equal 1, @animal.versions.size
         
     | 
| 
       70 
70 
     | 
    
         
             
                      assert_equal 7, PaperTrail::Version.count
         
     | 
| 
       71 
71 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -73,7 +73,7 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase 
     | 
|
| 
       73 
73 
     | 
    
         | 
| 
       74 
74 
     | 
    
         
             
                  context "collection of ID's received" do
         
     | 
| 
       75 
75 
     | 
    
         
             
                    should "restrict the versions destroyed to the versions for the Item with those ID's" do
         
     | 
| 
       76 
     | 
    
         
            -
                      PaperTrail.clean_versions!(: 
     | 
| 
      
 76 
     | 
    
         
            +
                      PaperTrail.clean_versions!(item_id: [@animal.id, @dog.id])
         
     | 
| 
       77 
77 
     | 
    
         
             
                      assert_equal 1, @animal.versions.size
         
     | 
| 
       78 
78 
     | 
    
         
             
                      assert_equal 1, @dog.versions.size
         
     | 
| 
       79 
79 
     | 
    
         
             
                      assert_equal 5, PaperTrail::Version.count
         
     | 
| 
         @@ -81,72 +81,78 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase 
     | 
|
| 
       81 
81 
     | 
    
         
             
                  end
         
     | 
| 
       82 
82 
     | 
    
         
             
                end
         
     | 
| 
       83 
83 
     | 
    
         | 
| 
       84 
     | 
    
         
            -
                context  
     | 
| 
       85 
     | 
    
         
            -
                  context  
     | 
| 
      
 84 
     | 
    
         
            +
                context "options combinations" do # additional tests to cover combinations of options
         
     | 
| 
      
 85 
     | 
    
         
            +
                  context "`:date`" do
         
     | 
| 
       86 
86 
     | 
    
         
             
                    setup do
         
     | 
| 
       87 
87 
     | 
    
         
             
                      [@animal, @dog].each do |animal|
         
     | 
| 
       88 
88 
     | 
    
         
             
                        animal.versions.each { |ver| ver.update_attribute(:created_at, ver.created_at - 1.day) }
         
     | 
| 
       89 
     | 
    
         
            -
                        animal.update_attribute(:name,  
     | 
| 
      
 89 
     | 
    
         
            +
                        animal.update_attribute(:name, FFaker::Name.name)
         
     | 
| 
       90 
90 
     | 
    
         
             
                      end
         
     | 
| 
       91 
91 
     | 
    
         
             
                      @date = @animal.versions.first.created_at.to_date
         
     | 
| 
       92 
92 
     | 
    
         
             
                    end
         
     | 
| 
       93 
93 
     | 
    
         | 
| 
       94 
     | 
    
         
            -
                    should  
     | 
| 
      
 94 
     | 
    
         
            +
                    should "Baseline" do
         
     | 
| 
       95 
95 
     | 
    
         
             
                      assert_equal 11, PaperTrail::Version.count
         
     | 
| 
       96 
96 
     | 
    
         
             
                      [@animal, @dog].each do |animal|
         
     | 
| 
       97 
97 
     | 
    
         
             
                        assert_equal 4, animal.versions.size
         
     | 
| 
       98 
     | 
    
         
            -
                        assert_equal 3, animal.versions.between(@date, @date+1.day).size
         
     | 
| 
      
 98 
     | 
    
         
            +
                        assert_equal 3, animal.versions.between(@date, @date + 1.day).size
         
     | 
| 
       99 
99 
     | 
    
         
             
                      end
         
     | 
| 
       100 
100 
     | 
    
         
             
                    end
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
                    context  
     | 
| 
       103 
     | 
    
         
            -
                      should  
     | 
| 
       104 
     | 
    
         
            -
                        PaperTrail.clean_versions!(: 
     | 
| 
      
 102 
     | 
    
         
            +
                    context "and `:keeping`" do
         
     | 
| 
      
 103 
     | 
    
         
            +
                      should "restrict cleaning properly" do
         
     | 
| 
      
 104 
     | 
    
         
            +
                        PaperTrail.clean_versions!(date: @date, keeping: 2)
         
     | 
| 
       105 
105 
     | 
    
         
             
                        [@animal, @dog].each do |animal|
         
     | 
| 
       106 
     | 
    
         
            -
                           
     | 
| 
      
 106 
     | 
    
         
            +
                          # reload the association to pick up the destructions made by the `Cleaner`
         
     | 
| 
      
 107 
     | 
    
         
            +
                          animal.versions.reload
         
     | 
| 
       107 
108 
     | 
    
         
             
                          assert_equal 3, animal.versions.size
         
     | 
| 
       108 
     | 
    
         
            -
                          assert_equal 2, animal.versions.between(@date, @date+1.day).size
         
     | 
| 
      
 109 
     | 
    
         
            +
                          assert_equal 2, animal.versions.between(@date, @date + 1.day).size
         
     | 
| 
       109 
110 
     | 
    
         
             
                        end
         
     | 
| 
       110 
     | 
    
         
            -
                         
     | 
| 
      
 111 
     | 
    
         
            +
                        # ensure that the versions for the `@cat` instance wasn't touched
         
     | 
| 
      
 112 
     | 
    
         
            +
                        assert_equal 9, PaperTrail::Version.count
         
     | 
| 
       111 
113 
     | 
    
         
             
                      end
         
     | 
| 
       112 
114 
     | 
    
         
             
                    end
         
     | 
| 
       113 
115 
     | 
    
         | 
| 
       114 
     | 
    
         
            -
                    context  
     | 
| 
       115 
     | 
    
         
            -
                      should  
     | 
| 
       116 
     | 
    
         
            -
                        PaperTrail.clean_versions!(: 
     | 
| 
       117 
     | 
    
         
            -
                         
     | 
| 
      
 116 
     | 
    
         
            +
                    context "and `:item_id`" do
         
     | 
| 
      
 117 
     | 
    
         
            +
                      should "restrict cleaning properly" do
         
     | 
| 
      
 118 
     | 
    
         
            +
                        PaperTrail.clean_versions!(date: @date, item_id: @dog.id)
         
     | 
| 
      
 119 
     | 
    
         
            +
                        # reload the association to pick up the destructions made by the `Cleaner`
         
     | 
| 
      
 120 
     | 
    
         
            +
                        @dog.versions.reload
         
     | 
| 
       118 
121 
     | 
    
         
             
                        assert_equal 2, @dog.versions.size
         
     | 
| 
       119 
     | 
    
         
            -
                        assert_equal 1, @dog.versions.between(@date, @date+1.day).size
         
     | 
| 
       120 
     | 
    
         
            -
                         
     | 
| 
      
 122 
     | 
    
         
            +
                        assert_equal 1, @dog.versions.between(@date, @date + 1.day).size
         
     | 
| 
      
 123 
     | 
    
         
            +
                        # ensure the versions for other animals besides `@animal` weren't touched
         
     | 
| 
      
 124 
     | 
    
         
            +
                        assert_equal 9, PaperTrail::Version.count
         
     | 
| 
       121 
125 
     | 
    
         
             
                      end
         
     | 
| 
       122 
126 
     | 
    
         
             
                    end
         
     | 
| 
       123 
127 
     | 
    
         | 
| 
       124 
     | 
    
         
            -
                    context  
     | 
| 
       125 
     | 
    
         
            -
                      should  
     | 
| 
       126 
     | 
    
         
            -
                        PaperTrail.clean_versions!(: 
     | 
| 
       127 
     | 
    
         
            -
                         
     | 
| 
      
 128 
     | 
    
         
            +
                    context ", `:item_id`, and `:keeping`" do
         
     | 
| 
      
 129 
     | 
    
         
            +
                      should "restrict cleaning properly" do
         
     | 
| 
      
 130 
     | 
    
         
            +
                        PaperTrail.clean_versions!(date: @date, item_id: @dog.id, keeping: 2)
         
     | 
| 
      
 131 
     | 
    
         
            +
                        # reload the association to pick up the destructions made by the `Cleaner`
         
     | 
| 
      
 132 
     | 
    
         
            +
                        @dog.versions.reload
         
     | 
| 
       128 
133 
     | 
    
         
             
                        assert_equal 3, @dog.versions.size
         
     | 
| 
       129 
     | 
    
         
            -
                        assert_equal 2, @dog.versions.between(@date, @date+1.day).size
         
     | 
| 
       130 
     | 
    
         
            -
                         
     | 
| 
      
 134 
     | 
    
         
            +
                        assert_equal 2, @dog.versions.between(@date, @date + 1.day).size
         
     | 
| 
      
 135 
     | 
    
         
            +
                        # ensure the versions for other animals besides `@animal` weren't touched
         
     | 
| 
      
 136 
     | 
    
         
            +
                        assert_equal 10, PaperTrail::Version.count
         
     | 
| 
       131 
137 
     | 
    
         
             
                      end
         
     | 
| 
       132 
138 
     | 
    
         
             
                    end
         
     | 
| 
       133 
139 
     | 
    
         
             
                  end
         
     | 
| 
       134 
140 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
                  context  
     | 
| 
       136 
     | 
    
         
            -
                    should  
     | 
| 
       137 
     | 
    
         
            -
                      PaperTrail.clean_versions!(: 
     | 
| 
      
 141 
     | 
    
         
            +
                  context "`:keeping` and `:item_id`" do
         
     | 
| 
      
 142 
     | 
    
         
            +
                    should "restrict cleaning properly" do
         
     | 
| 
      
 143 
     | 
    
         
            +
                      PaperTrail.clean_versions!(keeping: 2, item_id: @animal.id)
         
     | 
| 
       138 
144 
     | 
    
         
             
                      assert_equal 2, @animal.versions.size
         
     | 
| 
       139 
     | 
    
         
            -
                       
     | 
| 
      
 145 
     | 
    
         
            +
                      # ensure the versions for other animals besides `@animal` weren't touched
         
     | 
| 
      
 146 
     | 
    
         
            +
                      assert_equal 8, PaperTrail::Version.count
         
     | 
| 
       140 
147 
     | 
    
         
             
                    end
         
     | 
| 
       141 
148 
     | 
    
         
             
                  end
         
     | 
| 
       142 
149 
     | 
    
         
             
                end
         
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
150 
     | 
    
         
             
              end # clean_versions! method
         
     | 
| 
       145 
151 
     | 
    
         | 
| 
       146 
152 
     | 
    
         
             
              context "Custom timestamp field" do
         
     | 
| 
       147 
153 
     | 
    
         
             
                setup do
         
     | 
| 
       148 
154 
     | 
    
         
             
                  change_schema
         
     | 
| 
       149 
     | 
    
         
            -
                   
     | 
| 
      
 155 
     | 
    
         
            +
                  populate_db!
         
     | 
| 
       150 
156 
     | 
    
         
             
                  # now mess with the timestamps
         
     | 
| 
       151 
157 
     | 
    
         
             
                  @animals.each do |animal|
         
     | 
| 
       152 
158 
     | 
    
         
             
                    animal.versions.reverse.each_with_index do |version, index|
         
     | 
| 
         @@ -154,7 +160,7 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase 
     | 
|
| 
       154 
160 
     | 
    
         
             
                    end
         
     | 
| 
       155 
161 
     | 
    
         
             
                  end
         
     | 
| 
       156 
162 
     | 
    
         
             
                  PaperTrail.timestamp_field = :custom_created_at
         
     | 
| 
       157 
     | 
    
         
            -
                  @animals.map { |a| a.versions 
     | 
| 
      
 163 
     | 
    
         
            +
                  @animals.map { |a| a.versions.reload } # reload the `versions` association for each animal
         
     | 
| 
       158 
164 
     | 
    
         
             
                end
         
     | 
| 
       159 
165 
     | 
    
         | 
| 
       160 
166 
     | 
    
         
             
                teardown do
         
     | 
| 
         @@ -162,18 +168,18 @@ class PaperTrailCleanerTest < ActiveSupport::TestCase 
     | 
|
| 
       162 
168 
     | 
    
         
             
                  restore_schema
         
     | 
| 
       163 
169 
     | 
    
         
             
                end
         
     | 
| 
       164 
170 
     | 
    
         | 
| 
       165 
     | 
    
         
            -
                should  
     | 
| 
      
 171 
     | 
    
         
            +
                should "Baseline" do
         
     | 
| 
       166 
172 
     | 
    
         
             
                  assert_equal 9, PaperTrail::Version.count
         
     | 
| 
       167 
173 
     | 
    
         
             
                  @animals.each do |animal|
         
     | 
| 
       168 
174 
     | 
    
         
             
                    assert_equal 3, animal.versions.size
         
     | 
| 
       169 
     | 
    
         
            -
                    animal.versions.each_cons(2) do |a,b|
         
     | 
| 
       170 
     | 
    
         
            -
                      a.created_at.to_date  
     | 
| 
       171 
     | 
    
         
            -
                      a.custom_created_at.to_date  
     | 
| 
      
 175 
     | 
    
         
            +
                    animal.versions.each_cons(2) do |a, b|
         
     | 
| 
      
 176 
     | 
    
         
            +
                      assert_equal a.created_at.to_date, b.created_at.to_date
         
     | 
| 
      
 177 
     | 
    
         
            +
                      assert_not_equal a.custom_created_at.to_date, b.custom_created_at.to_date
         
     | 
| 
       172 
178 
     | 
    
         
             
                    end
         
     | 
| 
       173 
179 
     | 
    
         
             
                  end
         
     | 
| 
       174 
180 
     | 
    
         
             
                end
         
     | 
| 
       175 
181 
     | 
    
         | 
| 
       176 
     | 
    
         
            -
                should  
     | 
| 
      
 182 
     | 
    
         
            +
                should "group by `PaperTrail.timestamp_field` when seperating the versions by date to clean" do
         
     | 
| 
       177 
183 
     | 
    
         
             
                  assert_equal 9, PaperTrail::Version.count
         
     | 
| 
       178 
184 
     | 
    
         
             
                  PaperTrail.clean_versions!
         
     | 
| 
       179 
185 
     | 
    
         
             
                  assert_equal 9, PaperTrail::Version.count
         
     | 
| 
         @@ -1,43 +1,43 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            require "test_helper"
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class InheritanceColumnTest < ActiveSupport::TestCase
         
     | 
| 
       4 
     | 
    
         
            -
              context  
     | 
| 
      
 4 
     | 
    
         
            +
              context "STI models" do
         
     | 
| 
       5 
5 
     | 
    
         
             
                setup do
         
     | 
| 
       6 
     | 
    
         
            -
                  @animal = Animal.create : 
     | 
| 
       7 
     | 
    
         
            -
                  @animal.update_attributes : 
     | 
| 
       8 
     | 
    
         
            -
                  @animal.update_attributes : 
     | 
| 
      
 6 
     | 
    
         
            +
                  @animal = Animal.create name: "Animal"
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @animal.update_attributes name: "Animal from the Muppets"
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @animal.update_attributes name: "Animal Muppet"
         
     | 
| 
       9 
9 
     | 
    
         
             
                  @animal.destroy
         
     | 
| 
       10 
10 
     | 
    
         | 
| 
       11 
     | 
    
         
            -
                  @dog = Dog.create : 
     | 
| 
       12 
     | 
    
         
            -
                  @dog.update_attributes : 
     | 
| 
       13 
     | 
    
         
            -
                  @dog.update_attributes : 
     | 
| 
      
 11 
     | 
    
         
            +
                  @dog = Dog.create name: "Snoopy"
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @dog.update_attributes name: "Scooby"
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @dog.update_attributes name: "Scooby Doo"
         
     | 
| 
       14 
14 
     | 
    
         
             
                  @dog.destroy
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
     | 
    
         
            -
                  @cat = Cat.create : 
     | 
| 
       17 
     | 
    
         
            -
                  @cat.update_attributes : 
     | 
| 
       18 
     | 
    
         
            -
                  @cat.update_attributes : 
     | 
| 
      
 16 
     | 
    
         
            +
                  @cat = Cat.create name: "Garfield"
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @cat.update_attributes name: "Garfield (I hate Mondays)"
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @cat.update_attributes name: "Garfield The Cat"
         
     | 
| 
       19 
19 
     | 
    
         
             
                  @cat.destroy
         
     | 
| 
       20 
20 
     | 
    
         
             
                end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                should  
     | 
| 
      
 22 
     | 
    
         
            +
                should "work with custom STI inheritance column" do
         
     | 
| 
       23 
23 
     | 
    
         
             
                  assert_equal 12, PaperTrail::Version.count
         
     | 
| 
       24 
24 
     | 
    
         
             
                  assert_equal 4, @animal.versions.count
         
     | 
| 
       25 
25 
     | 
    
         
             
                  assert_nil @animal.versions.first.reify
         
     | 
| 
       26 
     | 
    
         
            -
                  @animal.versions[1..-1].each { |v| assert_equal  
     | 
| 
      
 26 
     | 
    
         
            +
                  @animal.versions[1..-1].each { |v| assert_equal "Animal", v.reify.class.name }
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
                  # For some reason `@dog.versions` doesn't include the final `destroy` version.
         
     | 
| 
       29 
29 
     | 
    
         
             
                  # Neither do `@dog.versions.scoped` nor `@dog.versions(true)` nor `@dog.versions.reload`.
         
     | 
| 
       30 
     | 
    
         
            -
                  dog_versions = PaperTrail::Version.where(: 
     | 
| 
      
 30 
     | 
    
         
            +
                  dog_versions = PaperTrail::Version.where(item_id: @dog.id).
         
     | 
| 
       31 
31 
     | 
    
         
             
                    order(PaperTrail.timestamp_field)
         
     | 
| 
       32 
32 
     | 
    
         
             
                  assert_equal 4, dog_versions.count
         
     | 
| 
       33 
33 
     | 
    
         
             
                  assert_nil dog_versions.first.reify
         
     | 
| 
       34 
     | 
    
         
            -
                  assert_equal %w 
     | 
| 
      
 34 
     | 
    
         
            +
                  assert_equal %w(NilClass Dog Dog Dog), dog_versions.map { |v| v.reify.class.name }
         
     | 
| 
       35 
35 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
                  cat_versions = PaperTrail::Version.where(: 
     | 
| 
      
 36 
     | 
    
         
            +
                  cat_versions = PaperTrail::Version.where(item_id: @cat.id).
         
     | 
| 
       37 
37 
     | 
    
         
             
                    order(PaperTrail.timestamp_field)
         
     | 
| 
       38 
38 
     | 
    
         
             
                  assert_equal 4, cat_versions.count
         
     | 
| 
       39 
39 
     | 
    
         
             
                  assert_nil cat_versions.first.reify
         
     | 
| 
       40 
     | 
    
         
            -
                  assert_equal %w 
     | 
| 
      
 40 
     | 
    
         
            +
                  assert_equal %w(NilClass Cat Cat Cat), cat_versions.map { |v| v.reify.class.name }
         
     | 
| 
       41 
41 
     | 
    
         
             
                end
         
     | 
| 
       42 
42 
     | 
    
         
             
              end
         
     | 
| 
       43 
43 
     | 
    
         
             
            end
         
     | 
    
        data/test/unit/model_test.rb
    CHANGED
    
    | 
         @@ -1,109 +1,152 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require  
     | 
| 
       2 
     | 
    
         
            -
            require  
     | 
| 
      
 1 
     | 
    
         
            +
            require "test_helper"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "time_travel_helper"
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            class HasPaperTrailModelTest < ActiveSupport::TestCase
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
5 
     | 
    
         
             
              context "A record with defined 'only' and 'ignore' attributes" do
         
     | 
| 
       7 
6 
     | 
    
         
             
                setup { @article = Article.create }
         
     | 
| 
       8 
     | 
    
         
            -
                should 'creation should change the number of versions' do assert_equal(1, PaperTrail::Version.count) end
         
     | 
| 
       9 
7 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
                 
     | 
| 
       11 
     | 
    
         
            -
                   
     | 
| 
       12 
     | 
    
         
            -
                  should 'not change the number of versions' do assert_equal(1, PaperTrail::Version.count) end
         
     | 
| 
      
 8 
     | 
    
         
            +
                should "creation should change the number of versions" do
         
     | 
| 
      
 9 
     | 
    
         
            +
                  assert_equal(1, PaperTrail::Version.count)
         
     | 
| 
       13 
10 
     | 
    
         
             
                end
         
     | 
| 
       14 
11 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                context  
     | 
| 
       16 
     | 
    
         
            -
                   
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
                context "which updates an ignored column" do
         
     | 
| 
      
 13 
     | 
    
         
            +
                  should "not change the number of versions" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                    @article.update_attributes title: "My first title"
         
     | 
| 
      
 15 
     | 
    
         
            +
                    assert_equal(1, PaperTrail::Version.count)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
       18 
17 
     | 
    
         
             
                end
         
     | 
| 
       19 
18 
     | 
    
         | 
| 
       20 
     | 
    
         
            -
                context  
     | 
| 
       21 
     | 
    
         
            -
                   
     | 
| 
       22 
     | 
    
         
            -
             
     | 
| 
      
 19 
     | 
    
         
            +
                context "which updates an ignored column with truly Proc" do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  should "not change the number of versions" do
         
     | 
| 
      
 21 
     | 
    
         
            +
                    @article.update_attributes abstract: "ignore abstract"
         
     | 
| 
      
 22 
     | 
    
         
            +
                    assert_equal(1, PaperTrail::Version.count)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  end
         
     | 
| 
       23 
24 
     | 
    
         
             
                end
         
     | 
| 
       24 
25 
     | 
    
         | 
| 
       25 
     | 
    
         
            -
                context  
     | 
| 
       26 
     | 
    
         
            -
                   
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
     | 
    
         
            -
                   
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
      
 26 
     | 
    
         
            +
                context "which updates an ignored column with falsy Proc" do
         
     | 
| 
      
 27 
     | 
    
         
            +
                  should "change the number of versions" do
         
     | 
| 
      
 28 
     | 
    
         
            +
                    @article.update_attributes abstract: "do not ignore abstract!"
         
     | 
| 
      
 29 
     | 
    
         
            +
                    assert_equal(2, PaperTrail::Version.count)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                context "which updates an ignored column, ignored with truly Proc and a selected column" do
         
     | 
| 
      
 34 
     | 
    
         
            +
                  setup do
         
     | 
| 
      
 35 
     | 
    
         
            +
                    @article.update_attributes(
         
     | 
| 
      
 36 
     | 
    
         
            +
                      title: "My first title",
         
     | 
| 
      
 37 
     | 
    
         
            +
                      content: "Some text here.",
         
     | 
| 
      
 38 
     | 
    
         
            +
                      abstract: "ignore abstract"
         
     | 
| 
      
 39 
     | 
    
         
            +
                    )
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  should "change the number of versions" do
         
     | 
| 
      
 43 
     | 
    
         
            +
                    assert_equal(2, PaperTrail::Version.count)
         
     | 
| 
      
 44 
     | 
    
         
            +
                  end
         
     | 
| 
       31 
45 
     | 
    
         | 
| 
       32 
46 
     | 
    
         
             
                  should "show the new version in the model's `versions` association" do
         
     | 
| 
       33 
47 
     | 
    
         
             
                    assert_equal(2, @article.versions.size)
         
     | 
| 
       34 
48 
     | 
    
         
             
                  end
         
     | 
| 
       35 
49 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
                  should  
     | 
| 
       37 
     | 
    
         
            -
                     
     | 
| 
      
 50 
     | 
    
         
            +
                  should "have stored only non-ignored attributes" do
         
     | 
| 
      
 51 
     | 
    
         
            +
                    expected = { "content" => [nil, "Some text here."] }
         
     | 
| 
      
 52 
     | 
    
         
            +
                    assert_equal expected, @article.versions.last.changeset
         
     | 
| 
       38 
53 
     | 
    
         
             
                  end
         
     | 
| 
       39 
54 
     | 
    
         
             
                end
         
     | 
| 
       40 
55 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
                context  
     | 
| 
       42 
     | 
    
         
            -
                  setup  
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
             
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
      
 56 
     | 
    
         
            +
                context "which updates an ignored column, ignored with falsy Proc and a selected column" do
         
     | 
| 
      
 57 
     | 
    
         
            +
                  setup do
         
     | 
| 
      
 58 
     | 
    
         
            +
                    @article.update_attributes(
         
     | 
| 
      
 59 
     | 
    
         
            +
                      title: "My first title",
         
     | 
| 
      
 60 
     | 
    
         
            +
                      content: "Some text here.",
         
     | 
| 
      
 61 
     | 
    
         
            +
                      abstract: "do not ignore abstract"
         
     | 
| 
      
 62 
     | 
    
         
            +
                    )
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  should "change the number of versions" do
         
     | 
| 
      
 66 
     | 
    
         
            +
                    assert_equal(2, PaperTrail::Version.count)
         
     | 
| 
      
 67 
     | 
    
         
            +
                  end
         
     | 
| 
       47 
68 
     | 
    
         | 
| 
       48 
69 
     | 
    
         
             
                  should "show the new version in the model's `versions` association" do
         
     | 
| 
       49 
70 
     | 
    
         
             
                    assert_equal(2, @article.versions.size)
         
     | 
| 
       50 
71 
     | 
    
         
             
                  end
         
     | 
| 
       51 
72 
     | 
    
         | 
| 
       52 
     | 
    
         
            -
                  should  
     | 
| 
       53 
     | 
    
         
            -
                     
     | 
| 
      
 73 
     | 
    
         
            +
                  should "have stored only non-ignored attributes" do
         
     | 
| 
      
 74 
     | 
    
         
            +
                    expected = {
         
     | 
| 
      
 75 
     | 
    
         
            +
                      "content" => [nil, "Some text here."],
         
     | 
| 
      
 76 
     | 
    
         
            +
                      "abstract" => [nil, "do not ignore abstract"]
         
     | 
| 
      
 77 
     | 
    
         
            +
                    }
         
     | 
| 
      
 78 
     | 
    
         
            +
                    assert_equal expected, @article.versions.last.changeset
         
     | 
| 
       54 
79 
     | 
    
         
             
                  end
         
     | 
| 
       55 
80 
     | 
    
         
             
                end
         
     | 
| 
       56 
81 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                context  
     | 
| 
       58 
     | 
    
         
            -
                  setup { @article.update_attributes : 
     | 
| 
       59 
     | 
    
         
            -
                  should  
     | 
| 
      
 82 
     | 
    
         
            +
                context "which updates a selected column" do
         
     | 
| 
      
 83 
     | 
    
         
            +
                  setup { @article.update_attributes content: "Some text here." }
         
     | 
| 
      
 84 
     | 
    
         
            +
                  should "change the number of versions" do
         
     | 
| 
      
 85 
     | 
    
         
            +
                    assert_equal(2, PaperTrail::Version.count)
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
       60 
87 
     | 
    
         | 
| 
       61 
88 
     | 
    
         
             
                  should "show the new version in the model's `versions` association" do
         
     | 
| 
       62 
89 
     | 
    
         
             
                    assert_equal(2, @article.versions.size)
         
     | 
| 
       63 
90 
     | 
    
         
             
                  end
         
     | 
| 
       64 
91 
     | 
    
         
             
                end
         
     | 
| 
       65 
92 
     | 
    
         | 
| 
       66 
     | 
    
         
            -
                context  
     | 
| 
       67 
     | 
    
         
            -
                   
     | 
| 
       68 
     | 
    
         
            -
             
     | 
| 
      
 93 
     | 
    
         
            +
                context "which updates a non-ignored and non-selected column" do
         
     | 
| 
      
 94 
     | 
    
         
            +
                  should "not change the number of versions" do
         
     | 
| 
      
 95 
     | 
    
         
            +
                    @article.update_attributes abstract: "Other abstract"
         
     | 
| 
      
 96 
     | 
    
         
            +
                    assert_equal(1, PaperTrail::Version.count)
         
     | 
| 
      
 97 
     | 
    
         
            +
                  end
         
     | 
| 
       69 
98 
     | 
    
         
             
                end
         
     | 
| 
       70 
99 
     | 
    
         | 
| 
       71 
     | 
    
         
            -
                context  
     | 
| 
       72 
     | 
    
         
            -
                   
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
      
 100 
     | 
    
         
            +
                context "which updates a skipped column" do
         
     | 
| 
      
 101 
     | 
    
         
            +
                  should "not change the number of versions" do
         
     | 
| 
      
 102 
     | 
    
         
            +
                    @article.update_attributes file_upload: "Your data goes here"
         
     | 
| 
      
 103 
     | 
    
         
            +
                    assert_equal(1, PaperTrail::Version.count)
         
     | 
| 
      
 104 
     | 
    
         
            +
                  end
         
     | 
| 
       74 
105 
     | 
    
         
             
                end
         
     | 
| 
       75 
106 
     | 
    
         | 
| 
       76 
     | 
    
         
            -
                context  
     | 
| 
       77 
     | 
    
         
            -
                  setup  
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
      
 107 
     | 
    
         
            +
                context "which updates a skipped column and a selected column" do
         
     | 
| 
      
 108 
     | 
    
         
            +
                  setup do
         
     | 
| 
      
 109 
     | 
    
         
            +
                    @article.update_attributes(
         
     | 
| 
      
 110 
     | 
    
         
            +
                      file_upload: "Your data goes here",
         
     | 
| 
      
 111 
     | 
    
         
            +
                      content: "Some text here."
         
     | 
| 
      
 112 
     | 
    
         
            +
                    )
         
     | 
| 
      
 113 
     | 
    
         
            +
                  end
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
                  should "change the number of versions" do
         
     | 
| 
      
 116 
     | 
    
         
            +
                    assert_equal(2, PaperTrail::Version.count)
         
     | 
| 
      
 117 
     | 
    
         
            +
                  end
         
     | 
| 
       79 
118 
     | 
    
         | 
| 
       80 
119 
     | 
    
         
             
                  should "show the new version in the model's `versions` association" do
         
     | 
| 
       81 
120 
     | 
    
         
             
                    assert_equal(2, @article.versions.size)
         
     | 
| 
       82 
121 
     | 
    
         
             
                  end
         
     | 
| 
       83 
122 
     | 
    
         | 
| 
       84 
     | 
    
         
            -
                  should  
     | 
| 
       85 
     | 
    
         
            -
                    assert_equal ({ 
     | 
| 
      
 123 
     | 
    
         
            +
                  should "have stored only non-skipped attributes" do
         
     | 
| 
      
 124 
     | 
    
         
            +
                    assert_equal ({ "content" => [nil, "Some text here."] }),
         
     | 
| 
      
 125 
     | 
    
         
            +
                      @article.versions.last.changeset
         
     | 
| 
       86 
126 
     | 
    
         
             
                  end
         
     | 
| 
       87 
127 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
                  context  
     | 
| 
      
 128 
     | 
    
         
            +
                  context "and when updated again" do
         
     | 
| 
       89 
129 
     | 
    
         
             
                    setup do
         
     | 
| 
       90 
     | 
    
         
            -
                      @article.update_attributes 
     | 
| 
      
 130 
     | 
    
         
            +
                      @article.update_attributes(
         
     | 
| 
      
 131 
     | 
    
         
            +
                        file_upload: "More data goes here",
         
     | 
| 
      
 132 
     | 
    
         
            +
                        content: "More text here."
         
     | 
| 
      
 133 
     | 
    
         
            +
                      )
         
     | 
| 
       91 
134 
     | 
    
         
             
                      @old_article = @article.versions.last
         
     | 
| 
       92 
135 
     | 
    
         
             
                    end
         
     | 
| 
       93 
136 
     | 
    
         | 
| 
       94 
     | 
    
         
            -
                    should  
     | 
| 
       95 
     | 
    
         
            -
                      assert_equal nil, PaperTrail.serializer.load(@old_article.object)[ 
     | 
| 
      
 137 
     | 
    
         
            +
                    should "have removed the skipped attributes when saving the previous version" do
         
     | 
| 
      
 138 
     | 
    
         
            +
                      assert_equal nil, PaperTrail.serializer.load(@old_article.object)["file_upload"]
         
     | 
| 
       96 
139 
     | 
    
         
             
                    end
         
     | 
| 
       97 
140 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
                    should  
     | 
| 
       99 
     | 
    
         
            -
                      assert_equal  
     | 
| 
      
 141 
     | 
    
         
            +
                    should "have kept the non-skipped attributes in the previous version" do
         
     | 
| 
      
 142 
     | 
    
         
            +
                      assert_equal "Some text here.", PaperTrail.serializer.load(@old_article.object)["content"]
         
     | 
| 
       100 
143 
     | 
    
         
             
                    end
         
     | 
| 
       101 
144 
     | 
    
         
             
                  end
         
     | 
| 
       102 
145 
     | 
    
         
             
                end
         
     | 
| 
       103 
146 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
                context  
     | 
| 
      
 147 
     | 
    
         
            +
                context "which gets destroyed" do
         
     | 
| 
       105 
148 
     | 
    
         
             
                  setup { @article.destroy }
         
     | 
| 
       106 
     | 
    
         
            -
                  should  
     | 
| 
      
 149 
     | 
    
         
            +
                  should "change the number of versions" do assert_equal(2, PaperTrail::Version.count) end
         
     | 
| 
       107 
150 
     | 
    
         | 
| 
       108 
151 
     | 
    
         
             
                  should "show the new version in the model's `versions` association" do
         
     | 
| 
       109 
152 
     | 
    
         
             
                    assert_equal(2, @article.versions.size)
         
     | 
| 
         @@ -114,64 +157,74 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       114 
157 
     | 
    
         
             
              context "A record with defined 'ignore' attribute" do
         
     | 
| 
       115 
158 
     | 
    
         
             
                setup { @legacy_widget = LegacyWidget.create }
         
     | 
| 
       116 
159 
     | 
    
         | 
| 
       117 
     | 
    
         
            -
                context  
     | 
| 
       118 
     | 
    
         
            -
                  setup { @legacy_widget.update_attributes : 
     | 
| 
       119 
     | 
    
         
            -
                  should  
     | 
| 
      
 160 
     | 
    
         
            +
                context "which updates an ignored column" do
         
     | 
| 
      
 161 
     | 
    
         
            +
                  setup { @legacy_widget.update_attributes version: 1 }
         
     | 
| 
      
 162 
     | 
    
         
            +
                  should "not change the number of versions" do assert_equal(1, PaperTrail::Version.count) end
         
     | 
| 
       120 
163 
     | 
    
         
             
                end
         
     | 
| 
       121 
164 
     | 
    
         
             
              end
         
     | 
| 
       122 
165 
     | 
    
         | 
| 
       123 
166 
     | 
    
         
             
              context 'A record with defined "if" and "unless" attributes' do
         
     | 
| 
       124 
     | 
    
         
            -
                setup { @translation = Translation.new : 
     | 
| 
      
 167 
     | 
    
         
            +
                setup { @translation = Translation.new headline: "Headline" }
         
     | 
| 
       125 
168 
     | 
    
         | 
| 
       126 
     | 
    
         
            -
                context  
     | 
| 
      
 169 
     | 
    
         
            +
                context "for non-US translations" do
         
     | 
| 
       127 
170 
     | 
    
         
             
                  setup { @translation.save }
         
     | 
| 
       128 
     | 
    
         
            -
                  should  
     | 
| 
      
 171 
     | 
    
         
            +
                  should "not change the number of versions" do assert_equal(0, PaperTrail::Version.count) end
         
     | 
| 
       129 
172 
     | 
    
         | 
| 
       130 
     | 
    
         
            -
                  context  
     | 
| 
       131 
     | 
    
         
            -
                    setup { @translation.update_attributes : 
     | 
| 
       132 
     | 
    
         
            -
                    should  
     | 
| 
      
 173 
     | 
    
         
            +
                  context "after update" do
         
     | 
| 
      
 174 
     | 
    
         
            +
                    setup { @translation.update_attributes content: "Content" }
         
     | 
| 
      
 175 
     | 
    
         
            +
                    should "not change the number of versions" do assert_equal(0, PaperTrail::Version.count) end
         
     | 
| 
       133 
176 
     | 
    
         
             
                  end
         
     | 
| 
       134 
177 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
                  context  
     | 
| 
      
 178 
     | 
    
         
            +
                  context "after destroy" do
         
     | 
| 
       136 
179 
     | 
    
         
             
                    setup { @translation.destroy }
         
     | 
| 
       137 
     | 
    
         
            -
                    should  
     | 
| 
      
 180 
     | 
    
         
            +
                    should "not change the number of versions" do assert_equal(0, PaperTrail::Version.count) end
         
     | 
| 
       138 
181 
     | 
    
         
             
                  end
         
     | 
| 
       139 
182 
     | 
    
         
             
                end
         
     | 
| 
       140 
183 
     | 
    
         | 
| 
       141 
     | 
    
         
            -
                context  
     | 
| 
      
 184 
     | 
    
         
            +
                context "for US translations" do
         
     | 
| 
       142 
185 
     | 
    
         
             
                  setup { @translation.language_code = "US" }
         
     | 
| 
       143 
186 
     | 
    
         | 
| 
       144 
     | 
    
         
            -
                  context  
     | 
| 
      
 187 
     | 
    
         
            +
                  context "that are drafts" do
         
     | 
| 
       145 
188 
     | 
    
         
             
                    setup do
         
     | 
| 
       146 
     | 
    
         
            -
                      @translation.type =  
     | 
| 
      
 189 
     | 
    
         
            +
                      @translation.type = "DRAFT"
         
     | 
| 
       147 
190 
     | 
    
         
             
                      @translation.save
         
     | 
| 
       148 
191 
     | 
    
         
             
                    end
         
     | 
| 
       149 
192 
     | 
    
         | 
| 
       150 
     | 
    
         
            -
                    should  
     | 
| 
      
 193 
     | 
    
         
            +
                    should "not change the number of versions" do
         
     | 
| 
      
 194 
     | 
    
         
            +
                      assert_equal(0, PaperTrail::Version.count)
         
     | 
| 
      
 195 
     | 
    
         
            +
                    end
         
     | 
| 
       151 
196 
     | 
    
         | 
| 
       152 
     | 
    
         
            -
                    context  
     | 
| 
       153 
     | 
    
         
            -
                      setup { @translation.update_attributes : 
     | 
| 
       154 
     | 
    
         
            -
                      should  
     | 
| 
      
 197 
     | 
    
         
            +
                    context "after update" do
         
     | 
| 
      
 198 
     | 
    
         
            +
                      setup { @translation.update_attributes content: "Content" }
         
     | 
| 
      
 199 
     | 
    
         
            +
                      should "not change the number of versions" do
         
     | 
| 
      
 200 
     | 
    
         
            +
                        assert_equal(0, PaperTrail::Version.count)
         
     | 
| 
      
 201 
     | 
    
         
            +
                      end
         
     | 
| 
       155 
202 
     | 
    
         
             
                    end
         
     | 
| 
       156 
203 
     | 
    
         
             
                  end
         
     | 
| 
       157 
204 
     | 
    
         | 
| 
       158 
     | 
    
         
            -
                  context  
     | 
| 
      
 205 
     | 
    
         
            +
                  context "that are not drafts" do
         
     | 
| 
       159 
206 
     | 
    
         
             
                    setup { @translation.save }
         
     | 
| 
       160 
207 
     | 
    
         | 
| 
       161 
     | 
    
         
            -
                    should  
     | 
| 
      
 208 
     | 
    
         
            +
                    should "change the number of versions" do
         
     | 
| 
      
 209 
     | 
    
         
            +
                      assert_equal(1, PaperTrail::Version.count)
         
     | 
| 
      
 210 
     | 
    
         
            +
                    end
         
     | 
| 
       162 
211 
     | 
    
         | 
| 
       163 
     | 
    
         
            -
                    context  
     | 
| 
       164 
     | 
    
         
            -
                      setup { @translation.update_attributes : 
     | 
| 
       165 
     | 
    
         
            -
                      should  
     | 
| 
      
 212 
     | 
    
         
            +
                    context "after update" do
         
     | 
| 
      
 213 
     | 
    
         
            +
                      setup { @translation.update_attributes content: "Content" }
         
     | 
| 
      
 214 
     | 
    
         
            +
                      should "change the number of versions" do
         
     | 
| 
      
 215 
     | 
    
         
            +
                        assert_equal(2, PaperTrail::Version.count)
         
     | 
| 
      
 216 
     | 
    
         
            +
                      end
         
     | 
| 
       166 
217 
     | 
    
         | 
| 
       167 
218 
     | 
    
         
             
                      should "show the new version in the model's `versions` association" do
         
     | 
| 
       168 
219 
     | 
    
         
             
                        assert_equal(2, @translation.versions.size)
         
     | 
| 
       169 
220 
     | 
    
         
             
                      end
         
     | 
| 
       170 
221 
     | 
    
         
             
                    end
         
     | 
| 
       171 
222 
     | 
    
         | 
| 
       172 
     | 
    
         
            -
                    context  
     | 
| 
      
 223 
     | 
    
         
            +
                    context "after destroy" do
         
     | 
| 
       173 
224 
     | 
    
         
             
                      setup { @translation.destroy }
         
     | 
| 
       174 
     | 
    
         
            -
                      should  
     | 
| 
      
 225 
     | 
    
         
            +
                      should "change the number of versions" do
         
     | 
| 
      
 226 
     | 
    
         
            +
                        assert_equal(2, PaperTrail::Version.count)
         
     | 
| 
      
 227 
     | 
    
         
            +
                      end
         
     | 
| 
       175 
228 
     | 
    
         | 
| 
       176 
229 
     | 
    
         
             
                      should "show the new version in the model's `versions` association" do
         
     | 
| 
       177 
230 
     | 
    
         
             
                        assert_equal(2, @translation.versions.size)
         
     | 
| 
         @@ -181,34 +234,34 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       181 
234 
     | 
    
         
             
                end
         
     | 
| 
       182 
235 
     | 
    
         
             
              end
         
     | 
| 
       183 
236 
     | 
    
         | 
| 
       184 
     | 
    
         
            -
              context  
     | 
| 
      
 237 
     | 
    
         
            +
              context "A new record" do
         
     | 
| 
       185 
238 
     | 
    
         
             
                setup { @widget = Widget.new }
         
     | 
| 
       186 
239 
     | 
    
         | 
| 
       187 
     | 
    
         
            -
                should  
     | 
| 
      
 240 
     | 
    
         
            +
                should "not have any previous versions" do
         
     | 
| 
       188 
241 
     | 
    
         
             
                  assert_equal [], @widget.versions
         
     | 
| 
       189 
242 
     | 
    
         
             
                end
         
     | 
| 
       190 
243 
     | 
    
         | 
| 
       191 
     | 
    
         
            -
                should  
     | 
| 
      
 244 
     | 
    
         
            +
                should "be live" do
         
     | 
| 
       192 
245 
     | 
    
         
             
                  assert @widget.live?
         
     | 
| 
       193 
246 
     | 
    
         
             
                end
         
     | 
| 
       194 
247 
     | 
    
         | 
| 
       195 
     | 
    
         
            -
                context  
     | 
| 
       196 
     | 
    
         
            -
                  setup { @widget.update_attributes : 
     | 
| 
      
 248 
     | 
    
         
            +
                context "which is then created" do
         
     | 
| 
      
 249 
     | 
    
         
            +
                  setup { @widget.update_attributes name: "Henry", created_at: Time.now - 1.day }
         
     | 
| 
       197 
250 
     | 
    
         | 
| 
       198 
     | 
    
         
            -
                  should  
     | 
| 
      
 251 
     | 
    
         
            +
                  should "have one previous version" do
         
     | 
| 
       199 
252 
     | 
    
         
             
                    assert_equal 1, @widget.versions.length
         
     | 
| 
       200 
253 
     | 
    
         
             
                  end
         
     | 
| 
       201 
254 
     | 
    
         | 
| 
       202 
     | 
    
         
            -
                  should  
     | 
| 
      
 255 
     | 
    
         
            +
                  should "be nil in its previous version" do
         
     | 
| 
       203 
256 
     | 
    
         
             
                    assert_nil @widget.versions.first.object
         
     | 
| 
       204 
257 
     | 
    
         
             
                    assert_nil @widget.versions.first.reify
         
     | 
| 
       205 
258 
     | 
    
         
             
                  end
         
     | 
| 
       206 
259 
     | 
    
         | 
| 
       207 
     | 
    
         
            -
                  should  
     | 
| 
       208 
     | 
    
         
            -
                    assert_match 
     | 
| 
      
 260 
     | 
    
         
            +
                  should "record the correct event" do
         
     | 
| 
      
 261 
     | 
    
         
            +
                    assert_match(/create/i, @widget.versions.first.event)
         
     | 
| 
       209 
262 
     | 
    
         
             
                  end
         
     | 
| 
       210 
263 
     | 
    
         | 
| 
       211 
     | 
    
         
            -
                  should  
     | 
| 
      
 264 
     | 
    
         
            +
                  should "be live" do
         
     | 
| 
       212 
265 
     | 
    
         
             
                    assert @widget.live?
         
     | 
| 
       213 
266 
     | 
    
         
             
                  end
         
     | 
| 
       214 
267 
     | 
    
         | 
| 
         @@ -216,114 +269,107 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       216 
269 
     | 
    
         
             
                    assert_equal @widget.updated_at.to_i, @widget.versions.first.created_at.to_i
         
     | 
| 
       217 
270 
     | 
    
         
             
                  end
         
     | 
| 
       218 
271 
     | 
    
         | 
| 
       219 
     | 
    
         
            -
                  should  
     | 
| 
       220 
     | 
    
         
            -
             
     | 
| 
       221 
     | 
    
         
            -
                    # 
     | 
| 
       222 
     | 
    
         
            -
                    #  
     | 
| 
      
 272 
     | 
    
         
            +
                  should "have changes" do
         
     | 
| 
      
 273 
     | 
    
         
            +
                    # TODO: Postgres does not appear to pass back
         
     | 
| 
      
 274 
     | 
    
         
            +
                    # ActiveSupport::TimeWithZone, so choosing the lowest common denominator
         
     | 
| 
      
 275 
     | 
    
         
            +
                    # to test.
         
     | 
| 
       223 
276 
     | 
    
         | 
| 
       224 
277 
     | 
    
         
             
                    changes = {
         
     | 
| 
       225 
     | 
    
         
            -
                       
     | 
| 
       226 
     | 
    
         
            -
                       
     | 
| 
       227 
     | 
    
         
            -
                       
     | 
| 
       228 
     | 
    
         
            -
                       
     | 
| 
      
 278 
     | 
    
         
            +
                      "name" => [nil, "Henry"],
         
     | 
| 
      
 279 
     | 
    
         
            +
                      "created_at" => [nil, @widget.created_at.to_time.utc],
         
     | 
| 
      
 280 
     | 
    
         
            +
                      "updated_at" => [nil, @widget.updated_at.to_time.utc],
         
     | 
| 
      
 281 
     | 
    
         
            +
                      "id" => [nil, @widget.id]
         
     | 
| 
       229 
282 
     | 
    
         
             
                    }
         
     | 
| 
       230 
283 
     | 
    
         | 
| 
       231 
     | 
    
         
            -
                    assert_kind_of Time, @widget.versions.last.changeset[ 
     | 
| 
      
 284 
     | 
    
         
            +
                    assert_kind_of Time, @widget.versions.last.changeset["updated_at"][1]
         
     | 
| 
       232 
285 
     | 
    
         
             
                    assert_changes_equal changes, @widget.versions.last.changeset
         
     | 
| 
       233 
286 
     | 
    
         
             
                  end
         
     | 
| 
       234 
287 
     | 
    
         | 
| 
       235 
     | 
    
         
            -
                  context  
     | 
| 
      
 288 
     | 
    
         
            +
                  context "and then updated without any changes" do
         
     | 
| 
       236 
289 
     | 
    
         
             
                    setup { @widget.touch }
         
     | 
| 
       237 
290 
     | 
    
         | 
| 
       238 
     | 
    
         
            -
                    should  
     | 
| 
      
 291 
     | 
    
         
            +
                    should "not have a new version" do
         
     | 
| 
       239 
292 
     | 
    
         
             
                      assert_equal 1, @widget.versions.length
         
     | 
| 
       240 
293 
     | 
    
         
             
                    end
         
     | 
| 
       241 
294 
     | 
    
         
             
                  end
         
     | 
| 
       242 
295 
     | 
    
         | 
| 
      
 296 
     | 
    
         
            +
                  context "and then updated with changes" do
         
     | 
| 
      
 297 
     | 
    
         
            +
                    setup { @widget.update_attributes name: "Harry" }
         
     | 
| 
       243 
298 
     | 
    
         | 
| 
       244 
     | 
    
         
            -
             
     | 
| 
       245 
     | 
    
         
            -
                    setup { @widget.update_attributes :name => 'Harry' }
         
     | 
| 
       246 
     | 
    
         
            -
             
     | 
| 
       247 
     | 
    
         
            -
                    should 'have two previous versions' do
         
     | 
| 
      
 299 
     | 
    
         
            +
                    should "have two previous versions" do
         
     | 
| 
       248 
300 
     | 
    
         
             
                      assert_equal 2, @widget.versions.length
         
     | 
| 
       249 
301 
     | 
    
         
             
                    end
         
     | 
| 
       250 
302 
     | 
    
         | 
| 
       251 
     | 
    
         
            -
                    should  
     | 
| 
       252 
     | 
    
         
            -
                      assert_equal  
     | 
| 
      
 303 
     | 
    
         
            +
                    should "be available in its previous version" do
         
     | 
| 
      
 304 
     | 
    
         
            +
                      assert_equal "Harry", @widget.name
         
     | 
| 
       253 
305 
     | 
    
         
             
                      assert_not_nil @widget.versions.last.object
         
     | 
| 
       254 
306 
     | 
    
         
             
                      widget = @widget.versions.last.reify
         
     | 
| 
       255 
     | 
    
         
            -
                      assert_equal  
     | 
| 
       256 
     | 
    
         
            -
                      assert_equal  
     | 
| 
      
 307 
     | 
    
         
            +
                      assert_equal "Henry", widget.name
         
     | 
| 
      
 308 
     | 
    
         
            +
                      assert_equal "Harry", @widget.name
         
     | 
| 
       257 
309 
     | 
    
         
             
                    end
         
     | 
| 
       258 
310 
     | 
    
         | 
| 
       259 
     | 
    
         
            -
                    should  
     | 
| 
      
 311 
     | 
    
         
            +
                    should "have the same ID in its previous version" do
         
     | 
| 
       260 
312 
     | 
    
         
             
                      assert_equal @widget.id, @widget.versions.last.reify.id
         
     | 
| 
       261 
313 
     | 
    
         
             
                    end
         
     | 
| 
       262 
314 
     | 
    
         | 
| 
       263 
     | 
    
         
            -
                    should  
     | 
| 
       264 
     | 
    
         
            -
                      assert_match 
     | 
| 
      
 315 
     | 
    
         
            +
                    should "record the correct event" do
         
     | 
| 
      
 316 
     | 
    
         
            +
                      assert_match(/update/i, @widget.versions.last.event)
         
     | 
| 
       265 
317 
     | 
    
         
             
                    end
         
     | 
| 
       266 
318 
     | 
    
         | 
| 
       267 
     | 
    
         
            -
                    should  
     | 
| 
      
 319 
     | 
    
         
            +
                    should "have versions that are not live" do
         
     | 
| 
       268 
320 
     | 
    
         
             
                      assert @widget.versions.map(&:reify).compact.all? { |w| !w.live? }
         
     | 
| 
       269 
321 
     | 
    
         
             
                    end
         
     | 
| 
       270 
322 
     | 
    
         | 
| 
       271 
     | 
    
         
            -
                    should  
     | 
| 
      
 323 
     | 
    
         
            +
                    should "have stored changes" do
         
     | 
| 
       272 
324 
     | 
    
         
             
                      # Behavior for ActiveRecord 4 is different than ActiveRecord 3;
         
     | 
| 
       273 
     | 
    
         
            -
                      # AR4 includes the `updated_at` column in changes for updates, which 
     | 
| 
       274 
     | 
    
         
            -
                       
     | 
| 
       275 
     | 
    
         
            -
                       
     | 
| 
      
 325 
     | 
    
         
            +
                      # AR4 includes the `updated_at` column in changes for updates, which
         
     | 
| 
      
 326 
     | 
    
         
            +
                      # is why we reject it from the right side of this assertion.
         
     | 
| 
      
 327 
     | 
    
         
            +
                      last_obj_changes = @widget.versions.last.object_changes
         
     | 
| 
      
 328 
     | 
    
         
            +
                      actual = PaperTrail.serializer.load(last_obj_changes).reject { |k, _v|
         
     | 
| 
      
 329 
     | 
    
         
            +
                        k.to_sym == :updated_at
         
     | 
| 
      
 330 
     | 
    
         
            +
                      }
         
     | 
| 
      
 331 
     | 
    
         
            +
                      assert_equal ({ "name" => %w(Henry Harry) }), actual
         
     | 
| 
      
 332 
     | 
    
         
            +
                      actual = @widget.versions.last.changeset.reject { |k, _v|
         
     | 
| 
      
 333 
     | 
    
         
            +
                        k.to_sym == :updated_at
         
     | 
| 
      
 334 
     | 
    
         
            +
                      }
         
     | 
| 
      
 335 
     | 
    
         
            +
                      assert_equal ({ "name" => %w(Henry Harry) }), actual
         
     | 
| 
       276 
336 
     | 
    
         
             
                    end
         
     | 
| 
       277 
337 
     | 
    
         | 
| 
       278 
     | 
    
         
            -
                    should  
     | 
| 
       279 
     | 
    
         
            -
                      assert_equal  
     | 
| 
       280 
     | 
    
         
            -
                      assert_equal  
     | 
| 
       281 
     | 
    
         
            -
                    end
         
     | 
| 
       282 
     | 
    
         
            -
             
     | 
| 
       283 
     | 
    
         
            -
                    if defined?(ActiveRecord::IdentityMap) && ActiveRecord::IdentityMap.respond_to?(:without)
         
     | 
| 
       284 
     | 
    
         
            -
                      should 'not clobber the IdentityMap when reifying' do
         
     | 
| 
       285 
     | 
    
         
            -
                        module ActiveRecord::IdentityMap
         
     | 
| 
       286 
     | 
    
         
            -
                          class << self
         
     | 
| 
       287 
     | 
    
         
            -
                            alias :__without :without
         
     | 
| 
       288 
     | 
    
         
            -
                            def without(&block)
         
     | 
| 
       289 
     | 
    
         
            -
                              @unclobbered = true
         
     | 
| 
       290 
     | 
    
         
            -
                              __without(&block)
         
     | 
| 
       291 
     | 
    
         
            -
                            end
         
     | 
| 
       292 
     | 
    
         
            -
                          end
         
     | 
| 
       293 
     | 
    
         
            -
                        end
         
     | 
| 
       294 
     | 
    
         
            -
             
     | 
| 
       295 
     | 
    
         
            -
                        @widget.versions.last.reify
         
     | 
| 
       296 
     | 
    
         
            -
                        assert ActiveRecord::IdentityMap.instance_variable_get("@unclobbered")
         
     | 
| 
       297 
     | 
    
         
            -
                      end
         
     | 
| 
      
 338 
     | 
    
         
            +
                    should "return changes with indifferent access" do
         
     | 
| 
      
 339 
     | 
    
         
            +
                      assert_equal %w(Henry Harry), @widget.versions.last.changeset[:name]
         
     | 
| 
      
 340 
     | 
    
         
            +
                      assert_equal %w(Henry Harry), @widget.versions.last.changeset["name"]
         
     | 
| 
       298 
341 
     | 
    
         
             
                    end
         
     | 
| 
       299 
342 
     | 
    
         | 
| 
       300 
     | 
    
         
            -
                    context  
     | 
| 
      
 343 
     | 
    
         
            +
                    context "and has one associated object" do
         
     | 
| 
       301 
344 
     | 
    
         
             
                      setup do
         
     | 
| 
       302 
     | 
    
         
            -
                        @wotsit = @widget.create_wotsit : 
     | 
| 
      
 345 
     | 
    
         
            +
                        @wotsit = @widget.create_wotsit name: "John"
         
     | 
| 
       303 
346 
     | 
    
         
             
                      end
         
     | 
| 
       304 
347 
     | 
    
         | 
| 
       305 
     | 
    
         
            -
                      should  
     | 
| 
      
 348 
     | 
    
         
            +
                      should "not copy the has_one association by default when reifying" do
         
     | 
| 
       306 
349 
     | 
    
         
             
                        reified_widget = @widget.versions.last.reify
         
     | 
| 
       307 
     | 
    
         
            -
                         
     | 
| 
       308 
     | 
    
         
            -
                        assert_equal @wotsit,  
     | 
| 
      
 350 
     | 
    
         
            +
                        # association hasn't been affected by reifying
         
     | 
| 
      
 351 
     | 
    
         
            +
                        assert_equal @wotsit, reified_widget.wotsit
         
     | 
| 
      
 352 
     | 
    
         
            +
                        # confirm that the association is correct
         
     | 
| 
      
 353 
     | 
    
         
            +
                        assert_equal @wotsit, @widget.reload.wotsit
         
     | 
| 
       309 
354 
     | 
    
         
             
                      end
         
     | 
| 
       310 
355 
     | 
    
         | 
| 
       311 
     | 
    
         
            -
                      should  
     | 
| 
       312 
     | 
    
         
            -
                        reified_widget = @widget.versions.last.reify(: 
     | 
| 
       313 
     | 
    
         
            -
                         
     | 
| 
       314 
     | 
    
         
            -
                         
     | 
| 
      
 356 
     | 
    
         
            +
                      should "copy the has_one association when reifying with :has_one => true" do
         
     | 
| 
      
 357 
     | 
    
         
            +
                        reified_widget = @widget.versions.last.reify(has_one: true)
         
     | 
| 
      
 358 
     | 
    
         
            +
                        # wotsit wasn't there at the last version
         
     | 
| 
      
 359 
     | 
    
         
            +
                        assert_nil reified_widget.wotsit
         
     | 
| 
      
 360 
     | 
    
         
            +
                        # wotsit should still exist on live object
         
     | 
| 
      
 361 
     | 
    
         
            +
                        assert_equal @wotsit, @widget.reload.wotsit
         
     | 
| 
       315 
362 
     | 
    
         
             
                      end
         
     | 
| 
       316 
363 
     | 
    
         
             
                    end
         
     | 
| 
       317 
364 
     | 
    
         | 
| 
       318 
     | 
    
         
            -
             
     | 
| 
       319 
     | 
    
         
            -
                    context 'and has many associated objects' do
         
     | 
| 
      
 365 
     | 
    
         
            +
                    context "and has many associated objects" do
         
     | 
| 
       320 
366 
     | 
    
         
             
                      setup do
         
     | 
| 
       321 
     | 
    
         
            -
                        @f0 = @widget.fluxors.create : 
     | 
| 
       322 
     | 
    
         
            -
                        @f1 = @widget.fluxors.create : 
     | 
| 
      
 367 
     | 
    
         
            +
                        @f0 = @widget.fluxors.create name: "f-zero"
         
     | 
| 
      
 368 
     | 
    
         
            +
                        @f1 = @widget.fluxors.create name: "f-one"
         
     | 
| 
       323 
369 
     | 
    
         
             
                        @reified_widget = @widget.versions.last.reify
         
     | 
| 
       324 
370 
     | 
    
         
             
                      end
         
     | 
| 
       325 
371 
     | 
    
         | 
| 
       326 
     | 
    
         
            -
                      should  
     | 
| 
      
 372 
     | 
    
         
            +
                      should "copy the has_many associations when reifying" do
         
     | 
| 
       327 
373 
     | 
    
         
             
                        assert_equal @widget.fluxors.length, @reified_widget.fluxors.length
         
     | 
| 
       328 
374 
     | 
    
         
             
                        assert_same_elements @widget.fluxors, @reified_widget.fluxors
         
     | 
| 
       329 
375 
     | 
    
         | 
| 
         @@ -332,14 +378,14 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       332 
378 
     | 
    
         
             
                      end
         
     | 
| 
       333 
379 
     | 
    
         
             
                    end
         
     | 
| 
       334 
380 
     | 
    
         | 
| 
       335 
     | 
    
         
            -
                    context  
     | 
| 
      
 381 
     | 
    
         
            +
                    context "and has many associated polymorphic objects" do
         
     | 
| 
       336 
382 
     | 
    
         
             
                      setup do
         
     | 
| 
       337 
     | 
    
         
            -
                        @f0 = @widget.whatchamajiggers.create : 
     | 
| 
       338 
     | 
    
         
            -
                        @f1 = @widget.whatchamajiggers.create : 
     | 
| 
      
 383 
     | 
    
         
            +
                        @f0 = @widget.whatchamajiggers.create name: "f-zero"
         
     | 
| 
      
 384 
     | 
    
         
            +
                        @f1 = @widget.whatchamajiggers.create name: "f-zero"
         
     | 
| 
       339 
385 
     | 
    
         
             
                        @reified_widget = @widget.versions.last.reify
         
     | 
| 
       340 
386 
     | 
    
         
             
                      end
         
     | 
| 
       341 
387 
     | 
    
         | 
| 
       342 
     | 
    
         
            -
                      should  
     | 
| 
      
 388 
     | 
    
         
            +
                      should "copy the has_many associations when reifying" do
         
     | 
| 
       343 
389 
     | 
    
         
             
                        assert_equal @widget.whatchamajiggers.length, @reified_widget.whatchamajiggers.length
         
     | 
| 
       344 
390 
     | 
    
         
             
                        assert_same_elements @widget.whatchamajiggers, @reified_widget.whatchamajiggers
         
     | 
| 
       345 
391 
     | 
    
         | 
| 
         @@ -348,54 +394,57 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       348 
394 
     | 
    
         
             
                      end
         
     | 
| 
       349 
395 
     | 
    
         
             
                    end
         
     | 
| 
       350 
396 
     | 
    
         | 
| 
       351 
     | 
    
         
            -
                    context  
     | 
| 
      
 397 
     | 
    
         
            +
                    context "polymorphic objects by themselves" do
         
     | 
| 
       352 
398 
     | 
    
         
             
                      setup do
         
     | 
| 
       353 
     | 
    
         
            -
                        @widget = Whatchamajigger.new : 
     | 
| 
      
 399 
     | 
    
         
            +
                        @widget = Whatchamajigger.new name: "f-zero"
         
     | 
| 
       354 
400 
     | 
    
         
             
                      end
         
     | 
| 
       355 
401 
     | 
    
         | 
| 
       356 
     | 
    
         
            -
                      should  
     | 
| 
      
 402 
     | 
    
         
            +
                      should "not fail with a nil pointer on the polymorphic association" do
         
     | 
| 
       357 
403 
     | 
    
         
             
                        @widget.save!
         
     | 
| 
       358 
404 
     | 
    
         
             
                      end
         
     | 
| 
       359 
405 
     | 
    
         
             
                    end
         
     | 
| 
       360 
406 
     | 
    
         | 
| 
       361 
     | 
    
         
            -
                    context  
     | 
| 
      
 407 
     | 
    
         
            +
                    context "and then destroyed" do
         
     | 
| 
       362 
408 
     | 
    
         
             
                      setup do
         
     | 
| 
       363 
     | 
    
         
            -
                        @fluxor = @widget.fluxors.create : 
     | 
| 
      
 409 
     | 
    
         
            +
                        @fluxor = @widget.fluxors.create name: "flux"
         
     | 
| 
       364 
410 
     | 
    
         
             
                        @widget.destroy
         
     | 
| 
       365 
411 
     | 
    
         
             
                        @reified_widget = PaperTrail::Version.last.reify
         
     | 
| 
       366 
412 
     | 
    
         
             
                      end
         
     | 
| 
       367 
413 
     | 
    
         | 
| 
       368 
     | 
    
         
            -
                      should  
     | 
| 
       369 
     | 
    
         
            -
                        assert_match 
     | 
| 
      
 414 
     | 
    
         
            +
                      should "record the correct event" do
         
     | 
| 
      
 415 
     | 
    
         
            +
                        assert_match(/destroy/i, PaperTrail::Version.last.event)
         
     | 
| 
       370 
416 
     | 
    
         
             
                      end
         
     | 
| 
       371 
417 
     | 
    
         | 
| 
       372 
     | 
    
         
            -
                      should  
     | 
| 
       373 
     | 
    
         
            -
                        assert_equal 3, PaperTrail::Version.with_item_keys( 
     | 
| 
      
 418 
     | 
    
         
            +
                      should "have three previous versions" do
         
     | 
| 
      
 419 
     | 
    
         
            +
                        assert_equal 3, PaperTrail::Version.with_item_keys("Widget", @widget.id).length
         
     | 
| 
       374 
420 
     | 
    
         
             
                      end
         
     | 
| 
       375 
421 
     | 
    
         | 
| 
       376 
     | 
    
         
            -
                      should  
     | 
| 
      
 422 
     | 
    
         
            +
                      should "be available in its previous version" do
         
     | 
| 
       377 
423 
     | 
    
         
             
                        assert_equal @widget.id, @reified_widget.id
         
     | 
| 
       378 
424 
     | 
    
         
             
                        assert_attributes_equal @widget.attributes, @reified_widget.attributes
         
     | 
| 
       379 
425 
     | 
    
         
             
                      end
         
     | 
| 
       380 
426 
     | 
    
         | 
| 
       381 
     | 
    
         
            -
                      should  
     | 
| 
      
 427 
     | 
    
         
            +
                      should "be re-creatable from its previous version" do
         
     | 
| 
       382 
428 
     | 
    
         
             
                        assert @reified_widget.save
         
     | 
| 
       383 
429 
     | 
    
         
             
                      end
         
     | 
| 
       384 
430 
     | 
    
         | 
| 
       385 
     | 
    
         
            -
                      should  
     | 
| 
      
 431 
     | 
    
         
            +
                      should "restore its associations on its previous version" do
         
     | 
| 
       386 
432 
     | 
    
         
             
                        @reified_widget.save
         
     | 
| 
       387 
433 
     | 
    
         
             
                        assert_equal 1, @reified_widget.fluxors.length
         
     | 
| 
       388 
434 
     | 
    
         
             
                      end
         
     | 
| 
       389 
435 
     | 
    
         | 
| 
       390 
     | 
    
         
            -
                      should  
     | 
| 
       391 
     | 
    
         
            -
                         
     | 
| 
      
 436 
     | 
    
         
            +
                      should "have nil item for last version" do
         
     | 
| 
      
 437 
     | 
    
         
            +
                        assert_nil(@widget.versions.last.item)
         
     | 
| 
      
 438 
     | 
    
         
            +
                      end
         
     | 
| 
      
 439 
     | 
    
         
            +
             
     | 
| 
      
 440 
     | 
    
         
            +
                      should "not have changes" do
         
     | 
| 
      
 441 
     | 
    
         
            +
                        assert_equal({}, @widget.versions.last.changeset)
         
     | 
| 
       392 
442 
     | 
    
         
             
                      end
         
     | 
| 
       393 
443 
     | 
    
         
             
                    end
         
     | 
| 
       394 
444 
     | 
    
         
             
                  end
         
     | 
| 
       395 
445 
     | 
    
         
             
                end
         
     | 
| 
       396 
446 
     | 
    
         
             
              end
         
     | 
| 
       397 
447 
     | 
    
         | 
| 
       398 
     | 
    
         
            -
             
     | 
| 
       399 
448 
     | 
    
         
             
              # Test the serialisation and deserialisation.
         
     | 
| 
       400 
449 
     | 
    
         
             
              # TODO: binary
         
     | 
| 
       401 
450 
     | 
    
         
             
              context "A record's papertrail" do
         
     | 
| 
         @@ -403,65 +452,67 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       403 
452 
     | 
    
         
             
                  @date_time = DateTime.now.utc
         
     | 
| 
       404 
453 
     | 
    
         
             
                  @time = Time.now
         
     | 
| 
       405 
454 
     | 
    
         
             
                  @date = Date.new 2009, 5, 29
         
     | 
| 
       406 
     | 
    
         
            -
                  @widget = Widget.create 
     | 
| 
       407 
     | 
    
         
            -
             
     | 
| 
       408 
     | 
    
         
            -
             
     | 
| 
       409 
     | 
    
         
            -
             
     | 
| 
       410 
     | 
    
         
            -
             
     | 
| 
       411 
     | 
    
         
            -
             
     | 
| 
       412 
     | 
    
         
            -
             
     | 
| 
       413 
     | 
    
         
            -
             
     | 
| 
       414 
     | 
    
         
            -
             
     | 
| 
       415 
     | 
    
         
            -
             
     | 
| 
       416 
     | 
    
         
            -
                   
     | 
| 
       417 
     | 
    
         
            -
             
     | 
| 
       418 
     | 
    
         
            -
             
     | 
| 
       419 
     | 
    
         
            -
             
     | 
| 
       420 
     | 
    
         
            -
             
     | 
| 
       421 
     | 
    
         
            -
             
     | 
| 
       422 
     | 
    
         
            -
             
     | 
| 
       423 
     | 
    
         
            -
             
     | 
| 
       424 
     | 
    
         
            -
             
     | 
| 
      
 455 
     | 
    
         
            +
                  @widget = Widget.create(
         
     | 
| 
      
 456 
     | 
    
         
            +
                    name: "Warble",
         
     | 
| 
      
 457 
     | 
    
         
            +
                    a_text: "The quick brown fox",
         
     | 
| 
      
 458 
     | 
    
         
            +
                    an_integer: 42,
         
     | 
| 
      
 459 
     | 
    
         
            +
                    a_float: 153.01,
         
     | 
| 
      
 460 
     | 
    
         
            +
                    a_decimal: 2.71828,
         
     | 
| 
      
 461 
     | 
    
         
            +
                    a_datetime: @date_time,
         
     | 
| 
      
 462 
     | 
    
         
            +
                    a_time: @time,
         
     | 
| 
      
 463 
     | 
    
         
            +
                    a_date: @date,
         
     | 
| 
      
 464 
     | 
    
         
            +
                    a_boolean: true
         
     | 
| 
      
 465 
     | 
    
         
            +
                  )
         
     | 
| 
      
 466 
     | 
    
         
            +
                  @widget.update_attributes(
         
     | 
| 
      
 467 
     | 
    
         
            +
                    name: nil,
         
     | 
| 
      
 468 
     | 
    
         
            +
                    a_text: nil,
         
     | 
| 
      
 469 
     | 
    
         
            +
                    an_integer: nil,
         
     | 
| 
      
 470 
     | 
    
         
            +
                    a_float: nil,
         
     | 
| 
      
 471 
     | 
    
         
            +
                    a_decimal: nil,
         
     | 
| 
      
 472 
     | 
    
         
            +
                    a_datetime: nil,
         
     | 
| 
      
 473 
     | 
    
         
            +
                    a_time: nil,
         
     | 
| 
      
 474 
     | 
    
         
            +
                    a_date: nil,
         
     | 
| 
      
 475 
     | 
    
         
            +
                    a_boolean: false
         
     | 
| 
      
 476 
     | 
    
         
            +
                  )
         
     | 
| 
       425 
477 
     | 
    
         
             
                  @previous = @widget.versions.last.reify
         
     | 
| 
       426 
478 
     | 
    
         
             
                end
         
     | 
| 
       427 
479 
     | 
    
         | 
| 
       428 
     | 
    
         
            -
                should  
     | 
| 
       429 
     | 
    
         
            -
                  assert_equal  
     | 
| 
      
 480 
     | 
    
         
            +
                should "handle strings" do
         
     | 
| 
      
 481 
     | 
    
         
            +
                  assert_equal "Warble", @previous.name
         
     | 
| 
       430 
482 
     | 
    
         
             
                end
         
     | 
| 
       431 
483 
     | 
    
         | 
| 
       432 
     | 
    
         
            -
                should  
     | 
| 
       433 
     | 
    
         
            -
                  assert_equal  
     | 
| 
      
 484 
     | 
    
         
            +
                should "handle text" do
         
     | 
| 
      
 485 
     | 
    
         
            +
                  assert_equal "The quick brown fox", @previous.a_text
         
     | 
| 
       434 
486 
     | 
    
         
             
                end
         
     | 
| 
       435 
487 
     | 
    
         | 
| 
       436 
     | 
    
         
            -
                should  
     | 
| 
      
 488 
     | 
    
         
            +
                should "handle integers" do
         
     | 
| 
       437 
489 
     | 
    
         
             
                  assert_equal 42, @previous.an_integer
         
     | 
| 
       438 
490 
     | 
    
         
             
                end
         
     | 
| 
       439 
491 
     | 
    
         | 
| 
       440 
     | 
    
         
            -
                should  
     | 
| 
      
 492 
     | 
    
         
            +
                should "handle floats" do
         
     | 
| 
       441 
493 
     | 
    
         
             
                  assert_in_delta 153.01, @previous.a_float, 0.001
         
     | 
| 
       442 
494 
     | 
    
         
             
                end
         
     | 
| 
       443 
495 
     | 
    
         | 
| 
       444 
     | 
    
         
            -
                should  
     | 
| 
      
 496 
     | 
    
         
            +
                should "handle decimals" do
         
     | 
| 
       445 
497 
     | 
    
         
             
                  assert_in_delta 2.7183, @previous.a_decimal, 0.0001
         
     | 
| 
       446 
498 
     | 
    
         
             
                end
         
     | 
| 
       447 
499 
     | 
    
         | 
| 
       448 
     | 
    
         
            -
                should  
     | 
| 
      
 500 
     | 
    
         
            +
                should "handle datetimes" do
         
     | 
| 
       449 
501 
     | 
    
         
             
                  assert_equal @date_time.to_time.utc.to_i, @previous.a_datetime.to_time.utc.to_i
         
     | 
| 
       450 
502 
     | 
    
         
             
                end
         
     | 
| 
       451 
503 
     | 
    
         | 
| 
       452 
     | 
    
         
            -
                should  
     | 
| 
      
 504 
     | 
    
         
            +
                should "handle times" do
         
     | 
| 
       453 
505 
     | 
    
         
             
                  assert_equal @time.utc.to_i, @previous.a_time.utc.to_i
         
     | 
| 
       454 
506 
     | 
    
         
             
                end
         
     | 
| 
       455 
507 
     | 
    
         | 
| 
       456 
     | 
    
         
            -
                should  
     | 
| 
      
 508 
     | 
    
         
            +
                should "handle dates" do
         
     | 
| 
       457 
509 
     | 
    
         
             
                  assert_equal @date, @previous.a_date
         
     | 
| 
       458 
510 
     | 
    
         
             
                end
         
     | 
| 
       459 
511 
     | 
    
         | 
| 
       460 
     | 
    
         
            -
                should  
     | 
| 
      
 512 
     | 
    
         
            +
                should "handle booleans" do
         
     | 
| 
       461 
513 
     | 
    
         
             
                  assert @previous.a_boolean
         
     | 
| 
       462 
514 
     | 
    
         
             
                end
         
     | 
| 
       463 
515 
     | 
    
         | 
| 
       464 
     | 
    
         
            -
             
     | 
| 
       465 
516 
     | 
    
         
             
                context "after a column is removed from the record's schema" do
         
     | 
| 
       466 
517 
     | 
    
         
             
                  setup do
         
     | 
| 
       467 
518 
     | 
    
         
             
                    change_schema
         
     | 
| 
         @@ -475,13 +526,13 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       475 
526 
     | 
    
         
             
                    restore_schema
         
     | 
| 
       476 
527 
     | 
    
         
             
                  end
         
     | 
| 
       477 
528 
     | 
    
         | 
| 
       478 
     | 
    
         
            -
                  should  
     | 
| 
      
 529 
     | 
    
         
            +
                  should "reify previous version" do
         
     | 
| 
       479 
530 
     | 
    
         
             
                    assert_kind_of Widget, @last.reify
         
     | 
| 
       480 
531 
     | 
    
         
             
                  end
         
     | 
| 
       481 
532 
     | 
    
         | 
| 
       482 
     | 
    
         
            -
                  should  
     | 
| 
       483 
     | 
    
         
            -
                    assert_equal     
     | 
| 
       484 
     | 
    
         
            -
                    assert_equal     
     | 
| 
      
 533 
     | 
    
         
            +
                  should "restore all forward-compatible attributes" do
         
     | 
| 
      
 534 
     | 
    
         
            +
                    assert_equal    "Warble",                    @last.reify.name
         
     | 
| 
      
 535 
     | 
    
         
            +
                    assert_equal    "The quick brown fox",       @last.reify.a_text
         
     | 
| 
       485 
536 
     | 
    
         
             
                    assert_equal    42,                          @last.reify.an_integer
         
     | 
| 
       486 
537 
     | 
    
         
             
                    assert_in_delta 153.01,                      @last.reify.a_float,   0.001
         
     | 
| 
       487 
538 
     | 
    
         
             
                    assert_in_delta 2.7183,                      @last.reify.a_decimal, 0.0001
         
     | 
| 
         @@ -493,11 +544,10 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       493 
544 
     | 
    
         
             
                end
         
     | 
| 
       494 
545 
     | 
    
         
             
              end
         
     | 
| 
       495 
546 
     | 
    
         | 
| 
      
 547 
     | 
    
         
            +
              context "A record" do
         
     | 
| 
      
 548 
     | 
    
         
            +
                setup { @widget = Widget.create name: "Zaphod" }
         
     | 
| 
       496 
549 
     | 
    
         | 
| 
       497 
     | 
    
         
            -
             
     | 
| 
       498 
     | 
    
         
            -
                setup { @widget = Widget.create :name => 'Zaphod' }
         
     | 
| 
       499 
     | 
    
         
            -
             
     | 
| 
       500 
     | 
    
         
            -
                context 'with PaperTrail globally disabled' do
         
     | 
| 
      
 550 
     | 
    
         
            +
                context "with PaperTrail globally disabled" do
         
     | 
| 
       501 
551 
     | 
    
         
             
                  setup do
         
     | 
| 
       502 
552 
     | 
    
         
             
                    PaperTrail.enabled = false
         
     | 
| 
       503 
553 
     | 
    
         
             
                    @count = @widget.versions.length
         
     | 
| 
         @@ -505,16 +555,16 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       505 
555 
     | 
    
         | 
| 
       506 
556 
     | 
    
         
             
                  teardown { PaperTrail.enabled = true }
         
     | 
| 
       507 
557 
     | 
    
         | 
| 
       508 
     | 
    
         
            -
                  context  
     | 
| 
       509 
     | 
    
         
            -
                    setup { @widget.update_attributes : 
     | 
| 
      
 558 
     | 
    
         
            +
                  context "when updated" do
         
     | 
| 
      
 559 
     | 
    
         
            +
                    setup { @widget.update_attributes name: "Beeblebrox" }
         
     | 
| 
       510 
560 
     | 
    
         | 
| 
       511 
     | 
    
         
            -
                    should  
     | 
| 
      
 561 
     | 
    
         
            +
                    should "not add to its trail" do
         
     | 
| 
       512 
562 
     | 
    
         
             
                      assert_equal @count, @widget.versions.length
         
     | 
| 
       513 
563 
     | 
    
         
             
                    end
         
     | 
| 
       514 
564 
     | 
    
         
             
                  end
         
     | 
| 
       515 
565 
     | 
    
         
             
                end
         
     | 
| 
       516 
566 
     | 
    
         | 
| 
       517 
     | 
    
         
            -
                context  
     | 
| 
      
 567 
     | 
    
         
            +
                context "with its paper trail turned off" do
         
     | 
| 
       518 
568 
     | 
    
         
             
                  setup do
         
     | 
| 
       519 
569 
     | 
    
         
             
                    Widget.paper_trail_off!
         
     | 
| 
       520 
570 
     | 
    
         
             
                    @count = @widget.versions.length
         
     | 
| 
         @@ -522,28 +572,28 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       522 
572 
     | 
    
         | 
| 
       523 
573 
     | 
    
         
             
                  teardown { Widget.paper_trail_on! }
         
     | 
| 
       524 
574 
     | 
    
         | 
| 
       525 
     | 
    
         
            -
                  context  
     | 
| 
       526 
     | 
    
         
            -
                    setup { @widget.update_attributes : 
     | 
| 
      
 575 
     | 
    
         
            +
                  context "when updated" do
         
     | 
| 
      
 576 
     | 
    
         
            +
                    setup { @widget.update_attributes name: "Beeblebrox" }
         
     | 
| 
       527 
577 
     | 
    
         | 
| 
       528 
     | 
    
         
            -
                    should  
     | 
| 
      
 578 
     | 
    
         
            +
                    should "not add to its trail" do
         
     | 
| 
       529 
579 
     | 
    
         
             
                      assert_equal @count, @widget.versions.length
         
     | 
| 
       530 
580 
     | 
    
         
             
                    end
         
     | 
| 
       531 
581 
     | 
    
         
             
                  end
         
     | 
| 
       532 
582 
     | 
    
         | 
| 
       533 
583 
     | 
    
         
             
                  context 'when destroyed "without versioning"' do
         
     | 
| 
       534 
     | 
    
         
            -
                    should  
     | 
| 
      
 584 
     | 
    
         
            +
                    should "leave paper trail off after call" do
         
     | 
| 
       535 
585 
     | 
    
         
             
                      @widget.without_versioning :destroy
         
     | 
| 
       536 
586 
     | 
    
         
             
                      assert !Widget.paper_trail_enabled_for_model?
         
     | 
| 
       537 
587 
     | 
    
         
             
                    end
         
     | 
| 
       538 
588 
     | 
    
         
             
                  end
         
     | 
| 
       539 
589 
     | 
    
         | 
| 
       540 
     | 
    
         
            -
                  context  
     | 
| 
      
 590 
     | 
    
         
            +
                  context "and then its paper trail turned on" do
         
     | 
| 
       541 
591 
     | 
    
         
             
                    setup { Widget.paper_trail_on! }
         
     | 
| 
       542 
592 
     | 
    
         | 
| 
       543 
     | 
    
         
            -
                    context  
     | 
| 
       544 
     | 
    
         
            -
                      setup { @widget.update_attributes : 
     | 
| 
      
 593 
     | 
    
         
            +
                    context "when updated" do
         
     | 
| 
      
 594 
     | 
    
         
            +
                      setup { @widget.update_attributes name: "Ford" }
         
     | 
| 
       545 
595 
     | 
    
         | 
| 
       546 
     | 
    
         
            -
                      should  
     | 
| 
      
 596 
     | 
    
         
            +
                      should "add to its trail" do
         
     | 
| 
       547 
597 
     | 
    
         
             
                        assert_equal @count + 1, @widget.versions.length
         
     | 
| 
       548 
598 
     | 
    
         
             
                      end
         
     | 
| 
       549 
599 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -551,29 +601,29 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       551 
601 
     | 
    
         
             
                    context 'when updated "without versioning"' do
         
     | 
| 
       552 
602 
     | 
    
         
             
                      setup do
         
     | 
| 
       553 
603 
     | 
    
         
             
                        @widget.without_versioning do
         
     | 
| 
       554 
     | 
    
         
            -
                          @widget.update_attributes : 
     | 
| 
      
 604 
     | 
    
         
            +
                          @widget.update_attributes name: "Ford"
         
     | 
| 
       555 
605 
     | 
    
         
             
                        end
         
     | 
| 
       556 
606 
     | 
    
         
             
                        # The model instance should yield itself for convenience purposes
         
     | 
| 
       557 
     | 
    
         
            -
                        @widget.without_versioning { |w| w.update_attributes : 
     | 
| 
      
 607 
     | 
    
         
            +
                        @widget.without_versioning { |w| w.update_attributes name: "Nixon" }
         
     | 
| 
       558 
608 
     | 
    
         
             
                      end
         
     | 
| 
       559 
609 
     | 
    
         | 
| 
       560 
     | 
    
         
            -
                      should  
     | 
| 
      
 610 
     | 
    
         
            +
                      should "not create new version" do
         
     | 
| 
       561 
611 
     | 
    
         
             
                        assert_equal @count, @widget.versions.length
         
     | 
| 
       562 
612 
     | 
    
         
             
                      end
         
     | 
| 
       563 
613 
     | 
    
         | 
| 
       564 
     | 
    
         
            -
                      should  
     | 
| 
      
 614 
     | 
    
         
            +
                      should "enable paper trail after call" do
         
     | 
| 
       565 
615 
     | 
    
         
             
                        assert Widget.paper_trail_enabled_for_model?
         
     | 
| 
       566 
616 
     | 
    
         
             
                      end
         
     | 
| 
       567 
617 
     | 
    
         
             
                    end
         
     | 
| 
       568 
618 
     | 
    
         | 
| 
       569 
     | 
    
         
            -
                    context  
     | 
| 
      
 619 
     | 
    
         
            +
                    context "when receiving a method name as an argument" do
         
     | 
| 
       570 
620 
     | 
    
         
             
                      setup { @widget.without_versioning(:touch_with_version) }
         
     | 
| 
       571 
621 
     | 
    
         | 
| 
       572 
     | 
    
         
            -
                      should  
     | 
| 
      
 622 
     | 
    
         
            +
                      should "not create new version" do
         
     | 
| 
       573 
623 
     | 
    
         
             
                        assert_equal @count, @widget.versions.length
         
     | 
| 
       574 
624 
     | 
    
         
             
                      end
         
     | 
| 
       575 
625 
     | 
    
         | 
| 
       576 
     | 
    
         
            -
                      should  
     | 
| 
      
 626 
     | 
    
         
            +
                      should "enable paper trail after call" do
         
     | 
| 
       577 
627 
     | 
    
         
             
                        assert Widget.paper_trail_enabled_for_model?
         
     | 
| 
       578 
628 
     | 
    
         
             
                      end
         
     | 
| 
       579 
629 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -581,107 +631,117 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       581 
631 
     | 
    
         
             
                end
         
     | 
| 
       582 
632 
     | 
    
         
             
              end
         
     | 
| 
       583 
633 
     | 
    
         | 
| 
       584 
     | 
    
         
            -
             
     | 
| 
       585 
     | 
    
         
            -
              context 'A papertrail with somebody making changes' do
         
     | 
| 
      
 634 
     | 
    
         
            +
              context "A papertrail with somebody making changes" do
         
     | 
| 
       586 
635 
     | 
    
         
             
                setup do
         
     | 
| 
       587 
     | 
    
         
            -
                  @widget = Widget.new : 
     | 
| 
      
 636 
     | 
    
         
            +
                  @widget = Widget.new name: "Fidget"
         
     | 
| 
       588 
637 
     | 
    
         
             
                end
         
     | 
| 
       589 
638 
     | 
    
         | 
| 
       590 
     | 
    
         
            -
                context  
     | 
| 
      
 639 
     | 
    
         
            +
                context "when a record is created" do
         
     | 
| 
       591 
640 
     | 
    
         
             
                  setup do
         
     | 
| 
       592 
     | 
    
         
            -
                    PaperTrail.whodunnit =  
     | 
| 
      
 641 
     | 
    
         
            +
                    PaperTrail.whodunnit = "Alice"
         
     | 
| 
       593 
642 
     | 
    
         
             
                    @widget.save
         
     | 
| 
       594 
     | 
    
         
            -
                    @version = @widget.versions.last 
     | 
| 
      
 643 
     | 
    
         
            +
                    @version = @widget.versions.last # only 1 version
         
     | 
| 
       595 
644 
     | 
    
         
             
                  end
         
     | 
| 
       596 
645 
     | 
    
         | 
| 
       597 
     | 
    
         
            -
                  should  
     | 
| 
       598 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 646 
     | 
    
         
            +
                  should "track who made the change" do
         
     | 
| 
      
 647 
     | 
    
         
            +
                    assert_equal "Alice", @version.whodunnit
         
     | 
| 
       599 
648 
     | 
    
         
             
                    assert_nil   @version.paper_trail_originator
         
     | 
| 
       600 
     | 
    
         
            -
                    assert_equal  
     | 
| 
       601 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 649 
     | 
    
         
            +
                    assert_equal "Alice", @version.terminator
         
     | 
| 
      
 650 
     | 
    
         
            +
                    assert_equal "Alice", @widget.paper_trail_originator
         
     | 
| 
       602 
651 
     | 
    
         
             
                  end
         
     | 
| 
       603 
652 
     | 
    
         | 
| 
       604 
     | 
    
         
            -
                  context  
     | 
| 
      
 653 
     | 
    
         
            +
                  context "when a record is updated" do
         
     | 
| 
       605 
654 
     | 
    
         
             
                    setup do
         
     | 
| 
       606 
     | 
    
         
            -
                      PaperTrail.whodunnit =  
     | 
| 
       607 
     | 
    
         
            -
                      @widget.update_attributes : 
     | 
| 
      
 655 
     | 
    
         
            +
                      PaperTrail.whodunnit = "Bob"
         
     | 
| 
      
 656 
     | 
    
         
            +
                      @widget.update_attributes name: "Rivet"
         
     | 
| 
       608 
657 
     | 
    
         
             
                      @version = @widget.versions.last
         
     | 
| 
       609 
658 
     | 
    
         
             
                    end
         
     | 
| 
       610 
659 
     | 
    
         | 
| 
       611 
     | 
    
         
            -
                    should  
     | 
| 
       612 
     | 
    
         
            -
                      assert_equal  
     | 
| 
       613 
     | 
    
         
            -
                      assert_equal  
     | 
| 
       614 
     | 
    
         
            -
                      assert_equal  
     | 
| 
       615 
     | 
    
         
            -
                      assert_equal  
     | 
| 
      
 660 
     | 
    
         
            +
                    should "track who made the change" do
         
     | 
| 
      
 661 
     | 
    
         
            +
                      assert_equal "Bob",   @version.whodunnit
         
     | 
| 
      
 662 
     | 
    
         
            +
                      assert_equal "Alice", @version.paper_trail_originator
         
     | 
| 
      
 663 
     | 
    
         
            +
                      assert_equal "Bob",   @version.terminator
         
     | 
| 
      
 664 
     | 
    
         
            +
                      assert_equal "Bob",   @widget.paper_trail_originator
         
     | 
| 
       616 
665 
     | 
    
         
             
                    end
         
     | 
| 
       617 
666 
     | 
    
         | 
| 
       618 
     | 
    
         
            -
                    context  
     | 
| 
      
 667 
     | 
    
         
            +
                    context "when a record is destroyed" do
         
     | 
| 
       619 
668 
     | 
    
         
             
                      setup do
         
     | 
| 
       620 
     | 
    
         
            -
                        PaperTrail.whodunnit =  
     | 
| 
      
 669 
     | 
    
         
            +
                        PaperTrail.whodunnit = "Charlie"
         
     | 
| 
       621 
670 
     | 
    
         
             
                        @widget.destroy
         
     | 
| 
       622 
671 
     | 
    
         
             
                        @version = PaperTrail::Version.last
         
     | 
| 
       623 
672 
     | 
    
         
             
                      end
         
     | 
| 
       624 
673 
     | 
    
         | 
| 
       625 
     | 
    
         
            -
                      should  
     | 
| 
       626 
     | 
    
         
            -
                        assert_equal  
     | 
| 
       627 
     | 
    
         
            -
                        assert_equal  
     | 
| 
       628 
     | 
    
         
            -
                        assert_equal  
     | 
| 
       629 
     | 
    
         
            -
                        assert_equal  
     | 
| 
      
 674 
     | 
    
         
            +
                      should "track who made the change" do
         
     | 
| 
      
 675 
     | 
    
         
            +
                        assert_equal "Charlie", @version.whodunnit
         
     | 
| 
      
 676 
     | 
    
         
            +
                        assert_equal "Bob",     @version.paper_trail_originator
         
     | 
| 
      
 677 
     | 
    
         
            +
                        assert_equal "Charlie", @version.terminator
         
     | 
| 
      
 678 
     | 
    
         
            +
                        assert_equal "Charlie", @widget.paper_trail_originator
         
     | 
| 
       630 
679 
     | 
    
         
             
                      end
         
     | 
| 
       631 
680 
     | 
    
         
             
                    end
         
     | 
| 
       632 
681 
     | 
    
         
             
                  end
         
     | 
| 
       633 
682 
     | 
    
         
             
                end
         
     | 
| 
       634 
683 
     | 
    
         
             
              end
         
     | 
| 
       635 
684 
     | 
    
         | 
| 
       636 
     | 
    
         
            -
             
     | 
| 
       637 
     | 
    
         
            -
              context 'Timestamps' do
         
     | 
| 
      
 685 
     | 
    
         
            +
              context "Timestamps" do
         
     | 
| 
       638 
686 
     | 
    
         
             
                setup do
         
     | 
| 
       639 
     | 
    
         
            -
                  @wotsit = Wotsit.create! : 
     | 
| 
      
 687 
     | 
    
         
            +
                  @wotsit = Wotsit.create! name: "wotsit"
         
     | 
| 
       640 
688 
     | 
    
         
             
                end
         
     | 
| 
       641 
689 
     | 
    
         | 
| 
       642 
     | 
    
         
            -
                should  
     | 
| 
       643 
     | 
    
         
            -
                  @wotsit.update_attributes! : 
     | 
| 
      
 690 
     | 
    
         
            +
                should "record timestamps" do
         
     | 
| 
      
 691 
     | 
    
         
            +
                  @wotsit.update_attributes! name: "changed"
         
     | 
| 
       644 
692 
     | 
    
         
             
                  assert_not_nil @wotsit.versions.last.reify.created_at
         
     | 
| 
       645 
693 
     | 
    
         
             
                  assert_not_nil @wotsit.versions.last.reify.updated_at
         
     | 
| 
       646 
694 
     | 
    
         
             
                end
         
     | 
| 
       647 
695 
     | 
    
         | 
| 
       648 
     | 
    
         
            -
                 
     | 
| 
       649 
     | 
    
         
            -
             
     | 
| 
       650 
     | 
    
         
            -
             
     | 
| 
       651 
     | 
    
         
            -
             
     | 
| 
       652 
     | 
    
         
            -
             
     | 
| 
       653 
     | 
    
         
            -
             
     | 
| 
      
 696 
     | 
    
         
            +
                # Tests that it doesn't try to write created_on as an attribute just because
         
     | 
| 
      
 697 
     | 
    
         
            +
                # a created_on method exists.
         
     | 
| 
      
 698 
     | 
    
         
            +
                #
         
     | 
| 
      
 699 
     | 
    
         
            +
                # - Deprecation warning in Rails 3.2
         
     | 
| 
      
 700 
     | 
    
         
            +
                # - ActiveModel::MissingAttributeError in Rails 4
         
     | 
| 
      
 701 
     | 
    
         
            +
                #
         
     | 
| 
      
 702 
     | 
    
         
            +
                # In rails 5, `capture` is deprecated in favor of `capture_io`.
         
     | 
| 
      
 703 
     | 
    
         
            +
                #
         
     | 
| 
      
 704 
     | 
    
         
            +
                should "not generate warning" do
         
     | 
| 
      
 705 
     | 
    
         
            +
                  assert_update_raises_nothing = lambda {
         
     | 
| 
      
 706 
     | 
    
         
            +
                    assert_nothing_raised {
         
     | 
| 
      
 707 
     | 
    
         
            +
                      @wotsit.update_attributes! name: "changed"
         
     | 
| 
       654 
708 
     | 
    
         
             
                    }
         
     | 
| 
       655 
709 
     | 
    
         
             
                  }
         
     | 
| 
       656 
     | 
    
         
            -
                   
     | 
| 
      
 710 
     | 
    
         
            +
                  warnings =
         
     | 
| 
      
 711 
     | 
    
         
            +
                    if respond_to?(:capture_io)
         
     | 
| 
      
 712 
     | 
    
         
            +
                      capture_io { assert_update_raises_nothing.call }.last
         
     | 
| 
      
 713 
     | 
    
         
            +
                    else
         
     | 
| 
      
 714 
     | 
    
         
            +
                      capture(:stderr) { assert_update_raises_nothing.call }
         
     | 
| 
      
 715 
     | 
    
         
            +
                    end
         
     | 
| 
      
 716 
     | 
    
         
            +
                  assert_equal "", warnings
         
     | 
| 
       657 
717 
     | 
    
         
             
                end
         
     | 
| 
       658 
     | 
    
         
            -
             
     | 
| 
       659 
718 
     | 
    
         
             
              end
         
     | 
| 
       660 
719 
     | 
    
         | 
| 
       661 
     | 
    
         
            -
             
     | 
| 
       662 
     | 
    
         
            -
              context 'A subclass' do
         
     | 
| 
      
 720 
     | 
    
         
            +
              context "A subclass" do
         
     | 
| 
       663 
721 
     | 
    
         
             
                setup do
         
     | 
| 
       664 
722 
     | 
    
         
             
                  @foo = FooWidget.create
         
     | 
| 
       665 
     | 
    
         
            -
                  @foo.update_attributes! : 
     | 
| 
      
 723 
     | 
    
         
            +
                  @foo.update_attributes! name: "Foo"
         
     | 
| 
       666 
724 
     | 
    
         
             
                end
         
     | 
| 
       667 
725 
     | 
    
         | 
| 
       668 
     | 
    
         
            -
                should  
     | 
| 
       669 
     | 
    
         
            -
                  # For some reason this test appears to be broken on AR4 in the test env. 
     | 
| 
      
 726 
     | 
    
         
            +
                should "reify with the correct type" do
         
     | 
| 
      
 727 
     | 
    
         
            +
                  # For some reason this test appears to be broken on AR4 in the test env.
         
     | 
| 
      
 728 
     | 
    
         
            +
                  # Executing it manually in the Rails console seems to work.. not sure what
         
     | 
| 
      
 729 
     | 
    
         
            +
                  # the issues is here.
         
     | 
| 
       670 
730 
     | 
    
         
             
                  assert_kind_of FooWidget, @foo.versions.last.reify if ActiveRecord::VERSION::MAJOR < 4
         
     | 
| 
       671 
731 
     | 
    
         
             
                  assert_equal @foo.versions.first, PaperTrail::Version.last.previous
         
     | 
| 
       672 
732 
     | 
    
         
             
                  assert_nil PaperTrail::Version.last.next
         
     | 
| 
       673 
733 
     | 
    
         
             
                end
         
     | 
| 
       674 
734 
     | 
    
         | 
| 
       675 
     | 
    
         
            -
                should  
     | 
| 
       676 
     | 
    
         
            -
                  PaperTrail.whodunnit =  
     | 
| 
       677 
     | 
    
         
            -
                  @foo.update_attribute(:name,  
     | 
| 
      
 735 
     | 
    
         
            +
                should "should return the correct originator" do
         
     | 
| 
      
 736 
     | 
    
         
            +
                  PaperTrail.whodunnit = "Ben"
         
     | 
| 
      
 737 
     | 
    
         
            +
                  @foo.update_attribute(:name, "Geoffrey")
         
     | 
| 
       678 
738 
     | 
    
         
             
                  assert_equal PaperTrail.whodunnit, @foo.paper_trail_originator
         
     | 
| 
       679 
739 
     | 
    
         
             
                end
         
     | 
| 
       680 
740 
     | 
    
         | 
| 
       681 
     | 
    
         
            -
                context  
     | 
| 
      
 741 
     | 
    
         
            +
                context "when destroyed" do
         
     | 
| 
       682 
742 
     | 
    
         
             
                  setup { @foo.destroy }
         
     | 
| 
       683 
743 
     | 
    
         | 
| 
       684 
     | 
    
         
            -
                  should  
     | 
| 
      
 744 
     | 
    
         
            +
                  should "reify with the correct type" do
         
     | 
| 
       685 
745 
     | 
    
         
             
                    assert_kind_of FooWidget, @foo.versions.last.reify
         
     | 
| 
       686 
746 
     | 
    
         
             
                    assert_equal @foo.versions[1], PaperTrail::Version.last.previous
         
     | 
| 
       687 
747 
     | 
    
         
             
                    assert_nil PaperTrail::Version.last.next
         
     | 
| 
         @@ -689,250 +749,250 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       689 
749 
     | 
    
         
             
                end
         
     | 
| 
       690 
750 
     | 
    
         
             
              end
         
     | 
| 
       691 
751 
     | 
    
         | 
| 
       692 
     | 
    
         
            -
             
     | 
| 
       693 
     | 
    
         
            -
              context 'An item with versions' do
         
     | 
| 
      
 752 
     | 
    
         
            +
              context "An item with versions" do
         
     | 
| 
       694 
753 
     | 
    
         
             
                setup do
         
     | 
| 
       695 
     | 
    
         
            -
                  @widget = Widget.create : 
     | 
| 
       696 
     | 
    
         
            -
                  @widget.update_attributes : 
     | 
| 
       697 
     | 
    
         
            -
                  @widget.update_attributes : 
     | 
| 
      
 754 
     | 
    
         
            +
                  @widget = Widget.create name: "Widget"
         
     | 
| 
      
 755 
     | 
    
         
            +
                  @widget.update_attributes name: "Fidget"
         
     | 
| 
      
 756 
     | 
    
         
            +
                  @widget.update_attributes name: "Digit"
         
     | 
| 
       698 
757 
     | 
    
         
             
                end
         
     | 
| 
       699 
758 
     | 
    
         | 
| 
       700 
     | 
    
         
            -
                context  
     | 
| 
      
 759 
     | 
    
         
            +
                context "which were created over time" do
         
     | 
| 
       701 
760 
     | 
    
         
             
                  setup do
         
     | 
| 
       702 
     | 
    
         
            -
                    @created 
     | 
| 
       703 
     | 
    
         
            -
                    @first_update 
     | 
| 
      
 761 
     | 
    
         
            +
                    @created = 2.days.ago
         
     | 
| 
      
 762 
     | 
    
         
            +
                    @first_update = 1.day.ago
         
     | 
| 
       704 
763 
     | 
    
         
             
                    @second_update = 1.hour.ago
         
     | 
| 
       705 
     | 
    
         
            -
                    @widget.versions[0].update_attributes : 
     | 
| 
       706 
     | 
    
         
            -
                    @widget.versions[1].update_attributes : 
     | 
| 
       707 
     | 
    
         
            -
                    @widget.versions[2].update_attributes : 
     | 
| 
      
 764 
     | 
    
         
            +
                    @widget.versions[0].update_attributes created_at: @created
         
     | 
| 
      
 765 
     | 
    
         
            +
                    @widget.versions[1].update_attributes created_at: @first_update
         
     | 
| 
      
 766 
     | 
    
         
            +
                    @widget.versions[2].update_attributes created_at: @second_update
         
     | 
| 
       708 
767 
     | 
    
         
             
                    @widget.update_attribute :updated_at, @second_update
         
     | 
| 
       709 
768 
     | 
    
         
             
                  end
         
     | 
| 
       710 
769 
     | 
    
         | 
| 
       711 
     | 
    
         
            -
                  should  
     | 
| 
      
 770 
     | 
    
         
            +
                  should "return nil for version_at before it was created" do
         
     | 
| 
       712 
771 
     | 
    
         
             
                    assert_nil @widget.version_at(@created - 1)
         
     | 
| 
       713 
772 
     | 
    
         
             
                  end
         
     | 
| 
       714 
773 
     | 
    
         | 
| 
       715 
     | 
    
         
            -
                  should  
     | 
| 
       716 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 774 
     | 
    
         
            +
                  should "return how it looked when created for version_at its creation" do
         
     | 
| 
      
 775 
     | 
    
         
            +
                    assert_equal "Widget", @widget.version_at(@created).name
         
     | 
| 
       717 
776 
     | 
    
         
             
                  end
         
     | 
| 
       718 
777 
     | 
    
         | 
| 
       719 
     | 
    
         
            -
                  should "return how it looked  
     | 
| 
       720 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 778 
     | 
    
         
            +
                  should "return how it looked before its first update" do
         
     | 
| 
      
 779 
     | 
    
         
            +
                    assert_equal "Widget", @widget.version_at(@first_update - 1).name
         
     | 
| 
       721 
780 
     | 
    
         
             
                  end
         
     | 
| 
       722 
781 
     | 
    
         | 
| 
       723 
     | 
    
         
            -
                  should "return how it looked  
     | 
| 
       724 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 782 
     | 
    
         
            +
                  should "return how it looked after its first update" do
         
     | 
| 
      
 783 
     | 
    
         
            +
                    assert_equal "Fidget", @widget.version_at(@first_update).name
         
     | 
| 
       725 
784 
     | 
    
         
             
                  end
         
     | 
| 
       726 
785 
     | 
    
         | 
| 
       727 
     | 
    
         
            -
                  should  
     | 
| 
       728 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 786 
     | 
    
         
            +
                  should "return how it looked before its second update" do
         
     | 
| 
      
 787 
     | 
    
         
            +
                    assert_equal "Fidget", @widget.version_at(@second_update - 1).name
         
     | 
| 
       729 
788 
     | 
    
         
             
                  end
         
     | 
| 
       730 
789 
     | 
    
         | 
| 
       731 
     | 
    
         
            -
                  should  
     | 
| 
       732 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 790 
     | 
    
         
            +
                  should "return how it looked after its second update" do
         
     | 
| 
      
 791 
     | 
    
         
            +
                    assert_equal "Digit", @widget.version_at(@second_update).name
         
     | 
| 
       733 
792 
     | 
    
         
             
                  end
         
     | 
| 
       734 
793 
     | 
    
         | 
| 
       735 
     | 
    
         
            -
                  should  
     | 
| 
       736 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 794 
     | 
    
         
            +
                  should "return the current object for version_at after latest update" do
         
     | 
| 
      
 795 
     | 
    
         
            +
                    assert_equal "Digit", @widget.version_at(1.day.from_now).name
         
     | 
| 
       737 
796 
     | 
    
         
             
                  end
         
     | 
| 
       738 
797 
     | 
    
         | 
| 
       739 
     | 
    
         
            -
                  context  
     | 
| 
       740 
     | 
    
         
            -
                    should  
     | 
| 
       741 
     | 
    
         
            -
                      # need to add 1 second onto the timestamps before casting to a string, 
     | 
| 
       742 
     | 
    
         
            -
                       
     | 
| 
       743 
     | 
    
         
            -
                      assert_equal  
     | 
| 
       744 
     | 
    
         
            -
                      assert_equal  
     | 
| 
      
 798 
     | 
    
         
            +
                  context "passing in a string representation of a timestamp" do
         
     | 
| 
      
 799 
     | 
    
         
            +
                    should "still return a widget when appropriate" do
         
     | 
| 
      
 800 
     | 
    
         
            +
                      # need to add 1 second onto the timestamps before casting to a string,
         
     | 
| 
      
 801 
     | 
    
         
            +
                      # since casting a Time to a string drops the microseconds
         
     | 
| 
      
 802 
     | 
    
         
            +
                      assert_equal "Widget", @widget.version_at((@created + 1.second).to_s).name
         
     | 
| 
      
 803 
     | 
    
         
            +
                      assert_equal "Fidget", @widget.version_at((@first_update + 1.second).to_s).name
         
     | 
| 
      
 804 
     | 
    
         
            +
                      assert_equal "Digit", @widget.version_at((@second_update + 1.second).to_s).name
         
     | 
| 
       745 
805 
     | 
    
         
             
                    end
         
     | 
| 
       746 
806 
     | 
    
         
             
                  end
         
     | 
| 
       747 
807 
     | 
    
         
             
                end
         
     | 
| 
       748 
808 
     | 
    
         | 
| 
       749 
     | 
    
         
            -
                context  
     | 
| 
      
 809 
     | 
    
         
            +
                context ".versions_between" do
         
     | 
| 
       750 
810 
     | 
    
         
             
                  setup do
         
     | 
| 
       751 
     | 
    
         
            -
                    @created 
     | 
| 
       752 
     | 
    
         
            -
                    @first_update 
     | 
| 
      
 811 
     | 
    
         
            +
                    @created = 30.days.ago
         
     | 
| 
      
 812 
     | 
    
         
            +
                    @first_update = 15.days.ago
         
     | 
| 
       753 
813 
     | 
    
         
             
                    @second_update = 1.day.ago
         
     | 
| 
       754 
     | 
    
         
            -
                    @widget.versions[0].update_attributes : 
     | 
| 
       755 
     | 
    
         
            -
                    @widget.versions[1].update_attributes : 
     | 
| 
       756 
     | 
    
         
            -
                    @widget.versions[2].update_attributes : 
     | 
| 
      
 814 
     | 
    
         
            +
                    @widget.versions[0].update_attributes created_at: @created
         
     | 
| 
      
 815 
     | 
    
         
            +
                    @widget.versions[1].update_attributes created_at: @first_update
         
     | 
| 
      
 816 
     | 
    
         
            +
                    @widget.versions[2].update_attributes created_at: @second_update
         
     | 
| 
       757 
817 
     | 
    
         
             
                    @widget.update_attribute :updated_at, @second_update
         
     | 
| 
       758 
818 
     | 
    
         
             
                  end
         
     | 
| 
       759 
819 
     | 
    
         | 
| 
       760 
     | 
    
         
            -
                  should  
     | 
| 
       761 
     | 
    
         
            -
                    assert_equal [ 
     | 
| 
       762 
     | 
    
         
            -
             
     | 
| 
       763 
     | 
    
         
            -
                    assert_equal  
     | 
| 
       764 
     | 
    
         
            -
             
     | 
| 
      
 820 
     | 
    
         
            +
                  should "return versions in the time period" do
         
     | 
| 
      
 821 
     | 
    
         
            +
                    assert_equal ["Fidget"],
         
     | 
| 
      
 822 
     | 
    
         
            +
                      @widget.versions_between(20.days.ago, 10.days.ago).map(&:name)
         
     | 
| 
      
 823 
     | 
    
         
            +
                    assert_equal %w(Widget Fidget),
         
     | 
| 
      
 824 
     | 
    
         
            +
                      @widget.versions_between(45.days.ago, 10.days.ago).map(&:name)
         
     | 
| 
      
 825 
     | 
    
         
            +
                    assert_equal %w(Fidget Digit Digit),
         
     | 
| 
      
 826 
     | 
    
         
            +
                      @widget.versions_between(16.days.ago, 1.minute.ago).map(&:name)
         
     | 
| 
      
 827 
     | 
    
         
            +
                    assert_equal [],
         
     | 
| 
      
 828 
     | 
    
         
            +
                      @widget.versions_between(60.days.ago, 45.days.ago).map(&:name)
         
     | 
| 
       765 
829 
     | 
    
         
             
                  end
         
     | 
| 
       766 
830 
     | 
    
         
             
                end
         
     | 
| 
       767 
831 
     | 
    
         | 
| 
       768 
     | 
    
         
            -
                context  
     | 
| 
      
 832 
     | 
    
         
            +
                context "on the first version" do
         
     | 
| 
       769 
833 
     | 
    
         
             
                  setup { @version = @widget.versions.first }
         
     | 
| 
       770 
834 
     | 
    
         | 
| 
       771 
     | 
    
         
            -
                  should  
     | 
| 
      
 835 
     | 
    
         
            +
                  should "have a nil previous version" do
         
     | 
| 
       772 
836 
     | 
    
         
             
                    assert_nil @version.previous
         
     | 
| 
       773 
837 
     | 
    
         
             
                  end
         
     | 
| 
       774 
838 
     | 
    
         | 
| 
       775 
     | 
    
         
            -
                  should  
     | 
| 
      
 839 
     | 
    
         
            +
                  should "return the next version" do
         
     | 
| 
       776 
840 
     | 
    
         
             
                    assert_equal @widget.versions[1], @version.next
         
     | 
| 
       777 
841 
     | 
    
         
             
                  end
         
     | 
| 
       778 
842 
     | 
    
         | 
| 
       779 
     | 
    
         
            -
                  should  
     | 
| 
      
 843 
     | 
    
         
            +
                  should "return the correct index" do
         
     | 
| 
       780 
844 
     | 
    
         
             
                    assert_equal 0, @version.index
         
     | 
| 
       781 
845 
     | 
    
         
             
                  end
         
     | 
| 
       782 
846 
     | 
    
         
             
                end
         
     | 
| 
       783 
847 
     | 
    
         | 
| 
       784 
     | 
    
         
            -
                context  
     | 
| 
      
 848 
     | 
    
         
            +
                context "on the last version" do
         
     | 
| 
       785 
849 
     | 
    
         
             
                  setup { @version = @widget.versions.last }
         
     | 
| 
       786 
850 
     | 
    
         | 
| 
       787 
     | 
    
         
            -
                  should  
     | 
| 
      
 851 
     | 
    
         
            +
                  should "return the previous version" do
         
     | 
| 
       788 
852 
     | 
    
         
             
                    assert_equal @widget.versions[@widget.versions.length - 2], @version.previous
         
     | 
| 
       789 
853 
     | 
    
         
             
                  end
         
     | 
| 
       790 
854 
     | 
    
         | 
| 
       791 
     | 
    
         
            -
                  should  
     | 
| 
      
 855 
     | 
    
         
            +
                  should "have a nil next version" do
         
     | 
| 
       792 
856 
     | 
    
         
             
                    assert_nil @version.next
         
     | 
| 
       793 
857 
     | 
    
         
             
                  end
         
     | 
| 
       794 
858 
     | 
    
         | 
| 
       795 
     | 
    
         
            -
                  should  
     | 
| 
      
 859 
     | 
    
         
            +
                  should "return the correct index" do
         
     | 
| 
       796 
860 
     | 
    
         
             
                    assert_equal @widget.versions.length - 1, @version.index
         
     | 
| 
       797 
861 
     | 
    
         
             
                  end
         
     | 
| 
       798 
862 
     | 
    
         
             
                end
         
     | 
| 
       799 
863 
     | 
    
         
             
              end
         
     | 
| 
       800 
864 
     | 
    
         | 
| 
       801 
     | 
    
         
            -
             
     | 
| 
       802 
     | 
    
         
            -
              context 'An item' do
         
     | 
| 
      
 865 
     | 
    
         
            +
              context "An item" do
         
     | 
| 
       803 
866 
     | 
    
         
             
                setup do
         
     | 
| 
       804 
     | 
    
         
            -
                  @initial_title =  
     | 
| 
       805 
     | 
    
         
            -
                  @article = Article.new : 
     | 
| 
      
 867 
     | 
    
         
            +
                  @initial_title = "Foobar"
         
     | 
| 
      
 868 
     | 
    
         
            +
                  @article = Article.new title: @initial_title
         
     | 
| 
       806 
869 
     | 
    
         
             
                end
         
     | 
| 
       807 
870 
     | 
    
         | 
| 
       808 
     | 
    
         
            -
                context  
     | 
| 
      
 871 
     | 
    
         
            +
                context "which is created" do
         
     | 
| 
       809 
872 
     | 
    
         
             
                  setup { @article.save }
         
     | 
| 
       810 
873 
     | 
    
         | 
| 
       811 
     | 
    
         
            -
                  should  
     | 
| 
      
 874 
     | 
    
         
            +
                  should "store fixed meta data" do
         
     | 
| 
       812 
875 
     | 
    
         
             
                    assert_equal 42, @article.versions.last.answer
         
     | 
| 
       813 
876 
     | 
    
         
             
                  end
         
     | 
| 
       814 
877 
     | 
    
         | 
| 
       815 
     | 
    
         
            -
                  should  
     | 
| 
       816 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 878 
     | 
    
         
            +
                  should "store dynamic meta data which is independent of the item" do
         
     | 
| 
      
 879 
     | 
    
         
            +
                    assert_equal "31 + 11 = 42", @article.versions.last.question
         
     | 
| 
       817 
880 
     | 
    
         
             
                  end
         
     | 
| 
       818 
881 
     | 
    
         | 
| 
       819 
     | 
    
         
            -
                  should  
     | 
| 
      
 882 
     | 
    
         
            +
                  should "store dynamic meta data which depends on the item" do
         
     | 
| 
       820 
883 
     | 
    
         
             
                    assert_equal @article.id, @article.versions.last.article_id
         
     | 
| 
       821 
884 
     | 
    
         
             
                  end
         
     | 
| 
       822 
885 
     | 
    
         | 
| 
       823 
     | 
    
         
            -
                  should  
     | 
| 
      
 886 
     | 
    
         
            +
                  should "store dynamic meta data based on a method of the item" do
         
     | 
| 
       824 
887 
     | 
    
         
             
                    assert_equal @article.action_data_provider_method, @article.versions.last.action
         
     | 
| 
       825 
888 
     | 
    
         
             
                  end
         
     | 
| 
       826 
889 
     | 
    
         | 
| 
       827 
     | 
    
         
            -
                  should  
     | 
| 
      
 890 
     | 
    
         
            +
                  should "store dynamic meta data based on an attribute of the item at creation" do
         
     | 
| 
       828 
891 
     | 
    
         
             
                    assert_equal @initial_title, @article.versions.last.title
         
     | 
| 
       829 
892 
     | 
    
         
             
                  end
         
     | 
| 
       830 
893 
     | 
    
         | 
| 
       831 
     | 
    
         
            -
             
     | 
| 
       832 
     | 
    
         
            -
                  context 'and updated' do
         
     | 
| 
      
 894 
     | 
    
         
            +
                  context "and updated" do
         
     | 
| 
       833 
895 
     | 
    
         
             
                    setup do
         
     | 
| 
       834 
     | 
    
         
            -
                      @article.update_attributes! : 
     | 
| 
      
 896 
     | 
    
         
            +
                      @article.update_attributes! content: "Better text.", title: "Rhubarb"
         
     | 
| 
       835 
897 
     | 
    
         
             
                    end
         
     | 
| 
       836 
898 
     | 
    
         | 
| 
       837 
     | 
    
         
            -
                    should  
     | 
| 
      
 899 
     | 
    
         
            +
                    should "store fixed meta data" do
         
     | 
| 
       838 
900 
     | 
    
         
             
                      assert_equal 42, @article.versions.last.answer
         
     | 
| 
       839 
901 
     | 
    
         
             
                    end
         
     | 
| 
       840 
902 
     | 
    
         | 
| 
       841 
     | 
    
         
            -
                    should  
     | 
| 
       842 
     | 
    
         
            -
                      assert_equal  
     | 
| 
      
 903 
     | 
    
         
            +
                    should "store dynamic meta data which is independent of the item" do
         
     | 
| 
      
 904 
     | 
    
         
            +
                      assert_equal "31 + 11 = 42", @article.versions.last.question
         
     | 
| 
       843 
905 
     | 
    
         
             
                    end
         
     | 
| 
       844 
906 
     | 
    
         | 
| 
       845 
     | 
    
         
            -
                    should  
     | 
| 
      
 907 
     | 
    
         
            +
                    should "store dynamic meta data which depends on the item" do
         
     | 
| 
       846 
908 
     | 
    
         
             
                      assert_equal @article.id, @article.versions.last.article_id
         
     | 
| 
       847 
909 
     | 
    
         
             
                    end
         
     | 
| 
       848 
910 
     | 
    
         | 
| 
       849 
     | 
    
         
            -
                    should  
     | 
| 
      
 911 
     | 
    
         
            +
                    should "store dynamic meta data based on an attribute of the item prior to the update" do
         
     | 
| 
       850 
912 
     | 
    
         
             
                      assert_equal @initial_title, @article.versions.last.title
         
     | 
| 
       851 
913 
     | 
    
         
             
                    end
         
     | 
| 
       852 
914 
     | 
    
         
             
                  end
         
     | 
| 
       853 
915 
     | 
    
         | 
| 
       854 
     | 
    
         
            -
             
     | 
| 
       855 
     | 
    
         
            -
                  context 'and destroyed' do
         
     | 
| 
      
 916 
     | 
    
         
            +
                  context "and destroyed" do
         
     | 
| 
       856 
917 
     | 
    
         
             
                    setup { @article.destroy }
         
     | 
| 
       857 
918 
     | 
    
         | 
| 
       858 
     | 
    
         
            -
                    should  
     | 
| 
      
 919 
     | 
    
         
            +
                    should "store fixed metadata" do
         
     | 
| 
       859 
920 
     | 
    
         
             
                      assert_equal 42, @article.versions.last.answer
         
     | 
| 
       860 
921 
     | 
    
         
             
                    end
         
     | 
| 
       861 
922 
     | 
    
         | 
| 
       862 
     | 
    
         
            -
                    should  
     | 
| 
       863 
     | 
    
         
            -
                      assert_equal  
     | 
| 
      
 923 
     | 
    
         
            +
                    should "store dynamic metadata which is independent of the item" do
         
     | 
| 
      
 924 
     | 
    
         
            +
                      assert_equal "31 + 11 = 42", @article.versions.last.question
         
     | 
| 
       864 
925 
     | 
    
         
             
                    end
         
     | 
| 
       865 
926 
     | 
    
         | 
| 
       866 
     | 
    
         
            -
                    should  
     | 
| 
      
 927 
     | 
    
         
            +
                    should "store dynamic metadata which depends on the item" do
         
     | 
| 
       867 
928 
     | 
    
         
             
                      assert_equal @article.id, @article.versions.last.article_id
         
     | 
| 
       868 
929 
     | 
    
         
             
                    end
         
     | 
| 
       869 
930 
     | 
    
         | 
| 
       870 
     | 
    
         
            -
                    should  
     | 
| 
      
 931 
     | 
    
         
            +
                    should "store dynamic metadata based on attribute of item prior to destruction" do
         
     | 
| 
       871 
932 
     | 
    
         
             
                      assert_equal @initial_title, @article.versions.last.title
         
     | 
| 
       872 
933 
     | 
    
         
             
                    end
         
     | 
| 
       873 
934 
     | 
    
         
             
                  end
         
     | 
| 
       874 
935 
     | 
    
         
             
                end
         
     | 
| 
       875 
936 
     | 
    
         
             
              end
         
     | 
| 
       876 
937 
     | 
    
         | 
| 
       877 
     | 
    
         
            -
              context  
     | 
| 
      
 938 
     | 
    
         
            +
              context "A reified item" do
         
     | 
| 
       878 
939 
     | 
    
         
             
                setup do
         
     | 
| 
       879 
     | 
    
         
            -
                  widget = Widget.create : 
     | 
| 
       880 
     | 
    
         
            -
                  %w( Tom Dick Jane ).each { |name| widget.update_attributes : 
     | 
| 
      
 940 
     | 
    
         
            +
                  widget = Widget.create name: "Bob"
         
     | 
| 
      
 941 
     | 
    
         
            +
                  %w( Tom Dick Jane ).each { |name| widget.update_attributes name: name }
         
     | 
| 
       881 
942 
     | 
    
         
             
                  @version = widget.versions.last
         
     | 
| 
       882 
943 
     | 
    
         
             
                  @widget = @version.reify
         
     | 
| 
       883 
944 
     | 
    
         
             
                end
         
     | 
| 
       884 
945 
     | 
    
         | 
| 
       885 
     | 
    
         
            -
                should  
     | 
| 
      
 946 
     | 
    
         
            +
                should "know which version it came from" do
         
     | 
| 
       886 
947 
     | 
    
         
             
                  assert_equal @version, @widget.version
         
     | 
| 
       887 
948 
     | 
    
         
             
                end
         
     | 
| 
       888 
949 
     | 
    
         | 
| 
       889 
     | 
    
         
            -
                should  
     | 
| 
      
 950 
     | 
    
         
            +
                should "return its previous self" do
         
     | 
| 
       890 
951 
     | 
    
         
             
                  assert_equal @widget.versions[-2].reify, @widget.previous_version
         
     | 
| 
       891 
952 
     | 
    
         
             
                end
         
     | 
| 
       892 
953 
     | 
    
         
             
              end
         
     | 
| 
       893 
954 
     | 
    
         | 
| 
       894 
     | 
    
         
            -
             
     | 
| 
       895 
     | 
    
         
            -
              context 'A non-reified item' do
         
     | 
| 
      
 955 
     | 
    
         
            +
              context "A non-reified item" do
         
     | 
| 
       896 
956 
     | 
    
         
             
                setup { @widget = Widget.new }
         
     | 
| 
       897 
957 
     | 
    
         | 
| 
       898 
     | 
    
         
            -
                should  
     | 
| 
      
 958 
     | 
    
         
            +
                should "not have a previous version" do
         
     | 
| 
       899 
959 
     | 
    
         
             
                  assert_nil @widget.previous_version
         
     | 
| 
       900 
960 
     | 
    
         
             
                end
         
     | 
| 
       901 
961 
     | 
    
         | 
| 
       902 
     | 
    
         
            -
                should  
     | 
| 
      
 962 
     | 
    
         
            +
                should "not have a next version" do
         
     | 
| 
       903 
963 
     | 
    
         
             
                  assert_nil @widget.next_version
         
     | 
| 
       904 
964 
     | 
    
         
             
                end
         
     | 
| 
       905 
965 
     | 
    
         | 
| 
       906 
     | 
    
         
            -
                context  
     | 
| 
      
 966 
     | 
    
         
            +
                context "with versions" do
         
     | 
| 
       907 
967 
     | 
    
         
             
                  setup do
         
     | 
| 
       908 
968 
     | 
    
         
             
                    @widget.save
         
     | 
| 
       909 
     | 
    
         
            -
                    %w( Tom Dick Jane ).each { |name| @widget.update_attributes : 
     | 
| 
      
 969 
     | 
    
         
            +
                    %w( Tom Dick Jane ).each { |name| @widget.update_attributes name: name }
         
     | 
| 
       910 
970 
     | 
    
         
             
                  end
         
     | 
| 
       911 
971 
     | 
    
         | 
| 
       912 
     | 
    
         
            -
                  should  
     | 
| 
      
 972 
     | 
    
         
            +
                  should "have a previous version" do
         
     | 
| 
       913 
973 
     | 
    
         
             
                    assert_equal @widget.versions.last.reify.name, @widget.previous_version.name
         
     | 
| 
       914 
974 
     | 
    
         
             
                  end
         
     | 
| 
       915 
975 
     | 
    
         | 
| 
       916 
     | 
    
         
            -
                  should  
     | 
| 
      
 976 
     | 
    
         
            +
                  should "not have a next version" do
         
     | 
| 
       917 
977 
     | 
    
         
             
                    assert_nil @widget.next_version
         
     | 
| 
       918 
978 
     | 
    
         
             
                  end
         
     | 
| 
       919 
979 
     | 
    
         
             
                end
         
     | 
| 
       920 
980 
     | 
    
         
             
              end
         
     | 
| 
       921 
981 
     | 
    
         | 
| 
       922 
     | 
    
         
            -
              context  
     | 
| 
      
 982 
     | 
    
         
            +
              context "A reified item" do
         
     | 
| 
       923 
983 
     | 
    
         
             
                setup do
         
     | 
| 
       924 
     | 
    
         
            -
                  @widget = Widget.create : 
     | 
| 
       925 
     | 
    
         
            -
                  %w(Tom Dick Jane).each { |name| @widget.update_attributes : 
     | 
| 
       926 
     | 
    
         
            -
                  @second_widget = @widget.versions[1].reify 
     | 
| 
       927 
     | 
    
         
            -
                  @last_widget 
     | 
| 
      
 984 
     | 
    
         
            +
                  @widget = Widget.create name: "Bob"
         
     | 
| 
      
 985 
     | 
    
         
            +
                  %w(Tom Dick Jane).each { |name| @widget.update_attributes name: name }
         
     | 
| 
      
 986 
     | 
    
         
            +
                  @second_widget = @widget.versions[1].reify # first widget is `nil`
         
     | 
| 
      
 987 
     | 
    
         
            +
                  @last_widget = @widget.versions.last.reify
         
     | 
| 
       928 
988 
     | 
    
         
             
                end
         
     | 
| 
       929 
989 
     | 
    
         | 
| 
       930 
     | 
    
         
            -
                should  
     | 
| 
      
 990 
     | 
    
         
            +
                should "have a previous version" do
         
     | 
| 
       931 
991 
     | 
    
         
             
                  assert_nil @second_widget.previous_version # `create` events return `nil` for `reify`
         
     | 
| 
       932 
992 
     | 
    
         
             
                  assert_equal @widget.versions[-2].reify.name, @last_widget.previous_version.name
         
     | 
| 
       933 
993 
     | 
    
         
             
                end
         
     | 
| 
       934 
994 
     | 
    
         | 
| 
       935 
     | 
    
         
            -
                should  
     | 
| 
      
 995 
     | 
    
         
            +
                should "have a next version" do
         
     | 
| 
       936 
996 
     | 
    
         
             
                  assert_equal @widget.versions[2].reify.name, @second_widget.next_version.name
         
     | 
| 
       937 
997 
     | 
    
         
             
                  assert_equal @last_widget.next_version.name, @widget.name
         
     | 
| 
       938 
998 
     | 
    
         
             
                end
         
     | 
| 
         @@ -940,178 +1000,226 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       940 
1000 
     | 
    
         | 
| 
       941 
1001 
     | 
    
         
             
              context ":has_many :through" do
         
     | 
| 
       942 
1002 
     | 
    
         
             
                setup do
         
     | 
| 
       943 
     | 
    
         
            -
                  @book = Book.create : 
     | 
| 
       944 
     | 
    
         
            -
                  @dostoyevsky 
     | 
| 
       945 
     | 
    
         
            -
                  @solzhenitsyn = Person.create : 
     | 
| 
      
 1003 
     | 
    
         
            +
                  @book = Book.create title: "War and Peace"
         
     | 
| 
      
 1004 
     | 
    
         
            +
                  @dostoyevsky = Person.create name: "Dostoyevsky"
         
     | 
| 
      
 1005 
     | 
    
         
            +
                  @solzhenitsyn = Person.create name: "Solzhenitsyn"
         
     | 
| 
       946 
1006 
     | 
    
         
             
                end
         
     | 
| 
       947 
1007 
     | 
    
         | 
| 
       948 
     | 
    
         
            -
                should  
     | 
| 
      
 1008 
     | 
    
         
            +
                should "store version on source <<" do
         
     | 
| 
       949 
1009 
     | 
    
         
             
                  count = PaperTrail::Version.count
         
     | 
| 
       950 
1010 
     | 
    
         
             
                  @book.authors << @dostoyevsky
         
     | 
| 
       951 
1011 
     | 
    
         
             
                  assert_equal 1, PaperTrail::Version.count - count
         
     | 
| 
       952 
1012 
     | 
    
         
             
                  assert_equal PaperTrail::Version.last, @book.authorships.first.versions.first
         
     | 
| 
       953 
1013 
     | 
    
         
             
                end
         
     | 
| 
       954 
1014 
     | 
    
         | 
| 
       955 
     | 
    
         
            -
                should  
     | 
| 
      
 1015 
     | 
    
         
            +
                should "store version on source create" do
         
     | 
| 
       956 
1016 
     | 
    
         
             
                  count = PaperTrail::Version.count
         
     | 
| 
       957 
     | 
    
         
            -
                  @book.authors.create : 
     | 
| 
      
 1017 
     | 
    
         
            +
                  @book.authors.create name: "Tolstoy"
         
     | 
| 
       958 
1018 
     | 
    
         
             
                  assert_equal 2, PaperTrail::Version.count - count
         
     | 
| 
       959 
     | 
    
         
            -
                   
     | 
| 
      
 1019 
     | 
    
         
            +
                  actual = [
         
     | 
| 
      
 1020 
     | 
    
         
            +
                    PaperTrail::Version.order(:id).to_a[-2].item,
         
     | 
| 
      
 1021 
     | 
    
         
            +
                    PaperTrail::Version.last.item
         
     | 
| 
      
 1022 
     | 
    
         
            +
                  ]
         
     | 
| 
      
 1023 
     | 
    
         
            +
                  assert_same_elements [Person.last, Authorship.last], actual
         
     | 
| 
       960 
1024 
     | 
    
         
             
                end
         
     | 
| 
       961 
1025 
     | 
    
         | 
| 
       962 
     | 
    
         
            -
                should  
     | 
| 
      
 1026 
     | 
    
         
            +
                should "store version on join destroy" do
         
     | 
| 
       963 
1027 
     | 
    
         
             
                  @book.authors << @dostoyevsky
         
     | 
| 
       964 
1028 
     | 
    
         
             
                  count = PaperTrail::Version.count
         
     | 
| 
       965 
     | 
    
         
            -
                  @book.authorships 
     | 
| 
      
 1029 
     | 
    
         
            +
                  @book.authorships.reload.last.destroy
         
     | 
| 
       966 
1030 
     | 
    
         
             
                  assert_equal 1, PaperTrail::Version.count - count
         
     | 
| 
       967 
1031 
     | 
    
         
             
                  assert_equal @book, PaperTrail::Version.last.reify.book
         
     | 
| 
       968 
     | 
    
         
            -
                  assert_equal @dostoyevsky, PaperTrail::Version.last.reify. 
     | 
| 
      
 1032 
     | 
    
         
            +
                  assert_equal @dostoyevsky, PaperTrail::Version.last.reify.author
         
     | 
| 
       969 
1033 
     | 
    
         
             
                end
         
     | 
| 
       970 
1034 
     | 
    
         | 
| 
       971 
     | 
    
         
            -
                should  
     | 
| 
      
 1035 
     | 
    
         
            +
                should "store version on join clear" do
         
     | 
| 
       972 
1036 
     | 
    
         
             
                  @book.authors << @dostoyevsky
         
     | 
| 
       973 
1037 
     | 
    
         
             
                  count = PaperTrail::Version.count
         
     | 
| 
       974 
     | 
    
         
            -
                  @book.authorships 
     | 
| 
      
 1038 
     | 
    
         
            +
                  @book.authorships.reload.destroy_all
         
     | 
| 
       975 
1039 
     | 
    
         
             
                  assert_equal 1, PaperTrail::Version.count - count
         
     | 
| 
       976 
1040 
     | 
    
         
             
                  assert_equal @book, PaperTrail::Version.last.reify.book
         
     | 
| 
       977 
     | 
    
         
            -
                  assert_equal @dostoyevsky, PaperTrail::Version.last.reify. 
     | 
| 
      
 1041 
     | 
    
         
            +
                  assert_equal @dostoyevsky, PaperTrail::Version.last.reify.author
         
     | 
| 
       978 
1042 
     | 
    
         
             
                end
         
     | 
| 
       979 
1043 
     | 
    
         
             
              end
         
     | 
| 
       980 
1044 
     | 
    
         | 
| 
       981 
     | 
    
         
            -
              context  
     | 
| 
      
 1045 
     | 
    
         
            +
              context "When an attribute has a custom serializer" do
         
     | 
| 
       982 
1046 
     | 
    
         
             
                setup do
         
     | 
| 
       983 
     | 
    
         
            -
                  @person = Person.new(: 
     | 
| 
      
 1047 
     | 
    
         
            +
                  @person = Person.new(time_zone: "Samoa")
         
     | 
| 
       984 
1048 
     | 
    
         
             
                end
         
     | 
| 
       985 
1049 
     | 
    
         | 
| 
       986 
1050 
     | 
    
         
             
                should "be an instance of ActiveSupport::TimeZone" do
         
     | 
| 
       987 
1051 
     | 
    
         
             
                  assert_equal ActiveSupport::TimeZone, @person.time_zone.class
         
     | 
| 
       988 
1052 
     | 
    
         
             
                end
         
     | 
| 
       989 
1053 
     | 
    
         | 
| 
       990 
     | 
    
         
            -
                context  
     | 
| 
      
 1054 
     | 
    
         
            +
                context "when the model is saved" do
         
     | 
| 
       991 
1055 
     | 
    
         
             
                  setup do
         
     | 
| 
       992 
1056 
     | 
    
         
             
                    @changes_before_save = @person.changes.dup
         
     | 
| 
       993 
1057 
     | 
    
         
             
                    @person.save!
         
     | 
| 
       994 
1058 
     | 
    
         
             
                  end
         
     | 
| 
       995 
1059 
     | 
    
         | 
| 
       996 
1060 
     | 
    
         
             
                  # Test for serialization:
         
     | 
| 
       997 
     | 
    
         
            -
                  should  
     | 
| 
       998 
     | 
    
         
            -
                     
     | 
| 
      
 1061 
     | 
    
         
            +
                  should "version.object_changes should store long serialization of TimeZone object" do
         
     | 
| 
      
 1062 
     | 
    
         
            +
                    len = @person.versions.last.object_changes.length
         
     | 
| 
      
 1063 
     | 
    
         
            +
                    assert len < 105, "object_changes length was #{len}"
         
     | 
| 
       999 
1064 
     | 
    
         
             
                  end
         
     | 
| 
      
 1065 
     | 
    
         
            +
             
     | 
| 
       1000 
1066 
     | 
    
         
             
                  # It should store the serialized value.
         
     | 
| 
       1001 
     | 
    
         
            -
                  should  
     | 
| 
       1002 
     | 
    
         
            -
                    as_stored_in_version = HashWithIndifferentAccess[ 
     | 
| 
       1003 
     | 
    
         
            -
             
     | 
| 
      
 1067 
     | 
    
         
            +
                  should "version.object_changes attribute should have stored the value from serializer" do
         
     | 
| 
      
 1068 
     | 
    
         
            +
                    as_stored_in_version = HashWithIndifferentAccess[
         
     | 
| 
      
 1069 
     | 
    
         
            +
                      YAML.load(@person.versions.last.object_changes)
         
     | 
| 
      
 1070 
     | 
    
         
            +
                    ]
         
     | 
| 
      
 1071 
     | 
    
         
            +
                    assert_equal [nil, "Samoa"], as_stored_in_version[:time_zone]
         
     | 
| 
       1004 
1072 
     | 
    
         
             
                    serialized_value = Person::TimeZoneSerializer.dump(@person.time_zone)
         
     | 
| 
       1005 
1073 
     | 
    
         
             
                    assert_equal serialized_value, as_stored_in_version[:time_zone].last
         
     | 
| 
       1006 
1074 
     | 
    
         
             
                  end
         
     | 
| 
       1007 
1075 
     | 
    
         | 
| 
       1008 
1076 
     | 
    
         
             
                  # Tests for unserialization:
         
     | 
| 
       1009 
     | 
    
         
            -
                  should  
     | 
| 
      
 1077 
     | 
    
         
            +
                  should "version.changeset should convert attribute to original, unserialized value" do
         
     | 
| 
       1010 
1078 
     | 
    
         
             
                    unserialized_value = Person::TimeZoneSerializer.load(@person.time_zone)
         
     | 
| 
       1011 
     | 
    
         
            -
                    assert_equal unserialized_value, 
     | 
| 
      
 1079 
     | 
    
         
            +
                    assert_equal unserialized_value,
         
     | 
| 
      
 1080 
     | 
    
         
            +
                      @person.versions.last.changeset[:time_zone].last
         
     | 
| 
       1012 
1081 
     | 
    
         
             
                  end
         
     | 
| 
      
 1082 
     | 
    
         
            +
             
     | 
| 
       1013 
1083 
     | 
    
         
             
                  should "record.changes (before save) returns the original, unserialized values" do
         
     | 
| 
       1014 
     | 
    
         
            -
                    assert_equal [NilClass, ActiveSupport::TimeZone], 
     | 
| 
      
 1084 
     | 
    
         
            +
                    assert_equal [NilClass, ActiveSupport::TimeZone],
         
     | 
| 
      
 1085 
     | 
    
         
            +
                      @changes_before_save[:time_zone].map(&:class)
         
     | 
| 
       1015 
1086 
     | 
    
         
             
                  end
         
     | 
| 
       1016 
     | 
    
         
            -
             
     | 
| 
       1017 
     | 
    
         
            -
             
     | 
| 
       1018 
     | 
    
         
            -
                     
     | 
| 
      
 1087 
     | 
    
         
            +
             
     | 
| 
      
 1088 
     | 
    
         
            +
                  should "version.changeset should be the same as record.changes was before the save" do
         
     | 
| 
      
 1089 
     | 
    
         
            +
                    actual = @person.versions.last.changeset.delete_if { |k, _v| k.to_sym == :id }
         
     | 
| 
      
 1090 
     | 
    
         
            +
                    assert_equal @changes_before_save, actual
         
     | 
| 
      
 1091 
     | 
    
         
            +
                    actual = @person.versions.last.changeset[:time_zone].map(&:class)
         
     | 
| 
      
 1092 
     | 
    
         
            +
                    assert_equal [NilClass, ActiveSupport::TimeZone], actual
         
     | 
| 
       1019 
1093 
     | 
    
         
             
                  end
         
     | 
| 
       1020 
1094 
     | 
    
         | 
| 
       1021 
     | 
    
         
            -
                  context  
     | 
| 
      
 1095 
     | 
    
         
            +
                  context "when that attribute is updated" do
         
     | 
| 
       1022 
1096 
     | 
    
         
             
                    setup do
         
     | 
| 
       1023 
1097 
     | 
    
         
             
                      @attribute_value_before_change = @person.time_zone
         
     | 
| 
       1024 
     | 
    
         
            -
                      @person.assign_attributes( 
     | 
| 
      
 1098 
     | 
    
         
            +
                      @person.assign_attributes(time_zone: "Pacific Time (US & Canada)")
         
     | 
| 
       1025 
1099 
     | 
    
         
             
                      @changes_before_save = @person.changes.dup
         
     | 
| 
       1026 
1100 
     | 
    
         
             
                      @person.save!
         
     | 
| 
       1027 
1101 
     | 
    
         
             
                    end
         
     | 
| 
       1028 
1102 
     | 
    
         | 
| 
       1029 
     | 
    
         
            -
                    # Tests for serialization 
     | 
| 
       1030 
     | 
    
         
            -
                    #  
     | 
| 
       1031 
     | 
    
         
            -
                     
     | 
| 
       1032 
     | 
    
         
            -
             
     | 
| 
      
 1103 
     | 
    
         
            +
                    # Tests for serialization
         
     | 
| 
      
 1104 
     | 
    
         
            +
                    # -----------------------
         
     | 
| 
      
 1105 
     | 
    
         
            +
                    #
         
     | 
| 
      
 1106 
     | 
    
         
            +
                    # Before the serialized attributes fix, the object/object_changes value
         
     | 
| 
      
 1107 
     | 
    
         
            +
                    # that was stored was ridiculously long (58723).
         
     | 
| 
      
 1108 
     | 
    
         
            +
                    #
         
     | 
| 
      
 1109 
     | 
    
         
            +
                    # version.object should not have stored the default, ridiculously long
         
     | 
| 
      
 1110 
     | 
    
         
            +
                    # (to_yaml) serialization of the TimeZone object.
         
     | 
| 
      
 1111 
     | 
    
         
            +
                    should "object should not store long serialization of TimeZone object" do
         
     | 
| 
      
 1112 
     | 
    
         
            +
                      len = @person.versions.last.object.length
         
     | 
| 
      
 1113 
     | 
    
         
            +
                      assert len < 105, "object length was #{len}"
         
     | 
| 
       1033 
1114 
     | 
    
         
             
                    end
         
     | 
| 
       1034 
     | 
    
         
            -
             
     | 
| 
       1035 
     | 
    
         
            -
                     
     | 
| 
       1036 
     | 
    
         
            -
             
     | 
| 
      
 1115 
     | 
    
         
            +
             
     | 
| 
      
 1116 
     | 
    
         
            +
                    # Need an additional clause to detect what version of ActiveRecord is
         
     | 
| 
      
 1117 
     | 
    
         
            +
                    # being used for this test because AR4 injects the `updated_at` column
         
     | 
| 
      
 1118 
     | 
    
         
            +
                    # into the changeset for updates to models.
         
     | 
| 
      
 1119 
     | 
    
         
            +
                    #
         
     | 
| 
      
 1120 
     | 
    
         
            +
                    # version.object_changes should not have stored the default,
         
     | 
| 
      
 1121 
     | 
    
         
            +
                    # ridiculously long (to_yaml) serialization of the TimeZone object
         
     | 
| 
      
 1122 
     | 
    
         
            +
                    should "object_changes should not store long serialization of TimeZone object" do
         
     | 
| 
      
 1123 
     | 
    
         
            +
                      max_len = ActiveRecord::VERSION::MAJOR < 4 ? 105 : 118
         
     | 
| 
      
 1124 
     | 
    
         
            +
                      len = @person.versions.last.object_changes.length
         
     | 
| 
      
 1125 
     | 
    
         
            +
                      assert len < max_len, "object_changes length was #{len}"
         
     | 
| 
       1037 
1126 
     | 
    
         
             
                    end
         
     | 
| 
      
 1127 
     | 
    
         
            +
             
     | 
| 
       1038 
1128 
     | 
    
         
             
                    # But now it stores the short, serialized value.
         
     | 
| 
       1039 
     | 
    
         
            -
                    should  
     | 
| 
       1040 
     | 
    
         
            -
                      as_stored_in_version = HashWithIndifferentAccess[ 
     | 
| 
       1041 
     | 
    
         
            -
             
     | 
| 
      
 1129 
     | 
    
         
            +
                    should "version.object attribute should have stored value from serializer" do
         
     | 
| 
      
 1130 
     | 
    
         
            +
                      as_stored_in_version = HashWithIndifferentAccess[
         
     | 
| 
      
 1131 
     | 
    
         
            +
                        YAML.load(@person.versions.last.object)
         
     | 
| 
      
 1132 
     | 
    
         
            +
                      ]
         
     | 
| 
      
 1133 
     | 
    
         
            +
                      assert_equal "Samoa", as_stored_in_version[:time_zone]
         
     | 
| 
       1042 
1134 
     | 
    
         
             
                      serialized_value = Person::TimeZoneSerializer.dump(@attribute_value_before_change)
         
     | 
| 
       1043 
1135 
     | 
    
         
             
                      assert_equal serialized_value, as_stored_in_version[:time_zone]
         
     | 
| 
       1044 
1136 
     | 
    
         
             
                    end
         
     | 
| 
       1045 
     | 
    
         
            -
             
     | 
| 
       1046 
     | 
    
         
            -
             
     | 
| 
       1047 
     | 
    
         
            -
                       
     | 
| 
      
 1137 
     | 
    
         
            +
             
     | 
| 
      
 1138 
     | 
    
         
            +
                    should "version.object_changes attribute should have stored value from serializer" do
         
     | 
| 
      
 1139 
     | 
    
         
            +
                      as_stored_in_version = HashWithIndifferentAccess[
         
     | 
| 
      
 1140 
     | 
    
         
            +
                        YAML.load(@person.versions.last.object_changes)
         
     | 
| 
      
 1141 
     | 
    
         
            +
                      ]
         
     | 
| 
      
 1142 
     | 
    
         
            +
                      assert_equal ["Samoa", "Pacific Time (US & Canada)"], as_stored_in_version[:time_zone]
         
     | 
| 
       1048 
1143 
     | 
    
         
             
                      serialized_value = Person::TimeZoneSerializer.dump(@person.time_zone)
         
     | 
| 
       1049 
1144 
     | 
    
         
             
                      assert_equal serialized_value, as_stored_in_version[:time_zone].last
         
     | 
| 
       1050 
1145 
     | 
    
         
             
                    end
         
     | 
| 
       1051 
1146 
     | 
    
         | 
| 
       1052 
1147 
     | 
    
         
             
                    # Tests for unserialization:
         
     | 
| 
       1053 
     | 
    
         
            -
                    should  
     | 
| 
      
 1148 
     | 
    
         
            +
                    should "version.reify should convert attribute to original, unserialized value" do
         
     | 
| 
       1054 
1149 
     | 
    
         
             
                      unserialized_value = Person::TimeZoneSerializer.load(@attribute_value_before_change)
         
     | 
| 
       1055 
     | 
    
         
            -
                      assert_equal unserialized_value, 
     | 
| 
      
 1150 
     | 
    
         
            +
                      assert_equal unserialized_value,
         
     | 
| 
      
 1151 
     | 
    
         
            +
                        @person.versions.last.reify.time_zone
         
     | 
| 
       1056 
1152 
     | 
    
         
             
                    end
         
     | 
| 
       1057 
     | 
    
         
            -
             
     | 
| 
      
 1153 
     | 
    
         
            +
             
     | 
| 
      
 1154 
     | 
    
         
            +
                    should "version.changeset should convert attribute to original, unserialized value" do
         
     | 
| 
       1058 
1155 
     | 
    
         
             
                      unserialized_value = Person::TimeZoneSerializer.load(@person.time_zone)
         
     | 
| 
       1059 
     | 
    
         
            -
                      assert_equal unserialized_value, 
     | 
| 
      
 1156 
     | 
    
         
            +
                      assert_equal unserialized_value,
         
     | 
| 
      
 1157 
     | 
    
         
            +
                        @person.versions.last.changeset[:time_zone].last
         
     | 
| 
       1060 
1158 
     | 
    
         
             
                    end
         
     | 
| 
      
 1159 
     | 
    
         
            +
             
     | 
| 
       1061 
1160 
     | 
    
         
             
                    should "record.changes (before save) returns the original, unserialized values" do
         
     | 
| 
       1062 
     | 
    
         
            -
                      assert_equal [ActiveSupport::TimeZone, ActiveSupport::TimeZone], 
     | 
| 
      
 1161 
     | 
    
         
            +
                      assert_equal [ActiveSupport::TimeZone, ActiveSupport::TimeZone],
         
     | 
| 
      
 1162 
     | 
    
         
            +
                        @changes_before_save[:time_zone].map(&:class)
         
     | 
| 
       1063 
1163 
     | 
    
         
             
                    end
         
     | 
| 
       1064 
     | 
    
         
            -
             
     | 
| 
      
 1164 
     | 
    
         
            +
             
     | 
| 
      
 1165 
     | 
    
         
            +
                    should "version.changeset should be the same as record.changes was before the save" do
         
     | 
| 
       1065 
1166 
     | 
    
         
             
                      assert_equal @changes_before_save, @person.versions.last.changeset
         
     | 
| 
       1066 
     | 
    
         
            -
                      assert_equal [ActiveSupport::TimeZone, ActiveSupport::TimeZone], 
     | 
| 
      
 1167 
     | 
    
         
            +
                      assert_equal [ActiveSupport::TimeZone, ActiveSupport::TimeZone],
         
     | 
| 
      
 1168 
     | 
    
         
            +
                        @person.versions.last.changeset[:time_zone].map(&:class)
         
     | 
| 
       1067 
1169 
     | 
    
         
             
                    end
         
     | 
| 
       1068 
     | 
    
         
            -
             
     | 
| 
       1069 
1170 
     | 
    
         
             
                  end
         
     | 
| 
       1070 
1171 
     | 
    
         
             
                end
         
     | 
| 
       1071 
1172 
     | 
    
         
             
              end
         
     | 
| 
       1072 
1173 
     | 
    
         | 
| 
       1073 
     | 
    
         
            -
             
     | 
| 
       1074 
     | 
    
         
            -
              context 'A new model instance which uses a custom PaperTrail::Version class' do
         
     | 
| 
      
 1174 
     | 
    
         
            +
              context "A new model instance which uses a custom PaperTrail::Version class" do
         
     | 
| 
       1075 
1175 
     | 
    
         
             
                setup { @post = Post.new }
         
     | 
| 
       1076 
1176 
     | 
    
         | 
| 
       1077 
     | 
    
         
            -
                context  
     | 
| 
      
 1177 
     | 
    
         
            +
                context "which is then saved" do
         
     | 
| 
       1078 
1178 
     | 
    
         
             
                  setup { @post.save }
         
     | 
| 
       1079 
     | 
    
         
            -
                  should  
     | 
| 
       1080 
     | 
    
         
            -
                  should  
     | 
| 
      
 1179 
     | 
    
         
            +
                  should "change the number of post versions" do assert_equal 1, PostVersion.count end
         
     | 
| 
      
 1180 
     | 
    
         
            +
                  should "not change the number of versions" do assert_equal(0, PaperTrail::Version.count) end
         
     | 
| 
       1081 
1181 
     | 
    
         
             
                end
         
     | 
| 
       1082 
1182 
     | 
    
         
             
              end
         
     | 
| 
       1083 
1183 
     | 
    
         | 
| 
       1084 
     | 
    
         
            -
              context  
     | 
| 
      
 1184 
     | 
    
         
            +
              context "An existing model instance which uses a custom PaperTrail::Version class" do
         
     | 
| 
       1085 
1185 
     | 
    
         
             
                setup { @post = Post.create }
         
     | 
| 
       1086 
     | 
    
         
            -
                should  
     | 
| 
      
 1186 
     | 
    
         
            +
                should "have one post version" do assert_equal(1, PostVersion.count) end
         
     | 
| 
       1087 
1187 
     | 
    
         | 
| 
       1088 
     | 
    
         
            -
                context  
     | 
| 
      
 1188 
     | 
    
         
            +
                context "on the first version" do
         
     | 
| 
       1089 
1189 
     | 
    
         
             
                  setup { @version = @post.versions.first }
         
     | 
| 
       1090 
1190 
     | 
    
         | 
| 
       1091 
     | 
    
         
            -
                  should  
     | 
| 
      
 1191 
     | 
    
         
            +
                  should "have the correct index" do
         
     | 
| 
       1092 
1192 
     | 
    
         
             
                    assert_equal 0, @version.index
         
     | 
| 
       1093 
1193 
     | 
    
         
             
                  end
         
     | 
| 
       1094 
1194 
     | 
    
         
             
                end
         
     | 
| 
       1095 
1195 
     | 
    
         | 
| 
       1096 
     | 
    
         
            -
                should  
     | 
| 
      
 1196 
     | 
    
         
            +
                should "have versions of the custom class" do
         
     | 
| 
       1097 
1197 
     | 
    
         
             
                  assert_equal "PostVersion", @post.versions.first.class.name
         
     | 
| 
       1098 
1198 
     | 
    
         
             
                end
         
     | 
| 
       1099 
1199 
     | 
    
         | 
| 
       1100 
     | 
    
         
            -
                context  
     | 
| 
       1101 
     | 
    
         
            -
                  setup  
     | 
| 
       1102 
     | 
    
         
            -
             
     | 
| 
       1103 
     | 
    
         
            -
                   
     | 
| 
      
 1200 
     | 
    
         
            +
                context "which is modified" do
         
     | 
| 
      
 1201 
     | 
    
         
            +
                  setup do
         
     | 
| 
      
 1202 
     | 
    
         
            +
                    @post.update_attributes(content: "Some new content")
         
     | 
| 
      
 1203 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1204 
     | 
    
         
            +
             
     | 
| 
      
 1205 
     | 
    
         
            +
                  should "change the number of post versions" do
         
     | 
| 
      
 1206 
     | 
    
         
            +
                    assert_equal(2, PostVersion.count)
         
     | 
| 
      
 1207 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1208 
     | 
    
         
            +
             
     | 
| 
      
 1209 
     | 
    
         
            +
                  should "not change the number of versions" do
         
     | 
| 
      
 1210 
     | 
    
         
            +
                    assert_equal(0, PaperTrail::Version.count)
         
     | 
| 
      
 1211 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1212 
     | 
    
         
            +
             
     | 
| 
       1104 
1213 
     | 
    
         
             
                  should "not have stored changes when object_changes column doesn't exist" do
         
     | 
| 
       1105 
1214 
     | 
    
         
             
                    assert_nil @post.versions.last.changeset
         
     | 
| 
       1106 
1215 
     | 
    
         
             
                  end
         
     | 
| 
       1107 
1216 
     | 
    
         
             
                end
         
     | 
| 
       1108 
1217 
     | 
    
         
             
              end
         
     | 
| 
       1109 
1218 
     | 
    
         | 
| 
       1110 
     | 
    
         
            -
             
     | 
| 
       1111 
     | 
    
         
            -
              context 'An overwritten default accessor' do
         
     | 
| 
      
 1219 
     | 
    
         
            +
              context "An overwritten default accessor" do
         
     | 
| 
       1112 
1220 
     | 
    
         
             
                setup do
         
     | 
| 
       1113 
     | 
    
         
            -
                  @song = Song.create : 
     | 
| 
       1114 
     | 
    
         
            -
                  @song.update_attributes : 
     | 
| 
      
 1221 
     | 
    
         
            +
                  @song = Song.create length: 4
         
     | 
| 
      
 1222 
     | 
    
         
            +
                  @song.update_attributes length: 5
         
     | 
| 
       1115 
1223 
     | 
    
         
             
                end
         
     | 
| 
       1116 
1224 
     | 
    
         | 
| 
       1117 
1225 
     | 
    
         
             
                should 'return "overwritten" value on live instance' do
         
     | 
| 
         @@ -1121,74 +1229,73 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       1121 
1229 
     | 
    
         
             
                  assert_equal 4, @song.versions.last.reify.length
         
     | 
| 
       1122 
1230 
     | 
    
         
             
                end
         
     | 
| 
       1123 
1231 
     | 
    
         | 
| 
       1124 
     | 
    
         
            -
                context  
     | 
| 
      
 1232 
     | 
    
         
            +
                context "Has a virtual attribute injected into the ActiveModel::Dirty changes" do
         
     | 
| 
       1125 
1233 
     | 
    
         
             
                  setup do
         
     | 
| 
       1126 
     | 
    
         
            -
                    @song.name =  
     | 
| 
      
 1234 
     | 
    
         
            +
                    @song.name = "Good Vibrations"
         
     | 
| 
       1127 
1235 
     | 
    
         
             
                    @song.save
         
     | 
| 
       1128 
     | 
    
         
            -
                    @song.name =  
     | 
| 
      
 1236 
     | 
    
         
            +
                    @song.name = "Yellow Submarine"
         
     | 
| 
       1129 
1237 
     | 
    
         
             
                  end
         
     | 
| 
       1130 
1238 
     | 
    
         | 
| 
       1131 
     | 
    
         
            -
                  should  
     | 
| 
       1132 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1239 
     | 
    
         
            +
                  should "return persist the changes on the live instance properly" do
         
     | 
| 
      
 1240 
     | 
    
         
            +
                    assert_equal "Yellow Submarine", @song.name
         
     | 
| 
       1133 
1241 
     | 
    
         
             
                  end
         
     | 
| 
       1134 
1242 
     | 
    
         
             
                  should 'return "overwritten" virtual attribute on the reified instance' do
         
     | 
| 
       1135 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1243 
     | 
    
         
            +
                    assert_equal "Good Vibrations", @song.versions.last.reify.name
         
     | 
| 
       1136 
1244 
     | 
    
         
             
                  end
         
     | 
| 
       1137 
1245 
     | 
    
         
             
                end
         
     | 
| 
       1138 
1246 
     | 
    
         
             
              end
         
     | 
| 
       1139 
1247 
     | 
    
         | 
| 
       1140 
     | 
    
         
            -
             
     | 
| 
       1141 
     | 
    
         
            -
              context 'An unsaved record' do
         
     | 
| 
      
 1248 
     | 
    
         
            +
              context "An unsaved record" do
         
     | 
| 
       1142 
1249 
     | 
    
         
             
                setup do
         
     | 
| 
       1143 
1250 
     | 
    
         
             
                  @widget = Widget.new
         
     | 
| 
       1144 
1251 
     | 
    
         
             
                  @widget.destroy
         
     | 
| 
       1145 
1252 
     | 
    
         
             
                end
         
     | 
| 
       1146 
     | 
    
         
            -
                should  
     | 
| 
      
 1253 
     | 
    
         
            +
                should "not have a version created on destroy" do
         
     | 
| 
       1147 
1254 
     | 
    
         
             
                  assert @widget.versions.empty?
         
     | 
| 
       1148 
1255 
     | 
    
         
             
                end
         
     | 
| 
       1149 
1256 
     | 
    
         
             
              end
         
     | 
| 
       1150 
1257 
     | 
    
         | 
| 
       1151 
     | 
    
         
            -
              context  
     | 
| 
      
 1258 
     | 
    
         
            +
              context "A model with a custom association" do
         
     | 
| 
       1152 
1259 
     | 
    
         
             
                setup do
         
     | 
| 
       1153 
1260 
     | 
    
         
             
                  @doc = Document.create
         
     | 
| 
       1154 
     | 
    
         
            -
                  @doc.update_attributes : 
     | 
| 
      
 1261 
     | 
    
         
            +
                  @doc.update_attributes name: "Doc 1"
         
     | 
| 
       1155 
1262 
     | 
    
         
             
                end
         
     | 
| 
       1156 
1263 
     | 
    
         | 
| 
       1157 
     | 
    
         
            -
                should  
     | 
| 
      
 1264 
     | 
    
         
            +
                should "not respond to versions method" do
         
     | 
| 
       1158 
1265 
     | 
    
         
             
                  assert !@doc.respond_to?(:versions)
         
     | 
| 
       1159 
1266 
     | 
    
         
             
                end
         
     | 
| 
       1160 
1267 
     | 
    
         | 
| 
       1161 
     | 
    
         
            -
                should  
     | 
| 
      
 1268 
     | 
    
         
            +
                should "create a new version record" do
         
     | 
| 
       1162 
1269 
     | 
    
         
             
                  assert_equal 2, @doc.paper_trail_versions.length
         
     | 
| 
       1163 
1270 
     | 
    
         
             
                end
         
     | 
| 
       1164 
1271 
     | 
    
         | 
| 
       1165 
     | 
    
         
            -
                should  
     | 
| 
      
 1272 
     | 
    
         
            +
                should "respond to `next_version` as normal" do
         
     | 
| 
       1166 
1273 
     | 
    
         
             
                  assert_equal @doc.paper_trail_versions.last.reify.next_version.name, @doc.name
         
     | 
| 
       1167 
1274 
     | 
    
         
             
                end
         
     | 
| 
       1168 
1275 
     | 
    
         | 
| 
       1169 
     | 
    
         
            -
                should  
     | 
| 
       1170 
     | 
    
         
            -
                  @doc.update_attributes : 
     | 
| 
      
 1276 
     | 
    
         
            +
                should "respond to `previous_version` as normal" do
         
     | 
| 
      
 1277 
     | 
    
         
            +
                  @doc.update_attributes name: "Doc 2"
         
     | 
| 
       1171 
1278 
     | 
    
         
             
                  assert_equal 3, @doc.paper_trail_versions.length
         
     | 
| 
       1172 
     | 
    
         
            -
                  assert_equal  
     | 
| 
      
 1279 
     | 
    
         
            +
                  assert_equal "Doc 1", @doc.previous_version.name
         
     | 
| 
       1173 
1280 
     | 
    
         
             
                end
         
     | 
| 
       1174 
1281 
     | 
    
         
             
              end
         
     | 
| 
       1175 
1282 
     | 
    
         | 
| 
       1176 
     | 
    
         
            -
              context  
     | 
| 
       1177 
     | 
    
         
            -
                context  
     | 
| 
      
 1283 
     | 
    
         
            +
              context "The `on` option" do
         
     | 
| 
      
 1284 
     | 
    
         
            +
                context "on create" do
         
     | 
| 
       1178 
1285 
     | 
    
         
             
                  setup do
         
     | 
| 
       1179 
1286 
     | 
    
         
             
                    Fluxor.instance_eval <<-END
         
     | 
| 
       1180 
1287 
     | 
    
         
             
                      has_paper_trail :on => [:create]
         
     | 
| 
       1181 
1288 
     | 
    
         
             
                    END
         
     | 
| 
       1182 
1289 
     | 
    
         
             
                    @fluxor = Fluxor.create
         
     | 
| 
       1183 
     | 
    
         
            -
                    @fluxor.update_attributes : 
     | 
| 
      
 1290 
     | 
    
         
            +
                    @fluxor.update_attributes name: "blah"
         
     | 
| 
       1184 
1291 
     | 
    
         
             
                    @fluxor.destroy
         
     | 
| 
       1185 
1292 
     | 
    
         
             
                  end
         
     | 
| 
       1186 
     | 
    
         
            -
                  should  
     | 
| 
      
 1293 
     | 
    
         
            +
                  should "only have a version for the create event" do
         
     | 
| 
       1187 
1294 
     | 
    
         
             
                    assert_equal 1, @fluxor.versions.length
         
     | 
| 
       1188 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1295 
     | 
    
         
            +
                    assert_equal "create", @fluxor.versions.last.event
         
     | 
| 
       1189 
1296 
     | 
    
         
             
                  end
         
     | 
| 
       1190 
1297 
     | 
    
         
             
                end
         
     | 
| 
       1191 
     | 
    
         
            -
                context  
     | 
| 
      
 1298 
     | 
    
         
            +
                context "on update" do
         
     | 
| 
       1192 
1299 
     | 
    
         
             
                  setup do
         
     | 
| 
       1193 
1300 
     | 
    
         
             
                    Fluxor.reset_callbacks :create
         
     | 
| 
       1194 
1301 
     | 
    
         
             
                    Fluxor.reset_callbacks :update
         
     | 
| 
         @@ -1197,15 +1304,15 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       1197 
1304 
     | 
    
         
             
                      has_paper_trail :on => [:update]
         
     | 
| 
       1198 
1305 
     | 
    
         
             
                    END
         
     | 
| 
       1199 
1306 
     | 
    
         
             
                    @fluxor = Fluxor.create
         
     | 
| 
       1200 
     | 
    
         
            -
                    @fluxor.update_attributes : 
     | 
| 
      
 1307 
     | 
    
         
            +
                    @fluxor.update_attributes name: "blah"
         
     | 
| 
       1201 
1308 
     | 
    
         
             
                    @fluxor.destroy
         
     | 
| 
       1202 
1309 
     | 
    
         
             
                  end
         
     | 
| 
       1203 
     | 
    
         
            -
                  should  
     | 
| 
      
 1310 
     | 
    
         
            +
                  should "only have a version for the update event" do
         
     | 
| 
       1204 
1311 
     | 
    
         
             
                    assert_equal 1, @fluxor.versions.length
         
     | 
| 
       1205 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1312 
     | 
    
         
            +
                    assert_equal "update", @fluxor.versions.last.event
         
     | 
| 
       1206 
1313 
     | 
    
         
             
                  end
         
     | 
| 
       1207 
1314 
     | 
    
         
             
                end
         
     | 
| 
       1208 
     | 
    
         
            -
                context  
     | 
| 
      
 1315 
     | 
    
         
            +
                context "on destroy" do
         
     | 
| 
       1209 
1316 
     | 
    
         
             
                  setup do
         
     | 
| 
       1210 
1317 
     | 
    
         
             
                    Fluxor.reset_callbacks :create
         
     | 
| 
       1211 
1318 
     | 
    
         
             
                    Fluxor.reset_callbacks :update
         
     | 
| 
         @@ -1214,15 +1321,15 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       1214 
1321 
     | 
    
         
             
                      has_paper_trail :on => [:destroy]
         
     | 
| 
       1215 
1322 
     | 
    
         
             
                    END
         
     | 
| 
       1216 
1323 
     | 
    
         
             
                    @fluxor = Fluxor.create
         
     | 
| 
       1217 
     | 
    
         
            -
                    @fluxor.update_attributes : 
     | 
| 
      
 1324 
     | 
    
         
            +
                    @fluxor.update_attributes name: "blah"
         
     | 
| 
       1218 
1325 
     | 
    
         
             
                    @fluxor.destroy
         
     | 
| 
       1219 
1326 
     | 
    
         
             
                  end
         
     | 
| 
       1220 
     | 
    
         
            -
                  should  
     | 
| 
      
 1327 
     | 
    
         
            +
                  should "only have a version for the destroy event" do
         
     | 
| 
       1221 
1328 
     | 
    
         
             
                    assert_equal 1, @fluxor.versions.length
         
     | 
| 
       1222 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1329 
     | 
    
         
            +
                    assert_equal "destroy", @fluxor.versions.last.event
         
     | 
| 
       1223 
1330 
     | 
    
         
             
                  end
         
     | 
| 
       1224 
1331 
     | 
    
         
             
                end
         
     | 
| 
       1225 
     | 
    
         
            -
                context  
     | 
| 
      
 1332 
     | 
    
         
            +
                context "on []" do
         
     | 
| 
       1226 
1333 
     | 
    
         
             
                  setup do
         
     | 
| 
       1227 
1334 
     | 
    
         
             
                    Fluxor.reset_callbacks :create
         
     | 
| 
       1228 
1335 
     | 
    
         
             
                    Fluxor.reset_callbacks :update
         
     | 
| 
         @@ -1231,23 +1338,23 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       1231 
1338 
     | 
    
         
             
                      has_paper_trail :on => []
         
     | 
| 
       1232 
1339 
     | 
    
         
             
                    END
         
     | 
| 
       1233 
1340 
     | 
    
         
             
                    @fluxor = Fluxor.create
         
     | 
| 
       1234 
     | 
    
         
            -
                    @fluxor.update_attributes : 
     | 
| 
      
 1341 
     | 
    
         
            +
                    @fluxor.update_attributes name: "blah"
         
     | 
| 
       1235 
1342 
     | 
    
         
             
                  end
         
     | 
| 
       1236 
1343 
     | 
    
         | 
| 
       1237 
1344 
     | 
    
         
             
                  teardown do
         
     | 
| 
       1238 
1345 
     | 
    
         
             
                    @fluxor.destroy
         
     | 
| 
       1239 
1346 
     | 
    
         
             
                  end
         
     | 
| 
       1240 
1347 
     | 
    
         | 
| 
       1241 
     | 
    
         
            -
                  should  
     | 
| 
      
 1348 
     | 
    
         
            +
                  should "not have any versions" do
         
     | 
| 
       1242 
1349 
     | 
    
         
             
                    assert_equal 0, @fluxor.versions.length
         
     | 
| 
       1243 
1350 
     | 
    
         
             
                  end
         
     | 
| 
       1244 
1351 
     | 
    
         | 
| 
       1245 
     | 
    
         
            -
                  should  
     | 
| 
      
 1352 
     | 
    
         
            +
                  should "still respond to touch_with_version" do
         
     | 
| 
       1246 
1353 
     | 
    
         
             
                    @fluxor.touch_with_version
         
     | 
| 
       1247 
1354 
     | 
    
         
             
                    assert_equal 1, @fluxor.versions.length
         
     | 
| 
       1248 
1355 
     | 
    
         
             
                  end
         
     | 
| 
       1249 
1356 
     | 
    
         
             
                end
         
     | 
| 
       1250 
     | 
    
         
            -
                context  
     | 
| 
      
 1357 
     | 
    
         
            +
                context "allows a symbol to be passed" do
         
     | 
| 
       1251 
1358 
     | 
    
         
             
                  setup do
         
     | 
| 
       1252 
1359 
     | 
    
         
             
                    Fluxor.reset_callbacks :create
         
     | 
| 
       1253 
1360 
     | 
    
         
             
                    Fluxor.reset_callbacks :update
         
     | 
| 
         @@ -1256,54 +1363,54 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       1256 
1363 
     | 
    
         
             
                      has_paper_trail :on => :create
         
     | 
| 
       1257 
1364 
     | 
    
         
             
                    END
         
     | 
| 
       1258 
1365 
     | 
    
         
             
                    @fluxor = Fluxor.create
         
     | 
| 
       1259 
     | 
    
         
            -
                    @fluxor.update_attributes : 
     | 
| 
      
 1366 
     | 
    
         
            +
                    @fluxor.update_attributes name: "blah"
         
     | 
| 
       1260 
1367 
     | 
    
         
             
                    @fluxor.destroy
         
     | 
| 
       1261 
1368 
     | 
    
         
             
                  end
         
     | 
| 
       1262 
     | 
    
         
            -
                  should  
     | 
| 
      
 1369 
     | 
    
         
            +
                  should "only have a version for hte create event" do
         
     | 
| 
       1263 
1370 
     | 
    
         
             
                    assert_equal 1, @fluxor.versions.length
         
     | 
| 
       1264 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1371 
     | 
    
         
            +
                    assert_equal "create", @fluxor.versions.last.event
         
     | 
| 
       1265 
1372 
     | 
    
         
             
                  end
         
     | 
| 
       1266 
1373 
     | 
    
         
             
                end
         
     | 
| 
       1267 
1374 
     | 
    
         
             
              end
         
     | 
| 
       1268 
1375 
     | 
    
         | 
| 
       1269 
     | 
    
         
            -
              context  
     | 
| 
      
 1376 
     | 
    
         
            +
              context "A model with column version and custom version_method" do
         
     | 
| 
       1270 
1377 
     | 
    
         
             
                setup do
         
     | 
| 
       1271 
     | 
    
         
            -
                  @legacy_widget = LegacyWidget.create(: 
     | 
| 
      
 1378 
     | 
    
         
            +
                  @legacy_widget = LegacyWidget.create(name: "foo", version: 2)
         
     | 
| 
       1272 
1379 
     | 
    
         
             
                end
         
     | 
| 
       1273 
1380 
     | 
    
         | 
| 
       1274 
     | 
    
         
            -
                should  
     | 
| 
      
 1381 
     | 
    
         
            +
                should "set version on create" do
         
     | 
| 
       1275 
1382 
     | 
    
         
             
                  assert_equal 2, @legacy_widget.version
         
     | 
| 
       1276 
1383 
     | 
    
         
             
                end
         
     | 
| 
       1277 
1384 
     | 
    
         | 
| 
       1278 
     | 
    
         
            -
                should  
     | 
| 
       1279 
     | 
    
         
            -
                  @legacy_widget.update_attributes : 
     | 
| 
      
 1385 
     | 
    
         
            +
                should "allow version updates" do
         
     | 
| 
      
 1386 
     | 
    
         
            +
                  @legacy_widget.update_attributes version: 3
         
     | 
| 
       1280 
1387 
     | 
    
         
             
                  assert_equal 3, @legacy_widget.version
         
     | 
| 
       1281 
1388 
     | 
    
         
             
                end
         
     | 
| 
       1282 
1389 
     | 
    
         | 
| 
       1283 
     | 
    
         
            -
                should  
     | 
| 
      
 1390 
     | 
    
         
            +
                should "create a new version record" do
         
     | 
| 
       1284 
1391 
     | 
    
         
             
                  assert_equal 1, @legacy_widget.versions.size
         
     | 
| 
       1285 
1392 
     | 
    
         
             
                end
         
     | 
| 
       1286 
1393 
     | 
    
         
             
              end
         
     | 
| 
       1287 
1394 
     | 
    
         | 
| 
       1288 
     | 
    
         
            -
              context  
     | 
| 
      
 1395 
     | 
    
         
            +
              context "A reified item with a column -version- and custom version_method" do
         
     | 
| 
       1289 
1396 
     | 
    
         
             
                setup do
         
     | 
| 
       1290 
     | 
    
         
            -
                  widget = LegacyWidget.create(: 
     | 
| 
       1291 
     | 
    
         
            -
                  %w( bar baz ).each { |name| widget.update_attributes : 
     | 
| 
      
 1397 
     | 
    
         
            +
                  widget = LegacyWidget.create(name: "foo", version: 2)
         
     | 
| 
      
 1398 
     | 
    
         
            +
                  %w( bar baz ).each { |name| widget.update_attributes name: name }
         
     | 
| 
       1292 
1399 
     | 
    
         
             
                  @version = widget.versions.last
         
     | 
| 
       1293 
1400 
     | 
    
         
             
                  @widget = @version.reify
         
     | 
| 
       1294 
1401 
     | 
    
         
             
                end
         
     | 
| 
       1295 
1402 
     | 
    
         | 
| 
       1296 
     | 
    
         
            -
                should  
     | 
| 
      
 1403 
     | 
    
         
            +
                should "know which version it came from" do
         
     | 
| 
       1297 
1404 
     | 
    
         
             
                  assert_equal @version, @widget.custom_version
         
     | 
| 
       1298 
1405 
     | 
    
         
             
                end
         
     | 
| 
       1299 
1406 
     | 
    
         | 
| 
       1300 
     | 
    
         
            -
                should  
     | 
| 
      
 1407 
     | 
    
         
            +
                should "return its previous self" do
         
     | 
| 
       1301 
1408 
     | 
    
         
             
                  assert_equal @widget.versions[-2].reify, @widget.previous_version
         
     | 
| 
       1302 
1409 
     | 
    
         
             
                end
         
     | 
| 
       1303 
1410 
     | 
    
         
             
              end
         
     | 
| 
       1304 
1411 
     | 
    
         | 
| 
       1305 
     | 
    
         
            -
              context  
     | 
| 
       1306 
     | 
    
         
            -
                context  
     | 
| 
      
 1412 
     | 
    
         
            +
              context "custom events" do
         
     | 
| 
      
 1413 
     | 
    
         
            +
                context "on create" do
         
     | 
| 
       1307 
1414 
     | 
    
         
             
                  setup do
         
     | 
| 
       1308 
1415 
     | 
    
         
             
                    Fluxor.reset_callbacks :create
         
     | 
| 
       1309 
1416 
     | 
    
         
             
                    Fluxor.reset_callbacks :update
         
     | 
| 
         @@ -1311,16 +1418,16 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       1311 
1418 
     | 
    
         
             
                    Fluxor.instance_eval <<-END
         
     | 
| 
       1312 
1419 
     | 
    
         
             
                      has_paper_trail :on => [:create]
         
     | 
| 
       1313 
1420 
     | 
    
         
             
                    END
         
     | 
| 
       1314 
     | 
    
         
            -
                    @fluxor = Fluxor.new.tap { |model| model.paper_trail_event =  
     | 
| 
       1315 
     | 
    
         
            -
                    @fluxor.update_attributes : 
     | 
| 
      
 1421 
     | 
    
         
            +
                    @fluxor = Fluxor.new.tap { |model| model.paper_trail_event = "created" }
         
     | 
| 
      
 1422 
     | 
    
         
            +
                    @fluxor.update_attributes name: "blah"
         
     | 
| 
       1316 
1423 
     | 
    
         
             
                    @fluxor.destroy
         
     | 
| 
       1317 
1424 
     | 
    
         
             
                  end
         
     | 
| 
       1318 
     | 
    
         
            -
                  should  
     | 
| 
      
 1425 
     | 
    
         
            +
                  should "only have a version for the created event" do
         
     | 
| 
       1319 
1426 
     | 
    
         
             
                    assert_equal 1, @fluxor.versions.length
         
     | 
| 
       1320 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1427 
     | 
    
         
            +
                    assert_equal "created", @fluxor.versions.last.event
         
     | 
| 
       1321 
1428 
     | 
    
         
             
                  end
         
     | 
| 
       1322 
1429 
     | 
    
         
             
                end
         
     | 
| 
       1323 
     | 
    
         
            -
                context  
     | 
| 
      
 1430 
     | 
    
         
            +
                context "on update" do
         
     | 
| 
       1324 
1431 
     | 
    
         
             
                  setup do
         
     | 
| 
       1325 
1432 
     | 
    
         
             
                    Fluxor.reset_callbacks :create
         
     | 
| 
       1326 
1433 
     | 
    
         
             
                    Fluxor.reset_callbacks :update
         
     | 
| 
         @@ -1328,16 +1435,16 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       1328 
1435 
     | 
    
         
             
                    Fluxor.instance_eval <<-END
         
     | 
| 
       1329 
1436 
     | 
    
         
             
                      has_paper_trail :on => [:update]
         
     | 
| 
       1330 
1437 
     | 
    
         
             
                    END
         
     | 
| 
       1331 
     | 
    
         
            -
                    @fluxor = Fluxor.create.tap { |model| model.paper_trail_event =  
     | 
| 
       1332 
     | 
    
         
            -
                    @fluxor.update_attributes : 
     | 
| 
      
 1438 
     | 
    
         
            +
                    @fluxor = Fluxor.create.tap { |model| model.paper_trail_event = "name_updated" }
         
     | 
| 
      
 1439 
     | 
    
         
            +
                    @fluxor.update_attributes name: "blah"
         
     | 
| 
       1333 
1440 
     | 
    
         
             
                    @fluxor.destroy
         
     | 
| 
       1334 
1441 
     | 
    
         
             
                  end
         
     | 
| 
       1335 
     | 
    
         
            -
                  should  
     | 
| 
      
 1442 
     | 
    
         
            +
                  should "only have a version for the name_updated event" do
         
     | 
| 
       1336 
1443 
     | 
    
         
             
                    assert_equal 1, @fluxor.versions.length
         
     | 
| 
       1337 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1444 
     | 
    
         
            +
                    assert_equal "name_updated", @fluxor.versions.last.event
         
     | 
| 
       1338 
1445 
     | 
    
         
             
                  end
         
     | 
| 
       1339 
1446 
     | 
    
         
             
                end
         
     | 
| 
       1340 
     | 
    
         
            -
                context  
     | 
| 
      
 1447 
     | 
    
         
            +
                context "on destroy" do
         
     | 
| 
       1341 
1448 
     | 
    
         
             
                  setup do
         
     | 
| 
       1342 
1449 
     | 
    
         
             
                    Fluxor.reset_callbacks :create
         
     | 
| 
       1343 
1450 
     | 
    
         
             
                    Fluxor.reset_callbacks :update
         
     | 
| 
         @@ -1345,28 +1452,28 @@ class HasPaperTrailModelTest < ActiveSupport::TestCase 
     | 
|
| 
       1345 
1452 
     | 
    
         
             
                    Fluxor.instance_eval <<-END
         
     | 
| 
       1346 
1453 
     | 
    
         
             
                      has_paper_trail :on => [:destroy]
         
     | 
| 
       1347 
1454 
     | 
    
         
             
                    END
         
     | 
| 
       1348 
     | 
    
         
            -
                    @fluxor = Fluxor.create.tap { |model| model.paper_trail_event =  
     | 
| 
       1349 
     | 
    
         
            -
                    @fluxor.update_attributes : 
     | 
| 
      
 1455 
     | 
    
         
            +
                    @fluxor = Fluxor.create.tap { |model| model.paper_trail_event = "destroyed" }
         
     | 
| 
      
 1456 
     | 
    
         
            +
                    @fluxor.update_attributes name: "blah"
         
     | 
| 
       1350 
1457 
     | 
    
         
             
                    @fluxor.destroy
         
     | 
| 
       1351 
1458 
     | 
    
         
             
                  end
         
     | 
| 
       1352 
     | 
    
         
            -
                  should  
     | 
| 
      
 1459 
     | 
    
         
            +
                  should "only have a version for the destroy event" do
         
     | 
| 
       1353 
1460 
     | 
    
         
             
                    assert_equal 1, @fluxor.versions.length
         
     | 
| 
       1354 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 1461 
     | 
    
         
            +
                    assert_equal "destroyed", @fluxor.versions.last.event
         
     | 
| 
       1355 
1462 
     | 
    
         
             
                  end
         
     | 
| 
       1356 
1463 
     | 
    
         
             
                end
         
     | 
| 
       1357 
1464 
     | 
    
         
             
              end
         
     | 
| 
       1358 
1465 
     | 
    
         | 
| 
       1359 
     | 
    
         
            -
              context  
     | 
| 
      
 1466 
     | 
    
         
            +
              context "`PaperTrail::Config.version_limit` set" do
         
     | 
| 
       1360 
1467 
     | 
    
         
             
                setup do
         
     | 
| 
       1361 
1468 
     | 
    
         
             
                  PaperTrail.config.version_limit = 2
         
     | 
| 
       1362 
     | 
    
         
            -
                  @widget = Widget.create! : 
     | 
| 
       1363 
     | 
    
         
            -
                  6.times { @widget.update_attribute(:name,  
     | 
| 
      
 1469 
     | 
    
         
            +
                  @widget = Widget.create! name: "Henry"
         
     | 
| 
      
 1470 
     | 
    
         
            +
                  6.times { @widget.update_attribute(:name, FFaker::Lorem.word) }
         
     | 
| 
       1364 
1471 
     | 
    
         
             
                end
         
     | 
| 
       1365 
1472 
     | 
    
         | 
| 
       1366 
1473 
     | 
    
         
             
                teardown { PaperTrail.config.version_limit = nil }
         
     | 
| 
       1367 
1474 
     | 
    
         | 
| 
       1368 
1475 
     | 
    
         
             
                should "limit the number of versions to 3 (2 plus the created at event)" do
         
     | 
| 
       1369 
     | 
    
         
            -
                  assert_equal  
     | 
| 
      
 1476 
     | 
    
         
            +
                  assert_equal "create", @widget.versions.first.event
         
     | 
| 
       1370 
1477 
     | 
    
         
             
                  assert_equal 3, @widget.versions.size
         
     | 
| 
       1371 
1478 
     | 
    
         
             
                end
         
     | 
| 
       1372 
1479 
     | 
    
         
             
              end
         
     |