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
end
def show_plans?(namespace)
namespace.trial_active? || !namespace.gold_plan?
namespace.trial_active? || !(namespace.gold_plan? || namespace.ultimate_plan?)
end
def show_trial_banner?(namespace)
......
......@@ -290,21 +290,21 @@ module EE
end
# 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.
#
# 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.
def billed_user_ids(requested_hosted_plan = nil)
if [actual_plan_name, requested_hosted_plan].include?(::Plan::GOLD)
strong_memoize(:gold_billed_user_ids) do
if ([actual_plan_name, requested_hosted_plan] & [::Plan::GOLD, ::Plan::ULTIMATE]).any?
strong_memoize(:billed_user_ids) do
(billed_group_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_invited_non_guests_group_to_project_members.non_guests.distinct.pluck(:user_id)).to_set
end
else
strong_memoize(:non_gold_billed_user_ids) do
strong_memoize(:non_billed_user_ids) do
(billed_group_members.distinct.pluck(:user_id) +
billed_project_members.distinct.pluck(:user_id) +
billed_shared_group_members.distinct.pluck(:user_id) +
......
......@@ -12,12 +12,12 @@ module EE
NAMESPACE_PLANS_TO_LICENSE_PLANS = {
::Plan::BRONZE => License::STARTER_PLAN,
::Plan::SILVER => License::PREMIUM_PLAN,
::Plan::GOLD => License::ULTIMATE_PLAN
[::Plan::SILVER, ::Plan::PREMIUM] => License::PREMIUM_PLAN,
[::Plan::GOLD, ::Plan::ULTIMATE] => License::ULTIMATE_PLAN
}.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
prepended do
......@@ -108,7 +108,7 @@ module EE
extend ::Gitlab::Utils::Override
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
......@@ -334,10 +334,18 @@ module EE
actual_plan_name == ::Plan::SILVER
end
def premium_plan?
actual_plan_name == ::Plan::PREMIUM
end
def gold_plan?
actual_plan_name == ::Plan::GOLD
end
def ultimate_plan?
actual_plan_name == ::Plan::ULTIMATE
end
def plan_eligible_for_trial?
::Plan::PLANS_ELIGIBLE_FOR_TRIAL.include?(actual_plan_name)
end
......
......@@ -9,10 +9,12 @@ module EE
FREE = 'free'.freeze
BRONZE = 'bronze'.freeze
SILVER = 'silver'.freeze
PREMIUM = 'premium'.freeze
GOLD = 'gold'.freeze
ULTIMATE = 'ultimate'.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
PLANS_ELIGIBLE_FOR_TRIAL = EE_DEFAULT_PLANS
......
......@@ -357,8 +357,8 @@ module EE
end
def owns_upgradeable_namespace?
!owns_paid_namespace?(plans: [::Plan::GOLD]) &&
owns_paid_namespace?(plans: [::Plan::BRONZE, ::Plan::SILVER])
!owns_paid_namespace?(plans: [::Plan::GOLD, ::Plan::ULTIMATE]) &&
owns_paid_namespace?(plans: [::Plan::BRONZE, ::Plan::SILVER, ::Plan::PREMIUM])
end
# Returns the groups a user has access to, either through a membership or a project authorization
......
......@@ -86,6 +86,8 @@ class GitlabSubscription < ApplicationRecord
end
def upgradable?
return false if [::Plan::GOLD, ::Plan::ULTIMATE].include?(plan_name)
has_a_paid_hosted_plan? &&
!expired? &&
plan_name != Plan::PAID_HOSTED_PLANS[-1]
......
......@@ -42,8 +42,16 @@ FactoryBot.define do
association :hosted_plan, factory: :silver_plan
end
trait :premium do
association :hosted_plan, factory: :premium_plan
end
trait :gold do
association :hosted_plan, factory: :gold_plan
end
trait :ultimate do
association :hosted_plan, factory: :ultimate_plan
end
end
end
......@@ -331,7 +331,9 @@ RSpec.describe EE::UserCalloutsHelper do
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::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::ULTIMATE | false | eoa_bronze_plan_end_date - 1.day | false
false | ::Plan::BRONZE | false | eoa_bronze_plan_end_date - 1.day | false
end
......
......@@ -6,6 +6,8 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
include ActionView::Helpers::SanitizeHelper
describe 'message' do
using RSpec::Parameterized::TableSyntax
subject { strip_tags(message) }
let(:subscribable) { double(:license) }
......@@ -22,8 +24,15 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
let(:grace_period_effective_from) { expired_date - 35.days }
let(:today) { Time.utc(2020, 3, 7, 10) }
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
allow_any_instance_of(Gitlab::ExpiringSubscriptionMessage).to receive(:grace_period_effective_from).and_return(grace_period_effective_from)
end
......@@ -83,10 +92,10 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
end
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
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
......@@ -122,7 +131,7 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
end
context 'when it is not currently blocking changes' do
let(:plan_name) { ::Plan::GOLD }
let(:plan_name) { ::Plan::ULTIMATE }
before do
allow(subscribable).to receive(:block_changes?).and_return(false)
......@@ -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(: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
......@@ -158,7 +167,7 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
context 'without namespace' 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
......@@ -256,4 +265,5 @@ RSpec.describe Gitlab::ExpiringSubscriptionMessage do
it { is_expected.to be_blank }
end
end
end
end
......@@ -200,7 +200,9 @@ RSpec.describe Namespace do
::Plan::DEFAULT | true
::Plan::BRONZE | false
::Plan::SILVER | false
::Plan::PREMIUM | false
::Plan::GOLD | false
::Plan::ULTIMATE | false
end
with_them do
......@@ -263,13 +265,24 @@ RSpec.describe Namespace do
end
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
create :gitlab_subscription, ::Plan::GOLD, :active_trial, namespace: namespace
create :gitlab_subscription, ::Plan::GOLD, :active_trial, namespace: sub_namespace
create :gitlab_subscription, plan_name, :active_trial, namespace: namespace
create :gitlab_subscription, plan_name, :active_trial, namespace: sub_namespace
end
it { is_expected.to eq([namespace.id]) }
end
end
context 'with a paid plan and not in trial' do
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