Commit 07551703 authored by Dylan Griffith's avatar Dylan Griffith

Merge branch '321364-implement-new-plan-constants' into 'master'

Use new plan constants in Plan/Namespace logic

See merge request gitlab-org/gitlab!54191
parents 61a32e5e f7af9f81
...@@ -85,7 +85,7 @@ module BillingPlansHelper ...@@ -85,7 +85,7 @@ module BillingPlansHelper
end end
def show_plans?(namespace) def show_plans?(namespace)
namespace.trial_active? || !namespace.gold_plan? namespace.trial_active? || !(namespace.gold_plan? || namespace.ultimate_plan?)
end end
def show_trial_banner?(namespace) def show_trial_banner?(namespace)
......
...@@ -290,21 +290,21 @@ module EE ...@@ -290,21 +290,21 @@ module EE
end end
# For now, we are not billing for members with a Guest role for subscriptions # For now, we are not billing for members with a Guest role for subscriptions
# with a Gold plan. The other plans will treat Guest members as a regular member # with a Gold/Ultimate plan. The other plans will treat Guest members as a regular member
# for billing purposes. # for billing purposes.
# #
# We are plucking the user_ids from the "Members" table in an array and # We are plucking the user_ids from the "Members" table in an array and
# converting the array of user_ids to a Set which will have unique user_ids. # converting the array of user_ids to a Set which will have unique user_ids.
def billed_user_ids(requested_hosted_plan = nil) def billed_user_ids(requested_hosted_plan = nil)
if [actual_plan_name, requested_hosted_plan].include?(::Plan::GOLD) if ([actual_plan_name, requested_hosted_plan] & [::Plan::GOLD, ::Plan::ULTIMATE]).any?
strong_memoize(:gold_billed_user_ids) do strong_memoize(:billed_user_ids) do
(billed_group_members.non_guests.distinct.pluck(:user_id) + (billed_group_members.non_guests.distinct.pluck(:user_id) +
billed_project_members.non_guests.distinct.pluck(:user_id) + billed_project_members.non_guests.distinct.pluck(:user_id) +
billed_shared_non_guests_group_members.non_guests.distinct.pluck(:user_id) + billed_shared_non_guests_group_members.non_guests.distinct.pluck(:user_id) +
billed_invited_non_guests_group_to_project_members.non_guests.distinct.pluck(:user_id)).to_set billed_invited_non_guests_group_to_project_members.non_guests.distinct.pluck(:user_id)).to_set
end end
else else
strong_memoize(:non_gold_billed_user_ids) do strong_memoize(:non_billed_user_ids) do
(billed_group_members.distinct.pluck(:user_id) + (billed_group_members.distinct.pluck(:user_id) +
billed_project_members.distinct.pluck(:user_id) + billed_project_members.distinct.pluck(:user_id) +
billed_shared_group_members.distinct.pluck(:user_id) + billed_shared_group_members.distinct.pluck(:user_id) +
......
...@@ -12,12 +12,12 @@ module EE ...@@ -12,12 +12,12 @@ module EE
NAMESPACE_PLANS_TO_LICENSE_PLANS = { NAMESPACE_PLANS_TO_LICENSE_PLANS = {
::Plan::BRONZE => License::STARTER_PLAN, ::Plan::BRONZE => License::STARTER_PLAN,
::Plan::SILVER => License::PREMIUM_PLAN, [::Plan::SILVER, ::Plan::PREMIUM] => License::PREMIUM_PLAN,
::Plan::GOLD => License::ULTIMATE_PLAN [::Plan::GOLD, ::Plan::ULTIMATE] => License::ULTIMATE_PLAN
}.freeze }.freeze
LICENSE_PLANS_TO_NAMESPACE_PLANS = NAMESPACE_PLANS_TO_LICENSE_PLANS.invert.freeze LICENSE_PLANS_TO_NAMESPACE_PLANS = NAMESPACE_PLANS_TO_LICENSE_PLANS.invert.freeze
PLANS = (NAMESPACE_PLANS_TO_LICENSE_PLANS.keys + [Plan::FREE]).freeze PLANS = (NAMESPACE_PLANS_TO_LICENSE_PLANS.keys + [Plan::FREE]).flatten.freeze
TEMPORARY_STORAGE_INCREASE_DAYS = 30 TEMPORARY_STORAGE_INCREASE_DAYS = 30
prepended do prepended do
...@@ -108,7 +108,7 @@ module EE ...@@ -108,7 +108,7 @@ module EE
extend ::Gitlab::Utils::Override extend ::Gitlab::Utils::Override
def plans_with_feature(feature) def plans_with_feature(feature)
LICENSE_PLANS_TO_NAMESPACE_PLANS.values_at(*License.plans_with_feature(feature)) LICENSE_PLANS_TO_NAMESPACE_PLANS.values_at(*License.plans_with_feature(feature)).flatten
end end
end end
...@@ -334,10 +334,18 @@ module EE ...@@ -334,10 +334,18 @@ module EE
actual_plan_name == ::Plan::SILVER actual_plan_name == ::Plan::SILVER
end end
def premium_plan?
actual_plan_name == ::Plan::PREMIUM
end
def gold_plan? def gold_plan?
actual_plan_name == ::Plan::GOLD actual_plan_name == ::Plan::GOLD
end end
def ultimate_plan?
actual_plan_name == ::Plan::ULTIMATE
end
def plan_eligible_for_trial? def plan_eligible_for_trial?
::Plan::PLANS_ELIGIBLE_FOR_TRIAL.include?(actual_plan_name) ::Plan::PLANS_ELIGIBLE_FOR_TRIAL.include?(actual_plan_name)
end end
......
...@@ -9,10 +9,12 @@ module EE ...@@ -9,10 +9,12 @@ module EE
FREE = 'free'.freeze FREE = 'free'.freeze
BRONZE = 'bronze'.freeze BRONZE = 'bronze'.freeze
SILVER = 'silver'.freeze SILVER = 'silver'.freeze
PREMIUM = 'premium'.freeze
GOLD = 'gold'.freeze GOLD = 'gold'.freeze
ULTIMATE = 'ultimate'.freeze
EE_DEFAULT_PLANS = (const_get(:DEFAULT_PLANS, false) + [FREE]).freeze EE_DEFAULT_PLANS = (const_get(:DEFAULT_PLANS, false) + [FREE]).freeze
PAID_HOSTED_PLANS = [BRONZE, SILVER, GOLD].freeze PAID_HOSTED_PLANS = [BRONZE, SILVER, PREMIUM, GOLD, ULTIMATE].freeze
EE_ALL_PLANS = (EE_DEFAULT_PLANS + PAID_HOSTED_PLANS).freeze EE_ALL_PLANS = (EE_DEFAULT_PLANS + PAID_HOSTED_PLANS).freeze
PLANS_ELIGIBLE_FOR_TRIAL = EE_DEFAULT_PLANS PLANS_ELIGIBLE_FOR_TRIAL = EE_DEFAULT_PLANS
......
...@@ -357,8 +357,8 @@ module EE ...@@ -357,8 +357,8 @@ module EE
end end
def owns_upgradeable_namespace? def owns_upgradeable_namespace?
!owns_paid_namespace?(plans: [::Plan::GOLD]) && !owns_paid_namespace?(plans: [::Plan::GOLD, ::Plan::ULTIMATE]) &&
owns_paid_namespace?(plans: [::Plan::BRONZE, ::Plan::SILVER]) owns_paid_namespace?(plans: [::Plan::BRONZE, ::Plan::SILVER, ::Plan::PREMIUM])
end end
# Returns the groups a user has access to, either through a membership or a project authorization # Returns the groups a user has access to, either through a membership or a project authorization
......
...@@ -86,6 +86,8 @@ class GitlabSubscription < ApplicationRecord ...@@ -86,6 +86,8 @@ class GitlabSubscription < ApplicationRecord
end end
def upgradable? def upgradable?
return false if [::Plan::GOLD, ::Plan::ULTIMATE].include?(plan_name)
has_a_paid_hosted_plan? && has_a_paid_hosted_plan? &&
!expired? && !expired? &&
plan_name != Plan::PAID_HOSTED_PLANS[-1] plan_name != Plan::PAID_HOSTED_PLANS[-1]
......
...@@ -42,8 +42,16 @@ FactoryBot.define do ...@@ -42,8 +42,16 @@ FactoryBot.define do
association :hosted_plan, factory: :silver_plan association :hosted_plan, factory: :silver_plan
end end
trait :premium do
association :hosted_plan, factory: :premium_plan
end
trait :gold do trait :gold do
association :hosted_plan, factory: :gold_plan association :hosted_plan, factory: :gold_plan
end end
trait :ultimate do
association :hosted_plan, factory: :ultimate_plan
end
end end
end end
...@@ -331,7 +331,9 @@ RSpec.describe EE::UserCalloutsHelper do ...@@ -331,7 +331,9 @@ RSpec.describe EE::UserCalloutsHelper do
true | ::Plan::BRONZE | false | eoa_bronze_plan_end_date + 1.day | false true | ::Plan::BRONZE | false | eoa_bronze_plan_end_date + 1.day | false
true | ::Plan::BRONZE | true | eoa_bronze_plan_end_date - 1.day | false true | ::Plan::BRONZE | true | eoa_bronze_plan_end_date - 1.day | false
true | ::Plan::SILVER | false | eoa_bronze_plan_end_date - 1.day | false true | ::Plan::SILVER | false | eoa_bronze_plan_end_date - 1.day | false
true | ::Plan::PREMIUM | false | eoa_bronze_plan_end_date - 1.day | false
true | ::Plan::GOLD | false | eoa_bronze_plan_end_date - 1.day | false true | ::Plan::GOLD | false | eoa_bronze_plan_end_date - 1.day | false
true | ::Plan::ULTIMATE | false | eoa_bronze_plan_end_date - 1.day | false
false | ::Plan::BRONZE | false | eoa_bronze_plan_end_date - 1.day | false false | ::Plan::BRONZE | false | eoa_bronze_plan_end_date - 1.day | false
end end
......
...@@ -6,6 +6,8 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do ...@@ -6,6 +6,8 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
include ActionView::Helpers::SanitizeHelper include ActionView::Helpers::SanitizeHelper
describe 'message' do describe 'message' do
using RSpec::Parameterized::TableSyntax
subject { strip_tags(message) } subject { strip_tags(message) }
let(:subscribable) { double(:license) } let(:subscribable) { double(:license) }
...@@ -22,8 +24,15 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do ...@@ -22,8 +24,15 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
let(:grace_period_effective_from) { expired_date - 35.days } let(:grace_period_effective_from) { expired_date - 35.days }
let(:today) { Time.utc(2020, 3, 7, 10) } let(:today) { Time.utc(2020, 3, 7, 10) }
let(:expired_date) { Time.utc(2020, 3, 9, 10).to_date } let(:expired_date) { Time.utc(2020, 3, 9, 10).to_date }
let(:plan_name) { ::Plan::GOLD }
where(:plan_name) do
[
[::Plan::GOLD],
[::Plan::ULTIMATE]
]
end
with_them do
before do before do
allow_any_instance_of(Gitlab::ExpiringSubscriptionMessage).to receive(:grace_period_effective_from).and_return(grace_period_effective_from) allow_any_instance_of(Gitlab::ExpiringSubscriptionMessage).to receive(:grace_period_effective_from).and_return(grace_period_effective_from)
end end
...@@ -83,10 +92,10 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do ...@@ -83,10 +92,10 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
end end
context "when the subscription hasn't been properly downgraded yet" do context "when the subscription hasn't been properly downgraded yet" do
let(:plan_name) { ::Plan::SILVER } let(:plan_name) { ::Plan::PREMIUM }
it "shows the expiring message" do it "shows the expiring message" do
expect(subject).to include('Your subscription expired! No worries, you can still use all the Silver features for now. You have 0 days to renew your subscription.') expect(subject).to include('Your subscription expired! No worries, you can still use all the Premium features for now. You have 0 days to renew your subscription.')
end end
end end
...@@ -122,7 +131,7 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do ...@@ -122,7 +131,7 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
end end
context 'when it is not currently blocking changes' do context 'when it is not currently blocking changes' do
let(:plan_name) { ::Plan::GOLD } let(:plan_name) { ::Plan::ULTIMATE }
before do before do
allow(subscribable).to receive(:block_changes?).and_return(false) allow(subscribable).to receive(:block_changes?).and_return(false)
...@@ -139,7 +148,7 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do ...@@ -139,7 +148,7 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
allow(subscribable).to receive(:block_changes_at).and_return(Time.utc(2020, 3, 9, 10).to_date) allow(subscribable).to receive(:block_changes_at).and_return(Time.utc(2020, 3, 9, 10).to_date)
allow(subscribable).to receive(:is_a?).with(::License).and_return(true) allow(subscribable).to receive(:is_a?).with(::License).and_return(true)
expect(subject).to include('No worries, you can still use all the Gold features for now. You have 2 days to renew your subscription.') expect(subject).to include('No worries, you can still use all the Ultimate features for now. You have 2 days to renew your subscription.')
end end
end end
end end
...@@ -158,7 +167,7 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do ...@@ -158,7 +167,7 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
context 'without namespace' do context 'without namespace' do
it 'has an expiration blocking message' do it 'has an expiration blocking message' do
expect(subject).to include('Your Gold subscription will expire on 2020-03-09. After that, you will not be able to create issues or merge requests as well as many other features.') expect(subject).to include("Your #{plan_name.capitalize} subscription will expire on 2020-03-09. After that, you will not be able to create issues or merge requests as well as many other features.")
end end
end end
...@@ -256,4 +265,5 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do ...@@ -256,4 +265,5 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
it { is_expected.to be_blank } it { is_expected.to be_blank }
end end
end end
end
end end
...@@ -200,7 +200,9 @@ RSpec.describe Namespace do ...@@ -200,7 +200,9 @@ RSpec.describe Namespace do
::Plan::DEFAULT | true ::Plan::DEFAULT | true
::Plan::BRONZE | false ::Plan::BRONZE | false
::Plan::SILVER | false ::Plan::SILVER | false
::Plan::PREMIUM | false
::Plan::GOLD | false ::Plan::GOLD | false
::Plan::ULTIMATE | false
end end
with_them do with_them do
...@@ -263,13 +265,24 @@ RSpec.describe Namespace do ...@@ -263,13 +265,24 @@ RSpec.describe Namespace do
end end
context 'in active trial gold plan' do context 'in active trial gold plan' do
using RSpec::Parameterized::TableSyntax
where(:plan_name) do
[
[::Plan::GOLD],
[::Plan::ULTIMATE]
]
end
with_them do
before do before do
create :gitlab_subscription, ::Plan::GOLD, :active_trial, namespace: namespace create :gitlab_subscription, plan_name, :active_trial, namespace: namespace
create :gitlab_subscription, ::Plan::GOLD, :active_trial, namespace: sub_namespace create :gitlab_subscription, plan_name, :active_trial, namespace: sub_namespace
end end
it { is_expected.to eq([namespace.id]) } it { is_expected.to eq([namespace.id]) }
end end
end
context 'with a paid plan and not in trial' do context 'with a paid plan and not in trial' do
where(plan: ::Plan::PAID_HOSTED_PLANS) where(plan: ::Plan::PAID_HOSTED_PLANS)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment