|
- require 'rails_helper'
-
- RSpec.describe VersionRecorder do
- let(:member) { create(:user, :member) }
-
- let(:post_record) do
- Post.create!(
- title: 'version recorder post',
- url: 'https://example.com/version-recorder-post')
- end
-
- it 'updates record version_no when creating the first version' do
- version =
- PostVersionRecorder.record!(
- post: post_record,
- event_type: :create,
- created_by_user: member)
-
- expect(version.version_no).to eq(1)
- expect(post_record.reload.version_no).to eq(1)
- end
-
- it 'updates record version_no when creating the next version' do
- PostVersionRecorder.record!(
- post: post_record,
- event_type: :create,
- created_by_user: member)
-
- post_record.update!(title: 'updated version recorder post')
-
- version =
- PostVersionRecorder.record!(
- post: post_record.reload,
- event_type: :update,
- created_by_user: member)
-
- expect(version.version_no).to eq(2)
- expect(post_record.reload.version_no).to eq(2)
- end
-
- it 'does not create a new version or advance version_no when snapshot is unchanged' do
- first =
- PostVersionRecorder.record!(
- post: post_record,
- event_type: :create,
- created_by_user: member)
-
- expect {
- version =
- PostVersionRecorder.record!(
- post: post_record.reload,
- event_type: :update,
- created_by_user: member)
-
- expect(version).to eq(first)
- }.not_to change(PostVersion, :count)
-
- expect(post_record.reload.version_no).to eq(1)
- end
-
- it 'raises when record version_no is older than the latest version' do
- PostVersionRecorder.record!(
- post: post_record,
- event_type: :create,
- created_by_user: member)
-
- post_record.update!(title: 'updated once')
-
- PostVersionRecorder.record!(
- post: post_record.reload,
- event_type: :update,
- created_by_user: member)
-
- post_record.update_columns(version_no: 1)
-
- post_record.update!(title: 'updated with stale version_no')
-
- expect {
- PostVersionRecorder.record!(
- post: post_record.reload,
- event_type: :update,
- created_by_user: member)
- }.to raise_error(RuntimeError, /version_no/)
- end
- end
|