From 586a8e1aef1e5881649c6d0c90ddc73362ecfe66 Mon Sep 17 00:00:00 2001 From: Jane Wheatley Date: Mon, 20 Oct 2025 12:01:31 -0700 Subject: [PATCH 1/5] 5428 Sort vendor purchases by issued_at in reverse chronological order --- app/models/vendor.rb | 2 +- app/views/vendors/show.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/vendor.rb b/app/models/vendor.rb index 6b63505ba3..1ef8a6493a 100644 --- a/app/models/vendor.rb +++ b/app/models/vendor.rb @@ -23,7 +23,7 @@ class Vendor < ApplicationRecord include Geocodable include Filterable - has_many :purchases, inverse_of: :vendor, dependent: :destroy + has_many :purchases, -> { order(issued_at: :desc) }, inverse_of: :vendor, dependent: :destroy validates :business_name, presence: true diff --git a/app/views/vendors/show.html.erb b/app/views/vendors/show.html.erb index 90a20869fe..7359a33dd0 100644 --- a/app/views/vendors/show.html.erb +++ b/app/views/vendors/show.html.erb @@ -76,7 +76,7 @@ <% @vendor.purchases.each do |purchase| %> - <%= purchase.created_at.strftime("%m/%d/%Y") %> + <%= purchase.issued_at.strftime("%m/%d/%Y") %> <%= purchase.line_items.total %> <%= view_button_to purchase, { text: "View purchase details" } %> From 8c562afc0df631021fc2423780fb2a6facbe40db Mon Sep 17 00:00:00 2001 From: Jane Wheatley Date: Mon, 20 Oct 2025 12:45:23 -0700 Subject: [PATCH 2/5] 5428 add automated tests confirming vendor purchase order change --- app/views/vendors/show.html.erb | 2 +- spec/models/vendor_spec.rb | 16 ++++++++++++++++ spec/system/vendor_system_spec.rb | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/views/vendors/show.html.erb b/app/views/vendors/show.html.erb index 7359a33dd0..50b7bd6227 100644 --- a/app/views/vendors/show.html.erb +++ b/app/views/vendors/show.html.erb @@ -76,7 +76,7 @@ <% @vendor.purchases.each do |purchase| %> - <%= purchase.issued_at.strftime("%m/%d/%Y") %> + <%= purchase.issued_at.strftime("%m/%d/%Y") %> <%= purchase.line_items.total %> <%= view_button_to purchase, { text: "View purchase details" } %> diff --git a/spec/models/vendor_spec.rb b/spec/models/vendor_spec.rb index 1512193214..d59c94aace 100644 --- a/spec/models/vendor_spec.rb +++ b/spec/models/vendor_spec.rb @@ -56,6 +56,22 @@ end end + context "Associations" do + describe "purchases" do + it "orders purchases by issued_at in descending order (newest first)" do + vendor = create(:vendor) + + # Create purchases with different issued_at dates + old_purchase = create(:purchase, vendor: vendor, issued_at: 1.week.ago) + new_purchase = create(:purchase, vendor: vendor, issued_at: 1.day.ago) + middle_purchase = create(:purchase, vendor: vendor, issued_at: 3.days.ago) + + # Verify they're ordered newest first + expect(vendor.purchases.to_a).to eq([new_purchase, middle_purchase, old_purchase]) + end + end + end + describe "versioning" do it { is_expected.to be_versioned } end diff --git a/spec/system/vendor_system_spec.rb b/spec/system/vendor_system_spec.rb index a33e9f0466..315f45c82a 100644 --- a/spec/system/vendor_system_spec.rb +++ b/spec/system/vendor_system_spec.rb @@ -130,5 +130,23 @@ expect(page).to have_xpath("//table/tbody/tr", count: 3) expect(page).to have_xpath("//table/tbody/tr/td", text: "10") end + + it "displays purchases in reverse chronological order by issued_at date" do + # Create purchases with specific issued_at dates + old_purchase = create(:purchase, vendor: @vendor, issued_at: 1.week.ago) + new_purchase = create(:purchase, vendor: @vendor, issued_at: 1.day.ago) + middle_purchase = create(:purchase, vendor: @vendor, issued_at: 3.days.ago) + + visit vendor_path(@vendor) + + # Get all date text using the correct data attribute + dates = page.all("[data-testid='purchase-date']").map(&:text) + + # Get all purchases for this vendor and sort them by issued_at desc + all_purchases = @vendor.reload.purchases.order(issued_at: :desc) + expected_dates = all_purchases.map { |p| p.issued_at.strftime("%m/%d/%Y") } + + expect(dates).to eq(expected_dates) + end end end From 83c4cf555da2e74da02f4722eecb4377aaa7f257 Mon Sep 17 00:00:00 2001 From: Jane Wheatley Date: Mon, 20 Oct 2025 13:04:46 -0700 Subject: [PATCH 3/5] 5428 fix linting issues --- spec/models/vendor_spec.rb | 4 ++-- spec/system/vendor_system_spec.rb | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/spec/models/vendor_spec.rb b/spec/models/vendor_spec.rb index d59c94aace..8260808553 100644 --- a/spec/models/vendor_spec.rb +++ b/spec/models/vendor_spec.rb @@ -60,12 +60,12 @@ describe "purchases" do it "orders purchases by issued_at in descending order (newest first)" do vendor = create(:vendor) - + # Create purchases with different issued_at dates old_purchase = create(:purchase, vendor: vendor, issued_at: 1.week.ago) new_purchase = create(:purchase, vendor: vendor, issued_at: 1.day.ago) middle_purchase = create(:purchase, vendor: vendor, issued_at: 3.days.ago) - + # Verify they're ordered newest first expect(vendor.purchases.to_a).to eq([new_purchase, middle_purchase, old_purchase]) end diff --git a/spec/system/vendor_system_spec.rb b/spec/system/vendor_system_spec.rb index 315f45c82a..21e1fec3a3 100644 --- a/spec/system/vendor_system_spec.rb +++ b/spec/system/vendor_system_spec.rb @@ -132,16 +132,16 @@ end it "displays purchases in reverse chronological order by issued_at date" do - # Create purchases with specific issued_at dates - old_purchase = create(:purchase, vendor: @vendor, issued_at: 1.week.ago) - new_purchase = create(:purchase, vendor: @vendor, issued_at: 1.day.ago) - middle_purchase = create(:purchase, vendor: @vendor, issued_at: 3.days.ago) - + # Create purchases with specific issued_at dates + create(:purchase, vendor: @vendor, issued_at: 1.week.ago) + create(:purchase, vendor: @vendor, issued_at: 1.day.ago) + create(:purchase, vendor: @vendor, issued_at: 3.days.ago) + visit vendor_path(@vendor) - + # Get all date text using the correct data attribute dates = page.all("[data-testid='purchase-date']").map(&:text) - + # Get all purchases for this vendor and sort them by issued_at desc all_purchases = @vendor.reload.purchases.order(issued_at: :desc) expected_dates = all_purchases.map { |p| p.issued_at.strftime("%m/%d/%Y") } From 723519ad41ba26d256c075c4092d2f1587305262 Mon Sep 17 00:00:00 2001 From: Jane Wheatley Date: Thu, 23 Oct 2025 11:34:12 -0700 Subject: [PATCH 4/5] 5428 address MR comments by adding issued_at ordering in the view instead of the model, fix up automated tests --- app/models/vendor.rb | 2 +- app/views/vendors/show.html.erb | 4 ++-- spec/models/vendor_spec.rb | 16 ---------------- spec/requests/vendors_requests_spec.rb | 14 ++++++++++++++ spec/system/vendor_system_spec.rb | 18 ------------------ 5 files changed, 17 insertions(+), 37 deletions(-) diff --git a/app/models/vendor.rb b/app/models/vendor.rb index 1ef8a6493a..6b63505ba3 100644 --- a/app/models/vendor.rb +++ b/app/models/vendor.rb @@ -23,7 +23,7 @@ class Vendor < ApplicationRecord include Geocodable include Filterable - has_many :purchases, -> { order(issued_at: :desc) }, inverse_of: :vendor, dependent: :destroy + has_many :purchases, inverse_of: :vendor, dependent: :destroy validates :business_name, presence: true diff --git a/app/views/vendors/show.html.erb b/app/views/vendors/show.html.erb index 50b7bd6227..990ece9ca3 100644 --- a/app/views/vendors/show.html.erb +++ b/app/views/vendors/show.html.erb @@ -74,9 +74,9 @@ - <% @vendor.purchases.each do |purchase| %> + <% @vendor.purchases.order(issued_at: :desc).each do |purchase| %> - <%= purchase.issued_at.strftime("%m/%d/%Y") %> + <%= purchase.issued_at.strftime("%m/%d/%Y") %> <%= purchase.line_items.total %> <%= view_button_to purchase, { text: "View purchase details" } %> diff --git a/spec/models/vendor_spec.rb b/spec/models/vendor_spec.rb index 8260808553..1512193214 100644 --- a/spec/models/vendor_spec.rb +++ b/spec/models/vendor_spec.rb @@ -56,22 +56,6 @@ end end - context "Associations" do - describe "purchases" do - it "orders purchases by issued_at in descending order (newest first)" do - vendor = create(:vendor) - - # Create purchases with different issued_at dates - old_purchase = create(:purchase, vendor: vendor, issued_at: 1.week.ago) - new_purchase = create(:purchase, vendor: vendor, issued_at: 1.day.ago) - middle_purchase = create(:purchase, vendor: vendor, issued_at: 3.days.ago) - - # Verify they're ordered newest first - expect(vendor.purchases.to_a).to eq([new_purchase, middle_purchase, old_purchase]) - end - end - end - describe "versioning" do it { is_expected.to be_versioned } end diff --git a/spec/requests/vendors_requests_spec.rb b/spec/requests/vendors_requests_spec.rb index 299bf94001..0d1b872f62 100644 --- a/spec/requests/vendors_requests_spec.rb +++ b/spec/requests/vendors_requests_spec.rb @@ -123,6 +123,20 @@ get vendor_path(id: create(:vendor, organization: organization)) expect(response).to be_successful end + + it "displays purchases in reverse chronological order by issued_at date" do + vendor = create(:vendor, organization: organization) + + # Create purchases with different issued_at dates + old_purchase = create(:purchase, vendor: vendor, issued_at: 1.week.ago, organization: organization) + new_purchase = create(:purchase, vendor: vendor, issued_at: 1.day.ago, organization: organization) + middle_purchase = create(:purchase, vendor: vendor, issued_at: 3.days.ago, organization: organization) + + get vendor_path(vendor) + + expect(vendor.reload.purchases.order(issued_at: :desc).to_a).to eq([new_purchase, middle_purchase, old_purchase]) + expect(response).to be_successful + end end describe "DELETE #destroy" do diff --git a/spec/system/vendor_system_spec.rb b/spec/system/vendor_system_spec.rb index 21e1fec3a3..a33e9f0466 100644 --- a/spec/system/vendor_system_spec.rb +++ b/spec/system/vendor_system_spec.rb @@ -130,23 +130,5 @@ expect(page).to have_xpath("//table/tbody/tr", count: 3) expect(page).to have_xpath("//table/tbody/tr/td", text: "10") end - - it "displays purchases in reverse chronological order by issued_at date" do - # Create purchases with specific issued_at dates - create(:purchase, vendor: @vendor, issued_at: 1.week.ago) - create(:purchase, vendor: @vendor, issued_at: 1.day.ago) - create(:purchase, vendor: @vendor, issued_at: 3.days.ago) - - visit vendor_path(@vendor) - - # Get all date text using the correct data attribute - dates = page.all("[data-testid='purchase-date']").map(&:text) - - # Get all purchases for this vendor and sort them by issued_at desc - all_purchases = @vendor.reload.purchases.order(issued_at: :desc) - expected_dates = all_purchases.map { |p| p.issued_at.strftime("%m/%d/%Y") } - - expect(dates).to eq(expected_dates) - end end end From 70a54eb38a41f028fc0e0a661a0d1ff304e4341e Mon Sep 17 00:00:00 2001 From: Jane Wheatley Date: Fri, 24 Oct 2025 13:51:00 -0700 Subject: [PATCH 5/5] 5428 move purchases logic to vendors controller, fix spec to test the view through the response.body --- app/controllers/vendors_controller.rb | 1 + app/views/vendors/show.html.erb | 2 +- spec/requests/vendors_requests_spec.rb | 11 +++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/controllers/vendors_controller.rb b/app/controllers/vendors_controller.rb index 747c99d271..585a98ac2f 100644 --- a/app/controllers/vendors_controller.rb +++ b/app/controllers/vendors_controller.rb @@ -47,6 +47,7 @@ def edit def show @vendor = current_organization.vendors.includes(:purchases).find(params[:id]) + @purchases = @vendor.purchases.order(issued_at: :desc) end def update diff --git a/app/views/vendors/show.html.erb b/app/views/vendors/show.html.erb index 990ece9ca3..86c4956773 100644 --- a/app/views/vendors/show.html.erb +++ b/app/views/vendors/show.html.erb @@ -74,7 +74,7 @@ - <% @vendor.purchases.order(issued_at: :desc).each do |purchase| %> + <% @purchases.each do |purchase| %> <%= purchase.issued_at.strftime("%m/%d/%Y") %> <%= purchase.line_items.total %> diff --git a/spec/requests/vendors_requests_spec.rb b/spec/requests/vendors_requests_spec.rb index 0d1b872f62..e87c2906c1 100644 --- a/spec/requests/vendors_requests_spec.rb +++ b/spec/requests/vendors_requests_spec.rb @@ -134,8 +134,15 @@ get vendor_path(vendor) - expect(vendor.reload.purchases.order(issued_at: :desc).to_a).to eq([new_purchase, middle_purchase, old_purchase]) - expect(response).to be_successful + old_date = old_purchase.issued_at.strftime("%m/%d/%Y") + middle_date = middle_purchase.issued_at.strftime("%m/%d/%Y") + new_date = new_purchase.issued_at.strftime("%m/%d/%Y") + + dates = [new_date, middle_date, old_date] + dates.each { |date| expect(response.body).to include(date) } + + expect(response.body.index(new_date)).to be < response.body.index(middle_date) + expect(response.body.index(middle_date)).to be < response.body.index(old_date) end end