From 805a74d5c8dadfb7895e1d8536da5156e8b6cf83 Mon Sep 17 00:00:00 2001 From: wata727 Date: Wed, 28 Jun 2023 19:16:55 +0900 Subject: [PATCH] Raise ValidDatetimeRangeError instead of RecordInvalid in _update_row --- lib/activerecord-bitemporal.rb | 1 + lib/activerecord-bitemporal/bitemporal.rb | 8 ++++++-- lib/activerecord-bitemporal/errors.rb | 7 +++++++ spec/activerecord-bitemporal/bitemporal_scope_spec.rb | 6 +++--- spec/activerecord-bitemporal/bitemporal_spec.rb | 8 +++----- 5 files changed, 20 insertions(+), 10 deletions(-) create mode 100644 lib/activerecord-bitemporal/errors.rb diff --git a/lib/activerecord-bitemporal.rb b/lib/activerecord-bitemporal.rb index 91750ae..c812c56 100644 --- a/lib/activerecord-bitemporal.rb +++ b/lib/activerecord-bitemporal.rb @@ -4,6 +4,7 @@ require "active_support/core_ext/time/calculations" require "activerecord-bitemporal/bitemporal" require "activerecord-bitemporal/scope" +require "activerecord-bitemporal/errors" require "activerecord-bitemporal/patches" require "activerecord-bitemporal/version" require "activerecord-bitemporal/visualizer" diff --git a/lib/activerecord-bitemporal/bitemporal.rb b/lib/activerecord-bitemporal/bitemporal.rb index 01c31b6..b93e000 100644 --- a/lib/activerecord-bitemporal/bitemporal.rb +++ b/lib/activerecord-bitemporal/bitemporal.rb @@ -498,13 +498,17 @@ def bitemporal_build_update_records(valid_datetime:, current_time: Time.current, # 以前の履歴データは valid_to を詰めて保存 before_instance.valid_to = target_datetime - raise ActiveRecord::RecordInvalid.new(before_instance) if before_instance.valid_from_cannot_be_greater_equal_than_valid_to + if before_instance.valid_from_cannot_be_greater_equal_than_valid_to + raise ValidDatetimeRangeError.new("valid_from #{before_instance.valid_from} can't be greater equal than valid_to #{before_instance.valid_to}") + end before_instance.transaction_from = current_time # 以降の履歴データは valid_from と valid_to を調整して保存する after_instance.valid_from = target_datetime after_instance.valid_to = current_valid_record.valid_to - raise ActiveRecord::RecordInvalid.new(after_instance) if after_instance.valid_from_cannot_be_greater_equal_than_valid_to + if after_instance.valid_from_cannot_be_greater_equal_than_valid_to + raise ValidDatetimeRangeError.new("valid_from #{after_instance.valid_from} can't be greater equal than valid_to #{after_instance.valid_to}") + end after_instance.transaction_from = current_time # 有効なレコードがない場合 diff --git a/lib/activerecord-bitemporal/errors.rb b/lib/activerecord-bitemporal/errors.rb new file mode 100644 index 0000000..e5769a3 --- /dev/null +++ b/lib/activerecord-bitemporal/errors.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module ActiveRecord::Bitemporal + class BitemporalError < StandardError; end + + class ValidDatetimeRangeError < BitemporalError; end +end diff --git a/spec/activerecord-bitemporal/bitemporal_scope_spec.rb b/spec/activerecord-bitemporal/bitemporal_scope_spec.rb index ba18155..54d32b4 100644 --- a/spec/activerecord-bitemporal/bitemporal_scope_spec.rb +++ b/spec/activerecord-bitemporal/bitemporal_scope_spec.rb @@ -1204,9 +1204,9 @@ class Article < ActiveRecord::Base end describe "through" do - let(:blog) { Blog.create!(name: "tabelog").tap { |it| it.update(name: "sushilog") } } - let(:user) { User.create!(name: "Jane").tap { |it| it.update(name: "Tom") } } - let(:article) { user.articles.create!(title: "yakiniku", blog: blog).tap { |it| it.update(title: "sushi") } } + let(:blog) { Blog.create!(name: "tabelog") } + let(:user) { User.create!(name: "Jane") } + let(:article) { user.articles.create!(title: "yakiniku", blog: blog) } context ".ignore_valid_datetime" do let(:relation) { blog.users.ignore_valid_datetime } diff --git a/spec/activerecord-bitemporal/bitemporal_spec.rb b/spec/activerecord-bitemporal/bitemporal_spec.rb index 7c58f02..fedfd93 100644 --- a/spec/activerecord-bitemporal/bitemporal_spec.rb +++ b/spec/activerecord-bitemporal/bitemporal_spec.rb @@ -858,15 +858,13 @@ def employee.wrapped_name let(:valid_datetime) { company.valid_from } subject { company.valid_at(valid_datetime) { |c| c.update(name: "Company") } } - it { expect(subject).to be_falsey } - it { expect { subject }.not_to change(&company_count) } - it { expect { subject }.not_to change(&company_transaction_to) } + it { expect { subject }.to raise_error(ActiveRecord::Bitemporal::ValidDatetimeRangeError) } context "call `update!`" do subject { company.valid_at(valid_datetime) { |c| c.update!(name: "Company") } } - it { expect { subject }.to raise_error(ActiveRecord::RecordInvalid) } + it { expect { subject }.to raise_error(ActiveRecord::Bitemporal::ValidDatetimeRangeError) } it { expect { subject }.to raise_error { |e| - expect(e.message).to eq "Validation failed: Valid from can't be greater equal than valid_to" + expect(e.message).to eq "valid_from #{company.valid_from} can't be greater equal than valid_to #{valid_datetime}" } } end end