require 'spec_helper' describe 'Volt::Dirty' do let(:model) do model = Volt::Model.new # Run changed on the model will revert changes after each sync allow(model).to receive(:run_changed) model end it 'should track changed attributes' do model._name = 'Bob' expect(model.name_was).to eq(nil) model._name = 'Jimmy' expect(model.name_was).to eq(nil) expect(model.name_changes).to eq([nil, 'Bob']) model._name = 'Martin' expect(model.name_was).to eq(nil) expect(model.name_changes).to eq([nil, 'Bob', 'Jimmy']) model._name = nil expect(model.name_was).to eq(nil) expect(model.name_changes).to eq([nil, 'Bob', 'Jimmy', 'Martin']) model._name = 'Ryan' expect(model.name_was).to eq(nil) expect(model.name_changes).to eq([nil, 'Bob', 'Jimmy', 'Martin', nil]) expect(model.changed_attributes).to eq(name: [nil, 'Bob', 'Jimmy', 'Martin', nil]) end it 'should say models are changed' do expect(model.changed?(:name)).to eq(false) model._name = 'Bob' expect(model.changed?(:name)).to eq(true) model._name = 'Jimmy' expect(model.changed?(:name)).to eq(true) model.clear_tracked_changes! expect(model.changed?(:name)).to eq(false) expect(model.changed?).to eq(false) model._some_other_attr = 'Wow!' expect(model.changed?).to eq(true) end it 'should reset changes' do expect(model.changed?(:name)).to eq(false) model._name = 'Bob' expect(model.changed?(:name)).to eq(true) model._name = 'Jimmy' expect(model.changed?(:name)).to eq(true) expect(model.name_was).to eq(nil) expect(model.name_changes).to eq([nil, 'Bob']) model.clear_tracked_changes! expect(model.name_was).to eq(nil) end it 'should not track when assigning the same value' do expect(model.changed?(:name)).to eq(false) model._name = nil expect(model.changed?(:name)).to eq(false) model._name = 'bob' expect(model.changed?(:name)).to eq(true) expect(model.name_changes).to eq([nil]) model._name = 'bob' expect(model.name_changes).to eq([nil]) end it 'should revert changes' do expect(model.attributes.without(:id)).to eq({}) model.attributes = { first: 'Bob', last: 'Smith' } expect(model.attributes.without(:id)).to eq(first: 'Bob', last: 'Smith') model.revert_changes! expect(model.attributes.without(:id)).to eq(first: nil, last: nil) end it 'should revert changes after a clear_tracked_changed!' do expect(model.attributes.without(:id)).to eq({}) model.attributes = { first: 'Bob', last: 'Smith' } expect(model.attributes.without(:id)).to eq(first: 'Bob', last: 'Smith') model.clear_tracked_changes! expect(model.changed_attributes).to eq({}) model._first = 'Jimmy' model._last = 'Dean' expect(model.attributes.without(:id)).to eq(first: 'Jimmy', last: 'Dean') model.revert_changes! expect(model.attributes.without(:id)).to eq(first: 'Bob', last: 'Smith') end end