Files
openfoodnetwork/spec/system/admin/orders_spec.rb
Gaetan Craig-Riou 67dc79b074 Replace tomselect_search_and_select by tomselect_select
In these scenarios, searching for the option is not actually required,
we can directly click on the needed option. It prevent issue with
the dropdown option staying open and breaking specs.
2024-01-24 14:53:44 +11:00

981 lines
37 KiB
Ruby

# frozen_string_literal: true
require "system_helper"
describe '
As an administrator
I want to manage orders
' do
include AuthenticationHelper
include WebHelper
let(:owner) { create(:user) }
let(:owner2) { create(:user) }
let(:customer) { create(:user) }
let(:customer2) { create(:user) }
let(:customer3) { create(:user) }
let(:customer4) { create(:user) }
let(:customer5) { create(:user) }
let(:billing_address) { create(:address, :randomized) }
let(:billing_address2) { create(:address, :randomized) }
let(:billing_address3) { create(:address, :randomized) }
let(:billing_address4) { create(:address, :randomized) }
let(:billing_address5) { create(:address, :randomized) }
let(:product) { create(:simple_product) }
let(:distributor) {
create(:distributor_enterprise, owner:, with_payment_and_shipping: true,
charges_sales_tax: true)
}
let(:distributor2) { create(:distributor_enterprise_with_tax, owner:) }
let(:distributor3) {
create(:distributor_enterprise, owner:, with_payment_and_shipping: true,
charges_sales_tax: true)
}
let(:distributor4) {
create(:distributor_enterprise, owner:, with_payment_and_shipping: true,
charges_sales_tax: true)
}
let(:distributor5) { create(:distributor_enterprise, owner: owner2, charges_sales_tax: true) }
let!(:shipping_method) {
create(:shipping_method_with, :pickup, name: "pick_up",
distributors: [distributor, distributor2, distributor3])
}
let!(:shipping_method2) {
create(:shipping_method_with, :pickup, name: "delivery",
distributors: [distributor4, distributor5])
}
let(:order_cycle) do
create(:simple_order_cycle, name: 'One', distributors: [distributor, distributor2,
distributor3, distributor4],
variants: [product.variants.first])
end
context "with a complete order" do
let(:order) do
create(:order_with_totals_and_distribution, user: customer, distributor:,
order_cycle:,
state: 'complete', payment_state: 'balance_due',
bill_address_id: billing_address.id)
end
let!(:order_cycle2) {
create(:simple_order_cycle, name: 'Two', orders_close_at: 2.weeks.from_now)
}
let!(:order_cycle3) {
create(:simple_order_cycle, name: 'Three', orders_close_at: 3.weeks.from_now)
}
let!(:order_cycle4) {
create(:simple_order_cycle, name: 'Four', orders_close_at: 4.weeks.from_now)
}
let!(:order_cycle5) do
create(:simple_order_cycle, name: 'Five', coordinator: distributor5,
distributors: [distributor5], variants: [product.variants.first])
end
let!(:order2) {
create(:order_ready_to_ship, user: customer2, distributor: distributor2,
order_cycle: order_cycle2, completed_at: 2.days.ago,
bill_address_id: billing_address2.id)
}
let!(:order3) {
create(:order_with_credit_payment, user: customer3, distributor: distributor3,
order_cycle: order_cycle3,
bill_address_id: billing_address3.id)
}
let!(:order4) {
create(:order_with_credit_payment, user: customer4, distributor: distributor4,
order_cycle: order_cycle4,
bill_address_id: billing_address4.id)
}
let!(:order5) {
create(:order_ready_to_ship, user: customer5, distributor: distributor5,
order_cycle: order_cycle5,
bill_address_id: billing_address5.id)
}
describe "filters" do
before do
login_as_admin
visit spree.admin_orders_path
end
it "order cycles appear in descending order by close date on orders page" do
tomselect_open('q_order_cycle_id_in').click
expect(find('#q_order_cycle_id_in',
visible: :all)[:innerHTML]).to have_content(/.*Four.*Three.*Two.*Five/m)
end
it "filter by multiple order cycles" do
tomselect_multiselect 'Two', from: 'q[order_cycle_id_in][]'
tomselect_multiselect 'Three', from: 'q[order_cycle_id_in][]'
page.find('.filter-actions .button[type=submit]').click
# Order 2 and 3 should show, but not 4
expect(page).to have_content order2.number
expect(page).to have_content order3.number
expect(page).to_not have_content order4.number
end
it "filter by distributors" do
tomselect_multiselect distributor2.name.to_s, from: 'q[distributor_id_in][]'
tomselect_multiselect distributor4.name.to_s, from: 'q[distributor_id_in][]'
page.find('.filter-actions .button[type=submit]').click
# Order 2 and 4 should show, but not 3
expect(page).to have_content order2.number
expect(page).to_not have_content order3.number
expect(page).to have_content order4.number
end
it "filter by complete date" do
find("input.datepicker").click
select_dates_from_daterangepicker(order3.completed_at.yesterday,
order4.completed_at.tomorrow)
page.find('.filter-actions .button[type=submit]').click
# Order 3 and 4 should show, but not 2
expect(page).to_not have_content order2.number
expect(page).to have_content order3.number
expect(page).to have_content order4.number
end
it "filter by email" do
fill_in "Email", with: customer3.email
page.find('.filter-actions .button[type=submit]').click
# Order 3 should show, but not 2 and 4
expect(page).to_not have_content order2.number
expect(page).to have_content order3.number
expect(page).to_not have_content order4.number
end
it "filter by customer first and last names" do
# NOTE: this field refers to the name given in billing addresses and not to customer name
# filtering by first name
fill_in "First name begins with", with: billing_address2.firstname
page.find('.filter-actions .button[type=submit]').click
# Order 2 should show, but not 3 and 4
expect(page).to have_content order2.number
expect(page).to_not have_content order3.number
expect(page).to_not have_content order4.number
find("#clear_filters_button").click
# filtering by last name
fill_in "Last name begins with", with: billing_address4.lastname
page.find('.filter-actions .button[type=submit]').click
# Order 4 should show, but not 2 and 3
expect(page).to_not have_content order2.number
expect(page).to_not have_content order3.number
expect(page).to have_content order4.number
find("#clear_filters_button").click
# filtering by first and last name together
fill_in "First name begins with", with: billing_address3.firstname
fill_in "Last name begins with", with: billing_address3.lastname
page.find('.filter-actions .button[type=submit]').click
# Order 3 should show, but not 2 and 4
expect(page).not_to have_content order2.number
expect(page).to have_content order3.number
expect(page).not_to have_content order4.number
end
it "filter by shipping methods" do
order2.select_shipping_method(shipping_method.id)
order4.select_shipping_method(shipping_method2.id)
tomselect_search_and_select "Pick-up at the farm", from: 'shipping_method_id'
page.find('.filter-actions .button[type=submit]').click
# Order 2 should show, but not 3 and 5
expect(page).to have_content order2.number
expect(page).to_not have_content order3.number
expect(page).to_not have_content order4.number
find("#clear_filters_button").click
tomselect_search_and_select "Signed, sealed, delivered", from: 'shipping_method_id'
page.find('.filter-actions .button[type=submit]').click
# Order 4 should show, but not 2 and 3
expect(page).to_not have_content order2.number
expect(page).to_not have_content order3.number
expect(page).to have_content order4.number
end
it "filter by invoice number" do
fill_in "Order number:", with: order2.number
page.find('.filter-actions .button[type=submit]').click
# Order 2 should show, but not 3 and 4
expect(page).to have_content order2.number
expect(page).to_not have_content order3.number
expect(page).to_not have_content order4.number
end
it "filter by order state" do
order.update(state: "payment")
uncheck 'Only show complete orders'
page.find('.filter-actions .button[type=submit]').click
expect(page).to have_content order.number
expect(page).to have_content order2.number
expect(page).to have_content order3.number
expect(page).to have_content order4.number
expect(page).to have_content order5.number
tomselect_search_and_select "payment", from: 'q[state_eq]'
page.find('.filter-actions .button[type=submit]').click
# Order 2 should show, but not 3 and 4
expect(page).to have_content order.number
expect(page).to_not have_content order2.number
expect(page).to_not have_content order3.number
expect(page).to_not have_content order4.number
expect(page).to_not have_content order5.number
end
end
context "cart orders" do
let!(:order_empty) {
create(:order_with_line_items, user: customer2, distributor: distributor2,
line_items_count: 0)
}
let!(:order_not_empty) {
create(:order_with_line_items, user: customer2, distributor: distributor2,
line_items_count: 1)
}
let!(:order_not_empty_no_address) {
create(:order_with_line_items, line_items_count: 1, user: customer2,
distributor: distributor2, bill_address_id: nil,
ship_address_id: nil)
}
before do
login_as_admin
visit spree.admin_orders_path
uncheck 'Only show complete orders'
tomselect_search_and_select "cart", from: 'q[state_eq]'
page.find('.filter-actions .button[type=submit]').click
end
it "displays non-empty cart orders" do
# empty cart order does not appear in the results
expect(page).not_to have_content order_empty.number
# non-empty cart order, with bill- and ship-address appear in the results
expect(page).to have_content order_not_empty.number
# non-empty cart order, with no with bill- and ship-address appear in the results
expect(page).to have_content order_not_empty_no_address.number
# And the same orders are displayed when sorting by name:
find("th a", text: "NAME").click
expect(page).to have_no_content order_empty.number
expect(page).to have_content order_not_empty.number
expect(page).to have_content order_not_empty_no_address.number
end
end
describe "ordering" do
context "orders with different completion dates" do
before do
order2.update!(completed_at: 2.weeks.ago)
order3.update!(completed_at: 3.weeks.ago)
order4.update!(completed_at: 4.weeks.ago)
order5.update!(completed_at: 5.weeks.ago)
login_as_admin
visit spree.admin_orders_path
end
it "orders by completion date" do
find("a", text: 'COMPLETED AT').click # sets ascending ordering
expect(page).to have_content(
/#{order5.number}.*#{order4.number}.*#{order3.number}.*#{order2.number}/m
)
find("a", text: 'COMPLETED AT').click # sets descending ordering
expect(page).to have_content(
/#{order2.number}.*#{order3.number}.*#{order4.number}.*#{order5.number}/m
)
end
end
context "orders with different order numbers" do
before do
order2.update!(number: "R555555555")
order3.update!(number: "R444444444")
order4.update!(number: "R333333333")
order5.update!(number: "R222222222")
login_as_admin
visit spree.admin_orders_path
end
it "orders by order number" do
find("a", text: 'NUMBER').click # sets ascending ordering
expect(page).to have_content(
/#{order5.number}.*#{order4.number}.*#{order3.number}.*#{order2.number}/m
)
find("a", text: 'NUMBER').click # sets descending ordering
expect(page).to have_content(
/#{order2.number}.*#{order3.number}.*#{order4.number}.*#{order5.number}/m
)
end
end
context "orders with different states" do
before do
order2.update!(state: "payment")
order3.update!(state: "complete")
order4.update!(state: "cart")
order5.cancel
login_as_admin
visit spree.admin_orders_path
uncheck 'Only show complete orders'
page.find('.filter-actions .button[type=submit]').click
end
it "orders by order state" do
find("a", text: 'STATE').click # sets ascending ordering
expect(page).to have_content(
/#{order5.number}.*#{order4.number}.*#{order3.number}.*#{order2.number}/m
)
find("a", text: 'STATE').click # sets descending ordering
expect(page).to have_content(
/#{order2.number}.*#{order3.number}.*#{order4.number}.*#{order5.number}/m
)
end
end
context "orders with different payment states" do
before do
Spree::Payment.where(order_id: order2.id).first.update!(amount: 50.0)
Spree::Payment.where(order_id: order3.id).first.update!(amount: 100.0)
Spree::Payment.where(order_id: order4.id).first.update!(amount: 10.0)
login_as_admin
visit spree.admin_orders_path
end
it "orders by payment state" do
find("a", text: 'PAYMENT STATE').click # sets ascending ordering
expect(page).to have_content(/#{order4.number}.*#{order3.number}.*#{order2.number}/m)
find("a", text: 'PAYMENT STATE').click # sets descending ordering
expect(page).to have_content(/#{order2.number}.*#{order3.number}.*#{order4.number}/m)
end
end
context "orders with different shipment states" do
before do
Spree::Payment.where(order_id: order2.id).first.update!(amount: 50.0)
Spree::Payment.where(order_id: order3.id).first.update!(amount: 100.0)
Spree::Payment.where(order_id: order4.id).first.update!(amount: 10.0)
order2.ship
login_as_admin
visit spree.admin_orders_path
end
it "orders by shipment state" do
find("a", text: 'SHIPMENT STATE').click # sets ascending ordering
expect(page).to have_content(/#{order4.number}.*#{order3.number}.*#{order2.number}/m)
find("a", text: 'SHIPMENT STATE').click # sets descending ordering
expect(page).to have_content(/#{order2.number}.*#{order3.number}.*#{order4.number}/m)
end
end
context "orders from different customers" do
before do
order2.update!(email: "jkl@jkl.com")
order3.update!(email: "ghi@ghi.com")
order4.update!(email: "def@def.com")
order5.update!(email: "abc@abc.com")
login_as_admin
visit spree.admin_orders_path
end
it "orders by customer email" do
find("a", text: 'EMAIL').click # sets ascending ordering
expect(page).to have_content(
/#{order5.number}.*#{order4.number}.*#{order3.number}.*#{order2.number}/m
)
find("a", text: 'EMAIL').click # sets descending ordering
expect(page).to have_content(
/#{order2.number}.*#{order3.number}.*#{order4.number}.*#{order5.number}/m
)
end
end
context "orders with different billing addresses" do
before do
billing_address2.update!(firstname: "Mad", lastname: "Hatter")
billing_address3.update!(firstname: "Alice", lastname: "Smith")
billing_address4.update!(firstname: "Cheshire", lastname: "Cat")
billing_address5.update!(firstname: "Bob", lastname: "Smith")
login_as_admin
visit spree.admin_orders_path
end
it "orders by last name then first name" do
find("a", text: 'NAME').click # sets ascending ordering
expect(page).to have_content(
/#{order4.number}.*#{order2.number}.*#{order3.number}.*#{order5.number}/m
)
find("a", text: 'NAME').click # sets descending ordering
expect(page).to have_content(
/#{order5.number}.*#{order3.number}.*#{order2.number}.*#{order4.number}/m
)
end
end
context "displaying order special instructions" do
before do
order3.update(special_instructions: "Leave it next to the porch. Thanks!")
login_as_admin
visit spree.admin_orders_path
end
it "displays a note with order instructions" do
within "tr#order_#{order3.id}" do
expect(page).to have_content "Note"
find(".icon-warning-sign").hover
expect(page).to have_content /#{order3.special_instructions}/i
end
end
end
context "orders with different order totals" do
before do
Spree::LineItem.where(order_id: order2.id).first.update!(quantity: 5)
Spree::LineItem.where(order_id: order3.id).first.update!(quantity: 4)
Spree::LineItem.where(order_id: order4.id).first.update!(quantity: 3)
Spree::LineItem.where(order_id: order5.id).first.update!(quantity: 2)
order2.save
order3.save
order4.save
order5.save
login_as_admin
visit spree.admin_orders_path
end
it "orders by order total" do
find("a", text: 'TOTAL').click # sets ascending ordering
expect(page).to have_content(
/#{order5.number}.*#{order4.number}.*#{order3.number}.*#{order2.number}/m
)
find("a", text: 'TOTAL').click # sets descending ordering
expect(page).to have_content(
/#{order2.number}.*#{order3.number}.*#{order4.number}.*#{order5.number}/m
)
end
end
end
context "select/unselect all orders" do
before do
login_as_admin
visit spree.admin_orders_path
end
it "by clicking on the checkbox in the table header" do
# select all orders
page.find("#listing_orders thead th:first-child input[type=checkbox]").click
expect(page.find(
"#listing_orders tbody tr td:first-child input[type=checkbox]"
)).to be_checked
# enables print invoices button
page.find("span.icon-reorder", text: "ACTIONS").click
expect(page).to have_content "Print Invoices"
# unselect all orders
page.find("#listing_orders thead th:first-child input[type=checkbox]").trigger("click")
expect(page.find(
"#listing_orders tbody tr td:first-child input[type=checkbox]"
)).to_not be_checked
# disables print invoices button
page.find("span.icon-reorder", text: "ACTIONS").click
expect(page).to_not have_content "Print Invoices"
end
end
context "bulk actions" do
context "as a super admin" do
before do
login_as_admin
visit spree.admin_orders_path
end
context "can bulk send invoices per email" do
before do
Spree::Config[:enable_invoices?] = true
Spree::Config[:enterprise_number_required_on_invoices?] = false
end
context "with multiple orders with differents states" do
before do
order2.update(state: "complete")
order3.update(state: "resumed")
order4.update(state: "canceled")
order5.update(state: "payment")
end
it "can bulk send invoices per email, but only for the 'complete' or 'resumed' ones" do
within "#listing_orders" do
page.find("input[name='bulk_ids[]'][value='#{order2.id}']").click
page.find("input[name='bulk_ids[]'][value='#{order3.id}']").click
page.find("input[name='bulk_ids[]'][value='#{order4.id}']").click
page.find("input[name='bulk_ids[]'][value='#{order5.id}']").click
end
page.find("span.icon-reorder", text: "ACTIONS").click
within ".ofn-drop-down .menu" do
page.find("span", text: "Send Invoices").click
end
expect(page).to have_content "This will email customer invoices " \
"for all selected complete orders."
expect(page).to have_content "Are you sure you want to proceed?"
within ".reveal-modal" do
expect {
find_button("Confirm").click
}.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice)
end
expect(page).to have_content "Invoice emails sent for 2 orders."
end
end
it "can bulk send confirmation email from 2 orders" do
page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click
page.find("#listing_orders tbody tr:nth-child(2) input[name='bulk_ids[]']").click
page.find("span.icon-reorder", text: "ACTIONS").click
within ".ofn-drop-down .menu" do
page.find("span", text: "Resend Confirmation").click
end
expect(page).to have_content "Are you sure you want to proceed?"
within ".reveal-modal" do
expect {
find_button("Confirm").click
}.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice)
end
expect(page).to have_content "Confirmation emails sent for 2 orders."
end
end
context "can bulk print invoices" do
def extract_pdf_content
# Extract last part of invoice URL
link = page.find(class: "button", text: "VIEW FILE")
filename = link[:href].match %r{/invoices/.*}
# Load invoice temp file directly instead of downloading
reader = PDF::Reader.new("tmp/#{filename}.pdf")
reader.pages.map(&:text)
end
shared_examples "can bulk print invoices from 2 orders" do
it "bulk prints invoices in pdf format" do
page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click
page.find("#listing_orders tbody tr:nth-child(2) input[name='bulk_ids[]']").click
page.find("span.icon-reorder", text: "ACTIONS").click
within ".ofn-drop-down .menu" do
expect {
page.find("span", text: "Print Invoices").click # Prints invoices in bulk
}.to enqueue_job(BulkInvoiceJob).exactly(:once)
end
expect(page).to have_content "Compiling Invoices"
expect(page).to have_content "Please wait until the PDF is ready " \
"before closing this modal."
# we don't run Sidekiq in test environment, so we need to manually run enqueued jobs
# to generate PDF files, and change the modal accordingly
perform_enqueued_jobs(only: BulkInvoiceJob)
expect(page).to have_content "Bulk Invoice created"
within ".modal-content" do
expect(page).to have_link(class: "button", text: "VIEW FILE", href: /invoices/)
invoice_content = extract_pdf_content
expect(invoice_content).to have_content("TAX INVOICE", count: 2)
expect(invoice_content).to have_content(order4.number.to_s)
expect(invoice_content).to have_content(order5.number.to_s)
expect(invoice_content).to have_content(distributor4.name.to_s)
expect(invoice_content).to have_content(distributor5.name.to_s)
expect(invoice_content).to have_content(order_cycle4.name.to_s)
expect(invoice_content).to have_content(order_cycle5.name.to_s)
end
end
end
it_behaves_like "can bulk print invoices from 2 orders"
context "with legal invoices feature", feature: :invoices do
it_behaves_like "can bulk print invoices from 2 orders"
end
end
it "can bulk cancel 2 orders" do
page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click
page.find("#listing_orders tbody tr:nth-child(2) input[name='bulk_ids[]']").click
page.find("span.icon-reorder", text: "ACTIONS").click
within ".ofn-drop-down .menu" do
page.find("span", text: "Cancel Orders").click
end
expect(page).to have_content "Are you sure you want to proceed?"
expect(page).to have_content "This will cancel the current order."
within ".reveal-modal" do
uncheck "Send a cancellation email to the customer"
expect {
find_button("Cancel").click # Cancels the cancel action
}.to_not enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice)
end
page.find("span.icon-reorder", text: "ACTIONS").click
within ".ofn-drop-down .menu" do
page.find("span", text: "Cancel Orders").click
end
within ".reveal-modal" do
expect {
find_button("Confirm").click # Confirms the cancel action
}.to_not enqueue_job(ActionMailer::MailDeliveryJob).exactly(:twice)
end
expect(page).to have_content("CANCELLED", count: 2)
end
end
context "for a hub manager" do
before do
login_as owner2
visit spree.admin_orders_path
end
it "displays the orders for the respective distributor" do
expect(page).to have_content order5.number # displays the only order for distributor5
expect(page).not_to have_content order.number
expect(page).not_to have_content order2.number
expect(page).not_to have_content order3.number
expect(page).not_to have_content order4.number
end
it "cannot send emails to orders if permission have been revoked in the meantime" do
page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").click
# Find the clicked order
order = Spree::Order.find_by(
id: page.find("#listing_orders tbody tr:nth-child(1) input[name='bulk_ids[]']").value
)
# Revoke permission for the current user on that specific order by changing its owners
order.update_attribute(:distributor, distributor)
order.update_attribute(:order_cycle, order_cycle)
page.find("span.icon-reorder", text: "ACTIONS").click
within ".ofn-drop-down .menu" do
page.find("span", text: "Resend Confirmation").click
end
expect(page).to have_content "Are you sure you want to proceed?"
within ".reveal-modal" do
expect {
find_button("Confirm").click
}.to_not enqueue_job(ActionMailer::MailDeliveryJob)
end
end
end
end
context "pagination" do
before do
login_as_admin
visit spree.admin_orders_path
end
it "displays pagination options" do
# displaying 4 orders (one order per table row)
within('tbody') do
expect(page).to have_css('tr', count: 4)
end
# pagination options also refer 4 order
expect(page).to have_content "4 Results found. Viewing 1 to 4."
page.find(".per-page-dropdown .ts-control .item").click # toggling the pagination dropdown
expect(page).to have_content "15 per page"
expect(page).to have_content "50 per page"
expect(page).to have_content "100 per page"
end
end
context "with a capturable order" do
before do
order.finalize! # ensure order has a payment to capture
order.payments << create(:check_payment, order:, amount: order.total)
end
it "capture payment" do
login_as_admin
visit spree.admin_orders_path
expect(page).to have_current_path spree.admin_orders_path
# click the 'capture' link for the order
page.find("button.icon-capture").click
expect(page).to have_css "i.success"
expect(page).to have_css "button.icon-road"
# check the order was captured
expect(order.reload.payment_state).to eq "paid"
# we should still be on the same page
expect(page).to have_current_path spree.admin_orders_path
end
it "ship order from the orders index page and send email" do
order.payments.first.capture!
login_as_admin
visit spree.admin_orders_path
page.find("button.icon-road").click
within ".reveal-modal" do
expect {
find_button("Confirm").click
}.to enqueue_job(ActionMailer::MailDeliveryJob).exactly(:once)
end
expect(page).to have_css "i.success"
expect(order.reload.shipments.any?(&:shipped?)).to be true
expect(order.shipment_state).to eq("shipped")
end
it "ship order from the orders index page and do not send email" do
order.payments.first.capture!
login_as_admin
visit spree.admin_orders_path
page.find("button.icon-road").click
within ".reveal-modal" do
uncheck 'Send a shipment/pick up notification email to the customer.'
expect {
find_button("Confirm").click
}.not_to enqueue_job(ActionMailer::MailDeliveryJob)
end
expect(page).to have_css "i.success"
expect(order.reload.shipments.any?(&:shipped?)).to be true
expect(order.shipment_state).to eq("shipped")
end
context "mouse-hovering" do
before do
login_as_admin
visit spree.admin_orders_path
end
it "displays Ship and Capture tooltips" do
within "tr#order_#{order2.id}" do
# checks shipment state
expect(page).to have_content "READY"
# mouse-hovers and finds tooltip
find(".icon-road").hover
expect(page).to have_content "Ship"
end
within "tr#order_#{order.id}" do
# checks shipment state
expect(page).to have_content "PENDING"
# mouse-hovers and finds tooltip
find(".icon-capture").hover
expect(page).to have_content "Capture"
end
end
it "displays Ship and Edit tooltips, after capturing a payment" do
within "tr#order_#{order.id}" do
# checks the order has an uncaptured payment
find(".icon-capture").hover
expect(page).to have_content "Capture"
# captures the payment
find(".icon-capture").click
expect(page).not_to have_content "Capture"
# checks shipment state
expect(page).to have_content "READY"
# move away from the Ship button so we can trigger the mouseenter event by moving back.
# We are already on the "Ship" button when it gets rendered because of
# the previous click
find(".icon-edit").hover
# mouse-hovers and finds Ship tooltip
find(".icon-road").hover
expect(page).to have_content "Ship"
# mouse-hovers and finds Edit tooltip
find(".icon-edit").hover
expect(page).to have_content "Edit"
end
end
it "displays Edit tooltip" do
within "tr#order_#{order.id}" do
# checks shipment state
expect(page).to have_content "PENDING"
# mouse-hovers and finds tooltip
find(".icon-edit").hover
expect(page).to have_content "Edit"
end
end
end
end
end
context "with incomplete order" do
it "can edit order" do
incomplete_order = create(:order_with_line_items, distributor:,
order_cycle:,
line_items_count: 1)
login_as_admin
visit spree.admin_orders_path
uncheck 'Only show complete orders'
page.find('button[type=submit]').click
find(".icon-edit").click
expect(page).to have_current_path spree.edit_admin_order_path(incomplete_order)
end
end
context "test the 'Only show the complete orders' checkbox" do
it "display or not incomplete order" do
incomplete_order = create(:order_with_line_items, distributor:,
order_cycle:,
line_items_count: 1)
complete_order = create(
:order_with_line_items,
distributor:,
order_cycle:,
user: customer,
state: 'complete',
payment_state: 'balance_due',
completed_at: 1.day.ago,
line_items_count: 1
)
empty_complete_order = create(
:order_with_line_items,
distributor:,
order_cycle:,
user: customer,
state: 'complete',
payment_state: 'balance_due',
completed_at: 1.day.ago,
line_items_count: 0
)
empty_order = create(:order, distributor:, order_cycle:)
login_as_admin
visit spree.admin_orders_path
expect(page).to have_content complete_order.number
expect(page).to have_content empty_complete_order.number
expect(page).to have_no_content incomplete_order.number
expect(page).to have_no_content empty_order.number
uncheck 'Only show complete orders'
page.find('button[type=submit]').click
expect(page).to have_content complete_order.number
expect(page).to have_content incomplete_order.number
expect(page).to have_no_content empty_order.number
end
end
context "save the filter params" do
let!(:shipping_method) { create(:shipping_method, name: "UPS Ground") }
let!(:user) { create(:user, email: 'an@email.com') }
let!(:order) do
create(
:order,
distributor:,
order_cycle:,
user:,
number: "R123456",
state: 'complete',
payment_state: 'balance_due',
completed_at: 1.day.ago
)
end
before :each do
login_as_admin
visit spree.admin_orders_path
# Specify each filters
uncheck 'Only show complete orders'
fill_in "Order number", with: "R123456"
tomselect_multiselect order_cycle.name, from: 'q[order_cycle_id_in][]'
tomselect_multiselect distributor.name, from: 'q[distributor_id_in][]'
tomselect_select shipping_method.name, from: 'shipping_method_id'
tomselect_select "complete", from: 'q[state_eq]'
fill_in "Email", with: user.email
fill_in "First name begins with", with: "J"
fill_in "Last name begins with", with: "D"
find("input.datepicker").click
select_dates_from_daterangepicker(Time.zone.at(1.week.ago), Time.zone.now.tomorrow)
page.find('.button[type=submit]').click
end
it "when reloading the page" do
page.driver.refresh
# Check every filters to be equal
expect(find_field("Only show complete orders")).not_to be_checked
expect(find_field("Order number").value).to eq "R123456"
expect(find("#shipping_method_id-ts-control .item").text).to eq shipping_method.name
expect(find("#q_state_eq-ts-control .item").text).to eq "complete"
expect(find("#q_distributor_id_in").value).to eq [distributor.id.to_s]
expect(find("#q_order_cycle_id_in").value).to eq [order_cycle.id.to_s]
expect(find_field("Email").value).to eq user.email
expect(find_field("First name begins with").value).to eq "J"
expect(find_field("Last name begins with").value).to eq "D"
expect(find("input.datepicker").value).to eq(
"#{1.week.ago.strftime('%Y-%m-%d')} to #{Time.zone.now.tomorrow.strftime('%Y-%m-%d')}"
)
end
it "and clear filters" do
find("#clear_filters_button").click
expect(find_field("Only show complete orders")).to be_checked
expect(find_field("Order number").value).to eq ""
expect(find("#shipping_method_id").value).to be_empty
expect(find("#q_state_eq").value).to be_empty
expect(find("#q_distributor_id_in").value).to be_empty
expect(find("#q_order_cycle_id_in").value).to be_empty
expect(find_field("Email").value).to be_empty
expect(find_field("First name begins with").value).to be_empty
expect(find_field("Last name begins with").value).to be_empty
expect(find("input.datepicker").value).to be_empty
end
end
end