import type {InjectedRouter, PlainRoute, RouteComponentProps} from 'react-router'; import type {Location} from 'history'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {ProjectFixture} from 'sentry-fixture/project'; import {OrgRoleListFixture, TeamRoleListFixture} from 'sentry-fixture/roleList'; import {RouterFixture} from 'sentry-fixture/routerFixture'; import type {Organization} from 'sentry/types/organization'; import type {Project} from 'sentry/types/project'; interface RouteWithName extends PlainRoute { name?: string; } interface PartialInjectedRouter

extends Partial, 'location' | 'routes'>> { location?: Partial; routes?: RouteWithName[]; } interface InitializeOrgOptions { organization?: Partial; project?: Partial; projects?: Partial[]; router?: PartialInjectedRouter; } /** * Creates stubs for: * - a project or projects * - organization owning above projects * - router * - context that contains router */ export function initializeOrg({ organization: additionalOrg, project: additionalProject, projects: additionalProjects, router: additionalRouter, }: InitializeOrgOptions = {}) { const projects = ( additionalProjects || (additionalProject && [additionalProject]) || [{}] ).map(p => ProjectFixture(p)); const [project] = projects; const organization = OrganizationFixture({ projects, ...additionalOrg, orgRoleList: OrgRoleListFixture(), teamRoleList: TeamRoleListFixture(), }); const router = RouterFixture({ ...additionalRouter, params: { orgId: organization.slug, projectId: projects[0]?.slug, ...additionalRouter?.params, }, }); /** * A collection of router props that are passed to components by react-router * * Pass custom router params like so: * ```ts * initializeOrg({router: {params: {alertId: '123'}}}) * ``` */ const routerProps: RouteComponentProps = { params: router.params as any, routeParams: router.params, router, route: router.routes[0], routes: router.routes, location: router.location, }; return { organization, project, projects, router, routerProps, }; }