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,
projects: additionalProjects,
router: additionalRouter,
}: InitializeOrgOptions = {}) {
const projects = (additionalProjects || [{}]).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,
};
}