Fix share button in discovery settings being disabled incorrectly (#29151)
* Fix share button in discovery settings being disabled incorrectly Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve types & add tests Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Iterate Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve coverage Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Add missing snapshot Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
@@ -10,10 +10,12 @@ import React from "react";
|
||||
import { render, screen, waitFor, act, fireEvent } from "jest-matrix-react";
|
||||
import { AuthType } from "matrix-js-sdk/src/interactive-auth";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
import { Policy } from "matrix-js-sdk/src/matrix";
|
||||
|
||||
import {
|
||||
EmailIdentityAuthEntry,
|
||||
MasUnlockCrossSigningAuthEntry,
|
||||
TermsAuthEntry,
|
||||
} from "../../../../../src/components/views/auth/InteractiveAuthEntryComponents";
|
||||
import { createTestClient } from "../../../../test-utils";
|
||||
|
||||
@@ -99,3 +101,38 @@ describe("<MasUnlockCrossSigningAuthEntry/>", () => {
|
||||
expect(submitAuthDict).toHaveBeenCalledWith({});
|
||||
});
|
||||
});
|
||||
|
||||
describe("<TermsAuthEntry/>", () => {
|
||||
const renderAuth = (policy: Policy, props = {}) => {
|
||||
const matrixClient = createTestClient();
|
||||
|
||||
return render(
|
||||
<TermsAuthEntry
|
||||
matrixClient={matrixClient}
|
||||
loginType={AuthType.Email}
|
||||
onPhaseChange={jest.fn()}
|
||||
submitAuthDict={jest.fn()}
|
||||
fail={jest.fn()}
|
||||
clientSecret="my secret"
|
||||
showContinue={true}
|
||||
stageParams={{
|
||||
policies: {
|
||||
test_policy: policy,
|
||||
},
|
||||
}}
|
||||
{...props}
|
||||
/>,
|
||||
);
|
||||
};
|
||||
|
||||
test("should render", () => {
|
||||
const { container } = renderAuth({
|
||||
version: "alpha",
|
||||
en: {
|
||||
name: "Test Policy",
|
||||
url: "https://example.com/en",
|
||||
},
|
||||
});
|
||||
expect(container).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
||||
+35
@@ -82,3 +82,38 @@ exports[`<MasUnlockCrossSigningAuthEntry/> should render 1`] = `
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
exports[`<TermsAuthEntry/> should render 1`] = `
|
||||
<div>
|
||||
<div
|
||||
class="mx_InteractiveAuthEntryComponents"
|
||||
>
|
||||
<p>
|
||||
Please review and accept the policies of this homeserver:
|
||||
</p>
|
||||
<label
|
||||
class="mx_InteractiveAuthEntryComponents_termsPolicy"
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
/>
|
||||
<a
|
||||
href="https://example.com/en"
|
||||
rel="noreferrer noopener"
|
||||
target="_blank"
|
||||
>
|
||||
Test Policy
|
||||
</a>
|
||||
</label>
|
||||
<div
|
||||
aria-disabled="true"
|
||||
class="mx_AccessibleButton mx_InteractiveAuthEntryComponents_termsSubmit mx_AccessibleButton_hasKind mx_AccessibleButton_kind_primary mx_AccessibleButton_disabled"
|
||||
disabled=""
|
||||
role="button"
|
||||
tabindex="0"
|
||||
>
|
||||
Accept
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
@@ -8,7 +8,7 @@ Please see LICENSE files in the repository root for full details.
|
||||
|
||||
import React from "react";
|
||||
import { act, render, screen } from "jest-matrix-react";
|
||||
import { MatrixClient } from "matrix-js-sdk/src/matrix";
|
||||
import { MatrixClient, MatrixEvent, Terms, ThreepidMedium } from "matrix-js-sdk/src/matrix";
|
||||
import { mocked } from "jest-mock";
|
||||
import userEvent from "@testing-library/user-event";
|
||||
|
||||
@@ -26,6 +26,18 @@ jest.mock("../../../../../../src/IdentityAuthClient", () =>
|
||||
})),
|
||||
);
|
||||
|
||||
const sampleTerms = {
|
||||
policies: {
|
||||
terms: { version: "alpha", en: { name: "No ball games", url: "https://foobar" } },
|
||||
},
|
||||
} satisfies Terms;
|
||||
|
||||
const invalidTerms = {
|
||||
policies: {
|
||||
terms: { version: "invalid" },
|
||||
},
|
||||
} satisfies Terms;
|
||||
|
||||
describe("DiscoverySettings", () => {
|
||||
let client: MatrixClient;
|
||||
|
||||
@@ -51,20 +63,17 @@ describe("DiscoverySettings", () => {
|
||||
|
||||
it("displays alert if an identity server needs terms accepting", async () => {
|
||||
mocked(client).getIdentityServerUrl.mockReturnValue("https://example.com");
|
||||
mocked(client).getTerms.mockResolvedValue({
|
||||
["policies"]: { en: "No ball games" },
|
||||
});
|
||||
mocked(client).getTerms.mockResolvedValue(sampleTerms);
|
||||
|
||||
render(<DiscoverySettings />, { wrapper: DiscoveryWrapper });
|
||||
|
||||
await expect(await screen.findByText("Let people find you")).toBeInTheDocument();
|
||||
expect(await screen.findByText("Let people find you")).toBeInTheDocument();
|
||||
expect(screen.getByRole("link")).toHaveAttribute("href", "https://foobar");
|
||||
});
|
||||
|
||||
it("button to accept terms is disabled if checkbox not checked", async () => {
|
||||
mocked(client).getIdentityServerUrl.mockReturnValue("https://example.com");
|
||||
mocked(client).getTerms.mockResolvedValue({
|
||||
["policies"]: { en: "No ball games" },
|
||||
});
|
||||
mocked(client).getTerms.mockResolvedValue(sampleTerms);
|
||||
|
||||
render(<DiscoverySettings />, { wrapper: DiscoveryWrapper });
|
||||
|
||||
@@ -93,4 +102,40 @@ describe("DiscoverySettings", () => {
|
||||
|
||||
expect(client.getThreePids).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("should not disable share button if terms accepted", async () => {
|
||||
mocked(client).getThreePids.mockResolvedValue({
|
||||
threepids: [
|
||||
{
|
||||
medium: ThreepidMedium.Email,
|
||||
address: "test@email.com",
|
||||
bound: false,
|
||||
added_at: 123,
|
||||
validated_at: 234,
|
||||
},
|
||||
],
|
||||
});
|
||||
mocked(client).getIdentityServerUrl.mockReturnValue("https://example.com");
|
||||
mocked(client).getTerms.mockResolvedValue(sampleTerms);
|
||||
mocked(client).getAccountData.mockReturnValue(
|
||||
new MatrixEvent({
|
||||
content: { accepted: [sampleTerms.policies["terms"]["en"].url] },
|
||||
}),
|
||||
);
|
||||
|
||||
render(<DiscoverySettings />, { wrapper: DiscoveryWrapper });
|
||||
|
||||
const shareButton = await screen.findByRole("button", { name: "Share" });
|
||||
expect(shareButton).not.toHaveAttribute("aria-disabled", "true");
|
||||
});
|
||||
|
||||
it("should not show invalid terms", async () => {
|
||||
mocked(client).getIdentityServerUrl.mockReturnValue("https://example.com");
|
||||
mocked(client).getTerms.mockResolvedValue(invalidTerms);
|
||||
|
||||
render(<DiscoverySettings />, { wrapper: DiscoveryWrapper });
|
||||
|
||||
expect(await screen.findByText("Let people find you")).toBeInTheDocument();
|
||||
expect(screen.queryByRole("link")).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user