- Notifications
You must be signed in to change notification settings - Fork 4.9k
Add tests for checking Unsaved changes modal #19080
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
| }); | ||
| | ||
| describe("Unsaved changes modal", () => { | ||
| beforeEach(() => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
minor detail: there's no need for the anonymous wrapper function (() => { initialSetupCompleted() }) here. All describe needs for its second argument is some function that, when called with no arguments, does the correct setup, and that's exactly what the initialSetupCompleted value is:
// all three of these do the same thing in the context of a test beforeEach(() => { initialSetupCompleted(); }) // and these last two behave exactly the same in every way beforeEach(() => initialSetupCompleted()); // but this one is the shortest and cleanest beforeEach(initialSetupCompleted);There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I used beforeEach(() => initialSetupCompleted()); due to initialSetupCompleted has optional parameter and cannot be used in this beforeEach(initialSetupCompleted); way
| cy.get("#headlessui-portal-root h5").should("exist"); | ||
| cy.get("#headlessui-portal-root h5").should("have.text", "Discard changes"); | ||
| cy.get("#headlessui-portal-root [class*='ConfirmationModal_content']") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These selectors are a bit brittle: if we ever stop using the headlessui library for this modal or use a different level heading than h5, the test will break even if the page behavior remains correct.
In this case, I would make the following changes:
- add a
data-testidattribute to the confirmation modal component (I believe this is inairbyte-webapp/src/components/common/ConfirmationModal/ConfirmationModal.tsx, but I have not double-checked that). Adding it to the outermostModalcomponent should be fine:
<Modal onClose={onClose} title={<FormattedMessage id={title} />} data-testid="confirmationModal"> {/* rest of modal implementation */} </Modal>- use that testid attribute in the test. To avoid having to be overly specific with your selectors, use
cy.get("[data-testid='confirmationModal']").contains(text)for all assertions, e.g.cy.get("[data-testid='confirmationModal']").contains("Discard changes")orcy.get("[data-testid='confirmationModal']").contains("There are unsaved changes. Are you sure you want to discard your changes?"). Sincecy.containsreturns true if the text is anywhere within the component, this approach lets our test code remain blissfully unaware of any future changes to the structure or implementation of the modal.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed, thanks!
| import { openHomepage } from "pages/sidebar"; | ||
| import { selectServiceType } from "pages/createConnectorPage"; | ||
| import { fillPokeAPIForm } from "commands/connector"; | ||
| import { should } from "chai"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This { should } import is unused, and should be removed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
fixed
| cy.wait("@createSource", {timeout: 30000}).then((interception) => { | ||
| assert("include", `/source/` + interception.response?.body.Id)}); | ||
| | ||
| //cy.url().should("include", `/source/`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does
assert("include", `/source/${interception.response?.body.Id}`)`assert against the url? (As an aside, if you're using backticks, you can insert values into the string with code, like ${value}, which is nicer to read) It would be a bit more readable to keep the old assertion style:
cy.wait("@createSource", { timeout: 30000 }).then((interception) => { cy.url().should("include", `/source/${interception.response?.body.Id}`); });There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
assert against the url?
Yeah, that's actually my suggestion during short sync with @SofiiaZaitseva. After connector creation, we aim to check that we were redirected to the "Overview" page.
| | ||
| openHomepage(); | ||
| | ||
| cy.url().should("include", `/onboarding`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: use the same style of quotes throughout, unless you're using the interpolation feature of the backtick strings
| | ||
| openHomepage(); | ||
| | ||
| cy.url().should("include", `/onboarding`); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consistent quote marks again
dizel852 left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Did a quick review, agree with @ambirdsall comments - need to polish a few things.
…rbytehq/airbyte into Sofiia_CheckUnsavedModalTests
ambirdsall left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mostly looks good to me, just one last request.
dizel852 left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code LGTM 👍
All comments are resolved.
CI tests run- ✅
Add tests for checking Unsaved changes modal: