Skip to content

Phoenix: Add generated tests for app/models/product*.rb #7

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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: "[email protected]", organization: organization)
participant2 = ProductDriveParticipant.create!(contact_name: "Alpha", phone: "0987654321", email: "[email protected]", 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: "[email protected]", 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: "[email protected]", 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
151 changes: 151 additions & 0 deletions phoenix-tests/unit/tests/app/models/product_drive_spec.rb
Original file line number Diff line number Diff line change
@@ -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