From 114345a0e11104a4583c9dd672661c5e4666559b Mon Sep 17 00:00:00 2001 From: "phoenix[bot]" Date: Fri, 31 Jan 2025 21:03:58 +0000 Subject: [PATCH] Add generated tests for app/models/product*.rb --- .../models/product_drive_participant_spec.rb | 96 +++++++++++ .../tests/app/models/product_drive_spec.rb | 151 ++++++++++++++++++ 2 files changed, 247 insertions(+) create mode 100644 phoenix-tests/unit/tests/app/models/product_drive_participant_spec.rb create mode 100644 phoenix-tests/unit/tests/app/models/product_drive_spec.rb diff --git a/phoenix-tests/unit/tests/app/models/product_drive_participant_spec.rb b/phoenix-tests/unit/tests/app/models/product_drive_participant_spec.rb new file mode 100644 index 0000000000..bc048b4cc7 --- /dev/null +++ b/phoenix-tests/unit/tests/app/models/product_drive_participant_spec.rb @@ -0,0 +1,96 @@ +require "rails_helper" + +RSpec.describe ProductDriveParticipant, type: :model do + describe "validations" do + context "when phone is not present" do + it "validates presence of email" do + participant = ProductDriveParticipant.new(email: nil, phone: nil) + expect(participant).not_to be_valid + expect(participant.errors[:email]).to include("Must provide a phone or an e-mail") + end + end + + context "when email is not present" do + it "validates presence of phone" do + participant = ProductDriveParticipant.new(email: nil, phone: nil) + expect(participant).not_to be_valid + expect(participant.errors[:phone]).to include("Must provide a phone or an e-mail") + end + end + + context "when contact_name is not present" do + it "validates presence of business_name" do + participant = ProductDriveParticipant.new(contact_name: nil, business_name: nil) + expect(participant).not_to be_valid + expect(participant.errors[:business_name]).to include("Must provide a name or a business name") + end + end + + context "when business_name is not present" do + it "validates presence of contact_name" do + participant = ProductDriveParticipant.new(contact_name: nil, business_name: nil) + expect(participant).not_to be_valid + expect(participant.errors[:contact_name]).to include("Must provide a name or a business name") + end + end + + it "validates length of comment" do + participant = ProductDriveParticipant.new(comment: "a" * 501) + expect(participant).not_to be_valid + expect(participant.errors[:comment]).to include("is too long (maximum is 500 characters)") + end + end + + describe "scopes" do + describe ".alphabetized" do + it "orders participants by contact_name" do + organization = Organization.create!(name: "Test Org") + participant1 = ProductDriveParticipant.create!(contact_name: "Zeta", phone: "1234567890", email: "zeta@example.com", organization: organization) + participant2 = ProductDriveParticipant.create!(contact_name: "Alpha", phone: "0987654321", email: "alpha@example.com", organization: organization) + expect(ProductDriveParticipant.alphabetized).to eq([participant2, participant1]) + end + end + end + + describe "#volume" do + it "calculates the total volume of donations" do + organization = Organization.create!(name: "Test Org") + participant = ProductDriveParticipant.create!(contact_name: "John Doe", phone: "1234567890", email: "john@example.com", organization: organization) + donation1 = participant.donations.create!(organization: organization) + donation2 = participant.donations.create!(organization: organization) + allow(donation1.line_items).to receive(:total).and_return(10) + allow(donation2.line_items).to receive(:total).and_return(20) + expect(participant.volume).to eq(30) + end + end + + describe "#volume_by_product_drive" do + it "calculates the total volume of donations for a specific product drive" do + organization = Organization.create!(name: "Test Org") + participant = ProductDriveParticipant.create!(contact_name: "John Doe", phone: "1234567890", email: "john@example.com", organization: organization) + product_drive = ProductDrive.create!(name: "Drive 1", organization: organization) + donation1 = participant.donations.create!(product_drive: product_drive, organization: organization) + donation2 = participant.donations.create!(product_drive_id: 2, organization: organization) + allow(donation1.line_items).to receive(:total).and_return(10) + allow(donation2.line_items).to receive(:total).and_return(20) + allow(participant.donations).to receive(:by_product_drive).with(product_drive.id).and_return([donation1]) + expect(participant.volume_by_product_drive(product_drive.id)).to eq(10) + end + end + + describe "#donation_source_view" do + context "when contact_name is present" do + it "returns the formatted donation source view" do + participant = ProductDriveParticipant.new(contact_name: "John Doe") + expect(participant.donation_source_view).to eq("John Doe (participant)") + end + end + + context "when contact_name is blank" do + it "returns nil" do + participant = ProductDriveParticipant.new(contact_name: nil) + expect(participant.donation_source_view).to be_nil + end + end + end +end diff --git a/phoenix-tests/unit/tests/app/models/product_drive_spec.rb b/phoenix-tests/unit/tests/app/models/product_drive_spec.rb new file mode 100644 index 0000000000..b9199fe168 --- /dev/null +++ b/phoenix-tests/unit/tests/app/models/product_drive_spec.rb @@ -0,0 +1,151 @@ +require "rails_helper" + +RSpec.describe ProductDrive, type: :model do + let(:organization) { create(:organization) } + let(:product_drive) { create(:product_drive, organization: organization) } + let(:donation) { create(:donation, product_drive: product_drive) } + let(:line_item) { create(:line_item, itemizable: donation) } + + describe "associations" do + it "belongs to organization" do + expect(product_drive.organization).to eq(organization) + end + + it "has many donations" do + expect(product_drive.donations).to include(donation) + end + + it "has many product_drive_participants through donations" do + participant = create(:product_drive_participant, donations: [donation]) + expect(product_drive.product_drive_participants).to include(participant) + end + end + + describe "validations" do + it "validates presence of name" do + product_drive.name = nil + expect(product_drive).not_to be_valid + expect(product_drive.errors[:name]).to include("A name must be chosen.") + end + + it "validates presence of start_date" do + product_drive.start_date = nil + expect(product_drive).not_to be_valid + expect(product_drive.errors[:start_date]).to include("Please enter a start date.") + end + + it "validates end_date is after start_date" do + product_drive.start_date = Date.today + product_drive.end_date = Date.yesterday + expect(product_drive).not_to be_valid + expect(product_drive.errors[:end_date]).to include("End date must be after the start date") + end + end + + describe "scopes" do + describe ".by_name" do + it "filters by name" do + create(:product_drive, name: "Drive A") + create(:product_drive, name: "Drive B") + expect(ProductDrive.by_name("Drive A").pluck(:name)).to eq(["Drive A"]) + end + end + + describe ".by_item_category_id" do + it "filters by item category id" do + item_category = create(:item_category) + item = create(:item, item_category: item_category) + line_item.update(item: item) + expect(ProductDrive.by_item_category_id(item_category.id)).to include(product_drive) + end + end + + describe ".within_date_range" do + it "filters by date range" do + create(:product_drive, start_date: "2023-01-01", end_date: "2023-01-31") + create(:product_drive, start_date: "2023-02-01", end_date: "2023-02-28") + expect(ProductDrive.within_date_range("2023-01-01 - 2023-01-31").count).to eq(1) + end + end + + describe ".alphabetized" do + it "orders by name" do + create(:product_drive, name: "Drive B") + create(:product_drive, name: "Drive A") + expect(ProductDrive.alphabetized.pluck(:name)).to eq(["Drive A", "Drive B"]) + end + end + end + + describe "instance methods" do + describe "#end_date_is_bigger_of_end_date" do + it "adds error if end_date is before start_date" do + product_drive.start_date = Date.today + product_drive.end_date = Date.yesterday + product_drive.valid? + expect(product_drive.errors[:end_date]).to include("End date must be after the start date") + end + end + + describe "#donation_quantity" do + it "calculates total donation quantity" do + line_item.update(quantity: 5) + expect(product_drive.donation_quantity).to eq(5) + end + end + + describe "#distinct_items_count" do + it "counts distinct items" do + create(:line_item, itemizable: donation, item: create(:item)) + expect(product_drive.distinct_items_count).to eq(2) + end + end + + describe "#in_kind_value" do + it "calculates in-kind value" do + allow(donation).to receive(:value_per_itemizable).and_return(100) + expect(product_drive.in_kind_value).to eq(100) + end + end + + describe "#donation_source_view" do + it "returns formatted donation source view" do + expect(product_drive.donation_source_view).to eq("#{product_drive.name} (product drive)") + end + end + + describe "#item_quantities_by_name_and_date" do + it "returns item quantities filtered by date and sorted by name" do + item = create(:item, organization: organization, name: "Item A") + line_item.update(item: item, quantity: 10) + expect(product_drive.item_quantities_by_name_and_date("2023-01-01 - 2023-12-31")).to eq([10]) + end + end + + describe "#donation_quantity_by_date" do + it "calculates donation quantity by date and optional item category" do + item_category = create(:item_category) + item = create(:item, item_category: item_category) + line_item.update(item: item, quantity: 10) + expect(product_drive.donation_quantity_by_date("2023-01-01 - 2023-12-31", item_category.id)).to eq(10) + end + end + + describe "#distinct_items_count_by_date" do + it "counts distinct items by date and optional item category" do + item_category = create(:item_category) + item = create(:item, item_category: item_category) + line_item.update(item: item) + expect(product_drive.distinct_items_count_by_date("2023-01-01 - 2023-12-31", item_category.id)).to eq(1) + end + end + end + + describe "class methods" do + describe ".search_date_range" do + it "parses and returns search date range" do + expect(ProductDrive.search_date_range("2023-01-01 - 2023-12-31")).to eq({ start_date: "2023-01-01", end_date: "2023-12-31" }) + end + end + end +end