Files
openfoodnetwork/spec/features/admin/order_cycles_spec.rb
François Turbelin 82fbcd35a8 Update tests
2019-02-26 22:07:11 +01:00

1163 lines
57 KiB
Ruby

require 'spec_helper'
feature %q{
As an administrator
I want to manage order cycles
}, js: true do
include AdminHelper
include AuthenticationWorkflow
include WebHelper
scenario "listing and filtering order cycles" do
# Given some order cycles (created in an arbitrary order)
oc4 = create(:simple_order_cycle, name: 'oc4',
orders_open_at: 2.day.from_now, orders_close_at: 1.month.from_now)
oc2 = create(:simple_order_cycle, name: 'oc2', orders_close_at: 1.month.from_now)
oc6 = create(:simple_order_cycle, name: 'oc6',
orders_open_at: 1.month.ago, orders_close_at: 3.weeks.ago)
oc3 = create(:simple_order_cycle, name: 'oc3',
orders_open_at: 1.day.from_now, orders_close_at: 1.month.from_now)
oc5 = create(:simple_order_cycle, name: 'oc5',
orders_open_at: 1.month.ago, orders_close_at: 2.weeks.ago)
oc1 = create(:order_cycle, name: 'oc1')
oc0 = create(:simple_order_cycle, name: 'oc0',
orders_open_at: nil, orders_close_at: nil)
oc7 = create(:simple_order_cycle, name: 'oc7',
orders_open_at: 2.months.ago, orders_close_at: 5.weeks.ago)
schedule1 = create(:schedule, name: 'Schedule1', order_cycles: [oc1, oc3])
create(:proxy_order, subscription: create(:subscription, schedule: schedule1), order_cycle: oc1)
# When I go to the admin order cycles page
login_to_admin_section
click_link 'Order Cycles'
# Then the order cycles should be ordered correctly
expect(page).to have_selector "#listing_order_cycles tr td:first-child", count: 7
order_cycle_names = ["oc0", "oc1", "oc2", "oc3", "oc4", "oc5", "oc6"]
expect(all("#listing_order_cycles tr td:first-child input").map(&:value)).to eq order_cycle_names
# And the rows should have the correct classes
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}.undated"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}.open"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}.open"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}.upcoming"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc4.id}.upcoming"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc5.id}.closed"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc6.id}.closed"
toggle_columns "Producers", "Shops"
# And I should see all the details for an order cycle
within('table#listing_order_cycles tbody tr:nth-child(2)') do
# Then I should see the basic fields
expect(page).to have_input "oc#{oc1.id}[name]", value: oc1.name
expect(page).to have_input "oc#{oc1.id}[orders_open_at]", value: oc1.orders_open_at
expect(page).to have_input "oc#{oc1.id}[orders_close_at]", value: oc1.orders_close_at
expect(page).to have_content oc1.coordinator.name
# And I should see the suppliers and distributors
oc1.suppliers.each { |s| page.should have_content s.name }
oc1.distributors.each { |d| page.should have_content d.name }
# And I should see the number of variants
page.should have_selector 'td.products', text: '2 variants'
end
# I can load more order_cycles
page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc7.id}"
click_button "Show 30 more days"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc7.id}"
# I can filter order cycle by involved enterprises
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
select2_select oc1.suppliers.first.name, from: "involving_filter"
page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
select2_select "Any Enterprise", from: "involving_filter"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
# I can filter order cycles by name
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
fill_in "query", with: oc0.name
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
fill_in "query", with: ''
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
# I can filter order cycle by schedule
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}"
select2_select schedule1.name, from: "schedule_filter"
page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}"
select2_select 'Any Schedule', from: "schedule_filter"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}"
page.should have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}"
# Attempting to edit dates of an open order cycle with active subscriptions
find("#oc#{oc1.id}_orders_open_at").click
expect(page).to have_selector "#confirm-dialog .message", text: I18n.t('admin.order_cycles.date_warning.msg', n: 1)
end
describe 'listing order cycles with other locales' do
let!(:oc_de) { create(:simple_order_cycle, name: 'oc', orders_open_at: '2012-01-01 00:00') }
around(:each) do |spec|
I18n.locale = :de
spec.run
I18n.locale = :en
end
context 'using datepickers' do
it "correctly opens the datepicker and changes the date field" do
quick_login_as_admin
visit admin_order_cycles_path
within("tr.order-cycle-#{oc_de.id}") do
expect(find('input.datetimepicker', match: :first).value).to start_with '2012-01-01 00:00'
find('img.ui-datepicker-trigger', match: :first).click
end
within("#ui-datepicker-div") do
expect(page).to have_selector 'a.ui-state-active', text: '1'
click_link '30'
find('button.ui-datepicker-close', match: :first).click
end
within("tr.order-cycle-#{oc_de.id}") do
expect(find('input.datetimepicker', match: :first).value).to eq '2012-01-30 00:00'
end
end
end
end
context "with specific time" do
let(:order_cycle_opening_time) { Time.zone.local(2040, 11, 06, 06, 00, 00).strftime("%F %T %z") }
let(:order_cycle_closing_time) { Time.zone.local(2040, 11, 13, 17, 00, 00).strftime("%F %T %z") }
scenario "creating an order cycle", js: true do
# Given coordinating, supplying and distributing enterprises with some products with variants
coordinator = create(:distributor_enterprise, name: 'My coordinator')
supplier = create(:supplier_enterprise, name: 'My supplier')
product = create(:product, supplier: supplier)
v1 = create(:variant, product: product)
v2 = create(:variant, product: product)
distributor = create(:distributor_enterprise, name: 'My distributor', with_payment_and_shipping: true)
# Relationships required for interface to work
create(:enterprise_relationship, parent: supplier, child: coordinator, permissions_list: [:add_to_order_cycle])
create(:enterprise_relationship, parent: distributor, child: coordinator, permissions_list: [:add_to_order_cycle])
create(:enterprise_relationship, parent: supplier, child: distributor, permissions_list: [:add_to_order_cycle])
# And some enterprise fees
supplier_fee = create(:enterprise_fee, enterprise: supplier, name: 'Supplier fee')
coordinator_fee = create(:enterprise_fee, enterprise: coordinator, name: 'Coord fee')
distributor_fee = create(:enterprise_fee, enterprise: distributor, name: 'Distributor fee')
# When I go to the new order cycle page
quick_login_as_admin
visit admin_order_cycles_path
click_link 'New Order Cycle'
# Select a coordinator since there are two available
select2_select 'My coordinator', from: 'coordinator_id'
click_button "Continue >"
# And I fill in the basic fields
fill_in 'order_cycle_name', with: 'Plums & Avos'
fill_in 'order_cycle_orders_open_at', with: order_cycle_opening_time
fill_in 'order_cycle_orders_close_at', with: order_cycle_closing_time
# And I add a coordinator fee
click_button 'Add coordinator fee'
select 'Coord fee', from: 'order_cycle_coordinator_fee_0_id'
# I should not be able to add a blank supplier
page.should have_select 'new_supplier_id', selected: ''
page.should have_button 'Add supplier', disabled: true
# And I add a supplier and some products
select 'My supplier', from: 'new_supplier_id'
click_button 'Add supplier'
fill_in 'order_cycle_incoming_exchange_0_receival_instructions', with: 'receival instructions'
page.find('table.exchanges tr.supplier td.products').click
check "order_cycle_incoming_exchange_0_variants_#{v1.id}"
check "order_cycle_incoming_exchange_0_variants_#{v2.id}"
# I should not be able to re-add the supplier
page.should_not have_select 'new_supplier_id', with_options: ['My supplier']
page.should have_button 'Add supplier', disabled: true
page.all("td.supplier_name").map(&:text).should == ['My supplier']
# And I add a supplier fee
within("tr.supplier-#{supplier.id}") { click_button 'Add fee' }
select 'My supplier', from: 'order_cycle_incoming_exchange_0_enterprise_fees_0_enterprise_id'
select 'Supplier fee', from: 'order_cycle_incoming_exchange_0_enterprise_fees_0_enterprise_fee_id'
# And I add a distributor with the same products
select 'My distributor', from: 'new_distributor_id'
click_button 'Add distributor'
fill_in 'order_cycle_outgoing_exchange_0_pickup_time', with: 'pickup time'
fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'pickup instructions'
page.find('table.exchanges tr.distributor td.products').click
check "order_cycle_outgoing_exchange_0_variants_#{v1.id}"
check "order_cycle_outgoing_exchange_0_variants_#{v2.id}"
page.find('table.exchanges tr.distributor td.tags').click
within ".exchange-tags" do
find(:css, "tags-input .tags input").set "wholesale\n"
end
# And I add a distributor fee
within("tr.distributor-#{distributor.id}") { click_button 'Add fee' }
select 'My distributor', from: 'order_cycle_outgoing_exchange_0_enterprise_fees_0_enterprise_id'
select 'Distributor fee', from: 'order_cycle_outgoing_exchange_0_enterprise_fees_0_enterprise_fee_id'
# And I click Create
click_button 'Create'
# Then my order cycle should have been created
page.should have_content 'Your order cycle has been created.'
oc = OrderCycle.last
toggle_columns "Producers", "Shops"
expect(page).to have_input "oc#{oc.id}[name]", value: "Plums & Avos"
expect(page).to have_input "oc#{oc.id}[orders_open_at]", value: order_cycle_opening_time
expect(page).to have_input "oc#{oc.id}[orders_close_at]", value: order_cycle_closing_time
expect(page).to have_content "My coordinator"
page.should have_selector 'td.producers', text: 'My supplier'
page.should have_selector 'td.shops', text: 'My distributor'
# And it should have some fees
oc.exchanges.incoming.first.enterprise_fees.should == [supplier_fee]
oc.coordinator_fees.should == [coordinator_fee]
oc.exchanges.outgoing.first.enterprise_fees.should == [distributor_fee]
# And it should have some variants selected
oc.exchanges.first.variants.count.should == 2
oc.exchanges.last.variants.count.should == 2
# And my receival and pickup time and instructions should have been saved
exchange = oc.exchanges.incoming.first
exchange.receival_instructions.should == 'receival instructions'
exchange = oc.exchanges.outgoing.first
exchange.pickup_time.should == 'pickup time'
exchange.pickup_instructions.should == 'pickup instructions'
exchange.tag_list.should == ['wholesale']
end
scenario "updating an order cycle", js: true do
# Given an order cycle with all the settings
oc = create(:order_cycle)
initial_variants = oc.variants.sort_by(&:id)
# And a coordinating, supplying and distributing enterprise with some products with variants
coordinator = oc.coordinator
supplier = create(:supplier_enterprise, name: 'My supplier')
distributor = create(:distributor_enterprise, name: 'My distributor', with_payment_and_shipping: true)
product = create(:product, supplier: supplier)
v1 = create(:variant, product: product)
v2 = create(:variant, product: product)
# Relationships required for interface to work
create(:enterprise_relationship, parent: supplier, child: coordinator, permissions_list: [:add_to_order_cycle])
create(:enterprise_relationship, parent: distributor, child: coordinator, permissions_list: [:add_to_order_cycle])
create(:enterprise_relationship, parent: supplier, child: distributor, permissions_list: [:add_to_order_cycle])
# And some enterprise fees
supplier_fee1 = create(:enterprise_fee, enterprise: supplier, name: 'Supplier fee 1')
supplier_fee2 = create(:enterprise_fee, enterprise: supplier, name: 'Supplier fee 2')
coordinator_fee1 = create(:enterprise_fee, enterprise: coordinator, name: 'Coord fee 1')
coordinator_fee2 = create(:enterprise_fee, enterprise: coordinator, name: 'Coord fee 2')
distributor_fee1 = create(:enterprise_fee, enterprise: distributor, name: 'Distributor fee 1')
distributor_fee2 = create(:enterprise_fee, enterprise: distributor, name: 'Distributor fee 2')
# When I go to its edit page
quick_login_as_admin
visit admin_order_cycles_path
within "tr.order-cycle-#{oc.id}" do
find("a.edit-order-cycle").click
end
wait_for_edit_form_to_load_order_cycle(oc)
# And I update it
fill_in 'order_cycle_name', with: 'Plums & Avos'
fill_in 'order_cycle_orders_open_at', with: order_cycle_opening_time
fill_in 'order_cycle_orders_close_at', with: order_cycle_closing_time
# CAN'T CHANGE COORDINATOR ANYMORE
# select 'My coordinator', from: 'order_cycle_coordinator_id'
# And I configure some coordinator fees
click_button 'Add coordinator fee'
select 'Coord fee 1', from: 'order_cycle_coordinator_fee_0_id'
click_button 'Add coordinator fee'
click_button 'Add coordinator fee'
click_link 'order_cycle_coordinator_fee_2_remove'
select 'Coord fee 2', from: 'order_cycle_coordinator_fee_1_id'
# And I add a supplier and some products
select 'My supplier', from: 'new_supplier_id'
click_button 'Add supplier'
page.all("table.exchanges tr.supplier td.products").each { |e| e.click }
page.should have_selector "#order_cycle_incoming_exchange_1_variants_#{initial_variants.last.id}", visible: true
page.find("#order_cycle_incoming_exchange_1_variants_#{initial_variants.last.id}", visible: true).click # uncheck (with visible:true filter)
check "order_cycle_incoming_exchange_2_variants_#{v1.id}"
check "order_cycle_incoming_exchange_2_variants_#{v2.id}"
# And I configure some supplier fees
within("tr.supplier-#{supplier.id}") { click_button 'Add fee' }
select 'My supplier', from: 'order_cycle_incoming_exchange_2_enterprise_fees_0_enterprise_id'
select 'Supplier fee 1', from: 'order_cycle_incoming_exchange_2_enterprise_fees_0_enterprise_fee_id'
within("tr.supplier-#{supplier.id}") { click_button 'Add fee' }
within("tr.supplier-#{supplier.id}") { click_button 'Add fee' }
click_link 'order_cycle_incoming_exchange_2_enterprise_fees_0_remove'
select 'My supplier', from: 'order_cycle_incoming_exchange_2_enterprise_fees_0_enterprise_id'
select 'Supplier fee 2', from: 'order_cycle_incoming_exchange_2_enterprise_fees_0_enterprise_fee_id'
# And I add a distributor and some products
select 'My distributor', from: 'new_distributor_id'
click_button 'Add distributor'
fill_in 'order_cycle_outgoing_exchange_0_pickup_time', with: 'New time 0'
fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'New instructions 0'
fill_in 'order_cycle_outgoing_exchange_1_pickup_time', with: 'New time 1'
fill_in 'order_cycle_outgoing_exchange_1_pickup_instructions', with: 'New instructions 1'
fill_in 'order_cycle_outgoing_exchange_2_pickup_time', with: 'New time 2'
fill_in 'order_cycle_outgoing_exchange_2_pickup_instructions', with: 'New instructions 2'
page.find("table.exchanges tr.distributor-#{distributor.id} td.tags").click
within ".exchange-tags" do
find(:css, "tags-input .tags input").set "wholesale\n"
end
page.all("table.exchanges tr.distributor td.products").each { |e| e.click }
uncheck "order_cycle_outgoing_exchange_2_variants_#{v1.id}"
check "order_cycle_outgoing_exchange_2_variants_#{v2.id}"
# And I configure some distributor fees
within("tr.distributor-#{distributor.id}") { click_button 'Add fee' }
select 'My distributor', from: 'order_cycle_outgoing_exchange_2_enterprise_fees_0_enterprise_id'
select 'Distributor fee 1', from: 'order_cycle_outgoing_exchange_2_enterprise_fees_0_enterprise_fee_id'
within("tr.distributor-#{distributor.id}") { click_button 'Add fee' }
within("tr.distributor-#{distributor.id}") { click_button 'Add fee' }
click_link 'order_cycle_outgoing_exchange_2_enterprise_fees_0_remove'
select 'My distributor', from: 'order_cycle_outgoing_exchange_2_enterprise_fees_0_enterprise_id'
select 'Distributor fee 2', from: 'order_cycle_outgoing_exchange_2_enterprise_fees_0_enterprise_fee_id'
# And I click Update
expect(page).to have_selector "#save-bar"
click_button 'Update and Close'
# Then my order cycle should have been updated
page.should have_content 'Your order cycle has been updated.'
oc = OrderCycle.last
toggle_columns "Producers", "Shops"
expect(page).to have_input "oc#{oc.id}[name]", value: "Plums & Avos"
expect(page).to have_input "oc#{oc.id}[orders_open_at]", value: order_cycle_opening_time
expect(page).to have_input "oc#{oc.id}[orders_close_at]", value: order_cycle_closing_time
expect(page).to have_content coordinator.name
page.should have_selector 'td.producers', text: 'My supplier'
page.should have_selector 'td.shops', text: 'My distributor'
# And my coordinator fees should have been configured
oc.coordinator_fee_ids.should match_array [coordinator_fee1.id, coordinator_fee2.id]
# And my supplier fees should have been configured
oc.exchanges.incoming.last.enterprise_fee_ids.should == [supplier_fee2.id]
# And my distributor fees should have been configured
oc.exchanges.outgoing.last.enterprise_fee_ids.should == [distributor_fee2.id]
# And my tags should have been save
oc.exchanges.outgoing.last.tag_list.should == ['wholesale']
# And it should have some variants selected
selected_initial_variants = initial_variants.take initial_variants.size - 1
oc.variants.map(&:id).should match_array((selected_initial_variants.map(&:id) + [v1.id, v2.id]))
# And the collection details should have been updated
oc.exchanges.where(pickup_time: 'New time 0', pickup_instructions: 'New instructions 0').should be_present
oc.exchanges.where(pickup_time: 'New time 1', pickup_instructions: 'New instructions 1').should be_present
end
end
scenario "editing an order cycle" do
# Given an order cycle with all the settings
oc = create(:order_cycle)
oc.suppliers.first.update_attribute :name, 'AAA'
oc.suppliers.last.update_attribute :name, 'ZZZ'
oc.distributors.first.update_attribute :name, 'AAAA'
oc.distributors.last.update_attribute :name, 'ZZZZ'
# When I edit it
quick_login_as_admin
visit edit_admin_order_cycle_path(oc)
wait_for_edit_form_to_load_order_cycle(oc)
# Then I should see the basic settings
page.find('#order_cycle_name').value.should == oc.name
page.find('#order_cycle_orders_open_at').value.should == oc.orders_open_at.to_s
page.find('#order_cycle_orders_close_at').value.should == oc.orders_close_at.to_s
page.should have_content "COORDINATOR #{oc.coordinator.name}"
# And I should see the suppliers
page.should have_selector 'td.supplier_name', :text => oc.suppliers.first.name
page.should have_selector 'td.supplier_name', :text => oc.suppliers.last.name
page.should have_field 'order_cycle_incoming_exchange_0_receival_instructions', with: 'instructions 0'
page.should have_field 'order_cycle_incoming_exchange_1_receival_instructions', with: 'instructions 1'
# And the suppliers should have products
page.all('table.exchanges tbody tr.supplier').each_with_index do |row, i|
row.find('td.products').click
products_panel = page.all('table.exchanges tr.panel-row .exchange-supplied-products').select { |r| r.visible? }.first
products_panel.should have_selector "input[name='order_cycle_incoming_exchange_#{i}_select_all_variants']"
row.find('td.products').click
end
# And the suppliers should have fees
supplier = oc.suppliers.sort_by(&:name).first
page.should have_select 'order_cycle_incoming_exchange_0_enterprise_fees_0_enterprise_id', selected: supplier.name
page.should have_select 'order_cycle_incoming_exchange_0_enterprise_fees_0_enterprise_fee_id', selected: supplier.enterprise_fees.first.name
supplier = oc.suppliers.sort_by(&:name).last
page.should have_select 'order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_id', selected: supplier.name
page.should have_select 'order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_fee_id', selected: supplier.enterprise_fees.first.name
# And I should see the distributors
page.should have_selector 'td.distributor_name', :text => oc.distributors.first.name
page.should have_selector 'td.distributor_name', :text => oc.distributors.last.name
page.should have_field 'order_cycle_outgoing_exchange_0_pickup_time', with: 'time 0'
page.should have_field 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'instructions 0'
page.should have_field 'order_cycle_outgoing_exchange_1_pickup_time', with: 'time 1'
page.should have_field 'order_cycle_outgoing_exchange_1_pickup_instructions', with: 'instructions 1'
# And the distributors should have products
page.all('table.exchanges tbody tr.distributor').each_with_index do |row, i|
row.find('td.products').click
products_panel = page.all('table.exchanges tr.panel-row .exchange-distributed-products').select { |r| r.visible? }.first
products_panel.should have_selector "input[name='order_cycle_outgoing_exchange_#{i}_select_all_variants']"
row.find('td.products').click
end
# And the distributors should have fees
distributor = oc.distributors.sort_by(&:id).first
page.should have_select 'order_cycle_outgoing_exchange_0_enterprise_fees_0_enterprise_id', selected: distributor.name
page.should have_select 'order_cycle_outgoing_exchange_0_enterprise_fees_0_enterprise_fee_id', selected: distributor.enterprise_fees.first.name
distributor = oc.distributors.sort_by(&:id).last
page.should have_select 'order_cycle_outgoing_exchange_1_enterprise_fees_0_enterprise_id', selected: distributor.name
page.should have_select 'order_cycle_outgoing_exchange_1_enterprise_fees_0_enterprise_fee_id', selected: distributor.enterprise_fees.first.name
end
scenario "editing an order cycle with an exchange between the same enterprise" do
c = create(:distributor_enterprise, is_primary_producer: true)
# Given two order cycles, one with a mono-enterprise incoming exchange...
oc_incoming = create(:simple_order_cycle, suppliers: [c], coordinator: c)
# And the other with a mono-enterprise outgoing exchange
oc_outgoing = create(:simple_order_cycle, coordinator: c, distributors: [c])
# When I edit the first order cycle, the exchange should appear as incoming
quick_login_as_admin
visit edit_admin_order_cycle_path(oc_incoming)
page.should have_selector 'table.exchanges tr.supplier'
page.should_not have_selector 'table.exchanges tr.distributor'
# And when I edit the second order cycle, the exchange should appear as outgoing
visit edit_admin_order_cycle_path(oc_outgoing)
page.should have_selector 'table.exchanges tr.distributor'
page.should_not have_selector 'table.exchanges tr.supplier'
end
scenario "updating many order cycle opening/closing times at once", js: true do
# Given three order cycles
oc1 = create(:simple_order_cycle)
oc2 = create(:simple_order_cycle)
oc3 = create(:simple_order_cycle,
orders_open_at: Time.zone.local(2040, 12, 12, 12, 12, 12),
orders_close_at: Time.zone.local(2041, 12, 12, 12, 12, 12)
)
# When I go to the order cycles page
quick_login_as_admin
visit admin_order_cycles_path
# And I fill in some new opening/closing times and save them
within("tr.order-cycle-#{oc1.id}") do
find("input#oc#{oc1.id}_name").set "Updated Order Cycle 1"
find("input#oc#{oc1.id}_orders_open_at").set "2040-12-01 12:00:00"
find("input#oc#{oc1.id}_orders_close_at").set "2040-12-01 12:00:01"
end
within("tr.order-cycle-#{oc2.id}") do
find("input#oc#{oc2.id}_name").set "Updated Order Cycle 2"
find("input#oc#{oc2.id}_orders_open_at").set "2040-12-01 12:00:02"
find("input#oc#{oc2.id}_orders_close_at").set "2040-12-01 12:00:03"
end
# And I fill in a time using the datepicker
within("tr.order-cycle-#{oc3.id}") do
# When I trigger the datepicker
find('img.ui-datepicker-trigger', match: :first).click
end
within("#ui-datepicker-div") do
# Then it should display the correct date/time
expect(page).to have_selector 'span.ui-datepicker-month', text: 'DECEMBER'
expect(page).to have_selector 'span.ui-datepicker-year', text: '2040'
expect(page).to have_selector 'a.ui-state-active', text: '12'
# When I fill in a new date/time
click_link '1'
click_button 'Done'
end
within("tr.order-cycle-#{oc3.id}") do
# Then that date/time should appear on the form
expect(find("input#oc#{oc3.id}_orders_open_at").value).to eq "2040-12-01 00:00"
# Manually fill out time
find("input#oc#{oc3.id}_name").set "Updated Order Cycle 3"
find("input#oc#{oc3.id}_orders_open_at").set "2040-12-01 12:00:04"
find("input#oc#{oc3.id}_orders_close_at").set "2040-12-01 12:00:05"
end
click_button 'Save Changes'
# Then my details should have been saved
expect(page).to have_selector "#save-bar", text: "Order cycles have been updated."
order_cycles = OrderCycle.order("id ASC")
expect(order_cycles.map(&:name)).to eq ["Updated Order Cycle 1", "Updated Order Cycle 2", "Updated Order Cycle 3"]
expect(order_cycles.map { |oc| oc.orders_open_at.sec }).to eq [0, 2, 4]
expect(order_cycles.map { |oc| oc.orders_close_at.sec }).to eq [1, 3, 5]
end
scenario "cloning an order cycle" do
# Given an order cycle
oc = create(:simple_order_cycle)
# When I clone it
quick_login_as_admin
visit admin_order_cycles_path
within "tr.order-cycle-#{oc.id}" do
find('a.clone-order-cycle').click
end
expect(flash_message).to eq "Your order cycle #{oc.name} has been cloned."
# Then I should have clone of the order cycle
occ = OrderCycle.last
expect(occ.name).to eq "COPY OF #{oc.name}"
end
scenario "removing a master variant from an order cycle when further variants have been added" do
# Given a product with a variant, with its master variant included in the order cycle
# (this usually happens when a product is added to an order cycle, then variants are added
# to the product after the fact)
s = create(:supplier_enterprise)
p = create(:simple_product, supplier: s)
v = create(:variant, product: p)
d = create(:distributor_enterprise)
oc = create(:simple_order_cycle, suppliers: [s], distributors: [d], variants: [p.master])
exchange_ids = oc.exchanges.pluck :id
ExchangeVariant.where(exchange_id: exchange_ids, variant_id: p.master.id).should_not be_empty
# When I go to the order cycle page and remove the obsolete master
quick_login_as_admin
visit edit_admin_order_cycle_path(oc)
within("table.exchanges tbody tr.supplier") { page.find('td.products').click }
page.find("#order_cycle_incoming_exchange_0_variants_#{p.master.id}").click # uncheck
click_button "Update"
# Then the master variant should have been removed from all exchanges
page.should have_content "Your order cycle has been updated."
ExchangeVariant.where(exchange_id: exchange_ids, variant_id: p.master.id).should be_empty
end
describe "ensuring that hubs in order cycles have valid shipping and payment methods" do
context "when they don't" do
let(:hub) { create(:distributor_enterprise) }
let!(:oc) { create(:simple_order_cycle, distributors: [hub]) }
it "displays a warning on the dashboard" do
login_to_admin_section
page.should have_content "The hub #{hub.name} is listed in an active order cycle, but does not have valid shipping and payment methods. Until you set these up, customers will not be able to shop at this hub."
end
it "displays a warning on the order cycles screen" do
quick_login_as_admin
visit admin_order_cycles_path
page.should have_content "The hub #{hub.name} is listed in an active order cycle, but does not have valid shipping and payment methods. Until you set these up, customers will not be able to shop at this hub."
end
end
context "when they do" do
let(:hub) { create(:distributor_enterprise, with_payment_and_shipping: true) }
let!(:oc) { create(:simple_order_cycle, distributors: [hub]) }
it "does not display the warning on the dashboard" do
login_to_admin_section
page.should_not have_content "does not have valid shipping and payment methods"
end
end
end
context "as an enterprise user" do
let!(:supplier_managed) { create(:supplier_enterprise, name: 'Managed supplier') }
let!(:supplier_unmanaged) { create(:supplier_enterprise, name: 'Unmanaged supplier') }
let!(:supplier_permitted) { create(:supplier_enterprise, name: 'Permitted supplier') }
let!(:distributor_managed) { create(:distributor_enterprise, name: 'Managed distributor') }
let!(:distributor_unmanaged) { create(:distributor_enterprise, name: 'Unmanaged Distributor') }
let!(:distributor_permitted) { create(:distributor_enterprise, name: 'Permitted distributor') }
let!(:distributor_managed_fee) { create(:enterprise_fee, enterprise: distributor_managed, name: 'Managed distributor fee') }
let!(:shipping_method) { create(:shipping_method, distributors: [distributor_managed, distributor_unmanaged, distributor_permitted]) }
let!(:payment_method) { create(:payment_method, distributors: [distributor_managed, distributor_unmanaged, distributor_permitted]) }
let!(:product_managed) { create(:product, supplier: supplier_managed) }
let!(:variant_managed) { product_managed.variants.first }
let!(:product_permitted) { create(:product, supplier: supplier_permitted) }
let!(:variant_permitted) { product_permitted.variants.first }
let!(:schedule) { create(:schedule, name: 'Schedule1', order_cycles: [create(:simple_order_cycle, coordinator: distributor_managed)]) }
before do
# Relationships required for interface to work
# Both suppliers allow both managed distributor to distribute their products (and add them to the order cycle)
create(:enterprise_relationship, parent: supplier_managed, child: distributor_managed, permissions_list: [:add_to_order_cycle])
create(:enterprise_relationship, parent: supplier_permitted, child: distributor_managed, permissions_list: [:add_to_order_cycle])
# Both suppliers allow permitted distributor to distribute their products
create(:enterprise_relationship, parent: supplier_managed, child: distributor_permitted, permissions_list: [:add_to_order_cycle])
create(:enterprise_relationship, parent: supplier_permitted, child: distributor_permitted, permissions_list: [:add_to_order_cycle])
# Permitted distributor can be added to the order cycle
create(:enterprise_relationship, parent: distributor_permitted, child: distributor_managed, permissions_list: [:add_to_order_cycle])
end
context "that is a manager of the coordinator" do
before do
@new_user = create_enterprise_user
@new_user.enterprise_roles.build(enterprise: supplier_managed).save
@new_user.enterprise_roles.build(enterprise: distributor_managed).save
quick_login_as @new_user
end
scenario "viewing a list of order cycles I am coordinating" do
oc_user_coordinating = create(:simple_order_cycle, { suppliers: [supplier_managed, supplier_unmanaged], coordinator: distributor_managed, distributors: [distributor_managed, distributor_unmanaged], name: 'Order Cycle 1' } )
oc_for_other_user = create(:simple_order_cycle, { coordinator: supplier_unmanaged, name: 'Order Cycle 2' } )
visit spree.admin_path
click_link "Order Cycles"
# I should see only the order cycle I am coordinating
expect(page).to have_selector "tr.order-cycle-#{oc_user_coordinating.id}"
expect(page).to_not have_selector "tr.order-cycle-#{oc_for_other_user.id}"
toggle_columns "Producers", "Shops"
# The order cycle should show all enterprises in the order cycle
page.should have_selector 'td.producers', text: supplier_managed.name
page.should have_selector 'td.shops', text: distributor_managed.name
page.should have_selector 'td.producers', text: supplier_unmanaged.name
page.should have_selector 'td.shops', text: distributor_unmanaged.name
end
scenario "creating a new order cycle" do
distributor_managed.update_attribute(:enable_subscriptions, true)
visit admin_order_cycles_path
click_link 'New Order Cycle'
fill_in 'order_cycle_name', with: 'My order cycle'
fill_in 'order_cycle_orders_open_at', with: '2040-11-06 06:00:00'
fill_in 'order_cycle_orders_close_at', with: '2040-11-13 17:00:00'
multi_select2_select schedule.name, from: 'schedule_ids'
select 'Managed supplier', from: 'new_supplier_id'
click_button 'Add supplier'
select 'Permitted supplier', from: 'new_supplier_id'
click_button 'Add supplier'
select_incoming_variant supplier_managed, 0, variant_managed
select_incoming_variant supplier_permitted, 1, variant_permitted
click_button 'Add coordinator fee'
select 'Managed distributor fee', from: 'order_cycle_coordinator_fee_0_id'
select 'Managed distributor', from: 'new_distributor_id'
click_button 'Add distributor'
select 'Permitted distributor', from: 'new_distributor_id'
click_button 'Add distributor'
fill_in 'order_cycle_outgoing_exchange_0_pickup_time', with: 'pickup time'
fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'pickup instructions'
fill_in 'order_cycle_outgoing_exchange_1_pickup_time', with: 'pickup time 2'
fill_in 'order_cycle_outgoing_exchange_1_pickup_instructions', with: 'pickup instructions'
# Should only have suppliers / distributors listed which the user is managing or
# has E2E permission to add products to order cycles
page.should_not have_select 'new_supplier_id', with_options: [supplier_unmanaged.name]
page.should_not have_select 'new_distributor_id', with_options: [distributor_unmanaged.name]
[distributor_unmanaged.name, supplier_managed.name, supplier_unmanaged.name].each do |enterprise_name|
page.should_not have_select 'order_cycle_coordinator_id', with_options: [enterprise_name]
end
page.find("table.exchanges tr.distributor-#{distributor_managed.id} td.tags").click
within ".exchange-tags" do
find(:css, "tags-input .tags input").set "wholesale\n"
end
click_button 'Create'
flash_message.should == "Your order cycle has been created."
order_cycle = OrderCycle.find_by_name('My order cycle')
order_cycle.suppliers.should match_array [supplier_managed, supplier_permitted]
order_cycle.coordinator.should == distributor_managed
order_cycle.distributors.should match_array [distributor_managed, distributor_permitted]
order_cycle.schedules.should == [schedule]
exchange = order_cycle.exchanges.outgoing.to_enterprise(distributor_managed).first
exchange.tag_list.should == ["wholesale"]
end
scenario "editing an order cycle we can see (and for now, edit) all exchanges in the order cycle" do
# TODO: when we add the editable scope to variant permissions, we should test that
# exchanges with enterprises who have not granted P-OC to the coordinator are not
# editable, but at this point we cannot distiguish between visible and editable
# variants.
oc = create(:simple_order_cycle, { suppliers: [supplier_managed, supplier_permitted, supplier_unmanaged], coordinator: distributor_managed, distributors: [distributor_managed, distributor_permitted, distributor_unmanaged], name: 'Order Cycle 1' } )
visit edit_admin_order_cycle_path(oc)
fill_in 'order_cycle_name', with: 'Coordinated'
# I should be able to see but not edit exchanges for supplier_unmanaged or distributor_unmanaged
expect(page).to have_selector "tr.supplier-#{supplier_managed.id}"
expect(page).to have_selector "tr.supplier-#{supplier_permitted.id}"
expect(page).to have_selector "tr.supplier-#{supplier_unmanaged.id}"
expect(page).to have_selector 'tr.supplier', count: 3
expect(page).to have_selector "tr.distributor-#{distributor_managed.id}"
expect(page).to have_selector "tr.distributor-#{distributor_permitted.id}"
expect(page).to have_selector "tr.distributor-#{distributor_unmanaged.id}"
expect(page).to have_selector 'tr.distributor', count: 3
# When I save, then those exchanges should remain
click_button 'Update'
page.should have_content "Your order cycle has been updated."
oc.reload
oc.suppliers.should match_array [supplier_managed, supplier_permitted, supplier_unmanaged]
oc.coordinator.should == distributor_managed
oc.distributors.should match_array [distributor_managed, distributor_permitted, distributor_unmanaged]
end
scenario "editing an order cycle" do
oc = create(:simple_order_cycle, { suppliers: [supplier_managed, supplier_permitted, supplier_unmanaged], coordinator: distributor_managed, distributors: [distributor_managed, distributor_permitted, distributor_unmanaged], name: 'Order Cycle 1' } )
distributor_managed.update_attribute(:enable_subscriptions, true)
visit edit_admin_order_cycle_path(oc)
expect(page).to have_field 'order_cycle_name', with: oc.name
multi_select2_select schedule.name, from: 'schedule_ids'
# When I remove all the exchanges and save
page.find("tr.supplier-#{supplier_managed.id} a.remove-exchange").click
page.find("tr.supplier-#{supplier_permitted.id} a.remove-exchange").click
page.find("tr.distributor-#{distributor_managed.id} a.remove-exchange").click
page.find("tr.distributor-#{distributor_permitted.id} a.remove-exchange").click
click_button 'Update'
# Then the exchanges should be removed
page.should have_content "Your order cycle has been updated."
oc.reload
oc.suppliers.should == [supplier_unmanaged]
oc.coordinator.should == distributor_managed
oc.distributors.should == [distributor_unmanaged]
oc.schedules.should == [schedule]
end
scenario "cloning an order cycle" do
oc = create(:simple_order_cycle, coordinator: distributor_managed)
visit admin_order_cycles_path
within "tr.order-cycle-#{oc.id}" do
find('a.clone-order-cycle').click
end
expect(flash_message).to eq "Your order cycle #{oc.name} has been cloned."
# Then I should have clone of the order cycle
occ = OrderCycle.last
occ.name.should == "COPY OF #{oc.name}"
end
end
context "that is a manager of a participating producer" do
let(:new_user) { create_enterprise_user }
before do
new_user.enterprise_roles.build(enterprise: supplier_managed).save
login_to_admin_as new_user
end
scenario "editing an order cycle" do
oc = create(:simple_order_cycle, { suppliers: [supplier_managed, supplier_permitted, supplier_unmanaged], coordinator: distributor_managed, distributors: [distributor_managed, distributor_permitted, distributor_unmanaged], name: 'Order Cycle 1' } )
v1 = create(:variant, product: create(:product, supplier: supplier_managed) )
v2 = create(:variant, product: create(:product, supplier: supplier_managed) )
# Incoming exchange
ex_in = oc.exchanges.where(sender_id: supplier_managed, receiver_id: distributor_managed, incoming: true).first
ex_in.update_attributes(variant_ids: [v1.id, v2.id])
# Outgoing exchange
ex_out = oc.exchanges.where(sender_id: distributor_managed, receiver_id: distributor_managed, incoming: false).first
ex_out.update_attributes(variant_ids: [v1.id, v2.id])
# Stub editable_variants_for_outgoing_exchanges method so we can test permissions
serializer = Api::Admin::OrderCycleSerializer.new(oc, current_user: new_user)
allow(Api::Admin::OrderCycleSerializer).to receive(:new) { serializer }
allow(serializer).to receive(:editable_variants_for_outgoing_exchanges) do
{ "#{distributor_managed.id}" => [v1.id] }
end
visit edit_admin_order_cycle_path(oc)
# I should only see exchanges for supplier_managed AND
# distributor_managed and distributor_permitted (who I have given permission to) AND
# and distributor_unmanaged (who distributes my products)
expect(page).to have_selector "tr.supplier-#{supplier_managed.id}"
expect(page).to have_selector 'tr.supplier', count: 1
expect(page).to have_selector "tr.distributor-#{distributor_managed.id}"
expect(page).to have_selector "tr.distributor-#{distributor_permitted.id}"
expect(page).to have_selector 'tr.distributor', count: 2
# Open the products list for managed_supplier's incoming exchange
within "tr.distributor-#{distributor_managed.id}" do
page.find("td.products").click
end
# I should be able to see and toggle v1
expect(page).to have_checked_field "order_cycle_outgoing_exchange_0_variants_#{v1.id}", disabled: false
uncheck "order_cycle_outgoing_exchange_0_variants_#{v1.id}"
# I should be able to see but not toggle v2, because I don't have permission
expect(page).to have_checked_field "order_cycle_outgoing_exchange_0_variants_#{v2.id}", disabled: true
page.should_not have_selector "table.exchanges tr.distributor-#{distributor_managed.id} td.tags"
# When I save, any exchanges that I can't manage remain
click_button 'Update'
page.should have_content "Your order cycle has been updated."
oc.reload
oc.suppliers.should match_array [supplier_managed, supplier_permitted, supplier_unmanaged]
oc.coordinator.should == distributor_managed
oc.distributors.should match_array [distributor_managed, distributor_permitted, distributor_unmanaged]
end
end
context "that is the manager of a participating hub" do
let(:my_distributor) { create(:distributor_enterprise) }
let(:new_user) { create_enterprise_user }
before do
create(:enterprise_relationship, parent: supplier_managed, child: my_distributor, permissions_list: [:add_to_order_cycle])
new_user.enterprise_roles.build(enterprise: my_distributor).save
login_to_admin_as new_user
end
scenario "editing an order cycle" do
oc = create(:simple_order_cycle, { suppliers: [supplier_managed, supplier_permitted, supplier_unmanaged], coordinator: distributor_managed, distributors: [my_distributor, distributor_managed, distributor_permitted, distributor_unmanaged], name: 'Order Cycle 1' } )
v1 = create(:variant, product: create(:product, supplier: supplier_managed) )
v2 = create(:variant, product: create(:product, supplier: supplier_managed) )
# Incoming exchange
ex_in = oc.exchanges.where(sender_id: supplier_managed, receiver_id: distributor_managed, incoming: true).first
ex_in.update_attributes(variant_ids: [v1.id, v2.id])
# Outgoing exchange
ex_out = oc.exchanges.where(sender_id: distributor_managed, receiver_id: my_distributor, incoming: false).first
ex_out.update_attributes(variant_ids: [v1.id, v2.id])
# Stub editable_variants_for_incoming_exchanges method so we can test permissions
serializer = Api::Admin::OrderCycleSerializer.new(oc, current_user: new_user)
allow(Api::Admin::OrderCycleSerializer).to receive(:new) { serializer }
allow(serializer).to receive(:editable_variants_for_incoming_exchanges) do
{ "#{supplier_managed.id}" => [v1.id] }
end
visit edit_admin_order_cycle_path(oc)
# I should see exchanges for my_distributor, and the incoming exchanges supplying the variants in it
expect(page).to have_selector "tr.supplier-#{supplier_managed.id}"
expect(page).to have_selector 'tr.supplier', count: 1
expect(page).to have_selector "tr.distributor-#{my_distributor.id}"
expect(page).to have_selector 'tr.distributor', count: 1
# Open the products list for managed_supplier's incoming exchange
within "tr.supplier-#{supplier_managed.id}" do
page.find("td.products").click
end
# I should be able to see and toggle v1
expect(page).to have_checked_field "order_cycle_incoming_exchange_0_variants_#{v1.id}", disabled: false
uncheck "order_cycle_incoming_exchange_0_variants_#{v1.id}"
# I should be able to see but not toggle v2, because I don't have permission
expect(page).to have_checked_field "order_cycle_incoming_exchange_0_variants_#{v2.id}", disabled: true
page.should have_selector "table.exchanges tr.distributor-#{my_distributor.id} td.tags"
# When I save, any exchange that I can't manage remains
click_button 'Update'
page.should have_content "Your order cycle has been updated."
oc.reload
oc.suppliers.should match_array [supplier_managed, supplier_permitted, supplier_unmanaged]
oc.coordinator.should == distributor_managed
oc.distributors.should match_array [my_distributor, distributor_managed, distributor_permitted, distributor_unmanaged]
end
end
end
describe "simplified interface for enterprise users selling only their own produce" do
let(:user) { create_enterprise_user }
let(:enterprise) { create(:enterprise, is_primary_producer: true, sells: 'own') }
let!(:p1) { create(:simple_product, supplier: enterprise) }
let!(:p2) { create(:simple_product, supplier: enterprise) }
let!(:p3) { create(:simple_product, supplier: enterprise) }
let!(:v1) { p1.variants.first }
let!(:v2) { p2.variants.first }
let!(:v3) { p3.variants.first }
let!(:fee) { create(:enterprise_fee, enterprise: enterprise, name: 'Coord fee') }
before do
user.enterprise_roles.create! enterprise: enterprise
login_to_admin_as user
end
it "shows me an index of order cycles without enterprise columns" do
create(:simple_order_cycle, coordinator: enterprise)
visit admin_order_cycles_path
page.should_not have_selector 'th', text: 'SUPPLIERS'
page.should_not have_selector 'th', text: 'COORDINATOR'
page.should_not have_selector 'th', text: 'DISTRIBUTORS'
end
it "creates order cycles", js: true do
# When I go to the new order cycle page
visit admin_order_cycles_path
click_link 'New Order Cycle'
# And I fill in the basic fields
fill_in 'order_cycle_name', with: 'Plums & Avos'
fill_in 'order_cycle_orders_open_at', with: '2040-10-17 06:00:00'
fill_in 'order_cycle_orders_close_at', with: '2040-10-24 17:00:00'
fill_in 'order_cycle_outgoing_exchange_0_pickup_time', with: 'pickup time'
fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'pickup instructions'
# Then my products / variants should already be selected
page.should have_checked_field "order_cycle_incoming_exchange_0_variants_#{v1.id}"
page.should have_checked_field "order_cycle_incoming_exchange_0_variants_#{v2.id}"
page.should have_checked_field "order_cycle_incoming_exchange_0_variants_#{v3.id}"
# When I unselect a product
uncheck "order_cycle_incoming_exchange_0_variants_#{v2.id}"
# And I add a fee and save
click_button 'Add coordinator fee'
click_button 'Add coordinator fee'
click_link 'order_cycle_coordinator_fee_1_remove'
page.should have_select 'order_cycle_coordinator_fee_0_id'
page.should_not have_select 'order_cycle_coordinator_fee_1_id'
select 'Coord fee', from: 'order_cycle_coordinator_fee_0_id'
click_button 'Create'
# Then my order cycle should have been created
page.should have_content 'Your order cycle has been created.'
oc = OrderCycle.last
expect(page).to have_input "oc#{oc.id}[name]", value: "Plums & Avos"
expect(page).to have_input "oc#{oc.id}[orders_open_at]", value: Time.zone.local(2040, 10, 17, 06, 00, 00).strftime("%F %T %z")
expect(page).to have_input "oc#{oc.id}[orders_close_at]", value: Time.zone.local(2040, 10, 24, 17, 00, 00).strftime("%F %T %z")
# And it should have some variants selected
oc.exchanges.incoming.first.variants.count.should == 2
oc.exchanges.outgoing.first.variants.count.should == 2
# And it should have the fee
oc.coordinator_fees.should == [fee]
# And my pickup time and instructions should have been saved
ex = oc.exchanges.outgoing.first
ex.pickup_time.should == 'pickup time'
ex.pickup_instructions.should == 'pickup instructions'
end
scenario "editing an order cycle" do
# Given an order cycle with pickup time and instructions
fee = create(:enterprise_fee, name: 'my fee', enterprise: enterprise)
oc = create(:simple_order_cycle, suppliers: [enterprise], coordinator: enterprise, distributors: [enterprise], variants: [v1], coordinator_fees: [fee])
ex = oc.exchanges.outgoing.first
ex.update_attributes! pickup_time: 'pickup time', pickup_instructions: 'pickup instructions'
# When I edit it
quick_login_as_admin
visit admin_order_cycles_path
within "tr.order-cycle-#{oc.id}" do
find("a.edit-order-cycle").click
end
wait_for_edit_form_to_load_order_cycle(oc)
# Then I should see the basic settings
page.should have_field 'order_cycle_name', with: oc.name
page.should have_field 'order_cycle_orders_open_at', with: oc.orders_open_at.to_s
page.should have_field 'order_cycle_orders_close_at', with: oc.orders_close_at.to_s
page.should have_field 'order_cycle_outgoing_exchange_0_pickup_time', with: 'pickup time'
page.should have_field 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'pickup instructions'
# And I should see the products
page.should have_checked_field "order_cycle_incoming_exchange_0_variants_#{v1.id}"
page.should have_unchecked_field "order_cycle_incoming_exchange_0_variants_#{v2.id}"
page.should have_unchecked_field "order_cycle_incoming_exchange_0_variants_#{v3.id}"
# And I should see the coordinator fees
page.should have_select 'order_cycle_coordinator_fee_0_id', selected: 'my fee'
end
scenario "updating an order cycle" do
# Given an order cycle with pickup time and instructions
fee1 = create(:enterprise_fee, name: 'my fee', enterprise: enterprise)
fee2 = create(:enterprise_fee, name: 'that fee', enterprise: enterprise)
oc = create(:simple_order_cycle, suppliers: [enterprise], coordinator: enterprise, distributors: [enterprise], variants: [v1], coordinator_fees: [fee1])
ex = oc.exchanges.outgoing.first
ex.update_attributes! pickup_time: 'pickup time', pickup_instructions: 'pickup instructions'
# When I edit it
quick_login_as_admin
visit edit_admin_order_cycle_path oc
wait_for_edit_form_to_load_order_cycle(oc)
# And I fill in the basic fields
fill_in 'order_cycle_name', with: 'Plums & Avos'
fill_in 'order_cycle_orders_open_at', with: '2040-10-17 06:00:00'
fill_in 'order_cycle_orders_close_at', with: '2040-10-24 17:00:00'
fill_in 'order_cycle_outgoing_exchange_0_pickup_time', with: 'xy'
fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'zzy'
# And I make some product selections
uncheck "order_cycle_incoming_exchange_0_variants_#{v1.id}"
check "order_cycle_incoming_exchange_0_variants_#{v2.id}"
check "order_cycle_incoming_exchange_0_variants_#{v3.id}"
uncheck "order_cycle_incoming_exchange_0_variants_#{v3.id}"
# And I select some fees and update
click_link 'order_cycle_coordinator_fee_0_remove'
page.should_not have_select 'order_cycle_coordinator_fee_0_id'
click_button 'Add coordinator fee'
select 'that fee', from: 'order_cycle_coordinator_fee_0_id'
# When I update, or update and close, both work
click_button 'Update'
page.should have_content 'Your order cycle has been updated.'
fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'yyz'
click_button 'Update and Close'
# Then my order cycle should have been updated
page.should have_content 'Your order cycle has been updated.'
oc = OrderCycle.last
expect(page).to have_input "oc#{oc.id}[name]", value: "Plums & Avos"
expect(page).to have_input "oc#{oc.id}[orders_open_at]", value: Time.zone.local(2040, 10, 17, 06, 00, 00).strftime("%F %T %z")
expect(page).to have_input "oc#{oc.id}[orders_close_at]", value: Time.zone.local(2040, 10, 24, 17, 00, 00).strftime("%F %T %z")
# And it should have a variant selected
oc.exchanges.incoming.first.variants.should == [v2]
oc.exchanges.outgoing.first.variants.should == [v2]
# And it should have the fee
oc.coordinator_fees.should == [fee2]
# And my pickup time and instructions should have been saved
ex = oc.exchanges.outgoing.first
ex.pickup_time.should == 'xy'
ex.pickup_instructions.should == 'yyz'
end
end
scenario "deleting an order cycle" do
order_cycle = create(:simple_order_cycle, name: "Translusent Berries")
quick_login_as_admin
visit admin_order_cycles_path
expect(page).to have_selector "tr.order-cycle-#{order_cycle.id}"
accept_alert do
first('a.delete-order-cycle').click
end
expect(page).to_not have_selector "tr.order-cycle-#{order_cycle.id}"
end
private
def wait_for_edit_form_to_load_order_cycle(order_cycle)
expect(page).to have_field "order_cycle_name", with: order_cycle.name
end
def select_incoming_variant(supplier, exchange_no, variant)
page.find("table.exchanges tr.supplier-#{supplier.id} td.products").click
check "order_cycle_incoming_exchange_#{exchange_no}_variants_#{variant.id}"
end
end