mirror of
https://github.com/opf/openproject.git
synced 2026-06-14 03:30:14 +00:00
f1ea26c381
Co-authored-by: Alexander Brandon Coles <a.coles@openproject.com>
164 lines
6.9 KiB
Ruby
164 lines
6.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
#-- copyright
|
|
# OpenProject is an open source project management software.
|
|
# Copyright (C) the OpenProject GmbH
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License version 3.
|
|
#
|
|
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
|
# Copyright (C) 2006-2013 Jean-Philippe Lang
|
|
# Copyright (C) 2010-2013 the ChiliProject Team
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License
|
|
# as published by the Free Software Foundation; either version 2
|
|
# of the License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
# See COPYRIGHT and LICENSE files for more details.
|
|
#++
|
|
|
|
require "rails_helper"
|
|
require_relative "shared_examples_days"
|
|
|
|
RSpec.describe WorkPackages::Shared::AllDays do
|
|
subject { described_class.new }
|
|
|
|
sunday_2022_07_31 = Date.new(2022, 7, 31)
|
|
|
|
describe "#duration" do
|
|
context "without any week days created" do
|
|
it "considers all days as working days and returns the number of days between two dates, inclusive" do
|
|
expect(subject.duration(sunday_2022_07_31, sunday_2022_07_31 + 6)).to eq(7)
|
|
expect(subject.duration(sunday_2022_07_31, sunday_2022_07_31 + 50)).to eq(51)
|
|
end
|
|
end
|
|
|
|
context "with Saturday and Sunday being non-working days", :weekend_saturday_sunday do
|
|
it "considers all days as working days and returns the number of days between two dates, inclusive" do
|
|
expect(subject.duration(sunday_2022_07_31, sunday_2022_07_31 + 6)).to eq(7)
|
|
expect(subject.duration(sunday_2022_07_31, sunday_2022_07_31 + 50)).to eq(51)
|
|
end
|
|
end
|
|
|
|
context "with some non working days (Christmas 2022-12-25 and new year's day 2023-01-01)", :christmas_2022_new_year_2023 do
|
|
include_examples "it returns duration", 365, Date.new(2022, 1, 1), Date.new(2022, 12, 31)
|
|
include_examples "it returns duration", 365 * 2, Date.new(2022, 1, 1), Date.new(2023, 12, 31)
|
|
end
|
|
|
|
context "without start date" do
|
|
it "returns nil" do
|
|
expect(subject.duration(nil, sunday_2022_07_31)).to be_nil
|
|
end
|
|
end
|
|
|
|
context "without due date" do
|
|
it "returns nil" do
|
|
expect(subject.duration(sunday_2022_07_31, nil)).to be_nil
|
|
end
|
|
end
|
|
end
|
|
|
|
include_examples "lag computation excluding non-working days"
|
|
|
|
include_examples "add lag to a date"
|
|
|
|
describe "#start_date" do
|
|
it "returns the start date for a due date and a duration" do
|
|
expect(subject.start_date(sunday_2022_07_31, 1)).to eq(sunday_2022_07_31)
|
|
expect(subject.start_date(sunday_2022_07_31 + 9.days, 10)).to eq(sunday_2022_07_31)
|
|
end
|
|
|
|
it "raises an error if duration is 0 or negative" do
|
|
expect { subject.start_date(sunday_2022_07_31, 0) }
|
|
.to raise_error ArgumentError, "duration must be strictly positive"
|
|
expect { subject.start_date(sunday_2022_07_31, -10) }
|
|
.to raise_error ArgumentError, "duration must be strictly positive"
|
|
end
|
|
|
|
it "returns nil if due_date is nil" do
|
|
expect(subject.start_date(nil, 1)).to be_nil
|
|
end
|
|
|
|
it "returns nil if duration is nil" do
|
|
expect(subject.start_date(sunday_2022_07_31, nil)).to be_nil
|
|
end
|
|
|
|
context "with Saturday and Sunday being non-working days", :weekend_saturday_sunday do
|
|
include_examples "start_date", due_date: sunday_2022_07_31, duration: 1, expected: sunday_2022_07_31
|
|
include_examples "start_date", due_date: sunday_2022_07_31, duration: 5, expected: sunday_2022_07_31 - 4.days
|
|
include_examples "start_date", due_date: sunday_2022_07_31, duration: 10, expected: sunday_2022_07_31 - 9.days
|
|
end
|
|
|
|
context "with some non working days (Christmas 2022-12-25 and new year's day 2023-01-01)", :christmas_2022_new_year_2023 do
|
|
include_examples "start_date", due_date: Date.new(2022, 12, 31), duration: 365, expected: Date.new(2022, 1, 1)
|
|
include_examples "start_date", due_date: Date.new(2023, 12, 31), duration: 365 * 2, expected: Date.new(2022, 1, 1)
|
|
end
|
|
end
|
|
|
|
describe "#due_date" do
|
|
it "returns the due date for a start date and a duration" do
|
|
expect(subject.due_date(sunday_2022_07_31, 1)).to eq(sunday_2022_07_31)
|
|
expect(subject.due_date(sunday_2022_07_31, 10)).to eq(sunday_2022_07_31 + 9.days)
|
|
end
|
|
|
|
it "raises an error if duration is 0 or negative" do
|
|
expect { subject.due_date(sunday_2022_07_31, 0) }
|
|
.to raise_error ArgumentError, "duration must be strictly positive"
|
|
expect { subject.due_date(sunday_2022_07_31, -10) }
|
|
.to raise_error ArgumentError, "duration must be strictly positive"
|
|
end
|
|
|
|
it "returns nil if start_date is nil" do
|
|
expect(subject.due_date(nil, 1)).to be_nil
|
|
end
|
|
|
|
it "returns nil if duration is nil" do
|
|
expect(subject.due_date(sunday_2022_07_31, nil)).to be_nil
|
|
end
|
|
|
|
context "with Saturday and Sunday being non-working days", :weekend_saturday_sunday do
|
|
include_examples "due_date", start_date: sunday_2022_07_31, duration: 1, expected: sunday_2022_07_31
|
|
include_examples "due_date", start_date: sunday_2022_07_31, duration: 5, expected: sunday_2022_07_31 + 4.days
|
|
include_examples "due_date", start_date: sunday_2022_07_31, duration: 10, expected: sunday_2022_07_31 + 9.days
|
|
end
|
|
|
|
context "with some non working days (Christmas 2022-12-25 and new year's day 2023-01-01)", :christmas_2022_new_year_2023 do
|
|
include_examples "due_date", start_date: Date.new(2022, 1, 1), duration: 365, expected: Date.new(2022, 12, 31)
|
|
include_examples "due_date", start_date: Date.new(2022, 1, 1), duration: 365 * 2, expected: Date.new(2023, 12, 31)
|
|
end
|
|
end
|
|
|
|
describe "#soonest_working_day" do
|
|
it "returns the given day" do
|
|
expect(subject.soonest_working_day(sunday_2022_07_31)).to eq(sunday_2022_07_31)
|
|
end
|
|
|
|
it "returns nil if given date is nil" do
|
|
expect(subject.soonest_working_day(nil)).to be_nil
|
|
end
|
|
|
|
context "with Saturday and Sunday being non-working days", :weekend_saturday_sunday do
|
|
it "returns the given day" do
|
|
expect(subject.soonest_working_day(sunday_2022_07_31)).to eq(sunday_2022_07_31)
|
|
end
|
|
end
|
|
|
|
context "with some non working days (Christmas 2022-12-25 and new year's day 2023-01-01)", :christmas_2022_new_year_2023 do
|
|
it "returns the given day" do
|
|
expect(subject.soonest_working_day(Date.new(2022, 12, 25))).to eq(Date.new(2022, 12, 25))
|
|
end
|
|
end
|
|
end
|
|
end
|