fleet/frontend/components/AddHostsModal/AddHostsModal.tests.tsx
jacobshandling f58519914b
UI: Conditional access - Microsoft Entra (#27982)
_Note - currently feature flagged. Build frontend with
`ALLOW_CONDITIONAL_ACCESS=true NODE_ENV=development yarn run webpack
--progress --watch` to enable this feature. Also, all of this
functionality depends on the new `config.license.managed_cloud` being
true, so you'll need to mock that data somehow. [This
branch](https://github.com/fleetdm/fleet/tree/27043-fake-data) has the
appropriate fake data for testing_

## For #27043, #27864

### Build front end for Fleet's integration with Microsoft Entra,
allowing conditional preventtion of single sign-on for hosts failing any
policies on a team

#### Trigger the integration

![trigger](https://github.com/user-attachments/assets/4578568a-f64a-4390-83d9-fbec751d4b14)

#### Triggered, but configuration still not verified
<img width="1348" alt="√ not-verified-return-to-prefilled-form"
src="https://github.com/user-attachments/assets/44d0c21f-2554-40a8-9158-d1107cff2d09"
/>

#### Verified, short and long tenant ids:

![ezgif-75f82492180d28](https://github.com/user-attachments/assets/015f3605-81e8-463a-be74-07bab99d9724)

#### Verified –> Deleted
![√ verified - delete -
deleted](https://github.com/user-attachments/assets/44b8ba70-49c9-43e7-be54-8474756a5b50)

#### Enable for policies of a team
![√
enable-for-team](https://github.com/user-attachments/assets/9454b0da-059d-4991-a3ff-14e74257a3a7)

#### Activities
<img width="886" alt="√ activities"
src="https://github.com/user-attachments/assets/d21e6185-c2f2-40b2-9c69-9b92fab58766"
/>

#### Unavailable for self-hosted Fleet instances:

![no-access-self-hosted](https://github.com/user-attachments/assets/56213522-b721-472f-9174-c8dac0df61f3)

#### Premium only
![√
premium-only](https://github.com/user-attachments/assets/97373960-6b38-458b-be37-4c3868469182)


- [x] Changes file added for user-visible changes in `changes/`
- [x] Added/updated automated tests
- [x] A detailed QA plan exists on the associated ticket (if it isn't
there, work with the product group's QA engineer to add it)
- [ ] Manual QA for all new/changed functionality

---------

Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
2025-04-15 13:55:07 -07:00

266 lines
8.1 KiB
TypeScript

import React from "react";
import { screen } from "@testing-library/react";
import { noop } from "lodash";
import { createCustomRenderer } from "test/test-utils";
import createMockConfig from "__mocks__/configMock";
import AddHostsModal from "./AddHostsModal";
const ENROLL_SECRET = "abcdefg12345678";
describe("AddHostsModal", () => {
it("renders loading state", async () => {
const render = createCustomRenderer({
withBackendMock: true,
context: {
app: {
isPreviewMode: false,
config: createMockConfig(),
},
},
});
render(
<AddHostsModal isAnyTeamSelected={false} isLoading onCancel={noop} />
);
const loadingSpinner = screen.getByTestId("spinner");
expect(loadingSpinner).toBeVisible();
});
it("renders platform tabs", async () => {
const render = createCustomRenderer({
withBackendMock: true,
context: {
app: {
isPreviewMode: false,
config: createMockConfig(),
},
},
});
const { user } = render(
<AddHostsModal
isAnyTeamSelected
enrollSecret={ENROLL_SECRET}
isLoading={false}
onCancel={noop}
/>
);
await user.click(screen.getByRole("tab", { name: "macOS" }));
const macOSText = screen.getByText(/--type=pkg/i);
expect(macOSText).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "Windows" }));
const windowsText = screen.getByText(/--type=msi/i);
expect(windowsText).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "Linux" }));
const linuxDebText = screen.getByText(/--type=deb/i);
expect(linuxDebText).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).toBeInTheDocument();
expect(screen.queryByText(/--type=rpm/i)).toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "ChromeOS" }));
const extensionId = screen.getByDisplayValue(
/fleeedmmihkfkeemmipgmhhjemlljidg/i
);
expect(extensionId).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "iOS & iPadOS" }));
expect(screen.queryByText(/Turn on Apple MDM/i)).toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "Android" }));
expect(screen.queryByText(/Turn on Android MDM/i)).toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "Advanced" }));
const advancedText = screen.getByText(/--type=YOUR_TYPE/i);
expect(advancedText).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
await user.click(screen.getByText(/Plain osquery/i));
const downloadEnrollSecret = screen.getByText(
/Download your enroll secret/i
);
expect(downloadEnrollSecret).toBeInTheDocument();
const osquerydCommand = screen.getByDisplayValue(
/osqueryd --flagfile=flagfile.txt --verbose/i
);
expect(osquerydCommand).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
});
it("renders enroll url input for ios & ipadOS if mac mdm is enabled", async () => {
const render = createCustomRenderer({
withBackendMock: true,
context: {
app: {
isMacMdmEnabledAndConfigured: true,
isPreviewMode: false,
config: createMockConfig(),
},
},
});
const { user } = render(
<AddHostsModal
isAnyTeamSelected
enrollSecret={ENROLL_SECRET}
isLoading={false}
onCancel={noop}
/>
);
await user.click(screen.getByRole("tab", { name: "iOS & iPadOS" }));
expect(
screen.queryByText(/Send this to your end users:/i)
).toBeInTheDocument();
});
it("renders enroll url input for android if android mdm is enabled", async () => {
const render = createCustomRenderer({
withBackendMock: true,
context: {
app: {
isAndroidMdmEnabledAndConfigured: true,
isPreviewMode: false,
config: createMockConfig(),
},
},
});
const { user } = render(
<AddHostsModal
isAnyTeamSelected
enrollSecret={ENROLL_SECRET}
isLoading={false}
onCancel={noop}
/>
);
await user.click(screen.getByRole("tab", { name: "Android" }));
expect(
screen.queryByText(/Send this to your end users:/i)
).toBeInTheDocument();
});
it("renders installer with secret", async () => {
const render = createCustomRenderer({
withBackendMock: true,
context: {
app: {
isPreviewMode: false,
config: createMockConfig(),
},
},
});
render(
<AddHostsModal
isAnyTeamSelected
enrollSecret={ENROLL_SECRET}
isLoading={false}
onCancel={noop}
/>
);
const regex = new RegExp(`${ENROLL_SECRET}`);
const text = screen.getByDisplayValue(regex);
expect(text).toBeInTheDocument();
});
it("renders no enroll secret cta", async () => {
const render = createCustomRenderer({
withBackendMock: true,
context: {
app: {
isPreviewMode: false,
config: createMockConfig(),
},
},
});
render(
<AddHostsModal
isAnyTeamSelected={false}
currentTeamName="Apples"
isLoading={false}
onCancel={noop}
openEnrollSecretModal={noop}
/>
);
const text = screen.getByText("Something's gone wrong.");
const ctaButton = screen.getByRole("button", {
name: "Manage enroll secrets",
});
expect(text).toBeInTheDocument();
expect(ctaButton).toBeEnabled();
});
it("excludes `--enable-scripts` flag if `config.server_settings.scripts-disabled` is `true`", async () => {
const mockConfig = createMockConfig();
mockConfig.server_settings.scripts_disabled = true;
const render = createCustomRenderer({
withBackendMock: true,
context: {
app: {
isPreviewMode: false,
config: mockConfig,
},
},
});
const { user } = render(
<AddHostsModal
isAnyTeamSelected
enrollSecret={ENROLL_SECRET}
isLoading={false}
onCancel={noop}
/>
);
await user.click(screen.getByRole("tab", { name: "macOS" }));
const macOSText = screen.getByText(/--type=pkg/i);
expect(macOSText).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "Windows" }));
const windowsText = screen.getByText(/--type=msi/i);
expect(windowsText).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "Linux" }));
const linuxRPMText = screen.getByText(/--type=rpm/i);
expect(linuxRPMText).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "ChromeOS" }));
const extensionId = screen.getByDisplayValue(
/fleeedmmihkfkeemmipgmhhjemlljidg/i
);
expect(extensionId).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
await user.click(screen.getByRole("tab", { name: "Advanced" }));
const advancedText = screen.getByText(/--type=YOUR_TYPE/i);
expect(advancedText).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
await user.click(screen.getByText(/Plain osquery/i));
const downloadEnrollSecret = screen.getByText(
/Download your enroll secret/i
);
expect(downloadEnrollSecret).toBeInTheDocument();
const osquerydCommand = screen.getByDisplayValue(
/osqueryd --flagfile=flagfile.txt --verbose/i
);
expect(osquerydCommand).toBeInTheDocument();
expect(screen.queryByText(/--enable-scripts/i)).not.toBeInTheDocument();
});
});