mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-03-17 04:34:24 +00:00
Order Cycles can be assigned to schedules via new/edit form
This commit is contained in:
@@ -98,59 +98,58 @@ module Admin
|
||||
|
||||
describe "update" do
|
||||
let(:order_cycle) { create(:simple_order_cycle) }
|
||||
let(:producer) { create(:supplier_enterprise) }
|
||||
let(:coordinator) { order_cycle.coordinator }
|
||||
let(:hub) { create(:distributor_enterprise) }
|
||||
let(:v) { create(:variant) }
|
||||
let!(:incoming_exchange) { create(:exchange, order_cycle: order_cycle, sender: producer, receiver: coordinator, incoming: true, variants: [v]) }
|
||||
let!(:outgoing_exchange) { create(:exchange, order_cycle: order_cycle, sender: coordinator, receiver: hub, incoming: false, variants: [v]) }
|
||||
|
||||
before { login_as_admin }
|
||||
context "as a manager of the coordinator" do
|
||||
before { login_as_enterprise_user([coordinator]) }
|
||||
|
||||
it "sets flash message when page is reloading" do
|
||||
spree_put :update, id: order_cycle.id, reloading: '1', order_cycle: {}
|
||||
flash[:notice].should == 'Your order cycle has been updated.'
|
||||
end
|
||||
|
||||
it "does not set flash message otherwise" do
|
||||
flash[:notice].should be_nil
|
||||
end
|
||||
|
||||
context "when updating without explicitly submitting exchanges" do
|
||||
let(:form_applicator_mock) { double(:form_applicator) }
|
||||
let(:incoming_exchange) { create(:exchange, order_cycle: order_cycle, incoming: true) }
|
||||
let(:outgoing_exchange) { create(:exchange, order_cycle: order_cycle, incoming: false) }
|
||||
|
||||
|
||||
before do
|
||||
allow(OpenFoodNetwork::OrderCycleFormApplicator).to receive(:new) { form_applicator_mock }
|
||||
allow(form_applicator_mock).to receive(:go!) { nil }
|
||||
it "sets flash message when page is reloading" do
|
||||
spree_put :update, id: order_cycle.id, reloading: '1', order_cycle: {}
|
||||
flash[:notice].should == 'Your order cycle has been updated.'
|
||||
end
|
||||
|
||||
it "does not run the OrderCycleFormApplicator" do
|
||||
expect(order_cycle.exchanges.incoming).to eq [incoming_exchange]
|
||||
expect(order_cycle.exchanges.outgoing).to eq [outgoing_exchange]
|
||||
expect(order_cycle.prefers_product_selection_from_coordinator_inventory_only?).to be false
|
||||
spree_put :update, id: order_cycle.id, order_cycle: { name: 'Some new name', preferred_product_selection_from_coordinator_inventory_only: true }
|
||||
expect(form_applicator_mock).to_not have_received(:go!)
|
||||
order_cycle.reload
|
||||
expect(order_cycle.exchanges.incoming).to eq [incoming_exchange]
|
||||
expect(order_cycle.exchanges.outgoing).to eq [outgoing_exchange]
|
||||
expect(order_cycle.name).to eq 'Some new name'
|
||||
expect(order_cycle.prefers_product_selection_from_coordinator_inventory_only?).to be true
|
||||
end
|
||||
it "does not set flash message otherwise" do
|
||||
flash[:notice].should be_nil
|
||||
end
|
||||
|
||||
context "when updating without explicitly submitting exchanges" do
|
||||
let(:form_applicator_mock) { double(:form_applicator) }
|
||||
|
||||
before do
|
||||
allow(OpenFoodNetwork::OrderCycleFormApplicator).to receive(:new) { form_applicator_mock }
|
||||
allow(form_applicator_mock).to receive(:go!) { nil }
|
||||
end
|
||||
|
||||
it "does not run the OrderCycleFormApplicator" do
|
||||
expect(order_cycle.exchanges.incoming).to eq [incoming_exchange]
|
||||
expect(order_cycle.exchanges.outgoing).to eq [outgoing_exchange]
|
||||
expect(order_cycle.prefers_product_selection_from_coordinator_inventory_only?).to be false
|
||||
spree_put :update, id: order_cycle.id, order_cycle: { name: 'Some new name', preferred_product_selection_from_coordinator_inventory_only: true }
|
||||
expect(form_applicator_mock).to_not have_received(:go!)
|
||||
order_cycle.reload
|
||||
expect(order_cycle.exchanges.incoming).to eq [incoming_exchange]
|
||||
expect(order_cycle.exchanges.outgoing).to eq [outgoing_exchange]
|
||||
expect(order_cycle.name).to eq 'Some new name'
|
||||
expect(order_cycle.prefers_product_selection_from_coordinator_inventory_only?).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context "as a producer supplying to an order cycle" do
|
||||
let(:producer) { create(:supplier_enterprise) }
|
||||
let(:coordinator) { order_cycle.coordinator }
|
||||
let(:hub) { create(:distributor_enterprise) }
|
||||
|
||||
before { login_as_enterprise_user [producer] }
|
||||
before do
|
||||
login_as_enterprise_user [producer]
|
||||
end
|
||||
|
||||
describe "removing a variant from incoming" do
|
||||
let(:v) { create(:variant) }
|
||||
let!(:ex_i) { create(:exchange, order_cycle: order_cycle, sender: producer, receiver: coordinator, incoming: true, variants: [v]) }
|
||||
let!(:ex_o) { create(:exchange, order_cycle: order_cycle, sender: coordinator, receiver: hub, incoming: false, variants: [v]) }
|
||||
|
||||
let(:params) do
|
||||
{order_cycle: {
|
||||
incoming_exchanges: [{id: ex_i.id, enterprise_id: producer.id, sender_id: producer.id, variants: {v.id => false}}],
|
||||
outgoing_exchanges: [{id: ex_o.id, enterprise_id: hub.id, receiver_id: hub.id, variants: {v.id => false}}] }
|
||||
incoming_exchanges: [{id: incoming_exchange.id, enterprise_id: producer.id, sender_id: producer.id, variants: {v.id => false}}],
|
||||
outgoing_exchanges: [{id: outgoing_exchange.id, enterprise_id: hub.id, receiver_id: hub.id, variants: {v.id => false}}] }
|
||||
}
|
||||
end
|
||||
|
||||
@@ -162,6 +161,36 @@ module Admin
|
||||
end
|
||||
end
|
||||
|
||||
describe "updating schedules" do
|
||||
let(:user) { create(:user, enterprise_limit: 10) }
|
||||
let!(:managed_coordinator) { create(:enterprise, owner: user) }
|
||||
let!(:managed_enterprise) { create(:enterprise, owner: user) }
|
||||
let!(:coordinated_order_cycle) { create(:simple_order_cycle, coordinator: managed_coordinator ) }
|
||||
let!(:coordinated_order_cycle2) { create(:simple_order_cycle, coordinator: managed_enterprise ) }
|
||||
let!(:uncoordinated_order_cycle) { create(:simple_order_cycle, coordinator: create(:enterprise) ) }
|
||||
let!(:coordinated_schedule) { create(:schedule, order_cycles: [coordinated_order_cycle] ) }
|
||||
let!(:coordinated_schedule2) { create(:schedule, order_cycles: [coordinated_order_cycle2] ) }
|
||||
let!(:uncoordinated_schedule) { create(:schedule, order_cycles: [uncoordinated_order_cycle] ) }
|
||||
|
||||
context "where I manage the order_cycle's coordinator" do
|
||||
render_views
|
||||
|
||||
before do
|
||||
controller.stub spree_current_user: user
|
||||
end
|
||||
|
||||
it "allows me to assign only schedules that already I coordinate to the order cycle" do
|
||||
schedule_ids = [coordinated_schedule2.id, uncoordinated_schedule.id ]
|
||||
spree_put :update, format: :json, id: coordinated_order_cycle.id, order_cycle: { schedule_ids: schedule_ids }
|
||||
expect(assigns(:order_cycle)).to eq coordinated_order_cycle
|
||||
# coordinated_order_cycle2 is added
|
||||
expect(coordinated_order_cycle.reload.schedules).to include coordinated_schedule2
|
||||
# coordinated_order_cycle is removed, uncoordinated_order_cycle is NOT added
|
||||
expect(coordinated_order_cycle.reload.schedules).to_not include coordinated_schedule, uncoordinated_schedule
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "bulk_update" do
|
||||
let(:oc) { create(:simple_order_cycle) }
|
||||
let!(:coordinator) { oc.coordinator }
|
||||
|
||||
@@ -43,6 +43,11 @@ feature %q{
|
||||
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"
|
||||
|
||||
first("div#columns-dropdown", :text => "COLUMNS").click
|
||||
first("div#columns-dropdown div.menu div.menu_item", text: "Producers").click
|
||||
first("div#columns-dropdown div.menu div.menu_item", text: "Shops").click
|
||||
first("div#columns-dropdown", :text => "COLUMNS").click
|
||||
|
||||
# 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
|
||||
@@ -235,6 +240,11 @@ feature %q{
|
||||
|
||||
oc = OrderCycle.last
|
||||
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Producers").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Shops").click
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
|
||||
page.should have_selector 'a', text: 'Plums & Avos'
|
||||
page.should have_input "oc#{oc.id}[orders_open_at]", value: order_cycle_opening_time
|
||||
page.should have_input "oc#{oc.id}[orders_close_at]", value: order_cycle_closing_time
|
||||
@@ -370,6 +380,11 @@ feature %q{
|
||||
|
||||
oc = OrderCycle.last
|
||||
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Producers").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Shops").click
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
|
||||
page.should have_selector 'a', text: 'Plums & Avos'
|
||||
page.should have_input "oc#{oc.id}[orders_open_at]", value: order_cycle_opening_time
|
||||
page.should have_input "oc#{oc.id}[orders_close_at]", value: order_cycle_closing_time
|
||||
@@ -638,6 +653,7 @@ feature %q{
|
||||
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
|
||||
@@ -672,6 +688,12 @@ feature %q{
|
||||
page.should have_content oc_user_coordinating.name
|
||||
page.should_not have_content oc_for_other_user.name
|
||||
|
||||
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Producers").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Shops").click
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
|
||||
# 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
|
||||
@@ -689,6 +711,7 @@ feature %q{
|
||||
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'
|
||||
@@ -732,6 +755,7 @@ feature %q{
|
||||
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
|
||||
@@ -774,6 +798,9 @@ feature %q{
|
||||
|
||||
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
|
||||
@@ -788,6 +815,7 @@ feature %q{
|
||||
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
|
||||
|
||||
@@ -33,6 +33,10 @@ feature 'Schedules', js: true do
|
||||
click_button "Create Schedule"
|
||||
end
|
||||
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Schedules").click
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
|
||||
within ".order-cycle-#{oc1.id} td.schedules" do
|
||||
expect(page).to have_selector "a", text: "Weekly"
|
||||
expect(page).to have_selector "a", text: "Fortnightly"
|
||||
@@ -56,6 +60,10 @@ feature 'Schedules', js: true do
|
||||
it "immediately shows updated schedule lists for order cycles" do
|
||||
click_link 'Order Cycles'
|
||||
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Schedules").click
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
|
||||
within ".order-cycle-#{oc1.id} td.schedules" do
|
||||
find('a', text: "Weekly").click
|
||||
end
|
||||
@@ -85,6 +93,11 @@ feature 'Schedules', js: true do
|
||||
describe "deleting a schedule" do
|
||||
it "immediately removes deleted schedules from order cycles" do
|
||||
click_link 'Order Cycles'
|
||||
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
find("div#columns-dropdown div.menu div.menu_item", text: "Schedules").click
|
||||
find("div#columns-dropdown", :text => "COLUMNS").click
|
||||
|
||||
within ".order-cycle-#{oc1.id} td.schedules" do
|
||||
find('a', text: "Weekly").click
|
||||
end
|
||||
|
||||
@@ -59,14 +59,17 @@ describe 'OrderCycle controllers', ->
|
||||
expect(scope.order_cycle).toEqual('my order cycle')
|
||||
|
||||
describe 'Reporting when all resources are loaded', ->
|
||||
it 'returns true when Enterprise and EnterpriseFee are loaded', ->
|
||||
Enterprise.loaded = EnterpriseFee.loaded = OrderCycle.loaded = true
|
||||
beforeEach inject (RequestMonitor) ->
|
||||
RequestMonitor.loading = false
|
||||
Enterprise.loaded = true
|
||||
EnterpriseFee.loaded = true
|
||||
OrderCycle.loaded = true
|
||||
|
||||
it 'returns true when all resources are loaded', ->
|
||||
expect(scope.loaded()).toBe(true)
|
||||
|
||||
it 'returns false otherwise', ->
|
||||
Enterprise.loaded = true
|
||||
EnterpriseFee.loaded = false
|
||||
OrderCycle.loaded = true
|
||||
expect(scope.loaded()).toBe(false)
|
||||
|
||||
it "delegates suppliedVariants to Enterprise", ->
|
||||
@@ -220,14 +223,17 @@ describe 'OrderCycle controllers', ->
|
||||
expect(OrderCycle.load).toHaveBeenCalledWith('27')
|
||||
|
||||
describe 'Reporting when all resources are loaded', ->
|
||||
it 'returns true when Enterprise, EnterpriseFee and OrderCycle are loaded', ->
|
||||
Enterprise.loaded = EnterpriseFee.loaded = OrderCycle.loaded = true
|
||||
beforeEach inject (RequestMonitor) ->
|
||||
RequestMonitor.loading = false
|
||||
Enterprise.loaded = true
|
||||
EnterpriseFee.loaded = true
|
||||
OrderCycle.loaded = true
|
||||
|
||||
it 'returns true when all resources are loaded', ->
|
||||
expect(scope.loaded()).toBe(true)
|
||||
|
||||
it 'returns false otherwise', ->
|
||||
Enterprise.loaded = true
|
||||
EnterpriseFee.loaded = true
|
||||
OrderCycle.loaded = false
|
||||
EnterpriseFee.loaded = false
|
||||
expect(scope.loaded()).toBe(false)
|
||||
|
||||
it "delegates suppliedVariants to Enterprise", ->
|
||||
|
||||
@@ -163,6 +163,11 @@ module WebHelper
|
||||
targetted_select2(value, options)
|
||||
end
|
||||
|
||||
def multi_select2_select(value, options)
|
||||
find("#s2id_#{options[:from]}").find('ul li.select2-search-field').click
|
||||
select_select2_result(value)
|
||||
end
|
||||
|
||||
# Deprecated: Use have_select2 instead (spec/support/matchers/select2_matchers.rb)
|
||||
def have_select2_option(value, options)
|
||||
container = options[:dropdown_css] || ".select2-with-searchbox"
|
||||
|
||||
Reference in New Issue
Block a user