123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- import {OrganizationFixture} from 'sentry-fixture/organization';
- import {SubscriptionFixture} from 'getsentry-test/fixtures/subscription';
- import {renderHook} from 'sentry-test/reactTestingLibrary';
- import {BillingType} from 'getsentry/types';
- import {useGenAiConsentButtonAccess} from './genAiAccess';
- // Mock the hooks that useGenAiConsentButtonAccess depends on
- jest.mock('sentry/utils/useOrganization');
- jest.mock('sentry/utils/useUser');
- jest.mock('sentry/utils/regions', () => ({
- getRegionDataFromOrganization: jest.fn(),
- }));
- const mockUseOrganization = jest.requireMock('sentry/utils/useOrganization').default;
- const mockUseUser = jest.requireMock('sentry/utils/useUser').useUser;
- const mockGetRegionData =
- jest.requireMock('sentry/utils/regions').getRegionDataFromOrganization;
- describe('useGenAiConsentButtonAccess', function () {
- // Reset all mocks before each test
- beforeEach(() => {
- mockUseUser.mockReset();
- mockUseOrganization.mockReset();
- mockGetRegionData.mockReset();
- });
- describe('Region-based access', function () {
- it('disables access for non-US regions', function () {
- const organization = OrganizationFixture();
- const subscription = SubscriptionFixture({organization});
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'de'});
- mockUseUser.mockReturnValue({isSuperuser: false});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: true,
- message: 'This feature is not available in your region.',
- isUsRegion: false,
- })
- );
- });
- it('enables access for US region with proper permissions', function () {
- const organization = OrganizationFixture({
- access: ['org:billing'],
- });
- const subscription = SubscriptionFixture({
- organization,
- type: BillingType.CREDIT_CARD,
- });
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'us'});
- mockUseUser.mockReturnValue({isSuperuser: false});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: false,
- message: null,
- isUsRegion: true,
- })
- );
- });
- });
- describe('Touch Customer MSA Updates', function () {
- it('disables access for touch customers without MSA update', function () {
- const organization = OrganizationFixture({
- access: ['org:billing'],
- });
- const subscription = SubscriptionFixture({
- organization,
- type: BillingType.INVOICED,
- msaUpdatedForDataConsent: false,
- });
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'us'});
- mockUseUser.mockReturnValue({isSuperuser: false});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: true,
- message:
- 'These changes require updates to your account. Please contact your customer success manager to learn more.',
- isTouchCustomerAndNeedsMsaUpdate: true,
- })
- );
- });
- it('enables access for touch customers with MSA update', function () {
- const organization = OrganizationFixture({
- access: ['org:billing'],
- });
- const subscription = SubscriptionFixture({
- organization,
- type: BillingType.INVOICED,
- msaUpdatedForDataConsent: true,
- });
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'us'});
- mockUseUser.mockReturnValue({isSuperuser: false});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: false,
- message: null,
- isTouchCustomerAndNeedsMsaUpdate: false,
- })
- );
- });
- });
- describe('Billing Access', function () {
- it('disables access for users without billing access', function () {
- const organization = OrganizationFixture({
- access: [],
- });
- const subscription = SubscriptionFixture({
- organization,
- type: BillingType.CREDIT_CARD,
- });
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'us'});
- mockUseUser.mockReturnValue({isSuperuser: false});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: true,
- message:
- "You don't have access to manage these billing and subscription details.",
- hasBillingAccess: false,
- })
- );
- });
- it('enables access for superusers regardless of billing access', function () {
- const organization = OrganizationFixture({
- access: [],
- });
- const subscription = SubscriptionFixture({
- organization,
- type: BillingType.CREDIT_CARD,
- });
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'us'});
- mockUseUser.mockReturnValue({isSuperuser: true});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: false,
- message: null,
- hasBillingAccess: false,
- isSuperuser: true,
- })
- );
- });
- it('enables access for users with billing access', function () {
- const organization = OrganizationFixture({
- access: ['org:billing'],
- });
- const subscription = SubscriptionFixture({
- organization,
- type: BillingType.CREDIT_CARD,
- });
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'us'});
- mockUseUser.mockReturnValue({isSuperuser: false});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: false,
- message: null,
- hasBillingAccess: true,
- isSuperuser: false,
- })
- );
- });
- });
- describe('Combined Conditions', function () {
- it('prioritizes region restriction over MSA update requirement', function () {
- const organization = OrganizationFixture({
- access: ['org:billing'],
- });
- const subscription = SubscriptionFixture({
- organization,
- type: BillingType.INVOICED,
- msaUpdatedForDataConsent: false,
- });
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'eu'});
- mockUseUser.mockReturnValue({isSuperuser: false});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: true,
- message: 'This feature is not available in your region.',
- isUsRegion: false,
- isTouchCustomerAndNeedsMsaUpdate: true,
- })
- );
- });
- it('handles undefined msaUpdatedForDataConsent', function () {
- const organization = OrganizationFixture({
- access: ['org:billing'],
- });
- const subscription = SubscriptionFixture({
- organization,
- type: BillingType.INVOICED,
- msaUpdatedForDataConsent: undefined,
- });
- mockUseOrganization.mockReturnValue(organization);
- mockGetRegionData.mockReturnValue({name: 'us'});
- mockUseUser.mockReturnValue({isSuperuser: false});
- const {result} = renderHook(() => useGenAiConsentButtonAccess({subscription}));
- expect(result.current).toEqual(
- expect.objectContaining({
- isDisabled: true,
- message:
- 'These changes require updates to your account. Please contact your customer success manager to learn more.',
- isTouchCustomerAndNeedsMsaUpdate: true,
- })
- );
- });
- });
- });
|