Define filter authorizer for enterprise fee report

This commit is contained in:
Kristina Lim
2018-10-22 16:05:15 +08:00
committed by luisramos0
parent cd3e258b59
commit 9ce313c7f5
3 changed files with 224 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
module OpenFoodNetwork
module Reports
class Authorizer
class ParameterNotAllowedError < StandardError; end
attr_accessor :parameters, :permissions
def initialize(parameters, permissions)
@parameters = parameters
@permissions = permissions
end
end
end
end

View File

@@ -0,0 +1,33 @@
require "open_food_network/reports/authorizer"
module OrderManagement
module Reports
module EnterpriseFeeSummary
class Authorizer < OpenFoodNetwork::Reports::Authorizer
def authorize!
authorize_by_distribution!
authorize_by_fee!
end
private
def authorize_by_distribution!
require_ids_allowed(parameters.order_cycle_ids, permissions.allowed_order_cycles)
require_ids_allowed(parameters.distributor_ids, permissions.allowed_distributors)
require_ids_allowed(parameters.producer_ids, permissions.allowed_producers)
end
def authorize_by_fee!
require_ids_allowed(parameters.enterprise_fee_ids, permissions.allowed_enterprise_fees)
require_ids_allowed(parameters.shipping_method_ids, permissions.allowed_shipping_methods)
require_ids_allowed(parameters.payment_method_ids, permissions.allowed_payment_methods)
end
def require_ids_allowed(array, allowed_objects)
raise OpenFoodNetwork::Reports::Authorizer::ParameterNotAllowedError \
if (array - allowed_objects.map(&:id).map(&:to_s)).any?
end
end
end
end
end

View File

@@ -0,0 +1,177 @@
require "spec_helper"
require "order_management/reports/enterprise_fee_summary/parameters"
require "order_management/reports/enterprise_fee_summary/permissions"
require "order_management/reports/enterprise_fee_summary/authorizer"
require "open_food_network/reports/authorizer"
describe OrderManagement::Reports::EnterpriseFeeSummary::Authorizer do
let(:report_klass) { OrderManagement::Reports::EnterpriseFeeSummary }
let(:user) { create(:user) }
let(:parameters) { report_klass::Parameters.new(params) }
let(:permissions) { report_klass::Permissions.new(user) }
let(:authorizer) { described_class.new(parameters, permissions) }
context "for distributors" do
before do
allow(permissions).to receive(:allowed_distributors) do
stub_model_collection(Enterprise, :id, ["1", "2", "3"])
end
end
context "when distributors are allowed" do
let(:params) { { distributor_ids: ["1", "3"] } }
it "does not raise error" do
expect { authorizer.authorize! }.not_to raise_error
end
end
context "when a distributor is not allowed" do
let(:params) { { distributor_ids: ["1", "4"] } }
it "raises ParameterNotAllowedError" do
expect { authorizer.authorize! }
.to raise_error(OpenFoodNetwork::Reports::Authorizer::ParameterNotAllowedError)
end
end
end
context "for producers" do
before do
allow(permissions).to receive(:allowed_producers) do
stub_model_collection(Enterprise, :id, ["1", "2", "3"])
end
end
context "when producers are allowed" do
let(:params) { { producer_ids: ["1", "3"] } }
it "does not raise error" do
expect { authorizer.authorize! }.not_to raise_error
end
end
context "when a producer is not allowed" do
let(:params) { { producer_ids: ["1", "4"] } }
it "raises ParameterNotAllowedError" do
expect { authorizer.authorize! }
.to raise_error(OpenFoodNetwork::Reports::Authorizer::ParameterNotAllowedError)
end
end
end
context "for order cycles" do
before do
allow(permissions).to receive(:allowed_order_cycles) do
stub_model_collection(OrderCycle, :id, ["1", "2", "3"])
end
end
context "when order cycles are allowed" do
let(:params) { { order_cycle_ids: ["1", "3"] } }
it "does not raise error" do
expect { authorizer.authorize! }.not_to raise_error
end
end
context "when an order cycle is not allowed" do
let(:params) { { order_cycle_ids: ["1", "4"] } }
it "raises ParameterNotAllowedError" do
expect { authorizer.authorize! }
.to raise_error(OpenFoodNetwork::Reports::Authorizer::ParameterNotAllowedError)
end
end
end
context "for enterprise fees" do
before do
allow(permissions).to receive(:allowed_enterprise_fees) do
stub_model_collection(EnterpriseFee, :id, ["1", "2", "3"])
end
end
context "when enterprise fees are allowed" do
let(:params) { { enterprise_fee_ids: ["1", "3"] } }
it "does not raise error" do
expect { authorizer.authorize! }.not_to raise_error
end
end
context "when an enterprise fee is not allowed" do
let(:params) { { enterprise_fee_ids: ["1", "4"] } }
it "raises ParameterNotAllowedError" do
expect { authorizer.authorize! }
.to raise_error(OpenFoodNetwork::Reports::Authorizer::ParameterNotAllowedError)
end
end
end
context "for shipping methods" do
before do
allow(permissions).to receive(:allowed_shipping_methods) do
stub_model_collection(Spree::ShippingMethod, :id, ["1", "2", "3"])
end
end
context "when shipping methods are allowed" do
let(:params) { { shipping_method_ids: ["1", "3"] } }
it "does not raise error" do
expect { authorizer.authorize! }.not_to raise_error
end
end
context "when a shipping method is not allowed" do
let(:params) { { shipping_method_ids: ["1", "4"] } }
it "raises ParameterNotAllowedError" do
expect { authorizer.authorize! }
.to raise_error(OpenFoodNetwork::Reports::Authorizer::ParameterNotAllowedError)
end
end
end
context "for payment methods" do
before do
allow(permissions).to receive(:allowed_payment_methods) do
stub_model_collection(Spree::PaymentMethod, :id, ["1", "2", "3"])
end
end
context "when payment methods are allowed" do
let(:params) { { payment_method_ids: ["1", "3"] } }
it "does not raise error" do
expect { authorizer.authorize! }.not_to raise_error
end
end
context "when a payment method is not allowed" do
let(:params) { { payment_method_ids: ["1", "4"] } }
it "raises ParameterNotAllowedError" do
expect { authorizer.authorize! }
.to raise_error(OpenFoodNetwork::Reports::Authorizer::ParameterNotAllowedError)
end
end
end
def stub_model_collection(model, attribute_name, attribute_list)
attribute_list.map do |attribute_value|
stub_model(model, attribute_name => attribute_value)
end
end
def stub_model(model, params)
model.new.tap do |instance|
instance.stub(params)
end
end
end