7 changed files with 136 additions and 1 deletions
@ -0,0 +1,18 @@ |
|||||||
|
class DuplicateLogReference < ApplicationRecord |
||||||
|
belongs_to :log, polymorphic: true |
||||||
|
|
||||||
|
before_create :set_default_duplicate_log_reference_id |
||||||
|
|
||||||
|
private |
||||||
|
|
||||||
|
def set_default_duplicate_log_reference_id |
||||||
|
self.duplicate_log_reference_id ||= generate_new_id |
||||||
|
end |
||||||
|
|
||||||
|
def generate_new_id |
||||||
|
loop do |
||||||
|
duplicate_log_reference_id = SecureRandom.random_number(1_000_000) |
||||||
|
return duplicate_log_reference_id unless DuplicateLogReference.exists?(duplicate_log_reference_id:) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
@ -0,0 +1,11 @@ |
|||||||
|
class CreateDuplicateLogReferences < ActiveRecord::Migration[7.0] |
||||||
|
def change |
||||||
|
create_table :duplicate_log_references do |t| |
||||||
|
t.integer :duplicate_log_reference_id |
||||||
|
t.integer :log_id |
||||||
|
t.string :log_type |
||||||
|
|
||||||
|
t.timestamps |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
@ -0,0 +1,89 @@ |
|||||||
|
require "rails_helper" |
||||||
|
|
||||||
|
RSpec.describe DuplicateLogReference, type: :model do |
||||||
|
context "when adding a new duplicate log" do |
||||||
|
context "and duplicate_log_reference_id is not given" do |
||||||
|
let(:sales_log) { create(:sales_log) } |
||||||
|
|
||||||
|
it "generates a new random duplicate_log_reference_id" do |
||||||
|
duplicate_log = described_class.create!(log_id: sales_log.id, log_type: "SalesLog") |
||||||
|
expect(duplicate_log.duplicate_log_reference_id).to be_a(Integer) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "and duplicate_log_reference_id is given" do |
||||||
|
let(:sales_log) { create(:sales_log) } |
||||||
|
|
||||||
|
it "adds correct duplicate_log_reference_id" do |
||||||
|
duplicate_log = described_class.create!(log_id: sales_log.id, log_type: "SalesLog", duplicate_log_reference_id: 123_456) |
||||||
|
expect(duplicate_log.duplicate_log_reference_id).to eq(123_456) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "and log does not exist" do |
||||||
|
it "raises an error" do |
||||||
|
expect { described_class.create!(log_id: 1, log_type: "SalesLog") }.to raise_error(ActiveRecord::RecordInvalid) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "and log_type is invalid" do |
||||||
|
let(:sales_log) { create(:sales_log) } |
||||||
|
|
||||||
|
it "raises an error" do |
||||||
|
expect { described_class.create!(log_id: sales_log.id, log_type: "SomethingElse") }.to raise_error(NameError) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when accessing all duplicates for a sales log" do |
||||||
|
let(:sales_log) { create(:sales_log) } |
||||||
|
|
||||||
|
context "and there are no duplicates" do |
||||||
|
it "returns an empty array" do |
||||||
|
expect(sales_log.duplicates).to eq([]) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "and there are duplicates" do |
||||||
|
let(:other_sales_log) { create(:sales_log) } |
||||||
|
|
||||||
|
before do |
||||||
|
duplicate_log = described_class.create!(log_id: sales_log.id, log_type: "SalesLog") |
||||||
|
described_class.create!(log_id: other_sales_log.id, log_type: "SalesLog", duplicate_log_reference_id: duplicate_log.duplicate_log_reference_id) |
||||||
|
create(:sales_log) |
||||||
|
create(:sales_log) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns the correct duplicates" do |
||||||
|
expect(sales_log.duplicates.count).to eq(1) |
||||||
|
expect(sales_log.duplicates).to include(other_sales_log) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when accessing all duplicates for a lettings log" do |
||||||
|
let(:lettings_log) { create(:lettings_log) } |
||||||
|
|
||||||
|
context "and there are no duplicates" do |
||||||
|
it "returns an empty array" do |
||||||
|
expect(lettings_log.duplicates).to eq([]) |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "and there are duplicates" do |
||||||
|
let(:other_lettings_log) { create(:lettings_log) } |
||||||
|
|
||||||
|
before do |
||||||
|
duplicate_log = described_class.create!(log_id: lettings_log.id, log_type: "LettingsLog") |
||||||
|
described_class.create!(log_id: other_lettings_log.id, log_type: "LettingsLog", duplicate_log_reference_id: duplicate_log.duplicate_log_reference_id) |
||||||
|
create(:lettings_log) |
||||||
|
create(:lettings_log) |
||||||
|
end |
||||||
|
|
||||||
|
it "returns the correct duplicates" do |
||||||
|
expect(lettings_log.duplicates.count).to eq(1) |
||||||
|
expect(lettings_log.duplicates).to include(other_lettings_log) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
Loading…
Reference in new issue