diff options
| -rw-r--r-- | app/models/chouette/purchase_window.rb | 16 | ||||
| -rw-r--r-- | spec/models/chouette/purchase_window_spec.rb | 51 | 
2 files changed, 64 insertions, 3 deletions
| diff --git a/app/models/chouette/purchase_window.rb b/app/models/chouette/purchase_window.rb index 4c8014780..931f4f3a0 100644 --- a/app/models/chouette/purchase_window.rb +++ b/app/models/chouette/purchase_window.rb @@ -46,8 +46,18 @@ module Chouette        ]      end -    # def checksum_attributes -    # end - +    def intersect_periods! mask_periods +      return unless mask_periods.present? +      out = [] +      date_ranges.each do |range| +        intersecting = mask_periods.select { |p| p.intersect? range } +        next unless intersecting.any? +        intersecting.each do |p| +          range &= p +        end +        out << range +      end +      self.update_attribute :date_ranges, out +    end    end  end diff --git a/spec/models/chouette/purchase_window_spec.rb b/spec/models/chouette/purchase_window_spec.rb index 702a44eeb..4d6a4b462 100644 --- a/spec/models/chouette/purchase_window_spec.rb +++ b/spec/models/chouette/purchase_window_spec.rb @@ -24,4 +24,55 @@ RSpec.describe Chouette::PurchaseWindow, :type => :model do      end    end +  describe "intersect_periods!" do +    let(:date_ranges){[ +      (1.month.from_now).to_date..(1.month.from_now+2.day).to_date, +      (2.months.from_now).to_date..(2.months.from_now+2.day).to_date +    ]} +    let(:purchase_window){ create :purchase_window, referential: referential, date_ranges: date_ranges } +    let(:range_bottom){ purchase_window.date_ranges.map(&:first).min } +    let(:range_top){ purchase_window.date_ranges.map(&:last).max } +    context "with an empty mask" do +      let(:mask){ [] } +      it "should do nothing" do +        date_ranges = purchase_window.date_ranges +        purchase_window.intersect_periods! mask +        expect(purchase_window.date_ranges).to eq date_ranges +      end +    end + +    context "with an englobbing mask" do +      let(:mask){ [ +          (range_bottom..range_top) +        ] } +      it "should do nothing" do +        date_ranges = purchase_window.date_ranges +        purchase_window.intersect_periods! mask +        expect(purchase_window.date_ranges).to eq date_ranges +      end +    end + +    context "with a non-overlapping mask" do +      let(:mask){ [ +          ((range_top+1.day)..(range_top+2.days)) +        ] } +      it "should clear range" do +        purchase_window.intersect_periods! mask +        expect(purchase_window.date_ranges).to eq [] +      end +    end + +    context "with a partially matching mask" do +      let(:mask){ [ +          (1.month.from_now+1.day).to_date..(2.month.from_now + 1.day).to_date, +        ] } +      it "should intersct ranges" do +        purchase_window.intersect_periods! mask +        expect(purchase_window.date_ranges).to eq [ +          (1.month.from_now+1.day).to_date..(1.month.from_now+2.day).to_date, +          (2.months.from_now).to_date..(2.months.from_now+1.day).to_date +        ] +      end +    end +  end  end | 
