Skip to content

Commit c7875e4

Browse files
committed
Reflect validation errors in tx certification breadbrumb
1 parent 7edd09e commit c7875e4

File tree

3 files changed

+116
-4
lines changed

3 files changed

+116
-4
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import { render, screen } from "@testing-library/react";
2+
import "@testing-library/jest-dom";
3+
import TransactionCertificationBreadcrumb from "../src/components/CertifyCardanoTransactionsModal/TransactionCertificationBreadcrumb";
4+
import { validationSteps } from "../src/components/CertifyCardanoTransactionsModal";
5+
6+
function setup(currentStep, isProofValid, isCertificateChainValid) {
7+
const utils = [
8+
render(
9+
<TransactionCertificationBreadcrumb
10+
currentStep={currentStep}
11+
isProofValid={isProofValid}
12+
isCertificateChainValid={isCertificateChainValid}
13+
/>,
14+
),
15+
];
16+
17+
const tabs = new Map();
18+
tabs.set(validationSteps.fetchingProof, screen.getByText(/Fetching Transactions Proof/i));
19+
tabs.set(validationSteps.validatingProof, screen.getByText(/Verifying Transactions Proof/i));
20+
tabs.set(
21+
validationSteps.validatingCertificateChain,
22+
screen.getByText(/Validating Certificate Chain/i),
23+
);
24+
tabs.set(validationSteps.done, screen.getByText(/Finish/i));
25+
26+
return {
27+
tabs: tabs,
28+
...utils,
29+
};
30+
}
31+
32+
const classForVariant = (variant) => `list-group-item-${variant}`;
33+
34+
describe("TransactionCertificationBreadcrumb", () => {
35+
it("The tab variant are light when default", () => {
36+
const { tabs } = setup(validationSteps.ready, false, false);
37+
38+
for (const [_key, tab] of tabs) {
39+
expect(tab).toHaveClass(classForVariant("light"));
40+
}
41+
});
42+
43+
it.each([
44+
["fetchingProof", validationSteps.fetchingProof],
45+
["validatingProof", validationSteps.validatingProof],
46+
["validatingCertificateChain", validationSteps.validatingCertificateChain],
47+
])("The tab variant is primary when current and checks are valid : %s", (stepName, stepIndex) => {
48+
const { tabs } = setup(stepIndex, true, true);
49+
50+
expect(tabs.get(stepIndex)).toHaveClass(classForVariant("primary"));
51+
});
52+
53+
it("Current step is done and checks are valid then tabs are light except done step tab that is success", () => {
54+
const { tabs } = setup(validationSteps.done, true, true);
55+
56+
expect(tabs.get(validationSteps.fetchingProof)).toHaveClass(classForVariant("light"));
57+
expect(tabs.get(validationSteps.validatingProof)).toHaveClass(classForVariant("light"));
58+
expect(tabs.get(validationSteps.validatingCertificateChain)).toHaveClass(
59+
classForVariant("light"),
60+
);
61+
expect(tabs.get(validationSteps.done)).toHaveClass(classForVariant("success"));
62+
});
63+
64+
it("Current step is done and proof check is invalid then tabs are danger except tabs before proof validation", () => {
65+
const { tabs } = setup(validationSteps.done, false, true);
66+
67+
expect(tabs.get(validationSteps.fetchingProof)).toHaveClass(classForVariant("light"));
68+
expect(tabs.get(validationSteps.validatingProof)).toHaveClass(classForVariant("danger"));
69+
expect(tabs.get(validationSteps.validatingCertificateChain)).toHaveClass(
70+
classForVariant("danger"),
71+
);
72+
expect(tabs.get(validationSteps.done)).toHaveClass(classForVariant("danger"));
73+
});
74+
75+
it("Current step is done and certificate chain check is invalid then tabs are danger except tabs before certificate chain validation", () => {
76+
const { tabs } = setup(validationSteps.done, true, false);
77+
78+
expect(tabs.get(validationSteps.fetchingProof)).toHaveClass(classForVariant("light"));
79+
expect(tabs.get(validationSteps.validatingProof)).toHaveClass(classForVariant("light"));
80+
expect(tabs.get(validationSteps.validatingCertificateChain)).toHaveClass(
81+
classForVariant("danger"),
82+
);
83+
expect(tabs.get(validationSteps.done)).toHaveClass(classForVariant("danger"));
84+
});
85+
});

mithril-explorer/src/components/CertifyCardanoTransactionsModal/TransactionCertificationBreadcrumb.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,37 @@ import { validationSteps } from "./index";
44

55
export default function TransactionCertificationBreadcrumb({
66
currentStep,
7-
isSuccess,
7+
// Note: validity values are only relevant after their respective steps
8+
isProofValid,
9+
isCertificateChainValid,
810
onStepClick = (step) => {},
911
}) {
12+
function variantForActiveStep(currentStep, step) {
13+
if (currentStep < step) {
14+
return "light";
15+
} else if (step === currentStep) {
16+
return "primary";
17+
}
18+
19+
let altVariant = "";
20+
switch (step) {
21+
case validationSteps.fetchingProof:
22+
altVariant = "light";
23+
break;
24+
case validationSteps.validatingProof:
25+
altVariant = isProofValid ? "light" : "danger";
26+
break;
27+
case validationSteps.validatingCertificateChain:
28+
altVariant = isProofValid && isCertificateChainValid ? "light" : "danger";
29+
break;
30+
}
31+
return altVariant;
32+
}
33+
1034
function variantForDoneStep(currentStep) {
1135
let variant = "light";
1236
if (currentStep === validationSteps.done) {
13-
variant = isSuccess ? "success" : "danger";
37+
variant = isProofValid && isCertificateChainValid ? "success" : "danger";
1438
}
1539
return variant;
1640
}
@@ -37,8 +61,9 @@ export default function TransactionCertificationBreadcrumb({
3761
action
3862
key={step}
3963
eventKey={step}
64+
disabled={step > validationSteps.validatingProof && !isProofValid}
4065
onClick={() => onStepClick(step)}
41-
variant={currentStep === step ? "primary" : "light"}>
66+
variant={variantForActiveStep(currentStep, step)}>
4267
{text} {currentStep === step && <Spinner size="sm" />}
4368
</ListGroup.Item>
4469
))}

mithril-explorer/src/components/CertifyCardanoTransactionsModal/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export default function CertifyCardanoTransactionsModal({
3939
useEffect(() => {
4040
setShowLoadingWarning(false);
4141
setIsProofValid(false);
42+
setIsCertificateChainValid(true);
4243
setCertificate(undefined);
4344
setCurrentStep(validationSteps.ready);
4445

@@ -167,7 +168,8 @@ export default function CertifyCardanoTransactionsModal({
167168
<Col>
168169
<TransactionCertificationBreadcrumb
169170
currentStep={currentStep}
170-
isSuccess={isProofValid}
171+
isProofValid={isProofValid}
172+
isCertificateChainValid={isCertificateChainValid}
171173
onStepClick={handleStepClick}
172174
/>
173175
{showLoadingWarning && (

0 commit comments

Comments
 (0)