Add rule_applied_in_month and l_shipment count to shipment repo
- Add method to check whehter a rule was applied to a shipment in a given month - Add a method to count the l shipments for a specific provider in a given month
This commit is contained in:
parent
c43263a49b
commit
5c3bb4d41a
@ -1,20 +1,27 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'planet_express/version'
|
||||
require 'planet_express/date'
|
||||
|
||||
require 'planet_express/version'
|
||||
require 'planet_express/repository'
|
||||
|
||||
require 'planet_express/discount'
|
||||
require 'planet_express/discount_budget'
|
||||
require 'planet_express/discount_budget_for_month_repository'
|
||||
|
||||
require 'planet_express/invalid_shipment'
|
||||
require 'planet_express/shipment'
|
||||
require 'planet_express/shipment_repository'
|
||||
require 'planet_express/shipment_reader'
|
||||
|
||||
require 'planet_express/shipping_option'
|
||||
require 'planet_express/shipping_option_repository'
|
||||
|
||||
require 'planet_express/shipment'
|
||||
require 'planet_express/invalid_shipment'
|
||||
require 'planet_express/shipment_reader'
|
||||
require 'planet_express/rule'
|
||||
# require 'planet_express/s_shipment_discount_rule'
|
||||
# require 'planet_express/l_shipment_discount_rule'
|
||||
|
||||
require 'planet_express/shipment_discount_calculator'
|
||||
|
||||
module PlanetExpress
|
||||
class Error < StandardError; end
|
||||
# Your code goes here...
|
||||
end
|
||||
|
30
lib/planet_express/shipment_repository.rb
Normal file
30
lib/planet_express/shipment_repository.rb
Normal file
@ -0,0 +1,30 @@
|
||||
module PlanetExpress
|
||||
class ShipmentRepository < Repository
|
||||
def rule_applied_in_month?(month, rule)
|
||||
valid_shipments.any? do |shipment|
|
||||
shipment.month == month &&
|
||||
shipment.discounts.any? { |discount| discount.rule.instance_of?(rule) }
|
||||
end
|
||||
end
|
||||
|
||||
def l_shipment_count_for_provider_and_month(provider, month)
|
||||
valid_shipments.select do |shipment|
|
||||
shipment.month == month &&
|
||||
shipment.l_shipment? &&
|
||||
shipment.provider == provider
|
||||
end.length
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def valid_shipments
|
||||
valid_shipments = []
|
||||
data.each do |shipment|
|
||||
shipment.if_valid do |valid_shipment|
|
||||
valid_shipments.push(valid_shipment)
|
||||
end
|
||||
end
|
||||
valid_shipments
|
||||
end
|
||||
end
|
||||
end
|
150
spec/shipment_repository_spec.rb
Normal file
150
spec/shipment_repository_spec.rb
Normal file
@ -0,0 +1,150 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
RSpec.describe PlanetExpress::ShipmentRepository do
|
||||
let(:items) { [] }
|
||||
subject { described_class.new(data: items) }
|
||||
|
||||
describe 'rule_applied_in_month?' do
|
||||
context 'empty repository' do
|
||||
let(:items) { [] }
|
||||
|
||||
it 'returns false' do
|
||||
result = subject.rule_applied_in_month?(Date.today.begin_of_month,
|
||||
PlanetExpress::Rule)
|
||||
|
||||
expect(result).to eq(false)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid shipments' do
|
||||
let(:items) { [PlanetExpress::InvalidShipment.new("")] }
|
||||
it 'returns false' do
|
||||
result = subject.rule_applied_in_month?(Date.today.begin_of_month,
|
||||
PlanetExpress::Rule)
|
||||
|
||||
expect(result).to eq(false)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with valid shipment matching' do
|
||||
let(:rule) do
|
||||
Object.new
|
||||
end
|
||||
|
||||
let(:shipment) do
|
||||
shipment = PlanetExpress::Shipment.new(Date.today, build(:shipping_option))
|
||||
shipment.add_discount(PlanetExpress::Discount.new(50, rule))
|
||||
shipment
|
||||
end
|
||||
|
||||
let(:items) { [shipment] }
|
||||
|
||||
it 'returns true' do
|
||||
result = subject.rule_applied_in_month?(Date.today.begin_of_month,
|
||||
rule.class)
|
||||
|
||||
expect(result).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with valid shipment not matching' do
|
||||
let(:rule) do
|
||||
Object.new
|
||||
end
|
||||
|
||||
let(:other_rule) do
|
||||
-> () {}
|
||||
end
|
||||
|
||||
let(:shipment) do
|
||||
shipment = PlanetExpress::Shipment.new(Date.today, build(:shipping_option))
|
||||
shipment.add_discount(PlanetExpress::Discount.new(50, rule))
|
||||
shipment
|
||||
end
|
||||
|
||||
let(:items) { [shipment] }
|
||||
|
||||
it 'returns false' do
|
||||
result = subject.rule_applied_in_month?(Date.today.begin_of_month,
|
||||
other_rule.class)
|
||||
|
||||
expect(result).to eq(false)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#l_shipment_count_for_provider_and_month' do
|
||||
context 'empty repository' do
|
||||
let(:items) { [] }
|
||||
|
||||
it 'returns 0' do
|
||||
result = subject.l_shipment_count_for_provider_and_month(
|
||||
'LP',
|
||||
Date.today.begin_of_month)
|
||||
|
||||
expect(result).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with invalid shipments' do
|
||||
let(:items) { [PlanetExpress::InvalidShipment.new("")] }
|
||||
it 'returns 0' do
|
||||
result = subject.l_shipment_count_for_provider_and_month(
|
||||
'LP',
|
||||
Date.today.begin_of_month)
|
||||
|
||||
expect(result).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with valid shipment matching' do
|
||||
let(:shipment) do
|
||||
PlanetExpress::Shipment.new(Date.today,
|
||||
build(:shipping_option,
|
||||
package_size: 'L'))
|
||||
end
|
||||
|
||||
let(:provider) { shipment.provider }
|
||||
let(:items) { [shipment] }
|
||||
|
||||
it 'returns 1' do
|
||||
result = subject.l_shipment_count_for_provider_and_month(provider,
|
||||
Date.today.begin_of_month)
|
||||
|
||||
expect(result).to eq(1)
|
||||
end
|
||||
end
|
||||
|
||||
context 'with valid shipment not matching' do
|
||||
let(:shipment) do
|
||||
PlanetExpress::Shipment.new(Date.today,
|
||||
build(:shipping_option,
|
||||
package_size: 'L'))
|
||||
end
|
||||
|
||||
let(:provider) { shipment.provider }
|
||||
let(:items) { [shipment] }
|
||||
|
||||
context 'different provider' do
|
||||
it 'returns 0' do
|
||||
result = subject.l_shipment_count_for_provider_and_month('MP_XXX_TEST',
|
||||
Date.today.begin_of_month)
|
||||
|
||||
expect(result).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
context 'different month' do
|
||||
it 'returns 0' do
|
||||
result = subject.l_shipment_count_for_provider_and_month(provider,
|
||||
Date.today.next_month.begin_of_month)
|
||||
|
||||
expect(result).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue
Block a user