mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
Inspecting 1479 files
...........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................C.....C.....................................................................
Offenses:
spec/system/admin/orders_spec.rb:485:80: C: [Corrected] Layout/MultilineMethodCallBraceLayout: Closing method call brace must be on the line after the last argument when opening brace is on a separate line from the first argument.
"#listing_orders tbody tr td:first-child input[type=checkbox]")
^
spec/system/admin/orders_spec.rb:486:1: C: [Corrected] Layout/ClosingParenthesisIndentation: Indent ) to column 15 (not 0)
)).to be_checked
^
spec/system/admin/orders_spec.rb:486:15: C: [Corrected] Layout/MultilineMethodCallBraceLayout: Closing method call brace must be on the same line as the last argument when opening brace is on the same line as the first argument.
).to be_checked
^
spec/system/admin/orders_spec.rb:493:80: C: [Corrected] Layout/MultilineMethodCallBraceLayout: Closing method call brace must be on the line after the last argument when opening brace is on a separate line from the first argument.
"#listing_orders tbody tr td:first-child input[type=checkbox]")
^
spec/system/admin/orders_spec.rb:494:1: C: [Corrected] Layout/ClosingParenthesisIndentation: Indent ) to column 15 (not 0)
)).to_not be_checked
^
spec/system/admin/orders_spec.rb:494:15: C: [Corrected] Layout/MultilineMethodCallBraceLayout: Closing method call brace must be on the same line as the last argument when opening brace is on the same line as the first argument.
).to_not be_checked
^
spec/system/admin/products_spec.rb:346:54: C: [Corrected] Layout/MultilineMethodCallBraceLayout: Closing method call brace must be on the line after the last argument when opening brace is on a separate line from the first argument.
product.id, filter)))
^
spec/system/admin/products_spec.rb:347:1: C: [Corrected] Layout/ClosingParenthesisIndentation: Indent ) to column 33 (not 0)
)))
^
spec/system/admin/products_spec.rb:352:54: C: [Corrected] Layout/MultilineMethodCallBraceLayout: Closing method call brace must be on the line after the last argument when opening brace is on a separate line from the first argument.
product.id, filter)))
^
spec/system/admin/products_spec.rb:354:1: C: [Corrected] Layout/ClosingParenthesisIndentation: Indent ) to column 33 (not 0)
)))
^
1479 files inspected, 10 offenses detected, 10 offenses corrected
885 lines
34 KiB
Ruby
885 lines
34 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: owner, with_payment_and_shipping: true,
|
|
charges_sales_tax: true)
|
|
}
|
|
let(:distributor2) { create(:distributor_enterprise_with_tax, owner: owner) }
|
|
let(:distributor3) {
|
|
create(:distributor_enterprise, owner: owner, with_payment_and_shipping: true,
|
|
charges_sales_tax: true)
|
|
}
|
|
let(:distributor4) {
|
|
create(:distributor_enterprise, owner: 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: distributor,
|
|
order_cycle: 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 "Invoice 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
|
|
pending "issue #11120"
|
|
|
|
# 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
|
|
|
|
# pending issue #11120
|
|
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: Time.zone.now - 2.weeks)
|
|
order3.update!(completed_at: Time.zone.now - 3.weeks)
|
|
order4.update!(completed_at: Time.zone.now - 4.weeks)
|
|
order5.update!(completed_at: Time.zone.now - 5.weeks)
|
|
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!(lastname: "Mad Hatter")
|
|
billing_address3.update!(lastname: "Duchess")
|
|
billing_address4.update!(lastname: "Cheshire Cat")
|
|
billing_address5.update!(lastname: "Alice")
|
|
login_as_admin
|
|
visit spree.admin_orders_path
|
|
end
|
|
|
|
it "orders by last name" do
|
|
find("a", text: 'NAME').click # sets ascending ordering
|
|
expect(page).to have_content(
|
|
/#{order5.number}.*#{order4.number}.*#{order3.number}.*#{order2.number}/m
|
|
)
|
|
find("a", text: 'NAME').click # sets descending ordering
|
|
expect(page).to have_content(
|
|
/#{order2.number}.*#{order3.number}.*#{order4.number}.*#{order5.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 I18n.t('spree.admin.orders.index.note')
|
|
expect(page).to have_css "[data-tooltip-tip-value='#{order3.special_instructions}']"
|
|
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 "bulk print invoices" 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 print invoices 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
|
|
end
|
|
|
|
it "can bulk send email to 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
|
|
|
|
it "can bulk print invoices 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: "Print Invoices").click
|
|
end
|
|
|
|
expect(page).to have_content "Compiling Invoices"
|
|
expect(page).to have_content "Please wait until the PDF is ready " \
|
|
"before closing this modal."
|
|
# an error 422 is generated in the console
|
|
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: 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" do
|
|
order.payments.first.capture!
|
|
login_as_admin
|
|
visit spree.admin_orders_path
|
|
|
|
page.find("button.icon-road").click
|
|
|
|
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 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: distributor,
|
|
order_cycle: 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: distributor,
|
|
order_cycle: order_cycle,
|
|
line_items_count: 1)
|
|
complete_order = create(
|
|
:order_with_line_items,
|
|
distributor: distributor,
|
|
order_cycle: 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: distributor,
|
|
order_cycle: order_cycle,
|
|
user: customer,
|
|
state: 'complete',
|
|
payment_state: 'balance_due',
|
|
completed_at: 1.day.ago,
|
|
line_items_count: 0
|
|
)
|
|
|
|
empty_order = create(:order, distributor: distributor, order_cycle: 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: distributor,
|
|
order_cycle: order_cycle,
|
|
user: 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 "Invoice number", with: "R123456"
|
|
tomselect_multiselect order_cycle.name, from: 'q[order_cycle_id_in][]'
|
|
tomselect_multiselect distributor.name, from: 'q[distributor_id_in][]'
|
|
tomselect_search_and_select shipping_method.name, from: 'shipping_method_id'
|
|
tomselect_search_and_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("Invoice 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("Invoice 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
|