Commit 18f0120d authored by Andrei Stoicescu's avatar Andrei Stoicescu Committed by James Lopez

Add feature specs for Upgrade Offer scenarios

 - Bronze Plan with < 25 users
 - Bronze Plan with > 25 users
 - Bronze Plan with < 25 users + 'Contact Sales' experiment enabled
 - Bronze Plan with > 25 users + 'Contact Sales' experiment enabled
parent f8dac0be
......@@ -110,7 +110,7 @@ module BillingPlansHelper
css_classes = %w[btn btn-success gl-button]
css_classes << 'disabled' if is_current_plan && !namespace.trial_active?
css_classes << 'invisible' if plan.deprecated?
css_classes << 'invisible' if ::Feature.enabled?(:hide_deprecated_billing_plans) && plan.deprecated?
css_classes.join(' ')
end
......
......@@ -7,7 +7,7 @@
- faq_link_url = 'https://about.gitlab.com/pricing/faq-new-product-subscription-tiers'
- faq_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: faq_link_url }
.card-wrapper{ class: ("card-wrapper-has-badge" if has_upgrade) }
.card-wrapper{ class: ("card-wrapper-has-badge" if has_upgrade), data: { testid: "plan-card-#{plan.code}" } }
- if has_upgrade
.card-badge
%span.card-badge-text
......
......@@ -2,8 +2,7 @@
require 'spec_helper'
RSpec.describe 'Billing plan pages', :feature do
include StubRequests
RSpec.describe 'Billing plan pages', :feature, :js do
include SubscriptionPortalHelpers
let(:user) { create(:user) }
......@@ -12,6 +11,7 @@ RSpec.describe 'Billing plan pages', :feature do
let(:bronze_plan) { create(:bronze_plan) }
let(:premium_plan) { create(:premium_plan) }
let(:ultimate_plan) { create(:ultimate_plan) }
let(:plans_data) do
Gitlab::Json.parse(File.read(Rails.root.join('ee/spec/fixtures/gitlab_com_plans.json'))).map do |data|
data.deep_symbolize_keys
......@@ -27,7 +27,7 @@ RSpec.describe 'Billing plan pages', :feature do
stub_eoa_eligibility_request(namespace.id)
stub_application_setting(check_namespace_plan: true)
allow(Gitlab).to receive(:com?) { true }
gitlab_sign_in(user)
sign_in(user)
end
def external_upgrade_url(namespace, plan)
......@@ -116,7 +116,7 @@ RSpec.describe 'Billing plan pages', :feature do
visit page_path
end
it 'displays subscription table', :js do
it 'displays subscription table' do
expect(page).to have_selector('.js-subscription-table')
end
end
......@@ -126,23 +126,80 @@ RSpec.describe 'Billing plan pages', :feature do
visit page_path
end
it 'displays the number of seats', :js do
it 'displays the number of seats' do
page.within('.js-subscription-table') do
expect(page).to have_selector('p.property-value.gl-mt-2.gl-mb-0.number', text: '1')
end
end
end
shared_examples 'active deprecated plan' do
let(:legacy_plan) { plans_data.find { |plan_data| plan_data[:id] == 'bronze-external-id' } }
let(:expected_card_header) { "#{legacy_plan[:name]} (Legacy)" }
before do
stub_feature_flags(hide_deprecated_billing_plans: true)
visit page_path
end
it 'renders the plan card marked as Legacy' do
page.within('.billing-plans') do
panels = page.all('.card')
expect(panels.length).to eq(plans_data.length)
panel_with_legacy_plan = page.find("[data-testid='plan-card-#{legacy_plan[:code]}']")
expect(panel_with_legacy_plan.find('.card-header')).to have_content(expected_card_header)
expect(panel_with_legacy_plan.find('.card-body')).to have_link('frequently asked questions')
end
end
end
shared_examples 'inactive deprecated plan' do
let(:legacy_plan) { plans_data.find { |plan_data| plan_data[:id] == 'bronze-external-id' } }
before do
stub_feature_flags(hide_deprecated_billing_plans: true)
visit page_path
end
it 'does not render the card for that plan' do
expect(page).not_to have_selector("[data-testid='plan-card-#{legacy_plan[:code]}']")
end
end
shared_examples 'plan with free upgrade' do
before do
visit page_path
end
it 'displays the free upgrade' do
within '.card-badge' do
expect(page).to have_text('Free upgrade!')
end
end
end
shared_examples 'plan with sales-assisted upgrade' do
before do
visit page_path
end
it 'displays the sales assisted offer' do
within '.card-badge' do
expect(page).to have_text('Upgrade offers available!')
end
end
end
context 'users profile billing page' do
let(:page_path) { profile_billings_path }
context 'on free' do
let(:plan) { free_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
before do
visit page_path
end
......@@ -187,9 +244,7 @@ RSpec.describe 'Billing plan pages', :feature do
context 'on bronze plan' do
let(:plan) { bronze_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15) }
it 'shows the EoA bronze banner that can be dismissed permanently', :js do
travel_to(Date.parse(EE::UserCalloutsHelper::EOA_BRONZE_PLAN_END_DATE) - 1.day) do
......@@ -212,14 +267,34 @@ RSpec.describe 'Billing plan pages', :feature do
it_behaves_like 'upgradable plan'
it_behaves_like 'can contact sales'
it_behaves_like 'plan with subscription table'
context 'when hide_deprecated_billing_plans is active' do
let(:premium_plan_data) { plans_data.find { |plan_data| plan_data[:id] == 'premium-external-id' } }
before do
stub_feature_flags(hide_deprecated_billing_plans: true)
stub_eoa_eligibility_request(namespace.id, true, premium_plan_data[:id])
end
it_behaves_like 'plan with free upgrade'
it_behaves_like 'active deprecated plan'
context 'with more than 25 users' do
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 30) }
before do
stub_eoa_eligibility_request(namespace.id, false, premium_plan_data[:id])
end
it_behaves_like 'plan with sales-assisted upgrade'
end
end
end
context 'on premium plan' do
let(:plan) { premium_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15) }
it_behaves_like 'plan with header'
it_behaves_like 'downgradable plan'
......@@ -232,9 +307,7 @@ RSpec.describe 'Billing plan pages', :feature do
context 'on ultimate plan' do
let(:plan) { ultimate_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15) }
it_behaves_like 'plan with header'
it_behaves_like 'downgradable plan'
......@@ -298,9 +371,7 @@ RSpec.describe 'Billing plan pages', :feature do
context 'on bronze plan' do
let(:plan) { bronze_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15) }
it_behaves_like 'plan with header'
it_behaves_like 'downgradable plan'
......@@ -311,9 +382,7 @@ RSpec.describe 'Billing plan pages', :feature do
context 'on ultimate plan' do
let(:plan) { ultimate_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15) }
it_behaves_like 'plan with header'
it_behaves_like 'downgradable plan'
......@@ -331,9 +400,7 @@ RSpec.describe 'Billing plan pages', :feature do
context 'on ultimate' do
let(:plan) { ultimate_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15) }
before do
visit page_path
......@@ -351,17 +418,13 @@ RSpec.describe 'Billing plan pages', :feature do
expect(page).not_to have_css('.billing-plans')
end
it 'displays subscription table', :js do
expect(page).to have_selector('.js-subscription-table')
end
it_behaves_like 'plan with subscription table'
end
context 'on bronze' do
let(:plan) { bronze_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15) }
before do
visit page_path
......@@ -379,36 +442,18 @@ RSpec.describe 'Billing plan pages', :feature do
expect(page).to have_css('.billing-plans')
end
it 'displays subscription table', :js do
expect(page).to have_selector('.js-subscription-table')
end
it_behaves_like 'can contact sales'
it_behaves_like 'plan with subscription table'
end
context 'on free' do
let(:plan) { free_plan }
let!(:subscription) { create(:gitlab_subscription, namespace: namespace, hosted_plan: plan) }
it_behaves_like 'used seats rendering for non paid subscriptions'
end
end
end
context 'group billing page with a trial' do
let(:namespace) { create(:group) }
let!(:group_member) { create(:group_member, :owner, group: namespace, user: user) }
before do
stub_full_request("#{EE::SUBSCRIPTIONS_URL}/gitlab_plans?plan=free&namespace_id=#{namespace.id}")
.to_return(status: 200, body: plans_data.to_json)
end
context 'top-most group' do
let(:page_path) { group_billings_path(namespace) }
context 'on ultimate' do
let(:plan) { ultimate_plan }
context 'on trial' do
let(:plan) { premium_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan,
......@@ -416,61 +461,23 @@ RSpec.describe 'Billing plan pages', :feature do
end
before do
visit page_path
end
it 'displays plan header' do
page.within('.billing-plan-header') do
expect(page).to have_content("#{namespace.name} is currently using the Ultimate Plan")
stub_full_request("#{EE::SUBSCRIPTIONS_URL}/gitlab_plans?plan=free&namespace_id=#{namespace.id}")
.to_return(status: 200, body: plans_data.to_json)
expect(page).to have_css('.billing-plan-logo .identicon')
end
visit page_path
end
it 'does display the billing plans table' do
it 'displays the billing plans table' do
expect(page).to have_css('.billing-plans')
end
it 'displays subscription table', :js do
expect(page).to have_selector('.js-subscription-table')
end
it_behaves_like 'non-upgradable plan'
it_behaves_like 'used seats rendering for non paid subscriptions'
it_behaves_like 'plan with subscription table'
end
end
end
context 'on sub-group' do
let(:group) { create(:group_with_plan, plan: :bronze_plan) }
let(:plan) { bronze_plan }
let(:namespace) { group }
let!(:group_member) { create(:group_member, :owner, group: group, user: user) }
let(:subgroup1) { create(:group, parent: group) }
let!(:subgroup1_member) { create(:group_member, :owner, group: subgroup1) }
let(:subgroup2) { create(:group, parent: subgroup1) }
let!(:subgroup2_member) { create(:group_member, :owner, group: subgroup2) }
let(:page_path) { group_billings_path(subgroup2) }
before do
visit page_path
end
it 'displays plan header' do
page.within('.billing-plan-header') do
expect(page).to have_content("#{subgroup2.full_name} is currently using the Bronze Plan")
expect(page).to have_css('.billing-plan-logo .identicon')
expect(page.find('.btn-success')).to have_content('Manage plan')
end
expect(page).not_to have_css('.billing-plans')
end
end
context 'with unexpected JSON' do
let(:plan) { free_plan }
......@@ -509,46 +516,4 @@ RSpec.describe 'Billing plan pages', :feature do
end
end
end
context 'when ff purchase_deprecated_plans is enabled' do
before do
stub_feature_flags(hide_deprecated_billing_plans: true)
end
context 'when deprecated plan is active' do
let(:plan) { bronze_plan }
let!(:subscription) do
create(:gitlab_subscription, namespace: namespace, hosted_plan: plan, seats: 15)
end
let(:expected_card_header) { "#{plans_data[1][:name]} (Legacy)" }
it 'renders the plan card marked as Legacy' do
visit profile_billings_path
page.within('.billing-plans') do
panels = page.all('.card')
expect(panels.length).to eq(plans_data.length)
panel_with_legacy_plan = panels[1] # free [0], bronze [1]
expect(panel_with_legacy_plan.find('.card-header')).to have_content(expected_card_header)
expect(panel_with_legacy_plan.find('.card-body')).to have_link('frequently asked questions')
end
end
end
context 'when deprecated plan is inactive' do
let(:plan) { free_plan }
it 'does not render the card for that plan' do
visit profile_billings_path
page.within('.billing-plans') do
panels = page.all('.card')
expect(panels.length).to eq(plans_data.length - 1)
end
end
end
end
end
......@@ -3,7 +3,7 @@
module SubscriptionPortalHelpers
include StubRequests
def stub_eoa_eligibility_request(namespace_id)
def stub_eoa_eligibility_request(namespace_id, eligible = false, free_upgrade_plan_id = nil, assisted_upgrade_plan_id = nil)
stub_full_request("#{EE::SUBSCRIPTIONS_URL}/graphql", method: :post)
.with(
body: "{\"query\":\"{\\n subscription(namespaceId: \\\"#{namespace_id}\\\") {\\n eoaStarterBronzeEligible\\n assistedUpgradePlanId\\n freeUpgradePlanId\\n }\\n}\\n\"}",
......@@ -17,7 +17,7 @@ module SubscriptionPortalHelpers
.to_return(
status: 200,
headers: { 'Content-Type' => 'application/json' },
body: stubbed_eoa_eligibility_response_body
body: stubbed_eoa_eligibility_response_body(eligible, free_upgrade_plan_id, assisted_upgrade_plan_id)
)
end
......@@ -41,13 +41,13 @@ module SubscriptionPortalHelpers
private
def stubbed_eoa_eligibility_response_body
def stubbed_eoa_eligibility_response_body(eligible, free_upgrade_plan_id, assisted_upgrade_plan_id)
{
"data": {
"subscription": {
"eoaStarterBronzeEligible": false,
"assistedUpgradePlanId": nil,
"freeUpgradePlanId": nil
"eoaStarterBronzeEligible": eligible,
"assistedUpgradePlanId": free_upgrade_plan_id,
"freeUpgradePlanId": assisted_upgrade_plan_id
}
}
}.to_json
......
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