import React from 'react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { cleanup, render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import StudioLayout from '../StudioLayout'
let pageMock = { url: '/studio', props: {} }
const originalLocation = window.location
vi.mock('@inertiajs/react', () => ({
Link: ({ href, children, ...props }) => {children},
usePage: () => pageMock,
}))
vi.mock('../../utils/studioEvents', () => ({
studioModule: () => 'overview',
studioSurface: () => '/studio',
trackStudioEvent: vi.fn(),
}))
describe('StudioLayout group context persistence', () => {
beforeEach(() => {
Object.defineProperty(window, 'location', {
configurable: true,
value: {
...originalLocation,
assign: vi.fn(),
},
})
vi.spyOn(Storage.prototype, 'getItem').mockImplementation(() => null)
vi.spyOn(Storage.prototype, 'setItem').mockImplementation(() => {})
})
afterEach(() => {
cleanup()
vi.restoreAllMocks()
Object.defineProperty(window, 'location', {
configurable: true,
value: originalLocation,
})
})
it('restores the last selected group context on supported personal studio routes', async () => {
pageMock = {
url: '/studio',
props: {
studio_groups: [
{
slug: 'warp-collective',
name: 'Warp Collective',
studio_url: '/studio/groups/warp-collective',
},
],
studioGroup: null,
},
}
Storage.prototype.getItem.mockImplementation((key) => (key === 'sb.studio.last-context' ? 'warp-collective' : null))
render(
Body
,
)
await waitFor(() => {
expect(window.location.assign).toHaveBeenCalledWith('/studio/groups/warp-collective')
})
})
it('stores the selected group slug and navigates into that group context', async () => {
pageMock = {
url: '/studio',
props: {
studio_groups: [
{
slug: 'warp-collective',
name: 'Warp Collective',
studio_url: '/studio/groups/warp-collective',
},
],
studioGroup: null,
},
}
render(
Body
,
)
const [contextSwitcher] = screen.getAllByRole('combobox')
await userEvent.selectOptions(contextSwitcher, 'warp-collective')
expect(Storage.prototype.setItem).toHaveBeenCalledWith('sb.studio.last-context', 'warp-collective')
await waitFor(() => {
expect(window.location.assign).toHaveBeenCalledWith('/studio/groups/warp-collective')
})
})
})