-
Notifications
You must be signed in to change notification settings - Fork 4.3k
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
Add tests for checking Unsaved changes modal #19080
Conversation
@@ -32,3 +42,60 @@ describe("Source main actions", () => { | |||
cy.get("div").contains(sourceName).should("not.exist"); | |||
}); | |||
}); | |||
|
|||
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-testid
attribute 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 outermostModal
component 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.contains
returns 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
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
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.
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: