Skip to content

Commit

Permalink
fix(core): udpdate scheduledPublishingEnabledProvider tests
Browse files Browse the repository at this point in the history
  • Loading branch information
pedrobonamin committed Feb 18, 2025
1 parent c083d66 commit 3d131de
Show file tree
Hide file tree
Showing 2 changed files with 154 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import {renderHook} from '@testing-library/react'
import {of} from 'rxjs'
import {beforeEach, describe, expect, it, vi} from 'vitest'

import {useFeatureEnabled} from '../../../hooks'
import {useClient} from '../../../hooks/useClient'
import {useWorkspace} from '../../../studio/workspace'
import {type Schedule} from '../../types'
import {
ScheduledPublishingEnabledProvider,
useScheduledPublishingEnabled,
Expand All @@ -16,28 +19,57 @@ vi.mock('../../../studio/workspace', () => ({
useWorkspace: vi.fn().mockReturnValue({}),
}))

vi.mock('../../../hooks/useClient')

const useClientMock = useClient as ReturnType<typeof vi.fn>
const mockObservableRequest = vi.fn((schedules) => of({schedules}))
const scheduleResponse: Schedule[] = [
{
id: 'sch-2scsu4bVs6S66HXyCb8LYqpsrA9',
name: '2025-02-14T14:40:00.000Z',
description: '',
projectId: 'ppsg7ml5',
dataset: 'test',
author: 'pzAhBTkNX',
action: 'publish',
state: 'scheduled',
stateReason: 'created by user',
documents: [{documentId: '195138c7-4e0e-4914-a9b0-c8b1ede66236', documentType: 'book'}],
createdAt: '2025-02-05T14:40:16.423391Z',
executeAt: '2025-02-24T14:40:00Z',
},
]

const mockClient = (schedules: Schedule[]) => {
useClientMock.mockReturnValue({
config: () => ({dataset: 'dataset', projectId: 'projectId'}),
observable: {
request: () => mockObservableRequest(schedules),
},
})
}
const useFeatureEnabledMock = useFeatureEnabled as ReturnType<typeof vi.fn>
const useWorkspaceMock = useWorkspace as ReturnType<typeof vi.fn>

describe('ScheduledPublishingEnabledProvider', () => {
describe('ScheduledPublishingEnabledProvider - previously used', () => {
beforeEach(() => {
vi.clearAllMocks()
mockClient(scheduleResponse)
})

it('should not show scheduled publishing if user opt out and the feature is not enabled (any plan)', async () => {
useFeatureEnabledMock.mockReturnValue({
enabled: false,
isLoading: false,
})
useWorkspaceMock.mockReturnValue({
scheduledPublishing: {enabled: false},
})
useFeatureEnabledMock.mockReturnValue({enabled: false, isLoading: false})
useWorkspaceMock.mockReturnValue({scheduledPublishing: {enabled: false}})

const value = renderHook(useScheduledPublishingEnabled, {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({enabled: false, mode: null})
expect(value.result.current).toEqual({
enabled: false,
mode: null,
hasUsedScheduledPublishing: {used: true, loading: false},
})
})
it('should not show scheduled publishing if user opt out and the feature is enabled (any plan)', () => {
useFeatureEnabledMock.mockReturnValue({enabled: true, isLoading: false})
Expand All @@ -47,7 +79,11 @@ describe('ScheduledPublishingEnabledProvider', () => {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({enabled: false, mode: null})
expect(value.result.current).toEqual({
enabled: false,
mode: null,
hasUsedScheduledPublishing: {used: true, loading: false},
})
})

it('should show default mode if user hasnt opted out and the feature is enabled (growth or above)', () => {
Expand All @@ -58,7 +94,11 @@ describe('ScheduledPublishingEnabledProvider', () => {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({enabled: true, mode: 'default'})
expect(value.result.current).toEqual({
enabled: true,
mode: 'default',
hasUsedScheduledPublishing: {used: true, loading: false},
})
})

it('should show upsell mode if user has not opt out and the feature is not enabled (free plans)', () => {
Expand All @@ -69,7 +109,11 @@ describe('ScheduledPublishingEnabledProvider', () => {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({enabled: true, mode: 'upsell'})
expect(value.result.current).toEqual({
enabled: true,
mode: 'upsell',
hasUsedScheduledPublishing: {used: true, loading: false},
})
})

it('should not show tasks if it is loading the feature', () => {
Expand All @@ -80,7 +124,11 @@ describe('ScheduledPublishingEnabledProvider', () => {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({enabled: false, mode: null})
expect(value.result.current).toEqual({
enabled: false,
mode: null,
hasUsedScheduledPublishing: {used: true, loading: false},
})
})

it('should not show the plugin if useFeatureEnabled has an error', () => {
Expand All @@ -95,7 +143,11 @@ describe('ScheduledPublishingEnabledProvider', () => {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({enabled: false, mode: null})
expect(value.result.current).toEqual({
enabled: false,
mode: null,
hasUsedScheduledPublishing: {used: true, loading: false},
})
})

it('should call "useFeatureEnabled" with "scheduledPublishing"', () => {
Expand All @@ -109,3 +161,84 @@ describe('ScheduledPublishingEnabledProvider', () => {
expect(useFeatureEnabled).toHaveBeenCalledWith('scheduledPublishing')
})
})

describe('ScheduledPublishingEnabledProvider - not previously used', () => {
beforeEach(() => {
vi.clearAllMocks()
mockClient([])
})

it('should not show scheduled publishing if user opt out and the feature is enabled (any plan)', () => {
useFeatureEnabledMock.mockReturnValue({enabled: true, isLoading: false})
useWorkspaceMock.mockReturnValue({
scheduledPublishing: {
enabled: false,
// eslint-disable-next-line camelcase
scheduledPublishing: {enabled: true, __internal__workspaceEnabled: false},
},
})

const value = renderHook(useScheduledPublishingEnabled, {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({
enabled: false,
mode: null,
hasUsedScheduledPublishing: {used: false, loading: false},
})
})

it('should not show if they have not used it before and have not opted in', () => {
useFeatureEnabledMock.mockReturnValue({enabled: true, isLoading: false})
useWorkspaceMock.mockReturnValue({
// eslint-disable-next-line camelcase
scheduledPublishing: {enabled: true, __internal__workspaceEnabled: false},
})

const value = renderHook(useScheduledPublishingEnabled, {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({
enabled: false,
mode: null,
hasUsedScheduledPublishing: {used: false, loading: false},
})
})

it('should show default mode if they have not used it before and opted in', () => {
useFeatureEnabledMock.mockReturnValue({enabled: true, isLoading: false})
useWorkspaceMock.mockReturnValue({
// eslint-disable-next-line camelcase
scheduledPublishing: {enabled: true, __internal__workspaceEnabled: true},
})

const value = renderHook(useScheduledPublishingEnabled, {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({
enabled: true,
mode: 'default',
hasUsedScheduledPublishing: {used: false, loading: false},
})
})
it('should show upsell mode if they have not used it before and opted in, and feature is not available (free plans)', () => {
useFeatureEnabledMock.mockReturnValue({enabled: false, isLoading: false})
useWorkspaceMock.mockReturnValue({
// eslint-disable-next-line camelcase
scheduledPublishing: {enabled: true, __internal__workspaceEnabled: true},
})

const value = renderHook(useScheduledPublishingEnabled, {
wrapper: ScheduledPublishingEnabledProvider,
})

expect(value.result.current).toEqual({
enabled: true,
mode: 'upsell',
hasUsedScheduledPublishing: {used: false, loading: false},
})
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ import {useClient} from '../../../hooks/useClient'
import {useFeatureEnabled} from '../../../hooks/useFeatureEnabled'
import {useWorkspace} from '../../../studio/workspace'
import {DEFAULT_STUDIO_CLIENT_OPTIONS} from '../../../studioClient'
import {type Schedule} from '../../types'

interface HasUsedScheduledPublishing {
enabled: boolean
used: boolean
loading: boolean
}
const HAS_USED_SCHEDULED_PUBLISHING: HasUsedScheduledPublishing = {enabled: false, loading: true}
const HAS_USED_SCHEDULED_PUBLISHING: HasUsedScheduledPublishing = {used: false, loading: true}

/**
* @internal
Expand Down Expand Up @@ -51,15 +52,15 @@ export function ScheduledPublishingEnabledProvider({
const hasUsedScheduledPublishing$: Observable<HasUsedScheduledPublishing> = useMemo(() => {
const {dataset, projectId} = client.config()
return client.observable
.request({
.request<{schedules: Schedule[]}>({
uri: `/schedules/${projectId}/${dataset}?limit=1`,
tag: 'scheduled-publishing-used',
})
.pipe(
map((res) => {
return {enabled: res.schedules?.length > 0, loading: false}
return {used: res.schedules?.length > 0, loading: false}
}),
catchError(() => of({enabled: false, loading: false})),
catchError(() => of({used: false, loading: false})),
)
}, [client])

Expand All @@ -83,7 +84,7 @@ export function ScheduledPublishingEnabledProvider({
hasUsedScheduledPublishing,
}
}
if (!hasUsedScheduledPublishing.enabled) {
if (!hasUsedScheduledPublishing.used) {
return {
enabled: false,
mode: null,
Expand Down

0 comments on commit 3d131de

Please sign in to comment.