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