From 3b8acdc577148eb2b256311eb0d60946466ba65a Mon Sep 17 00:00:00 2001 From: Steve Roberts Date: Tue, 5 May 2020 14:38:06 +1000 Subject: [PATCH] Split order_cycle_spec into smaller specs grouped by theme --- .../admin/order_cycles_complex_spec.rb | 438 ++++++++++++++ spec/features/admin/order_cycles_list_spec.rb | 162 +++++ ...es_spec.rb => order_cycles_simple_spec.rb} | 562 +----------------- 3 files changed, 602 insertions(+), 560 deletions(-) create mode 100644 spec/features/admin/order_cycles_complex_spec.rb create mode 100644 spec/features/admin/order_cycles_list_spec.rb rename spec/features/admin/{order_cycles_spec.rb => order_cycles_simple_spec.rb} (51%) diff --git a/spec/features/admin/order_cycles_complex_spec.rb b/spec/features/admin/order_cycles_complex_spec.rb new file mode 100644 index 0000000000..cca8c0ea10 --- /dev/null +++ b/spec/features/admin/order_cycles_complex_spec.rb @@ -0,0 +1,438 @@ +require 'spec_helper' + +feature ' + As an administrator + I want to manage complex order cycles +', js: true do + include AdminHelper + include AuthenticationWorkflow + include WebHelper + + context "with specific time" do + let(:order_cycle_opening_time) { Time.zone.local(2040, 11, 0o6, 0o6, 0o0, 0o0).strftime("%F %T %z") } + let(:order_cycle_closing_time) { Time.zone.local(2040, 11, 13, 17, 0o0, 0o0).strftime("%F %T %z") } + + scenario "creating an order cycle with full interface", 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 >" + + # I cannot save before filling in the required fields + expect(page).to have_button("Create", disabled: true) + + # The Create button is enabled once Name is entered + fill_in 'order_cycle_name', with: 'Plums & Avos' + expect(page).to have_button("Create", disabled: false) + + # If I fill in the basic fields + 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' + + click_button 'Create' + expect(page).to have_content 'Your order cycle has been created.' + + # I should not be able to add a blank supplier + expect(page).to have_select 'new_supplier_id', selected: '' + expect(page).to 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 + expect(page).not_to have_select 'new_supplier_id', with_options: ['My supplier'] + expect(page).to have_button 'Add supplier', disabled: true + expect(page.all("td.supplier_name").map(&:text)).to eq(['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' + + click_button 'Save and Next' + + # 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' + + click_button 'Save and Back to List' + + 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" + + expect(page).to have_selector 'td.producers', text: 'My supplier' + expect(page).to have_selector 'td.shops', text: 'My distributor' + + # And it should have some fees + expect(oc.exchanges.incoming.first.enterprise_fees).to eq([supplier_fee]) + expect(oc.coordinator_fees).to eq([coordinator_fee]) + expect(oc.exchanges.outgoing.first.enterprise_fees).to eq([distributor_fee]) + + # And it should have some variants selected + expect(oc.exchanges.first.variants.count).to eq(2) + expect(oc.exchanges.last.variants.count).to eq(2) + + # And my receival and pickup time and instructions should have been saved + exchange = oc.exchanges.incoming.first + expect(exchange.receival_instructions).to eq('receival instructions') + + exchange = oc.exchanges.outgoing.first + expect(exchange.pickup_time).to eq('pickup time') + expect(exchange.pickup_instructions).to eq('pickup instructions') + expect(exchange.tag_list).to eq(['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 + + # 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' + + click_button 'Save and Next' + expect(page).to have_content 'Your order cycle has been updated.' + + # And I add a supplier and some products + expect(page).to have_selector("table.exchanges tr.supplier") + select 'My supplier', from: 'new_supplier_id' + click_button 'Add supplier' + expect(page).to have_selector("table.exchanges tr.supplier", text: "My supplier") + page.all("table.exchanges tr.supplier td.products").each(&:click) + + + expect(page).to 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' + + click_button 'Save and Next' + + # And I add a distributor and some products + select 'My distributor', from: 'new_distributor_id' + click_button 'Add distributor' + expect(page).to have_field("order_cycle_outgoing_exchange_2_pickup_time") + + 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 + + exchange_rows = page.all("table.exchanges tbody") + exchange_rows.each do |exchange_row| + exchange_row.find("td.products").click + # Wait for the products panel to be visible. + expect(exchange_row).to have_selector "tr", count: 2 + end + + 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' + + expect(page).to have_selector "#save-bar" + click_button 'Save and Back to List' + + 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 + + expect(page).to have_selector 'td.producers', text: 'My supplier' + expect(page).to have_selector 'td.shops', text: 'My distributor' + + # And my coordinator fees should have been configured + expect(oc.coordinator_fee_ids).to match_array [coordinator_fee1.id, coordinator_fee2.id] + + # And my supplier fees should have been configured + expect(oc.exchanges.incoming.last.enterprise_fee_ids).to eq([supplier_fee2.id]) + + # And my distributor fees should have been configured + expect(oc.exchanges.outgoing.last.enterprise_fee_ids).to eq([distributor_fee2.id]) + + # And my tags should have been save + expect(oc.exchanges.outgoing.last.tag_list).to eq(['wholesale']) + + # And it should have some variants selected + selected_initial_variants = initial_variants.take initial_variants.size - 1 + expect(oc.variants.map(&:id)).to match_array((selected_initial_variants.map(&:id) + [v1.id, v2.id])) + + # And the collection details should have been updated + expect(oc.exchanges.where(pickup_time: 'New time 0', pickup_instructions: 'New instructions 0')).to be_present + expect(oc.exchanges.where(pickup_time: 'New time 1', pickup_instructions: 'New instructions 1')).to 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 + expect(page.find('#order_cycle_name').value).to eq(oc.name) + expect(page.find('#order_cycle_orders_open_at').value).to eq(oc.orders_open_at.to_s) + expect(page.find('#order_cycle_orders_close_at').value).to eq(oc.orders_close_at.to_s) + expect(page).to have_content "COORDINATOR #{oc.coordinator.name}" + + click_button 'Next' + + # And I should see the suppliers + expect(page).to have_selector 'td.supplier_name', text: oc.suppliers.first.name + expect(page).to have_selector 'td.supplier_name', text: oc.suppliers.last.name + + expect(page).to have_field 'order_cycle_incoming_exchange_0_receival_instructions', with: 'instructions 0' + expect(page).to 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(&:visible?).first + expect(products_panel).to 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.min_by(&:name) + expect(page).to have_select 'order_cycle_incoming_exchange_0_enterprise_fees_0_enterprise_id', selected: supplier.name + expect(page).to have_select 'order_cycle_incoming_exchange_0_enterprise_fees_0_enterprise_fee_id', selected: supplier.enterprise_fees.first.name + + supplier = oc.suppliers.max_by(&:name) + expect(page).to have_select 'order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_id', selected: supplier.name + expect(page).to have_select 'order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_fee_id', selected: supplier.enterprise_fees.first.name + + click_button 'Next' + + # And I should see the distributors + expect(page).to have_selector 'td.distributor_name', text: oc.distributors.first.name + expect(page).to have_selector 'td.distributor_name', text: oc.distributors.last.name + + expect(page).to have_field 'order_cycle_outgoing_exchange_0_pickup_time', with: 'time 0' + expect(page).to have_field 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'instructions 0' + expect(page).to have_field 'order_cycle_outgoing_exchange_1_pickup_time', with: 'time 1' + expect(page).to 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(&:visible?).first + expect(products_panel).to 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.min_by(&:id) + expect(page).to have_select 'order_cycle_outgoing_exchange_0_enterprise_fees_0_enterprise_id', selected: distributor.name + expect(page).to have_select 'order_cycle_outgoing_exchange_0_enterprise_fees_0_enterprise_fee_id', selected: distributor.enterprise_fees.first.name + + distributor = oc.distributors.max_by(&:id) + expect(page).to have_select 'order_cycle_outgoing_exchange_1_enterprise_fees_0_enterprise_id', selected: distributor.name + expect(page).to 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 admin_order_cycle_incoming_path(oc_incoming) + expect(page).to have_selector 'table.exchanges tr.supplier' + visit admin_order_cycle_outgoing_path(oc_incoming) + expect(page).not_to have_selector 'table.exchanges tr.distributor' + + # And when I edit the second order cycle, the exchange should appear as outgoing + visit admin_order_cycle_outgoing_path(oc_outgoing) + expect(page).to have_selector 'table.exchanges tr.distributor' + visit admin_order_cycle_incoming_path(oc_outgoing) + expect(page).not_to have_selector 'table.exchanges tr.supplier' + end + + describe "editing an order cycle with multiple pages of products", js: true do + let(:order_cycle) { create(:order_cycle) } + let(:supplier_enterprise) { order_cycle.exchanges.incoming.first.sender } + let!(:new_product) { create(:product, supplier: supplier_enterprise) } + + before do + stub_const("Api::ExchangeProductsController::DEFAULT_PER_PAGE", 1) + + quick_login_as_admin + visit admin_order_cycle_incoming_path(order_cycle) + expect(page).to have_content "1 / 2 selected" + + page.find("tr.supplier-#{supplier_enterprise.id} td.products").click + expect(page).to have_selector ".exchange-product-details" + + expect(page).to have_content "1 of 2 Variants Loaded" + expect(page).to_not have_content new_product.name + end + + scenario "load all products" do + page.find(".exchange-load-all-variants a").click + + expect_all_products_loaded + end + + scenario "select all products" do + check "order_cycle_incoming_exchange_0_select_all_variants" + + expect_all_products_loaded + + expect(page).to have_checked_field "order_cycle_incoming_exchange_0_variants_#{new_product.variants.first.id}", disabled: false + end + + def expect_all_products_loaded + expect(page).to have_content new_product.name.upcase + expect(page).to have_content "2 of 2 Variants Loaded" + end + 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 \ No newline at end of file diff --git a/spec/features/admin/order_cycles_list_spec.rb b/spec/features/admin/order_cycles_list_spec.rb new file mode 100644 index 0000000000..6021a83f12 --- /dev/null +++ b/spec/features/admin/order_cycles_list_spec.rb @@ -0,0 +1,162 @@ +require 'spec_helper' + +feature ' + As an administrator + I want to list and filter 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.days.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 + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}.undated" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}.open" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}.open" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}.upcoming" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc4.id}.upcoming" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc5.id}.closed" + expect(page).to 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| expect(page).to have_content s.name } + oc1.distributors.each { |d| expect(page).to have_content d.name } + + # And I should see the number of variants + expect(page).to have_selector 'td.products', text: '2 variants' + end + + # I can load more order_cycles + expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc7.id}" + click_button "Show 30 more days" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc7.id}" + + # I can filter order cycle by involved enterprises + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + select2_select oc1.suppliers.first.name, from: "involving_filter" + expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + select2_select "Any Enterprise", from: "involving_filter" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + + # I can filter order cycles by name + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + fill_in "query", with: oc0.name + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + fill_in "query", with: '' + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + + # I can filter order cycle by schedule + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}" + select2_select schedule1.name, from: "schedule_filter" + expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}" + select2_select 'Any Schedule', from: "schedule_filter" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" + expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" + expect(page).to 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 + + 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 diff --git a/spec/features/admin/order_cycles_spec.rb b/spec/features/admin/order_cycles_simple_spec.rb similarity index 51% rename from spec/features/admin/order_cycles_spec.rb rename to spec/features/admin/order_cycles_simple_spec.rb index 0da5f07c6d..c4296c0919 100644 --- a/spec/features/admin/order_cycles_spec.rb +++ b/spec/features/admin/order_cycles_simple_spec.rb @@ -2,570 +2,12 @@ require 'spec_helper' feature ' As an administrator - I want to manage order cycles + I want to manage simple 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.days.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 - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}.undated" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}.open" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}.open" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}.upcoming" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc4.id}.upcoming" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc5.id}.closed" - expect(page).to 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| expect(page).to have_content s.name } - oc1.distributors.each { |d| expect(page).to have_content d.name } - - # And I should see the number of variants - expect(page).to have_selector 'td.products', text: '2 variants' - end - - # I can load more order_cycles - expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc7.id}" - click_button "Show 30 more days" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc7.id}" - - # I can filter order cycle by involved enterprises - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - select2_select oc1.suppliers.first.name, from: "involving_filter" - expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - select2_select "Any Enterprise", from: "involving_filter" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - - # I can filter order cycles by name - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - fill_in "query", with: oc0.name - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - fill_in "query", with: '' - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - - # I can filter order cycle by schedule - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}" - select2_select schedule1.name, from: "schedule_filter" - expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_no_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc3.id}" - select2_select 'Any Schedule', from: "schedule_filter" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc0.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc1.id}" - expect(page).to have_selector "#listing_order_cycles tr.order-cycle-#{oc2.id}" - expect(page).to 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, 0o6, 0o6, 0o0, 0o0).strftime("%F %T %z") } - let(:order_cycle_closing_time) { Time.zone.local(2040, 11, 13, 17, 0o0, 0o0).strftime("%F %T %z") } - - scenario "creating an order cycle with full interface", 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 >" - - # I cannot save before filling in the required fields - expect(page).to have_button("Create", disabled: true) - - # The Create button is enabled once Name is entered - fill_in 'order_cycle_name', with: 'Plums & Avos' - expect(page).to have_button("Create", disabled: false) - - # If I fill in the basic fields - 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' - - click_button 'Create' - expect(page).to have_content 'Your order cycle has been created.' - - # I should not be able to add a blank supplier - expect(page).to have_select 'new_supplier_id', selected: '' - expect(page).to 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 - expect(page).not_to have_select 'new_supplier_id', with_options: ['My supplier'] - expect(page).to have_button 'Add supplier', disabled: true - expect(page.all("td.supplier_name").map(&:text)).to eq(['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' - - click_button 'Save and Next' - - # 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' - - click_button 'Save and Back to List' - - 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" - - expect(page).to have_selector 'td.producers', text: 'My supplier' - expect(page).to have_selector 'td.shops', text: 'My distributor' - - # And it should have some fees - expect(oc.exchanges.incoming.first.enterprise_fees).to eq([supplier_fee]) - expect(oc.coordinator_fees).to eq([coordinator_fee]) - expect(oc.exchanges.outgoing.first.enterprise_fees).to eq([distributor_fee]) - - # And it should have some variants selected - expect(oc.exchanges.first.variants.count).to eq(2) - expect(oc.exchanges.last.variants.count).to eq(2) - - # And my receival and pickup time and instructions should have been saved - exchange = oc.exchanges.incoming.first - expect(exchange.receival_instructions).to eq('receival instructions') - - exchange = oc.exchanges.outgoing.first - expect(exchange.pickup_time).to eq('pickup time') - expect(exchange.pickup_instructions).to eq('pickup instructions') - expect(exchange.tag_list).to eq(['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 - - # 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' - - click_button 'Save and Next' - expect(page).to have_content 'Your order cycle has been updated.' - - # And I add a supplier and some products - expect(page).to have_selector("table.exchanges tr.supplier") - select 'My supplier', from: 'new_supplier_id' - click_button 'Add supplier' - expect(page).to have_selector("table.exchanges tr.supplier", text: "My supplier") - page.all("table.exchanges tr.supplier td.products").each(&:click) - - - expect(page).to 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' - - click_button 'Save and Next' - - # And I add a distributor and some products - select 'My distributor', from: 'new_distributor_id' - click_button 'Add distributor' - expect(page).to have_field("order_cycle_outgoing_exchange_2_pickup_time") - - 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 - - exchange_rows = page.all("table.exchanges tbody") - exchange_rows.each do |exchange_row| - exchange_row.find("td.products").click - # Wait for the products panel to be visible. - expect(exchange_row).to have_selector "tr", count: 2 - end - - 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' - - expect(page).to have_selector "#save-bar" - click_button 'Save and Back to List' - - 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 - - expect(page).to have_selector 'td.producers', text: 'My supplier' - expect(page).to have_selector 'td.shops', text: 'My distributor' - - # And my coordinator fees should have been configured - expect(oc.coordinator_fee_ids).to match_array [coordinator_fee1.id, coordinator_fee2.id] - - # And my supplier fees should have been configured - expect(oc.exchanges.incoming.last.enterprise_fee_ids).to eq([supplier_fee2.id]) - - # And my distributor fees should have been configured - expect(oc.exchanges.outgoing.last.enterprise_fee_ids).to eq([distributor_fee2.id]) - - # And my tags should have been save - expect(oc.exchanges.outgoing.last.tag_list).to eq(['wholesale']) - - # And it should have some variants selected - selected_initial_variants = initial_variants.take initial_variants.size - 1 - expect(oc.variants.map(&:id)).to match_array((selected_initial_variants.map(&:id) + [v1.id, v2.id])) - - # And the collection details should have been updated - expect(oc.exchanges.where(pickup_time: 'New time 0', pickup_instructions: 'New instructions 0')).to be_present - expect(oc.exchanges.where(pickup_time: 'New time 1', pickup_instructions: 'New instructions 1')).to 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 - expect(page.find('#order_cycle_name').value).to eq(oc.name) - expect(page.find('#order_cycle_orders_open_at').value).to eq(oc.orders_open_at.to_s) - expect(page.find('#order_cycle_orders_close_at').value).to eq(oc.orders_close_at.to_s) - expect(page).to have_content "COORDINATOR #{oc.coordinator.name}" - - click_button 'Next' - - # And I should see the suppliers - expect(page).to have_selector 'td.supplier_name', text: oc.suppliers.first.name - expect(page).to have_selector 'td.supplier_name', text: oc.suppliers.last.name - - expect(page).to have_field 'order_cycle_incoming_exchange_0_receival_instructions', with: 'instructions 0' - expect(page).to 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(&:visible?).first - expect(products_panel).to 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.min_by(&:name) - expect(page).to have_select 'order_cycle_incoming_exchange_0_enterprise_fees_0_enterprise_id', selected: supplier.name - expect(page).to have_select 'order_cycle_incoming_exchange_0_enterprise_fees_0_enterprise_fee_id', selected: supplier.enterprise_fees.first.name - - supplier = oc.suppliers.max_by(&:name) - expect(page).to have_select 'order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_id', selected: supplier.name - expect(page).to have_select 'order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_fee_id', selected: supplier.enterprise_fees.first.name - - click_button 'Next' - - # And I should see the distributors - expect(page).to have_selector 'td.distributor_name', text: oc.distributors.first.name - expect(page).to have_selector 'td.distributor_name', text: oc.distributors.last.name - - expect(page).to have_field 'order_cycle_outgoing_exchange_0_pickup_time', with: 'time 0' - expect(page).to have_field 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'instructions 0' - expect(page).to have_field 'order_cycle_outgoing_exchange_1_pickup_time', with: 'time 1' - expect(page).to 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(&:visible?).first - expect(products_panel).to 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.min_by(&:id) - expect(page).to have_select 'order_cycle_outgoing_exchange_0_enterprise_fees_0_enterprise_id', selected: distributor.name - expect(page).to have_select 'order_cycle_outgoing_exchange_0_enterprise_fees_0_enterprise_fee_id', selected: distributor.enterprise_fees.first.name - - distributor = oc.distributors.max_by(&:id) - expect(page).to have_select 'order_cycle_outgoing_exchange_1_enterprise_fees_0_enterprise_id', selected: distributor.name - expect(page).to 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 admin_order_cycle_incoming_path(oc_incoming) - expect(page).to have_selector 'table.exchanges tr.supplier' - visit admin_order_cycle_outgoing_path(oc_incoming) - expect(page).not_to have_selector 'table.exchanges tr.distributor' - - # And when I edit the second order cycle, the exchange should appear as outgoing - visit admin_order_cycle_outgoing_path(oc_outgoing) - expect(page).to have_selector 'table.exchanges tr.distributor' - visit admin_order_cycle_incoming_path(oc_outgoing) - expect(page).not_to have_selector 'table.exchanges tr.supplier' - end - - describe "editing an order cycle with multiple pages of products", js: true do - let(:order_cycle) { create(:order_cycle) } - let(:supplier_enterprise) { order_cycle.exchanges.incoming.first.sender } - let!(:new_product) { create(:product, supplier: supplier_enterprise) } - - before do - stub_const("Api::ExchangeProductsController::DEFAULT_PER_PAGE", 1) - - quick_login_as_admin - visit admin_order_cycle_incoming_path(order_cycle) - expect(page).to have_content "1 / 2 selected" - - page.find("tr.supplier-#{supplier_enterprise.id} td.products").click - expect(page).to have_selector ".exchange-product-details" - - expect(page).to have_content "1 of 2 Variants Loaded" - expect(page).to_not have_content new_product.name - end - - scenario "load all products" do - page.find(".exchange-load-all-variants a").click - - expect_all_products_loaded - end - - scenario "select all products" do - check "order_cycle_incoming_exchange_0_select_all_variants" - - expect_all_products_loaded - - expect(page).to have_checked_field "order_cycle_incoming_exchange_0_variants_#{new_product.variants.first.id}", disabled: false - end - - def expect_all_products_loaded - expect(page).to have_content new_product.name.upcase - expect(page).to have_content "2 of 2 Variants Loaded" - end - end - scenario "updating many order cycle opening/closing times at once", js: true do # Given three order cycles oc1 = create(:simple_order_cycle) @@ -1171,4 +613,4 @@ feature ' page.find("table.exchanges tr.supplier-#{supplier.id} td.products").click check "order_cycle_incoming_exchange_#{exchange_no}_variants_#{variant.id}" end -end +end \ No newline at end of file