-
Oisin Coveney authoredOisin Coveney authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
InteractiveQuestion-multiple-questions.unit.spec.tsx 3.20 KiB
import { waitForElementToBeRemoved, within } from "@testing-library/react";
import {
setupAlertsEndpoints,
setupCardEndpoints,
setupCardQueryEndpoints,
setupCardQueryMetadataEndpoint,
setupDatabaseEndpoints,
setupTableEndpoints,
} from "__support__/server-mocks";
import { renderWithProviders, screen } from "__support__/ui";
import { createMockAuthProviderUriConfig } from "embedding-sdk/test/mocks/config";
import { setupSdkState } from "embedding-sdk/test/server-mocks/sdk-init";
import type { Card, Dataset } from "metabase-types/api";
import {
createMockCard,
createMockCardQueryMetadata,
createMockColumn,
createMockDatabase,
createMockDataset,
createMockDatasetData,
createMockTable,
createMockUser,
} from "metabase-types/api/mocks";
import { InteractiveQuestion } from "./InteractiveQuestion";
const TEST_USER = createMockUser();
const TEST_DB_ID = 1;
const TEST_DB = createMockDatabase({ id: TEST_DB_ID });
const TEST_TABLE_ID = 1;
const TEST_TABLE = createMockTable({ id: TEST_TABLE_ID, db_id: TEST_DB_ID });
const TEST_COLUMN = createMockColumn({
display_name: "Test Column",
name: "Test Column",
});
function getMockDataset(row: string) {
return createMockDataset({
data: createMockDatasetData({
cols: [TEST_COLUMN],
rows: [[row]],
}),
});
}
const setup = ({
mocks = [
{
card: createMockCard(),
dataset: getMockDataset("Test Row"),
},
],
}: {
mocks?: { card: Card; dataset: Dataset }[];
} = {}) => {
const { state } = setupSdkState({
currentUser: TEST_USER,
});
for (const mock of mocks) {
const { card, dataset } = mock;
setupCardEndpoints(card);
setupCardQueryMetadataEndpoint(
card,
createMockCardQueryMetadata({ databases: [TEST_DB] }),
);
setupAlertsEndpoints(card, []);
setupCardQueryEndpoints(card, dataset);
}
setupDatabaseEndpoints(TEST_DB);
setupTableEndpoints(TEST_TABLE);
const children = (
<div>
{mocks.map(mock => (
<InteractiveQuestion key={mock.card.id} questionId={mock.card.id} />
))}
</div>
);
return renderWithProviders(children, {
mode: "sdk",
sdkProviderProps: {
config: createMockAuthProviderUriConfig({
authProviderUri: "http://TEST_URI/sso/metabase",
}),
},
storeInitialState: state,
});
};
describe("InteractiveQuestion - multiple interactive questions", () => {
it("should render multiple valid questions", async () => {
const rows = ["A", "B"];
const mocks = rows.map((row, id) => ({
card: createMockCard({ id: id + 1 }),
dataset: getMockDataset(row),
}));
setup({ mocks });
// Both loading indicators should be removed
await waitForElementToBeRemoved(() =>
screen.queryAllByTestId("loading-indicator"),
);
const tables = screen.getAllByTestId("TableInteractive-root");
const gridcells = screen.getAllByRole("gridcell");
expect(tables).toHaveLength(rows.length);
expect(gridcells).toHaveLength(rows.length);
for (let i = 0; i < rows.length; i++) {
expect(
within(tables[i]).getByText(TEST_COLUMN.display_name),
).toBeInTheDocument();
expect(within(gridcells[i]).getByText(rows[i])).toBeInTheDocument();
}
});
});